using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text.Json.Serialization;
using JsonSerializer = System.Text.Json.JsonSerializer;
using System.IO;
namespace OASystem.API.OAMethodLib.DeepSeekAPI
{
///
/// DeepSeek API 服务实现
///
public class DeepSeekService : IDeepSeekService
{
private readonly HttpClient _httpClient;
private readonly ILogger _logger;
private readonly IHostEnvironment _hostEnvironment;
///
/// 配置文件
///
private DeepSeek DeepSeek { get; set; }
///
/// 构造函数
///
public DeepSeekService(IHostEnvironment hostEnvironment, ILogger logger, HttpClient httpClient)
{
_hostEnvironment = hostEnvironment;
_httpClient = httpClient;
_logger = logger;
DeepSeek = AutofacIocManager.Instance.GetService();
// 设置基础地址和认证头
_httpClient.BaseAddress = new Uri(DeepSeek.BaseAddress ?? "https://api.deepseek.com/v1/");
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", DeepSeek.ApiKey);
_httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
}
///
/// 测试API连通性
///
///
public async Task TestApiConnectivityAsync()
{
try
{
var response = await _httpClient.GetAsync("models");
return response.IsSuccessStatusCode;
}
catch
{
return false;
}
}
///
/// 检查可用端点
///
///
public async Task> DiscoverAvailableEndpointsAsync()
{
var endpoints = new List
{
"models",
"chat/completions",
"files",
"uploads",
"documents",
"assistants"
};
var availableEndpoints = new List();
foreach (var endpoint in endpoints)
{
try
{
var response = await _httpClient.GetAsync(endpoint);
if (response.IsSuccessStatusCode)
{
availableEndpoints.Add(endpoint);
Console.WriteLine($"✅ 端点可用: {endpoint}");
}
else
{
Console.WriteLine($"❌ 端点不可用: {endpoint} - {response.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine($"⚠️ 端点检查错误: {endpoint} - {ex.Message}");
}
}
return availableEndpoints;
}
///
/// 上传文件到DeepSeek API
///
public async Task UploadFileAsync(IFormFile file, string purpose = "assistants")
{
try
{
_logger.LogInformation("开始上传文件: {FileName}, 大小: {Size} bytes", file.FileName, file.Length);
// 检查文件大小
if (file.Length > 512 * 1024 * 1024) // 512MB限制
{
throw new Exception($"文件大小超过限制: {file.Length} bytes");
}
using var content = new MultipartFormDataContent();
using var fileStream = file.OpenReadStream();
var fileContent = new StreamContent(fileStream);
fileContent.Headers.ContentType = new MediaTypeHeaderValue(GetContentType(file.FileName));
content.Add(fileContent, "file", file.FileName);
content.Add(new StringContent(purpose), "purpose");
var response = await _httpClient.PostAsync("files", content);
_logger.LogInformation("文件上传路径:{filePath}", response.RequestMessage.RequestUri);
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
});
_logger.LogInformation("文件上传成功: {FileName}, FileId: {FileId}", file.FileName, result.Id);
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "文件上传失败: {FileName}", file.FileName);
throw;
}
}
///
/// 批量上传文件
///
public async Task> UploadFilesAsync(List files, string purpose = "assistants")
{
var results = new List();
foreach (var file in files)
{
var result = new FileUploadResult
{
FileName = file.FileName,
FileSize = file.Length
};
try
{
var uploadResponse = await UploadFileAsync(file, purpose);
result.FileId = uploadResponse.Id;
result.Success = true;
result.Status = uploadResponse.Status;
result.Message = "上传成功";
}
catch (Exception ex)
{
result.Success = false;
result.Message = $"上传失败: {ex.Message}";
result.Status = "error";
}
results.Add(result);
}
return results;
}
///
/// 获取文件列表
///
public async Task ListFilesAsync()
{
try
{
var response = await _httpClient.GetAsync("files");
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
});
}
catch (Exception ex)
{
_logger.LogError(ex, "获取文件列表失败");
throw;
}
}
///
/// 获取文件信息
///
public async Task GetFileInfoAsync(string fileId)
{
try
{
var response = await _httpClient.GetAsync($"files/{fileId}");
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
});
}
catch (Exception ex)
{
_logger.LogError(ex, "获取文件信息失败: {FileId}", fileId);
throw;
}
}
///
/// 删除文件
///
public async Task DeleteFileAsync(string fileId)
{
try
{
var response = await _httpClient.DeleteAsync($"files/{fileId}");
response.EnsureSuccessStatusCode();
_logger.LogInformation("文件删除成功: {FileId}", fileId);
return true;
}
catch (Exception ex)
{
_logger.LogError(ex, "文件删除失败: {FileId}", fileId);
return false;
}
}
///
/// 使用已上传的文件进行聊天
///
public async Task ChatWithFilesAsync(List fileIds, string question, string model = "deepseek-chat", float temperature = 0.7f, int maxTokens = 4000)
{
try
{
// 等待所有文件处理完成
var processedFiles = new List();
foreach (var fileId in fileIds)
{
var fileInfo = await WaitForFileProcessingAsync(fileId);
processedFiles.Add(fileInfo);
}
// 构建消息内容
var messageContent = new List