types.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. export interface IndexingConfig {
  2. chunkSize: number;
  3. chunkOverlap: number;
  4. embeddingModelId: string;
  5. mode?: 'fast' | 'precise'; // 处理模式:快速/精准
  6. }
  7. // Vision Pipeline 相关类型
  8. export interface VisionAnalysisResult {
  9. text: string; // 提取的文本内容
  10. images: ImageDescription[]; // 图片描述
  11. layout: string; // 布局类型
  12. confidence: number; // 置信度 (0-1)
  13. pageIndex?: number; // 页码
  14. }
  15. export interface ImageDescription {
  16. type: string; // 图片类型 (图表/架构图/流程图等)
  17. description: string; // 详细描述
  18. position?: number; // 在页面中的位置
  19. }
  20. export interface PipelineResult {
  21. success: boolean;
  22. fileId: string;
  23. fileName: string;
  24. totalPages: number;
  25. processedPages: number;
  26. failedPages: number;
  27. results: VisionAnalysisResult[];
  28. cost: number; // 成本(美元)
  29. duration: number; // 耗时(秒)
  30. mode: 'precise';
  31. }
  32. export interface ModeRecommendation {
  33. recommendedMode: 'precise' | 'fast';
  34. reason: string;
  35. estimatedCost?: number; // 预估成本(美元)
  36. estimatedTime?: number; // 预估时间(秒)
  37. warnings?: string[];
  38. }
  39. // 知识库增强功能类型定义
  40. export interface KnowledgeGroup {
  41. id: string;
  42. name: string;
  43. description?: string;
  44. color: string;
  45. fileCount: number;
  46. createdAt: string;
  47. updatedAt?: string;
  48. intro?: string;
  49. }
  50. export interface CreateGroupData {
  51. name: string;
  52. description?: string;
  53. intro?: string;
  54. color?: string;
  55. }
  56. export interface UpdateGroupData {
  57. name?: string;
  58. description?: string;
  59. intro?: string;
  60. color?: string;
  61. }
  62. export interface SearchHistoryItem {
  63. id: string;
  64. title: string;
  65. selectedGroups: string[] | null;
  66. messageCount: number;
  67. lastMessageAt: string;
  68. createdAt: string;
  69. }
  70. export interface SearchHistoryDetail {
  71. id: string;
  72. title: string;
  73. selectedGroups: string[] | null;
  74. messages: Array<{
  75. id: string;
  76. role: 'user' | 'assistant';
  77. content: string;
  78. sources?: Array<{
  79. fileName: string;
  80. content: string;
  81. score: number;
  82. chunkIndex: number;
  83. pageNumber?: number; // 追加
  84. }>;
  85. createdAt: string;
  86. }>;
  87. }
  88. export interface PDFStatus {
  89. status: 'pending' | 'converting' | 'ready' | 'failed';
  90. pdfPath?: string;
  91. error?: string;
  92. }
  93. export interface KnowledgeFile {
  94. id: string;
  95. name: string;
  96. title?: string;
  97. type: string;
  98. size: number;
  99. content: string; // Base64 string
  100. preview?: string; // For images
  101. uploadDate: number;
  102. status: 'pending' | 'indexing' | 'extracted' | 'vectorized' | 'failed' | 'ready' | 'error'; // Keep 'ready'/'error' for backward compatibility if needed
  103. indexingConfig: IndexingConfig;
  104. groups?: KnowledgeGroup[]; // 文件所属的分组
  105. pdfPath?: string; // PDF预览路径
  106. }
  107. export interface RawFile {
  108. name: string;
  109. type: string;
  110. size: number;
  111. content: string;
  112. preview?: string;
  113. file: File; // Keep original file for upload
  114. isNote?: boolean;
  115. textContent?: string;
  116. }
  117. export enum Role {
  118. USER = 'user',
  119. MODEL = 'model',
  120. }
  121. export interface Message {
  122. id: string;
  123. role: Role;
  124. text: string;
  125. timestamp: number;
  126. isError?: boolean;
  127. sources?: ChatSource[];
  128. }
  129. export interface ChatSource {
  130. fileName: string;
  131. content: string;
  132. score: number;
  133. chunkIndex: number;
  134. pageNumber?: number; // 追加
  135. fileId?: string;
  136. }
  137. export interface ChatState {
  138. messages: Message[];
  139. isLoading: boolean;
  140. }
  141. export type Language = 'ja' | 'en' | 'zh';
  142. export enum ModelType { // Changed from type to enum
  143. LLM = 'llm',
  144. EMBEDDING = 'embedding',
  145. RERANK = 'rerank',
  146. }
  147. // 1. Model Definition (The "Provider" setup)
  148. export interface ModelConfig {
  149. id: string;
  150. name: string; // Display name, e.g. "My DeepSeek"
  151. modelId: string; // The actual string ID sent to API, e.g., "gpt-4o"
  152. baseUrl?: string; // Base URL for OpenAI compatible API
  153. apiKey?: string; // API key for the service
  154. type: ModelType;
  155. supportsVision?: boolean;
  156. dimensions?: number; // 嵌入模型的向量维度
  157. // ==================== 新增字段 ====================
  158. /**
  159. * 模型输入token限制
  160. * 例如: OpenAI=8191, Gemini=2048
  161. */
  162. maxInputTokens?: number;
  163. /**
  164. * 批量处理限制(一次请求最多多少个输入)
  165. * 例如: OpenAI=2048, Gemini=100
  166. */
  167. maxBatchSize?: number;
  168. /**
  169. * 是否为向量模型(用于系统设置中标识)
  170. */
  171. isVectorModel?: boolean;
  172. /**
  173. * 模型提供商的名称(用于显示)
  174. * 例如: "OpenAI", "Google Gemini", "自定义"
  175. */
  176. providerName?: string;
  177. /**
  178. * 是否启用
  179. */
  180. isEnabled?: boolean;
  181. /**
  182. * このモデルをデフォルトとして使用するかどうか
  183. */
  184. isDefault?: boolean;
  185. }
  186. // 2. Application Logic Settings (The "App" setup)
  187. export interface AppSettings {
  188. // References to ModelConfig IDs
  189. selectedLLMId: string;
  190. selectedEmbeddingId: string; // Default for new uploads, and used for query encoding
  191. selectedRerankId: string;
  192. // Model Hyperparameters
  193. temperature: number;
  194. maxTokens: number;
  195. // Retrieval
  196. enableRerank: boolean;
  197. topK: number;
  198. scoreThreshold: number;
  199. similarityThreshold: number; // 相似度阈值
  200. enableFullTextSearch?: boolean; // 是否启用全文检索
  201. enableQueryExpansion?: boolean; // 是否启用查询扩展
  202. enableHyDE?: boolean; // 是否启用 HyDE
  203. // Language
  204. language?: string;
  205. // Coach
  206. coachKbId?: string;
  207. }
  208. // Default Models (Frontend specific)
  209. export const DEFAULT_MODELS: ModelConfig[] = [];
  210. export const DEFAULT_SETTINGS: AppSettings = {
  211. selectedLLMId: '',
  212. selectedEmbeddingId: '',
  213. selectedRerankId: '',
  214. temperature: 0.3,
  215. maxTokens: 8192,
  216. enableRerank: false,
  217. topK: 4,
  218. scoreThreshold: 0.5,
  219. similarityThreshold: 0.7, // 默认相似度阈值
  220. enableFullTextSearch: false, // 默认关闭全文检索
  221. enableQueryExpansion: false,
  222. enableHyDE: false,
  223. language: 'ja',
  224. };
  225. export const API_BASE_URL = '/api'