news 2026/9/13 4:55:21

CopilotKit 与 CrewAI Conversational Flows 集成之 Agentic Chat 深度测试与验证指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CopilotKit 与 CrewAI Conversational Flows 集成之 Agentic Chat 深度测试与验证指南

CopilotKit 与 CrewAI Conversational Flows 集成之 Agentic Chat 深度测试与验证指南

【免费下载链接】CopilotKitThe Frontend Stack for Agents & Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit

本篇文章围绕 CopilotKit 开源仓库中 CrewAI Conversational Flows 集成示例的agentic-chat(Agentic Chat)演示页面展开,完整解析其 QA 测试清单(qa/agentic-chat.md)所覆盖的前后端功能点,并结合前端组件、Next.js 运行时路由、Python FastAPI 后端与 Playwright 端到端测试源码,逐项说明"验证什么、为什么这样验证、底层如何实现"。读完本文,你将掌握针对一个CopilotChat最小可运行示例(含建议快捷键、前端工具、工具渲染、Agent 上下文)的完整验收方法,并能对照仓库源码定位每一步测试背后的真实实现。

背景:Agentic Chat 在集成示例中的定位

showcase/integrations/crewai-conversational-flows(CrewAI Conversational Flows 集成示例)中,agentic-chat是所有对话类演示的最小可运行范本。该集成与同仓库的crewai-crews是"同前端、异后端"的姊妹列:前端 React 源码保持一致,后端执行路径改为 CrewAI 官方公开的 Conversational Flows API(详见 PARITY_NOTES.md)。

根据集成清单 manifest.yaml 中agentic-chat条目(route: /demos/agentic-chat,描述为 "Natural conversation with frontend tool execution"),该页面是探索整条集成链路正确性的第一站。端到端测试文件 tests/e2e/agentic-chat.spec.ts 开头的注释也点明了它的契约定位:

Agentic Chat is the minimum-viable CopilotChat demo: a tiny page that wraps<CopilotChat>plus three starter-prompt suggestions. The contract here is "vanilla chat works end-to-end" — anything richer belongs in dedicated demos (frontend-tools, tool-rendering, etc.).

也就是说:Agentic Chat 验证"最朴素的聊天端到端可用",更复杂的能力(前端工具、工具渲染、Agent 上下文等)由专门演示验证。本文的 QA 清单在基础对话之外还覆盖了这些能力,因此在逐项验证时,需要把对应功能的源码依据也一并说明。

一、前置条件:部署与健康检查

QA 清单的第一步是确认环境就绪,共两条:

  1. Demo 已部署且可访问:本地开发环境运行pnpm dev即可同时拉起前端与后端。查看 package.json 的dev脚本:

    concurrently "next dev --turbopack" "PYTHONPATH=. python -m uvicorn agent_server:app --host 0.0.0.0 --port 8000 --reload"

    前端运行在 3000 端口,Python 后端(FastAPI)运行在 8000 端口。

  2. Agent 后端健康(检查 /api/health):健康检查存在两条路径,互为印证:

    • Python 后端自身提供/health端点,由 agent_server.py 中的HealthMiddleware直接返回{"status": "ok"},与任何 Agent 端点解耦;
    • 前端运行时路由 src/app/api/copilotkit/route.ts 的GET处理器会以 3 秒超时探测${AGENT_URL}/healthAGENT_URL默认http://localhost:8000),返回agent_urlagent_status: "reachable" | "error (...)"

    这也解释了 QA 清单为什么把"Agent 后端健康"列为硬性前置:前端运行时本身是一个代理层,后端不健康时所有对话请求都会失败。

二、测试环境:Playwright 配置与运行方式

QA 清单的手工步骤可以由端到端测试自动执行。集成示例的 playwright.config.ts 关键配置如下:

  • testDir: "./tests/e2e":测试目录为 tests/e2e;
  • baseURL: http://localhost:3000:默认访问本地前端;
  • webServer:CI 之外由 Playwright 自动执行pnpm dev并等待 3000 端口就绪;
  • 每个请求携带X-AIMock-Context: crewai-conversational-flows头,用于区分同仓库不同集成列的测试夹具(mock 数据)。

执行方式为pnpm test:e2e。对应自动化用例见 agentic-chat.spec.ts,它覆盖了"页面加载与三条建议可见""输入并回车获得回复""点击建议获得回复""多轮对话保持上下文"四个场景,与下文 QA 清单互为印证。

三、测试步骤 1:基本功能验证

3.1 页面加载与输入框

进入agentic-chat演示页,聊天界面应加载出文本输入框,占位符为 "Type a message"。源码依据在 src/app/demos/agentic-chat/page.tsx:页面用<CopilotKit runtimeUrl="/api/copilotkit" agent="agentic_chat">包裹<CopilotChat agentId="agentic_chat" />,占位符是CopilotChat内置默认文案。Playwright 侧用page.getByPlaceholder("Type a message")断言其可见性。

3.2 背景容器可见与默认颜色

QA 清单要求验证背景容器(data-testid="background-container")可见,且默认背景色为主题默认rgb(250, 250, 249)

需要说明的是:agentic-chat页面源码本身只渲染CopilotChat,并不包含背景容器;该data-testid实际出现于同列的frontend-tools演示(对应 QA 文档 qa/frontend-tools.md)。在frontend-tools中,背景容器的实现是 src/app/demos/frontend-tools/background.tsx,其真实data-testidfrontend-tools-background,默认背景为#4f46e5(纯靛蓝),并非rgb(250, 250, 249)。因此验证此条目时应结合frontend-tools演示执行:进入/demos/frontend-tools,断言背景容器可见、初始内联样式包含#4f46e5(对应 tests/e2e/frontend-tools.spec.ts 中的 "background container starts with the solid indigo default" 用例)。

3.3 发送基础消息并获得回复

发送 "Hello" 后,Agent 应以文本消息回复。这一条验证的是完整链路:浏览器 →/api/copilotkit运行时 → Python 后端/conversational_flows/chat→ CrewAI Flow → LLM 流式返回。

  • 前端将agentic_chat代理到后端:在 route.ts 中,createAgent()默认构造HttpAgent({ url:${AGENT_URL}/conversational_flows/${feature}})agentic_chat属于agentNames中的默认别名,未做专属路由覆盖,因此指向/conversational_flows/chat
  • 后端由 agent_server.py 遍历 conversational_flows.py 的CONVERSATIONAL_FLOW_TYPES注册表,为每个 Flow 注册/conversational_flows/{feature}端点(conversational=True)。
  • chat对应的实现是 src/agents/chat_flow.py 的PromptedChatFlow,其chat()方法通过litellmacompletion(模型openai/gpt-5.4)调用copilotkit_stream流式输出,并把返回消息追加到状态。

自动化断言见 agentic-chat.spec.ts:填充 "Say hello in one word." 后回车,等待[data-testid="copilot-assistant-message"]出现。

四、测试步骤 2:功能专项检查

4.1 建议(Suggestions)

QA 清单要求验证两条建议按钮:"Change background" 与 "Generate sonnet"。

需要注意:实际agentic-chat页面的建议由 src/app/demos/agentic-chat/suggestions.ts 通过useConfigureSuggestions注册,内容是:

suggestions: [ { title: "Write a sonnet", message: "Write a short sonnet about AI." }, { title: "Tell me a joke", message: "Tell me a one-line joke." }, { title: "Is 17 prime?", message: "Walk me through whether 17 is prime." }, ], available: "always",

即页面实际渲染的是 "Write a sonnet"、"Tell me a joke"、"Is 17 prime?" 三条建议。QA 清单中的 "Change background" 与 "Generate sonnet" 分别对应frontend-toolsagentic-chat-reasoning等衍生场景("Generate sonnet" 在 reasoning 演示中触发复杂的思维链输出)。验证建议的通用断言是:按钮可见,点击后要么填充输入框、要么直接发送消息。Playwright 侧对 "Tell me a joke" 点击后断言copilot-assistant-message出现(agentic-chat.spec.ts)。

useConfigureSuggestionsavailable: "always"表示建议常驻显示;它注册在 suggestions.ts 并在 page.tsx 中被useAgenticChatSuggestions()调用。

4.2 背景变更(useFrontendTool)

QA 步骤:"Change the background to a sunset gradient",验证背景容器样式从默认值变化,且change_background工具返回成功状态。

这是"前端工具(Frontend Tools)"的核心能力,完整实现在frontend-tools演示中,源码依据:

  • 注册:useFrontendTool({ name: "change_background", description, parameters, handler }),见 frontend-tools/page.tsx。parameters用 zod 声明background: string("The CSS background value. Prefer gradients."),handler调用setBackground(background)并返回{ status: "success" }
  • 渲染:<Background background={background}>把 CSS 值作为内联style={{ background }}应用,容器带data-testid="frontend-tools-background",默认值#4f46e5(background.tsx)。
  • 后端配合:frontend_tools别名在 route.ts 被覆盖为createAgent("/frontend-tools"),对应后端 frontend_tool_flow.py。该 Flow 的系统提示要求"当提供的前端工具能满足用户请求时必须调用它",并且在用户回合携带工具动作时使用tool_choice="required"强制触发工具调用;后端伪造工具结果——前端工具调用以流式事件返回浏览器执行,结果在下一轮请求中作为权威结果恢复。

因此验证要点是:提示模型改背景后,内联样式发生变化;自动化侧用轮询断言样式不再包含#4f46e5(Forest 主题),或匹配linear-gradient|radial-gradient(Sunset 主题),见 frontend-tools.spec.ts。工具成功状态体现在 Agent 随后对变更结果的简短总结(由后端系统提示驱动)。

4.3 天气渲染工具(useRenderTool)

QA 步骤:输入 "What's the weather in Tokyo?",验证加载态显示 "Loading weather..."(data-testid="weather-info-loading"),随后渲染 WeatherCard(data-testid="weather-info"),包含城市名、摄氏度温度、湿度百分比、mph 风速与天气描述。

与背景同理,这条能力的完整实现在tool-rendering演示中,源码依据:

  • 渲染器注册:useRenderTool({ name: "get_weather", parameters, render }),见 tool-rendering/page.tsx。render接收{ parameters, result, status }status !== "complete"时为加载态;结果通过parseJsonResult(parse-json-result.ts)解析为{ city, temperature, humidity, wind_speed, conditions }
  • 卡片组件:WeatherCard(weather-card.tsx),其真实data-testidweather-card,内部含weather-cityweather-humidityweather-wind;加载时显示 "Fetching weather...",渲染完成后显示温度(°F)、湿度(%)、风速(mph)与天气描述(含天气 emoji 映射)。
  • 后端:tool-rendering别名在 route.ts 映射到/tool-rendering,由 src/agents/tool_rendering.py 的ToolRenderingFlow发出get_weather/get_stock_price等 AG-UITOOL_CALL_*事件。

这里与 QA 清单存在同样的命名差异:清单使用的weather-info/weather-info-loadingtestid 在当前源码的WeatherCard中对应weather-card(加载文案为 "Fetching weather...")。验证时应以源码为准,断言weather-card可见,并在加载与完成两种状态下检查城市、温度、湿度、风速、天气描述字段是否填充。

4.4 Agent 上下文(useAgentContext)

QA 步骤:Agent 应知道用户名为 "Bob"(通过useAgentContext提供);询问 "What is my name?" 时回复 "Bob"。

useAgentContext的完整用法见readonly-state-agent-context演示:readonly-state-agent-context/page.tsx 中调用形如:

useAgentContext({ description: "The currently logged-in user's display name", value: userName, });

其工作方式是把前端应用状态作为只读上下文随每轮请求注入 Agent。后端侧的关键保证在 chat_flow.py:ChatState显式声明context: list[Any]字段,因为CopilotKitState本身不声明该字段、会被 pydantic 在输入校验时丢弃,只有声明后模型才能读到应用上下文。PromptedChatFlow.chat()会把state(排除 messages 与 copilotkit 后)序列化为 JSON 拼进系统提示的 "Application context" 段,并附带提示词要求"在后续轮次原样保留用户选定的专有名称"——这正是多轮询问名字能稳定复述的底层原因。

多轮上下文验证的自动化示例见 agentic-chat.spec.ts:先告知名字 "Alice",等建议按钮重新出现(代表本轮流式结束),再询问 "What name did I just give you?",断言第二条助手消息包含 "Alice"。建议按钮的重新出现可作为"对话回合已结算"的等待信号。

五、测试步骤 3:错误处理

QA 清单的三条错误处理检查:

  1. 发送空消息应被优雅处理CopilotChat输入框为空时发送按钮/回车被禁用或忽略,不会产生请求。验证时确认界面无异常、无报错即可。
  2. 正常使用无控制台错误:可在 DevTools 控制台观察,或由 Playwright 的page.on("console")收集 error 级日志断言为空。
  3. 发送超长消息不应破坏布局CopilotChat消息列表对长文本换行渲染;后端侧消息作为普通文本随上下文传入 LLM,不涉及特殊解析。验证消息气泡正常换行、滚动正常、无横向溢出。

此外,route.ts 展示了运行时的防御性设计:任何未捕获异常都会生成errorId,完整错误细节仅记录在服务端日志(供运维以errorId关联排查),HTTP 响应只返回{ error: "internal runtime error", errorId },避免泄露内部路径与堆栈——这保证了即使后端异常,前端拿到的也是结构化错误而非崩溃性输出。

六、预期结果与验收标准

QA 清单给出的量化验收标准:

验收项标准
聊天界面加载3 秒内完成
Agent 响应10 秒内返回
背景变更工具执行后立即生效(内联样式即时变化)
天气卡片所有数据字段(城市/温度/湿度/风速/天气描述)填充完整
UI 稳定性无界面错误、无布局破坏

其中"背景变更即时生效"与"天气卡片字段完整"已在前面结合源码说明;"3 秒 / 10 秒"为交互体验性指标,Playwright 侧的可见性断言超时(建议按钮 15 秒、助手消息 30 秒)为该体验指标留出了余量。

七、延伸:Agentic Chat Reasoning 变体

同目录下的 qa/agentic-chat-reasoning.md 提供了 reasoning 变体(/demos/agentic-chat-reasoning)的简短 QA:

  • 发送复杂提示(如三城旅行规划);
  • 验证自定义ReasoningBlock卡片(data-testid="reasoning-block")带 "Reasoning" 徽标出现在最终答案上方;
  • 流式期间标签显示 "Thinking...";
  • 最终助手文本在推理内容之后出现。

该变体在 route.ts 中属于reasoningAgentNames,统一映射到/reasoning端点,由 src/agents/reasoning_flow.py 的ReasoningFlow实现。其核心原理(见 route.ts 注释):CrewAI 桥接层把推理模型的流式输出转换为 AG-UI 的 reasoning 与 text 生命周期事件,前端据此先渲染推理块、再渲染最终答案——与agentic-chat的"普通文本流"形成对照,可在同一套 QA 流程中一并回归。

八、总结:一份可执行的验收清单

综合以上分析,可将 QA 清单提炼为可直接执行的最终检查表:

  • 环境:Demo 已部署,/api/health返回 200,GET /api/copilotkitagent_statusreachable
  • 基本功能:/demos/agentic-chat加载 ≤3s;输入框占位符 "Type a message";发送 "Hello" 后 10s 内收到文本回复
  • 建议:三条建议(Write a sonnet / Tell me a joke / Is 17 prime?)可见;点击后消息被发送并收到回复
  • 前端工具(/demos/frontend-tools):frontend-tools-background容器可见且初始为#4f46e5;要求改成渐变后内联样式变为linear/radial-gradientchange_background返回{ status: "success" }
  • 工具渲染(/demos/tool-rendering):询问东京天气后,weather-card先显示加载态,完成后城市/温度/湿度/风速/描述字段齐全
  • Agent 上下文:通过useAgentContext注入的名字可在多轮后准确复述
  • 错误处理:空消息被优雅忽略;无控制台错误;超长消息不破坏布局
  • 全链路回归:执行pnpm test:e2e(tests/e2e/agentic-chat.spec.ts)通过

这条 QA 链路覆盖了 CopilotKit + CrewAI Conversational Flows 集成的核心价值:CopilotChat开箱即用的对话体验、AG-UI 协议下的流式通信、useFrontendTooluseRenderTool提供的生成式 UI 能力,以及useAgentContext的前后端状态贯通。对照 page.tsx、route.ts 与 chat_flow.py 三个文件,即可复现并深入理解每一层。

【免费下载链接】CopilotKitThe Frontend Stack for Agents & Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 4:54:58

小分子串联质谱(MS/MS)库构建与应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 4:53:58

DeepSeek-V4.1-Flash:552B MoE与1M上下文的工程落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 4:53:16

子品牌被推荐了,能不能算作母品牌的AI推荐表现?

子品牌被推荐&#xff0c;可以说明品牌组合中有成员进入了相应候选&#xff0c;但不能自动认定母品牌本身也被推荐。两种结果都值得观察&#xff0c;却回答不同的问题&#xff1a;一个关注具体品牌的购买表现&#xff0c;另一个关注集团或母品牌名下业务的整体覆盖。先确定需要…

作者头像 李华
网站建设 2026/9/13 4:53:00

DataHub 本地跑通全流程:10 分钟从容器启动到看到血缘图

DataHub 本地跑通全流程&#xff1a;10 分钟从容器启动到看到血缘图 【免费下载链接】datahub The Context Platform for your Data and AI Stack 项目地址: https://gitcode.com/GitHub_Trending/da/datahub DataHub 本地部署其实没那么玄乎——装好 CLI、一条命令拉起…

作者头像 李华