关于智能体接入后端,在Apifox能够传参数给智能体的测试

python 复制代码
from flask import Flask, request, jsonify, render_template
import requests
import json  # 用于解析嵌套的 JSON 字符串

app = Flask(__name__)

COZE_BOT_ID = '7508736911423963162'
COZE_API_KEY = 'pat_cHXqrFzcvtktfmmlp4pjF3O2qmjioQW46uU8UNbUugyvSlFZclklpunc53DbR8ws'
COZE_API_URL = 'https://api.coze.cn/open_api/v2/chat'

@app.route('/zhoushibo')
def index():
    return render_template('index.html')

@app.route('/chat', methods=['POST'])
def chat():
    user_input = request.json.get('message')

    headers = {
        'Authorization': f'Bearer {COZE_API_KEY}',
        'Content-Type': 'application/json'
    }

    payload = {
        'bot_id': COZE_BOT_ID,
        'user': 'user_001',
        'query': user_input
    }

    response = requests.post(COZE_API_URL, headers=headers, json=payload)
    data = response.json()

    # 1. 先拿到 Coze 返回的 messages 列表
    messages = data.get("messages", [])

    # 2. 遍历每条消息,优先返回第一条"非知识召回"类型的回复;否则把所有知识召回的 chunks 拼起来
    collected_chunks = []  # 用来收集所有 knowledge_recall 类型消息里的 chunks
    final_reply = ""       # 要发送给前端的最终文本

    for msg in messages:
        raw_content = msg.get("content", "")

        # 尝试把 raw_content 解析成 JSON
        try:
            parsed_outer = json.loads(raw_content)
            msg_type = parsed_outer.get("msg_type", "")
            inner_data_str = parsed_outer.get("data", "")

            if msg_type != "knowledge_recall":
                # 如果这一条不是知识召回类型,直接取它的 content 当作最终回复
                # (不同 msg_type 里真正要呈现的聊天文本,往往在 parsed_outer["content"])
                final_reply = parsed_outer.get("content", raw_content)
                break

            else:
                # msg_type == "knowledge_recall",进一步解析 inner_data_str 看看有没有 chunks
                if inner_data_str:
                    parsed_inner = json.loads(inner_data_str)
                    chunks = parsed_inner.get("chunks", [])
                    # 如果 chunks 是列表且非空,就把这些片段收集起来
                    if isinstance(chunks, list) and len(chunks) > 0:
                        for chunk in chunks:
                            # 每个 chunk 通常是 {"content": "这里是一段文本"}
                            collected_chunks.append(chunk.get("content", ""))
                # 如果 inner_data_str 为 "" 或 chunks 为空,直接忽略,继续处理下一条消息

        except (ValueError, json.JSONDecodeError):
            # 如果 raw_content 根本不是合法 JSON,就把它作为"非知识召回"类型直接返回
            final_reply = raw_content
            break

    # 3. 如果在遍历过程中没有碰到"非知识召回"类型的回复,且 collected_chunks 非空,就拼接后返回
    if not final_reply and collected_chunks:
        final_reply = "".join(collected_chunks)

    # 4. 如果以上都没有拿到有效文本,就返回一个默认提示
    if not final_reply:
        final_reply = "对不起,暂时无法获取有效回复。"

    return jsonify({'reply': final_reply})

if __name__ == '__main__':
    app.run(debug=True)

这是我的Flask源代码,在Apifox的测试中仅仅只能完成传入一个message这个消息串的简单操作,不能传参数。

我的原先代码能正常运行,是因为我之前只接收了一个 message 字段,把它直接作为 query 传递给 Coze:

python 复制代码
user_input = request.json.get('message')
payload = {
    'bot_id': COZE_BOT_ID,
    'user': 'user_001',
    'query': user_input
}

这是我现在的新需求(实现多参数的输入):

python 复制代码
{
  "message": "请帮我推荐大模型",
  "场景": "文本生成",
  "预算": "500元"
}

如果我还是 user_input = request.json.get('message'),只会把 "请帮我推荐大模型" 传给 Coze,其他参数全部丢失。

我需要把所有参数(如 "场景"、"预算")一起传递,大模型才能"理解上下文"。

而final_prompt的作用是把 message 和所有其他参数拼成一句话。

所以这里需要改两个地方:

第一个:

python 复制代码
user_input = request.json.get('message')

改为:

python 复制代码
# 2. 单独提取 message,其余参数合成结构化内容
    user_message = data.get('message', '')
    params = {k: v for k, v in data.items() if k != 'message'}
    params_text = "\n".join([f"{k}:{v}" for k, v in params.items()]) if params else ""
    final_prompt = f"用户请求:{user_message}\n{params_text}" if params_text else f"用户请求:{user_message}"

第二个:

python 复制代码
payload = {
        'bot_id': COZE_BOT_ID,
        'user': 'user_001',
        'query': user_input
    }

改为:

python 复制代码
payload = {
        'bot_id': COZE_BOT_ID,
        'user': 'user_001',
        'query': final_prompt   # 改为 final_prompt
    }

//

如果用户只传了 message,那 final_prompt 也只是那一句话,对原来功能无影响。

相关推荐
jiuri_121519 小时前
Docker使用详解:在ARM64嵌入式环境部署Python应用
python·docker·容器
chenchihwen19 小时前
AI代码开发宝库系列:Function Call
人工智能·python·1024程序员节·dashscope
汤姆yu21 小时前
基于python的化妆品销售分析系统
开发语言·python·化妆品销售分析
上去我就QWER21 小时前
Python下常用开源库
python·1024程序员节
程序员杰哥1 天前
Pytest之收集用例规则与运行指定用例
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
Jyywww1211 天前
Python基于实战练习的知识点回顾
开发语言·python
朝朝辞暮i1 天前
从0开始学python(day2)
python
程序员黄同学1 天前
Python中的列表推导式、字典推导式和集合推导式的性能和应用场景?
开发语言·python
AI小云1 天前
【Python高级编程】类和实例化
开发语言·人工智能·python