setup-python-tools — скилл для Claude Code: Pyodide в чате
Ставит клиентское выполнение Python-инструментов через Pyodide в приложение с уже готовым useAtlasChat. Нужен, когда агент отдаёт код инструмента, а считать он должен в браузере.
npx skills add cognitedata/builder-skills --skill setup-python-tools -a claude-codeЧто делает setup-python-tools
Скилл проводит по шагам: читает package.json и компонент с useAtlasChat, ставит [email protected], подключает хук usePyodideRuntime и передаёт pythonRuntime в useAtlasChat. Отдельные записи PythonToolConfig не нужны — инструменты runPythonCode приходят из конфига агента в CDF как toolConfirmation и clientTool, библиотека сама забирает код, когда он понадобится.
Версия Pyodide должна совпадать с артефактами на CDN. Поставите другую — получите ошибки при загрузке. Первая загрузка тянет около 30MB и занимает 30-60 секунд, дальше браузер отдаёт из кеша меньше чем за 2 секунды. Пока идёт инициализация, скилл советует гасить всё поле ввода, а не только кнопку отправки, и показывать компактный индикатор над полем — со стадией и процентом.
Перед началом нужны src/atlas-agent/ из скилла integrate-atlas-chat и пакет @sinclair/typebox; файлы python.ts, pyodide.ts, pyodide-react.ts, pyodide-runtime.ts копируются из integrate-atlas-chat/code/. Если приложение ходит через боковую панель Atlas / EOS, этот скилл пропускается — там Python-инструменты работают из конфига агента.
Какие задачи решает
- выполнить Python-код инструмента прямо в браузере
- подключить Pyodide к существующему чату на
useAtlasChat - показать прогресс загрузки рантайма над полем ввода
- заблокировать отправку сообщений, пока Python не готов
- сверить версию
pyodideс артефактами на CDN
Примеры запросов агенту
- настрой python-инструменты для агента my-agent
- подключи usePyodideRuntime к компоненту с useAtlasChat
- добавь индикатор загрузки Pyodide над полем ввода
Как установить setup-python-tools
1Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill setup-python-tools -a claude-code2Вручную: положить файлы
~/.claude/skills/setup-python-tools/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/setup-python-tools/
1Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill setup-python-tools -a codex2Вручную: положить файлы
.agents/skills/setup-python-tools/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill setup-python-tools -a cursor2Вручную: положить файлы
.cursor/skills/setup-python-tools/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install cognitedata/builder-skills setup-python-tools2Вручную: положить файлы
.github/skills/setup-python-tools/SKILL.md1Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill setup-python-tools -a gemini-cli2Командой платформы
gemini skills install https://github.com/cognitedata/builder-skills --path skills/setup-python-toolsВручную: положить файлы
.devin/skills/setup-python-tools/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill setup-python-tools -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора12
Похожие
Рядом в теме «Настройка агента: память, контекст, субагенты»
Все скиллы по теме «Настройка агента: память, контекст, субагенты» →Вопросы о setup-python-tools
Как установить setup-python-tools в Claude?
Выполните npx skills add cognitedata/builder-skills --skill setup-python-tools -a claude-code. Скилл появится в ~/.claude/skills/setup-python-tools/SKILL.md.
Что делает setup-python-tools?
Добавляет клиентское выполнение Python-инструментов через Pyodide в приложение с useAtlasChat: ставит [email protected], подключает usePyodideRuntime и передаёт рантайм в чат.
Какая версия Pyodide нужна?
Ровно [email protected]. Она должна совпадать с артефактами, которые грузятся с CDN, иначе загрузка падает с ошибками.
Исходный текст
SKILL.md · Apache-2.0
--- name: setup-python-tools description: "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." allowed-tools: Read, Glob, Grep, Edit, Write, Bash metadata: argument-hint: "[tool-names or agent-external-id]" --- # 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** `[email protected]` 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 [email protected]` - npm → `npm install [email protected]` - yarn → `yarn add [email protected]` > `@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: ```tsx import { loadPyodide } from "pyodide"; import { usePyodideRuntime } from "./atlas-agent/pyodide-react"; import { useAtlasChat } from "./atlas-agent/react"; function MyChat() { const { sdk, isLoading } = useDune(); // Initialize Python runtime (loads Pyodide, installs packages, sets up Cognite SDK) const { runtime: pythonRuntime, loading: pythonLoading, progress: pythonProgress, error: pythonError, isReady: pythonReady, } = usePyodideRuntime({ loadPyodide, client: isLoading ? null : sdk, requirements: ["pandas", "numpy"], // optional — additional packages }); // ... useAtlasChat below } ``` ### 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. ```tsx {/* Loading — shown above the input while Pyodide initializes */} {pythonLoading && ( <div className="flex items-center gap-2 rounded-lg border bg-muted/50 px-3 py-2 text-sm text-muted-foreground"> {/* Optional: <IconBrandPython /> from @tabler/icons-react */} <span>{pythonProgress.stage || "Initializing Python..."}</span> {pythonProgress.percent > 0 && pythonProgress.percent < 100 && ( <span className="text-xs opacity-70">({pythonProgress.percent}%)</span> )} </div> )} {/* Error — shown if init fails (after loading finishes) */} {pythonError && !pythonLoading && ( <div className="flex items-center gap-2 rounded-lg border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive"> <span>Python runtime failed to load</span> </div> )} ``` --- ## Step 4 — Wire into useAtlasChat Pass the runtime to `useAtlasChat`. That's all — no tool configs needed: ```tsx const { messages, send, isStreaming, progress, error, reset, abort } = useAtlasChat({ client: isLoading ? null : sdk, agentExternalId: "my-agent", tools: [renderTimeSeries], // regular client tools (declared to agent), if any pythonRuntime, // from usePyodideRuntime — enables Python tool execution }); ``` **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: ```tsx <ChatInput onSend={handleSend} disabled={isStreaming || pythonLoading} // ... /> ``` If you have a home page with suggestion chips, disable those too: ```tsx <ChatHomePage onSuggestionClick={handleSuggestionClick} disabled={pythonLoading} /> ``` --- ## 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.
© cognitedata · Apache-2.0 · cognitedata/builder-skills