From atrium-ops
Interactively add an LLM provider to a running Atrium instance. Works with Anthropic, OpenAI, Azure OpenAI, Gemini, LiteLLM proxies, Ollama (local), or any OpenAI-schema custom endpoint.
How this skill is triggered — by the user, by Claude, or both
Slash command
/atrium-ops:atrium-add-providerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Atrium's AI curation and any future LLM-backed feature reads from the `ProviderConfig` Prisma table. Keys are encrypted at rest (AES-256-GCM, key derived from `AUTH_SECRET`). This skill walks the operator through picking a provider, collecting credentials, testing connectivity, and persisting the config.
Atrium's AI curation and any future LLM-backed feature reads from the ProviderConfig Prisma table. Keys are encrypted at rest (AES-256-GCM, key derived from AUTH_SECRET). This skill walks the operator through picking a provider, collecting credentials, testing connectivity, and persisting the config.
Ask: "Which LLM provider do you want to add?" Present the list with a one-line explanation of when to pick each:
| Option | When to pick |
|---|---|
anthropic | You have a Claude API key |
openai | You have an OpenAI API key |
azure-openai | Enterprise Azure OpenAI deployment |
gemini | Google Gemini API key |
litellm-proxy | You already route LLM traffic through a central LiteLLM proxy |
ollama | You want local-only inference, no API keys leave the network |
custom | Any other OpenAI-schema-compatible endpoint |
If the operator is hesitant about sending plugin metadata to a third party, recommend ollama and walk through the Docker sidecar option below.
Ask for:
https://{resource}.openai.azure.com/openai/deployments/{deployment}https://litellm.yourcompany.comclaude-sonnet-4-6gpt-4o-minigpt-4ogemini-2.5-flashConfirm Ollama is either already running on localhost:11434 or will be started as a Docker sidecar.
If the operator wants the sidecar:
docker compose --profile ollama up -d
Then pull a model. Recommend gemma3:4b (~3GB, fits on most machines). Other lightweight options: gemma3:1b, qwen2.5:3b.
docker compose exec ollama ollama pull gemma3:4b
Store:
http://ollama:11434/v1 (Docker network) or http://localhost:11434/v1 (bare-metal)Two paths depending on whether the operator has shell access to the host, or only the web UI.
Run this one-liner from the atrium repo root:
LLM_PROVIDER=<provider> \
LLM_API_KEY=<key-or-blank-for-ollama> \
LLM_DISPLAY_NAME=<human-readable> \
LLM_BASE_URL=<optional-base-url> \
LLM_DEFAULT_MODEL=<optional-model> \
pnpm exec tsx <<'TSX'
import { prisma } from "./lib/prisma";
import { encryptSecret } from "./lib/crypto";
const provider = process.env.LLM_PROVIDER!;
const apiKey = process.env.LLM_API_KEY || "local-no-auth";
await prisma.providerConfig.upsert({
where: { provider },
create: {
provider,
displayName: process.env.LLM_DISPLAY_NAME ?? `${provider} (bootstrap)`,
apiKeyCipher: encryptSecret(apiKey),
apiKeyTail: apiKey.slice(-4),
baseUrl: process.env.LLM_BASE_URL || null,
defaultModel: process.env.LLM_DEFAULT_MODEL || null,
enabled: true,
},
update: {
displayName: process.env.LLM_DISPLAY_NAME ?? `${provider} (bootstrap)`,
apiKeyCipher: encryptSecret(apiKey),
apiKeyTail: apiKey.slice(-4),
baseUrl: process.env.LLM_BASE_URL || null,
defaultModel: process.env.LLM_DEFAULT_MODEL || null,
enabled: true,
},
});
console.log("✓ provider seeded:", provider);
TSX
Direct the operator to <atrium.publicUrl>/admin/providers, click "Add / update a provider", fill in the form, and submit. Ask the operator to confirm when done.
From the provider list at /admin/providers, click Test on the new provider's row. The button fires a POST to the test-provider server action which issues a trivial completion request and reports back.
Expected success: "✓ pong" (or similar short response) within a few seconds.
Common failure modes:
| Error | Cause |
|---|---|
401 Unauthorized | Wrong API key. Check the value, not the envelope — trailing whitespace is common. |
Connection refused (Ollama) | Sidecar isn't running or wrong baseUrl. docker compose ps to verify. |
model not found | Model string doesn't match what's pulled/available. For Ollama, run docker compose exec ollama ollama list. |
timeout | Reachability issue. If behind a proxy, set the provider's baseUrl to the proxy. |
Walk the operator through using the provider for a real call:
Needs curation (e.g. /plugins/meeting-notes in the seed data).Expected: the category dropdown + tag chips fill with the LLM's suggestion, and the panel shows which provider responded.
If no plugins in the catalog have Needs curation, suggest creating one via /users/[id]/upload just to test.
Summarize:
Provider registered: <provider>
Base URL: <baseUrl or "default">
Default model: <model>
Key: …<last 4 chars> (encrypted at rest)
Test result: ✓ <first 40 chars of model response>
AI curation is now available across the catalog. Operators can add
additional providers at /admin/providers; the most-recently-updated
enabled provider is used by default.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub kushal-goenka/atrium --plugin atrium-ops