IDeepSeekService.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. namespace OASystem.API.OAMethodLib.DeepSeekAPI
  2. {
  3. /// <summary>
  4. /// DeepSeek API 服务接口
  5. /// </summary>
  6. public interface IDeepSeekService
  7. {
  8. /// <summary>
  9. /// 测试API连通性
  10. /// </summary>
  11. /// <returns></returns>
  12. Task<bool> TestApiConnectivityAsync();
  13. /// <summary>
  14. /// 检查可用端点
  15. /// </summary>
  16. /// <returns></returns>
  17. Task<List<string>> DiscoverAvailableEndpointsAsync();
  18. /// <summary>
  19. /// 上传文件到DeepSeek API
  20. /// </summary>
  21. /// <param name="file">要上传的文件</param>
  22. /// <param name="purpose">文件用途</param>
  23. /// <returns>文件上传响应</returns>
  24. Task<DeepSeekFileUploadResponse> UploadFileAsync(IFormFile file, string purpose = "assistants");
  25. /// <summary>
  26. /// 批量上传文件
  27. /// </summary>
  28. /// <param name="files">文件列表</param>
  29. /// <param name="purpose">文件用途</param>
  30. /// <returns>上传结果列表</returns>
  31. Task<List<FileUploadResult>> UploadFilesAsync(List<IFormFile> files, string purpose = "assistants");
  32. /// <summary>
  33. /// 获取文件列表
  34. /// </summary>
  35. /// <returns>文件列表响应</returns>
  36. Task<DeepSeekFileListResponse> ListFilesAsync();
  37. /// <summary>
  38. /// 获取文件信息
  39. /// </summary>
  40. /// <param name="fileId">文件ID</param>
  41. /// <returns>文件信息</returns>
  42. Task<DeepSeekFileUploadResponse> GetFileInfoAsync(string fileId);
  43. /// <summary>
  44. /// 删除文件
  45. /// </summary>
  46. /// <param name="fileId">文件ID</param>
  47. /// <returns>是否删除成功</returns>
  48. Task<bool> DeleteFileAsync(string fileId);
  49. /// <summary>
  50. /// 使用已上传的文件进行聊天
  51. /// </summary>
  52. /// <param name="fileIds">文件ID列表</param>
  53. /// <param name="question">问题</param>
  54. /// <param name="model">模型名称</param>
  55. /// <param name="temperature">温度参数</param>
  56. /// <param name="maxTokens">最大token数</param>
  57. /// <returns>聊天响应</returns>
  58. Task<ApiResponse> ChatWithFilesAsync(List<string> fileIds, string question, string model = "deepseek-chat", float temperature = 0.7f, int maxTokens = 4000);
  59. /// <summary>
  60. /// chat接口 - 直接提问(不使用文件上下文)
  61. /// </summary>
  62. /// <param name="question">问题</param>
  63. /// <param name="model">模型名称</param>
  64. /// <param name="stream">是否流式输出</param>
  65. /// <param name="temperature">温度参数</param>
  66. /// <param name="maxTokens">最大token数</param>
  67. /// <returns>聊天响应</returns>
  68. Task<ApiResponse> ChatAsync(string question, bool stream = false, string model = "deepseek-chat", float temperature = 0.7f, int maxTokens = 4000);
  69. /// <summary>
  70. /// 流式 chat;每段带 <see cref="DeepSeekStreamPhase"/>,reasoner 模型下思考与正文都会产出。
  71. /// </summary>
  72. /// <param name="question">问题</param>
  73. /// <param name="model">模型名称</param>
  74. /// <param name="temperature">温度参数</param>
  75. /// <param name="maxTokens">最大token数</param>
  76. IAsyncEnumerable<DeepSeekStreamChunk> ChatStreamAsync(string question, string model = "deepseek-chat", float temperature = 0.7f, int maxTokens = 4000);
  77. /// <summary>
  78. /// 带完整上下文的流式对话:将 <paramref name="messages"/> 原样提交给 chat/completions(stream=true)。
  79. /// 与 <see cref="ChatStreamAsync"/> 行为一致(含 reasoner 的 reasoning/content 分阶段),但支持多轮记忆。
  80. /// </summary>
  81. /// <param name="messages">已排序的会话历史,最后一条一般应为 user</param>
  82. /// <param name="model">模型名称</param>
  83. /// <param name="temperature">温度参数</param>
  84. /// <param name="maxTokens">最大 token 数</param>
  85. IAsyncEnumerable<DeepSeekStreamChunk> ChatStreamWithHistoryAsync(
  86. IReadOnlyList<DeepSeekHistoryMessage> messages,
  87. string model = "deepseek-chat",
  88. float temperature = 0.7f,
  89. int maxTokens = 4000);
  90. /// <summary>
  91. /// 等待文件处理完成
  92. /// </summary>
  93. /// <param name="fileId">文件ID</param>
  94. /// <param name="timeoutSeconds">超时时间(秒)</param>
  95. /// <returns>处理后的文件状态</returns>
  96. Task<DeepSeekFileUploadResponse> WaitForFileProcessingAsync(string fileId, int timeoutSeconds = 60);
  97. #region 本地项目相关
  98. /// <summary>
  99. /// 读取项目内的指定文件并转换为IFormFile
  100. /// </summary>
  101. /// <param name="relativePaths">文件相对路径列表</param>
  102. /// <returns>文件读取响应</returns>
  103. Task<ProjectFileReadResponse> ReadProjectFilesAsync(List<string> relativePaths);
  104. /// <summary>
  105. /// 读取项目内指定目录的文件
  106. /// </summary>
  107. /// <param name="directoryPath">目录相对路径</param>
  108. /// <param name="searchPattern">文件搜索模式</param>
  109. /// <param name="recursive">是否递归搜索</param>
  110. /// <returns>文件读取响应</returns>
  111. Task<ProjectFileReadResponse> ReadProjectDirectoryAsync(string directoryPath, string searchPattern = "*.cs", bool recursive = false);
  112. /// <summary>
  113. /// 获取项目根目录路径
  114. /// </summary>
  115. /// <returns>项目根目录完整路径</returns>
  116. string GetProjectRootPath();
  117. /// <summary>
  118. /// 检查文件是否存在
  119. /// </summary>
  120. /// <param name="relativePath">文件相对路径</param>
  121. /// <returns>是否存在</returns>
  122. bool FileExists(string relativePath);
  123. /// <summary>
  124. /// 将物理文件转换为IFormFile
  125. /// </summary>
  126. /// <param name="filePath">文件完整路径</param>
  127. /// <returns>IFormFile实例</returns>
  128. Task<IFormFile> ConvertToFormFileAsync(string filePath);
  129. /// <summary>
  130. /// 读取特定的签证申请表单文件
  131. /// </summary>
  132. /// <param name="fileName"></param>
  133. /// <returns></returns>
  134. Task<ProjectFileReadResponse> ReadVisaFormFileAsync(string fileName);
  135. /// <summary>
  136. /// 读取OASystem项目中的所有CS文件
  137. /// </summary>
  138. Task<ProjectFileReadResponse> ReadOASystemFilesAsync(string searchPattern = "*.cs", bool recursive = true);
  139. /// <summary>
  140. /// 读取指定域模型中的CS文件
  141. /// </summary>
  142. Task<ProjectFileReadResponse> ReadDomainViewModelsAsync(string searchPattern = "*.cs", bool recursive = true);
  143. /// <summary>
  144. /// 读取签证表单相关的所有CS文件
  145. /// </summary>
  146. Task<ProjectFileReadResponse> ReadVisaFormFilesAsync(string searchPattern = "*.cs", bool recursive = true);
  147. #endregion
  148. }
  149. }