如果你是Claude Pro或Max的订阅用户,同时又习惯通过代码调用Claude API,那么你可能正在不知不觉中“双重付费”。Anthropic的订阅计费和API积分是完全独立的账户,而常规的Anthropic SDK默认只识别API积分。好消息是,现在有官方支持的路径允许你通过Claude Agent SDK,直接使用你的订阅额度进行计费,避免额外开销。
Anthropic维护着两种独立的计费关系:
- ANTHROPIC_API_KEY: 这是控制台的API密钥,用于按需付费的API积分。
- CLAUDE_CODE_OAUTH_TOKEN: 通过
claude setup-token命令获取的OAuth令牌,直接关联到你的Pro/Max订阅配额。
常规的Anthropic SDK只知道第一种计费方式。而Agent SDK(Python版本为claude-agent-sdk,TypeScript版本为@anthropic-ai/claude-agent-sdk)封装了Claude Code CLI,这个CLI原生支持两种方式。通过OAuth路径进行的所有调用,都将计入你的订阅额度。
以下是使用订阅额度进行调用的基本设置步骤:
首先,生成OAuth令牌:
npm install -g @anthropic-ai/claude-code
claude setup-token # 这个命令会打开浏览器进行认证,并返回一个有效期一年的令牌。然后,将令牌添加到你的.env文件中:
CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-...接下来,在Python中执行调用,这些调用将使用你的订阅额度:
import asyncio, os, sys
from dotenv import load_dotenv
load_dotenv()
if os.environ.get("ANTHROPIC_API_KEY"):
sys.exit("ANTHROPIC_API_KEY is set — it would shadow your OAuth token. unset it.")
from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, TextBlock
async def main():
async for msg in query(
prompt="Say hello in one short sentence.",
options=ClaudeAgentOptions(allowed_tools=[]),
):
if isinstance(msg, AssistantMessage):
for block in msg.content:
if isinstance(block, TextBlock):
print(block.text)
asyncio.run(main())以上Python代码会通过你的Claude Max/Pro订阅进行计费,而非API积分。一个配套的GitHub仓库(github.com/avivshaked/prototype-with-claude-max)提供了TypeScript版本的相同示例,以及WebSearch和逐token流式传输的演示。
值得注意的关键点:认证优先级
Agent SDK的认证优先级遵循特定顺序:云凭证 → ANTHROPIC_AUTH_TOKEN → ANTHROPIC_API_KEY → apiKeyHelper → CLAUDE_CODE_OAUTH_TOKEN → 交互式登录。其中最关键的一点是,如果你的环境中设置了ANTHROPIC_API_KEY(这在许多项目中很常见),它将静默地覆盖你的OAuth令牌。这意味着你可能会误以为正在使用订阅服务,但实际上却在使用并支付API积分。为确保你的订阅生效,务必unset(取消设置)ANTHROPIC_API_KEY环境变量。