必须将thinkphp后端api严格对齐openai的/v1/chat/completions接口规范,包括路径、请求结构与响应格式;需用vllm 0.6.3+启动openai兼容服务,再通过控制器curl代理(分基础post与sse流式),并统一校验清洗messages参数。

要在ThinkPHP项目中让前端代码无需修改就能调用本地大模型服务,必须将后端API接口严格对齐OpenAI的/v1/chat/completions路径、请求结构与响应格式,否则前端fetch会因字段缺失或嵌套错误而解析失败。
配置vLLM服务暴露标准OpenAI端点
这一步是基础前提,所有后续适配都依赖它提供原生兼容层。
1、确认已安装vLLM 0.6.3或更高版本:执行pip install vllm==0.6.3,低于此版本不支持--enable-chunked-prefill和完整choices结构输出。
2、启动服务时显式启用OpenAI兼容模式:python -m vllm.entrypoints.openai.api_server --model /path/to/qwen3-8b --host 0.0.0.0 --port 8000 --enable-chunked-prefill。注意--model路径必须指向已量化或HF格式的本地模型目录,不能是模型ID。
3、访问http://localhost:8000/v1/models验证服务可用性——返回JSON中必须含{"object":"list","data":[{"id":"qwen3-8b","object":"model"}]},若返回404或空data数组,说明服务未正确加载模型或端口被占用。
ThinkPHP中封装OpenAI风格代理接口
直接在控制器里写curl调用,比引入SDK更轻量、可控,也避免框架层缓冲干扰流式响应。
方法一:基础POST代理(适用于非流式场景)
在app/controller/Chat.php中新增index方法,构造标准OpenAI请求体,Header必须包含Authorization: Bearer sk-xxx和Content-Type: application/json,漏任一字段都会触发401或400错误。
方法二:流式SSE代理(实现打字机效果)
新建stream方法,关键三步:① 设置header('Content-Type: text/event-stream');② 使用Guzzle Client开启stream => true选项实时读取上游chunk;③ 每次接收到data: {...}块后立即echo并调用ob_flush(); flush();推送至前端。
【Nginx+PHP-FPM环境下,仅靠flush()无效,必须配合fastcgi_finish_request()提前结束PHP进程】
统一请求参数校验与messages清洗
前端传来的原始messages数组常含HTML标签、超长文本或非法role值,不处理会导致token溢出或API拒绝。
第一步:用strip_tags()清除所有富文本标记,防止<script></script>类内容污染上下文。
第二步:对每条content做长度截断——用mb_substr($content, 0, 200, 'UTF-8')限制单条不超过200字,避免单轮输入就占满模型上下文窗口。
第三步:强制校验role字段值是否为user、assistant或system,PHP数组键名大小写敏感,Role或USER会导致OpenAI接口返回400 Bad Request。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











