DeepSeekModels.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. using System.Text.Json.Serialization;
  2. namespace OASystem.API.OAMethodLib.DeepSeekAPI
  3. {
  4. public class DeepSeekModels
  5. {
  6. }
  7. /// <summary>
  8. /// 基础信息
  9. /// </summary>
  10. public class DeepSeek
  11. {
  12. /// <summary>
  13. /// ApiKey
  14. /// </summary>
  15. public string ApiKey { get; set; }
  16. /// <summary>
  17. /// BaseAddress
  18. /// </summary>
  19. public string BaseAddress { get; set; }
  20. }
  21. /// <summary>
  22. /// 流式片段阶段(deepseek-reasoner:先 reasoning 再 content;deepseek-chat 通常仅有 Content)
  23. /// </summary>
  24. public enum DeepSeekStreamPhase
  25. {
  26. /// <summary>思考过程(对应 delta.reasoning_content)</summary>
  27. Reasoning,
  28. /// <summary>正式输出(对应 delta.content)</summary>
  29. Content
  30. }
  31. /// <summary>
  32. /// 单段流式输出,便于前端区分思考与结果
  33. /// </summary>
  34. public class DeepSeekStreamChunk
  35. {
  36. public DeepSeekStreamPhase Phase { get; set; }
  37. public string Text { get; set; } = "";
  38. }
  39. /// <summary>
  40. /// 文件上传到DeepSeek API的请求参数
  41. /// </summary>
  42. public class DeepSeekFileUploadRequest
  43. {
  44. /// <summary>
  45. /// 要上传的文件列表
  46. /// </summary>
  47. public List<IFormFile> Files { get; set; } = new List<IFormFile>();
  48. /// <summary>
  49. /// 用途描述(可选)
  50. /// </summary>
  51. public string Purpose { get; set; } = "assistants";
  52. /// <summary>
  53. /// 模型名称,默认为 deepseek-chat
  54. /// </summary>
  55. public string Model { get; set; } = "deepseek-chat";
  56. /// <summary>
  57. /// 是否等待文件处理完成
  58. /// </summary>
  59. public bool WaitForProcessing { get; set; } = true;
  60. }
  61. /// <summary>
  62. /// 使用已上传文件提问的请求参数
  63. /// </summary>
  64. public class AskWithFilesRequest
  65. {
  66. /// <summary>
  67. /// 已上传的文件ID列表
  68. /// </summary>
  69. public List<string> FileIds { get; set; } = new List<string>();
  70. /// <summary>
  71. /// 问题描述
  72. /// </summary>
  73. public string Question { get; set; }
  74. /// <summary>
  75. /// 模型名称
  76. /// </summary>
  77. public string Model { get; set; } = "deepseek-chat";
  78. /// <summary>
  79. /// 温度参数
  80. /// </summary>
  81. public float Temperature { get; set; } = 0.7f;
  82. /// <summary>
  83. /// 最大token数
  84. /// </summary>
  85. public int MaxTokens { get; set; } = 4000;
  86. }
  87. /// <summary>
  88. /// DeepSeek 文件上传响应
  89. /// </summary>
  90. public class DeepSeekFileUploadResponse
  91. {
  92. /// <summary>
  93. /// 文件ID
  94. /// </summary>
  95. [JsonPropertyName("id")]
  96. public string Id { get; set; }
  97. /// <summary>
  98. /// 对象类型
  99. /// </summary>
  100. [JsonPropertyName("object")]
  101. public string Object { get; set; }
  102. /// <summary>
  103. /// 文件大小(字节)
  104. /// </summary>
  105. [JsonPropertyName("bytes")]
  106. public long Bytes { get; set; }
  107. /// <summary>
  108. /// 创建时间戳
  109. /// </summary>
  110. [JsonPropertyName("created_at")]
  111. public long CreatedAt { get; set; }
  112. /// <summary>
  113. /// 文件名
  114. /// </summary>
  115. [JsonPropertyName("filename")]
  116. public string Filename { get; set; }
  117. /// <summary>
  118. /// 文件用途
  119. /// </summary>
  120. [JsonPropertyName("purpose")]
  121. public string Purpose { get; set; }
  122. /// <summary>
  123. /// 文件状态
  124. /// </summary>
  125. [JsonPropertyName("status")]
  126. public string Status { get; set; }
  127. /// <summary>
  128. /// 状态详情
  129. /// </summary>
  130. [JsonPropertyName("status_details")]
  131. public object StatusDetails { get; set; }
  132. }
  133. /// <summary>
  134. /// 文件列表响应
  135. /// </summary>
  136. public class DeepSeekFileListResponse
  137. {
  138. /// <summary>
  139. /// 对象类型
  140. /// </summary>
  141. [JsonPropertyName("object")]
  142. public string Object { get; set; }
  143. /// <summary>
  144. /// 文件数据列表
  145. /// </summary>
  146. [JsonPropertyName("data")]
  147. public List<DeepSeekFileUploadResponse> Data { get; set; }
  148. }
  149. /// <summary>
  150. /// 使用文件进行聊天的请求
  151. /// </summary>
  152. public class DeepSeekChatWithFilesRequest
  153. {
  154. /// <summary>
  155. /// 模型名称
  156. /// </summary>
  157. [JsonPropertyName("model")]
  158. public string Model { get; set; }
  159. /// <summary>
  160. /// 消息列表
  161. /// </summary>
  162. [JsonPropertyName("messages")]
  163. public List<FileMessage> Messages { get; set; }
  164. /// <summary>
  165. /// SSE的形式以流式发送消息增量
  166. /// 如果设置为 True,将会以 SSE(server-sent events)的形式以流式发送消息增量。消息流以 data: [DONE] 结尾。
  167. /// </summary>
  168. [JsonPropertyName("stream")]
  169. public bool Stream { get; set; } = false;
  170. /// <summary>
  171. /// 温度参数
  172. /// </summary>
  173. [JsonPropertyName("temperature")]
  174. public float Temperature { get; set; }
  175. /// <summary>
  176. /// 最大token数
  177. /// </summary>
  178. [JsonPropertyName("max_tokens")]
  179. public int MaxTokens { get; set; }
  180. /// <summary>
  181. /// 核采样参数,范围一般为 0~1
  182. /// </summary>
  183. [JsonPropertyName("top_p")]
  184. public decimal TopP { get; set; } = 1.0M;
  185. /// <summary>
  186. /// 频率惩罚,降低重复内容
  187. /// </summary>
  188. [JsonPropertyName("frequency_penalty")]
  189. public decimal FrequencyPenalty { get; set; } = 0M;
  190. /// <summary>
  191. /// 存在惩罚,鼓励引入新内容
  192. /// </summary>
  193. [JsonPropertyName("presence_penalty")]
  194. public decimal PresencePenalty { get; set; } = 0M;
  195. }
  196. /// <summary>
  197. /// 包含文件引用的消息
  198. /// </summary>
  199. public class FileMessage
  200. {
  201. /// <summary>
  202. /// 消息角色
  203. /// </summary>
  204. [JsonPropertyName("role")]
  205. public string Role { get; set; }
  206. /// <summary>
  207. /// 消息内容
  208. /// </summary>
  209. [JsonPropertyName("content")]
  210. public object Content { get; set; }
  211. }
  212. /// <summary>
  213. /// 文件内容块
  214. /// </summary>
  215. public class FileContent
  216. {
  217. /// <summary>
  218. /// 内容类型
  219. /// </summary>
  220. [JsonPropertyName("type")]
  221. public string Type { get; set; } = "text";
  222. /// <summary>
  223. /// 文本内容
  224. /// </summary>
  225. [JsonPropertyName("text")]
  226. public string Text { get; set; }
  227. }
  228. /// <summary>
  229. /// API响应结果
  230. /// </summary>
  231. public class ApiResponse
  232. {
  233. /// <summary>
  234. /// 是否成功
  235. /// </summary>
  236. public bool Success { get; set; }
  237. /// <summary>
  238. /// 响应消息
  239. /// </summary>
  240. public string Message { get; set; }
  241. /// <summary>
  242. /// 文件上传结果
  243. /// </summary>
  244. public List<FileUploadResult> FileResults { get; set; } = new List<FileUploadResult>();
  245. /// <summary>
  246. /// 回答内容(如果包含提问)
  247. /// </summary>
  248. public string Answer { get; set; }
  249. /// <summary>
  250. /// 使用的token数量
  251. /// </summary>
  252. public int TokensUsed { get; set; }
  253. }
  254. /// <summary>
  255. /// 文件上传结果
  256. /// </summary>
  257. public class FileUploadResult
  258. {
  259. /// <summary>
  260. /// 文件名
  261. /// </summary>
  262. public string FileName { get; set; }
  263. /// <summary>
  264. /// 文件ID
  265. /// </summary>
  266. public string FileId { get; set; }
  267. /// <summary>
  268. /// 文件大小
  269. /// </summary>
  270. public long FileSize { get; set; }
  271. /// <summary>
  272. /// 是否上传成功
  273. /// </summary>
  274. public bool Success { get; set; }
  275. /// <summary>
  276. /// 状态消息
  277. /// </summary>
  278. public string Message { get; set; }
  279. /// <summary>
  280. /// 文件状态
  281. /// </summary>
  282. public string Status { get; set; }
  283. }
  284. /// <summary>
  285. /// 文件删除请求
  286. /// </summary>
  287. public class DeleteFileRequest
  288. {
  289. /// <summary>
  290. /// 要删除的文件ID
  291. /// </summary>
  292. public string FileId { get; set; }
  293. }
  294. /// <summary>
  295. /// 项目文件读取请求
  296. /// </summary>
  297. public class ProjectFileReadRequest
  298. {
  299. /// <summary>
  300. /// 要读取的文件相对路径列表(相对于项目根目录)
  301. /// </summary>
  302. public List<string> FilePaths { get; set; } = new List<string>();
  303. /// <summary>
  304. /// 是否递归读取子目录
  305. /// </summary>
  306. public bool Recursive { get; set; } = false;
  307. /// <summary>
  308. /// 文件搜索模式(例如:*.cs)
  309. /// </summary>
  310. public string SearchPattern { get; set; } = "*.cs";
  311. /// <summary>
  312. /// 文件用途
  313. /// </summary>
  314. public string Purpose { get; set; } = "assistants";
  315. }
  316. /// <summary>
  317. /// 项目文件信息
  318. /// </summary>
  319. public class ProjectFileInfo
  320. {
  321. /// <summary>
  322. /// 文件相对路径
  323. /// </summary>
  324. public string RelativePath { get; set; }
  325. /// <summary>
  326. /// 文件完整路径
  327. /// </summary>
  328. public string FullPath { get; set; }
  329. /// <summary>
  330. /// 文件大小(字节)
  331. /// </summary>
  332. public long FileSize { get; set; }
  333. /// <summary>
  334. /// 最后修改时间
  335. /// </summary>
  336. public DateTime LastModified { get; set; }
  337. /// <summary>
  338. /// 是否成功读取
  339. /// </summary>
  340. public bool Success { get; set; }
  341. /// <summary>
  342. /// 错误信息(如果有)
  343. /// </summary>
  344. public string ErrorMessage { get; set; }
  345. /// <summary>
  346. /// 转换后的IFormFile(如果成功)
  347. /// </summary>
  348. public IFormFile FormFile { get; set; }
  349. }
  350. /// <summary>
  351. /// 项目文件读取响应
  352. /// </summary>
  353. public class ProjectFileReadResponse
  354. {
  355. /// <summary>
  356. /// 是否成功
  357. /// </summary>
  358. public bool Success { get; set; }
  359. /// <summary>
  360. /// 响应消息
  361. /// </summary>
  362. public string Message { get; set; }
  363. /// <summary>
  364. /// 读取的文件信息列表
  365. /// </summary>
  366. public List<ProjectFileInfo> FileInfos { get; set; } = new List<ProjectFileInfo>();
  367. /// <summary>
  368. /// 成功读取的文件数量
  369. /// </summary>
  370. public int SuccessCount => FileInfos.Count(f => f.Success);
  371. /// <summary>
  372. /// 失败的文件数量
  373. /// </summary>
  374. public int FailureCount => FileInfos.Count(f => !f.Success);
  375. }
  376. }