From 0f9f2e36c0757850af89a159d959eb59165fc3f2 Mon Sep 17 00:00:00 2001 From: JIA-ZI-LONG <1497176841@qq.com> Date: Mon, 30 Mar 2026 18:46:57 +0800 Subject: [PATCH] Fix client authentication: properly support both Anthropic API and third-party endpoints Per official SDK documentation: - ANTHROPIC_API_KEY for Anthropic API - ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN for third-party endpoints Previous code incorrectly popped ANTHROPIC_AUTH_TOKEN when ANTHROPIC_BASE_URL was set, which broke third-party authentication. Now strictly separates the two authentication methods with explicit conditionals. --- agents/s01_agent_loop.py | 8 +++++--- agents/s02_tool_use.py | 8 +++++--- agents/s03_todo_write.py | 8 +++++--- agents/s04_subagent.py | 8 +++++--- agents/s05_skill_loading.py | 8 +++++--- agents/s06_context_compact.py | 8 +++++--- agents/s07_task_system.py | 8 +++++--- agents/s08_background_tasks.py | 8 +++++--- agents/s09_agent_teams.py | 9 ++++++--- agents/s10_team_protocols.py | 9 ++++++--- agents/s11_autonomous_agents.py | 9 ++++++--- agents/s12_worktree_task_isolation.py | 8 +++++--- agents/s_full.py | 9 ++++++--- 13 files changed, 69 insertions(+), 39 deletions(-) diff --git a/agents/s01_agent_loop.py b/agents/s01_agent_loop.py index 050880063..702e501ab 100644 --- a/agents/s01_agent_loop.py +++ b/agents/s01_agent_loop.py @@ -43,10 +43,12 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] SYSTEM = f"You are a coding agent at {os.getcwd()}. Use bash to solve tasks. Act, don't explain." diff --git a/agents/s02_tool_use.py b/agents/s02_tool_use.py index 8e434c04a..3a8c8aa22 100644 --- a/agents/s02_tool_use.py +++ b/agents/s02_tool_use.py @@ -28,11 +28,13 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] SYSTEM = f"You are a coding agent at {WORKDIR}. Use tools to solve tasks. Act, don't explain." diff --git a/agents/s03_todo_write.py b/agents/s03_todo_write.py index 4c7076c55..493cff30d 100644 --- a/agents/s03_todo_write.py +++ b/agents/s03_todo_write.py @@ -36,11 +36,13 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] SYSTEM = f"""You are a coding agent at {WORKDIR}. diff --git a/agents/s04_subagent.py b/agents/s04_subagent.py index 2cbf081fc..2c27d8442 100644 --- a/agents/s04_subagent.py +++ b/agents/s04_subagent.py @@ -32,11 +32,13 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] SYSTEM = f"You are a coding agent at {WORKDIR}. Use the task tool to delegate exploration or subtasks." diff --git a/agents/s05_skill_loading.py b/agents/s05_skill_loading.py index e14167a6c..94203f529 100644 --- a/agents/s05_skill_loading.py +++ b/agents/s05_skill_loading.py @@ -46,11 +46,13 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] SKILLS_DIR = WORKDIR / "skills" diff --git a/agents/s06_context_compact.py b/agents/s06_context_compact.py index 622d64353..4c5716561 100644 --- a/agents/s06_context_compact.py +++ b/agents/s06_context_compact.py @@ -45,11 +45,13 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] SYSTEM = f"You are a coding agent at {WORKDIR}. Use tools to solve tasks." diff --git a/agents/s07_task_system.py b/agents/s07_task_system.py index cf72783e4..7e3b3bcd4 100644 --- a/agents/s07_task_system.py +++ b/agents/s07_task_system.py @@ -32,11 +32,13 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] TASKS_DIR = WORKDIR / ".tasks" diff --git a/agents/s08_background_tasks.py b/agents/s08_background_tasks.py index 390a77780..592b8f351 100644 --- a/agents/s08_background_tasks.py +++ b/agents/s08_background_tasks.py @@ -36,11 +36,13 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] SYSTEM = f"You are a coding agent at {WORKDIR}. Use background_run for long-running commands." diff --git a/agents/s09_agent_teams.py b/agents/s09_agent_teams.py index 90f6760df..fe0a83365 100644 --- a/agents/s09_agent_teams.py +++ b/agents/s09_agent_teams.py @@ -54,11 +54,14 @@ from dotenv import load_dotenv load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) + +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] TEAM_DIR = WORKDIR / ".team" INBOX_DIR = TEAM_DIR / "inbox" diff --git a/agents/s10_team_protocols.py b/agents/s10_team_protocols.py index d5475359c..5c40feb20 100644 --- a/agents/s10_team_protocols.py +++ b/agents/s10_team_protocols.py @@ -59,11 +59,14 @@ from dotenv import load_dotenv load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) + +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] TEAM_DIR = WORKDIR / ".team" INBOX_DIR = TEAM_DIR / "inbox" diff --git a/agents/s11_autonomous_agents.py b/agents/s11_autonomous_agents.py index 3aec416b8..59e6c6eb3 100644 --- a/agents/s11_autonomous_agents.py +++ b/agents/s11_autonomous_agents.py @@ -47,11 +47,14 @@ from dotenv import load_dotenv load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) + +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] TEAM_DIR = WORKDIR / ".team" INBOX_DIR = TEAM_DIR / "inbox" diff --git a/agents/s12_worktree_task_isolation.py b/agents/s12_worktree_task_isolation.py index 09f905253..6e0e69354 100644 --- a/agents/s12_worktree_task_isolation.py +++ b/agents/s12_worktree_task_isolation.py @@ -42,11 +42,13 @@ load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] diff --git a/agents/s_full.py b/agents/s_full.py index e2f887b5c..1f008c883 100644 --- a/agents/s_full.py +++ b/agents/s_full.py @@ -50,11 +50,14 @@ from dotenv import load_dotenv load_dotenv(override=True) -if os.getenv("ANTHROPIC_BASE_URL"): - os.environ.pop("ANTHROPIC_AUTH_TOKEN", None) + +# using either ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN or ANTHROPIC_API_KEY is supported +if os.getenv("ANTHROPIC_BASE_URL") and os.getenv("ANTHROPIC_AUTH_TOKEN") and not os.getenv("ANTHROPIC_API_KEY"): + client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL"), auth_token=os.getenv("ANTHROPIC_AUTH_TOKEN")) +elif os.getenv("ANTHROPIC_API_KEY") and not os.getenv("ANTHROPIC_BASE_URL") and not os.getenv("ANTHROPIC_AUTH_TOKEN"): + client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) WORKDIR = Path.cwd() -client = Anthropic(base_url=os.getenv("ANTHROPIC_BASE_URL")) MODEL = os.environ["MODEL_ID"] TEAM_DIR = WORKDIR / ".team"