types.ts 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. }
  49. export interface CreateGroupData {
  50. name: string;
  51. description?: string;
  52. color?: string;
  53. }
  54. export interface UpdateGroupData {
  55. name?: string;
  56. description?: string;
  57. color?: string;
  58. }
  59. export interface SearchHistoryItem {
  60. id: string;
  61. title: string;
  62. selectedGroups: string[] | null;
  63. messageCount: number;
  64. lastMessageAt: string;
  65. createdAt: string;
  66. }
  67. export interface SearchHistoryDetail {
  68. id: string;
  69. title: string;
  70. selectedGroups: string[] | null;
  71. messages: Array<{
  72. id: string;
  73. role: 'user' | 'assistant';
  74. content: string;
  75. sources?: Array<{
  76. fileName: string;
  77. content: string;
  78. score: number;
  79. chunkIndex: number;
  80. }>;
  81. createdAt: string;
  82. }>;
  83. }
  84. export interface PDFStatus {
  85. status: 'pending' | 'converting' | 'ready' | 'failed';
  86. pdfPath?: string;
  87. error?: string;
  88. }
  89. export interface KnowledgeFile {
  90. id: string;
  91. name: string;
  92. title?: string;
  93. type: string;
  94. size: number;
  95. content: string; // Base64 string
  96. preview?: string; // For images
  97. uploadDate: number;
  98. status: 'pending' | 'indexing' | 'extracted' | 'vectorized' | 'failed' | 'ready' | 'error'; // Keep 'ready'/'error' for backward compatibility if needed
  99. indexingConfig: IndexingConfig;
  100. groups?: KnowledgeGroup[]; // ファイルが所属するグループ
  101. pdfPath?: string; // PDFプレビューパス
  102. }
  103. export interface RawFile {
  104. name: string;
  105. type: string;
  106. size: number;
  107. content: string;
  108. preview?: string;
  109. file: File; // Keep original file for upload
  110. isNote?: boolean;
  111. textContent?: string;
  112. }
  113. export enum Role {
  114. USER = 'user',
  115. MODEL = 'model',
  116. }
  117. export interface Message {
  118. id: string;
  119. role: Role;
  120. text: string;
  121. timestamp: number;
  122. isError?: boolean;
  123. sources?: ChatSource[];
  124. }
  125. export interface ChatSource {
  126. fileName: string;
  127. title?: string;
  128. content: string;
  129. score: number;
  130. chunkIndex: number;
  131. fileId?: string;
  132. }
  133. export interface ChatState {
  134. messages: Message[];
  135. isLoading: boolean;
  136. }
  137. export type Language = 'ja' | 'en' | 'zh';
  138. export enum ModelType {
  139. // Changed from type to enum
  140. LLM = "llm",
  141. EMBEDDING = "embedding",
  142. RERANK = "rerank",
  143. VISION = "vision",
  144. }
  145. // 1. Model Definition (The "Provider" setup)
  146. export interface ModelConfig {
  147. id: string;
  148. name: string; // Display name, e.g. "My DeepSeek"
  149. modelId: string; // The actual string ID sent to API, e.g., "gpt-4o"
  150. baseUrl?: string; // Base URL for OpenAI compatible API
  151. apiKey?: string; // API key for the service
  152. type: ModelType;
  153. dimensions?: number; // 埋め込みモデルのベクトル次元
  154. supportsVision?: boolean; // 視覚能力をサポートするかどうか
  155. // ==================== 追加フィールド ====================
  156. /**
  157. * モデルの入力トークン制限
  158. * 例: OpenAI=8191, Gemini=2048
  159. */
  160. maxInputTokens?: number;
  161. /**
  162. * バッチ処理制限(1回のリクエストあたりの最大入力数)
  163. * 例: OpenAI=2048, Gemini=100
  164. */
  165. maxBatchSize?: number;
  166. /**
  167. * ベクトルモデルかどうか(システム設定での識別用)
  168. */
  169. isVectorModel?: boolean;
  170. /**
  171. * モデルプロバイダー名(表示用)
  172. * 例: "OpenAI", "Google Gemini", "カスタム"
  173. */
  174. providerName?: string;
  175. /**
  176. * 有効かどうか
  177. */
  178. isEnabled?: boolean;
  179. /**
  180. * このモデルをデフォルトとして使用するかどうか
  181. */
  182. isDefault?: boolean;
  183. }
  184. // 2. Application Logic Settings (The "App" setup)
  185. export interface AppSettings {
  186. // References to ModelConfig IDs
  187. selectedLLMId: string;
  188. selectedEmbeddingId: string; // Default for new uploads, and used for query encoding
  189. selectedRerankId: string;
  190. // Model Hyperparameters
  191. temperature: number;
  192. maxTokens: number;
  193. // Retrieval
  194. enableRerank: boolean;
  195. topK: number;
  196. similarityThreshold: number; // ベクトル検索の類似度しきい値
  197. rerankSimilarityThreshold: number; // リランクの類似度しきい値
  198. enableFullTextSearch: boolean; // 全文検索を有効にするかどうか
  199. hybridVectorWeight: number; // ハイブリッド検索のベクトル重み
  200. // Search Enhancement
  201. enableQueryExpansion: boolean;
  202. enableHyDE: boolean;
  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. similarityThreshold: 0.3, // デフォルトのベクトル検索類似度しきい値
  219. rerankSimilarityThreshold: 0.5, // デフォルトのリランク類似度しきい値
  220. enableFullTextSearch: false, // デフォルトで全文検索をオフにする
  221. hybridVectorWeight: 0.7, // ハイブリッド検索のベクトル重み
  222. enableQueryExpansion: false,
  223. enableHyDE: false,
  224. language: 'ja',
  225. };
  226. export const API_BASE_URL = '/api'