commit 8848d204040543758530c51f7a95def62bd39041
Author: Ben Sima <ben@bensima.com>
Date: Thu Jan 1 23:58:57 2026
Omni/Agent: Add AGENT_DEFAULT_PROVIDER env var for default provider
Set AGENT_DEFAULT_PROVIDER to configure which provider to use by default:
- claude-code (OAuth, best for Claude Max/Pro subscribers)
- anthropic
- openrouter
- ollama
Example: export AGENT_DEFAULT_PROVIDER=claude-code
If not set, falls back to auto-detection by available API keys.
Task-Id: t-339
diff --git a/Omni/Agent.hs b/Omni/Agent.hs
index aa5d80ad..9b60054e 100755
--- a/Omni/Agent.hs
+++ b/Omni/Agent.hs
@@ -95,9 +95,10 @@ Examples:
agent --provider=ollama --model=llama3 "hello"
Environment:
- ANTHROPIC_API_KEY - for anthropic provider
- OPENROUTER_API_KEY - for openrouter provider
- KAGI_API_KEY - for web search tool
+ AGENT_DEFAULT_PROVIDER - default provider (claude-code, anthropic, openrouter, ollama)
+ ANTHROPIC_API_KEY - for anthropic provider
+ OPENROUTER_API_KEY - for openrouter provider
+ KAGI_API_KEY - for web search tool
|]
test :: Test.Tree
@@ -305,8 +306,22 @@ resolveProvider providerName mModel = do
other -> pure <| Left <| "Unknown provider: " <> other
-- | Auto-detect provider from available API keys
+-- Checks AGENT_DEFAULT_PROVIDER env var first, then falls back to detection order
resolveAutoProvider :: Maybe Text -> IO (Either Text Provider.Provider)
resolveAutoProvider mModel = do
+ -- Check for explicit default provider
+ defaultProvider <- Environment.lookupEnv "AGENT_DEFAULT_PROVIDER"
+ case defaultProvider of
+ Just "claude-code" -> resolveClaudeCodeProvider mModel
+ Just "anthropic" -> resolveAnthropicProvider mModel
+ Just "openrouter" -> resolveOpenRouterProvider mModel
+ Just "ollama" -> pure <| Right <| Provider.ollamaProvider (fromMaybe "llama3" mModel)
+ Just other -> pure <| Left <| "Unknown provider in AGENT_DEFAULT_PROVIDER: " <> Text.pack other
+ Nothing -> resolveAutoProviderByKeys mModel
+
+-- | Auto-detect provider by checking which API keys are available
+resolveAutoProviderByKeys :: Maybe Text -> IO (Either Text Provider.Provider)
+resolveAutoProviderByKeys mModel = do
-- Try providers in order of preference
anthropicKey <- Environment.lookupEnv "ANTHROPIC_API_KEY"
openrouterKey <- Environment.lookupEnv "OPENROUTER_API_KEY"
@@ -348,8 +363,9 @@ resolveClaudeCodeProvider mModel = do
tokenResult <- Auth.getValidToken
case tokenResult of
Right token -> do
- TextIO.hPutStrLn IO.stderr "[agent] Using Claude Code (OAuth)"
- pure <| Right <| Provider.anthropicOAuthProvider token (fromMaybe "claude-sonnet-4-20250514" mModel)
+ let model = fromMaybe "claude-sonnet-4-20250514" mModel
+ TextIO.hPutStrLn IO.stderr <| "[agent] Using Claude Code (OAuth), model: " <> model
+ pure <| Right <| Provider.anthropicOAuthProvider token model
Left err -> do
-- Need to login
TextIO.hPutStrLn IO.stderr <| "[agent] " <> err