You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于FastAPI的Bot Framework机器人在Web Chat和模拟器无响应排查

问题分析与解决方案

核心问题

你当前的实现不符合Bot Framework标准协议规范:直接在/api/messages的POST响应里返回回复消息,这种方式仅被Teams通道兼容,但Bot Framework Emulator和Azure Test Web Chat严格遵循协议,要求机器人主动调用服务端API发送回复,而非在请求响应中返回消息内容。

修复代码

改用Bot Framework官方SDK处理消息交互,以下是修正后的FastAPI实现:

from fastapi import FastAPI, Request
from fastapi.responses import Response, JSONResponse
from botbuilder.core import BotFrameworkAdapter, BotFrameworkAdapterSettings, TurnContext
from botbuilder.schema import Activity

# 替换为你的Azure Bot注册信息
APP_ID = "<你的Microsoft App ID>"
APP_PASSWORD = "<你的Microsoft App密码>"

# 初始化Bot适配器
adapter_settings = BotFrameworkAdapterSettings(APP_ID, APP_PASSWORD)
adapter = BotFrameworkAdapter(adapter_settings)

app = FastAPI()

# 处理消息的核心逻辑
async def handle_message(context: TurnContext):
    await context.send_activity(f"Echo: {context.activity.text}")

@app.post("/api/messages")
async def messages(request: Request):
    # 解析请求为Bot Framework标准活动对象
    activity_data = await request.json()
    activity = Activity().deserialize(activity_data)
    
    # 用适配器处理活动,自动完成签名验证和回复发送
    auth_header = request.headers.get("Authorization", "")
    try:
        await adapter.process_activity(activity, auth_header, handle_message)
        # 按协议要求返回204 No Content
        return Response(status_code=204)
    except Exception as e:
        return JSONResponse(content=str(e), status_code=500)

关键说明

  • 协议要求:Bot Framework规定,收到用户消息后,机器人需返回204 No Content响应,再通过请求中的serviceUrl地址,调用专用API发送回复消息。你之前的直接返回消息体属于非标准实现,仅Teams通道兼容。
  • SDK优势:官方SDK会自动处理消息序列化、权限验证、服务端API调用等细节,避免手动构造消息时遗漏协议细节。
  • 权限验证:适配器会自动校验请求的Authorization头,确保请求来自合法的Bot Framework服务。

额外检查项

  • 确认Azure Bot注册的Messaging Endpoint正确指向/api/messages,本地调试时需用ngrok等工具暴露公网地址。
  • 确保代码中的Microsoft App ID和密码与Azure注册信息完全一致,避免权限验证失败导致消息无法发送。

内容的提问来源于stack exchange,提问作者user29297718

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:11:01