Conecte seus modelos de linguagem grandes (LLMs) personalizados a fluxos de trabalho em tempo real por meio de um protocolo padrão.
Interface padrão para LLMs desenvolvidos internamente (especificação OpenAI)
Se a interface do seu LLM seguir o padrão OpenAI, integre seu serviço de LLM personalizado a um fluxo de trabalho com a configuração OpenAI. O sistema aceita apenas requisições em streaming.
No nó LLM, selecione Self-developed access (OpenAI specification) e configure os parâmetros abaixo:
|
Name |
Type |
Required |
Description |
Example value |
|
ModelId |
String |
Yes |
Nome do modelo. Equivale ao campo 'model' da OpenAI. |
abc |
|
API-KEY |
String |
Yes |
Chave de API para autenticação. Equivale ao campo 'api_key' da OpenAI. |
AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
|
Target model HTTPS address |
String |
Yes |
URL do serviço de destino. Equivale ao campo 'base_url' da OpenAI. Nota
Para cumprir a especificação OpenAI, a Alibaba Cloud anexa automaticamente /chat/completions ao base_url. Verifique se o caminho segue esse formato. |
http://www.abc.com |
Na execução, o fluxo de trabalho monta os dados no formato OpenAI e envia uma requisição POST ao endpoint do modelo configurado. Confira os parâmetros de entrada:
|
Name |
Type |
Required |
Description |
Example value |
|
messages |
Array |
Yes |
Histórico da conversa. Armazena até 20 registros; as primeiras posições do array contêm as mensagens mais antigas. Nota
O sistema combina automaticamente a entrada atual do usuário com o histórico da conversa e envia o resultado ao 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 |
Yes |
Nome do modelo. |
abc |
|
stream |
Boolean |
Yes |
Indica se a resposta usa streaming. Apenas o modo streaming é compatível. |
True |
|
extendData |
Object |
Yes |
Informações adicionais. |
{'instanceId':'68e00b6640e*3e943332fee7','channelId':'123','sentenceId':'3','userData':'{"aaaa":"bbbb"}'} |
|
String |
Yes |
ID da instância. |
68e00b6640e*3e943332fee7 |
|
String |
Yes |
ID do canal. |
123 |
|
Int |
Yes |
ID do par de perguntas e respostas. Nota
Para uma mesma pergunta do usuário, a resposta do agente usa sempre o mesmo ID. |
3 |
|
String |
No |
Número de origem da chamada telefônica. |
13800000001 |
|
String |
No |
Número de destino da chamada telefônica. |
13800000002 |
|
String |
No |
Dados de negócios enviados no campo UserData durante a inicialização da instância. |
{"aaaa":"bbbb"} |
Servidor de LLM personalizado (especificação 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)