Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: CherryHQ/cherry-studio
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.8.3
Choose a base ref
...
head repository: CherryHQ/cherry-studio
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.8.4
Choose a head ref
  • 10 commits
  • 30 files changed
  • 9 contributors

Commits on Mar 26, 2026

  1. fix(aiCore): add missing @openrouter/ai-sdk-provider dependency (#13787)

    ### What this PR does
    
    Before this PR:
    
    The `@cherrystudio/ai-core` package imports
    `@openrouter/ai-sdk-provider` in its source code (`schemas.ts` and
    `types.ts`), but this dependency was not declared in
    `packages/aiCore/package.json`. This caused `tsdown` to inline-bundle it
    and exit with an error, failing the **Release Packages** CI workflow.
    
    After this PR:
    
    `@openrouter/ai-sdk-provider` is properly declared as a dependency in
    `packages/aiCore/package.json`, so `tsdown` treats it as an external
    dependency and the build succeeds.
    
    Fixes #
    
    N/A
    
    ### Why we need it and why it was done in this way
    
    The following tradeoffs were made:
    
    None — this is a straightforward missing dependency declaration.
    
    The following alternatives were considered:
    
    None.
    
    Links to places where the discussion took place:
    
    N/A
    
    ### Breaking changes
    
    None.
    
    ### Special notes for your reviewer
    
    The root `package.json` already has `@openrouter/ai-sdk-provider@^2.2.3`
    with a patch applied. The aiCore package now correctly declares the same
    version range so it resolves through the workspace.
    
    ### Checklist
    
    - [x] PR: The PR description is expressive enough and will help future
    contributors
    - [x] Code: [Write code that humans can
    understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
    and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
    - [x] Refactor: You have [left the code cleaner than you found it (Boy
    Scout
    Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
    - [x] Upgrade: Impact of this change on upgrade flows was considered and
    addressed if required
    - [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
    was considered and is present (link) or not required. Check this only
    when the PR introduces or changes a user-facing feature or behavior.
    - [x] Self-review: I have reviewed my own code (e.g., via
    [`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
    or GitHub UI) before requesting review from others
    
    ### Release note
    
    ```release-note
    NONE
    ```
    
    ---------
    
    Signed-off-by: icarus <[email protected]>
    Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
    EurFelux and claude authored Mar 26, 2026
    Configuration menu
    Copy the full SHA
    6b4c928 View commit details
    Browse the repository at this point in the history
  2. ci: restrict package release workflow to cherry-studio's main branch (#…

    …13797)
    
    This CI had run in my fork, but it should only run in cherry studio's
    main branch.
    
    <img width="1194" height="102" alt="CleanShot 2026-03-26 at 09 11 59@2x"
    src="https://github.com/user-attachments/assets/93cc496e-601e-40a4-a5d9-75cd056f7a66"
    />
    kovsu authored Mar 26, 2026
    Configuration menu
    Copy the full SHA
    2919d09 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    5625ae9 View commit details
    Browse the repository at this point in the history
  4. feat(api): add knowledge base REST API endpoints (#13762)

    Co-authored-by: Claude Sonnet 4.6 <[email protected]>
    Co-authored-by: icarus <[email protected]>
    3 people authored Mar 26, 2026
    Configuration menu
    Copy the full SHA
    8e72f2f View commit details
    Browse the repository at this point in the history
  5. fix(aiCore): remove openai-compatible providers from PDF native suppo…

    …rt list (#13809)
    
    ### What this PR does
    
    Before this PR:
    - `PDF_NATIVE_PROVIDER_TYPES` included `'openai'`, `'new-api'`, and
    `'gateway'` types, assuming all OpenAI-compatible providers support
    native PDF file input via the `file` part type.
    - Sending a PDF to providers like Moonshot/Kimi (which have `type:
    'openai'`) resulted in a 400 error: `"invalid part type: file"`.
    - A special-case `isCherryAI` check was needed because CherryAI also has
    `type: 'openai'` but doesn't support native PDF.
    
    After this PR:
    - Only first-party provider protocols (`openai-response`, `anthropic`,
    `gemini`, `azure-openai`, `vertexai`, `aws-bedrock`, `vertex-anthropic`)
    are in `PDF_NATIVE_PROVIDER_TYPES`.
    - All `type: 'openai'` providers (Moonshot, DeepSeek, Groq, CherryAI,
    cherryin, etc.) correctly have PDFs converted to text before sending.
    - The CherryAI special-case check is removed as it's no longer needed.
    
    ### Why we need it and why it was done in this way
    
    The following tradeoffs were made:
    - Removed `'openai'` entirely from the native set rather than adding
    per-provider ID exceptions, because the actual OpenAI provider uses
    `type: 'openai-response'` (not `'openai'`), and the vast majority of
    `type: 'openai'` providers are third-party APIs that don't support
    `file` parts.
    - Also removed `'new-api'` and `'gateway'` aggregator types, since these
    route to various backends — it's safer to convert PDFs to text and let
    specific backends handle text rather than risk `file` part errors.
    
    The following alternatives were considered:
    - Adding individual provider IDs (like `moonshot`) to a blocklist —
    rejected as it's whack-a-mole; new OpenAI-compatible providers would
    keep hitting the same bug.
    - Keeping `'openai'` in the set and adding more ID-based exceptions —
    rejected for the same reason.
    
    Links to places where the discussion took place:
    - PR #13641 introduced the `pdfCompatibilityPlugin` with the overly
    broad provider type set
    - PR #13777 added the CherryAI special case as a point fix
    
    ### Breaking changes
    
    None. Providers that previously had PDFs silently fail with 400 errors
    will now correctly receive extracted text content instead.
    
    ### Special notes for your reviewer
    
    - The actual OpenAI provider uses `type: 'openai-response'`, which
    remains in the native set — real OpenAI API users are unaffected.
    - All existing tests updated to match new behavior. Test suite passes
    fully (3811 tests).
    - The `isCherryAI` special case from PR #13777 is removed since CherryAI
    (`type: 'openai'`) is now naturally handled by the conversion path.
    
    ### Checklist
    
    - [x] PR: The PR description is expressive enough and will help future
    contributors
    - [x] Code: [Write code that humans can
    understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
    and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
    - [x] Refactor: You have [left the code cleaner than you found it (Boy
    Scout
    Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
    - [x] Upgrade: Impact of this change on upgrade flows was considered and
    addressed if required
    - [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
    was considered and is present (link) or not required. Check this only
    when the PR introduces or changes a user-facing feature or behavior.
    - [x] Self-review: I have reviewed my own code (e.g., via
    [`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
    or GitHub UI) before requesting review from others
    
    ### Release note
    
    ```release-note
    Fixed PDF file upload failing with "invalid part type: file" error for OpenAI-compatible providers (Moonshot, DeepSeek, Groq, etc.). PDFs are now correctly converted to text for these providers.
    ```
    
    ---------
    
    Signed-off-by: suyao <[email protected]>
    Co-authored-by: Claude Opus 4.6 <[email protected]>
    Co-authored-by: Phantom <[email protected]>
    3 people authored Mar 26, 2026
    Configuration menu
    Copy the full SHA
    1d5bdfb View commit details
    Browse the repository at this point in the history
  6. chore: release v1.8.4 (#13824)

    <!-- Template from
    https://github.com/kubevirt/kubevirt/blob/main/.github/PULL_REQUEST_TEMPLATE.md?-->
    <!--  Thanks for sending a pull request!  Here are some tips for you:
    1. Consider creating this PR as draft:
    https://github.com/CherryHQ/cherry-studio/blob/main/CONTRIBUTING.md
    -->
    
    <!--
    
    ⚠️ Important: Redux/IndexedDB Data-Changing Feature PRs Temporarily On
    Hold ⚠️
    
    Please note: For our current development cycle, we are not accepting
    feature Pull Requests that introduce changes to Redux data models or
    IndexedDB schemas.
    
    While we value your contributions, PRs of this nature will be blocked
    without merge. We welcome all other contributions (bug fixes, perf
    enhancements, docs, etc.). Thank you!
    
    Once version 2.0.0 is released, we will resume reviewing feature PRs.
    
    -->
    
    ### What this PR does
    
    Before this PR:
    - Version was at 1.8.3
    
    After this PR:
    - Bumps version to 1.8.4
    - Updates release notes with bilingual (English/Chinese) content
    
    ### Release Notes
    
    Cherry Studio 1.8.4 - Bug Fixes and New Features
    
    **English:**
    - [API] Add knowledge base REST API endpoints
    - [SelectionAssistant] Add Linux support for text selection toolbar
    - [Files] Fix PDF upload failing with "invalid part type: file" error
    for OpenAI-compatible providers (Moonshot, DeepSeek, Groq, etc.)
    
    **Chinese:**
    - [API] 添加知识库 REST API 端点
    - [选择助手] 为文本选择工具栏添加 Linux 支持
    - [文件] 修复 OpenAI 兼容提供商(Moonshot、DeepSeek、Groq 等)的 PDF 上传失败问题("invalid
    part type: file" 错误)
    
    ### Included Commits
    
    1. fix(aiCore): remove openai-compatible providers from PDF native
    support list (#13809)
    2. feat(api): add knowledge base REST API endpoints (#13762)
    3. feat(SelectionAssistant): Linux support (#13720)
    4. fix(aiCore): add missing @openrouter/ai-sdk-provider dependency
    (#13787)
    
    (Skipped internal CI/CD changes)
    
    ### Review Checklist
    
    - [ ] Review generated release notes in `electron-builder.yml`
    - [ ] Verify version bump in `package.json`
    - [ ] CI passes
    - [ ] Merge to trigger release build
    
    ### Checklist
    
    This checklist is not enforcing, but it's a reminder of items that could
    be relevant to every PR.
    Approvers are expected to review this list.
    
    - [x] PR: The PR description is expressive enough and will help future
    contributors
    - [x] Code: [Write code that humans can
    understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
    and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
    - [x] Refactor: You have [left the code cleaner than you found it (Boy
    Scout
    Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
    - [x] Upgrade: Impact of this change on upgrade flows was considered and
    addressed if required
    - [x] Documentation: A [user-guide update](https://docs.cherry-ai.com)
    was considered and is present (link) or not required. Check this only
    when the PR introduces or changes a user-facing feature or behavior.
    - [x] Self-review: I have reviewed my own code (e.g., via
    [`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
    or GitHub UI) before requesting review from others
    
    ### Release note
    
    ```release-note
    Cherry Studio 1.8.4 - Bug Fixes and New Features
    
    ✨ New Features
    - [API] Add knowledge base REST API endpoints
    - [SelectionAssistant] Add Linux support for text selection toolbar
    
    🐛 Bug Fixes
    - [Files] Fix PDF upload failing with "invalid part type: file" error for OpenAI-compatible providers (Moonshot, DeepSeek, Groq, etc.)
    ```
    
    Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
    kangfenmao and github-actions[bot] authored Mar 26, 2026
    Configuration menu
    Copy the full SHA
    965ba03 View commit details
    Browse the repository at this point in the history

Commits on Mar 27, 2026

  1. fix(extension-table-plus): remove reference to non-existent tsconfig.…

    …build.json (#13817)
    
    Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
    EurFelux and claude authored Mar 27, 2026
    Configuration menu
    Copy the full SHA
    7c2610b View commit details
    Browse the repository at this point in the history
  2. fix(aiCore): normalize model ID before looking up thinking token limi…

    …ts (#13843)
    
    ### What this PR does
    
    Before this PR:
    
    `findTokenLimit()` in `getReasoningEffort()` was called with the raw
    `model.id`, which may contain provider prefixes or mixed casing (e.g.,
    `openai/qwen3.5-397b-a17b`). This caused token limit lookups to fail, so
    `effort` was never correctly converted to `thinking_budget` for generic
    (OpenAI-compatible) providers.
    
    After this PR:
    
    The model ID is normalized via `getLowerBaseModelName()` before being
    passed to `findTokenLimit()`, ensuring correct token limit resolution
    and proper `effort → thinking_budget` conversion.
    
    Fixes #13831
    
    ### Why we need it and why it was done in this way
    
    The following tradeoffs were made:
    
    The normalization is applied early in `getReasoningEffort()` and reuses
    the existing `getLowerBaseModelName()` utility, which is already used
    elsewhere in the same file. This is the minimal, consistent fix.
    
    The following alternatives were considered:
    
    - Modifying `findTokenLimit()` itself to normalize internally — rejected
    because it would change the contract for all callers, some of which may
    already pass normalized IDs.
    
    ### Breaking changes
    
    None.
    
    ### Special notes for your reviewer
    
    While this fix correctly resolves the token limit lookup, there is a
    known follow-up concern: for some models (e.g., Qwen3.5), even a
    correctly computed low `thinking_budget` can paradoxically cause
    **more** thinking than not passing the parameter at all. See the linked
    issue discussion for details. See #13844 for tracking improvements to
    the effort mapping strategy.
    
    ### Checklist
    
    - [x] PR: The PR description is expressive enough and will help future
    contributors
    - [x] Code: [Write code that humans can
    understand](https://en.wikiquote.org/wiki/Martin_Fowler#code-for-humans)
    and [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle)
    - [x] Refactor: You have [left the code cleaner than you found it (Boy
    Scout
    Rule)](https://learning.oreilly.com/library/view/97-things-every/9780596809515/ch08.html)
    - [x] Upgrade: Impact of this change on upgrade flows was considered and
    addressed if required
    - [ ] Documentation: A [user-guide update](https://docs.cherry-ai.com)
    was considered and is present (link) or not required. Check this only
    when the PR introduces or changes a user-facing feature or behavior.
    - [ ] Self-review: I have reviewed my own code (e.g., via
    [`/gh-pr-review`](/.claude/skills/gh-pr-review/SKILL.md), `gh pr diff`,
    or GitHub UI) before requesting review from others
    
    ### Release note
    
    ```release-note
    NONE
    ```
    
    Signed-off-by: icarus <[email protected]>
    Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
    EurFelux and claude authored Mar 27, 2026
    Configuration menu
    Copy the full SHA
    a9d3a3f View commit details
    Browse the repository at this point in the history
  3. fix: update broken Awesome MCP Servers link (#13847)

    ## Description
    
    Fixes #13827
    
    The "Awesome MCP Servers" link in Settings > MCP Servers > Marketplaces
    was returning a 404 error. The original repository
    (punkpeye/awesome-mcp-servers) appears to have been removed or made
    private.
    
    ## Changes
    
    Updated the URL to point to wong2/awesome-mcp-servers, which is an
    active and maintained fork of the original awesome-mcp-servers list.
    
    ## Verification
    
    - [x] Verified the new URL returns 200 OK
    - [x] Confirmed the repository contains a curated list of MCP servers
    - [x] This is a minimal fix that doesn't affect Redux data models or
    IndexedDB schemas
    
    ## Related
    
    - Issue: #13827
    - Original broken URL: https://github.com/punkpeye/awesome-mcp-servers
    (404)
    - New working URL: https://github.com/wong2/awesome-mcp-servers (200)
    
    Signed-off-by: Rayan Salhab <[email protected]>
    cyphercodes authored Mar 27, 2026
    Configuration menu
    Copy the full SHA
    e1c503e View commit details
    Browse the repository at this point in the history
  4. fix(ci): add Linux system deps for selection-hook native rebuild (#13855

    )
    
    ## Summary
    - Install `libevdev-dev`, `libxtst-dev`, `libx11-dev`, `libxfixes-dev`,
    and `libwayland-dev` in the Linux release build step so the
    `selection-hook` native module compiles successfully.
    
    ## Test plan
    - [ ] Trigger a Linux-only release build via `workflow_dispatch` and
    verify it completes without native module compilation errors.
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    Signed-off-by: suyao <[email protected]>
    Co-authored-by: Claude Opus 4.6 <[email protected]>
    DeJeune and claude authored Mar 27, 2026
    Configuration menu
    Copy the full SHA
    d31652e View commit details
    Browse the repository at this point in the history
Loading