Skip to content

Providers

A provider is the adapter between Neo and a model API. Neo speaks its own small internal language; providers translate that into Anthropic, OpenAI, OpenRouter, or Gemini requests.

Different model APIs use different request shapes, response shapes, tool-call formats, auth methods, retry behavior, and token accounting. OpenRouter uses an OpenAI-compatible Chat Completions shape while OpenAI itself uses the newer Responses API in Neo.

Neo should not bake any one provider into the agent loop.

Neo defines one provider interface:

type Provider interface {
Name() string
Complete(ctx context.Context, req Request) (*Response, error)
}

The core loop sends an llm.Request. The provider returns an llm.Response. Everything provider-specific stays behind the adapter.

Provider config Auth Adapter
provider: anthropic ANTHROPIC_API_KEY internal/llm/anthropic
provider: openai + openai_auth: api_key OPENAI_API_KEY internal/llm/openai.Client
provider: openai + openai_auth: subscription neo login device-code credentials internal/llm/openai.CodexClient
provider: openrouter OPENROUTER_API_KEY internal/llm/openrouter
provider: google GOOGLE_API_KEY internal/llm/google

The config model value is passed through to the provider. If omitted, Neo chooses a provider-aware default.

In the TUI, /model opens a model picker. It changes the active model for the current session and saves that session metadata.

  • Provider adapters should translate, not decide product behavior.
  • Retry and response parsing belong in provider packages.
  • The core agent loop should not care whether a response came from Anthropic, OpenAI, OpenRouter, or Google.
  • Subscription/Codex auth is experimental and should be documented carefully.
  • internal/llm/provider.go: provider-neutral types.
  • internal/llm/anthropic: Anthropic adapter.
  • internal/llm/openai: OpenAI adapters.
  • internal/llm/chatcompletions: reusable OpenAI-compatible Chat Completions translation.
  • internal/llm/openrouter: OpenRouter adapter wiring.
  • internal/llm/google: Google Gemini adapter.
  • internal/auth: subscription credential storage and refresh.
  • cmd/neo/main.go: provider selection.