Skip to content

Provider Setup

Sol supports 10 AI provider adapters through a behaviour-based system. Each provider implements a common interface for model listing, completions, and streaming. Providers are configured in sys.config and registered at boot time.

Configuration Overview

Providers are defined in server/config/sys.config under the sol application environment:

erlang
{sol, [
  {providers, [
    {anthropic, #{api_key => "sk-ant-..."}},
    {openai, #{api_key => "sk-..."}},
    {zai, #{api_key => "..."}},
    {ollama, #{base_url => "http://localhost:11434"}}
  ]}
]}

API keys can also be set via environment variables to avoid storing secrets in config files.

Anthropic (Claude)

PropertyValue
Adaptersol_provider_anthropic
APIAnthropic Messages API
StreamingYes
VisionYes
erlang
{anthropic, #{
  api_key => "sk-ant-api03-..."
}}

Model IDs

  • claude-sonnet-4-20250514
  • claude-3-5-sonnet-20241022
  • claude-3-5-haiku-20241022
  • claude-3-opus-20240229

Environment Variable

bash
export ANTHROPIC_API_KEY="sk-ant-api03-..."

OpenAI (GPT)

PropertyValue
Adaptersol_provider_openai
APIOpenAI Chat Completions
StreamingYes
Function CallingYes
erlang
{openai, #{
  api_key => "sk-...",
  base_url => "https://api.openai.com/v1"
}}

Model IDs

  • gpt-4o
  • gpt-4o-mini
  • gpt-4-turbo
  • gpt-3.5-turbo

Environment Variable

bash
export OPENAI_API_KEY="sk-..."

z.ai (GLM-5.1)

PropertyValue
Adaptersol_provider_zai
APIOpenAI-compatible
StreamingYes
VisionYes
erlang
{zai, #{
  api_key => "...",
  base_url => "https://api.z.ai/v1"
}}

Model IDs

  • glm-5.1
  • glm-4-plus
  • glm-4-flash

Environment Variable

bash
export ZAI_API_KEY="..."

Ollama (Local)

PropertyValue
Adaptersol_provider_ollama
APIOllama REST API
StreamingYes
LocalYes
erlang
{ollama, #{
  base_url => "http://localhost:11434"
}}

No API key required. Ensure Ollama is running:

bash
ollama serve
ollama pull llama3

Model IDs

Use whatever models you have pulled locally:

  • llama3
  • mistral
  • codellama
  • phi3

Gemini (Google AI)

PropertyValue
Adaptersol_provider_gemini
APIGoogle Generative AI
StreamingYes
erlang
{gemini, #{
  api_key => "AIza...",
  base_url => "https://generativelanguage.googleapis.com/v1beta"
}}

Model IDs

  • gemini-2.0-flash
  • gemini-1.5-pro
  • gemini-1.5-flash

Environment Variable

bash
export GEMINI_API_KEY="AIza..."

DeepSeek

PropertyValue
Adaptersol_provider_deepseek
APIOpenAI-compatible
StreamingYes
erlang
{deepseek, #{
  api_key => "sk-...",
  base_url => "https://api.deepseek.com/v1"
}}

Model IDs

  • deepseek-chat
  • deepseek-coder
  • deepseek-reasoner

Environment Variable

bash
export DEEPSEEK_API_KEY="sk-..."

Alibaba (Qwen)

PropertyValue
Adaptersol_provider_alibaba
APIDashScope (OpenAI-compatible)
StreamingYes
erlang
{alibaba, #{
  api_key => "sk-...",
  base_url => "https://dashscope.aliyuncs.com/compatible-mode/v1"
}}

Model IDs

  • qwen-max
  • qwen-plus
  • qwen-turbo
  • qwen-coder-plus

Environment Variable

bash
export ALIBABA_API_KEY="sk-..."

Bedrock (AWS)

PropertyValue
Adaptersol_provider_bedrock
APIAWS Bedrock Runtime
StreamingYes
erlang
{bedrock, #{
  region => "us-east-1",
  access_key_id => "AKIA...",
  secret_access_key => "...",
  model_id => "anthropic.claude-3-sonnet-20240229-v1:0"
}}

Model IDs

  • anthropic.claude-3-sonnet-20240229-v1:0
  • anthropic.claude-3-haiku-20240307-v1:0
  • meta.llama3-70b-instruct-v1:0

Environment Variables

bash
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_REGION="us-east-1"

Declarative Provider

The declarative adapter allows registering custom endpoints without writing Erlang code:

erlang
{declarative, #{
  providers => [
    #{
      id => "my-llm",
      format => openai,
      base_url => "http://my-llm:8080/v1",
      api_key => "optional-key",
      models => ["my-model-v1"],
      alias => "my-model"
    }
  ]
}}

Supported formats: openai, anthropic.

Provider Health

Check provider connectivity:

bash
curl -H "Authorization: Bearer $TOKEN" \
  https://api.nonsense.ws/api/v1/providers/health

curl -H "Authorization: Bearer $TOKEN" \
  https://api.nonsense.ws/api/v1/providers/health/anthropic

Cross-Provider Switching

Sol provides bidirectional message transformation between Anthropic and OpenAI formats. Clients can switch providers mid-conversation:

bash
curl -X POST https://api.nonsense.ws/api/v1/chat/completions \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-20250514",
    "messages": [{"role": "user", "content": "Hello"}],
    "stream": true
  }'

The same endpoint works with any configured provider model.

Released under the MIT License.