LLM标准接口

实时工作流支持您按照规定的标准协议来接入自研大语言模型(LLM)。

自研LLM标准接口(OpenAI规范)

如果您的LLM接口符合OpenAI标准规范,您可以通过OpenAI标准的配置将您的自研LLM服务整合到工作流中。目前只支持以流式方式请求符合OpenAI规范的服务。

  1. 首先您需要LLM大语言模型节点中,选择自研接入(OpenAI规范),并配置以下参数:

名称

类型

必填

描述

示例值

ModelId

String

OpenAI标准model字段,表示模型名称

abc

API-KEY

String

OpenAI标准api_key字段,表示API鉴权信息

AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI

目标模型HTTPS地址

String

OpenAI标准base_url字段,表示目标服务请求地址

http://www.abc.com

  1. 在实时工作流运行期间,将按照以下格式,组装OpenAI标准数据,通过POST请求访问您配置的自研模型HTTPS地址,获取相应结果,输入参数如下:

名称

类型

必填

描述

示例值

messages

Array

历史对话上下文,最多保留20条上下文记录,在数组中越靠前的位置,表示越早的提问或者回答。

说明

系统将自动将用户本次讲话内容与历史对话记录结合,输入至大模型中。

[{'role': 'user', 'content': '今天天气怎么样?'},{'role': 'assistant', 'content': '今天天气晴朗。'},{'role': 'user', 'content': '明天天气晴怎么样?'}]

model

String

模型名称信息

abc

stream

Boolean

是否流式,目前只支持流式传输

True

extendData

Object

补充信息

{'instanceId':'68e00b6640e*****3e943332fee7','channelId':'123','sentenceId':'3',userData':'{"aaaa":"bbbb"}'}

  • instanceId

String

实例ID信息

68e00b6640e*****3e943332fee7

  • channelId

String

房间ID信息

123

  • sentenceId

Int

问答ID信息

说明

对于用户的同一次提问,智能体回答会使用相同的ID信息。

3

  • userData

String

启动实例时您传入的UserData业务字段数据

{"aaaa":"bbbb"}

自定义LLM(OpenAI规范)Server

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 = "这是一个模拟的AI助手响应。实际应用中,这里应该调用真实的AI模型。"
    
    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 = "这是一个模拟的AI助手流式响应。实际应用中,这里应该调用真实的AI模型。"
    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 
                },
                "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)

相关文档

通过控制台创建实时工作流模板