mirror of
https://github.com/CopilotKit/CopilotKit.git
synced 2026-09-14 16:26:20 +08:00
6f35b26614
## What Eleven demos in the `crewai-crews` showcase column (labelled **CrewAI Flows** in the UI) were served by `add_crewai_crew_fastapi_endpoint` through a root catch-all, not by the Flow helper. This moves them onto a real CrewAI Flow and removes the catch-all. Affected demos: agentic-chat, gen-ui-tool-based, prebuilt-sidebar, prebuilt-popup, chat-slots, chat-customization-css, headless-simple, readonly-state-agent-context, agent-config, auth, voice. ## Why `add_crewai_crew_fastapi_endpoint` wraps the crew in `ChatWithCrewFlow`, which composes its system message with CrewAI's `build_system_message`. That boilerplate is unconditional: it instructs the model to introduce itself and to steer every answer back to the crew's purpose, using a research-report example. Because the catch-all served the scaffold research crew, those demos answered the user's question and then offered to research the latest AI developments. Measured against real OpenAI on `main`, first turn: > Hey! I'm here to help you with researching cutting-edge developments and producing detailed, actionable reports. > The capital of France is **Paris**. If you'd like, I can also help by generating a **current research report** on a topic of your choice. Second turn, arithmetic question: > 12 × 12 = 144. > I'm here to help with researching the latest AI developments and producing actionable reports. Pre-seeding a hand-written `crew_description` (the existing `_chat_flow_helpers.preseed_system_prompt`) only retargets that tail, it does not remove it — verified on `/mcp-apps`, which is pre-seeded and still introduces itself and offers a diagram. ## How - New `src/agents/chat_flow.py` holds `PromptedChatFlow`, a one-turn Flow that owns its own prompt and forwards frontend tools. `crewai-conversational-flows` already had this class inline; it now imports the same file, so both columns share one prompt. - `agent_server.py` registers it at `/chat` via `add_crewai_flow_fastapi_endpoint`, and the root catch-all registration is gone. An unrouted agent name now fails loudly instead of landing on someone else's backend. - The runtime route's default target becomes `/chat`; the `agent-config`, `auth`, and `voice` routes point there too. - The remaining crew endpoints (`/mcp-apps`, `/byoc-hashbrown`, `/byoc-json-render`) are untouched — each already overrides the composed system message explicitly. - Comments that described the removed catch-all were corrected in both CrewAI columns. ## Verification Against real OpenAI on the patched backend: - `/chat` answers `Paris.` and `12 × 12 = 144.` with no purpose-reminder tail. - A frontend tool still round-trips: `generate_haiku` emits `TOOL_CALL_START` / `TOOL_CALL_ARGS` / `TOOL_CALL_END`. - `POST /` returns 404. Python suites: 162 passed (`crewai-crews`), 164 passed (`crewai-conversational-flows`). New coverage in `test_chat_flow.py` (prompt contract, no crew-chat boilerplate, tool forwarding) plus a routing contract test asserting no cell can reach a crew endpoint by fall-through. D6 replay: see the checklist below. ### D6 replay (local, `--d6 --direct`, warm stack) All fourteen green: the eleven affected cells (agentic-chat, gen-ui-tool-based, prebuilt-sidebar, prebuilt-popup, chat-slots, chat-customization-css, headless-simple, readonly-state-agent-context, agent-config, auth, voice) plus tool-rendering, hitl-in-chat and shared-state-read-write as untouched controls. gen-ui-tool-based needed the second commit: the shared probe had both CrewAI columns off its chart-integration list, so it sent the haiku prompt and waited for a haiku card the page cannot draw. The probe's own unit tests still pass (11). The conversational column's D6 was not run — it is not deployed, and its image was not built in this session. Its Python suite passes and its wiring mirrors the crews column line for line.