Connectez vos grands modèles de langage (LLM) personnalisés à des workflows en temps réel via un protocole standard.
Interface standard pour les LLM développés en interne (spécification OpenAI)
Si l'interface de votre LLM respecte la norme OpenAI, intégrez votre service LLM personnalisé dans un workflow via la configuration OpenAI. Seules les requêtes en streaming sont prises en charge.
Dans le nœud LLM, sélectionnez Self-developed access (OpenAI specification) et configurez les paramètres suivants :
|
Nom |
Type |
Obligatoire |
Description |
Valeur d'exemple |
|
ModelId |
String |
Oui |
Nom du modèle. Correspond au champ « model » d'OpenAI. |
abc |
|
API-KEY |
String |
Oui |
Clé API d'authentification. Correspond au champ « api_key » d'OpenAI. |
AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
|
Adresse HTTPS du modèle cible |
String |
Oui |
URL du service cible. Correspond au champ « base_url » d'OpenAI. Remarque
Conformément à la spécification OpenAI, Alibaba Cloud ajoute automatiquement /chat/completions à la base_url. Vérifiez que votre chemin respecte ce format. |
http://www.abc.com |
Lors de l'exécution, le workflow assemble les données au format OpenAI et envoie une requête POST à l'endpoint du modèle configuré. Les paramètres d'entrée sont les suivants :
|
Nom |
Type |
Obligatoire |
Description |
Valeur d'exemple |
|
messages |
Array |
Oui |
Historique de conversation. 20 enregistrements maximum sont conservés. Les premières entrées du tableau correspondent aux messages les plus anciens. Remarque
Le système combine automatiquement la saisie actuelle de l'utilisateur avec l'historique de conversation avant de l'envoyer au LLM. |
[{'role': 'user', 'content': 'What is the weather like today?'},{'role': 'assistant', 'content': 'The weather is sunny today.'},{'role': 'user', 'content': 'What about the weather tomorrow?'}] |
|
model |
String |
Oui |
Nom du modèle. |
abc |
|
stream |
Boolean |
Oui |
Activation du streaming pour la réponse. Seul le mode streaming est pris en charge. |
True |
|
extendData |
Object |
Oui |
Informations supplémentaires. |
{'instanceId':'68e00b6640e*3e943332fee7','channelId':'123','sentenceId':'3','userData':'{"aaaa":"bbbb"}'} |
|
String |
Oui |
ID de l'instance. |
68e00b6640e*3e943332fee7 |
|
String |
Oui |
ID du canal. |
123 |
|
Int |
Oui |
ID de la paire Q&R. Remarque
Pour une même question utilisateur, la réponse de l'agent utilise toujours le même ID. |
3 |
|
String |
Non |
Numéro appelant lors d'un appel téléphonique. |
13800000001 |
|
String |
Non |
Numéro appelé lors d'un appel téléphonique. |
13800000002 |
|
String |
Non |
Données métier transmises dans le champ UserData lors du démarrage de l'instance. |
{"aaaa":"bbbb"} |
Serveur LLM personnalisé (spécification OpenAI)
Python
import json
import time
from loguru import logger
from flask import Flask, request, jsonify, Response
app = Flask(__name__)
API_KEY = "YOURAPIKEY"
@app.route('/v1/chat/completions', methods=['POST'])
def chat_completion():
# Check the API key
auth_header = request.headers.get('Authorization')
if not auth_header or auth_header.split()[1] != API_KEY:
return jsonify({"error": "Unauthorized"}), 401
data = request.json
logger.info(f"data is {data}")
task_id = request.args.get('task_id')
room_id = request.args.get('room_id')
for header, value in request.headers.items():
logger.info(f"{header}: {value}")
# Print query parameters
logger.info("\nQuery Parameters:")
for key, value in request.args.items():
logger.info(f"{key}: {value}")
logger.info(f"task_id: {task_id}, room_id: {room_id}")
stream = data.get('stream', False)
if stream:
return Response(generate_stream_response(data), content_type='text/event-stream')
else:
return jsonify(generate_response(data))
def generate_response(data):
response = "This is a mock AI assistant response. In a real application, call a real AI model here."
return {
"id": "chatcmpl-123",
"object": "chat.completion",
"created": int(time.time()),
"model": data['model'],
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": response
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": sum(len(m['content']) for m in data['messages']),
"completion_tokens": len(response),
"total_tokens": sum(len(m['content']) for m in data['messages']) + len(response)
}
}
def generate_stream_response(data):
response = "This is a mock AI assistant streaming response. In a real application, call a real AI model here."
words = list(response)
for i, word in enumerate(words):
chunk = {
"id": "chatcmpl-123",
"object": "chat.completion.chunk",
"created": int(time.time()),
"model": data['model'],
"choices": [{
"index": 0,
"delta": {
"content": word,
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "hangup",
"arguments": "\{\}"
}
}
]
},
"finish_reason": None if i < len(words) - 1 else "stop"
}]
}
logger.info(chunk)
yield f"data: {json.dumps(chunk)}\n\n"
time.sleep(0.1) # Simulate processing time
yield "data: [DONE]\n\n"
if __name__ == '__main__':
logger.info(f"Server is running with API_KEY: {API_KEY}")
app.run(port=8083, debug=True)