@lobehub/chat 1.136.11 → 1.136.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/.github/workflows/claude-translator.yml +13 -1
  2. package/CHANGELOG.md +60 -0
  3. package/changelog/v1.json +21 -0
  4. package/locales/ar/modelProvider.json +12 -0
  5. package/locales/ar/models.json +39 -24
  6. package/locales/bg-BG/modelProvider.json +12 -0
  7. package/locales/bg-BG/models.json +39 -24
  8. package/locales/de-DE/modelProvider.json +12 -0
  9. package/locales/de-DE/models.json +39 -24
  10. package/locales/en-US/modelProvider.json +12 -0
  11. package/locales/en-US/models.json +39 -24
  12. package/locales/es-ES/modelProvider.json +12 -0
  13. package/locales/es-ES/models.json +39 -24
  14. package/locales/fa-IR/modelProvider.json +12 -0
  15. package/locales/fa-IR/models.json +39 -24
  16. package/locales/fr-FR/modelProvider.json +12 -0
  17. package/locales/fr-FR/models.json +39 -24
  18. package/locales/it-IT/modelProvider.json +12 -0
  19. package/locales/it-IT/models.json +39 -24
  20. package/locales/ja-JP/modelProvider.json +12 -0
  21. package/locales/ja-JP/models.json +39 -24
  22. package/locales/ko-KR/modelProvider.json +12 -0
  23. package/locales/ko-KR/models.json +39 -24
  24. package/locales/nl-NL/modelProvider.json +12 -0
  25. package/locales/nl-NL/models.json +39 -24
  26. package/locales/pl-PL/modelProvider.json +12 -0
  27. package/locales/pl-PL/models.json +39 -24
  28. package/locales/pt-BR/modelProvider.json +12 -0
  29. package/locales/pt-BR/models.json +39 -24
  30. package/locales/ru-RU/modelProvider.json +12 -0
  31. package/locales/ru-RU/models.json +39 -24
  32. package/locales/tr-TR/modelProvider.json +12 -0
  33. package/locales/tr-TR/models.json +39 -24
  34. package/locales/vi-VN/modelProvider.json +12 -0
  35. package/locales/vi-VN/models.json +39 -24
  36. package/locales/zh-CN/modelProvider.json +12 -0
  37. package/locales/zh-CN/models.json +39 -24
  38. package/locales/zh-TW/modelProvider.json +12 -0
  39. package/locales/zh-TW/models.json +39 -24
  40. package/package.json +3 -3
  41. package/packages/const/src/settings/index.ts +1 -0
  42. package/packages/database/package.json +7 -5
  43. package/packages/electron-client-ipc/src/events/index.ts +2 -2
  44. package/packages/electron-client-ipc/src/events/{localFile.ts → localSystem.ts} +25 -6
  45. package/packages/electron-client-ipc/src/types/index.ts +1 -1
  46. package/packages/electron-client-ipc/src/types/{localFile.ts → localSystem.ts} +89 -4
  47. package/packages/file-loaders/package.json +1 -2
  48. package/packages/file-loaders/src/loadFile.ts +4 -1
  49. package/packages/file-loaders/src/loaders/doc/__snapshots__/index.test.ts.snap +46 -0
  50. package/packages/file-loaders/src/loaders/doc/index.test.ts +38 -0
  51. package/packages/file-loaders/src/loaders/doc/index.ts +57 -0
  52. package/packages/file-loaders/src/loaders/docx/index.ts +36 -45
  53. package/packages/file-loaders/src/loaders/index.ts +2 -0
  54. package/packages/file-loaders/src/types/word-extractor.d.ts +9 -0
  55. package/packages/file-loaders/src/types.ts +1 -1
  56. package/packages/model-bank/src/aiModels/infiniai.ts +465 -174
  57. package/packages/model-bank/src/aiModels/modelscope.ts +10 -20
  58. package/packages/model-bank/src/aiModels/novita.ts +2 -2
  59. package/packages/model-runtime/src/core/openaiCompatibleFactory/index.test.ts +267 -38
  60. package/packages/model-runtime/src/core/openaiCompatibleFactory/index.ts +45 -0
  61. package/packages/model-runtime/src/providerTestUtils.ts +0 -5
  62. package/packages/model-runtime/src/providers/anthropic/generateObject.test.ts +57 -44
  63. package/packages/model-runtime/src/providers/anthropic/generateObject.ts +28 -20
  64. package/packages/model-runtime/src/providers/deepseek/index.ts +5 -0
  65. package/packages/model-runtime/src/providers/infiniai/index.ts +8 -54
  66. package/packages/model-runtime/src/providers/openai/index.test.ts +0 -5
  67. package/packages/model-runtime/src/providers/openrouter/index.test.ts +3 -3
  68. package/packages/model-runtime/src/providers/openrouter/index.ts +32 -20
  69. package/packages/model-runtime/src/providers/openrouter/type.ts +25 -24
  70. package/packages/model-runtime/src/providers/zhipu/index.test.ts +0 -1
  71. package/packages/model-runtime/src/types/structureOutput.ts +13 -1
  72. package/packages/model-runtime/src/utils/handleOpenAIError.test.ts +0 -5
  73. package/packages/model-runtime/src/utils/handleOpenAIError.ts +2 -2
  74. package/packages/types/src/aiChat.ts +13 -1
  75. package/packages/types/src/index.ts +1 -0
  76. package/src/app/[variants]/(main)/settings/provider/detail/bedrock/index.tsx +36 -2
  77. package/src/config/modelProviders/infiniai.ts +2 -25
  78. package/src/config/modelProviders/modelscope.ts +1 -17
  79. package/src/features/ChatInput/InputEditor/index.tsx +39 -26
  80. package/src/features/Conversation/Messages/Assistant/Tool/Render/LoadingPlaceholder/index.tsx +1 -1
  81. package/src/server/routers/lambda/agent.ts +2 -3
  82. package/src/server/routers/lambda/aiChat.ts +33 -1
  83. package/src/server/routers/lambda/chunk.ts +2 -2
  84. package/src/services/electron/file.ts +1 -2
  85. package/src/services/electron/localFileService.ts +40 -0
  86. package/src/tools/local-system/Placeholder/ListFiles.tsx +23 -0
  87. package/src/tools/local-system/Placeholder/ReadLocalFile.tsx +9 -0
  88. package/src/tools/local-system/Placeholder/SearchFiles.tsx +55 -0
  89. package/src/tools/local-system/Placeholder/index.tsx +25 -0
  90. package/src/tools/placeholders.ts +3 -0
@@ -1,70 +1,61 @@
1
- import { DocxLoader as LangchainDocxLoader } from '@langchain/community/document_loaders/fs/docx';
2
1
  import debug from 'debug';
2
+ import fs from 'node:fs/promises';
3
+ import mammoth from 'mammoth';
3
4
 
4
5
  import type { DocumentPage, FileLoaderInterface } from '../../types';
5
6
 
6
7
  const log = debug('file-loaders:docx');
7
8
 
8
9
  /**
9
- * Loads Word documents (.docx) using the LangChain Community DocxLoader.
10
+ * Loads Word documents (.docx) using mammoth library.
11
+ * Extracts text content and basic metadata from DOCX files.
10
12
  */
11
13
  export class DocxLoader implements FileLoaderInterface {
12
14
  async loadPages(filePath: string): Promise<DocumentPage[]> {
13
15
  log('Loading DOCX file:', filePath);
14
16
  try {
15
- let loader: LangchainDocxLoader;
16
- if (filePath.endsWith('.doc')) {
17
- loader = new LangchainDocxLoader(filePath, { type: 'doc' });
18
- } else {
19
- loader = new LangchainDocxLoader(filePath, { type: 'docx' });
20
- }
21
- log('LangChain DocxLoader created');
22
- const docs = await loader.load(); // Langchain DocxLoader typically loads the whole doc as one
23
- log('DOCX document loaded, parts:', docs.length);
24
-
25
- const pages: DocumentPage[] = docs.map((doc) => {
26
- const pageContent = doc.pageContent || '';
27
- const lines = pageContent.split('\n');
28
- const lineCount = lines.length;
29
- const charCount = pageContent.length;
17
+ // Read file as buffer
18
+ const buffer = await fs.readFile(filePath);
19
+ log('File buffer read, size:', buffer.length);
30
20
 
31
- // Langchain DocxLoader doesn't usually provide page numbers in metadata
32
- // We treat it as a single page
33
- const metadata = {
34
- ...doc.metadata, // Include any other metadata Langchain provides
35
- pageNumber: 1,
36
- };
21
+ // Extract text using mammoth
22
+ const result = await mammoth.extractRawText({ buffer });
23
+ const pageContent = result.value;
24
+ log('Text extracted, length:', pageContent.length);
37
25
 
38
- // @ts-expect-error Remove source if present, as it's handled at the FileDocument level
39
- delete metadata.source;
26
+ // Count lines and characters
27
+ const lines = pageContent.split('\n');
28
+ const lineCount = lines.length;
29
+ const charCount = pageContent.length;
40
30
 
41
- log('DOCX document processed, lines:', lineCount, 'chars:', charCount);
31
+ log('DOCX document processed, lines:', lineCount, 'chars:', charCount);
42
32
 
43
- return {
44
- charCount,
45
- lineCount,
46
- metadata,
47
- pageContent,
48
- };
49
- });
33
+ // Create single page with extracted content
34
+ const page: DocumentPage = {
35
+ charCount,
36
+ lineCount,
37
+ metadata: {
38
+ pageNumber: 1,
39
+ },
40
+ pageContent,
41
+ };
50
42
 
51
- // If docs array is empty (e.g., empty file), create an empty page
52
- if (pages.length === 0) {
53
- log('No content in DOCX document, creating empty page');
54
- pages.push({
55
- charCount: 0,
56
- lineCount: 0,
57
- metadata: { pageNumber: 1 },
58
- pageContent: '',
59
- });
43
+ // Handle warnings if any
44
+ if (result.messages.length > 0) {
45
+ const warnings = result.messages.filter((msg) => msg.type === 'warning');
46
+ if (warnings.length > 0) {
47
+ log('Extraction warnings:', warnings.length);
48
+ warnings.forEach((warning) => log('Warning:', warning.message));
49
+ }
60
50
  }
61
51
 
62
- log('DOCX loading completed, total pages:', pages.length);
63
- return pages;
52
+ log('DOCX loading completed');
53
+ return [page];
64
54
  } catch (e) {
65
55
  const error = e as Error;
66
56
  log('Error encountered while loading DOCX file');
67
- console.error(`Error loading DOCX file ${filePath} using LangChain loader: ${error.message}`);
57
+ console.error(`Error loading DOCX file ${filePath}: ${error.message}`);
58
+
68
59
  const errorPage: DocumentPage = {
69
60
  charCount: 0,
70
61
  lineCount: 0,
@@ -1,4 +1,5 @@
1
1
  import { FileLoaderInterface, SupportedFileType } from '../types';
2
+ import { DocLoader } from './doc';
2
3
  import { DocxLoader } from './docx';
3
4
  // import { EpubLoader } from './epub';
4
5
  import { ExcelLoader } from './excel';
@@ -10,6 +11,7 @@ import { TextLoader } from './text';
10
11
  // Key: file extension (lowercase, without leading dot) or specific type name
11
12
  // Value: Loader Class implementing FileLoaderInterface
12
13
  export const fileLoaders: Record<SupportedFileType, new () => FileLoaderInterface> = {
14
+ doc: DocLoader,
13
15
  docx: DocxLoader,
14
16
  // epub: EpubLoader,
15
17
  excel: ExcelLoader,
@@ -0,0 +1,9 @@
1
+ declare module 'word-extractor' {
2
+ export default class WordExtractor {
3
+ extract(filePath: string): Promise<{
4
+ getBody: () => string;
5
+ getHeaders?: () => Record<string, string> | undefined;
6
+ text?: string;
7
+ }>;
8
+ }
9
+ }
@@ -1,5 +1,5 @@
1
1
  // Define supported file types - consider using an enum or const assertion
2
- export type SupportedFileType = 'pdf' | 'docx' | 'txt' | 'excel' | 'pptx'; // | 'pptx' | 'latex' | 'epub' | 'code' | 'markdown';
2
+ export type SupportedFileType = 'pdf' | 'doc' | 'docx' | 'txt' | 'excel' | 'pptx'; // | 'pptx' | 'latex' | 'epub' | 'code' | 'markdown';
3
3
 
4
4
  /**
5
5
  * 代表一个完整的已加载文件,包含文件级信息和其所有页面/块。