AI应用开发中,模型选择已经不只是技术选型,而是成本、稳定性和交付节奏的博弈。有行业观察指出,当前AI领域的收入中约70%来自OpenAI和Anthropic。这个比例不一定代表最终事实,但足以说明问题:无论你是独立开发者还是企业技术团队,大概率绕不开这两家模型厂商。相比反复争论“谁家模型最强”,更实际的做法是,把手上的应用先接入这两家API,搞清楚协议差异、成本结构、故障处理和多模型切换机制,再根据业务场景做取舍。
这篇文章会从技术实现角度展开,而不是讨论市场分析。你要知道的是:OpenAI和Anthropic的API分别怎么调、两家协议有什么不同、生产环境里怎么避免被单一厂商绑死、连接失败和限流时该往哪个方向排错。把这些事做扎实,比纠结“70%”这个比例更能解决实际问题。
1. 先理解“AI收入集中在OpenAI和Anthropic”对开发者的真实影响
1.1 收入构成:不只是模型API
行业统计里的“AI收入”通常是一个宽泛概念,可能包含模型API调用、企业级订阅、云端算力、私有化部署和其他增值服务。OpenAI和Anthropic在其中的共同特点是:它们的模型能力通过标准API输送给大量SaaS应用、开发工具和企业系统。也就是说,收入集中背后是调用量集中。开发者每发起一次Chat Completions请求或Messages API请求,都会变成厂商收入。
这也解释了为什么OpenAI和Anthropic会成为开发者社区里讨论密度最高的两家。两者都在持续迭代模型,并且分别形成了自己的SDK、文档生态和付费体系。理解这一点,就不会把“70%收入”当成新闻标题,而是当作一个技术信号:你依赖的核心服务,很可能集中在少数几家基础设施上。
1.2 对开发者的三个直接影响:协议、成本、故障半径
第一个直接影响是协议倾向。OpenAI的Chat Completions协议被大量工具链默认支持,包括LangChain、LlamaIndex、Vercel AI SDK、Dify等。Anthropic为了降低接入门槛,也提供了与OpenAI SDK兼容的调用方式。开发者在落地时,往往不是“二选一”,而是需要同时理解两套协议的不同。
第二个是成本结构。这两家模型的定价并不便宜,并且大模型调用费用受输入token数、输出token数、缓存命中、批量接口等因素共同影响。如果不做调用量监控,月底账单会非常难看。
第三个是故障半径。因为调用集中在两家厂商,一旦对方服务出现区域性故障、限流或者版本升级,你的AI功能就会直接不可用。这意味着生产环境不能只做“调通”,还要有重试、降级、切换机制。
2. 为什么OpenAI和Anthropic会成为事实上的AI基础设施
2.1 模型能力与开发者生态
OpenAI的GPT系列和Anthropic的Claude系列都在通用对话、代码生成、长文本理解和工具调用上表现稳定。对大多数应用来说,真正的瓶颈不是模型“能不能做”,而是应用架构怎么接入、怎么把结果校验好。
与此同时,两家公司都提供了足够完整的文档和SDK。OpenAI有Python、Node.js、Java等官方SDK,Anthropic也提供了Python、TypeScript SDK。文档里关于认证、消息格式、流式输出、工具调用和错误码的说明都比较清楚。生态完善意味着你可以很快写出能跑的代码,而不是自己造HTTP请求。
2.2 API协议兼容化:OpenAI协议成为事实标准
OpenAI的/v1/chat/completions接口成为很多开发者最先接触的大模型API格式。请求体用messages数组表达对话历史,响应体用choices[0].message.content返回文本。这个结构被大量开源项目接受后,就成了事实上的兼容基线。
Anthropic早期使用自己的Messages API格式,例如系统提示词独立放在system字段,响应结构是content数组。为了降低迁移成本,Anthropic后续也提供了OpenAI SDK兼容端点。这带来的直接好处是:你如果已经写好了基于OpenAI SDK的代码,可以通过替换base_url和密钥,快速切到Anthropic模型。但要注意,兼容层不等于完全等价,某些参数和响应字段仍然存在差异。
2.3 企业级服务与采购流程
当AI应用进入企业环境,采购、安全、审计和SLA会变得比模型精度更重要。OpenAI和Anthropic都提供了企业级账号、单点登录、数据隐私承诺和管理员控制台。这对技术团队意味着什么?意味着你在设计功能时,要考虑的不只是“模型能不能返回正确文本”,还包括密钥权限、数据留存策略、审计日志、用量配额这些企业级能力。
这些能力反过来又加强了收入集中。企业客户一旦在某个平台完成合规评审,不会轻易更换供应商。开发者在做技术选型时,也应该把这些因素纳入评估,而不是只看模型的单次回答质量。
3. 用同一套业务逻辑调用两家模型:最小可运行示例
3.1 环境准备和依赖安装
以下示例使用Python 3.10以上版本,并通过openai和anthropic官方SDK调用。安装依赖:
pip install openai anthropic安装后,创建环境变量文件或在启动前导出密钥:
export OPENAI_API_KEY="你的OpenAI API Key" export ANTHROPIC_API_KEY="你的Anthropic API Key"这里要注意:不要把密钥写进代码仓库。本地测试可以放在.env文件,生产环境建议使用密钥管理服务。
3.2 使用OpenAI SDK调用GPT模型
创建一个openai_demo.py文件:
import os from openai import OpenAI client = OpenAI( api_key=os.environ.get("OPENAI_API_KEY"), ) resp = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "你是一个API网关技术专家。"}, {"role": "user", "content": "用一句话解释API网关的作用。"}, ], temperature=0.7, ) print(resp.choices[0].message.content)运行:
python openai_demo.py这个示例的关键点在于:OpenAI把system和user消息都放进messages数组,max_tokens虽然不是必填,但建议显式设置,避免极端情况下输出过长或超预算。resp.choices[0].message.content是响应文本的位置,所有日志和监控都要围绕这个字段做解析。
3.3 使用Anthropic SDK调用Claude模型
创建anthropic_demo.py文件:
import os import anthropic client = anthropic.Anthropic( api_key=os.environ.get("ANTHROPIC_API_KEY"), ) resp = client.messages.create( model="claude-3-5-sonnet-latest", max_tokens=1024, system="你是一个API网关技术专家。", messages=[ {"role": "user", "content": "用一句话解释API网关的作用。"}, ], ) print(resp.content[0].text)运行:
python anthropic_demo.py注意差异:Anthropic的max_tokens是必填参数,系统提示词通过system参数传入,响应文本在resp.content[0].text。如果不写max_tokens,SDK会直接报参数缺失错误。
3.4 通过OpenAI兼容端点调用Anthropic模型
如果项目里已经写了大量OpenAI SDK代码,临时要切到Anthropic模型,可以尝试使用Anthropic提供的OpenAI兼容端点。示例代码如下:
from openai import OpenAI client = OpenAI( api_key=os.environ.get("ANTHROPIC_API_KEY"), base_url="https://api.anthropic.com/v1/", default_headers={ "anthropic-version": "2023-06-01", }, ) resp = client.chat.completions.create( model="claude-3-5-sonnet-latest", messages=[ {"role": "user", "content": "用一句话解释API网关的作用。"}, ], ) print(resp.choices[0].message.content)这段代码是否能直接运行,取决于你的Anthropic账号权限和官方兼容层的当前版本。实际接入前,要以上述base_url和anthropic-version在官方文档中的最新说明为准。兼容层适合“临时切换”和“快速验证”,不适合作为长期架构的唯一依赖。
3.5 输出对比
两次调用如果都成功,会得到类似结构的文本输出,但格式和表达会有差异。你可以做一个最简单的对比脚本,把两个SDK的响应JSON打印出来:
print(resp.model_dump_json())你会看到OpenAI响应里有choices,Anthropic响应里有content。这就是协议差异的直观体现。多模型接入时,最好增加一个统一的数据结构,把两家响应都转换成业务对象。
4. 模型选型时需要对比的关键技术维度
4.1 上下文窗口、多模态、工具调用的差异
不同模型的上下文窗口、多模态能力和工具调用方式会影响功能设计。OpenAI的GPT-4o系列支持文本和图像输入,Anthropic的Claude系列同样支持多模态,但具体参数、最大上下文长度和图像处理细节可能会有变化。设计系统时,建议把上下文长度当作输入限制,而不是一直依赖大窗口。
工具调用方面,两家都支持tools参数和结构化输出,但函数定义格式有区别。OpenAI使用functions或tools,Anthropic使用tools。响应中工具调用的字段路径也不同。如果要做Agent类应用,必须把工具回调逻辑封装在统一层,避免上游模型格式变化导致下游解析崩溃。
4.2 定价与成本模型比较
大模型API的计费通常按输入token、输出token分别计价,可能还有缓存读计费、批量计费。由于价格会调整,这里不列出固定数字,但要注意以下几点:
- 输入token通常比输出token便宜。
- 长上下文的每次请求都会把历史消息重新计费,对话轮数多时,成本会快速上涨。
- 流式输出可以降低首字延迟,但价格通常不因此降低。
- 有些模型支持Prompt Caching,命中缓存的输入token会更便宜。
建议在正式上线前,使用两家官方定价页计算一个预估月成本。可以按以下公式做粗略估算:
单请求成本 = (输入token数 * 输入单价 + 输出token数 * 输出单价 + 缓存token数 * 缓存单价) / 1_000_000最好建立一个成本表,记录每个业务场景的平均输入输出token数。不要只比较“单次回答质量”。
4.3 速率限制和延迟特征
OpenAI和Anthropic的API都有速率限制,一般分为每分钟请求数、每分钟token数和并发数。不同账号等级、模型和区域可能有不同阈值。生产环境如果直接复用测试账号的Key,很容易在流量上来后遇到429错误。
延迟也需要分开看:首字延迟、总延迟、流式续字速度会直接影响用户体验。建议在选型阶段就做一次压测,记录不同并发下的P50和P95延迟,而不是只凭证文里的“速度很快”。
5. 生产环境接入:不能只写“能跑通”
5.1 API Key与密钥管理
在代码里硬编码API Key是最容易踩的坑。无论OpenAI还是Anthropic,API Key都是敏感凭据。生产环境建议:
- 使用环境变量或配置中心注入密钥。
- 使用云厂商的Secret Manager、KMS或Vault,对密钥进行加密存储。
- 为不同环境、不同业务申请独立的Key,方便成本归属和吊销。
- 定期轮换密钥,并在Git提交历史中扫描是否泄漏。
如果使用兼容层调用两家模型,注意不要把Anthropic的Key当成OpenAI的Key转发到错误端点,否则会得到401认证错误。
5.2 重试、超时与幂等设计
调用第三方API,网络抖动和限流是常态。不要只写一次请求。建议在SDK或HTTP客户端层配置:
from openai import OpenAI from openai import APITimeoutError, APIConnectionError, RateLimitError client = OpenAI( api_key=os.environ.get("OPENAI_API_KEY"), timeout=30.0, max_retries=2, )Anthropic SDK同样提供timeout和max_retries参数:
client = anthropic.Anthropic( api_key=os.environ.get("ANTHROPIC_API_KEY"), timeout=30.0, max_retries=2, )重试时要注意:不是所有错误都值得重试。429限流、503服务不可用、网络超时适合重试;401认证错误、400参数错误重试无意义。还要防止重试导致重复扣费或重复写入业务数据。如果调用结果会触发下单、发消息等操作,要在应用层加幂等键,保证重试不产生重复副作用。
5.3 成本与调用量监控
生产系统只关心“请求成功”远远不够。建议把以下指标接入监控:
- 请求总量、成功量、失败量。
- 输入token数、输出token数、缓存token数。
- 每次请求的平均成本。
- 429和5xx错误比例。
- P50、P95、P99延迟。
可以通过Prometheus + Grafana实现标准监控,也可以通过简单的日志采集。关键是把每家厂商的用量单独归类,在业务方出现异常调用时快速定位是哪个业务在烧钱。
5.4 灰度切换模型
不要在生产环境一次性切库。建议做一个模型路由开关,让同一个Prompt可以按配置访问不同模型。比如用JSON配置:
{ "primary_model": "gpt-4o", "fallback_model": "claude-3-5-sonnet-latest", "fallback_enabled": true, "fallback_threshold_percent": 10 }先用10%流量切到新模型,观察回答质量、延迟和失败率,再逐步放开。如果主模型连续失败,再通过熔断切换到备用模型,而不是每次请求都重试到超时。
6. 常见连接与调用问题排查
6.1 认证失败:401
现象:
AuthenticationError: Error code: 401可能原因:
- API Key为空或填写错误。
- 使用了错误的账号环境。
- 密钥格式不完整。
检查方式:
- 打印
api_key是否为sk-开头的完整值,但不要在日志里暴露完整密钥。 - 确认请求的是OpenAI还是Anthropic端点。
- 确认账号和模型是否有访问权限。
解决方案:
重新生成API Key,并写入正确的环境变量。
6.2 连接失败:Failed to connect to api.anthropic.com
现象:
APIConnectionError: Failed to connect to api.anthropic.com这个错误在社区中出现频率很高,通常不是模型本身问题,而是网络链路问题。
可能原因:
- 本地网络无法访问Anthropic API。
- 公司网络要求通过HTTP代理对外访问。
- DNS解析异常。
- 防火墙或出网策略拦截。
- 请求超时时间太短。
检查方式:
curl -I https://api.anthropic.com如果返回非200,再检查代理:
echo $HTTPS_PROXY echo $HTTP_PROXY如果公司网络需要代理,需要在启动脚本中设置:
export HTTPS_PROXY="http://your-proxy:8080" export HTTP_PROXY="http://your-proxy:8080"这里要注意:国内环境的“代理”可能涉及不合规的网络工具,但在企业内网使用公司提供的合法出网代理是正常操作。不要为了绕过网络限制而使用不合规工具。定位到网络策略后,可以联系网络管理员开放所需域名或配置合法的代理转发。
解决方案:
- 如果不需要代理,清空代理环境变量。
- 如果需要代理,在SDK客户端或HTTP层正确配置。
- 增加超时时间,例如从10秒调整到30秒。
- 在服务器上配置DNS,确保
api.anthropic.com能解析。
6.3 速率限制:429
现象:
RateLimitError: Error code: 429可能原因:
- 每分钟请求数超过限制。
- 每分钟token数超过限制。
- 账号层级并发太低。
- 多个服务共享同一个API Key。
检查方式:
- 在响应头中查看
x-ratelimit-remaining-requests和x-ratelimit-remaining-tokens。 - 查看官方账号控制台的用量数据。
解决方案:
- 将API Key按业务拆分。
- 在代码里实现指数退避重试。
- 使用批量接口降低请求量。
- 必要时申请提高配额。
6.4 模型不存在或参数不兼容
现象:
404: The model `claude-3-5-sonnet-latest` does not exist或
400: extra fields not permitted可能原因:
- 模型名称拼写错误。
- 使用了旧版本SDK,无法解析新模型参数。
- 从OpenAI切换到Anthropic时,把OpenAI参数直接传给Anthropic接口。
- 兼容层支持范围有限,某些参数会被拒绝。
解决方案:
- 以官方文档中的模型标识为准。
- 升级SDK到最新版本。
- 参数按照目标API的规范进行适配。
- 兼容层不支持的参数,需要改为原生API调用。
7. 多模型统一网关与防锁定
7.1 使用LiteLLM作为统一网关
LiteLLM是一个轻量库,可以把OpenAI、Anthropic、Azure OpenAI、本地模型等统一成同一个接口。它的好处是,业务代码只需要维护一种调用方式,切换模型时只需改配置。安装:
pip install litellm示例:
import litellm resp = litellm.completion( model="gpt-4o", messages=[ {"role": "user", "content": "用一句话解释API网关作用。"}, ], ) print(resp.choices[0].message.content)如果要切换到Claude,只需把model改为claude-3-5-sonnet-latest。LiteLLM根据模型前缀自动路由到对应厂商。
这种统一层的价值不是“让所有模型输出完全一致”,而是降低厂商切换的代码改动量。生产环境要把模型路由、密钥管理、日志监控都纳入这个抽象层。
7.2 自定义Client封装
如果不想引入额外依赖,也可以自己封装一个LLMClient,内部处理OpenAI和Anthropic的协议差异。核心思路是:
- 对外提供统一的
generate(messages, model, temperature)方法。 - 方法内部根据
model参数选择SDK。 - 把OpenAI的
choices[0].message.content和Anthropic的content[0].text统一成字符串返回。 - 在统一封装层处理超时、重试、日志和成本统计。
伪代码:
class LLMClient: def __init__(self, provider, api_key): self.provider = provider if provider == "openai": self.client = OpenAI(api_key=api_key) elif provider == "anthropic": self.client = anthropic.Anthropic(api_key=api_key) def generate(self, messages, system=None, max_tokens=1024, **kwargs): if self.provider == "openai": msgs = ([{"role": "system", "content": system}] if system else []) + messages resp = self.client.chat.completions.create( model=kwargs.get("model", "gpt-4o"), messages=msgs, max_tokens=max_tokens, ) return resp.choices[0].message.content elif self.provider == "anthropic": resp = self.client.messages.create( model=kwargs.get("model", "claude-3-5-sonnet-latest"), max_tokens=max_tokens, system=system or "", messages=messages, ) return resp.content[0].text这种封装看起来简单,但要小心:两家SDK的参数细节会随版本变化,你需要持续更新适配层。如果团队小、模型数量少,自研封装是够用的。如果模型很多,直接使用LiteLLM这类社区方案更划算。
7.3 兼容层不是银弹
OpenAI兼容端点可以让代码快速切换,但它隐藏了底层模型和API的差异。比如上下文长度、tokenizer、工具调用格式、系统提示词处理方式仍然不同。一个Prompt在GPT上表现好,不代表在Claude上细节相同。真正的防锁定是:
- 业务逻辑不依赖特定模型的返回格式。
- 关键输出要做schema校验。
- 保留各家原生API的调用能力。
- 定期用真实流量做回归对比。
8. 落实到实际项目的建议
8.1 环境检查清单
接入OpenAI或Anthropic时,按以下清单检查:
- 是否确认Python版本和SDK版本兼容。
- 是否配置正确的API Key环境变量。
- 是否确认网络可访问目标API域名。
- 是否在测试环境验证过消息格式。
- 是否设置超时和重试。
- 是否记录请求和响应日志。
- 是否对密钥做了脱敏。
8.2 发布前检查清单
上线前至少检查:
- 每个业务调用是否区分了模型、用途和成本中心。
- 是否有限流触发后的降级方案。
- 是否有主模型故障时的备用模型。
- 是否对输出内容做了长度限制。
- 是否监控token消耗和成本。
- 是否配置了告警,例如429比例超过5%或错误率超过1%。
- 是否有回滚开关,可以在1分钟内切回旧模型。
8.3 下一步扩展方向
AI收入集中这件事不会一夜消失。技术上可以做的扩展方向包括:
- 引入开源模型作为本地降级方案,但要注意硬件成本。
- 增加Prompt版本管理,让不同模型共用一个可回退的Prompt版本。
- 细化评估集,用实际业务采样评估不同模型的输出质量,而不是只看Leaderboard。
- 研究缓存策略,减少对API的重复调用。
如果你刚接触大模型集成,建议先跑通第3节的最小示例,然后做一次“用OpenAI和Anthropic同时回答同一批问题”的对比,把输出、延迟、成本记录下来。这个练习会帮助你更快形成自己的技术判断,也能让你在后续模型升级时,不至于被任何一家厂商的API变化打断交付节奏。