Skip to content

Commit 9653806

Browse files
committed
Fixes forwarding of authentication token for claude when using vLLM as backend
1 parent b7aa93c commit 9653806

5 files changed

Lines changed: 39 additions & 6 deletions

File tree

docs/llm.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ VibePod can connect agents to external LLM servers that expose OpenAI- or Anthro
66

77
| Agent | Env vars injected | CLI flags appended |
88
|-------|------------------|--------------------|
9-
| claude | `ANTHROPIC_BASE_URL`, `ANTHROPIC_API_KEY` | `--model <model>` |
9+
| claude | `ANTHROPIC_BASE_URL`, `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_MODEL`, `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, `ANTHROPIC_DEFAULT_HAIKU_MODEL` | `--model <model>` |
1010
| codex | `CODEX_OSS_BASE_URL` | `--oss -m <model>` |
1111

1212
Other agents do not yet have LLM mapping and will not receive any LLM configuration.
@@ -42,6 +42,11 @@ vp run claude
4242
# Starts Claude Code with:
4343
# ANTHROPIC_BASE_URL=http://host.docker.internal:11434
4444
# ANTHROPIC_API_KEY=ollama
45+
# ANTHROPIC_AUTH_TOKEN=ollama
46+
# ANTHROPIC_MODEL=qwen3:14b
47+
# ANTHROPIC_DEFAULT_OPUS_MODEL=qwen3:14b
48+
# ANTHROPIC_DEFAULT_SONNET_MODEL=qwen3:14b
49+
# ANTHROPIC_DEFAULT_HAIKU_MODEL=qwen3:14b
4550
# claude --model qwen3:14b
4651
4752
vp run codex

src/vibepod/commands/run.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,9 @@ def run(
276276
for key, env_var in spec.llm_env_map.items():
277277
value = llm_values.get(key, "")
278278
if value:
279-
merged_env.setdefault(env_var, value)
279+
targets = [env_var] if isinstance(env_var, str) else env_var
280+
for target in targets:
281+
merged_env.setdefault(target, value)
280282
llm_model = llm_values["model"]
281283
if llm_model and spec.llm_model_args:
282284
llm_command_extra = [*spec.llm_model_args, llm_model]

src/vibepod/core/agents.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class AgentSpec:
2222
platform: str | None = None
2323
run_as_host_user: bool = False
2424
ikwid_args: list[str] | None = None
25-
llm_env_map: dict[str, str] | None = None
25+
llm_env_map: dict[str, str | list[str]] | None = None
2626
llm_model_args: list[str] | None = None
2727

2828

@@ -36,7 +36,16 @@ class AgentSpec:
3636
"/claude",
3737
{"CLAUDE_CONFIG_DIR": "/claude"},
3838
ikwid_args=["--dangerously-skip-permissions"],
39-
llm_env_map={"base_url": "ANTHROPIC_BASE_URL", "api_key": "ANTHROPIC_API_KEY"},
39+
llm_env_map={
40+
"base_url": "ANTHROPIC_BASE_URL",
41+
"api_key": ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"],
42+
"model": [
43+
"ANTHROPIC_MODEL",
44+
"ANTHROPIC_DEFAULT_OPUS_MODEL",
45+
"ANTHROPIC_DEFAULT_SONNET_MODEL",
46+
"ANTHROPIC_DEFAULT_HAIKU_MODEL",
47+
],
48+
},
4049
llm_model_args=["--model"],
4150
),
4251
"gemini": AgentSpec(

tests/test_agents.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,13 @@ def test_claude_spec_has_llm_env_map() -> None:
8383
spec = get_agent_spec("claude")
8484
assert spec.llm_env_map == {
8585
"base_url": "ANTHROPIC_BASE_URL",
86-
"api_key": "ANTHROPIC_API_KEY",
86+
"api_key": ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN"],
87+
"model": [
88+
"ANTHROPIC_MODEL",
89+
"ANTHROPIC_DEFAULT_OPUS_MODEL",
90+
"ANTHROPIC_DEFAULT_SONNET_MODEL",
91+
"ANTHROPIC_DEFAULT_HAIKU_MODEL",
92+
],
8793
}
8894
assert spec.llm_model_args == ["--model"]
8995

tests/test_run.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,11 @@ def run_agent(self, **kwargs) -> object: # type: ignore[no-untyped-def]
757757
env = captured["env"]
758758
assert env["ANTHROPIC_BASE_URL"] == "http://localhost:11434/v1"
759759
assert env["ANTHROPIC_API_KEY"] == "sk-test-key"
760-
assert "ANTHROPIC_MODEL" not in env
760+
assert env["ANTHROPIC_AUTH_TOKEN"] == "sk-test-key"
761+
assert env["ANTHROPIC_MODEL"] == "llama3"
762+
assert env["ANTHROPIC_DEFAULT_OPUS_MODEL"] == "llama3"
763+
assert env["ANTHROPIC_DEFAULT_SONNET_MODEL"] == "llama3"
764+
assert env["ANTHROPIC_DEFAULT_HAIKU_MODEL"] == "llama3"
761765
assert captured["command"] == ["claude", "--model", "llama3"]
762766

763767

@@ -863,6 +867,10 @@ def run_agent(self, **kwargs) -> object: # type: ignore[no-untyped-def]
863867
env = captured["env"]
864868
assert "ANTHROPIC_BASE_URL" not in env
865869
assert "ANTHROPIC_API_KEY" not in env
870+
assert "ANTHROPIC_AUTH_TOKEN" not in env
871+
assert "ANTHROPIC_DEFAULT_OPUS_MODEL" not in env
872+
assert "ANTHROPIC_DEFAULT_SONNET_MODEL" not in env
873+
assert "ANTHROPIC_DEFAULT_HAIKU_MODEL" not in env
866874
assert "ANTHROPIC_MODEL" not in env
867875

868876

@@ -966,6 +974,9 @@ def run_agent(self, **kwargs) -> object: # type: ignore[no-untyped-def]
966974

967975
env = captured["env"]
968976
assert env["ANTHROPIC_BASE_URL"] == "http://localhost:11434/v1"
977+
assert "ANTHROPIC_DEFAULT_OPUS_MODEL" not in env
978+
assert "ANTHROPIC_DEFAULT_SONNET_MODEL" not in env
979+
assert "ANTHROPIC_DEFAULT_HAIKU_MODEL" not in env
969980
assert captured["command"] == ["claude"]
970981

971982

0 commit comments

Comments
 (0)