feat(dashboard): add Atomic Agent integration tab - #2274
Open
sosidudku1 wants to merge 1 commit into
Open
Conversation
Atomic Agent reads OpenAI-compatible providers from its config file, so wiring it to an exo cluster needs no code on either side. Generate the config the same way the Pi tab does: base URL from the dashboard, model from the selector, vision flag and context window from live cluster state.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
The integrations page covers coding agents (Claude Code, OpenCode, Codex, OpenClaw, Pi) but not Atomic Agent, a local-first agent runtime that reads OpenAI-compatible providers straight from its config file. Wiring it to an exo cluster needs no new code on either side, only the right config, so a tab is the whole integration.
Agents are also the workload that makes a cluster worth building: one task fans out into dozens of model calls with long context and real tool calling, which is a very different load profile from a chat window.
Changes
Single-file change to
dashboard/src/routes/integrations/+page.svelte, following the same shape as the Pi tab (#1925):"Atomic Agent"to thetabstuple, after"Pi"atomicAgentModelstate, defaulted alongsidecodexModel/openClawModel/piModelatomicAgentConfigJsonderivation that emits anllm.providersentry for~/.atomic-agent/config.jsonIntegrationCardGenerated config:
{ "llm": { "activeTextProvider": "exo", "providers": [ { "id": "exo", "kind": "openai-compatible", "baseUrl": "http://127.0.0.1:52415/v1", "apiKey": "exo", "defaultChatModel": "<selected running model>", "supportsTools": true, "supportsVision": false, "userModels": [ { "id": "<model>", "kind": "chat", "contextWindow": 262144 } ] } ] } }Details that come from live cluster state, matching what the other tabs do:
baseUrlis the dashboard's ownapiUrlplus/v1defaultChatModelfollows the model selector, falling back toyour-model-idwhen nothing is runningsupportsVisionis derived from the model's exocapabilitiescontextWindowcomes from/v1/models, anduserModelsis omitted when the length is unknown rather than emitting a zeroWhy It Works
Atomic Agent registers providers by
kind. Itsopenai-compatiblekind takes an arbitrarybaseUrland talks the plain OpenAI chat-completions surface with nativetools, which is exactly what exo serves on/v1. So the tab is config generation only, no client changes and no backend changes.apiKeyis set to a placeholder because that provider kind always sends anAuthorizationheader; exo ignores the value, same as the OpenClaw and Pi tabs already assume.Test Plan
Manual Testing
Hardware: MacBook Air M4, 16 GB, single node, no cluster. macOS 26.1, exo from the released app.
npm run buildindashboard/succeedssvelte-check: no new errors in the touched file (the 15 pre-existing repo errors are unchanged)prettier --checkpasses on the touched file~/.atomic-agent/config.json, then:mlx-community/Qwen3.5-2B-MLX-8bit: OK, structuredtool_callsandfinish_reason: "tool_calls"os.fs.list,os.fs.glob) through the clusterOne observation worth recording, not a blocker for this tab:
mlx-community/Llama-3.2-1B-Instruct-4bitreturns tool calls as raw<|python_tag|>text incontentwithtool_calls: null, while Qwen models return them structured. Anything agentic wants a model with proper tool support.Automated Testing
No automated tests. The change is config-string generation in a Svelte route, matching the existing tabs, which are likewise covered only by the build and type check.