/** * Proves the Prime Agent runtime against the real endpoint. * * A typecheck cannot tell you that the credential resolved, that the loader was * reloaded, or that no built-in tool survived `noTools: 'all'` — every one of * those failures compiles perfectly and shows up as a 401, a coding-assistant * answer, or a shell in a CRM. So this asks the live model a question with a * seeded tool behind it and prints what actually happened. * * corepack pnpm -F @pig/piggy exec tsx src/dev/verify-prime-agent.ts [modelId] * * Requires PRIME_API_KEY. It spends a few hundred tokens; it is a dev tool, not * a test, and nothing in CI runs it. */ import { defineTool } from '@earendil-works/pi-coding-agent'; import { Type } from 'typebox'; import { createPiggySession } from '../agent/session'; const tool = defineTool({ name: 'pig_get_workspace_summary', label: 'Workspace summary', description: 'Returns the workspace-wide capacity aggregates, already computed.', promptSnippet: 'pig_get_workspace_summary: workspace-wide capacity aggregates, already computed.', parameters: Type.Object({}), async execute() { console.log(' [tool] pig_get_workspace_summary called'); return { content: [ { type: 'text' as const, // The figures are chosen to catch the two failures that matter: 189 // must be read as $1.89 and 112 as $1.12, not as "189" and "112 // cents". text: JSON.stringify({ headline: 'Northwind Robotics H100 block, 38% sold', committedGpuHours: 52_000, allocatedGpuHours: 19_760, utilisation: 0.38, costPerGpuHourCents: 189, breakEvenPriceCents: 112, idleCostCents: 1_200_000, }), }, ], details: {}, }; }, }); const modelId = process.argv[2]; const piggy = await createPiggySession({ mode: 'confirm', ...(modelId ? { modelId } : {}), tools: [tool], }); const live = piggy.session.agent.state.tools.map((entry) => entry.name); const shellish = live.filter((name) => /^(bash|shell|ipython|python|read|write|edit|ls|grep|find)$/i.test(name), ); console.log('MODEL:', piggy.modelId); console.log('TOOLS:', live); console.log('SHELL/PYTHON PRESENT:', shellish.length > 0); console.log('SYSTEM PROMPT (first 200):', piggy.session.systemPrompt.slice(0, 200)); console.log('PROMPT LISTS THE TOOL:', piggy.session.systemPrompt.includes('pig_get_workspace_summary')); console.log('PROMPT IS THE CODING PREAMBLE:', /coding assistant/i.test(piggy.session.systemPrompt)); console.log('---'); let answer = ''; const unsubscribe = piggy.session.subscribe((event) => { if (event.type === 'message_update' && event.assistantMessageEvent.type === 'text_delta') { answer += event.assistantMessageEvent.delta; } if (event.type === 'tool_execution_start') console.log(' [event] tool_execution_start'); }); await piggy.session.prompt( 'What is the break-even price per GPU-hour on this block, and how much has the idle capacity already cost? Use the tool.', ); await piggy.session.waitForIdle(); unsubscribe(); console.log('ANSWER:', answer.trim()); piggy.dispose(); process.exit(0);