Use this skill when adding a new AI provider to claude-council, configuring provider API settings, troubleshooting provider connections, or understanding the provider script interface. Triggers on "add provider", "new AI agent", "provider not working", "API configuration", or "extend council".
This skill inherits all available tools. When active, it can use any tool Claude has access to.
Each provider is a shell script in scripts/providers/ that:
Create scripts/providers/{provider-name}.sh:
#!/bin/bash
# ABOUTME: Queries {Provider} API with a prompt
# ABOUTME: Returns the model's response to stdout
set -euo pipefail
PROMPT="${1:-}"
if [[ -z "$PROMPT" ]]; then
echo "Error: No prompt provided" >&2
exit 1
fi
# Check for API key
API_KEY="${PROVIDER_API_KEY:-}"
if [[ -z "$API_KEY" ]]; then
echo "Error: PROVIDER_API_KEY not set" >&2
exit 1
fi
# Make API call (adjust for provider's API format)
RESPONSE=$(curl -s -X POST "https://api.provider.com/v1/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_KEY}" \
-d "$(jq -n --arg prompt "$PROMPT" '{
model: "model-name",
messages: [{role: "user", content: $prompt}]
}')")
# Extract response (adjust for provider's response format)
TEXT=$(echo "$RESPONSE" | jq -r '.choices[0].message.content // empty')
if [[ -z "$TEXT" ]]; then
ERROR=$(echo "$RESPONSE" | jq -r '.error.message // "Unknown error"')
echo "Error: $ERROR" >&2
exit 1
fi
echo "$TEXT"
chmod +x scripts/providers/{provider-name}.sh
The script expects {PROVIDER}_API_KEY environment variable:
export PROVIDER_API_KEY="your-api-key"
Or add to .claude/claude-council.local.md:
---
providers:
provider-name:
api_key: "your-api-key"
---
# Test directly
./scripts/providers/{provider-name}.sh "Hello, can you respond?"
# Test via council
./scripts/query-council.sh --providers={provider-name} "Test query"
Many providers use OpenAI-compatible endpoints (Grok, Together, etc.):
ENDPOINT="https://api.{provider}.com/v1/chat/completions"
PAYLOAD=$(jq -n --arg prompt "$PROMPT" '{
model: "model-name",
messages: [{role: "user", content: $prompt}],
temperature: 0.7,
max_tokens: 2048
}')
RESPONSE=$(curl -s -X POST "$ENDPOINT" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_KEY}" \
-d "$PAYLOAD")
TEXT=$(echo "$RESPONSE" | jq -r '.choices[0].message.content // empty')
ENDPOINT="https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent"
PAYLOAD=$(jq -n --arg prompt "$PROMPT" '{
contents: [{parts: [{text: $prompt}]}],
generationConfig: {temperature: 0.7, maxOutputTokens: 2048}
}')
RESPONSE=$(curl -s -X POST "${ENDPOINT}?key=${API_KEY}" \
-H "Content-Type: application/json" \
-d "$PAYLOAD")
TEXT=$(echo "$RESPONSE" | jq -r '.candidates[0].content.parts[0].text // empty')
ENDPOINT="https://api.anthropic.com/v1/messages"
PAYLOAD=$(jq -n --arg prompt "$PROMPT" '{
model: "claude-sonnet-4-20250514",
max_tokens: 2048,
messages: [{role: "user", content: $prompt}]
}')
RESPONSE=$(curl -s -X POST "$ENDPOINT" \
-H "Content-Type: application/json" \
-H "x-api-key: ${API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-d "$PAYLOAD")
TEXT=$(echo "$RESPONSE" | jq -r '.content[0].text // empty')
The query-council.sh script only discovers providers with configured API keys:
# Check if key is set
echo $PROVIDER_API_KEY
# Verify script is executable
ls -la scripts/providers/*.sh
Common issues:
If jq fails to extract response:
echo "$RESPONSE" before parsing to see raw responsejq path to match response structureCurrent providers in scripts/providers/:
| Provider | Script | API Key Variable | Model |
|---|---|---|---|
| Gemini | gemini.sh | GEMINI_API_KEY | gemini-2.0-flash |
| OpenAI | openai.sh | OPENAI_API_KEY | gpt-4o |
| Grok | grok.sh | GROK_API_KEY | grok-3-latest |
Would create recursion (asking Claude about Claude), but if needed:
# scripts/providers/anthropic.sh
# Uses ANTHROPIC_API_KEY
# Model: claude-sonnet-4-20250514
# Endpoint: https://api.mistral.ai/v1/chat/completions
# Key: MISTRAL_API_KEY
# Model: mistral-large-latest
# Format: OpenAI-compatible
# Endpoint: https://api.cohere.ai/v1/chat
# Key: COHERE_API_KEY
# Model: command-r-plus
# Format: Custom (see Cohere docs)