thinkphp接入大模型需手写http服务类而非插件;先用curl验证api连通性与鉴权,再按各平台要求构造请求(如讯飞lite不支持system、ollama需严格匹配model名),统一openai兼容接口结构,流式响应须逐行解析sse。

想在ThinkPHP项目里快速接入通义千问、讯飞星火或Ollama等大模型API,又不想被SDK封装绕晕、卡在鉴权或流式响应上?你得先绕过“插件”这个词的误导——ThinkPHP没有真正意义上的AI插件,只有可复用的HTTP客户端服务类,它不运行模型,只精准转发请求并解析JSON。
确认通信链路是否通
别急着写服务类,先验证底层HTTP能否连通目标API。打开终端,执行:
curl -X GET http://127.0.0.1:11434/api/tags(Ollama本地服务)
或
curl -X GET https://spark-api-open.xf-yun.com/v1/chat/completions -H "Authorization: Bearer your_api_password"(讯飞Lite接口)
看到返回JSON含models数组或401错误,说明网络和基础认证已就绪;若返回curl: (7) Failed to connect,则检查Ollama是否运行、防火墙是否放行端口、讯飞API密码是否复制完整——【APIPassword必须一字不差,末尾空格也会导致401】。
手写基础服务类(以讯飞Spark Lite为例)
在app/service目录下新建XingHuoService.php,内容如下:
第一步:声明命名空间与依赖
第二步:定义私有属性$baseUrl、$apiPassword和$client
第三步:在__construct()中从配置读取api_password,并初始化Guzzle Client,【headers必须显式声明Content-Type和Accept为application/json,漏掉任一字段将返回400 Bad Request】
第四步:编写chat()方法,构造$params数组,其中model=>"lite"不可省略,content传入用户输入字符串,不拼接system提示词——讯飞Lite不支持role=system字段,传了直接拒掉。
将小说章节转换为电影分镜剧本。用户上传txt/md/docx文本,AI分析场景、角色、情绪、镜头语言,输出专业分镜脚本。适用于用户提及“分镜”“storyboard”“小说转分镜”“影视改编”“镜头脚本”或需要将小说改编为分镜的场景。
第五步:用$client->post()发送请求,捕获RequestException,返回json_decode后的数组,直接取$result['choices'][0]['message']['content']即可获取文本。
对接百度文心一言(需两步令牌)
方法一:手动管理access_token
创建BaiduWenxinService,先调/oauth/2.0/token接口,用apiKey和secretKey换access_token;注意返回的expires_in是秒数,必须缓存该token并在过期前刷新——【不加缓存会导致每请求都重取token,触发百度限频】。
方法二:用think-ai官方Client(仅限ThinkPHP 6.1+)
安装composer require topthink/think-ai,配置.env填入BAIDU_API_KEY和BAIDU_SECRET_KEY,控制器中调用$client = new \think\ai\Client(); $client->chat()->completions(['model'=>'ernie-bot-4', 'messages'=>[['role'=>'user','content'=>'你好']]));
这一步操作起来很简单,但必须确保.env里BAIDU_API_KEY值不含中文引号、换行或BOM头,否则token获取会静默失败。
统一处理OpenAI兼容接口(Ollama/DeepSeek/Fireworks)
所有兼容接口共用同一套请求结构,只需替换base_uri和model名:
用Guzzle设置base_uri为https://api.deepseek.com/v1/ → 发送POST到chat/completions → 请求体json中model填deepseek-r1 → Authorization头填Bearer sk-xxx
Ollama例外:base_uri用http://127.0.0.1:11434 → 接口路径是/api/chat → 请求体用model和messages字段,不用Authorization头,改用{"model":"qwen2:1.5b","messages":[{"role":"user","content":"hi"}]} → 【Ollama不校验token,但model名必须与ollama list输出完全一致,qwen2:1.5b ≠ qwen2:1.5b-q4_k_m】。
流式响应必须单独处理:开启stream=>true后,响应体是SSE格式,每行以data:开头,需逐行读取、剥离data:、json_decode,不能直接json_decode整个响应体。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










