Hubungkan model bahasa besar (LLM) kustom Anda ke alur kerja real-time menggunakan protokol standar.
Antarmuka standar untuk LLM yang dikembangkan sendiri (spesifikasi OpenAI)
Jika antarmuka LLM Anda mengikuti standar OpenAI, Anda dapat mengintegrasikan layanan LLM kustom tersebut ke dalam alur kerja dengan menggunakan konfigurasi OpenAI. Hanya permintaan streaming yang didukung.
-
Pada node LLM, pilih Self-developed access (OpenAI specification) dan konfigurasikan parameter berikut:
|
Name |
Type |
Required |
Description |
Example value |
|
ModelId |
String |
Yes |
Nama model. Sesuai dengan bidang 'model' OpenAI. |
abc |
|
API-KEY |
String |
Yes |
Kunci API untuk otentikasi. Sesuai dengan bidang 'api_key' OpenAI. |
AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
|
Target model HTTPS address |
String |
Yes |
URL layanan target. Sesuai dengan bidang 'base_url' OpenAI. Catatan
Sesuai dengan spesifikasi OpenAI, Alibaba Cloud secara otomatis menambahkan /chat/completions ke base_url. Pastikan path Anda sesuai dengan format ini. |
http://www.abc.com |
-
Pada waktu proses, alur kerja menyusun data dalam format OpenAI dan mengirim permintaan POST ke titik akhir model yang telah Anda konfigurasi. Parameter inputnya adalah sebagai berikut:
|
Name |
Type |
Required |
Description |
Example value |
|
messages |
Array |
Yes |
Riwayat percakapan. Maksimal 20 catatan disimpan. Entri awal dalam array merepresentasikan pesan yang lebih lama. Catatan
Sistem secara otomatis menggabungkan input pengguna saat ini dengan riwayat percakapan dan mengirimkannya ke 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 |
Nama model. |
abc |
|
stream |
Boolean |
Yes |
Apakah respons akan di-stream. Hanya streaming yang didukung. |
True |
|
extendData |
Object |
Yes |
Informasi tambahan. |
{'instanceId':'68e00b6640e*****3e943332fee7','channelId':'123','sentenceId':'3','userData':'{"aaaa":"bbbb"}'} |
|
String |
Yes |
ID instans. |
68e00b6640e*****3e943332fee7 |
|
String |
Yes |
ID channel. |
123 |
|
Int |
Yes |
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 |
No |
Data bisnis yang diteruskan dalam bidang UserData 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 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) # 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)