The /chat assistant (audit Option A / rip) shipped in #1759 reading only the
company name + entity type, so it answered "jag har ingen bokföringsdata" to
every figures question ("vad är min största utgiftspost?"). It now behaves like
an MCP client: it answers over a bounded, READ-only tool loop across the same
MCP read tools the old streaming assistant had, plus an always-on company
snapshot as the backstop.
Provider-agnostic by construction, so it still runs on a local model:
- lib/ai generateText gains optional `tools` + `maxSteps`. The OpenAI-compatible
service forwards them to the Vercel AI SDK (stopWhen: stepCountIs), which runs
the loop; the Anthropic-family service hand-rolls a small loop against
messages.create. Kept on the raw Anthropic SDK: no new deps, and the no-tools
path is byte-identical, so hosted extraction/composer/etc. are unchanged.
- lib/agent/ask/ledger-tools.ts: the read slice of general.help's whitelist
(income statement, VAT, ledgers, query_journal, reskontror, lists…) from
agentToolRegistry, dispatched with the agent_chat actor run-turn uses. Write/
staging + memory-write tools are excluded; readOnlyHint/destructiveHint are
re-checked. Empty in a core-only build → snapshot-only, graceful.
- lib/agent/ask/snapshot.ts: a compact company_settings + deadlines block so a
model that can't/won't call tools still answers status questions. Never carries
figures (those come from the live tools).
- ask-service attaches tools + snapshot when a userId is present and uses a
tool-aware system prompt; the route calls ensureInitialized() so the registry
is populated and threads userId/conversationId through.
Works on Bedrock and on any local model with function-calling (Qwen). Tests:
the anthropic hand-rolled loop (tool call → result → answer, is_error handling,
step-budget forced answer), openai tool forwarding, the read-only adapter
filter, the snapshot format, and the ask-service wiring. 457 agent+ai tests
green, lint/guards clean.
Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>