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() { - +