Provider configuration

LLM and embedding calls route through ProviderConfig on each agent. The runtime reads API keys from environment variables named in api_key_env, never from workflow JSON or browser bundles. Provider failures map to typed errors and trace events shared across SDK and server.

Agent field reference: Defining agents. Install and env setup: Install and build.

ProviderConfig shape

json
{
 "provider": {
 "provider_id": "openai",
 "model": "gpt-4o-mini",
 "api_key_env": "OPENAI_API_KEY",
 "params": {
 "temperature": 0.3,
 "max_tokens": 4096
 }
 }
}
FieldRole
provider_idBackend selector (see table below)
modelProvider-specific model id
api_key_envName of env var holding the secret
paramsOptional provider-specific generation params

Supported chat providers

provider_idEnv variableNotes
openaiOPENAI_API_KEYChat and embeddings
anthropicANTHROPIC_API_KEYClaude models
geminiGEMINI_API_KEYGoogle models
stub(none)Tests only; deterministic responses

OpenAI example

json
{
 "provider_id": "openai",
 "model": "gpt-4o-mini",
 "api_key_env": "OPENAI_API_KEY"
}

Anthropic example

json
{
 "provider_id": "anthropic",
 "model": "claude-3-5-sonnet-20241022",
 "api_key_env": "ANTHROPIC_API_KEY"
}

Stub (local and CI)

json
{
 "provider_id": "stub",
 "model": "stub-v1",
 "api_key_env": ""
}

First workflow in five minutes uses stub implicitly when no provider is configured.

Embedding provider strings

Vector memory uses a separate embedding string on memory_config.embedding, not ProviderConfig:

json
{
 "memory_config": {
 "memory_type": "vector",
 "embedding": "openai/text-embedding-3-small",
 "namespace": "product-docs"
 }
}

Production also requires:

  • ARCFLOW_QDRANT_URL
  • ARCFLOW_EMBEDDING_PROVIDER (non-stub in prod)
  • OPENAI_API_KEY (when embedding string uses OpenAI)

See Vector RAG pipeline.

Trace events

EventWhen
ProviderRequestSentOutbound LLM request (metadata only)
ProviderResponseReceivedSuccess with token counts and latency
ProviderRateLimited429 or provider rate signal
ProviderErrorTerminal provider failure

Example:

json
{
 "kind": "ProviderResponseReceived",
 "run_id": "r1",
 "step_id": "s1",
 "provider_id": "openai",
 "model_id": "gpt-4o-mini",
 "tokens": { "input": 120, "output": 45, "total": 165 },
 "latency_ms": 890
}

Error mapping

ErrorCodeHTTP (server)Typical cause
ProviderError502API error, invalid model
RateLimited429Provider or site rate limit
EmbeddingError502Embedding call failed
RerankError502Cohere rerank failed

See Error codes for the full list.

Server deployment

Set keys in the server environment or secrets manager, not in Postgres:

bash
export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-ant-...
export COHERE_API_KEY=... # rerank only

Docker Compose: docker/docker-compose.server.yml documents the expected service env block.

Security rules

  • No API keys in workflow JSON, registry payloads, or static JS bundles
  • Relay and static SDK never see LLM keys; server holds them
  • Logs and traces are metadata-only trace only (Trace data policy)

Python and TypeScript shorthand

Python SDK often accepts provider="openai/gpt-4o-mini" with separate api_key_env.

TypeScript:

typescript
provider: {
 providerId: "openai",
 model: "gpt-4o-mini",
 apiKeyEnv: "OPENAI_API_KEY",
}