From 04cfe5019ef6504b066cda5bfc030553f340c4f5 Mon Sep 17 00:00:00 2001 From: Peter Chen <13093023233@163.com> Date: Mon, 10 Feb 2025 16:37:22 +0800 Subject: [PATCH 01/12] Update MessageThought.tsx --- src/renderer/src/pages/home/Messages/MessageThought.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/pages/home/Messages/MessageThought.tsx b/src/renderer/src/pages/home/Messages/MessageThought.tsx index 0c6c874c..1f61e95b 100644 --- a/src/renderer/src/pages/home/Messages/MessageThought.tsx +++ b/src/renderer/src/pages/home/Messages/MessageThought.tsx @@ -24,7 +24,7 @@ const MessageThought: FC = ({ message }) => { } const thinkingTime = message.metrics?.time_thinking_millsec || 0 - const thinkingTimeSecounds = (thinkingTime / 1000).toFixed(1) + const thinkingTimeSeconds = (thinkingTime / 1000).toFixed(1) return ( = ({ message }) => { label: ( - {isThinking ? t('chat.thinking') : t('chat.deeply_thought', { secounds: thinkingTimeSecounds })} + {isThinking ? t('chat.thinking') : t('chat.deeply_thought', { secounds: thinkingTimeSeconds })} {isThinking && } From 0eead315d835cb9daaa8676d2475dbfa50f1ea7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BE=8E=E5=85=B0=E5=8D=81=E4=B8=89?= Date: Mon, 10 Feb 2025 17:01:16 +0800 Subject: [PATCH 02/12] =?UTF-8?q?fix:=20=E5=BF=AB=E6=8D=B7=E9=94=AE?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E7=BB=91=E5=AE=9A=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/pages/settings/ShortcutSettings.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/pages/settings/ShortcutSettings.tsx b/src/renderer/src/pages/settings/ShortcutSettings.tsx index c00d6fd3..e7d6794d 100644 --- a/src/renderer/src/pages/settings/ShortcutSettings.tsx +++ b/src/renderer/src/pages/settings/ShortcutSettings.tsx @@ -113,7 +113,11 @@ const ShortcutSettings: FC = () => { const key = e.key if (key.length === 1 && !['Control', 'Alt', 'Shift', 'Meta'].includes(key)) { - keys.push(key.toUpperCase()) + if (key === ' ') { + keys.push('Space') + } else { + keys.push(key.toUpperCase()) + } } if (!isValidShortcut(keys)) { From 5c2129c0c87e10157555b246a0a6a6c692e85187 Mon Sep 17 00:00:00 2001 From: Chen Tao <70054568+eeee0717@users.noreply.github.com> Date: Tue, 11 Feb 2025 10:05:34 +0800 Subject: [PATCH 03/12] =?UTF-8?q?fix:=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=B8=AA=E6=95=B0=E5=8F=98=E4=B8=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A46=E4=B8=AA#1366=20#1370?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/knowledge/components/KnowledgeSettingsPopup.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSettingsPopup.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSettingsPopup.tsx index 68ba85e5..08cc8ced 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSettingsPopup.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSettingsPopup.tsx @@ -9,7 +9,7 @@ import { getModelUniqId } from '@renderer/services/ModelService' import { KnowledgeBase } from '@renderer/types' import { Alert, Form, Input, InputNumber, Modal, Select, Slider } from 'antd' import { sortBy } from 'lodash' -import { useState } from 'react' +import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' interface ShowParams { @@ -35,6 +35,10 @@ const PopupContainer: React.FC = ({ base: _base, resolve }) => { const { providers } = useProviders() const { base, updateKnowledgeBase } = useKnowledge(_base.id) + useEffect(() => { + form.setFieldsValue({ documentCount: base?.documentCount || 6 }) + }, [base, form]) + if (!base) { resolve(null) return null @@ -118,7 +122,6 @@ const PopupContainer: React.FC = ({ base: _base, resolve }) => { style={{ width: '100%' }} min={1} max={15} - defaultValue={base.documentCount || 6} step={1} marks={{ 1: '1', 6: t('knowledge.document_count_default'), 15: '15' }} /> From 1d82552491f21a498bdf0fa1a9566204b8cf2fa7 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Tue, 11 Feb 2025 11:18:33 +0800 Subject: [PATCH 04/12] Revert "feat: enable local network access on macOS #1178" This reverts commit 6fb79c17d20406821aa972a398c163378166ed2b. --- build/entitlements.mac.plist | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist index 8059c60e..38c887b2 100644 --- a/build/entitlements.mac.plist +++ b/build/entitlements.mac.plist @@ -8,9 +8,5 @@ com.apple.security.cs.allow-dyld-environment-variables - com.apple.security.network.client - - com.apple.security.network.server - From 50cc1c6b5a585ebcbd51b2c84fb2fafcfe6446cc Mon Sep 17 00:00:00 2001 From: Trey Dong <1346650911@qq.com> Date: Tue, 11 Feb 2025 11:27:01 +0800 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E8=AF=9D=E9=A2=98=E8=87=B3Notion=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20(#1331)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 新增导出至Notion的选项 * fix:添加多语言支持 * fix:添加提示语的多语言支持,以及防止重复导入的状态 * fix:修复多语言错误及调整UI样式统一 --- package.json | 1 + src/renderer/src/i18n/locales/en-us.json | 13 +++- src/renderer/src/i18n/locales/ja-jp.json | 12 +++- src/renderer/src/i18n/locales/ru-ru.json | 12 +++- src/renderer/src/i18n/locales/zh-cn.json | 13 +++- src/renderer/src/i18n/locales/zh-tw.json | 12 +++- .../src/pages/home/Tabs/TopicsTab.tsx | 10 ++- .../settings/DataSettings/DataSettings.tsx | 61 ++++++++++++++++++- src/renderer/src/store/runtime.ts | 17 +++++- src/renderer/src/store/settings.ts | 16 ++++- src/renderer/src/utils/export.ts | 57 +++++++++++++++++ yarn.lock | 15 ++++- 12 files changed, 220 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 8bcabe78..4ce988d6 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "@llm-tools/embedjs-loader-web": "^0.1.25", "@llm-tools/embedjs-loader-xml": "^0.1.25", "@llm-tools/embedjs-openai": "^0.1.25", + "@notionhq/client": "^2.2.15", "@types/react-infinite-scroll-component": "^5.0.0", "adm-zip": "^0.5.16", "apache-arrow": "^18.1.0", diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 1693dde0..17f84628 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -115,6 +115,7 @@ "topics.edit.placeholder": "Enter new name", "topics.edit.title": "Edit Name", "topics.export.image": "Export as image", + "topics.export.notion": "Export to Notion", "topics.export.md": "Export as markdown", "topics.export.title": "Export", "topics.export.word": "Export as Word", @@ -296,7 +297,11 @@ "error.get_embedding_dimensions": "Failed to get embedding dimensions", "group.delete.title": "Delete Group Message", "group.delete.content": "Deleting a group message will delete the user's question and all assistant's answers", - "mention.title": "Switch model answer" + "mention.title": "Switch model answer", + "error.notion.export": "Notion import failed", + "error.notion.no_api_key": "Notion ApiKey or Notion DatabaseID is not configured", + "success.notion.export": "Notion import successful", + "warn.notion.exporting": "Notion is importing, please do not import repeatedly" }, "minapp": { "title": "MinApp", @@ -421,7 +426,11 @@ "webdav.autoSync.off": "Off", "webdav.noSync": "Waiting for next backup", "webdav.syncError": "Backup Error", - "webdav.lastSync": "Last Backup" + "webdav.lastSync": "Last Backup", + "notion.api_key":"Notion API Key", + "notion.database_id":"Notion Database ID", + "notion.title":"Notion Configuration" + }, "quickAssistant": { "title": "Quick Assistant", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 44b7000f..37bd620b 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -111,6 +111,7 @@ "topics.edit.title": "名前を編集", "topics.export.image": "画像としてエクスポート", "topics.export.md": "Markdownとしてエクスポート", + "topics.export.notion": "Notion にエクスポート", "topics.export.title": "エクスポート", "topics.export.word": "Wordとしてエクスポート", "topics.list": "トピックリスト", @@ -290,7 +291,11 @@ "error.get_embedding_dimensions": "埋込み次元を取得できませんでした", "group.delete.title": "分組メッセージを削除", "group.delete.content": "分組メッセージを削除するとユーザーの質問と助け手の回答がすべて削除されます", - "mention.title": "モデルを切り替える" + "mention.title": "モデルを切り替える", + "error.notion.export": "Notion インポートに失敗", + "error.notion.no_api_key": "Notion ApiKey または Notion DatabaseID が設定されていません", + "success.notion.export": "Notion へのインポートに成功", + "warn.notion.exporting": "Notion 正在インポート中です。重複インポートしないでください。" }, "minapp": { "title": "ミニアプリ", @@ -413,7 +418,10 @@ "webdav.autoSync.off": "オフ", "webdav.noSync": "次回のバックアップを待っています", "webdav.syncError": "バックアップエラー", - "webdav.lastSync": "最終同期" + "webdav.lastSync": "最終同期", + "notion.api_key":"Notion APIキー", + "notion.database_id":"Notion データベースID", + "notion.title":"Notion 設定" }, "quickAssistant": { "title": "クイックアシスタント", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index e23eb0d5..d2a492b4 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -111,6 +111,7 @@ "topics.edit.title": "Редактировать заголовок", "topics.export.image": "Экспорт как изображение", "topics.export.md": "Экспорт как markdown", + "topics.export.notion": "Экспорт в Notion", "topics.export.title": "Экспорт", "topics.export.word": "Экспорт как Word", "topics.list": "Список топиков", @@ -291,7 +292,11 @@ "error.get_embedding_dimensions": "Не удалось получить размерность встраивания", "group.delete.title": "Удалить группу сообщений", "group.delete.content": "Удаление группы сообщений удалит пользовательский вопрос и все ответы помощника", - "mention.title": "Переключить модель ответа" + "mention.title": "Переключить модель ответа", + "error.notion.export": "Импорт в Notion не удался", + "error.notion.no_api_key": "Notion ApiKey или Notion DatabaseID не настроен", + "success.notion.export": "Импорт в Notion выполнен успешно", + "warn.notion.exporting": "Идет импорт в Notion, пожалуйста, не повторяйте импорт" }, "minapp": { "title": "Встроенные приложения", @@ -414,7 +419,10 @@ "webdav.autoSync.off": "Выключено", "webdav.noSync": "Ожидание следующего резервного копирования", "webdav.syncError": "Ошибка резервного копирования", - "webdav.lastSync": "Последняя синхронизация" + "webdav.lastSync": "Последняя синхронизация", + "notion.api_key":"Ключ API Notion", + "notion.database_id":"ID базы данных Notion", + "notion.title":"Настройки Notion" }, "quickAssistant": { "title": "Быстрый помощник", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 7cd86ed0..1451bf27 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -116,6 +116,7 @@ "topics.edit.title": "编辑话题名", "topics.export.image": "导出为图片", "topics.export.md": "导出为 Markdown", + "topics.export.notion": "导出到 Notion", "topics.export.title": "导出", "topics.export.word": "导出为 Word", "topics.list": "话题列表", @@ -297,7 +298,12 @@ "error.get_embedding_dimensions": "获取嵌入维度失败", "group.delete.title": "删除分组消息", "group.delete.content": "删除分组消息会删除用户提问和所有助手的回答", - "mention.title": "切换模型回答" + "mention.title": "切换模型回答", + "error.notion.export":"Notion 导入失败", + "error.notion.no_api_key":"未配置Notion ApiKey或Notion DatabaseID", + "success.notion.export":"导入Notion成功", + "warn.notion.exporting":"Notion正在导入,请勿重复导入" + }, "minapp": { "title": "小程序", @@ -420,7 +426,10 @@ "webdav.autoSync.off": "关闭", "webdav.noSync": "等待下次备份", "webdav.syncError": "备份错误", - "webdav.lastSync": "上次备份时间" + "webdav.lastSync": "上次备份时间", + "notion.api_key":"Notion 密钥", + "notion.database_id":"Notion 数据库ID", + "notion.title":"Notion 配置" }, "quickAssistant": { "title": "快捷助手", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 785f30fc..58490eeb 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -116,6 +116,7 @@ "topics.edit.title": "編輯名稱", "topics.export.image": "匯出為圖片", "topics.export.md": "匯出為 Markdown", + "topics.export.notion": "匯出到 Notion", "topics.export.title": "匯出", "topics.export.word": "導出為 Word", "topics.list": "話題列表", @@ -296,7 +297,11 @@ "error.get_embedding_dimensions": "獲取嵌入維度失敗", "group.delete.title": "刪除分組消息", "group.delete.content": "刪除分組消息會刪除用戶提問和所有助手的回答", - "mention.title": "切換模型回答" + "mention.title": "切換模型回答", + "error.notion.export": "Notion 匯入失敗", + "error.notion.no_api_key": "未配置 Notion ApiKey 或 Notion DatabaseID", + "success.notion.export": "匯入 Notion 成功", + "warn.notion.exporting": "Notion 正在匯入,請勿重複匯入" }, "minapp": { "title": "小程序", @@ -419,7 +424,10 @@ "webdav.autoSync.off": "關閉", "webdav.noSync": "等待下次備份", "webdav.syncError": "備份錯誤", - "webdav.lastSync": "上次同步時間" + "webdav.lastSync": "上次同步時間", + "notion.api_key": "Notion 金鑰", + "notion.database_id": "Notion 資料庫 ID", + "notion.title": "Notion 配置" }, "quickAssistant": { "title": "快捷助手", diff --git a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx index f1880246..1dfeb435 100644 --- a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx @@ -18,7 +18,7 @@ import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import store from '@renderer/store' import { setGenerating } from '@renderer/store/runtime' import { Assistant, Topic } from '@renderer/types' -import { exportTopicAsMarkdown, topicToMarkdown } from '@renderer/utils/export' +import { exportTopicAsMarkdown, exportTopicToNotion, topicToMarkdown } from '@renderer/utils/export' import { Dropdown, MenuProps } from 'antd' import dayjs from 'dayjs' import { findIndex } from 'lodash' @@ -133,6 +133,7 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic key: 'markdown', onClick: () => exportTopicAsMarkdown(topic) }, + { label: t('chat.topics.export.word'), key: 'word', @@ -140,7 +141,12 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic const markdown = await topicToMarkdown(topic) window.api.export.toWord(markdown, topic.name) } - } + }, + { + label: t('chat.topics.export.notion'), + key: 'notion', + onClick: () => exportTopicToNotion(topic) + }, ] } ] diff --git a/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx b/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx index 7c565cad..c1caeaa8 100644 --- a/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/DataSettings.tsx @@ -2,15 +2,72 @@ import { FileSearchOutlined, FolderOpenOutlined, SaveOutlined } from '@ant-desig import { HStack } from '@renderer/components/Layout' import { useTheme } from '@renderer/context/ThemeProvider' import { backup, reset, restore } from '@renderer/services/BackupService' +import { RootState, useAppDispatch } from '@renderer/store' +import { setNotionApiKey, setNotionDatabaseID } from '@renderer/store/settings' import { AppInfo } from '@renderer/types' -import { Button, Modal, Typography } from 'antd' +import { Button,Modal, Typography } from 'antd' +import Input from 'antd/es/input/Input' import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' +import { useSelector } from 'react-redux' import styled from 'styled-components' import { SettingContainer, SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle } from '..' import WebDavSettings from './WebDavSettings' +// 新增的 NotionSettings 组件 +const NotionSettings: FC = () => { + const { t } = useTranslation() + const { theme } = useTheme() + const dispatch = useAppDispatch() + + // 这里可以添加 Notion 相关的状态和逻辑 + // 例如: + const notionApiKey = useSelector((state: RootState) => state.settings.notionApiKey); + const notionDatabaseID = useSelector((state: RootState) => state.settings.notionDatabaseID); + + const handleNotionTokenChange = (e: React.ChangeEvent) => { + dispatch(setNotionApiKey(e.target.value)) + }; + + const handleNotionDatabaseIdChange = (e: React.ChangeEvent) => { + dispatch(setNotionDatabaseID(e.target.value)) + }; + + + return ( + + {t('settings.data.notion.title')} + + + {t('settings.data.notion.api_key')} + + + + + {/* 添加分割线 */} + + {t('settings.data.notion.database_id')} + + + + + + ) +} + const DataSettings: FC = () => { const { t } = useTranslation() const [appInfo, setAppInfo] = useState() @@ -79,6 +136,7 @@ const DataSettings: FC = () => { + {t('settings.data.data.title')} @@ -107,6 +165,7 @@ const DataSettings: FC = () => { + ) } diff --git a/src/renderer/src/store/runtime.ts b/src/renderer/src/store/runtime.ts index bf6a229d..8c47f981 100644 --- a/src/renderer/src/store/runtime.ts +++ b/src/renderer/src/store/runtime.ts @@ -25,6 +25,11 @@ export interface RuntimeState { resourcesPath: string update: UpdateState webdavSync: WebDAVSyncState + export: ExportState +} + +export interface ExportState { + isExporting: boolean } const initialState: RuntimeState = { @@ -45,6 +50,9 @@ const initialState: RuntimeState = { lastSyncTime: null, syncing: false, lastSyncError: null + }, + export: { + isExporting: false } } @@ -75,7 +83,11 @@ const runtimeSlice = createSlice({ }, setWebDAVSyncState: (state, action: PayloadAction>) => { state.webdavSync = { ...state.webdavSync, ...action.payload } - } + }, + setExportState: (state, action: PayloadAction>) => { + state.export = { ...state.export, ...action.payload } + }, + } }) @@ -87,7 +99,8 @@ export const { setFilesPath, setResourcesPath, setUpdateState, - setWebDAVSyncState + setWebDAVSyncState, + setExportState } = runtimeSlice.actions export default runtimeSlice.reducer diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index d048ea6a..dca1ff74 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -65,6 +65,8 @@ export interface SettingsState { enableQuickAssistant: boolean clickTrayToShowQuickAssistant: boolean multiModelMessageStyle: MultiModelMessageStyle + notionDatabaseID: string | null + notionApiKey: string | null } export type MultiModelMessageStyle = 'horizontal' | 'vertical' | 'fold' @@ -115,7 +117,9 @@ const initialState: SettingsState = { narrowMode: false, enableQuickAssistant: false, clickTrayToShowQuickAssistant: false, - multiModelMessageStyle: 'fold' + multiModelMessageStyle: 'fold', + notionDatabaseID: '', + notionApiKey: '' } const settingsSlice = createSlice({ @@ -263,6 +267,12 @@ const settingsSlice = createSlice({ }, setMultiModelMessageStyle: (state, action: PayloadAction<'horizontal' | 'vertical' | 'fold'>) => { state.multiModelMessageStyle = action.payload + }, + setNotionDatabaseID: (state, action: PayloadAction) => { + state.notionDatabaseID = action.payload + }, + setNotionApiKey: (state, action: PayloadAction) => { + state.notionApiKey = action.payload } } }) @@ -312,7 +322,9 @@ export const { setNarrowMode, setClickTrayToShowQuickAssistant, setEnableQuickAssistant, - setMultiModelMessageStyle + setMultiModelMessageStyle, + setNotionDatabaseID, + setNotionApiKey } = settingsSlice.actions export default settingsSlice.reducer diff --git a/src/renderer/src/utils/export.ts b/src/renderer/src/utils/export.ts index 4cb562f4..c6804fe1 100644 --- a/src/renderer/src/utils/export.ts +++ b/src/renderer/src/utils/export.ts @@ -1,4 +1,8 @@ +import { Client } from '@notionhq/client' import db from '@renderer/databases' +import i18n from '@renderer/i18n' +import store from '@renderer/store' +import { setExportState } from '@renderer/store/runtime' import { Message, Topic } from '@renderer/types' export const messageToMarkdown = (message: Message) => { @@ -29,3 +33,56 @@ export const exportTopicAsMarkdown = async (topic: Topic) => { const markdown = await topicToMarkdown(topic) window.api.file.save(fileName, markdown) } + +export const exportTopicToNotion = async (topic: Topic) => { + const { isExporting } = store.getState().runtime.export + if (isExporting) { + window.message.warning({ content: i18n.t('message.warn.notion.exporting'), key: 'notion-exporting' }) + return + } + setExportState({ + isExporting: true + }) + const { notionDatabaseID, notionApiKey } = store.getState().settings + if (!notionApiKey || !notionDatabaseID) { + window.message.error({ content: i18n.t('message.error.notion.no_api_key'), key: 'notion-no-apikey-error' }) + return + } + try { + const notion = new Client({ auth: notionApiKey }); + const markdown = await topicToMarkdown(topic); + const requestBody = JSON.stringify({ md: markdown }) + + const res = await fetch('https://md2notion.hilars.dev', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: requestBody + }); + + const data = await res.json(); + const notionBlocks = data; + + const response = await notion.pages.create({ + parent: { database_id: notionDatabaseID }, + properties: { + Name: { + title: [{ text: { content: topic.name } }] + } + }, + children: notionBlocks // 使用转换后的块 + }); + + window.message.success({ content: i18n.t('message.success.notion.export'), key: 'notion-success' }) + return response + + } catch (error:any) { + window.message.error({ content: i18n.t('message.error.notion.export'), key: 'notion-error' }) + return null + } finally { + setExportState({ + isExporting: false + }) + } +}; diff --git a/yarn.lock b/yarn.lock index 228217df..5b64d1c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1776,6 +1776,16 @@ __metadata: languageName: node linkType: hard +"@notionhq/client@npm:^2.2.15": + version: 2.2.15 + resolution: "@notionhq/client@npm:2.2.15" + dependencies: + "@types/node-fetch": "npm:^2.5.10" + node-fetch: "npm:^2.6.1" + checksum: 10c0/4153c2e5b47d2ba141d025f2753d0e79ca9b9f25bd8bbdfa9dbf74fe4c2e157ea7964c59387d05163972c4575830bdc48d02db29270e244d81398df0f89fd7dd + languageName: node + linkType: hard + "@npmcli/agent@npm:^3.0.0": version: 3.0.0 resolution: "@npmcli/agent@npm:3.0.0" @@ -2640,7 +2650,7 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.6.4": +"@types/node-fetch@npm:^2.5.10, @types/node-fetch@npm:^2.6.4": version: 2.6.12 resolution: "@types/node-fetch@npm:2.6.12" dependencies: @@ -3011,6 +3021,7 @@ __metadata: "@llm-tools/embedjs-loader-web": "npm:^0.1.25" "@llm-tools/embedjs-loader-xml": "npm:^0.1.25" "@llm-tools/embedjs-openai": "npm:^0.1.25" + "@notionhq/client": "npm:^2.2.15" "@reduxjs/toolkit": "npm:^2.2.5" "@types/adm-zip": "npm:^0" "@types/fs-extra": "npm:^11" @@ -9845,7 +9856,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: From 4d13a8d9c26bf07ea38339f9524b9ec82a90c3e9 Mon Sep 17 00:00:00 2001 From: kshern Date: Tue, 11 Feb 2025 14:12:56 +0800 Subject: [PATCH 06/12] fix: retain selected model when regenerating message (#1382) * fix: retain selected model when regenerating message instead of reverting to default model * fix: use props model --------- Co-authored-by: Shern --- src/renderer/src/pages/home/Messages/MessageMenubar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 30b73b01..a354b0a9 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -197,7 +197,7 @@ const MessageMenubar: FC = (props) => { const onRegenerate = async () => { await modelGenerating() - const _message: Message = resetAssistantMessage(message, assistantModel) + const _message: Message = resetAssistantMessage(message, model || assistantModel) onEditMessage?.(_message) } From cb88a48d8bf0f2cf05a69ea305347934dc52d947 Mon Sep 17 00:00:00 2001 From: lucifer9 Date: Tue, 11 Feb 2025 16:21:20 +0800 Subject: [PATCH 07/12] feat: add support for clickable citations in message content (#1381) * Add support for clickable citations in message content * update format --- src/renderer/src/i18n/locales/en-us.json | 3 +- src/renderer/src/i18n/locales/ja-jp.json | 3 +- src/renderer/src/i18n/locales/ru-ru.json | 3 +- src/renderer/src/i18n/locales/zh-cn.json | 4 +- src/renderer/src/i18n/locales/zh-tw.json | 3 +- .../pages/home/Messages/MessageContent.tsx | 88 ++++++++++++++++++- src/renderer/src/providers/OpenAIProvider.ts | 6 +- src/renderer/src/providers/index.d.ts | 3 +- src/renderer/src/services/ApiService.ts | 12 ++- src/renderer/src/types/index.ts | 2 + 10 files changed, 115 insertions(+), 12 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 17f84628..1f3e9bd4 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -301,7 +301,8 @@ "error.notion.export": "Notion import failed", "error.notion.no_api_key": "Notion ApiKey or Notion DatabaseID is not configured", "success.notion.export": "Notion import successful", - "warn.notion.exporting": "Notion is importing, please do not import repeatedly" + "warn.notion.exporting": "Notion is importing, please do not import repeatedly", + "citations": "References" }, "minapp": { "title": "MinApp", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 37bd620b..093acb8f 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -295,7 +295,8 @@ "error.notion.export": "Notion インポートに失敗", "error.notion.no_api_key": "Notion ApiKey または Notion DatabaseID が設定されていません", "success.notion.export": "Notion へのインポートに成功", - "warn.notion.exporting": "Notion 正在インポート中です。重複インポートしないでください。" + "warn.notion.exporting": "Notion 正在インポート中です。重複インポートしないでください。", + "citations": "参考文献" }, "minapp": { "title": "ミニアプリ", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index d2a492b4..649d47f7 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -296,7 +296,8 @@ "error.notion.export": "Импорт в Notion не удался", "error.notion.no_api_key": "Notion ApiKey или Notion DatabaseID не настроен", "success.notion.export": "Импорт в Notion выполнен успешно", - "warn.notion.exporting": "Идет импорт в Notion, пожалуйста, не повторяйте импорт" + "warn.notion.exporting": "Идет импорт в Notion, пожалуйста, не повторяйте импорт", + "citations": "Источники" }, "minapp": { "title": "Встроенные приложения", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 1451bf27..e0803e51 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -302,8 +302,8 @@ "error.notion.export":"Notion 导入失败", "error.notion.no_api_key":"未配置Notion ApiKey或Notion DatabaseID", "success.notion.export":"导入Notion成功", - "warn.notion.exporting":"Notion正在导入,请勿重复导入" - + "warn.notion.exporting":"Notion正在导入,请勿重复导入", + "citations": "引用内容" }, "minapp": { "title": "小程序", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 58490eeb..ded256f1 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -301,7 +301,8 @@ "error.notion.export": "Notion 匯入失敗", "error.notion.no_api_key": "未配置 Notion ApiKey 或 Notion DatabaseID", "success.notion.export": "匯入 Notion 成功", - "warn.notion.exporting": "Notion 正在匯入,請勿重複匯入" + "warn.notion.exporting": "Notion 正在匯入,請勿重複匯入", + "citations": "參考文獻" }, "minapp": { "title": "小程序", diff --git a/src/renderer/src/pages/home/Messages/MessageContent.tsx b/src/renderer/src/pages/home/Messages/MessageContent.tsx index 8129cc0c..bf03a1c8 100644 --- a/src/renderer/src/pages/home/Messages/MessageContent.tsx +++ b/src/renderer/src/pages/home/Messages/MessageContent.tsx @@ -1,9 +1,9 @@ -import { SyncOutlined, TranslationOutlined } from '@ant-design/icons' +import { InfoCircleOutlined, SyncOutlined, TranslationOutlined } from '@ant-design/icons' import { Message, Model } from '@renderer/types' import { getBriefInfo } from '@renderer/utils' import { withMessageThought } from '@renderer/utils/formats' import { Divider, Flex } from 'antd' -import React, { Fragment } from 'react' +import React, { Fragment, useMemo } from 'react' import { useTranslation } from 'react-i18next' import BeatLoader from 'react-spinners/BeatLoader' import styled from 'styled-components' @@ -23,6 +23,40 @@ const MessageContent: React.FC = ({ message: _message, model }) => { const { t } = useTranslation() const message = withMessageThought(_message) + // Process content to make citation numbers clickable + const processedContent = useMemo(() => { + if (!message.content || !message.metadata?.citations) return message.content + + let content = message.content + const citations = message.metadata.citations + + // Convert [n] format to superscript numbers and make them clickable + content = content.replace(/\[(\d+)\]/g, (match, num) => { + const index = parseInt(num) - 1 + if (index >= 0 && index < citations.length) { + // Use tag for superscript and make it a link + return `[${num}](${citations[index]})` + } + return match + }) + + return content + }, [message.content, message.metadata?.citations]) + + // Format citations for display + const formattedCitations = useMemo(() => { + if (!message.metadata?.citations?.length) return null + + return message.metadata.citations.map((url, index) => { + try { + const hostname = new URL(url).hostname + return { number: index + 1, url, hostname } + } catch { + return { number: index + 1, url, hostname: url } + } + }) + }, [message.metadata?.citations]) + if (message.status === 'sending') { return ( @@ -46,7 +80,20 @@ const MessageContent: React.FC = ({ message: _message, model }) => { {message.mentions?.map((model) => {'@' + model.name})} - + + {formattedCitations && ( + + + {t('message.citations')} + + + {formattedCitations.map(({ number, url, hostname }) => ( + + {number}. {hostname} + + ))} + + )} {message.translatedContent && ( @@ -78,4 +125,39 @@ const MentionTag = styled.span` color: var(--color-link); ` +const CitationsContainer = styled.div` + background-color: rgb(242, 247, 253); + border-radius: 4px; + padding: 8px 12px; + margin: 12px 0; + display: flex; + flex-direction: column; + gap: 4px; + + body[theme-mode='dark'] & { + background-color: rgba(255, 255, 255, 0.05); + } +` + +const CitationsTitle = styled.div` + font-weight: 500; + margin-bottom: 4px; + color: var(--color-text-1); +` + +const CitationLink = styled.a` + font-size: 14px; + line-height: 1.6; + text-decoration: none; + color: var(--color-text-1); + + .hostname { + color: var(--color-link); + } + + &:hover { + text-decoration: underline; + } +` + export default React.memo(MessageContent) diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index 34ac9dd8..2e4837fc 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -243,6 +243,9 @@ export default class OpenAIProvider extends BaseProvider { const delta = chunk.choices[0]?.delta + // Extract citations from the raw response if available + const citations = (chunk as OpenAI.Chat.Completions.ChatCompletionChunk & { citations?: string[] })?.citations + onChunk({ text: delta?.content || '', // @ts-ignore key is not typed @@ -253,7 +256,8 @@ export default class OpenAIProvider extends BaseProvider { time_completion_millsec, time_first_token_millsec, time_thinking_millsec - } + }, + citations }) } } diff --git a/src/renderer/src/providers/index.d.ts b/src/renderer/src/providers/index.d.ts index 186a1002..f14f810d 100644 --- a/src/renderer/src/providers/index.d.ts +++ b/src/renderer/src/providers/index.d.ts @@ -7,11 +7,12 @@ interface ChunkCallbackData { usage?: OpenAI.Completions.CompletionUsage metrics?: Metrics search?: GroundingMetadata + citations?: string[] } interface CompletionsParams { messages: Message[] assistant: Assistant - onChunk: ({ text, reasoning_content, usage, metrics, search }: ChunkCallbackData) => void + onChunk: ({ text, reasoning_content, usage, metrics, search, citations }: ChunkCallbackData) => void onFilterMessages: (messages: Message[]) => void } diff --git a/src/renderer/src/services/ApiService.ts b/src/renderer/src/services/ApiService.ts index ee6e034b..86ae8ea4 100644 --- a/src/renderer/src/services/ApiService.ts +++ b/src/renderer/src/services/ApiService.ts @@ -52,12 +52,13 @@ export async function fetchChatCompletion({ try { let _messages: Message[] = [] + let isFirstChunk = true await AI.completions({ messages: filterUsefulMessages(messages), assistant, onFilterMessages: (messages) => (_messages = messages), - onChunk: ({ text, reasoning_content, usage, metrics, search }) => { + onChunk: ({ text, reasoning_content, usage, metrics, search, citations }) => { message.content = message.content + text || '' message.usage = usage message.metrics = metrics @@ -70,6 +71,15 @@ export async function fetchChatCompletion({ message.metadata = { groundingMetadata: search } } + // Handle citations from Perplexity API + if (isFirstChunk && citations) { + message.metadata = { + ...message.metadata, + citations + } + isFirstChunk = false + } + onResponse({ ...message, status: 'pending' }) } }) diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 07ca3531..978411aa 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -67,6 +67,8 @@ export type Message = { metadata?: { // Gemini groundingMetadata?: any + // Perplexity + citations?: string[] } askId?: string useful?: boolean From bae76f921b4ccbd0abbbf8e4500e8d17e5145f1a Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Tue, 11 Feb 2025 16:34:26 +0800 Subject: [PATCH 08/12] fix: upload button tooltip --- src/renderer/src/i18n/locales/en-us.json | 1 + src/renderer/src/i18n/locales/ja-jp.json | 1 + src/renderer/src/i18n/locales/ru-ru.json | 1 + src/renderer/src/i18n/locales/zh-cn.json | 7 ++++--- src/renderer/src/i18n/locales/zh-tw.json | 1 + src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx | 5 ++++- 6 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 1f3e9bd4..4baa36ec 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -88,6 +88,7 @@ "input.topics": " Topics ", "input.translate": "Translate to {{target_language}}", "input.upload": "Upload image or document file", + "input.upload.document": "Upload document file (model does not support images)", "input.web_search": "Enable web search", "input.knowledge_base": "Knowledge Base", "message.new.branch": "New Branch", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 093acb8f..8d1b136f 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -83,6 +83,7 @@ "input.topics": " トピック ", "input.translate": "{{target_language}}に翻訳", "input.upload": "画像またはドキュメントをアップロード", + "input.upload.document": "ドキュメントをアップロード(モデルは画像をサポートしません)", "input.web_search": "ウェブ検索を有効にする", "input.knowledge_base": "ナレッジベース", "message.new.branch": "新しいブランチ", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 649d47f7..df162710 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -83,6 +83,7 @@ "input.topics": " Топики ", "input.translate": "Перевести на {{target_language}}", "input.upload": "Загрузить изображение или документ", + "input.upload.document": "Загрузить документ (модель не поддерживает изображения)", "input.web_search": "Включить веб-поиск", "input.knowledge_base": "База знаний", "message.new.branch": "Новая ветка", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index e0803e51..be84485c 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -88,6 +88,7 @@ "input.topics": " 话题 ", "input.translate": "翻译成{{target_language}}", "input.upload": "上传图片或文档", + "input.upload.document": "上传文档(模型不支持图片)", "input.web_search": "开启网络搜索", "input.knowledge_base": "知识库", "message.new.branch": "分支", @@ -427,9 +428,9 @@ "webdav.noSync": "等待下次备份", "webdav.syncError": "备份错误", "webdav.lastSync": "上次备份时间", - "notion.api_key":"Notion 密钥", - "notion.database_id":"Notion 数据库ID", - "notion.title":"Notion 配置" + "notion.api_key": "Notion 密钥", + "notion.database_id": "Notion 数据库ID", + "notion.title": "Notion 配置" }, "quickAssistant": { "title": "快捷助手", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index ded256f1..7cebe4ac 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -88,6 +88,7 @@ "input.topics": " 話題 ", "input.translate": "翻譯成{{target_language}}", "input.upload": "上傳圖片或文檔", + "input.upload.document": "上傳文檔(模型不支持圖片)", "input.web_search": "開啟網路搜索", "input.knowledge_base": "知識庫", "message.new.branch": "分支", diff --git a/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx b/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx index ac1418e9..49c391e3 100644 --- a/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx @@ -37,7 +37,10 @@ const AttachmentButton: FC = ({ model, files, setFiles, ToolbarButton, di } return ( - + From 220046cc9566cc7401676e92664295e40016d7b6 Mon Sep 17 00:00:00 2001 From: Trey Dong <1346650911@qq.com> Date: Tue, 11 Feb 2025 16:51:58 +0800 Subject: [PATCH 09/12] feat: add pin topic feature (#1408) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 新增导出至Notion的选项 * fix:添加多语言支持 * fix:添加提示语的多语言支持,以及防止重复导入的状态 * fix:修复多语言错误及调整UI样式统一 * feat:添加话题固定功能 --- src/renderer/src/i18n/locales/en-us.json | 2 ++ src/renderer/src/i18n/locales/ja-jp.json | 2 ++ src/renderer/src/i18n/locales/ru-ru.json | 2 ++ src/renderer/src/i18n/locales/zh-cn.json | 2 ++ src/renderer/src/i18n/locales/zh-tw.json | 2 ++ .../src/pages/home/Tabs/TopicsTab.tsx | 33 ++++++++++++++----- src/renderer/src/types/index.ts | 1 + 7 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 4baa36ec..97d3be10 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -119,6 +119,8 @@ "topics.export.notion": "Export to Notion", "topics.export.md": "Export as markdown", "topics.export.title": "Export", + "topics.pinned": "Pinned Topics", + "topics.unpinned": "Unpinned Topics", "topics.export.word": "Export as Word", "topics.list": "Topic List", "topics.move_to": "Move to", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 8d1b136f..9dc709a3 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -117,6 +117,8 @@ "topics.export.word": "Wordとしてエクスポート", "topics.list": "トピックリスト", "topics.move_to": "移動先", + "topics.pinned": "トピックを固定", + "topics.unpinned": "固定解除", "topics.title": "トピック", "translate": "翻訳", "resend": "再送信", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index df162710..ae8550d9 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -117,6 +117,8 @@ "topics.export.word": "Экспорт как Word", "topics.list": "Список топиков", "topics.move_to": "Переместить в", + "topics.pinned": "Закрепленные темы", + "topics.unpinned": "Открепленные темы", "topics.title": "Топики", "translate": "Перевести", "resend": "Переотправить", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index be84485c..b53eee1d 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -123,6 +123,8 @@ "topics.list": "话题列表", "topics.move_to": "移动到", "topics.title": "话题", + "topics.pinned":"固定话题", + "topics.unpinned":"取消固定", "translate": "翻译", "resend": "重新发送", "thinking": "思考中", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 7cebe4ac..c7a96174 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -123,6 +123,8 @@ "topics.list": "話題列表", "topics.move_to": "移動到", "topics.title": "話題", + "topics.pinned": "固定話題", + "topics.unpinned": "取消固定", "translate": "翻譯", "resend": "重新發送", "thinking": "思考中", diff --git a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx index 1dfeb435..d3338e1c 100644 --- a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx @@ -4,8 +4,8 @@ import { DeleteOutlined, EditOutlined, FolderOutlined, - UploadOutlined -} from '@ant-design/icons' + PushpinOutlined, + UploadOutlined} from '@ant-design/icons' import DragableList from '@renderer/components/DragableList' import PromptPopup from '@renderer/components/Popups/PromptPopup' import Scrollbar from '@renderer/components/Scrollbar' @@ -40,6 +40,14 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic const borderRadius = showTopicTime ? 12 : 'var(--list-item-border-radius)' + const onPinTopic = useCallback( + (topic: Topic) => { + const updatedTopic = { ...topic, pinned: !topic.pinned } + updateTopic(updatedTopic) + }, + [updateTopic] + ) + const onDeleteTopic = useCallback( async (topic: Topic) => { await modelGenerating() @@ -106,6 +114,14 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic } } }, + { + label: topic.pinned ? t('chat.topics.unpinned') : t('chat.topics.pinned'), + key: 'pin', + icon: , + onClick() { + onPinTopic(topic) + } + }, { label: t('chat.topics.clear.title'), key: 'clear-messages', @@ -166,7 +182,7 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic }) } - if (assistant.topics.length > 1) { + if (assistant.topics.length > 1 && !topic.pinned) { menus.push({ type: 'divider' }) menus.push({ label: t('common.delete'), @@ -179,7 +195,7 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic return menus }, - [assistant, assistants, onClearMessages, onDeleteTopic, onMoveTopic, t, updateTopic] + [assistant, assistants, onClearMessages, onPinTopic, onDeleteTopic, onMoveTopic, t, updateTopic] ) return ( @@ -197,14 +213,15 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic {showTopicTime && ( {dayjs(topic.createdAt).format('MM/DD HH:mm')} )} - {isActive && ( + {topic.pinned && } + {isActive && !topic.pinned && ( { e.stopPropagation() - if (assistant.topics.length === 1) { - return onClearMessages() - } + if (assistant.topics.length === 1) { + return onClearMessages() + } onDeleteTopic(topic) }}> diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 978411aa..f58dacf5 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -89,6 +89,7 @@ export type Topic = { createdAt: string updatedAt: string messages: Message[] + pinned?: boolean } export type User = { From de1976d984cbc891c53955eea4d011977f2fa958 Mon Sep 17 00:00:00 2001 From: linauror Date: Tue, 11 Feb 2025 18:05:09 +0800 Subject: [PATCH 10/12] =?UTF-8?q?fix:=E9=92=88=E5=AF=B9=E6=80=9D=E8=80=83?= =?UTF-8?q?=E7=B1=BB=E6=A8=A1=E5=9E=8B=E7=9A=84=E8=BF=94=E5=9B=9E=EF=BC=8C?= =?UTF-8?q?=E6=80=BB=E7=BB=93=E6=A0=87=E9=A2=98=E4=BB=85=E6=88=AA=E5=8F=96?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E7=9A=84=E5=86=85=E5=AE=B9=20(#1415)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/providers/OpenAIProvider.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index 2e4837fc..c3c3c75c 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -341,7 +341,11 @@ export default class OpenAIProvider extends BaseProvider { max_tokens: 1000 }) - return removeSpecialCharacters(response.choices[0].message?.content?.substring(0, 50) || '') + // 针对思考类模型的返回,总结仅截取之后的内容 + let content = response.choices[0].message?.content || '' + content = content.replace(/^(.*?)<\/think>/s, '') + + return removeSpecialCharacters(content.substring(0, 50)) } public async generateText({ prompt, content }: { prompt: string; content: string }): Promise { From 13e48411c1d29538b30141aa332b163ace2a899b Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Tue, 11 Feb 2025 22:35:17 +0800 Subject: [PATCH 11/12] chore: Update embedjs dependencies to version 0.1.28 --- ...embedjs-libsql-npm-0.1.25-fad000d74c.patch | 25 -- ...ader-markdown-npm-0.1.28-81647ffac6.patch} | 12 +- ...tools-embedjs-npm-0.1.28-8e4393fa2d.patch} | 113 +++------ ...-embedjs-utils-npm-0.1.25-fd8fe8a193.patch | 54 ----- package.json | 21 +- yarn.lock | 221 +++++++++--------- 6 files changed, 149 insertions(+), 297 deletions(-) delete mode 100644 .yarn/patches/@llm-tools-embedjs-libsql-npm-0.1.25-fad000d74c.patch rename .yarn/patches/{@llm-tools-embedjs-loader-markdown-npm-0.1.25-d1d536d640.patch => @llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch} (54%) rename .yarn/patches/{@llm-tools-embedjs-npm-0.1.25-ec5645cf36.patch => @llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch} (72%) delete mode 100644 .yarn/patches/@llm-tools-embedjs-utils-npm-0.1.25-fd8fe8a193.patch diff --git a/.yarn/patches/@llm-tools-embedjs-libsql-npm-0.1.25-fad000d74c.patch b/.yarn/patches/@llm-tools-embedjs-libsql-npm-0.1.25-fad000d74c.patch deleted file mode 100644 index 1bd47e08..00000000 --- a/.yarn/patches/@llm-tools-embedjs-libsql-npm-0.1.25-fad000d74c.patch +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/src/libsql-db.js b/src/libsql-db.js -index 58c42e4910bd0e53bc497ff9b9702b1f7a961266..250bc97c50a9b790e8798441d904d040f2d2af43 100644 ---- a/src/libsql-db.js -+++ b/src/libsql-db.js -@@ -41,9 +41,9 @@ export class LibSqlDb { - } - async similaritySearch(query, k) { - const statement = `SELECT id, pageContent, uniqueLoaderId, source, metadata, -- vector_distance_cos(vector, vector32('[${query.join(',')}]')) -+ vector_distance_cos(vector, vector32('[${query.join(',')}]')) as distance - FROM ${this.tableName} -- ORDER BY vector_distance_cos(vector, vector32('[${query.join(',')}]')) ASC -+ ORDER BY distance ASC - LIMIT ${k};`; - this.debug(`Executing statement - ${truncateCenterString(statement, 700)}`); - const results = await this.client.execute(statement); -@@ -52,7 +52,7 @@ export class LibSqlDb { - return { - metadata, - pageContent: result.pageContent.toString(), -- score: 1, -+ score: 1 - result.distance, - }; - }); - } diff --git a/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.25-d1d536d640.patch b/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch similarity index 54% rename from .yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.25-d1d536d640.patch rename to .yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch index 7e9bb041..106b45a1 100644 --- a/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.25-d1d536d640.patch +++ b/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch @@ -1,16 +1,10 @@ diff --git a/src/markdown-loader.js b/src/markdown-loader.js -index 8a17cb7f5a68d90d2be21682db6e95ce22a3e71c..9ee868ef9d4ff3dc914b3abc3c8006deb1e9c6c6 100644 +index eaf30b114a273e68abbb92c8b07018495e63f4cb..4b06519bdb51845e4693fe877da9de01c7a81039 100644 --- a/src/markdown-loader.js +++ b/src/markdown-loader.js -@@ -1,5 +1,4 @@ - import { micromark } from 'micromark'; --import { mdxJsx } from 'micromark-extension-mdx-jsx'; - import { gfmHtml, gfm } from 'micromark-extension-gfm'; - import createDebugMessages from 'debug'; - import fs from 'node:fs'; -@@ -21,7 +20,7 @@ export class MarkdownLoader extends BaseLoader { +@@ -21,7 +21,7 @@ export class MarkdownLoader extends BaseLoader { ? (await getSafe(this.filePathOrUrl, { format: 'buffer' })).body - : await stream2buffer(fs.createReadStream(this.filePathOrUrl)); + : await streamToBuffer(fs.createReadStream(this.filePathOrUrl)); this.debug('MarkdownLoader stream created'); - const result = micromark(buffer, { extensions: [gfm(), mdxJsx()], htmlExtensions: [gfmHtml()] }); + const result = micromark(buffer, { extensions: [gfm()], htmlExtensions: [gfmHtml()] }); diff --git a/.yarn/patches/@llm-tools-embedjs-npm-0.1.25-ec5645cf36.patch b/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch similarity index 72% rename from .yarn/patches/@llm-tools-embedjs-npm-0.1.25-ec5645cf36.patch rename to .yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch index 4d853dd6..153681e5 100644 --- a/.yarn/patches/@llm-tools-embedjs-npm-0.1.25-ec5645cf36.patch +++ b/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch @@ -1,72 +1,21 @@ -diff --git a/src/core/rag-embedding.js b/src/core/rag-embedding.js -index 50c3c4064af17bc4c7c46554d8f2419b3afceb0e..632c9b2e04d2e0e3bb09ef1cd8f29d2560e6afc1 100644 ---- a/src/core/rag-embedding.js -+++ b/src/core/rag-embedding.js -@@ -1,10 +1,8 @@ - export class RAGEmbedding { - static singleton; - static async init(embeddingModel) { -- if (!this.singleton) { -- await embeddingModel.init(); -- this.singleton = new RAGEmbedding(embeddingModel); -- } -+ await embeddingModel.init(); -+ this.singleton = new RAGEmbedding(embeddingModel); - } - static getInstance() { - return RAGEmbedding.singleton; diff --git a/src/loaders/local-path-loader.d.ts b/src/loaders/local-path-loader.d.ts -index 48c20e68c469cd309be2dc8f28e44c1bd04a26e9..87002be39e7305a02e2a607b0c0d95cbbc359f9d 100644 +index 48c20e68c469cd309be2dc8f28e44c1bd04a26e9..1c16d83bcbf9b7140292793d6cbb8c04281949d9 100644 --- a/src/loaders/local-path-loader.d.ts +++ b/src/loaders/local-path-loader.d.ts -@@ -1,19 +1,29 @@ --import { BaseLoader } from '@llm-tools/embedjs-interfaces'; -+import { BaseLoader } from "@llm-tools/embedjs-interfaces"; - export declare class LocalPathLoader extends BaseLoader<{ -- type: 'LocalPathLoader'; -+ type: "LocalPathLoader"; +@@ -4,8 +4,10 @@ export declare class LocalPathLoader extends BaseLoader<{ }> { -- private readonly debug; -- private readonly path; + private readonly debug; + private readonly path; - constructor({ path }: { -- path: string; -- }); -- getUnfilteredChunks(): AsyncGenerator<{ -- metadata: { -- type: "LocalPathLoader"; -- originalPath: string; -- source: string; -- }; -- pageContent: string; -- }, void, unknown>; -- private recursivelyAddPath; -+ private readonly debug; -+ private readonly path; -+ constructor({ -+ path, -+ chunkSize, -+ chunkOverlap, -+ }: { -+ path: string; -+ chunkSize?: number; -+ chunkOverlap?: number; -+ }); -+ getUnfilteredChunks(): AsyncGenerator< -+ { -+ metadata: { -+ type: "LocalPathLoader"; -+ originalPath: string; -+ source: string; -+ }; -+ pageContent: string; -+ }, -+ void, -+ unknown -+ >; -+ private recursivelyAddPath; - } ++ constructor({ path, chunkSize, chunkOverlap }: { + path: string; ++ chunkSize?: number; ++ chunkOverlap?: number; + }); + getUnfilteredChunks(): AsyncGenerator<{ + metadata: { diff --git a/src/loaders/local-path-loader.js b/src/loaders/local-path-loader.js -index 4cf8a6bd1d890244c8ec49d4a05ee3bd58861c79..fd0fe1951c73da315b0c9bf4a8f33effbadb9f8f 100644 +index 4cf8a6bd1d890244c8ec49d4a05ee3bd58861c79..ec8215b01195a21ef20f3c5d56ecc99f186bb596 100644 --- a/src/loaders/local-path-loader.js +++ b/src/loaders/local-path-loader.js @@ -8,8 +8,8 @@ import { BaseLoader } from '@llm-tools/embedjs-interfaces'; @@ -75,7 +24,7 @@ index 4cf8a6bd1d890244c8ec49d4a05ee3bd58861c79..fd0fe1951c73da315b0c9bf4a8f33eff path; - constructor({ path }) { - super(`LocalPathLoader_${md5(path)}`, { path }); -+ constructor({ path, chunkSize, chunkOverlap}) { ++ constructor({ path, chunkSize, chunkOverlap }) { + super(`LocalPathLoader_${md5(path)}`, { path }, chunkSize ?? 1000, chunkOverlap ?? 0); this.path = path; } @@ -95,21 +44,15 @@ index 4cf8a6bd1d890244c8ec49d4a05ee3bd58861c79..fd0fe1951c73da315b0c9bf4a8f33eff yield { pageContent: result.pageContent, diff --git a/src/util/mime.d.ts b/src/util/mime.d.ts -index 57f56a1b8edc98366af9f84d671676c41c2f01ca..f53856fa9c78afbeee9e085c7ed0b3a131f8ee5a 100644 +index 57f56a1b8edc98366af9f84d671676c41c2f01ca..14be3b5727cff6eb1978838045e9a788f8f53bfb 100644 --- a/src/util/mime.d.ts +++ b/src/util/mime.d.ts -@@ -1,2 +1,7 @@ --import { BaseLoader } from '@llm-tools/embedjs-interfaces'; +@@ -1,2 +1,2 @@ + import { BaseLoader } from '@llm-tools/embedjs-interfaces'; -export declare function createLoaderFromMimeType(loaderData: string, mimeType: string): Promise; -+import { BaseLoader } from "@llm-tools/embedjs-interfaces"; -+export declare function createLoaderFromMimeType( -+ loaderData: string, -+ mimeType: string, -+ chunkSize?: number, -+ chunkOverlap?: number -+): Promise; ++export declare function createLoaderFromMimeType(loaderData: string, mimeType: string, chunkSize?: number, chunkOverlap?: number): Promise; diff --git a/src/util/mime.js b/src/util/mime.js -index 9af30bd5b8cf42985f547073a4c19756292c33a3..54ae20343131a533ab70236d3060b6accc8f6126 100644 +index b6426a859968e2bf6206795f70333e90ae27aeb7..16ae2adb863f8d7abfa757f1c5cc39f6bb1c44fa 100644 --- a/src/util/mime.js +++ b/src/util/mime.js @@ -1,7 +1,9 @@ @@ -117,7 +60,7 @@ index 9af30bd5b8cf42985f547073a4c19756292c33a3..54ae20343131a533ab70236d3060b6ac import createDebugMessages from 'debug'; import { TextLoader } from '../loaders/text-loader.js'; -export async function createLoaderFromMimeType(loaderData, mimeType) { -+import fs from 'node:fs'; ++import fs from 'node:fs' + +export async function createLoaderFromMimeType(loaderData, mimeType, chunkSize, chunkOverlap) { createDebugMessages('embedjs:util:createLoaderFromMimeType')(`Incoming mime type '${mimeType}'`); @@ -137,7 +80,7 @@ index 9af30bd5b8cf42985f547073a4c19756292c33a3..54ae20343131a533ab70236d3060b6ac }); createDebugMessages('embedjs:util:createLoaderFromMimeType')('Dynamically imported ExcelLoader'); - return new ExcelLoader({ filePathOrUrl: loaderData }); -+ return new ExcelLoader({ filePathOrUrl: loaderData, chunkSize, chunkOverlap }); ++ return new ExcelLoader({ filePathOrUrl: loaderData, chunkSize, chunkOverlap }); } case 'application/pdf': { const { PdfLoader } = await import('@llm-tools/embedjs-loader-pdf').catch(() => { @@ -157,19 +100,17 @@ index 9af30bd5b8cf42985f547073a4c19756292c33a3..54ae20343131a533ab70236d3060b6ac } case 'text/plain': { const fineType = mime.getType(loaderData); -@@ -42,24 +44,26 @@ export async function createLoaderFromMimeType(loaderData, mimeType) { +@@ -42,24 +44,24 @@ export async function createLoaderFromMimeType(loaderData, mimeType) { throw new Error('Package `@llm-tools/embedjs-loader-csv` needs to be installed to load CSV files'); }); createDebugMessages('embedjs:util:createLoaderFromMimeType')('Dynamically imported CsvLoader'); - return new CsvLoader({ filePathOrUrl: loaderData }); + return new CsvLoader({ filePathOrUrl: loaderData, chunkSize, chunkOverlap }); -+ } -+ else{ -+ const content = fs.readFileSync(loaderData, 'utf-8'); -+ return new TextLoader({ text: content, chunkSize, chunkOverlap }); } - else - return new TextLoader({ text: loaderData }); ++ const content = fs.readFileSync(loaderData, 'utf-8'); ++ return new TextLoader({ text: content, chunkSize, chunkOverlap }); } case 'application/csv': { const { CsvLoader } = await import('@llm-tools/embedjs-loader-csv').catch(() => { @@ -189,7 +130,7 @@ index 9af30bd5b8cf42985f547073a4c19756292c33a3..54ae20343131a533ab70236d3060b6ac } case 'text/xml': { const { SitemapLoader } = await import('@llm-tools/embedjs-loader-sitemap').catch(() => { -@@ -67,14 +71,14 @@ export async function createLoaderFromMimeType(loaderData, mimeType) { +@@ -67,14 +69,14 @@ export async function createLoaderFromMimeType(loaderData, mimeType) { }); createDebugMessages('embedjs:util:createLoaderFromMimeType')('Dynamically imported SitemapLoader'); if (await SitemapLoader.test(loaderData)) { @@ -206,12 +147,12 @@ index 9af30bd5b8cf42985f547073a4c19756292c33a3..54ae20343131a533ab70236d3060b6ac } case 'text/x-markdown': case 'text/markdown': { -@@ -82,7 +86,7 @@ export async function createLoaderFromMimeType(loaderData, mimeType) { +@@ -82,7 +84,7 @@ export async function createLoaderFromMimeType(loaderData, mimeType) { throw new Error('Package `@llm-tools/embedjs-loader-markdown` needs to be installed to load markdown files'); }); createDebugMessages('embedjs:util:createLoaderFromMimeType')('Dynamically imported MarkdownLoader'); - return new MarkdownLoader({ filePathOrUrl: loaderData }); + return new MarkdownLoader({ filePathOrUrl: loaderData, chunkSize, chunkOverlap }); } - case undefined: - throw new Error(`MIME type could not be detected. Please file an issue if you think this is a bug.`); + case 'image/png': + case 'image/jpeg': { diff --git a/.yarn/patches/@llm-tools-embedjs-utils-npm-0.1.25-fd8fe8a193.patch b/.yarn/patches/@llm-tools-embedjs-utils-npm-0.1.25-fd8fe8a193.patch deleted file mode 100644 index dcb04230..00000000 --- a/.yarn/patches/@llm-tools-embedjs-utils-npm-0.1.25-fd8fe8a193.patch +++ /dev/null @@ -1,54 +0,0 @@ -diff --git a/src/util/strings.cjs b/src/util/strings.cjs -index 9933cc6e3866c476b47342a29ddb206eb90fa4a5..2965c4f2808bf94af9ef3e2ec889e5552e30e6ae 100644 ---- a/src/util/strings.cjs -+++ b/src/util/strings.cjs -@@ -38,13 +38,16 @@ function toTitleCase(str) { - }); - } - function isValidURL(url) { -- try { -- new URL(url); -- return true; -- } -- catch { -- return false; -+ if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('ftp://')) { -+ try { -+ new URL(url); -+ return true; -+ } -+ catch { -+ return false; -+ } - } -+ return false; - } - function isValidJson(str) { - try { -diff --git a/src/util/strings.js b/src/util/strings.js -index f5c1655512099b880fc5022e95d5e0c4d1d073f2..1a64bd662a22efd2effd9d2846ffcf0b93391963 100644 ---- a/src/util/strings.js -+++ b/src/util/strings.js -@@ -29,13 +29,16 @@ export function toTitleCase(str) { - }); - } - export function isValidURL(url) { -- try { -- new URL(url); -- return true; -- } -- catch { -- return false; -+ if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('ftp://')) { -+ try { -+ new URL(url); -+ return true; -+ } -+ catch { -+ return false; -+ } - } -+ return false; - } - export function isValidJson(str) { - try { diff --git a/package.json b/package.json index 4ce988d6..a22da7fd 100644 --- a/package.json +++ b/package.json @@ -51,16 +51,16 @@ "@electron-toolkit/utils": "^3.0.0", "@electron/notarize": "^2.5.0", "@google/generative-ai": "^0.21.0", - "@llm-tools/embedjs": "patch:@llm-tools/embedjs@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.25-ec5645cf36.patch", - "@llm-tools/embedjs-libsql": "patch:@llm-tools/embedjs-libsql@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-libsql-npm-0.1.25-fad000d74c.patch", - "@llm-tools/embedjs-loader-csv": "^0.1.25", - "@llm-tools/embedjs-loader-markdown": "patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.25-d1d536d640.patch", - "@llm-tools/embedjs-loader-msoffice": "^0.1.25", - "@llm-tools/embedjs-loader-pdf": "^0.1.25", - "@llm-tools/embedjs-loader-sitemap": "^0.1.25", - "@llm-tools/embedjs-loader-web": "^0.1.25", - "@llm-tools/embedjs-loader-xml": "^0.1.25", - "@llm-tools/embedjs-openai": "^0.1.25", + "@llm-tools/embedjs": "patch:@llm-tools/embedjs@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch", + "@llm-tools/embedjs-libsql": "^0.1.28", + "@llm-tools/embedjs-loader-csv": "^0.1.28", + "@llm-tools/embedjs-loader-markdown": "patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch", + "@llm-tools/embedjs-loader-msoffice": "^0.1.28", + "@llm-tools/embedjs-loader-pdf": "^0.1.28", + "@llm-tools/embedjs-loader-sitemap": "^0.1.28", + "@llm-tools/embedjs-loader-web": "^0.1.28", + "@llm-tools/embedjs-loader-xml": "^0.1.28", + "@llm-tools/embedjs-openai": "^0.1.28", "@notionhq/client": "^2.2.15", "@types/react-infinite-scroll-component": "^5.0.0", "adm-zip": "^0.5.16", @@ -152,7 +152,6 @@ }, "resolutions": { "pdf-parse@npm:1.1.1": "patch:pdf-parse@npm%3A1.1.1#~/.yarn/patches/pdf-parse-npm-1.1.1-04a6109b2a.patch", - "@llm-tools/embedjs-utils@npm:0.1.25": "patch:@llm-tools/embedjs-utils@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-utils-npm-0.1.25-fd8fe8a193.patch", "@langchain/openai@npm:^0.3.16": "patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch", "@langchain/openai@npm:>=0.1.0 <0.4.0": "patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch" }, diff --git a/yarn.lock b/yarn.lock index 5b64d1c9..9bef3a46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1321,7 +1321,7 @@ __metadata: languageName: node linkType: hard -"@langchain/core@npm:^0.3.25, @langchain/core@npm:^0.3.26": +"@langchain/core@npm:^0.3.26": version: 0.3.27 resolution: "@langchain/core@npm:0.3.27" dependencies: @@ -1355,6 +1355,20 @@ __metadata: languageName: node linkType: hard +"@langchain/openai@npm:>=0.1.0 <0.5.0": + version: 0.4.3 + resolution: "@langchain/openai@npm:0.4.3" + dependencies: + js-tiktoken: "npm:^1.0.12" + openai: "npm:^4.77.0" + zod: "npm:^3.22.4" + zod-to-json-schema: "npm:^3.22.3" + peerDependencies: + "@langchain/core": ">=0.3.39 <0.4.0" + checksum: 10c0/796427ae6fb5dcdd7a4f38a5f295ef265da3bdd7ab79e2cfe94ecf9e33c5596f4a30c649f29f19079b20742f4036af354b91ff7c243a4c183919f8a78e999c64 + languageName: node + linkType: hard + "@langchain/openai@patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch": version: 0.3.16 resolution: "@langchain/openai@patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch::version=0.3.16&hash=642f39" @@ -1480,18 +1494,6 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-interfaces@npm:0.1.25": - version: 0.1.25 - resolution: "@llm-tools/embedjs-interfaces@npm:0.1.25" - dependencies: - "@langchain/core": "npm:^0.3.25" - debug: "npm:^4.4.0" - md5: "npm:^2.3.0" - uuid: "npm:^11.0.3" - checksum: 10c0/0aea17be12d659a73425c3c7b879c658fda3f9d4bcc207f3df8a5be06386013a4ebc29fbefb00e6bb0b021f06f7daad4bccb3cfa708a027974fe48739c5d8bf3 - languageName: node - linkType: hard - "@llm-tools/embedjs-interfaces@npm:0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-interfaces@npm:0.1.28" @@ -1504,31 +1506,19 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-libsql@npm:0.1.25": - version: 0.1.25 - resolution: "@llm-tools/embedjs-libsql@npm:0.1.25" +"@llm-tools/embedjs-libsql@npm:^0.1.28": + version: 0.1.28 + resolution: "@llm-tools/embedjs-libsql@npm:0.1.28" dependencies: "@libsql/client": "npm:^0.14.0" - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - "@llm-tools/embedjs-utils": "npm:0.1.25" + "@llm-tools/embedjs-interfaces": "npm:0.1.28" + "@llm-tools/embedjs-utils": "npm:0.1.28" debug: "npm:^4.4.0" - checksum: 10c0/7a21019ed4d7cb1f8eb21ae9015c31b2e9d5ee517e741b88d5660fb322fc0d6bc163070034036c58e0fc67437dd39aeb3aa30b9874ef1dd553a3c5a2c5bbbe55 + checksum: 10c0/ec2c50d89a9d601618d153839fc1545bef38a8a7475f2b6ed21a5d876d7964b958950872df64719a3a851a6d48a3a613233c854a091726ebdf2d992c1fdadf7f languageName: node linkType: hard -"@llm-tools/embedjs-libsql@patch:@llm-tools/embedjs-libsql@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-libsql-npm-0.1.25-fad000d74c.patch": - version: 0.1.25 - resolution: "@llm-tools/embedjs-libsql@patch:@llm-tools/embedjs-libsql@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-libsql-npm-0.1.25-fad000d74c.patch::version=0.1.25&hash=769e98" - dependencies: - "@libsql/client": "npm:^0.14.0" - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - "@llm-tools/embedjs-utils": "npm:0.1.25" - debug: "npm:^4.4.0" - checksum: 10c0/83113c33249fdb391b01d56a1e9078ec65315e60dbe6097187acc3685377edb16d9c07c6a26ef043c145f2b851868da8dfe2808555aa57a5e1a9aaf9d9b734f2 - languageName: node - linkType: hard - -"@llm-tools/embedjs-loader-csv@npm:^0.1.25": +"@llm-tools/embedjs-loader-csv@npm:^0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-loader-csv@npm:0.1.28" dependencies: @@ -1541,37 +1531,37 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-loader-markdown@npm:0.1.25": - version: 0.1.25 - resolution: "@llm-tools/embedjs-loader-markdown@npm:0.1.25" +"@llm-tools/embedjs-loader-markdown@npm:0.1.28": + version: 0.1.28 + resolution: "@llm-tools/embedjs-loader-markdown@npm:0.1.28" dependencies: - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - "@llm-tools/embedjs-loader-web": "npm:0.1.25" + "@llm-tools/embedjs-interfaces": "npm:0.1.28" + "@llm-tools/embedjs-loader-web": "npm:0.1.28" debug: "npm:^4.4.0" md5: "npm:^2.3.0" micromark: "npm:^4.0.1" micromark-extension-gfm: "npm:^3.0.0" micromark-extension-mdx-jsx: "npm:^3.0.1" - checksum: 10c0/9cc540a654ece8d108766962017225167d324c40fd1911b1ccd5b749820a3b4e475ca008ef02fc0094bf698de6a87cda672168c4741d2aabb549380b0b64937c + checksum: 10c0/deb86848c57cdaf1aa89cd3382505aa4cc53c170d68105a97da1f6ebaff508ed6db1f164004ae1e0426266c29e15435a5bc092eb37ca4fb81ee574940daf1c0e languageName: node linkType: hard -"@llm-tools/embedjs-loader-markdown@patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.25-d1d536d640.patch": - version: 0.1.25 - resolution: "@llm-tools/embedjs-loader-markdown@patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.25-d1d536d640.patch::version=0.1.25&hash=3a7d12" +"@llm-tools/embedjs-loader-markdown@patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch": + version: 0.1.28 + resolution: "@llm-tools/embedjs-loader-markdown@patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch::version=0.1.28&hash=9c7dea" dependencies: - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - "@llm-tools/embedjs-loader-web": "npm:0.1.25" + "@llm-tools/embedjs-interfaces": "npm:0.1.28" + "@llm-tools/embedjs-loader-web": "npm:0.1.28" debug: "npm:^4.4.0" md5: "npm:^2.3.0" micromark: "npm:^4.0.1" micromark-extension-gfm: "npm:^3.0.0" micromark-extension-mdx-jsx: "npm:^3.0.1" - checksum: 10c0/8e91a1260f8c94ec516be13a5105055bf140b5c63a85fa3c7641cc8f6799a0410ddb6bce61db858e91712f7dbc2b333269eb7c3ce813c1d95416f49f4f4f31a5 + checksum: 10c0/4be7354294c9cc1ee5b93e0bf49a218894e5a0ad63f344300a9277751fb7517d7ff9ab51594eb63f548d303cec0c747507a5df29bd92deb506bf9829f1675f67 languageName: node linkType: hard -"@llm-tools/embedjs-loader-msoffice@npm:^0.1.25": +"@llm-tools/embedjs-loader-msoffice@npm:^0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-loader-msoffice@npm:0.1.28" dependencies: @@ -1584,7 +1574,7 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-loader-pdf@npm:^0.1.25": +"@llm-tools/embedjs-loader-pdf@npm:^0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-loader-pdf@npm:0.1.28" dependencies: @@ -1597,7 +1587,7 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-loader-sitemap@npm:^0.1.25": +"@llm-tools/embedjs-loader-sitemap@npm:^0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-loader-sitemap@npm:0.1.28" dependencies: @@ -1610,21 +1600,7 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-loader-web@npm:0.1.25": - version: 0.1.25 - resolution: "@llm-tools/embedjs-loader-web@npm:0.1.25" - dependencies: - "@langchain/textsplitters": "npm:^0.1.0" - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - "@llm-tools/embedjs-utils": "npm:0.1.25" - debug: "npm:^4.4.0" - html-to-text: "npm:^9.0.5" - md5: "npm:^2.3.0" - checksum: 10c0/abbf9cc252fb928745a04152fedafc03c07eef03190e10cca830dc41e8a24b35055cb2a9011633311dcf069ffa111582b65c592e1a0ce0ae84f1b4d5e468d8b2 - languageName: node - linkType: hard - -"@llm-tools/embedjs-loader-web@npm:0.1.28, @llm-tools/embedjs-loader-web@npm:^0.1.25": +"@llm-tools/embedjs-loader-web@npm:0.1.28, @llm-tools/embedjs-loader-web@npm:^0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-loader-web@npm:0.1.28" dependencies: @@ -1638,7 +1614,7 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-loader-xml@npm:^0.1.25": +"@llm-tools/embedjs-loader-xml@npm:^0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-loader-xml@npm:0.1.28" dependencies: @@ -1650,7 +1626,7 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-openai@npm:^0.1.25": +"@llm-tools/embedjs-openai@npm:^0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-openai@npm:0.1.28" dependencies: @@ -1662,15 +1638,6 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-utils@npm:0.1.25": - version: 0.1.25 - resolution: "@llm-tools/embedjs-utils@npm:0.1.25" - dependencies: - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - checksum: 10c0/8220181ac574e1088562f1c7913709806e6558ab02a535b888abd6267a4a03f9a45984998fddf07b4930c91a7f829458754f1da7488f453aee824de08958705a - languageName: node - linkType: hard - "@llm-tools/embedjs-utils@npm:0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-utils@npm:0.1.28" @@ -1680,44 +1647,35 @@ __metadata: languageName: node linkType: hard -"@llm-tools/embedjs-utils@patch:@llm-tools/embedjs-utils@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-utils-npm-0.1.25-fd8fe8a193.patch": - version: 0.1.25 - resolution: "@llm-tools/embedjs-utils@patch:@llm-tools/embedjs-utils@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-utils-npm-0.1.25-fd8fe8a193.patch::version=0.1.25&hash=faf2ca" - dependencies: - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - checksum: 10c0/c639f64a26023b21b2cd8b2bf5007541f4b1382ac3358d9404a531fcee66482ea94fe151b7d39b44a6cb903b975eb379101c4cca896d8a08a070330355e67c19 - languageName: node - linkType: hard - -"@llm-tools/embedjs@npm:0.1.25": - version: 0.1.25 - resolution: "@llm-tools/embedjs@npm:0.1.25" +"@llm-tools/embedjs@npm:0.1.28": + version: 0.1.28 + resolution: "@llm-tools/embedjs@npm:0.1.28" dependencies: "@langchain/textsplitters": "npm:^0.1.0" - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - "@llm-tools/embedjs-utils": "npm:0.1.25" + "@llm-tools/embedjs-interfaces": "npm:0.1.28" + "@llm-tools/embedjs-utils": "npm:0.1.28" debug: "npm:^4.4.0" - langchain: "npm:^0.3.7" + langchain: "npm:^0.3.8" md5: "npm:^2.3.0" mime: "npm:^4.0.6" stream-mime-type: "npm:^2.0.0" - checksum: 10c0/8a6afefbd8e304c037104eddf0fe35086165eb3a381b866e874bf6901c2da8a6dfc76d3d7eb027f7c694a163133154e3be7be777c362119a48925a6b56cce5db + checksum: 10c0/0ade20a97b987c5b24175e1e46c7f0917e91b0acde712e9a759fb9fe7f48b04a79fca28c2e4cc8702a25e6cd7fba8a9351bf1f7e5bbf1373f0f60de047703d7a languageName: node linkType: hard -"@llm-tools/embedjs@patch:@llm-tools/embedjs@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.25-ec5645cf36.patch": - version: 0.1.25 - resolution: "@llm-tools/embedjs@patch:@llm-tools/embedjs@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.25-ec5645cf36.patch::version=0.1.25&hash=3b8a9c" +"@llm-tools/embedjs@patch:@llm-tools/embedjs@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch": + version: 0.1.28 + resolution: "@llm-tools/embedjs@patch:@llm-tools/embedjs@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch::version=0.1.28&hash=51ffc6" dependencies: "@langchain/textsplitters": "npm:^0.1.0" - "@llm-tools/embedjs-interfaces": "npm:0.1.25" - "@llm-tools/embedjs-utils": "npm:0.1.25" + "@llm-tools/embedjs-interfaces": "npm:0.1.28" + "@llm-tools/embedjs-utils": "npm:0.1.28" debug: "npm:^4.4.0" - langchain: "npm:^0.3.7" + langchain: "npm:^0.3.8" md5: "npm:^2.3.0" mime: "npm:^4.0.6" stream-mime-type: "npm:^2.0.0" - checksum: 10c0/3ef5fb0068e662d9fc3ff794c0c200fca91fba548d1989a628ad2c3576e3f97838f3abca683adc77b1774d57e09c6d155c1c4b9d69eb20aac26bd274148f72a1 + checksum: 10c0/2af2bcd2f6476eaf02ed9ff5e189ecb03d663146cd5229c3c32b45fef8a37fd84a48193f8d067eaf9339e89a5035502c4ff48d2370dfd655294daa8b4e365841 languageName: node linkType: hard @@ -3011,16 +2969,16 @@ __metadata: "@google/generative-ai": "npm:^0.21.0" "@hello-pangea/dnd": "npm:^16.6.0" "@kangfenmao/keyv-storage": "npm:^0.1.0" - "@llm-tools/embedjs": "patch:@llm-tools/embedjs@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.25-ec5645cf36.patch" - "@llm-tools/embedjs-libsql": "patch:@llm-tools/embedjs-libsql@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-libsql-npm-0.1.25-fad000d74c.patch" - "@llm-tools/embedjs-loader-csv": "npm:^0.1.25" - "@llm-tools/embedjs-loader-markdown": "patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.25#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.25-d1d536d640.patch" - "@llm-tools/embedjs-loader-msoffice": "npm:^0.1.25" - "@llm-tools/embedjs-loader-pdf": "npm:^0.1.25" - "@llm-tools/embedjs-loader-sitemap": "npm:^0.1.25" - "@llm-tools/embedjs-loader-web": "npm:^0.1.25" - "@llm-tools/embedjs-loader-xml": "npm:^0.1.25" - "@llm-tools/embedjs-openai": "npm:^0.1.25" + "@llm-tools/embedjs": "patch:@llm-tools/embedjs@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch" + "@llm-tools/embedjs-libsql": "npm:^0.1.28" + "@llm-tools/embedjs-loader-csv": "npm:^0.1.28" + "@llm-tools/embedjs-loader-markdown": "patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch" + "@llm-tools/embedjs-loader-msoffice": "npm:^0.1.28" + "@llm-tools/embedjs-loader-pdf": "npm:^0.1.28" + "@llm-tools/embedjs-loader-sitemap": "npm:^0.1.28" + "@llm-tools/embedjs-loader-web": "npm:^0.1.28" + "@llm-tools/embedjs-loader-xml": "npm:^0.1.28" + "@llm-tools/embedjs-openai": "npm:^0.1.28" "@notionhq/client": "npm:^2.2.15" "@reduxjs/toolkit": "npm:^2.2.5" "@types/adm-zip": "npm:^0" @@ -4521,6 +4479,15 @@ __metadata: languageName: node linkType: hard +"console-table-printer@npm:^2.12.1": + version: 2.12.1 + resolution: "console-table-printer@npm:2.12.1" + dependencies: + simple-wcswidth: "npm:^1.0.1" + checksum: 10c0/8f28e9c0ae5df77f5d60da3da002ecd95ebe1812b0b9e0a6d2795c81b5121b39774f32506bccf68830a838ca4d8fbb2ab8824e729dba2c5e30cdeb9df4dd5f2b + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -8289,16 +8256,16 @@ __metadata: languageName: node linkType: hard -"langchain@npm:^0.3.7": - version: 0.3.10 - resolution: "langchain@npm:0.3.10" +"langchain@npm:^0.3.8": + version: 0.3.15 + resolution: "langchain@npm:0.3.15" dependencies: - "@langchain/openai": "npm:>=0.1.0 <0.4.0" + "@langchain/openai": "npm:>=0.1.0 <0.5.0" "@langchain/textsplitters": "npm:>=0.0.0 <0.2.0" js-tiktoken: "npm:^1.0.12" js-yaml: "npm:^4.1.0" jsonpointer: "npm:^5.0.1" - langsmith: "npm:^0.2.8" + langsmith: "npm:>=0.2.8 <0.4.0" openapi-types: "npm:^12.1.3" p-retry: "npm:4" uuid: "npm:^10.0.0" @@ -8311,6 +8278,7 @@ __metadata: "@langchain/cerebras": "*" "@langchain/cohere": "*" "@langchain/core": ">=0.2.21 <0.4.0" + "@langchain/deepseek": "*" "@langchain/google-genai": "*" "@langchain/google-vertexai": "*" "@langchain/google-vertexai-web": "*" @@ -8331,6 +8299,8 @@ __metadata: optional: true "@langchain/cohere": optional: true + "@langchain/deepseek": + optional: true "@langchain/google-genai": optional: true "@langchain/google-vertexai": @@ -8353,7 +8323,27 @@ __metadata: optional: true typeorm: optional: true - checksum: 10c0/4120bc57dfb4d9ca1235e7c6f35227ada5be6e92e818b7a7d7e01f65fe937b1ffc172c8bb58f4861067e1475f72921dbae07ecb0b006077fa52f3cdfe9702d17 + checksum: 10c0/3c21e31d6a470f50125ffa77dc85e5dec116f3e9d8a319c32bd1de558ca026149fa0656468e676978031147cf3c8875a9239e620c1ee749be0bca4224d5f1848 + languageName: node + linkType: hard + +"langsmith@npm:>=0.2.8 <0.4.0": + version: 0.3.7 + resolution: "langsmith@npm:0.3.7" + dependencies: + "@types/uuid": "npm:^10.0.0" + chalk: "npm:^4.1.2" + console-table-printer: "npm:^2.12.1" + p-queue: "npm:^6.6.2" + p-retry: "npm:4" + semver: "npm:^7.6.3" + uuid: "npm:^10.0.0" + peerDependencies: + openai: "*" + peerDependenciesMeta: + openai: + optional: true + checksum: 10c0/68ada1d5120376467bbf7edca17b0629f3d5a2588c91d2396a372b69217e3de960487f1c4109c36e38e0ee6a467d5f81e4b59d8f3312e480af5bb01007d179f3 languageName: node linkType: hard @@ -12692,6 +12682,13 @@ __metadata: languageName: node linkType: hard +"simple-wcswidth@npm:^1.0.1": + version: 1.0.1 + resolution: "simple-wcswidth@npm:1.0.1" + checksum: 10c0/2befead4c97134424aa3fba593a81daa9934fd61b9e4c65374b57ac5eecc2f2be1984b017bbdbc919923e19b77f2fcbdb94434789b9643fa8c3fde3a2a6a4b6f + languageName: node + linkType: hard + "sitemapper@npm:^3.2.20": version: 3.2.20 resolution: "sitemapper@npm:3.2.20" From d03b8526715aaf0919df4ac21e22a14b3eac8e0d Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Tue, 11 Feb 2025 22:55:49 +0800 Subject: [PATCH 12/12] feat: Add image loader to embedjs configuration --- electron.vite.config.ts | 3 ++- package.json | 1 + yarn.lock | 24 ++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 9f0ff6db..dcf3c864 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -20,7 +20,8 @@ export default defineConfig({ '@llm-tools/embedjs-loader-xml', '@llm-tools/embedjs-loader-pdf', '@llm-tools/embedjs-loader-sitemap', - '@llm-tools/embedjs-libsql' + '@llm-tools/embedjs-libsql', + '@llm-tools/embedjs-loader-image' ] }), ...visualizerPlugin('main') diff --git a/package.json b/package.json index a22da7fd..443273bd 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@llm-tools/embedjs": "patch:@llm-tools/embedjs@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch", "@llm-tools/embedjs-libsql": "^0.1.28", "@llm-tools/embedjs-loader-csv": "^0.1.28", + "@llm-tools/embedjs-loader-image": "^0.1.28", "@llm-tools/embedjs-loader-markdown": "patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch", "@llm-tools/embedjs-loader-msoffice": "^0.1.28", "@llm-tools/embedjs-loader-pdf": "^0.1.28", diff --git a/yarn.lock b/yarn.lock index 9bef3a46..e1d2e886 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1531,6 +1531,22 @@ __metadata: languageName: node linkType: hard +"@llm-tools/embedjs-loader-image@npm:^0.1.28": + version: 0.1.28 + resolution: "@llm-tools/embedjs-loader-image@npm:0.1.28" + dependencies: + "@langchain/core": "npm:^0.3.26" + "@llm-tools/embedjs-interfaces": "npm:0.1.28" + "@llm-tools/embedjs-utils": "npm:0.1.28" + debug: "npm:^4.4.0" + exifremove: "npm:^1.0.1" + md5: "npm:^2.3.0" + mime: "npm:^4.0.6" + stream-mime-type: "npm:^2.0.0" + checksum: 10c0/e9414dde0d10afe1541bfe464b80f5cb61ec523f28dce62ab931a3f4ffde93c5589fde8e7a7f5751e7dc20d68fe2d28883925ba65e2542ee9d43002591568af1 + languageName: node + linkType: hard + "@llm-tools/embedjs-loader-markdown@npm:0.1.28": version: 0.1.28 resolution: "@llm-tools/embedjs-loader-markdown@npm:0.1.28" @@ -2972,6 +2988,7 @@ __metadata: "@llm-tools/embedjs": "patch:@llm-tools/embedjs@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-npm-0.1.28-8e4393fa2d.patch" "@llm-tools/embedjs-libsql": "npm:^0.1.28" "@llm-tools/embedjs-loader-csv": "npm:^0.1.28" + "@llm-tools/embedjs-loader-image": "npm:^0.1.28" "@llm-tools/embedjs-loader-markdown": "patch:@llm-tools/embedjs-loader-markdown@npm%3A0.1.28#~/.yarn/patches/@llm-tools-embedjs-loader-markdown-npm-0.1.28-81647ffac6.patch" "@llm-tools/embedjs-loader-msoffice": "npm:^0.1.28" "@llm-tools/embedjs-loader-pdf": "npm:^0.1.28" @@ -5945,6 +5962,13 @@ __metadata: languageName: node linkType: hard +"exifremove@npm:^1.0.1": + version: 1.0.1 + resolution: "exifremove@npm:1.0.1" + checksum: 10c0/df5a30087b262a35f2932e4d8b567206ec5f39518740c1552361e9a6eee0a38819359bd8ab2bd5df391647c4dea8d572995852f355cf8fc504df6b1685d82921 + languageName: node + linkType: hard + "expand-template@npm:^2.0.3": version: 2.0.3 resolution: "expand-template@npm:2.0.3"