<?php namespace ChatGPT; use Firebase\JWT\JWT; class deepSeek { protected static $model = 'deepseek-reasoner'; protected static $apiKey = ''; protected static $temperature = 0.9; protected static $max_tokens = 3000; protected static $apiUrl = 'https://api.deepseek.com/v1/chat/completions'; // 修正API路径,添加/v1 /** * @param string $apiKey * @param string $model * @param string $temperature */ public function __construct($apiKey = '', $model = '', $temperature = '', $max_tokens = 3000) { if ($model) { self::$model = $model; } if ($temperature) { self::$temperature = $temperature; } if ($max_tokens) { // 添加范围验证 self::$max_tokens = min(max(1, $max_tokens), 8192); } self::$apiKey = $apiKey; } /** * @param $message * @param $callback * @return array|mixed */ public function sendText($message = [], $callback = null) { $post = [ 'model' => self::$model, 'messages' => $message, 'temperature' => floatval(self::$temperature), 'max_tokens' => intval(self::$max_tokens), 'stream' => false ]; $debug_log = '../app/web/controller/debug.log'; $result = $this->httpRequest(self::$apiUrl, $post, $callback); file_put_contents($debug_log, '$deepseek $result1=' . var_export($result,true), FILE_APPEND); return $this->handleError($result); } /** * @param $text * @return false|string */ public function getEmbedding($text) // 注意:方法名拼写应为getEmbedding { if (mb_strlen($text) > 512) { return ''; } $url = 'https://api.deepseek.com/v1/embeddings'; // 修正为DeepSeek的embedding接口 $post = [ 'model' => self::$model, // 添加model参数 'input' => $text // 修正参数名为input ]; 这是代码
时间: 2025-07-12 17:38:38 浏览: 8
<think>好的,用户需要帮助在PHP中集成DeepSeek API,具体涉及类定义、构造函数参数、发送消息和获取嵌入的方法。首先,我需要回忆PHP中如何创建类和处理HTTP请求。然后,考虑DeepSeek API的文档要求,比如端点URL、必需的请求头、参数等。
构造函数部分,用户提到模型选择、API密钥、温度和最大令牌数。应该将这些作为构造函数的参数,并设置默认值,比如模型可能有一个默认值,温度设为0.7,最大令牌数设为1000。需要确保API密钥不能为空,所以构造函数里应该检查是否提供了密钥,否则抛出异常。
接下来是sendText方法,用于发送消息并处理回调。这里需要构造POST请求,设置Authorization头和Content-Type为JSON。消息内容应该是一个数组,包含角色和内容。参数可能需要包括temperature和max_tokens,这些应该从类属性中获取。要处理API响应,检查状态码,解析JSON返回的数据,然后通过回调函数处理结果。还要考虑错误处理,比如网络问题或API返回错误,可以使用try-catch块来捕捉异常,并传递给回调。
然后是getEmbedding方法,生成文本嵌入。根据DeepSeek的文档,嵌入的端点可能不同,所以需要另一个HTTP请求。请求体需要包含输入的文本和模型名称。同样需要处理响应,提取嵌入数组。这里也要检查响应是否正确,并返回嵌入数据。
在代码实现时,需要确保使用合适的HTTP客户端,比如Guzzle,但用户可能希望用原生的PHP方法,所以使用curl_init等函数。设置curl选项,如URL、POST请求、头部、POST数据。返回的数据需要json_decode处理。
可能遇到的问题包括SSL证书验证,所以在curl_setopt中可能需要设置CURLOPT_SSL_VERIFYPEER为false,但生产环境中不建议这样做。另外,回调函数的参数设计,是否包含错误和结果,应该让回调接收两个参数。
最后,示例用法部分需要展示如何实例化类,调用sendText和getEmbedding,并处理回调。确保用户了解如何替换API密钥,并根据需要调整参数。
需要验证代码的正确性,比如参数是否正确传递,请求头是否正确设置,错误处理是否完善。可能遗漏的部分是模型名称在getEmbedding中的使用,是否应该和构造函数中的模型分开,或者使用同一个。根据问题描述,可能构造函数中的模型是用于生成文本,而嵌入模型可能不同,但用户示例中在getEmbedding里用了另一个模型,所以需要在类中添加一个嵌入模型参数,或者在方法中允许指定。但根据用户的问题,可能构造函数中的模型选择已经包括,所以可能需要调整。
总结,步骤是:创建类,构造函数初始化参数,sendText发送消息,处理响应和回调,getEmbedding处理嵌入请求,错误处理,示例代码展示用法。</think>以下是在PHP中实现DeepSeek API集成的完整解决方案:
### 一、类定义与构造函数实现
```php
class DeepSeekClient {
private $apiKey;
private $model;
private $temperature;
private $maxTokens;
private $apiBase = 'https://api.deepseek.com/v1/';
/**
* @param string $apiKey 必需API密钥
* @param string $model 模型选择(默认"deepseek-chat")
* @param float $temperature 生成随机性(0-2)
* @param int $maxTokens 最大输出令牌数
*/
public function __construct(
string $apiKey,
string $model = "deepseek-chat",
float $temperature = 0.7,
int $maxTokens = 1000
) {
if (empty($apiKey)) {
throw new InvalidArgumentException("API密钥不能为空");
}
$this->apiKey = $apiKey;
$this->model = $model;
$this->temperature = max(0, min(2, $temperature));
$this->maxTokens = max(1, $maxTokens);
}
}
```
### 二、消息发送方法实现
```php
public function sendText(
array $messages,
callable $callback = null,
array $params = []
) {
$url = $this->apiBase . 'chat/completions';
$payload = json_encode(array_merge([
'model' => $this->model,
'messages' => $messages,
'temperature' => $this->temperature,
'max_tokens' => $this->maxTokens
], $params));
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $this->apiKey
],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_SSL_VERIFYPEER => false // 生产环境应验证证书
]);
try {
$response = curl_exec($ch);
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($statusCode >= 400) {
throw new RuntimeException("API请求失败:HTTP {$statusCode}");
}
$result = json_decode($response, true);
if (isset($result['choices'][0]['message'])) {
if ($callback) {
$callback(null, $result['choices'][0]['message']);
}
return $result;
}
throw new RuntimeException("API响应格式异常");
} catch (Exception $e) {
if ($callback) {
$callback($e, null);
}
throw $e;
} finally {
curl_close($ch);
}
}
```
### 三、嵌入生成方法实现
```php
public function getEmbedding(string $text) {
$url = $this->apiBase . 'embeddings';
$payload = json_encode([
'input' => $text,
'model' => 'deepseek-embed' // 专用嵌入模型
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
// 保持与sendText相同的配置
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . $this->apiKey
],
CURLOPT_POSTFIELDS => $payload
]);
$response = curl_exec($ch);
$data = json_decode($response, true);
if (isset($data['data'][0]['embedding'])) {
return $data['data'][0]['embedding'];
}
throw new RuntimeException("嵌入生成失败:" . ($data['error']['message'] ?? '未知错误'));
}
```
### 四、使用示例
```php
// 初始化客户端
$client = new DeepSeekClient('your_api_key_here');
// 发送消息示例
$client->sendText(
[['role' => 'user', 'content' => '解释量子计算']],
function($error, $result) {
if ($error) {
error_log($error->getMessage());
return;
}
echo "回复内容:" . $result['content'];
},
['temperature' => 0.5]
);
// 获取嵌入示例
try {
$embedding = $client->getEmbedding("自然语言处理");
print_r(array_slice($embedding, 0, 5)); // 显示前5维
} catch (Exception $e) {
echo "错误:" . $e->getMessage();
}
```
### 关键参数说明:
1. **模型选择**:
- 对话模型:`deepseek-chat`
- 嵌入模型:`deepseek-embed`
- 根据任务需求选择对应模型[^1]
2. **温度参数**:
- 取值范围$0 \leq t \leq 2$
- 通过构造函数设置默认值,可通过`sendText`的$params参数动态覆盖
3. **错误处理**:
- 使用try-catch结构捕获异常
- 回调函数接收错误优先模式参数
阅读全文
相关推荐

















