Alur kerja Real-time memungkinkan Anda menghubungkan model bahasa besar (LLM) kustom menggunakan protokol standar.
Antarmuka standar LLM hasil pengembangan sendiri (spesifikasi OpenAI)
Jika API LLM Anda mematuhi spesifikasi OpenAI, Anda dapat mengintegrasikan layanan LLM kustom ke dalam alur kerja menggunakan konfigurasi OpenAI standar. Saat ini, hanya permintaan berbasis stream ke layanan yang kompatibel dengan OpenAI yang didukung.
Pada node LLM, pilih Self-developed (OpenAI Specification) dan konfigurasikan parameter berikut:
Nama | Tipe | Wajib | Deskripsi | Example value |
ModelId | String | Ya | Bidang model standar OpenAI. Menentukan nama model. | abc |
API-KEY | String | Ya | Bidang api_key standar OpenAI. Menyediakan informasi autentikasi API. | AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
Alamat HTTPS model target | String | Ya | Bidang base_url standar OpenAI. Menentukan alamat permintaan layanan target. Catatan Alibaba Cloud secara otomatis menambahkan /chat/completions ke base_url sesuai persyaratan spesifikasi OpenAI. Pastikan path Anda sesuai dengan format ini. | http://www.abc.com |
Saat alur kerja real-time dijalankan, sistem menyusun data dalam format standar OpenAI, lalu mengirim permintaan POST ke alamat HTTPS model kustom yang telah Anda konfigurasi untuk mendapatkan hasilnya. Parameter input adalah sebagai berikut:
Nama | Tipe | Wajib | Deskripsi | Example value |
messages | Array | Ya | Konteks percakapan historis. Maksimal 20 catatan konteks disimpan. Catatan yang muncul lebih awal dalam array merepresentasikan pertanyaan atau jawaban sebelumnya. Catatan Sistem secara otomatis menggabungkan input pengguna saat ini dengan riwayat percakapan dan mengirimkannya ke model bahasa besar. | [{'role': 'user', 'content': 'What is the weather like today?'},{'role': 'assistant', 'content': 'The weather is sunny today.'},{'role': 'user', 'content': 'What about tomorrow?'}] |
model | String | Ya | Nama model. | abc |
stream | Boolean | Ya | Menentukan apakah akan menggunakan mode stream. Saat ini, hanya stream yang didukung. | True |
extendData | Object | Ya | Informasi tambahan. | {'instanceId':'68e00b6640e*****3e943332fee7','channelId':'123','sentenceId':'3',userData':'{"aaaa":"bbbb"}'} |
| String | Ya | ID instance. | 68e00b6640e*****3e943332fee7 |
| String | Ya | ID saluran. | 123 |
| Int | Ya | ID pasangan tanya-jawab. Catatan Untuk pertanyaan pengguna yang sama, respons agen menggunakan ID yang sama. | 3 |
| String | No | Nomor pemanggil dalam panggilan telepon. | 13800000001 |
| String | No | Nomor yang dipanggil dalam panggilan telepon. | 13800000002 |
| String | Tidak | Data dari bidang bisnis UserData yang Anda kirimkan saat memulai instans. | {"aaaa":"bbbb"} |
Server LLM kustom (spesifikasi 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():
# Periksa kunci API
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}")
# Cetak parameter kueri
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 an analog 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 an analog AI assistant stream 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) # Simulasikan waktu pemrosesan
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)