← Back to task

Commit 8848d204

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