DeepSeekModels.cs 12 KB

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