必须通过配置驱动的AI客户端工厂实现模型动态切换,即在config/ai.php中定义混元、DeepSeek、Kimi三组独立配置,再由ClientFactory::make()按模型标识加载对应base_url与api_key,控制器中可手动指定或参数校验后动态路由调用。

要在ThinkPHP项目中根据任务类型动态调用混元、DeepSeek或Kimi模型,必须绕过硬编码模型标识,改用运行时配置驱动的AI客户端实例化机制。直接在控制器里写死model参数会导致后续扩展困难,且无法响应用户会话级偏好。
配置多模型基础参数
这一步决定后续所有模型能否被正确识别和路由,【base_url与api_key必须按模型厂商规范严格区分】,混元走腾讯云API网关,DeepSeek和Kimi则各自使用独立域名和密钥体系。
在application/config/ai.php中创建配置文件,填入三组独立配置块:
return [
'hyun' => [
'api_key' => 'your_hyun_secret_key',
'base_url' => 'https://api.hunyuan.tencentcloudapi.com/v1/',
'model' => 'hunyuan-pro'
],
'deepseek' => [
'api_key' => 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'base_url' => 'https://api.deepseek.com/v1/',
'model' => 'deepseek-v3'
],
'kimi' => [
'api_key' => 'kimi_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'base_url' => 'https://api.moonshot.cn/v1/',
'model' => 'kimi-plus'
]
];
立即学习“PHP免费学习笔记(深入)”;
封装可切换的AI客户端类
避免每次调用都重复new Client,也防止因模型切换导致连接池混乱。该类需支持运行时注入模型标识,并自动匹配对应配置项。
在app/common/library/AI/ClientFactory.php中定义:
namespace app\common\library\AI;
use think\facade\Config;
class ClientFactory {
public static function make(string $model): \think\ai\Client {
$config = Config::get("ai.{$model}");
if (!$config) {
throw new \InvalidArgumentException("Unknown AI model: {$model}");
}
return new \think\ai\Client($config['api_key'], $config['base_url']);
}
}
通过 NVIDIA NIM API 调用 Kimi K2.5 视觉模型分析图像,非常适合为 MiniMax M2.5、GLM-5 等非视觉模型赋予视觉能力。
在控制器中按需调用不同模型
方法一:手动指定模型名触发切换
在app/controller/AiController.php中写:
use app\common\library\AI\ClientFactory;
class AiController extends BaseController {
public function mathTask() {
$client = ClientFactory::make('deepseek');
$result = $client->chat()->completions([
'model' => 'deepseek-v3',
'messages' => [['role' => 'user', 'content' => '解方程 x² + 2x - 8 = 0']],
]);
return json($result);
}
public function marketingCopy() {
$client = ClientFactory::make('kimi');
$result = $client->chat()->completions([
'model' => 'kimi-plus',
'messages' => [['role' => 'user', 'content' => '为智能手表写一段30字以内朋友圈文案']],
]);
return json($result);
}
}
方法二:根据请求参数动态路由
第一步:接收前端传入的model参数,仅允许白名单值
第二步:校验参数是否在['hyun', 'deepseek', 'kimi']之中,非法值直接抛出400错误
第三步:调用ClientFactory::make($model)生成对应客户端→执行completions→返回结果
注意:不要在参数校验前就实例化Client,否则非法model会触发无效网络请求并拖慢响应。


















