setup-python-tools
Pyodide Python tools for an already-approved in-app useAtlasChat UI. EOS sidebar Python tools run from agent CDF config — do not vendor Pyodide. Triggers: Pyodide, pythonRuntime, usePyodideRuntime, runPythonCode.
By cognitedata · 1,884 installs
npx skills add cognitedata/builder-skills --skill setup-python-tools
Source repository · Upstream listing
Set Up Python Tool Execution
Add client side Pyodide execution for $ARGUMENTS . Skip this if the app uses the Atlas / EOS sidebar ( integrate fusion agent ).
Prerequisite: src/atlas agent/ from integrate atlas chat , plus @sinclair/typebox . Copy python.ts , pyodide.ts , pyodide react.ts , pyodide runtime.ts from integrate atlas chat/code/ into src/atlas agent/ .
CDF runPythonCode tools arrive as toolConfirmation + clientTool . Wire usePyodideRuntime and pass pythonRuntime to useAtlasChat — no PythonToolConfig entries. Pyodide is ~30MB, cached after first load.
Step 1 — Understand the app
Read these files before touching anything:
package.json — detect package manager and existing deps
The component that calls useAtlasChat — understand current tools/config
Step 2 — Install Pyodide
Install exactly pyodide@0.29.3 using the app's package manager.
This version must match the CDN artifacts loaded at runtime — installing a different version will cause errors.
pnpm → pnpm add pyodide@0.29.3
npm → npm install pyodide@0.29.3
yarn → yarn add pyodide@0.29.3
@sinclair/typebox should already be installed from integrate atlas chat . Add it if missing.
Step 3 — Set up usePyodideRuntime
In the component that calls useAtlasChat , add the Pyodide runtime hook:
Hook API reference
Return field Type Description
runtime PythonRuntime \ undefined The initialized runtime, or undefined if not ready
loading boolean True while Pyodide is loading / initializing
error string \ null Error message if initialization failed
progress { stage: string; percent: number } Current init progress for UI display
isReady boolean Convenience: !loading && !error && runtime !== undefined
Loading state UI
Place the loading indicator above the chat input , not in the message list.
Keep it compact — a pill/badge showing stage text and percent. Show an error badge separately.
First load is ~30 60s (downloads ~30MB); subsequent loads are <2s from browser cache.
Step 4 — Wire into useAtlasChat
Pass the runtime to useAtlasChat . That's all — no tool configs needed:
Note : Python tools are NOT declared to the agent via tools . The agent already knows
about them from its CDF config. The library fetches the code automatically when needed.
Step 5 — Disable input while Python loads
The user shouldn't send messages before the runtime is ready. Disable the entire input area
(not just the send button) so the state is unambiguous:
If you have a home page with suggestion chips, disable those too:
Done
The app can now execute Python tools client side via Pyodide. When the agent calls a Python
tool, the library automatically fetches its code from the agent config, runs it in the
browser, and returns the result to the agent.