/** * Scheduled ZAI canary (spec AC23): a small, non-deploying contract check for * text and media compatibility with bounded cost. Run by Luci on a schedule * once ZAI secrets are configured; exits non-zero on drift. */ import { loadAgentConfig } from '../src/agent/config.ts' import { ZaiRestClient } from '../src/agent/zai/client.ts' const config = loadAgentConfig() if (!config.zai.apiKey) { console.error('canary: ZAI_API_KEY missing') process.exit(2) } const client = new ZaiRestClient(config.zai.apiKey, config.zai.baseUrl, { retries: 1, timeoutMs: 30_000, }) let failures = 0 const check = async (name: string, fn: () => Promise) => { try { await fn() console.log(`canary: ${name} ok`) } catch (err) { failures++ console.error(`canary: ${name} FAILED: ${err instanceof Error ? err.message : String(err)}`) } } // 1x1 transparent PNG as the media payload (bounded, deterministic). const png = Buffer.from( 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==', 'base64', ) await check('text chat completion', () => client.chatCompletion({ model: config.zai.analysisModel, messages: [{ role: 'user', content: 'Reply with the single word: ok' }], }), ) await check('vision image input', () => client.chatCompletion({ model: config.zai.analysisModel, messages: [ { role: 'user', content: [ { type: 'text', text: 'Describe this image in one word.' }, { type: 'image_url', image_url: { url: `data:image/png;base64,${png.toString('base64')}` }, }, ], }, ], }), ) await check('layout parsing endpoint', () => client.layoutParsing(new Uint8Array(png), { fileName: 'canary.png' }), ) process.exit(failures > 0 ? 1 : 0)