关于智能体接入后端,在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 也只是那一句话,对原来功能无影响。

相关推荐
小叶爱吃鱼2 分钟前
web自动化-Selenium、Playwright、Robot Framework等自动化框架使用场景优劣对比
python·selenium·自动化
元直数字电路验证1 小时前
[DS]使用 Python 库中自带的数据集来实现上述 50 个数据分析和数据可视化程序的示例代码
python·信息可视化·数据分析
青钰未央6 小时前
19、Python字符串高阶实战:转义字符深度解析、高效拼接与输入处理技巧
python·改行学it
Blue桃之夭夭8 小时前
Python进阶【四】:XML和JSON文件处理
xml·python·json
开发者工具分享9 小时前
Lua 的速度为什么比 Python 快
开发语言·python·lua
蔗理苦9 小时前
2025-05-28 Python&深度学习8——优化器
开发语言·pytorch·python·深度学习·优化器
杰瑞学AI9 小时前
在PyTorch中,对于一个张量,如何快速为多个元素赋值相同的值
人工智能·pytorch·python
hongjianMa10 小时前
【论文阅读】User Diverse Preference Modeling by Multimodal Attentive Metric Learning
论文阅读·python·推荐系统·多模态推荐
乖乖der10 小时前
python同步mysql数据
开发语言·python·mysql
渐消散11 小时前
人工智障玩游戏
python