Appel asynchrone
Si vous ne souhaitez pas attendre la réponse de l'OpenAPI lorsque vous envoyez une requête à son API, vous devez utiliser un code asynchrone.
Pour effectuer des appels asynchrones, vous devez fournir une 4D.Function(Formula) de rappel (callback) dans le paramètre objet OpenAIParameters pour recevoir le résultat. Pour la complétion du chat en streaming, voir OpenAIChatCompletionsParameters.
La fonction de callback recevra le même type d'objet de résultat (l'une des classes enfant de OpenAIResult) que celui qui serait renvoyé par la fonction dans un code synchrone. Voir les exemples ci-dessous.
A propos des process
La méthode asynchrone est basée sur 4D.HTTPRequest, ainsi la réponse sera reçue dans le process courant.
⚠️ Si votre process se termine à la fin de la méthode courante (par exemple, si vous utilisez New process ou l'éditeur de méthode), la formule de callback peut ne pas être appelée de manière asynchrone. Dans ce cas, il est nécessaire d'utiliser
CALL WORKERouCALL FORM.
Exemples d’utilisation
Liste de modèles
$client.models.list({formula: Formula(MyReceiveMethod($1))})
$1 sera une instance de OpenAIModelListResult, donc la méthode MyReceiveMethod pourrait être :
#DECLARE($result: cs.AIKit.OpenAIModelListResult)
If($result.success)
Form.models:=$result.models
Else
Alert($result.errors.formula(Formula(JSON Stringify($1))).join("\n"))
End if
Complétions de chat
var $messages:=[{role: "system"; content: "You are a helpful assistant."}]
$messages.push({role: "user"; content: "Could you explain me why 42 is a special number"})
$client.chat.completions.create($messages; { onResponse: Formula(MyChatCompletionsReceiveMethod($1))})
$1 sera une instance de OpenAIChatCompletionsResult, donc la méthode MyChatCompletionsReceiveMethod pourrait être :
#DECLARE($result: cs.AIKit.OpenAIChatCompletionsResult)
ASSERT($result.success) // Nous utilisons ici onResponse, le callback n'est reçu qu'en cas de succès.
Form.assistantMessage:=$result.choices[0].text
Réponses conversationnelles avec streaming
Lorsque vous voulez recevoir la réponse progressivement car elle est générée en continu (streaming), vous pouvez utiliser le paramètre stream avec un callback onData :
var $messages:=[{role: "system"; content: "You are a helpful assistant."}]
$messages.push({role: "user"; content: "Could you explain me why 42 is a special number"})
// Activer le streaming et fournir la callback onData
$client.chat.completions.create($messages; { \
stream: True; \
onData: Formula(MyStreamDataReceiveMethod($1)); \
onTerminate: Formula(MyStreamTerminateMethod($1)) \
})
La fonction callback onData sera appelée plusieurs fois à mesure que les blocs de données arrivent. $1 sera une instance de OpenAIChatCompletionsStreamResult :
// MyStreamDataReceiveMethod
#DECLARE($streamResult: cs.AIKit.OpenAIChatCompletionsStreamResult)
If ($streamResult.success)
// Vérifier si on a du contenu dans le delta
If ($streamResult.choices.length>0)
var $choice: Object
$choice:=$streamResult.choices[0]
If ($choice.delta#Null) && ($choice.delta.content#Null)
// Ajouter le nouveau bloc de contenu au message existant
Form.assistantMessage:=Form.assistantMessage+$choice.delta.content
End if
End if
Else
// Gérer une erreur de streaming
ALERT("Streaming error: "+$streamResult.error.message)
End if
La callback onTerminate sera appelée une fois que le flux sera terminé :
// MyStreamTerminateMethod
#DECLARE($result: cs.AIKit.OpenAIChatCompletionsResult)
If ($result.success)
// Flux terminé avec succès
Else
// Gérer erreur finale
ALERT("Stream terminated with error: "+$result.errors.formula(Formula(JSON Stringify($1))).join("\n"))
End if