integrate-fusion-agent
MUST be used when adding AI, Atlas, an agent, a chat UI, or LLM features to a Flows/Fusion app. Use the Atlas/EOS sidebar via @cognite/app-sdk — not useAtlasChat, vendored atlas-agent, or per-row chat completions. Triggers: atlas, EOS, PAIA, agent chat, chat UI, sendAgentMessage, sendAgentLayoutMode
By cognitedata · 1,660 installs
npx skills add cognitedata/builder-skills --skill integrate-fusion-agent
Source repository · Upstream listing
Integrate Atlas / EOS Sidebar
Default AI path: the platform Atlas sidebar (EOS / Fusion PAIA) via @cognite/app sdk . Do not embed useAtlasChat , vendor atlas agent , or call third party LLM APIs.
integrate atlas chat only if the user explicitly requires in app chat and connectToHostApp cannot provide the sidebar (standalone app; always rejects). There is no manifest field for this.
Implement only what is needed:
1. Open — Topbar Atlas button; sendAgentLayoutMode for in app triggers
2. Message — sendAgentMessage to inject context
3. Server — resources (app state) and actions (tools)
Step 0 — Read the app
package.json — package manager, @cognite/app sdk
src/App.tsx — structure, existing SDK usage
Ask which of the three capabilities are needed. Do not offer an in app chat unless they already insisted.
Step 1 — Install
pnpm add @cognite/app sdk (or npm/yarn). Minimum 0.3.1 .
Step 2 — Connect to the host
connectToHostApp rejects outside Fusion (standalone vite dev ). Catch that; hide agent triggers when api is null.
Comlink proxies are callable — setApi(proxy) makes React treat the proxy as an updater and stores a Promise. Always setApi(() = resolvedApi) .
Call at the root; pass api down or via context. typeof proxy.method === 'function' is always true — do not feature detect with typeof ; use try/catch.
Step 3 — Open the sidebar
Primary launcher: Aura Topbar Atlas ( systemActions.atlas.visible: true , see use topbar ). No second "Open Assistant" control.
sendAgentLayoutMode is for contextual triggers only ( sidebar fullscreen closed ):
Step 4 — Send a message
Pair with sendAgentLayoutMode . newSession: true for a new task from an item; omit to continue the thread. Put names/IDs/state in the message — one sidebar turn, not N completions over query rows.
Step 5 — Agent server
Register on mount, unregister on unmount. Factories take services as args so they can be unit tested without React:
Resource read() returns { type: 'json', data } (preferred) or { type: 'text', text } . Write description like a docstring.
Actions: snake case names, Zod params, .describe() on every field. The agent does not confirm before calling — mutating actions must say so in description and require prior user approval.
Step 6 — Wire together
Test factories directly:
Hard gate — LLM calls over query results
Do not map chat completions (Atlas agents/chat , OpenAI/Anthropic, useAtlasChat().send ) over DMS/SDK rows. Prefer one sendAgentMessage or a resource the sidebar agent can read.
If per item completions are an explicit product requirement (default: no):
Rule Limit
Default 5 completions per user initiated action
Ceiling 50 — never generate code that can exceed this
Cache space:externalId:lastUpdatedTime ; hits do not spend budget
Batch One prompt covering N items, not N calls
Trigger User initiated only — never on render, poll, or an unbounded list
UX Say when the cap truncated the set
Forbidden: items.map((row) = complete(row)) , Promise.all of completions over a query page.
Checklist
[ ] Topbar Atlas launcher ( use topbar ); no in app chat widget
[ ] @cognite/app sdk@0.3.1+ ; setApi(() = resolvedApi) ; catch outside Fusion rejection
[ ] Triggers hidden when api is null; server registered/unregistered with .catch()
[ ] Resource descriptions say what/when; action names snake case ; mutating actions require prior approval
[ ] Factories take services as args; LLM over rows capped (5 / max 50) and cached if present