书接上文:
现在考虑建立一个可以联网的模型,供特殊场景的使用。参考文献:
https://www.mkeai.com/tutorials/detail/168.html
接下来以硅基流动提供的API为例,展示模型建设方法。
首先,在插件根目录/constants/models.php
(若不明所以,请先看完“书接上文”的内容)中再添加一个新模型:
PHP
define( 'MWAI_OPENAI_MODELS', [
// R1模型(这是上次添加的模型)
[
"model" => "deepseek-reasoner", // 官方说的模型名称,下同
"name" => "DeepSeek-R1", // 自己取的别称
"family" => "gpt4",
"features" => ['completion'],
"price" => [
"in" => 0.05, // 这些随便改,反正统计的也不准确
"out" => 0.10,
],
"type" => "token",
"unit" => 1 / 1000000,
"maxCompletionTokens" => 65536,
"maxContextualTokens" => 128000, // 官方说的上限,下同
"tags" => ['core', 'chat'] // 这行建议照这样写
],
// 这次添加的R1联网模型
[
"model" => "siliconflow@Pro/deepseek-ai/DeepSeek-R1", // 这里模型名有所改动
"name" => "DeepSeek-R1-Online", // 在线方案,api和离线的不同
"family" => "gpt4",
"features" => ['completion'],
"price" => [
"in" => 0.05,
"out" => 0.10,
],
"type" => "token",
"unit" => 1 / 1000000,
"maxCompletionTokens" => 65536,
"maxContextualTokens" => 128000,
"tags" => ['core', 'chat']
],
// 这后面是其他原始代码
]);
之后,我们需要对插件根目录/classes/engines/openai.php
中的url进行同步调整。这里同步解决上次忽视的一个问题:修改url后源代码无法继续支持OpenAI模型。
对于build_url()
方法中的url:
PHP
protected function build_url( $query, $endpoint = null ) {
$url = "";
$env = $this->env;
if ( empty( $endpoint ) ) {
// 被注释的是原先的代码块
// if ( $this->envType === 'openai' ) {
// $endpoint = apply_filters( 'mwai_openai_endpoint', 'https://xxx/v1', $this->env );
// $this->organizationId = isset( $env['organizationId'] ) ? $env['organizationId'] : null;
// }
// 以下是更新后的代码块
if ( $this->envType === 'openai' ) {
$endpoint = apply_filters( // 兼容多种模型的方法
'mwai_openai_endpoint',
(strpos($query->model ?? '', 'DeepSeek') !== false && strpos($query->model ?? '', 'siliconflow') !== false)
? 'https://search-for-llmapi.dawne.cn/with-search/v1' // 联网策略
: (strpos($query->model ?? '', 'DeepSeek') !== false
? 'https://api.siliconflow.cn/v1' // 不联网策略
: 'https://api.openai.com/v1'), // 维持对openai模型的兼容,当然,这个url由于双重防火墙的存在,在国内基本是没法用的,需要自己另想办法
$this->env
);
// 以下是其他无关代码
$this->organizationId = isset( $env['organizationId'] ) ? $env['organizationId'] : null;
}
/*
此处大段省略
*/
}
对于execute()
方法中的url:
PHP
public function execute( $method, $url, $query = null, $formFields = null,
$json = true, $extraHeaders = null, $streamCallback = null )
{
/*
此处大段省略
*/
// 被注释的是原先的代码块
// if ( $isOpenAI ) {
// $url = 'https://search-for-llmapi.dawne.cn/with-search/v1' . $url;
// }
// 以下是更新后的代码块,原理同上
if ( $isOpenAI ) {
$model = $query->model;
if (strpos($model, 'DeepSeek') !== false && strpos($model, 'siliconflow') !== false) {
$url = 'https://search-for-llmapi.dawne.cn/with-search/v1' . $url;
} elseif (strpos($model, 'DeepSeek') !== false) {
$url = 'https://api.siliconflow.cn/v1';
} else {
$url = 'https://api.openai.com/v1';
}
}
// 以下是其他无关代码
else if ( $isAzure ) {
$url = trailingslashit( $this->env['endpoint'] ) . 'openai' . $url;
$hasQuery = strpos( $url, '?' ) !== false;
$url = $url . ( $hasQuery ? '&' : '?' ) . $this->azureApiVersion;
}
/*
此处大段省略
*/
}
这样,只要在admin后台选择添加的“Online”模型,即可实现联网功能。
Have fun!
附上博主完成版本: