diff --git a/.github/ISSUE_TEMPLATE/0_bug_report.yml b/.github/ISSUE_TEMPLATE/0_bug_report.yml
index 268f5a98..3b0515d5 100644
--- a/.github/ISSUE_TEMPLATE/0_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/0_bug_report.yml
@@ -6,7 +6,8 @@ body:
- type: markdown
attributes:
value: |
- Thanks for taking the time to fill out this bug report!
+ Thank you for taking the time to fill out this bug report!
+ Before submitting this issue, please make sure that you have understood the [FAQ](https://docs.cherry-ai.com/question-contact/questions) and [Knowledge Science](https://docs.cherry-ai.com/question-contact/knowledge)
- type: checkboxes
id: checklist
@@ -15,9 +16,11 @@ body:
description: |
Before submitting an issue, please make sure you have completed the following steps
options:
- - label: I have viewed the pinned issues and searched existing issues but couldn't find anything similar.
+ - label: I understand that issues are for feedback and problem solving, not for complaining in the comment section, and will provide as much information as possible to help solve the problem.
required: true
- - label: I have filled out the issue title correctly.
+ - label: I've looked at pinned issues and searched for existing [Open Issues](https://github.com/CherryHQ/cherry-studio/issues) and [Closed Issues]( https://github.com/CherryHQ/cherry-studio/issues?q=is%3Aissue%20state%3Aclosed%20), no similar issue was found.
+ required: true
+ - label: I've filled in short, clear headings so that developers can quickly identify a rough idea of what to expect when flipping through the list of issues. And not "a suggestion", "stuck", etc.
required: true
- type: dropdown
@@ -45,7 +48,7 @@ body:
id: description
attributes:
label: Bug Description
- description: A clear and concise description of what the bug is
+ description: Please be as detailed as possible when describing the problem
placeholder: Tell us what happened...
validations:
required: true
@@ -54,7 +57,7 @@ body:
id: reproduction
attributes:
label: Steps To Reproduce
- description: Steps to reproduce the behavior
+ description: Provide detailed steps to reproduce the issue so that our developers can reproduce the issue accurately
placeholder: |
1. Go to '...'
2. Click on '....'
@@ -82,4 +85,4 @@ body:
id: additional
attributes:
label: Additional Context
- description: Add any other context about the problem here
+ description: Anything that gives us a better understanding of the problem you're experiencing
diff --git a/.github/ISSUE_TEMPLATE/1_feature_request.yml b/.github/ISSUE_TEMPLATE/1_feature_request.yml
index be3beff4..831b5f10 100644
--- a/.github/ISSUE_TEMPLATE/1_feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/1_feature_request.yml
@@ -6,7 +6,8 @@ body:
- type: markdown
attributes:
value: |
- Thanks for taking the time to suggest a new feature!
+ Thank you for taking the time to submit a feature request!
+ Before submitting this issue, please make sure you have reviewed the [Project Roadmap](https://docs.cherry-ai.com/cherrystudio/planning) and the [Feature Overview](https://docs.cherry-ai.com/cherrystudio/preview).
- type: checkboxes
id: checklist
@@ -15,9 +16,13 @@ body:
description: |
Before submitting an issue, please make sure you have completed the following steps
options:
- - label: I have viewed the pinned issues and searched existing issues but couldn't find anything similar.
+ - label: I understand that issues are for reporting problems and requesting features, not for off-topic comments, and I will provide as much detail as possible to help resolve the issue.
required: true
- - label: I have filled out the issue title correctly.
+ - label: I have checked the pinned issues and searched through the existing [open issues](https://github.com/CherryHQ/cherry-studio/issues) and [closed issues](https://github.com/CherryHQ/cherry-studio/issues?q=is%3Aissue%20state%3Aclosed) and did not find a similar suggestion.
+ required: true
+ - label: I have provided a short and descriptive title so that developers can quickly understand the issue when browsing the issue list, rather than vague titles like "A suggestion" or "Stuck."
+ required: true
+ - label: The latest version of Cherry Studio does not include the feature I am suggesting.
required: true
- type: dropdown
@@ -44,28 +49,28 @@ body:
- type: textarea
id: problem
attributes:
- label: Is your feature request related to a problem?
- description: A clear and concise description of what the problem is
- placeholder: I'm always frustrated when...
+ label: Is your feature request related to an existing issue?
+ description: Please briefly describe the problem you are experiencing.
+ placeholder: I often feel frustrated because...
validations:
required: true
- type: textarea
id: solution
attributes:
- label: Describe the solution you'd like
- description: A clear and concise description of what you want to happen
+ label: Desired Solution
+ description: Please briefly describe what you would like to happen.
validations:
required: true
- type: textarea
id: alternatives
attributes:
- label: Describe alternatives you've considered
- description: A clear and concise description of any alternative solutions or features you've considered
+ label: Alternative Solutions
+ description: Please briefly describe any alternative solutions or features you have considered.
- type: textarea
id: additional
attributes:
- label: Additional Context
- description: Add any other context or screenshots about the feature request here
+ label: Additional Information
+ description: Add any other context or screenshots related to your feature request.
diff --git a/.github/ISSUE_TEMPLATE/2_question.yml b/.github/ISSUE_TEMPLATE/2_question.yml
index 20a751ac..d191daf7 100644
--- a/.github/ISSUE_TEMPLATE/2_question.yml
+++ b/.github/ISSUE_TEMPLATE/2_question.yml
@@ -1,12 +1,12 @@
-name: ❓ Question
-description: Ask a question or seek help
-title: '[Question]: '
+name: ❓ Discussion & Questions
+description: Seeking help, discussing issues, asking questions, etc...
+title: '[Discussion]: '
labels: ['question']
body:
- type: markdown
attributes:
value: |
- Thanks for asking a question! Please provide as much detail as possible so we can better assist you.
+ Thank you for your question! Please describe your issue in as much detail as possible so that we can better assist you.
- type: checkboxes
id: checklist
@@ -15,9 +15,9 @@ body:
description: |
Before submitting an issue, please make sure you have completed the following steps
options:
- - label: I have viewed the pinned issues and searched existing issues but couldn't find anything similar.
+ - label: I understand that issues are meant for feedback and problem-solving, not for venting, and I will provide as much detail as possible to help resolve the issue.
required: true
- - label: I have filled out the issue title correctly.
+ - label: I confirm that I am here to ask questions and discuss issues, not to report bugs or request features.
required: true
- type: dropdown
@@ -45,8 +45,8 @@ body:
id: question
attributes:
label: Your Question
- description: Please describe your question in detail
- placeholder: Please explain your question as clearly as possible...
+ description: Please describe your issue in detail.
+ placeholder: Please explain your issue as clearly as possible...
validations:
required: true
@@ -68,9 +68,9 @@ body:
id: priority
attributes:
label: Priority
- description: How urgent is this question for you?
+ description: How urgent is this issue for you?
options:
- - Low (Can wait)
+ - Low (Review when available)
- Medium (Would like a response soon)
- High (Blocking progress)
validations:
diff --git a/.github/ISSUE_TEMPLATE/#0_bug_report.yml b/.github/issues/#0_bug_report.yml
similarity index 62%
rename from .github/ISSUE_TEMPLATE/#0_bug_report.yml
rename to .github/issues/#0_bug_report.yml
index e94faa9b..9e33cc57 100644
--- a/.github/ISSUE_TEMPLATE/#0_bug_report.yml
+++ b/.github/issues/#0_bug_report.yml
@@ -1,4 +1,4 @@
-name: 🐛 错误报告
+name: 🐛 错误报告 (中文)
description: 创建一个报告以帮助我们改进
title: '[错误]: '
labels: ['bug']
@@ -7,17 +7,20 @@ body:
attributes:
value: |
感谢您花时间填写此错误报告!
+ 在提交此问题之前,请确保您已经了解了[常见问题](https://docs.cherry-ai.com/question-contact/questions)和[知识科普](https://docs.cherry-ai.com/question-contact/knowledge)
- type: checkboxes
id: checklist
attributes:
- label: Issue 检查清单
+ label: 提交前检查
description: |
在提交 Issue 前请确保您已经完成了以下所有步骤
options:
- - label: 我已经查看了置顶 Issue 并搜索了现有的 Issue,但没有找到类似的问题。
+ - label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决。
required: true
- - label: 正确填写了 Issue 标题。
+ - label: 我已经查看了置顶 Issue 并搜索了现有的 [开放Issue](https://github.com/CherryHQ/cherry-studio/issues)和[已关闭Issue](https://github.com/CherryHQ/cherry-studio/issues?q=is%3Aissue%20state%3Aclosed%20),没有找到类似的问题。
+ required: true
+ - label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等。
required: true
- type: dropdown
@@ -45,7 +48,7 @@ body:
id: description
attributes:
label: 错误描述
- description: 清晰简洁地描述错误是什么
+ description: 描述问题时请尽可能详细
placeholder: 告诉我们发生了什么...
validations:
required: true
@@ -54,7 +57,7 @@ body:
id: reproduction
attributes:
label: 重现步骤
- description: 重现行为的步骤
+ description: 提供详细的重现步骤,以便于我们可以准确地重现问题
placeholder: |
1. 转到 '...'
2. 点击 '....'
@@ -82,4 +85,4 @@ body:
id: additional
attributes:
label: 附加信息
- description: 在此添加有关问题的任何其他上下文
+ description: 任何能让我们对你所遇到的问题有更多了解的东西
diff --git a/.github/ISSUE_TEMPLATE/#1_feature_request.yml b/.github/issues/#1_feature_request.yml
similarity index 63%
rename from .github/ISSUE_TEMPLATE/#1_feature_request.yml
rename to .github/issues/#1_feature_request.yml
index 5c26d7d8..00aae56f 100644
--- a/.github/ISSUE_TEMPLATE/#1_feature_request.yml
+++ b/.github/issues/#1_feature_request.yml
@@ -1,4 +1,4 @@
-name: 💡 功能建议
+name: 💡 功能建议 (中文)
description: 为项目提出新的想法
title: '[功能]: '
labels: ['enhancement']
@@ -7,17 +7,22 @@ body:
attributes:
value: |
感谢您花时间提出新的功能建议!
+ 在提交此问题之前,请确保您已经了解了[项目规划](https://docs.cherry-ai.com/cherrystudio/planning)和[功能介绍](https://docs.cherry-ai.com/cherrystudio/preview)
- type: checkboxes
id: checklist
attributes:
- label: Issue 检查清单
+ label: 提交前检查
description: |
在提交 Issue 前请确保您已经完成了以下所有步骤
options:
- - label: 我已经查看了置顶 Issue 并搜索了现有的 Issue,但没有找到类似的问题。
+ - label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决。
required: true
- - label: 正确填写了 Issue 标题。
+ - label: 我已经查看了置顶 Issue 并搜索了现有的 [开放Issue](https://github.com/CherryHQ/cherry-studio/issues)和[已关闭Issue](https://github.com/CherryHQ/cherry-studio/issues?q=is%3Aissue%20state%3Aclosed%20),没有找到类似的建议。
+ required: true
+ - label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等。
+ required: true
+ - label: 最新的 Cherry Studio 版本没有实现我所提出的功能。
required: true
- type: dropdown
@@ -44,7 +49,7 @@ body:
- type: textarea
id: problem
attributes:
- label: 您的功能建议是否与某个问题相关?
+ label: 您的功能建议是否与某个问题/issue相关?
description: 请简明扼要地描述您遇到的问题
placeholder: 我总是感到沮丧,因为...
validations:
diff --git a/.github/ISSUE_TEMPLATE/#2_question.yml b/.github/issues/#2_question.yml
similarity index 82%
rename from .github/ISSUE_TEMPLATE/#2_question.yml
rename to .github/issues/#2_question.yml
index faff6806..f3566ce6 100644
--- a/.github/ISSUE_TEMPLATE/#2_question.yml
+++ b/.github/issues/#2_question.yml
@@ -1,6 +1,6 @@
-name: ❓ 提问
-description: 提出一个问题或寻求帮助
-title: '[问题]: '
+name: ❓ 讨论 & 提问 (中文)
+description: 寻求帮助、讨论问题、提出疑问等...
+title: '[讨论]: '
labels: ['question']
body:
- type: markdown
@@ -15,9 +15,9 @@ body:
description: |
在提交 Issue 前请确保您已经完成了以下所有步骤
options:
- - label: 我已经查看了置顶 Issue 并搜索了现有的 Issue,但没有找到类似的问题。
+ - label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决。
required: true
- - label: 正确填写了 Issue 标题。
+ - label: 我确认自己需要的是提出问题并且讨论问题,而不是 Bug 反馈或需求建议。
required: true
- type: dropdown
diff --git a/electron-builder.yml b/electron-builder.yml
index afec407a..1f3e8eed 100644
--- a/electron-builder.yml
+++ b/electron-builder.yml
@@ -80,11 +80,9 @@ afterPack: scripts/after-pack.js
afterSign: scripts/notarize.js
releaseInfo:
releaseNotes: |
- 增加服务商 LM Studio、魔搭、Perplexity、无问芯穹、DMXAPI
- 提及功能支持上下按键循环选择模型
- 小程序增加小艺
- 增加Notion连接检测功能
- 编辑模型弹窗搜索模型时,同时搜索模型的名字和ID
- 编辑模型弹窗增加推理模型筛选按钮
- 修复思考模型思考时间显示错误
- 修复部分模型翻译出错
+ 消息分组支持网格模式
+ 知识库支持多选
+ 支持库增加 DRAFTS, EPUB
+ 知识库支持调节匹配度阈值
+ 添加 NotebookLM, Coze 小程序
+ 增加话题提示词
diff --git a/package.json b/package.json
index 23da2cdf..f7868716 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "CherryStudio",
- "version": "0.9.24",
+ "version": "0.9.25",
"private": true,
"description": "A powerful AI assistant for producer.",
"main": "./out/main/index.js",
@@ -137,7 +137,7 @@
"redux": "^5.0.1",
"redux-persist": "^6.0.0",
"rehype-katex": "^7.0.1",
- "rehype-mathjax": "^6.0.0",
+ "rehype-mathjax": "^7.0.0",
"rehype-raw": "^7.0.0",
"remark-gfm": "^4.0.0",
"remark-math": "^6.0.0",
diff --git a/packages/shared/config/constant.ts b/packages/shared/config/constant.ts
index c39b1370..1c7b5758 100644
--- a/packages/shared/config/constant.ts
+++ b/packages/shared/config/constant.ts
@@ -2,6 +2,7 @@ export const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']
export const videoExts = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv']
export const audioExts = ['.mp3', '.wav', '.ogg', '.flac', '.aac']
export const documentExts = ['.pdf', '.docx', '.pptx', '.xlsx', '.odt', '.odp', '.ods']
+export const thirdPartyApplicationExts = ['.draftsExport']
export const bookExts = ['.epub']
export const textExts = [
'.txt', // 普通文本文件
diff --git a/src/main/loader/draftsExportLoader.ts b/src/main/loader/draftsExportLoader.ts
new file mode 100644
index 00000000..4ad1806b
--- /dev/null
+++ b/src/main/loader/draftsExportLoader.ts
@@ -0,0 +1,22 @@
+import * as fs from 'node:fs'
+
+import { JsonLoader } from '@llm-tools/embedjs'
+
+/**
+ * Drafts 应用导出的笔记文件加载器
+ * 原始文件是一个 JSON 数组。每条笔记只保留 content、tags、modified_at 三个字段
+ */
+export class DraftsExportLoader extends JsonLoader {
+ constructor(filePath: string) {
+ const fileContent = fs.readFileSync(filePath, 'utf-8')
+ const rawJson = JSON.parse(fileContent) as any[]
+ const json = rawJson.map((item) => {
+ return {
+ content: item.content?.replace(/\n/g, '
'),
+ tags: item.tags,
+ modified_at: item.created_at
+ }
+ })
+ super({ object: json })
+ }
+}
diff --git a/src/main/loader/index.ts b/src/main/loader/index.ts
index 3cc1d1af..f23c58b1 100644
--- a/src/main/loader/index.ts
+++ b/src/main/loader/index.ts
@@ -1,17 +1,18 @@
import * as fs from 'node:fs'
-import { LocalPathLoader, RAGApplication, TextLoader } from '@llm-tools/embedjs'
+import { JsonLoader, LocalPathLoader, RAGApplication, TextLoader } from '@llm-tools/embedjs'
import type { AddLoaderReturn } from '@llm-tools/embedjs-interfaces'
import { WebLoader } from '@llm-tools/embedjs-loader-web'
import { LoaderReturn } from '@shared/config/types'
import { FileType, KnowledgeBaseParams } from '@types'
import Logger from 'electron-log'
+import { DraftsExportLoader } from './draftsExportLoader'
import { EpubLoader } from './epubLoader'
import { OdLoader, OdType } from './odLoader'
// embedjs内置loader类型
-const commonExts = ['.pdf', '.csv', '.json', '.docx', '.pptx', '.xlsx', '.md']
+const commonExts = ['.pdf', '.csv', '.docx', '.pptx', '.xlsx', '.md']
export async function addOdLoader(
ragApplication: RAGApplication,
@@ -89,7 +90,19 @@ export async function addFileLoader(
} as LoaderReturn
}
+ // DraftsExport类型 (file.ext会自动转换成小写)
+ if (['.draftsexport'].includes(file.ext)) {
+ const loaderReturn = await ragApplication.addLoader(new DraftsExportLoader(file.path) as any, forceReload)
+ return {
+ entriesAdded: loaderReturn.entriesAdded,
+ uniqueId: loaderReturn.uniqueId,
+ uniqueIds: [loaderReturn.uniqueId],
+ loaderType: loaderReturn.loaderType
+ }
+ }
+
const fileContent = fs.readFileSync(file.path, 'utf-8')
+
// HTML类型
if (['.html', '.htm'].includes(file.ext)) {
const loaderReturn = await ragApplication.addLoader(
@@ -108,6 +121,18 @@ export async function addFileLoader(
}
}
+ // JSON类型
+ if (['.json'].includes(file.ext)) {
+ const jsonObject = JSON.parse(fileContent)
+ const loaderReturn = await ragApplication.addLoader(new JsonLoader({ object: jsonObject }))
+ return {
+ entriesAdded: loaderReturn.entriesAdded,
+ uniqueId: loaderReturn.uniqueId,
+ uniqueIds: [loaderReturn.uniqueId],
+ loaderType: loaderReturn.loaderType
+ }
+ }
+
// 文本类型
const loaderReturn = await ragApplication.addLoader(
new TextLoader({ text: fileContent, chunkSize: base.chunkSize, chunkOverlap: base.chunkOverlap }) as any,
diff --git a/src/main/services/ShortcutService.ts b/src/main/services/ShortcutService.ts
index 5f03ac51..d9920981 100644
--- a/src/main/services/ShortcutService.ts
+++ b/src/main/services/ShortcutService.ts
@@ -47,8 +47,8 @@ function formatShortcutKey(shortcut: string[]): string {
function handleZoom(delta: number) {
return (window: BrowserWindow) => {
- const currentZoom = window.webContents.getZoomFactor()
- const newZoom = currentZoom + delta
+ const currentZoom = configManager.getZoomFactor()
+ const newZoom = Number((currentZoom + delta).toFixed(1))
if (newZoom >= 0.1 && newZoom <= 5.0) {
window.webContents.setZoomFactor(newZoom)
configManager.setZoomFactor(newZoom)
@@ -110,7 +110,9 @@ const convertShortcutRecordedByKeyboardEventKeyValueToElectronGlobalShortcutForm
}
export function registerShortcuts(window: BrowserWindow) {
- window.webContents.setZoomFactor(configManager.getZoomFactor())
+ window.once('ready-to-show', () => {
+ window.webContents.setZoomFactor(configManager.getZoomFactor())
+ })
const register = () => {
if (window.isDestroyed()) return
diff --git a/src/renderer/index.html b/src/renderer/index.html
index 53db584f..19a44594 100644
--- a/src/renderer/index.html
+++ b/src/renderer/index.html
@@ -6,6 +6,7 @@
+