From 4687fa966945aa68520b6820cc43e905d4ff06a3 Mon Sep 17 00:00:00 2001 From: Carlos Escalante Date: Sat, 4 Jul 2026 16:09:56 -0600 Subject: [PATCH] Assistant: drop a2ui surfaces, fall back to markdown tables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CK 1.60+ validates generated a2ui ops against a component catalog before painting, and our agent's ops fail validation — surfaces hang at "Building interface" forever (MAF also drops RunAgentInput.context, so the catalog/guidelines never even reach the model). Disable a2ui end to end until the pipeline matures: - server.ts: a2ui { enabled: false }; RENDER_TOOLS no longer includes render_a2ui - App.tsx: remove the a2ui provider prop - agent.py: prompt now asks for clean markdown tables for lists and structured data; render_spending_summary card guidance unchanged Co-Authored-By: Claude Fable 5 --- backend/app/agent/agent.py | 22 ++++++++++------------ frontend/server.ts | 7 +++++-- frontend/src/App.tsx | 2 +- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/backend/app/agent/agent.py b/backend/app/agent/agent.py index fe71860..b490fab 100644 --- a/backend/app/agent/agent.py +++ b/backend/app/agent/agent.py @@ -34,7 +34,9 @@ How to answer: (e.g. net worth + recent transactions). - Format currency with the appropriate symbol: ₡ for CRC (no decimals), $ for USD (two decimals), € for EUR (two decimals). -- When showing lists, prefer markdown tables over prose. +- When showing lists or structured data (transactions, breakdowns, funds), + format them as clean markdown tables: right-align amounts, include a total + row when summing, keep merchant names as-is. - If a tool returns no data, say so explicitly — do not fill in zeros. - You are read-only in this version. If asked to create, edit or delete anything, explain that write actions aren't available yet and offer to @@ -47,17 +49,13 @@ Generative UI — render tools: - When showing spending totals, cycle summaries, or category breakdowns → call render_spending_summary. Source data: get_cycle_summary (by_source, grand_total_crc) + get_analytics_by_category (by_category). -- When showing transaction lists or other structured data → - call render_a2ui in a SEPARATE tool-call step, only after all data-fetching - calls have returned. NEVER call render_a2ui in the same batch as any other - tool. -- Do NOT use markdown tables for data a render tool can display. -- CRITICAL RULE: When you call a render tool (render_spending_summary or - render_a2ui), that tool call MUST be the ONLY content in your message. - Do NOT include any text content alongside the tool call — no introduction, - no list, no explanation, nothing. The rendered card IS the complete - response. Any text you write in the same message as a render call will - appear as a duplicate below the card, which is wrong. +- Do NOT use markdown tables for data render_spending_summary can display. +- CRITICAL RULE: When you call render_spending_summary, that tool call MUST + be the ONLY content in your message. Do NOT include any text content + alongside the tool call — no introduction, no list, no explanation, + nothing. The rendered card IS the complete response. Any text you write in + the same message as a render call will appear as a duplicate below the + card, which is wrong. """ diff --git a/frontend/server.ts b/frontend/server.ts index 3581eaa..4f4084e 100644 --- a/frontend/server.ts +++ b/frontend/server.ts @@ -197,7 +197,7 @@ class StripModelArtifactsMiddleware extends (Middleware as any) { // below the card. This middleware buffers TEXT_MESSAGE_* events and discards // them if any render tool call is detected in the same turn. -const RENDER_TOOLS = new Set(["render_a2ui", "render_spending_summary"]); +const RENDER_TOOLS = new Set(["render_spending_summary"]); // eslint-disable-next-line @typescript-eslint/no-explicit-any class SuppressRenderToolTextMiddleware extends (Middleware as any) { @@ -311,7 +311,10 @@ app.all("/api/copilotkit/*", async (c) => { const runtime = new CopilotRuntime({ agents: { wealthysmart: agent }, - a2ui: { injectA2UITool: true }, + // a2ui disabled 2026-07-04: CK 1.60+ validates generated ops against a + // catalog and our agent's ops fail validation (surface never paints). + // Markdown tables cover the use case until the pipeline matures. + a2ui: { enabled: false }, beforeRequestMiddleware: async ({ request: outbound }) => { if (outbound.method !== "POST") return; const ct = outbound.headers.get("content-type") ?? ""; diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 69ead84..8b4ca31 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -77,7 +77,7 @@ export default function App() { - +