標準プロトコルを使用して、カスタム大規模言語モデル (LLM) をリアルタイムワークフローに接続します。
自社開発 LLM の標準インターフェイス (OpenAI 仕様)
LLM インターフェイスが OpenAI 標準に準拠している場合、OpenAI 設定を使用してカスタム LLM サービスをワークフローに統合できます。ストリーミングリクエストのみをサポートします。
-
LLM ノードでは、[自社開発アクセス (OpenAI 仕様)] を選択し、次のパラメーターを設定します。
|
名前 |
タイプ |
必須 |
説明 |
値の例 |
|
ModelId |
String |
はい |
モデル名。 OpenAI の 'model' フィールドに対応します。 |
abc |
|
API-KEY |
String |
はい |
認証用の API キー。 OpenAI の 'api_key' フィールドに対応します。 |
AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
|
ターゲットモデルの HTTPS アドレス |
String |
はい |
ターゲットサービスの URL。 OpenAI の 'base_url' フィールドに対応します。 説明
OpenAI 仕様に準拠するため、Alibaba Cloud は base_url に自動的に /chat/completions を追加します。パスがこの形式と一致することを確認してください。 |
http://www.abc.com |
-
実行時、ワークフローは OpenAI 形式でデータを組み立て、設定されたモデルエンドポイントに POST リクエストを送信します。
|
名前 |
タイプ |
必須 |
説明 |
値の例 |
|
messages |
Array |
はい |
会話履歴。最大 20 件まで保持します。配列内の前方のエントリは古いメッセージを表します。 説明
システムは、ユーザーの現在の入力を会話履歴と自動的に結合し、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 |
はい |
モデル名。 |
abc |
|
stream |
Boolean |
はい |
レスポンスをストリーミングするかどうか。ストリーミングのみをサポートします。 |
True |
|
extendData |
Object |
はい |
追加情報。 |
{'instanceId':'68e00b6640e*****3e943332fee7','channelId':'123','sentenceId':'3','userData':'{"aaaa":"bbbb"}'} |
|
String |
はい |
インスタンス ID。 |
68e00b6640e*****3e943332fee7 |
|
String |
はい |
チャネル ID。 |
123 |
|
Int |
はい |
Q&A ペア ID。 説明
同じユーザーの質問に対して、エージェントのレスポンスは同じ ID を使用します。 |
3 |
|
String |
いいえ |
電話通話での発信者番号。 |
13800000001 |
|
String |
いいえ |
電話通話での着信者番号。 |
13800000002 |
|
String |
いいえ |
インスタンス起動時に UserData フィールドで渡されたビジネスデータ。 |
{"aaaa":"bbbb"} |
カスタム LLM (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():
# 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}")
# クエリパラメータを出力
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) # 処理時間をシミュレート
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)