书接上文:

网站建设 | DeepSeek API chat组件

现在考虑建立一个可以联网的模型,供特殊场景的使用。参考文献:

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!

附上博主完成版本: