我用 PHP 写了一个对标 Python OpenAI SDK 的 AI 调用库,一行代码切换三家大模型!

发布时间:2026/6/1 14:45:10

我用 PHP 写了一个对标 Python OpenAI SDK 的 AI 调用库,一行代码切换三家大模型! 全网找了一圈发现 PHP 生态里没有一个像 Pythonopenai库那样简洁的 AI 调用接口。于是我花了一个晚上手搓了一个 PHP 版 AI Gateway支持 OpenAI、Claude、Gemini以及所有兼容 OpenAI 格式的第三方服务。1. 痛点PHP 调用 AI 有多痛苦做 PHP 开发的兄弟应该都碰到过这个场景产品让你接 ChatGPT过两天又让接 Claude再过两天又推了个 Gemini 过来。然后你的代码里就出现了// OpenAI 的鉴权方式$headers[]Authorization: Bearer .$key;// Claude 的鉴权方式$headers[]x-api-key: .$key;// Gemini 直接把 key 拼在 URL 里$url.?key.$key;每换一个厂商就得重写一套 HTTP 请求逻辑、响应解析逻辑、错误处理逻辑。更要命的是上游写好的调用代码和厂商绑死了换个模型得改一堆地方。有没有办法像 Python 那样一个create()方法通吃所有厂商2. 目标对标 Python OpenAI SDKPython 开发者调用 AI 是这样的fromopenaiimportOpenAI clientOpenAI(api_keysk-xxx)responseclient.chat.completions.create(modelgpt-4,messages[{role:user,content:Hello!}])print(response.choices[0].message.content)我希望 PHP 也能这样写useAiGateway\OpenAI;$clientnewOpenAI([api_keysk-xxx]);$response$client-chat-completions-create([modelgpt-4,messages[[roleuser,contentHello!]],]);echo$response-choices[0]-message-content;调用方式几乎一模一样。如果你写过 Python 的 OpenAI SDKPHP 版本直接上手零学习成本。3. 架构设计适配器模式 统一响应核心思路很朴素——不管底层对接的是谁返回给我的永远是一套标准数据结构。用户代码全是 OpenAI 格式的调用 | Completions::create() ← 统一入口 | ProviderFactory ← 根据配置自动选适配器 | ┌──────┼──────┬──────────┐ | | | | OpenAI Claude Gemini 你的适配器 | | | | └──────┴──────┴──────────┘ | 统一响应ChatCompletion每个 Provider 做两件事translateRequest()把 OpenAI 格式的消息翻译成目标 API 格式translateResponse()把目标 API 的响应翻译回 OpenAI 格式开发者全程只跟 OpenAI 格式打交道底层差异被完全屏蔽。4. 一键切换厂商// OpenAI$clientnewOpenAI([api_keysk-xxx]);// 切换到 Claude一行配置搞定$clientnewOpenAI([api_keysk-ant-xxx,base_urlhttps://api.anthropic.com/v1,providerclaude,modelclaude-3-sonnet-20240229,]);// 切换到 Gemini$clientnewOpenAI([api_keygemin-xxx,base_urlhttps://generativelanguage.googleapis.com/v1beta,providergemini,modelgemini-pro,]);// 调用代码完全不变$response$client-chat-completions-create([messages[[roleuser,contentHello]],]);echo$response-choices[0]-message-content;甚至支持动态切换$client-setProvider(claude)-setApiKey(sk-ant-claude-key)-setBaseUrl(https://api.anthropic.com/v1);同一次请求生命周期内想用哪个用哪个。5. 流式输出SSE对标 Python 的streamTrue用法$stream$client-chat-completions-create([modelgpt-4,messages[[roleuser,content写一首诗]],streamtrue,// 一个字开]);foreach($streamas$chunk){echo$chunk-choices[0]-delta-content;}Web 端直接用 SSE 推送到浏览器header(Content-Type: text/event-stream);$stream$client-chat-completions-create([...streamtrue]);foreach($streamas$chunk){$content$chunk-choices[0]-delta-content;echodata: .json_encode([content$content]).\n\n;ob_flush();flush();}echodata: [DONE]\n\n;6. Prompt 消息构建器手写嵌套数组太痛苦了所以又封了一个 Prompt 类useAiGateway\Prompt;$messagesPrompt::make()-system(你是{{role}},[role翻译助手])-user(将{{text}}翻译成英文,[text你好世界])-toArray();// 直接传入 create()$response$client-chat-completions-create([messages$messages,]);支持模板变量、多轮对话追加、历史裁剪控制 Token// 对话太长保留 system 最近 4 条$promptPrompt::make()-system(你是AI助手)-user(第1问)-assistant(第1答)-user(第2问)-assistant(第2答)-user(第3问)-assistant(第3答)-user(第4问);$prompt-keepLast(4);// 自动裁剪支持分支对话$basePrompt::make()-system(你是数学老师)-user(请出题);$branchA$base-clone()-user(出加法题);// 互不影响$branchB$base-clone()-user(出乘法题);7. 兼容 DeepSeek / 通义千问 等所有 OpenAI 格式服务任何兼容 OpenAI Chat Completions API 的服务只改两个参数// DeepSeek$clientnewOpenAI([api_keyyour-key,base_urlhttps://api.deepseek.com/v1,modeldeepseek-chat,]);// 通义千问$clientnewOpenAI([api_keyyour-key,base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1,modelqwen-plus,]);8. 安装 使用安装composerrequire aigateway/ai-gateway5 行代码跑起来require__DIR__./vendor/autoload.php;useAiGateway\OpenAI;$clientnewOpenAI([api_keysk-your-key]);$response$client-chat-completions-create([modelgpt-4,messages[[roleuser,content用PHP写一个冒泡排序]],]);echo$response-choices[0]-message-content;9. 项目和文档项目地址Packagistaigateway/ai-gateway源码Gitee 搜索le3691325_admin/aigateway技术栈纯 PHP 8.1 cURL零第三方依赖。开源协议MIT放心商用。10. 写在最后这个库本质上就做了一件事让你用写 PHP 的方式获得 Python 调用 AI 的体验。核心代码量不大但解决的问题很实际——不管你们公司今天用 ChatGPT 明天换 Claude 后天推 Gemini你的上游业务代码一行都不需要改。觉得有用的话点个 Star也欢迎提 Issue 和 PR

相关新闻