Skip to main content

Connect Third-Party LLMs

Connect SOAT to xAI, OpenAI, Anthropic or Amazon Bedrock with Secrets, AI Providers, Agents and Sessions.

Prerequisites​

  • SOAT running locally (Quick Start).
  • CLI or SDK; server at http://localhost:5047.
  • Credentials for at least one provider.
export SOAT_BASE_URL=http://localhost:5047

Step 1 — Log in as admin​

Admin bypasses policy evaluation. See Users.

ADMIN_TOKEN=$(soat login-user --username admin --password Admin1234! | jq -r '.token')
export SOAT_TOKEN=$ADMIN_TOKEN

Step 2 — Create a project​

Every resource lives inside a project.

PROJECT_ID=$(soat create-project --name "Hosted LLM Demo" | jq -r '.id')
echo "PROJECT_ID: $PROJECT_ID"

Step 3 — Store provider credentials as secrets​

Secrets are stored encrypted and referenced by ID. One secret per provider credential set.

OPENAI_SECRET_ID=$(soat create-secret \
--project-id "$PROJECT_ID" \
--name "openai-api-key" \
--value "sk-<your-openai-key>" | jq -r '.id')

ANTHROPIC_SECRET_ID=$(soat create-secret \
--project-id "$PROJECT_ID" \
--name "anthropic-api-key" \
--value "sk-ant-<your-anthropic-key>" | jq -r '.id')

XAI_SECRET_ID=$(soat create-secret \
--project-id "$PROJECT_ID" \
--name "xai-api-key" \
--value "xai-<your-xai-key>" | jq -r '.id')

BEDROCK_SECRET_ID=$(soat create-secret \
--project-id "$PROJECT_ID" \
--name "bedrock-credentials" \
--value '{"accessKeyId":"<aws-access-key-id>","secretAccessKey":"<aws-secret-access-key>","sessionToken":"<optional-session-token>"}' | jq -r '.id')

Step 4 — Create provider records​

Supported providers and options: AI Providers. Pick the one matching your model:

# OpenAI
OPENAI_PROVIDER_ID=$(soat create-ai-provider \
--project-id "$PROJECT_ID" \
--name "OpenAI" \
--provider "openai" \
--default-model "gpt-4.1-mini" \
--secret-id "$OPENAI_SECRET_ID" | jq -r '.id')

# Anthropic
ANTHROPIC_PROVIDER_ID=$(soat create-ai-provider \
--project-id "$PROJECT_ID" \
--name "Anthropic" \
--provider "anthropic" \
--default-model "claude-3-5-sonnet-latest" \
--secret-id "$ANTHROPIC_SECRET_ID" | jq -r '.id')

# xAI
XAI_PROVIDER_ID=$(soat create-ai-provider \
--project-id "$PROJECT_ID" \
--name "xAI" \
--provider "xai" \
--default-model "grok-3-mini" \
--secret-id "$XAI_SECRET_ID" | jq -r '.id')

# Bedrock (secret value can be JSON credentials, region can live in config)
BEDROCK_PROVIDER_ID=$(soat create-ai-provider \
--project-id "$PROJECT_ID" \
--name "Bedrock" \
--provider "bedrock" \
--default-model "anthropic.claude-3-5-sonnet-20240620-v1:0" \
--secret-id "$BEDROCK_SECRET_ID" \
--config '{"region":"us-east-1"}' | jq -r '.id')

Step 5 — Create an agent​

An agent pointing at the provider.

AGENT_ID=$(soat create-agent \
--project-id "$PROJECT_ID" \
--ai-provider-id "$OPENAI_PROVIDER_ID" \
--name "Hosted Assistant" \
--instructions "You are a helpful assistant using a hosted LLM." \
| jq -r '.id')

Step 6 — Start a conversation​

A session on the provider-backed agent.

SESSION_ID=$(soat create-session --agent-id "$AGENT_ID" | jq -r '.id')

soat add-session-message \
--session-id "$SESSION_ID" \
--message "Summarize why model routing matters in one paragraph."

What's next​

  • Provider rotation: several provider records in one project; switch agents between them.
  • Custom gateways: gateway or custom provider types for an OpenAI-compatible upstream.
  • Secret rotation: create a new secret and update the provider's secret_id.