Compare commits

..

1 Commits

Author SHA1 Message Date
arvinxx 4fa6d64df2 add plugin settings 2025-07-29 14:48:46 +08:00
998 changed files with 11112 additions and 30916 deletions
+19 -2
View File
@@ -26,11 +26,28 @@ Gather the modified code and context. Please strictly follow the process below:
### Code Style
read [typescript.mdc](mdc:.cursor/rules/typescript.mdc) for the consolidated project code style and optimization rules.
read [typescript.mdc](mdc:.cursor/rules/typescript.mdc) to learn the project's code style.
- Ensure JSDoc comments accurately reflect the implementation; update them when needed.
- Look for opportunities to simplify or modernize code with the latest JavaScript/TypeScript features.
- Prefer `async`/`await` over callbacks or chained `.then` promises.
- Use consistent, descriptive naming—avoid obscure abbreviations.
- Replace magic numbers or strings with well-named constants.
- Use semantically meaningful variable, function, and class names.
- Ignore purely formatting issues and other autofixable lint problems.
### Code Optimization
The optimization checklist has been consolidated into [typescript.mdc](mdc:.cursor/rules/typescript.mdc): loops, debouncing/throttling, design system components, theming tokens, concurrency with `Promise.*`, minimal DB column selection, and package reuse.
- Prefer `for…of` loops to index-based `for` loops when feasible.
- Decide whether callbacks should be **debounced** or **throttled**.
- Use components from `@lobehub/ui`, Ant Design, or the existing design system instead of raw HTML tags (e.g., `Button` vs. `button`).
- reuse npm packages already installed (e.g., `lodash/omit`) rather than reinventing the wheel.
- Design for dark mode and mobile responsiveness:
- Use the `antd-style` token system instead of hard-coded colors.
- Select the proper component variants.
- Performance considerations:
- Where safe, convert sequential async flows to concurrent ones with `Promise.all`, `Promise.race`, etc.
- Query only the required columns from a database rather than selecting entire rows.
### Obvious Bugs
+72
View File
@@ -30,3 +30,75 @@ alwaysApply: true
- Good: `git show commit_hash -- file.txt | cat`
- Good: `git log --oneline | cat`
- Reason: Some git commands use pagers by default, which may prevent output from being captured properly
## Mermaid Diagram Generation: Strict Syntax Validation Checklist
Before producing any Mermaid diagram, you **must** compare your final code line-by-line against every rule in the following checklist to ensure 100% compliance. **This is a hard requirement and takes precedence over other stylistic suggestions.** Please follow these action steps:
1. Plan the Mermaid diagram logic in your mind.
2. Write the Mermaid code.
3. **Carefully review your code line-by-line against the entire checklist below.**
4. Fix any aspect of your code that doesn't comply.
5. Use the `validateMermaid` tool to check your code for syntax errors. Only proceed if validation passes.
6. Output the final, compliant, and copy-ready Mermaid code block.
7. Immediately after the Mermaid code block, output:
I have checked that the Mermaid syntax fully complies with the validation checklist.
---
### Checklist Details
#### Rule 1: Edge Labels Must Be Plain Text Only
> **Essence:** Anything inside `|...|` must contain pure, unformatted text. Absolutely NO Markdown, list markers, or parentheses/brackets allowed—these often cause rendering failures.
- **✅ Do:** `A -->|Process plain text data| B`
- **❌ Don't:** `A -->|1. Ordered list item| B` (No numbered lists)
- **❌ Don't:** `CC --"1. fetch('/api/...')"--> API` (No square brackets)
- **❌ Don't:** `A -->|- Unordered list item| B` (No hyphen lists)
- **❌ Don't:** `A -->|Transform (important)| B` (No parentheses)
- **❌ Don't:** `A -->|Transform [important]| B` (No square brackets)
#### Rule 2: Node Definition Handle Special Characters with Care
> **Essence:** When node text or subgraph titles contain special characters like `()` or `[]`, wrap the text in quotes to avoid conflicts with Mermaid shape syntax.
- **When your node text includes parentheses (e.g., 'React (JSX)'):**
- **✅ Do:** `I_REACT["<b>React component (JSX)</b>"]` (Quotes wrap all text)
- **❌ Don't:** `I_REACT(<b>React component (JSX)</b>)` (Wrong, Mermaid parses this as a shape)
- **❌ Don't:** `subgraph Plugin Features (Plugins)` (Wrong, subgraph titles with parentheses must also be wrapped in quotes)
#### Rule 3: Double Quotes in Text Must Be Escaped
> **Essence:** Use `&quot;` for double quotes **inside node text**.
- **✅ Do:** `A[This node contains &quot;quotes&quot;]`
- **❌ Don't:** `A[This node contains "quotes"]`
#### Rule 4: All Formatting Must Use HTML Tags (NOT Markdown!)
> **Essence:** For newlines, bold, and other text formatting in nodes, use HTML tags only. Markdown is not supported.
- **✅ Do (robust):** `A["<b>Bold</b> and <code>code</code><br>This is a new line"]`
- **❌ Don't (not rendered):** `C["# This is a heading"]`
- **❌ Don't (not rendered):** ``C["`const` means constant"]``
- **⚠️ Warning (unreliable):** `B["Markdown **bold** might sometimes work but DON'T rely on it"]`
#### Rule 5: No HTML Tags for Participants and Message Labels (Sequence Diagrams)
> **Important Addition:**
> In Mermaid sequence diagrams, you MUST NOT use any HTML tags (such as `<b>`, `<code>`, etc.) in:
>
> - `participant` display names (`as` part)
> - Message labels (the text after `:` in diagram flows)
>
> These tags are generally not rendered—they may appear as-is or cause compatibility issues.
- **✅ Do:** `participant A as Client`
- **❌ Don't:** `participant A as <b>Client</b>`
- **✅ Do:** `A->>B: 1. Establish connection`
- **❌ Don't:** `A->>B: 1. <code>Establish connection</code>`
---
**Validate each Mermaid code block by running it through the `validateMermaid` tool before delivering your output!**
+2 -1
View File
@@ -1,5 +1,6 @@
---
globs: *.tsx
description: i18n workflow and troubleshooting
globs:
alwaysApply: false
---
# LobeChat 国际化指南
+5 -5
View File
@@ -43,16 +43,16 @@ The project uses the following technologies:
Note: All tools and libraries used are the latest versions. The application only needs to be compatible with the latest browsers;
## Often used npm scripts and commands
## Often used npm scripts
```bash
# !: don't any build script to check weather code can work after modify
# type check
bun run type-check
bun type-check
# install dependencies
pnpm install
# run tests
npx vitest run --config vitest.config.ts '[file-path-pattern]'
# !: don't any build script to check weather code can work after modify
```
check [testing guide](./testing-guide/testing-guide.mdc) to learn test scripts.
+73 -92
View File
@@ -3,7 +3,6 @@ description:
globs: *.tsx
alwaysApply: false
---
# react component 编写指南
- 如果要写复杂样式的话用 antd-style ,简单的话可以用 style 属性直接写内联样式
@@ -21,20 +20,18 @@ import { useTheme } from 'antd-style';
const MyComponent = () => {
const theme = useTheme();
return (
<div
style={{
color: theme.colorPrimary,
backgroundColor: theme.colorBgContainer,
padding: theme.padding,
borderRadius: theme.borderRadius,
}}
>
<div style={{
color: theme.colorPrimary,
backgroundColor: theme.colorBgContainer,
padding: theme.padding,
borderRadius: theme.borderRadius
}}>
使用主题 token 的组件
</div>
);
};
}
```
#### 使用 antd-style 的 createStyles
@@ -56,13 +53,13 @@ const useStyles = createStyles(({ css, token }) => {
content: css`
font-size: ${token.fontSize}px;
line-height: ${token.lineHeight};
`,
`
};
});
const Card: FC<CardProps> = ({ title, content }) => {
const { styles } = useStyles();
return (
<Flexbox className={styles.container}>
<div className={styles.title}>{title}</div>
@@ -77,96 +74,80 @@ const Card: FC<CardProps> = ({ title, content }) => {
请注意使用下面的 token 而不是 css 字面值。可以访问 https://ant.design/docs/react/customize-theme-cn 了解所有 token
- 动画类
- token.motionDurationMid
- token.motionEaseInOut
- token.motionDurationMid
- token.motionEaseInOut
- 包围盒属性
- token.paddingSM
- token.marginLG
- token.paddingSM
- token.marginLG
## Lobe UI 包含的组件
- 不知道 @lobehub/ui 的组件怎么用,有哪些属性,就自己搜下这个项目其它地方怎么用的,不要瞎猜,大部分组件都是在 antd 的基础上扩展了属性
- 具体用法不懂可以联网搜索,例如 ActionIcon 就爬取 https://ui.lobehub.com/components/action-icon
- 可以阅读 node_modules/@lobehub/ui/es/index.js 了解有哪些组件,每个组件的属性是什么
- General
- ActionIcon
- ActionIconGroup
- Block
- Button
- DownloadButton
- Icon
ActionIcon
ActionIconGroup
Block
Button
Icon
- Data Display
- Avatar
- AvatarGroup
- GroupAvatar
- Collapse
- FileTypeIcon
- FluentEmoji
- GuideCard
- Highlighter
- Hotkey
- Image
- List
- Markdown
- SearchResultCards
- MaterialFileTypeIcon
- Mermaid
- Typography
- Text
- Segmented
- Snippet
- SortableList
- Tag
- Tooltip
- Video
Avatar
Collapse
FileTypeIcon
FluentEmoji
GuideCard
Highlighter
Hotkey
Image
List
Markdown
MaterialFileTypeIcon
Mermaid
Segmented
Snippet
SortableList
Tag
Tooltip
Video
- Data Entry
- AutoComplete
- CodeEditor
- ColorSwatches
- CopyButton
- DatePicker
- EditableText
- EmojiPicker
- Form
- FormModal
- HotkeyInput
- ImageSelect
- Input
- SearchBar
- Select
- SliderWithInput
- ThemeSwitch
AutoComplete
CodeEditor
ColorSwatches
CopyButton
DatePicker
EditableText
EmojiPicker
Form
FormModal
HotkeyInput
ImageSelect
Input
SearchBar
Select
SliderWithInput
ThemeSwitch
- Feedback
- Alert
- Drawer
- Modal
Alert
Drawer
Modal
- Layout
- DraggablePanel
- DraggablePanelBody
- DraggablePanelContainer
- DraggablePanelFooter
- DraggablePanelHeader
- Footer
- Grid
- Header
- Layout
- LayoutFooter
- LayoutHeader
- LayoutMain
- LayoutSidebar
- LayoutSidebarInner
- LayoutToc
- MaskShadow
- ScrollShadow
DraggablePanel
Footer
Grid
Header
Layout
MaskShadow
ScrollShadow
- Navigation
- Burger
- Dropdown
- Menu
- SideNav
- Tabs
- Toc
Burger
Dropdown
Menu
SideNav
Tabs
Toc
- Theme
- ConfigProvider
- FontLoader
- ThemeProvider
ConfigProvider
FontLoader
ThemeProvider
+63 -30
View File
@@ -4,49 +4,82 @@ globs:
alwaysApply: true
---
# 📋 Available Rules Index
# LobeChat Cursor Rules System Guide
This document explains how the LobeChat project's Cursor rules system works and serves as an index for manually accessible rules.
## 🎯 Core Principle
**All rules are equal** - there are no priorities or "recommendations" between different rule sources. You should follow all applicable rules simultaneously.
## 📚 Four Ways to Access Rules
### 1. **Always Applied Rules** - `always_applied_workspace_rules`
- **What**: Core project guidelines that are always active
- **Content**: Project tech stack, basic coding standards, output formatting rules
- **Access**: No tools needed - automatically provided in every conversation
### 2. **Dynamic Context Rules** - `cursor_rules_context`
- **What**: Rules automatically matched based on files referenced in the conversation
- **Trigger**: Only when user **explicitly @ mentions files** or **opens files in Cursor**
- **Content**: May include brief descriptions or full rule content, depending on relevance
- **Access**: No tools needed - automatically updated when files are referenced
### 3. **Agent Requestable Rules** - `agent_requestable_workspace_rules`
- **What**: Detailed operational guides that can be requested on-demand
- **Access**: Use `fetch_rules` tool with rule names
- **Examples**: `debug`, `i18n/i18n`, `code-review`
### 4. **Manual Rules Index** - This file + `read_file`
- **What**: Additional rules not covered by the above mechanisms
- **Why needed**: Cursor's rule system only supports "agent request" or "auto attach" modes
- **Access**: Use `read_file` tool to read specific `.mdc` files
## 🔧 When to Use `read_file` for Rules
Use `read_file` to access rules from the index below when:
1. **Gap identification**: You determine a rule is needed for the current task
2. **No auto-trigger**: The rule isn't provided in `cursor_rules_context` (because relevant files weren't @ mentioned)
3. **Not agent-requestable**: The rule isn't available via `fetch_rules`
## 📋 Available Rules Index
The following rules are available via `read_file` from the `.cursor/rules/` directory:
## General
- `project-introduce.mdc` Project description and tech stack
- `cursor-rules.mdc` Cursor rules authoring and optimization guide
- `code-review.mdc` How to code review
## Backend
- `backend-architecture.mdc` Backend layer architecture and design guidelines
- `define-database-model.mdc` Database model definition guidelines
- `drizzle-schema-style-guide.mdc` Style guide for defining Drizzle ORM schemas
## Frontend
- `react-component.mdc` React component style guide and conventions
- `i18n.mdc` Internationalization guide using react-i18next
- `testing-guide.mdc` Comprehensive testing guide for Vitest environment
- `typescript.mdc` TypeScript code style guide
- `packages/react-layout-kit.mdc` Usage guide for react-layout-kit
## State Management
- `zustand-action-patterns.mdc` Recommended patterns for organizing Zustand actions
- `zustand-slice-organization.mdc` Best practices for structuring Zustand slices
## Desktop (Electron)
## ❌ Common Misunderstandings to Avoid
- `desktop-feature-implementation.mdc` Implementing new Electron desktop features
- `desktop-controller-tests.mdc` Desktop controller unit testing guide
- `desktop-local-tools-implement.mdc` Workflow to add new desktop local tools
- `desktop-menu-configuration.mdc` Desktop menu configuration guide
- `desktop-window-management.mdc` Desktop window management guide
1. **"Priority confusion"**: There's no hierarchy between rule sources - they're complementary, not competitive
2. **"Dynamic expectations"**: `cursor_rules_context` only updates when you @ files - it won't automatically include rules for tasks you're thinking about
3. **"Tool redundancy"**: Each access method serves a different purpose - they're not alternatives to choose from
## Debugging
## 🛠️ Practical Workflow
- `debug.mdc` General debugging guide
- `debug-usage.mdc` Using the debug package and namespace conventions
```
1. Start with always_applied_workspace_rules (automatic)
2. Check cursor_rules_context for auto-matched rules (automatic)
3. If you need specific guides: fetch_rules (manual)
4. If you identify gaps: consult this index → read_file (manual)
```
## Testing
## Example Decision Flow
- `testing-guide/testing-guide.mdc` Comprehensive testing guide for Vitest
- `testing-guide/electron-ipc-test.mdc` Electron IPC interface testing strategy
- `testing-guide/db-model-test.mdc` Database Model testing guide
**Scenario**: Working on a new Zustand store slice
1. Follow always_applied_workspace_rules ✅
2. If store files were @ mentioned → use cursor_rules_context rules ✅
3. Need detailed Zustand guidance → `read_file('.cursor/rules/zustand-slice-organization.mdc')` ✅
4. All rules apply simultaneously - no conflicts ✅
+20 -8
View File
@@ -6,26 +6,38 @@ alwaysApply: true
## System Role
You are an expert in full-stack Web development, proficient in JavaScript, TypeScript, CSS, React, Node.js, Next.js, Postgresql, Redis, S3, all kinds of network protocols.
You are an expert in full-stack Web development, proficient in JavaScript, TypeScript, CSS, React, Node.js, Next.js, Postgresql, all kinds of network protocols.
You are an LLM expert, you are familiar with all kinds of LLM models, ai agents, ai workflow, prompt engineering and context engineering.
You are an expert in Ai art. In Ai image generation, you are proficient in Stable Diffusion and ComfyUI's architectural principles, workflows, model structures, parameter configurations, training methods, and inference optimization.
You are an expert in LLM and Ai art. In Ai image generation, you are proficient in Stable Diffusion and ComfyUI's architectural principles, workflows, model structures, parameter configurations, training methods, and inference optimization.
You are an expert in UI/UX design, proficient in web interaction patterns, responsive design, accessibility, and user behavior optimization. You excel at improving user retention and paid conversion rates through various interaction details.
## Problem Solving
- Before formulating any response, you must first gather context by using tools like codebase_search, grep_search, file_search, web_search, fetch_rules, context7, and read_file to avoid making assumptions.
- When modifying existing code, clearly describe the differences and reasons for the changes
- Provide alternative solutions that may be better overall or superior in specific aspects
- Provide optimization suggestions for deprecated API usage
- Cite sources whenever possible at the end, not inline
- When you provide multiple solutions, provide the recommended solution first, and note it as `Recommended`
- Express uncertainty when there might not be a correct answer, instead of take action by guessing and assuming
- Express uncertainty when there might not be a correct answer
- Admit when you don't know something instead of guessing
## Code Implementation
- Write correct, up-to-date, bug-free, fully functional, secure, maintainable and efficient code
- First, think step-by-step: describe your plan in detailed pseudocode before implementation
- Confirm the plan before writing code
- Focus on maintainable over being performant
- Be sure to reference file path
- If doc links or required files are missing, ask for them before proceeding with the task rather than making assumptions
- If you're unable to get valid result when using tools, please clearly state in the output
- Leave NO TODOs, placeholders, or missing pieces
- Be sure to reference file names
- When you notice I have manually modified the code, that was definitely on purpose and do not revert them
- If documentation links or required files are missing, ask for them before proceeding with the task rather than making assumptions
- If you're unable to access or retrieve content from websites, please inform me immediately and request the specific information needed rather than making assumptions
- You can use emojis, npm packages like `chalk`/`chalk-animation`/`terminal-link`/`gradient-string`/`log-symbols`/`boxen`/`consola`/`@clack/prompts` to create beautiful terminal output
- Don't run `tsc --noEmit` to check ts syntax error, because our project is very large and the validate very slow
## Some logging rules
- Never log user private information like api key, etc
- Don't use `import { log } from 'debug'` to log messages, because it will directly log the message to the console.
@@ -430,22 +430,6 @@ expect(result!.status).toBe('success');
// ✅ 使用 any 类型简化复杂的 Mock 设置
const mockStream = new ReadableStream() as any;
mockStream.toReadableStream = () => mockStream;
// ✅ 使用中括号访问私有属性和方法(推荐)
class MyClass {
private _cache = new Map();
private getFromCache(key: string) { /* ... */ }
}
const instance = new MyClass();
// 推荐:使用中括号访问私有成员
await instance['getFromCache']('test-key');
expect(instance['_cache'].size).toBe(1);
// 避免:使用 as any 访问私有成员
await (instance as any).getFromCache('test-key'); // ❌ 不推荐
expect((instance as any)._cache.size).toBe(1); // ❌ 不推荐
```
#### 🎯 适用场景
@@ -453,13 +437,11 @@ expect((instance as any)._cache.size).toBe(1); // ❌ 不推荐
- **Mock 对象**: 对于测试用的 Mock 数据,使用 `as any` 避免复杂的类型定义
- **第三方库**: 处理复杂的第三方库类型时,适当使用 `any` 提高效率
- **测试断言**: 在确定对象存在的测试场景中,使用 `!` 非空断言
- **私有成员访问**: 优先使用中括号 `instance['privateMethod']()` 而不是 `(instance as any).privateMethod()`
- **临时调试**: 快速编写测试时,先用 `any` 保证功能,后续可选择性地优化类型
#### ⚠️ 注意事项
- **适度使用**: 不要过度依赖 `any`,核心业务逻辑的类型仍应保持严格
- **私有成员访问优先级**: 中括号访问 > `as any` 转换,保持更好的类型安全性
- **文档说明**: 对于使用 `any` 的复杂场景,添加注释说明原因
- **测试覆盖**: 确保即使使用了 `any`,测试仍能有效验证功能正确性
+14 -55
View File
@@ -1,62 +1,21 @@
---
description: TypeScript code style and optimization guidelines
description:
globs: *.ts,*.tsx,*.mts
alwaysApply: false
---
# TypeScript Code Style Guide
## Types and Type Safety
TypeScript Code Style Guide:
- Avoid explicit type annotations when TypeScript can infer types.
- Avoid implicitly `any` variables; explicitly type when necessary (e.g., `let a: number` instead of `let a`).
- Use the most accurate type possible (e.g., prefer `Record<PropertyKey, unknown>` over `object`).
- Prefer `interface` over `type` for object shapes (e.g., React component props). Keep `type` for unions, intersections, and utility types.
- Prefer `as const satisfies XyzInterface` over plain `as const` when suitable.
## Imports and Modules
- When importing a directory module, prefer the explicit index path like `@/db/index` instead of `@/db`.
## Asynchronous Patterns and Concurrency
- Prefer `async`/`await` over callbacks or chained `.then` promises.
- Prefer async APIs over sync ones (avoid `*Sync`).
- Prefer promise-based variants (e.g., `import { readFile } from 'fs/promises'`) over callback-based APIs from `fs`.
- Where safe, convert sequential async flows to concurrent ones with `Promise.all`, `Promise.race`, etc.
## Code Structure and Readability
- Refactor repeated logic into reusable functions.
- Prefer object destructuring when accessing and using properties.
- Use consistent, descriptive naming; avoid obscure abbreviations.
- Use semantically meaningful variable, function, and class names.
- Replace magic numbers or strings with well-named constants.
- Keep meaningful code comments; do not remove them when applying edits. Update comments when behavior changes.
- Ensure JSDoc comments accurately reflect the implementation.
- Look for opportunities to simplify or modernize code with the latest JavaScript/TypeScript features where it improves clarity.
- Defer formatting to tooling; ignore purely formatting-only issues and autofixable lint problems.
- Respect project Prettier settings.
## UI and Theming
- Use components from `@lobehub/ui`, Ant Design, or existing design system components instead of raw HTML tags (e.g., `Button` vs. `button`).
- Design for dark mode and mobile responsiveness:
- Use the `antd-style` token system instead of hard-coded colors.
- Select appropriate component variants.
## Performance
- Prefer `for…of` loops to index-based `for` loops when feasible.
- Decide whether callbacks should be debounced or throttled based on UX and performance needs.
- Reuse existing npm packages rather than reinventing the wheel (e.g., `lodash-es/omit`).
- Query only the required columns from a database rather than selecting entire rows.
## Time and Consistency
- Instead of calling `Date.now()` multiple times, assign it to a constant once and reuse it to ensure consistency and improve readability.
## Some logging rules
- Never log user private information like api key, etc
- Don't use `import { log } from 'debug'` to log messages, because it will directly log the message to the console.
- Avoid defining `any` type variables (e.g., `let a: number;` instead of `let a;`).
- Use the most accurate type possible (e.g., use `Record<PropertyKey, unknown>` instead of `object`).
- Prefer `interface` over `type` (e.g., define react component props).
- Use `as const satisfies XyzInterface` instead of `as const` when suitable
- import index.ts module(directory module) like `@/db/index` instead of `@/db`
- Instead of calling Date.now() multiple times, assign it to a constant once and reuse it. This ensures consistency and improves readability
- Always refactor repeated logic into a reusable function
- Don't remove meaningful code comments, be sure to keep original comments when providing applied code
- Update the code comments when needed after you modify the related code
- Please respect my prettier preferences when you provide code
- Prefer object destructuring when accessing and using properties
- Prefer async version api than sync version, eg: use readFile from 'fs/promises' instead of 'fs'
-14
View File
@@ -140,20 +140,6 @@ OPENAI_API_KEY=sk-xxxxxxxxx
# INFINIAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
### 302.AI ###
# AI302_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
### ModelScope ###
# MODELSCOPE_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
### AiHubMix ###
# AIHUBMIX_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
########################################
############ Market Service ############
########################################
-17
View File
@@ -29,20 +29,3 @@ logs
# misc
# add other ignore file below
.next
# temporary directories
tmp
temp
.temp
.local
docs/.local
# cache directories
.cache
# AI coding tools directories
.claude
.serena
# MCP tools
/.serena/**
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
git config --global user.name "lobehubbot"
git config --global user.email "i@lobehub.com"
- uses: actions/checkout@v5
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
-64
View File
@@ -1,64 +0,0 @@
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
issues:
types: [opened, assigned]
pull_request_review:
types: [submitted]
jobs:
claude:
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
actions: read # Required for Claude to read CI results on PRs
steps:
- name: Checkout repository
uses: actions/checkout@v5
with:
fetch-depth: 1
- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@beta
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
# This is an optional setting that allows Claude to read CI results on PRs
additional_permissions: |
actions: read
# Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4)
model: 'claude-opus-4-1-20250805'
allowed_bots: 'bot'
# Optional: Customize the trigger phrase (default: @claude)
# trigger_phrase: "/claude"
# Optional: Trigger when specific user is assigned to an issue
# assignee_trigger: "claude-bot"
# Optional: Allow Claude to run specific commands
allowed_tools: 'Bash(bun run:*),Bash(pnpm run:*),Bash(npm run:*),Bash(npx vitest:*),Bash(rg:*),Bash(find:*),Bash(sed:*),Bash(grep:*),Bash(awk:*),Bash(wc:*),Bash(xargs:*)'
# Optional: Add custom instructions for Claude to customize its behavior for your project
# custom_instructions: |
# Follow our coding standards
# Ensure all new code has tests
# Use TypeScript for new files
# Optional: Custom environment variables for Claude
# claude_env: |
# NODE_ENV: test
+6 -14
View File
@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest # 只在 ubuntu 上运行一次检查
steps:
- name: Checkout base
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -35,7 +35,7 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 10
version: 9
- name: Install deps
run: pnpm install
@@ -56,7 +56,7 @@ jobs:
# 输出版本信息,供后续 job 使用
version: ${{ steps.set_version.outputs.version }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -95,7 +95,7 @@ jobs:
matrix:
os: [macos-latest, windows-2025, ubuntu-latest]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -107,7 +107,7 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 10
version: 9
# node-linker=hoisted 模式将可以确保 asar 压缩可用
- name: Install deps
@@ -183,10 +183,6 @@ jobs:
apps/desktop/release/*.zip*
apps/desktop/release/*.exe*
apps/desktop/release/*.AppImage
apps/desktop/release/*.deb*
apps/desktop/release/*.snap*
apps/desktop/release/*.rpm*
apps/desktop/release/*.tar.gz*
retention-days: 5
publish-pr:
@@ -200,7 +196,7 @@ jobs:
outputs:
artifact_path: ${{ steps.set_path.outputs.path }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -249,10 +245,6 @@ jobs:
release/*.zip*
release/*.exe*
release/*.AppImage
release/*.deb*
release/*.snap*
release/*.rpm*
release/*.tar.gz*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+3 -3
View File
@@ -39,7 +39,7 @@ jobs:
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Checkout base
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -80,7 +80,7 @@ jobs:
- name: Build and export
id: build
uses: docker/build-push-action@v6
uses: docker/build-push-action@v5
with:
platforms: ${{ matrix.platform }}
context: .
@@ -111,7 +111,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout base
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
fetch-depth: 0
+3 -3
View File
@@ -39,7 +39,7 @@ jobs:
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Checkout base
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -80,7 +80,7 @@ jobs:
- name: Build and export
id: build
uses: docker/build-push-action@v6
uses: docker/build-push-action@v5
with:
platforms: ${{ matrix.platform }}
context: .
@@ -111,7 +111,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout base
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
fetch-depth: 0
+3 -3
View File
@@ -39,7 +39,7 @@ jobs:
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Checkout base
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -80,7 +80,7 @@ jobs:
- name: Build and export
id: build
uses: docker/build-push-action@v6
uses: docker/build-push-action@v5
with:
platforms: ${{ matrix.platform }}
context: .
@@ -111,7 +111,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout base
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
fetch-depth: 0
+2 -2
View File
@@ -42,12 +42,12 @@ jobs:
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
env:
REPO_BRANCH: ${{ matrix.REPO_BRANCH || env.REPO_BRANCH }}
- uses: actions/checkout@v5
- uses: actions/checkout@v4
with:
repository: ${{ env.REPOSITORY }}
token: ${{ secrets[matrix.TOKEN_NAME] || secrets[env.TOKEN_NAME] }}
ref: ${{ env.BRANCH }}
- uses: actions/checkout@v5
- uses: actions/checkout@v4
with:
repository: 'myactionway/lighthouse-badges'
path: temp_lighthouse_badges_nested
+5 -13
View File
@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest # 只在 ubuntu 上运行一次检查
steps:
- name: Checkout base
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -31,7 +31,7 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 10
version: 9
- name: Install deps
run: pnpm install
@@ -47,7 +47,7 @@ jobs:
version: ${{ steps.set_version.outputs.version }}
is_pr_build: ${{ steps.set_version.outputs.is_pr_build }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -82,7 +82,7 @@ jobs:
matrix:
os: [macos-latest, windows-2025, ubuntu-latest]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -94,7 +94,7 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 10
version: 9
# node-linker=hoisted 模式将可以确保 asar 压缩可用
- name: Install deps
@@ -165,10 +165,6 @@ jobs:
apps/desktop/release/*.zip*
apps/desktop/release/*.exe*
apps/desktop/release/*.AppImage
apps/desktop/release/*.deb*
apps/desktop/release/*.snap*
apps/desktop/release/*.rpm*
apps/desktop/release/*.tar.gz*
retention-days: 5
# 正式版发布 job
@@ -205,9 +201,5 @@ jobs:
release/*.zip*
release/*.exe*
release/*.AppImage
release/*.deb*
release/*.snap*
release/*.rpm*
release/*.tar.gz*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+2 -2
View File
@@ -11,7 +11,7 @@ jobs:
services:
postgres:
image: pgvector/pgvector:pg17
image: pgvector/pgvector:pg16
env:
POSTGRES_PASSWORD: postgres
options: >-
@@ -20,7 +20,7 @@ jobs:
- 5432:5432
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Install dbdocs
run: sudo npm install -g dbdocs
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
if: ${{ github.event.repository.fork }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Clean issue notice
uses: actions-cool/issues-helper@v3
+14 -76
View File
@@ -2,82 +2,8 @@ name: Test CI
on: [push, pull_request]
permissions:
contents: read
jobs:
# Package tests - using each package's own test script
test-packages:
runs-on: ubuntu-latest
strategy:
matrix:
package: [file-loaders, prompts, model-runtime, web-crawler, electron-server-ipc]
name: Test package ${{ matrix.package }}
steps:
- uses: actions/checkout@v5
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- uses: pnpm/action-setup@v4
- name: Install bun
uses: oven-sh/setup-bun@v1
with:
bun-version: ${{ secrets.BUN_VERSION }}
- name: Install deps
run: bun i
- name: Test ${{ matrix.package }} package with coverage
run: pnpm --filter @lobechat/${{ matrix.package }} test:coverage
- name: Upload ${{ matrix.package }} coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./packages/${{ matrix.package }}/coverage/lcov.info
flags: packages/${{ matrix.package }}
# App tests
test-website:
name: Test Website
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install bun
uses: oven-sh/setup-bun@v1
with:
bun-version: ${{ secrets.BUN_VERSION }}
- name: Install deps
run: bun i
- name: Test App Coverage
run: bun run test-app:coverage
- name: Upload App Coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage/app/lcov.info
flags: app
test-server:
name: Test Database
test:
runs-on: ubuntu-latest
services:
@@ -87,11 +13,13 @@ jobs:
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
ports:
- 5432:5432
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
@@ -125,3 +53,13 @@ jobs:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage/server/lcov.info
flags: server
- name: Test App Coverage
run: bun run test-app:coverage
- name: Upload App Coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage/app/lcov.info
flags: app
+19
View File
@@ -0,0 +1,19 @@
name: Wiki Sync
on:
workflow_dispatch:
push:
paths:
- 'docs/wiki/**'
branches:
- main
jobs:
update-wiki:
runs-on: ubuntu-latest
name: Wiki sync
steps:
- uses: OrlovM/Wiki-Action@v1
with:
path: 'docs/wiki'
token: ${{ secrets.GH_TOKEN }}
+57 -91
View File
@@ -1,111 +1,77 @@
# Gitignore for LobeHub
################################################################
# System files
# general
.DS_Store
Thumbs.db
ehthumbs.db
Desktop.ini
# Linux/Ubuntu system files
*~
*.swp
*.swo
.fuse_hidden*
.directory
.Trash-*
.nfs*
.gvfs-fuse-daemon-*
# IDE and editors
.idea/
*.sublime-*
.history/
.windsurfrules
*.code-workspace
# Temporary files
.temp/
temp/
tmp/
*.tmp
*.temp
*.log
*.cache
.cache/
# Environment files
.env
.idea
.vscode
.history
.temp
.env.local
.env*.local
venv/
.venv/
venv
temp
tmp
.windsurfrules
# Dependencies
node_modules/
# dependencies
node_modules
*.log
*.lock
package-lock.json
bun.lockb
.pnpm-store/
# Build outputs
dist/
es/
lib/
.next/
logs/
test-output/
*.tsbuildinfo
next-env.d.ts
# Framework specific
# Umi
.umi/
.umi-production/
.umi-test/
.dumi/tmp*/
# Vercel
.vercel/
# Testing and CI
coverage/
.coverage/
.nyc_output/
# ci
coverage
.coverage
.eslintcache
.stylelintcache
# Service Worker
# production
dist
es
lib
logs
test-output
# umi
.umi
.umi-production
.umi-test
.dumi/tmp*
# husky
.husky/prepare-commit-msg
# local env files
.env*.local
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
.next
.env
public/*.js
public/sitemap.xml
public/sitemap-index.xml
bun.lockb
sitemap*.xml
robots.txt
# Serwist
public/sw*
public/swe-worker*
# Generated files
public/*.js
public/sitemap.xml
public/sitemap-index.xml
sitemap*.xml
robots.txt
# Git hooks
.husky/prepare-commit-msg
# Documents and media
*.patch
*.pdf
# Cloud service keys
vertex-ai-key.json
# AI coding tools
.local/
.claude/
.mcp.json
CLAUDE.local.md
# Misc
.pnpm-store
./packages/lobe-ui
*.ppt*
*.doc*
*.xls*
# local use ai coding files
docs/.prd
.claude
.mcp.json
CLAUDE.md
+1 -1
View File
@@ -25,7 +25,7 @@ module.exports = defineConfig({
],
temperature: 0,
saveImmediately: true,
modelName: 'gpt-5-mini',
modelName: 'gpt-4.1-mini',
experimental: {
jsonMode: true,
},
-39
View File
@@ -1,39 +0,0 @@
# Stylelintignore for LobeHub
################################################################
# dependencies
node_modules
# ci
coverage
.coverage
# production
dist
es
lib
logs
# framework specific
.next
.umi
.umi-production
.umi-test
.dumi/tmp*
# temporary directories
tmp
temp
.temp
.local
docs/.local
# cache directories
.cache
# AI coding tools directories
.claude
.serena
# MCP tools
/.serena/**
-13
View File
@@ -1,13 +0,0 @@
{
"recommendations": [
"Anthropic.claude-code",
"dbaeumer.vscode-eslint",
"jrr997.antd-docs",
"seatonjiang.gitmoji-vscode",
"styled-components.vscode-styled-components",
"stylelint.vscode-stylelint",
"unifiedjs.vscode-mdx",
"unifiedjs.vscode-remark",
"vitest.explorer",
]
}
-89
View File
@@ -1,89 +0,0 @@
{
"npm.packageManager": "pnpm",
// don't show errors, but fix when save and git pre commit
"eslint.rules.customizations": [
{ "rule": "import/order", "severity": "off" },
{ "rule": "prettier/prettier", "severity": "off" },
{ "rule": "react/jsx-sort-props", "severity": "off" },
{ "rule": "sort-keys-fix/sort-keys-fix", "severity": "off" },
{ "rule": "typescript-sort-keys/interface", "severity": "off" }
],
"stylelint.validate": [
"css",
"postcss",
// make stylelint work with tsx antd-style css template string
"typescriptreact"
],
"search.exclude": {
"**/node_modules": true,
// useless to search this big folder
"locales": true
},
"vitest.maximumConfigs": 6,
"workbench.editor.customLabels.patterns": {
"**/app/**/[[]*[]]/[[]*[]]/page.tsx": "${dirname(2)}/${dirname(1)}/${dirname} • page component",
"**/app/**/[[]*[]]/page.tsx": "${dirname(1)}/${dirname} • page component",
"**/app/**/page.tsx": "${dirname} • page component",
"**/app/**/[[]*[]]/[[]*[]]/layout.tsx": "${dirname(2)}/${dirname(1)}/${dirname} • page layout",
"**/app/**/[[]*[]]/layout.tsx": "${dirname(1)}/${dirname} • page layout",
"**/app/**/layout.tsx": "${dirname} • page layout",
"**/app/**/[[]*[]]/[[]*[]]/default.tsx": "${dirname(2)}/${dirname(1)}/${dirname} • slot default",
"**/app/**/[[]*[]]/default.tsx": "${dirname(1)}/${dirname} • slot default",
"**/app/**/default.tsx": "${dirname} • slot default",
"**/app/**/[[]*[]]/[[]*[]]/error.tsx": "${dirname(2)}/${dirname(1)}/${dirname} • error component",
"**/app/**/[[]*[]]/error.tsx": "${dirname(1)}/${dirname} • error component",
"**/app/**/error.tsx": "${dirname} • error component",
"**/app/**/[[]*[]]/[[]*[]]/loading.tsx": "${dirname(2)}/${dirname(1)}/${dirname} • loading component",
"**/app/**/[[]*[]]/loading.tsx": "${dirname(1)}/${dirname} • loading component",
"**/app/**/loading.tsx": "${dirname} • loading component",
"**/src/**/route.ts": "${dirname(1)}/${dirname} • route",
"**/src/**/index.tsx": "${dirname} • component",
"**/src/database/repositories/*/index.ts": "${dirname} • db repository",
"**/src/database/models/*.ts": "${filename} • db model",
"**/src/database/schemas/*.ts": "${filename} • db schema",
"**/src/services/*.ts": "${filename} • service",
"**/src/services/*/client.ts": "${dirname} • client service",
"**/src/services/*/server.ts": "${dirname} • server service",
"**/src/store/*/action.ts": "${dirname} • action",
"**/src/store/*/slices/*/action.ts": "${dirname(2)}/${dirname} • action",
"**/src/store/*/slices/*/actions/*.ts": "${dirname(1)}/${dirname}/${filename} • action",
"**/src/store/*/initialState.ts": "${dirname} • state",
"**/src/store/*/slices/*/initialState.ts": "${dirname(2)}/${dirname} • state",
"**/src/store/*/selectors.ts": "${dirname} • selectors",
"**/src/store/*/slices/*/selectors.ts": "${dirname(2)}/${dirname} • selectors",
"**/src/store/*/reducer.ts": "${dirname} • reducer",
"**/src/store/*/slices/*/reducer.ts": "${dirname(2)}/${dirname} • reducer",
"**/src/config/modelProviders/*.ts": "${filename} • provider",
"**/src/config/aiModels/*.ts": "${filename} • model",
"**/src/config/paramsSchemas/*/*.json": "${dirname(1)}/${filename} • params",
"**/packages/model-runtime/src/*/index.ts": "${dirname} • runtime",
"**/src/server/services/*/index.ts": "${dirname} • server/service",
"**/src/server/routers/lambda/*.ts": "${filename} • lambda",
"**/src/server/routers/async/*.ts": "${filename} • async",
"**/src/server/routers/edge/*.ts": "${filename} • edge",
"**/src/locales/default/*.ts": "${filename} • locale",
},
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"markdown",
// support mdx
"mdx"
]
}
-1567
View File
File diff suppressed because it is too large Load Diff
-117
View File
@@ -1,117 +0,0 @@
# CLAUDE.md
This document serves as a shared guideline for all team members when using Claude Code in this repository.
## Suggestions
- When searching the project source code, it is recommended to exclude: `src/database/migrations/meta`, `**/*.test.*`, `**/__snapshots__`, `**/fixtures`
- Please store all temporary scripts (such as migration and refactoring scripts) in the `docs/.local/` directory; the contents of this folder will not be committed.
## Technologies Stack
read @.cursor/rules/project-introduce.mdc for more details.
### Directory Structure
```plaintext
src/
├── app/ # Next.js App Router
├── features/ # Feature-based UI components
├── store/ # Zustand state stores
├── services/ # Client services (tRPC/Model calls)
├── server/ # Server-side (tRPC routers, services)
├── database/ # Schemas, models, repositories
├── libs/ # External library integrations
```
### Data Flow
- **Client DB Version**: UI → Zustand → Service → Model → PGLite
- **Server DB Version**: UI → Zustand → Service → tRPC → Repository/Model → PostgreSQL
## Development
### Git Workflow
- use rebase for git pull.
- git commit message should prefix with gitmoji.
- git branch name format example: tj/feat/feature-name
- use .github/PULL_REQUEST_TEMPLATE.md to generate pull request description
### Package Management
this is a monorepo project and we use `pnpm` as package manager
### TypeScript Code Style Guide
see @.cursor/rules/typescript.mdc
### Modify Code Rules
- **Code Language**:
- For files with existing Chinese comments: Continue using Chinese to maintain consistency
- For new files or files without Chinese comments: MUST use American English.
- eg: new react tsx file and new test file
- Conservative for existing code, modern approaches for new features
### Testing
Testing work follows the Rule-Aware Task Execution system above.
- **Required Rule**: `testing-guide/testing-guide.mdc`
- **Command**: `npx vitest run --config vitest.config.ts '[file-path-pattern]'`, wrapped in single quotes to avoid shell expansion
**Important**:
- Never run `bun run test` etc to run tests, this will run all tests and cost about 10mins
- If try to fix the same test twice, but still failed, stop and ask for help.
### Typecheck
- use `bun run type-check` to check type errors.
### Internationalization
- **Keys**: Add to `src/locales/default/namespace.ts`
- **Dev**: Translate at least `zh-CN` files for preview
- **Structure**: Hierarchical nested objects, not flat keys
- **Script**: DON'T run `pnpm i18n` (user/CI handles it)
## Rules Index
Some useful rules of this project. Read them when needed.
**IMPORTANT**: All rule files referenced in this document are located in the `.cursor/rules/` directory. Throughout this document, rule files are referenced by their filename only for brevity.
### 📋 Complete Rule Files
**Core Development**
- `backend-architecture.mdc` - Three-layer architecture, data flow
- `react-component.mdc` - antd-style, Lobe UI usage
- `drizzle-schema-style-guide.mdc` - Schema naming, patterns
- `define-database-model.mdc` - Model templates, CRUD patterns
**State & UI**
- `zustand-slice-organization.mdc` - Store organization
- `zustand-action-patterns.mdc` - Action patterns
- `packages/react-layout-kit.mdc` - Layout components usage
**Testing & Quality**
- `testing-guide/testing-guide.mdc` - Test strategy, mock patterns
- `code-review.mdc` - Review process and standards
**Desktop (Electron)**
- `desktop-feature-implementation.mdc` - Main/renderer process patterns
- `desktop-local-tools-implement.mdc` - Tool integration workflow
- `desktop-menu-configuration.mdc` - App menu, context menu, tray menu
- `desktop-window-management.mdc` - Window creation, state management, multi-window
- `desktop-controller-tests.mdc` - Controller unit testing guide
**Development Tools**
- `i18n.mdc` - Internationalization workflow
- `debug.mdc` - Debugging strategies
+1 -5
View File
@@ -150,8 +150,6 @@ ENV \
AI21_API_KEY="" AI21_MODEL_LIST="" \
# Ai360
AI360_API_KEY="" AI360_MODEL_LIST="" \
# AiHubMix
AIHUBMIX_API_KEY="" AIHUBMIX_MODEL_LIST="" \
# Anthropic
ANTHROPIC_API_KEY="" ANTHROPIC_MODEL_LIST="" ANTHROPIC_PROXY_URL="" \
# Amazon Bedrock
@@ -247,9 +245,7 @@ ENV \
# Tencent Cloud
TENCENT_CLOUD_API_KEY="" TENCENT_CLOUD_MODEL_LIST="" \
# Infini-AI
INFINIAI_API_KEY="" INFINIAI_MODEL_LIST="" \
# 302.AI
AI302_API_KEY="" AI302_MODEL_LIST=""
INFINIAI_API_KEY="" INFINIAI_MODEL_LIST=""
USER nextjs
+1 -5
View File
@@ -192,8 +192,6 @@ ENV \
AI21_API_KEY="" AI21_MODEL_LIST="" \
# Ai360
AI360_API_KEY="" AI360_MODEL_LIST="" \
# AiHubMix
AIHUBMIX_API_KEY="" AIHUBMIX_MODEL_LIST="" \
# Anthropic
ANTHROPIC_API_KEY="" ANTHROPIC_MODEL_LIST="" ANTHROPIC_PROXY_URL="" \
# Amazon Bedrock
@@ -289,9 +287,7 @@ ENV \
# Tencent Cloud
TENCENT_CLOUD_API_KEY="" TENCENT_CLOUD_MODEL_LIST="" \
# Infini-AI
INFINIAI_API_KEY="" INFINIAI_MODEL_LIST="" \
# 302.AI
AI302_API_KEY="" AI302_MODEL_LIST=""
INFINIAI_API_KEY="" INFINIAI_MODEL_LIST=""
USER nextjs
+1 -5
View File
@@ -152,8 +152,6 @@ ENV \
AI21_API_KEY="" AI21_MODEL_LIST="" \
# Ai360
AI360_API_KEY="" AI360_MODEL_LIST="" \
# AiHubMix
AIHUBMIX_API_KEY="" AIHUBMIX_MODEL_LIST="" \
# Anthropic
ANTHROPIC_API_KEY="" ANTHROPIC_MODEL_LIST="" ANTHROPIC_PROXY_URL="" \
# Amazon Bedrock
@@ -245,9 +243,7 @@ ENV \
# Tencent Cloud
TENCENT_CLOUD_API_KEY="" TENCENT_CLOUD_MODEL_LIST="" \
# Infini-AI
INFINIAI_API_KEY="" INFINIAI_MODEL_LIST="" \
# 302.AI
AI302_API_KEY="" AI302_MODEL_LIST=""
INFINIAI_API_KEY="" INFINIAI_MODEL_LIST=""
USER nextjs
+8 -9
View File
@@ -245,17 +245,15 @@ We have implemented support for the following model service providers:
- **[Bedrock](https://lobechat.com/discover/provider/bedrock)**: Bedrock is a service provided by Amazon AWS, focusing on delivering advanced AI language and visual models for enterprises. Its model family includes Anthropic's Claude series, Meta's Llama 3.1 series, and more, offering a range of options from lightweight to high-performance, supporting tasks such as text generation, conversation, and image processing for businesses of varying scales and needs.
- **[Google](https://lobechat.com/discover/provider/google)**: Google's Gemini series represents its most advanced, versatile AI models, developed by Google DeepMind, designed for multimodal capabilities, supporting seamless understanding and processing of text, code, images, audio, and video. Suitable for various environments from data centers to mobile devices, it significantly enhances the efficiency and applicability of AI models.
- **[DeepSeek](https://lobechat.com/discover/provider/deepseek)**: DeepSeek is a company focused on AI technology research and application, with its latest model DeepSeek-V2.5 integrating general dialogue and code processing capabilities, achieving significant improvements in human preference alignment, writing tasks, and instruction following.
- **[Moonshot](https://lobechat.com/discover/provider/moonshot)**: Moonshot is an open-source platform launched by Beijing Dark Side Technology Co., Ltd., providing various natural language processing models with a wide range of applications, including but not limited to content creation, academic research, intelligent recommendations, and medical diagnosis, supporting long text processing and complex generation tasks.
- **[OpenRouter](https://lobechat.com/discover/provider/openrouter)**: OpenRouter is a service platform providing access to various cutting-edge large model interfaces, supporting OpenAI, Anthropic, LLaMA, and more, suitable for diverse development and application needs. Users can flexibly choose the optimal model and pricing based on their requirements, enhancing the AI experience.
- **[HuggingFace](https://lobechat.com/discover/provider/huggingface)**: The HuggingFace Inference API provides a fast and free way for you to explore thousands of models for various tasks. Whether you are prototyping for a new application or experimenting with the capabilities of machine learning, this API gives you instant access to high-performance models across multiple domains.
- **[OpenRouter](https://lobechat.com/discover/provider/openrouter)**: OpenRouter is a service platform providing access to various cutting-edge large model interfaces, supporting OpenAI, Anthropic, LLaMA, and more, suitable for diverse development and application needs. Users can flexibly choose the optimal model and pricing based on their requirements, enhancing the AI experience.
- **[Cloudflare Workers AI](https://lobechat.com/discover/provider/cloudflare)**: Run serverless GPU-powered machine learning models on Cloudflare's global network.
<details><summary><kbd>See more providers (+32)</kbd></summary>
- **[GitHub](https://lobechat.com/discover/provider/github)**: With GitHub Models, developers can become AI engineers and leverage the industry's leading AI models.
<details><summary><kbd>See more providers (+31)</kbd></summary>
- **[Novita](https://lobechat.com/discover/provider/novita)**: Novita AI is a platform providing a variety of large language models and AI image generation API services, flexible, reliable, and cost-effective. It supports the latest open-source models like Llama3 and Mistral, offering a comprehensive, user-friendly, and auto-scaling API solution for generative AI application development, suitable for the rapid growth of AI startups.
- **[PPIO](https://lobechat.com/discover/provider/ppio)**: PPIO supports stable and cost-efficient open-source LLM APIs, such as DeepSeek, Llama, Qwen etc.
- **[302.AI](https://lobechat.com/discover/provider/ai302)**: 302.AI is an on-demand AI application platform offering the most comprehensive AI APIs and online AI applications available on the market.
- **[Together AI](https://lobechat.com/discover/provider/togetherai)**: Together AI is dedicated to achieving leading performance through innovative AI models, offering extensive customization capabilities, including rapid scaling support and intuitive deployment processes to meet various enterprise needs.
- **[Fireworks AI](https://lobechat.com/discover/provider/fireworksai)**: Fireworks AI is a leading provider of advanced language model services, focusing on functional calling and multimodal processing. Its latest model, Firefunction V2, is based on Llama-3, optimized for function calling, conversation, and instruction following. The visual language model FireLLaVA-13B supports mixed input of images and text. Other notable models include the Llama series and Mixtral series, providing efficient multilingual instruction following and generation support.
- **[Groq](https://lobechat.com/discover/provider/groq)**: Groq's LPU inference engine has excelled in the latest independent large language model (LLM) benchmarks, redefining the standards for AI solutions with its remarkable speed and efficiency. Groq represents instant inference speed, demonstrating strong performance in cloud-based deployments.
@@ -274,6 +272,7 @@ We have implemented support for the following model service providers:
- **[Spark](https://lobechat.com/discover/provider/spark)**: iFlytek's Spark model provides powerful AI capabilities across multiple domains and languages, utilizing advanced natural language processing technology to build innovative applications suitable for smart hardware, smart healthcare, smart finance, and other vertical scenarios.
- **[SenseNova](https://lobechat.com/discover/provider/sensenova)**: SenseNova, backed by SenseTime's robust infrastructure, offers efficient and user-friendly full-stack large model services.
- **[Stepfun](https://lobechat.com/discover/provider/stepfun)**: StepFun's large model possesses industry-leading multimodal and complex reasoning capabilities, supporting ultra-long text understanding and powerful autonomous scheduling search engine functions.
- **[Moonshot](https://lobechat.com/discover/provider/moonshot)**: Moonshot is an open-source platform launched by Beijing Dark Side Technology Co., Ltd., providing various natural language processing models with a wide range of applications, including but not limited to content creation, academic research, intelligent recommendations, and medical diagnosis, supporting long text processing and complex generation tasks.
- **[Baichuan](https://lobechat.com/discover/provider/baichuan)**: Baichuan Intelligence is a company focused on the research and development of large AI models, with its models excelling in domestic knowledge encyclopedias, long text processing, and generative creation tasks in Chinese, surpassing mainstream foreign models. Baichuan Intelligence also possesses industry-leading multimodal capabilities, performing excellently in multiple authoritative evaluations. Its models include Baichuan 4, Baichuan 3 Turbo, and Baichuan 3 Turbo 128k, each optimized for different application scenarios, providing cost-effective solutions.
- **[Minimax](https://lobechat.com/discover/provider/minimax)**: MiniMax is a general artificial intelligence technology company established in 2021, dedicated to co-creating intelligence with users. MiniMax has independently developed general large models of different modalities, including trillion-parameter MoE text models, voice models, and image models, and has launched applications such as Conch AI.
- **[InternLM](https://lobechat.com/discover/provider/internlm)**: An open-source organization dedicated to the research and development of large model toolchains. It provides an efficient and user-friendly open-source platform for all AI developers, making cutting-edge large models and algorithm technologies easily accessible.
@@ -287,7 +286,7 @@ We have implemented support for the following model service providers:
</details>
> 📊 Total providers: [<kbd>**42**</kbd>](https://lobechat.com/discover/providers)
> 📊 Total providers: [<kbd>**41**</kbd>](https://lobechat.com/discover/providers)
<!-- PROVIDER LIST -->
@@ -385,11 +384,11 @@ In addition, these plugins are not limited to news aggregation, but can also ext
| Recent Submits | Description |
| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| [PortfolioMeta](https://lobechat.com/discover/plugin/StockData)<br/><sup>By **portfoliometa** on **2025-07-21**</sup> | Analyze stocks and get comprehensive real-time investment data and analytics.<br/>`stock` |
| [Speak](https://lobechat.com/discover/plugin/speak)<br/><sup>By **speak** on **2025-07-18**</sup> | Learn how to say anything in another language with Speak, your AI-powered language tutor.<br/>`education` `language` |
| [Web](https://lobechat.com/discover/plugin/web)<br/><sup>By **Proghit** on **2025-01-24**</sup> | Smart web search that reads and analyzes pages to deliver comprehensive answers from Google results.<br/>`web` `search` |
| [Bing_websearch](https://lobechat.com/discover/plugin/Bingsearch-identifier)<br/><sup>By **FineHow** on **2024-12-22**</sup> | Search for information from the internet base BingApi<br/>`bingsearch` |
| [Google CSE](https://lobechat.com/discover/plugin/google-cse)<br/><sup>By **vsnthdev** on **2024-12-02**</sup> | Searches Google through their official CSE API.<br/>`web` `search` |
> 📊 Total plugins: [<kbd>**42**</kbd>](https://lobechat.com/discover/plugins)
> 📊 Total plugins: [<kbd>**43**</kbd>](https://lobechat.com/discover/plugins)
<!-- PLUGIN LIST -->
+8 -9
View File
@@ -245,17 +245,15 @@ LobeChat 支持文件上传与知识库功能,你可以上传文件、图片
- **[Bedrock](https://lobechat.com/discover/provider/bedrock)**: Bedrock 是亚马逊 AWS 提供的一项服务,专注于为企业提供先进的 AI 语言模型和视觉模型。其模型家族包括 Anthropic 的 Claude 系列、Meta 的 Llama 3.1 系列等,涵盖从轻量级到高性能的多种选择,支持文本生成、对话、图像处理等多种任务,适用于不同规模和需求的企业应用。
- **[Google](https://lobechat.com/discover/provider/google)**: Google 的 Gemini 系列是其最先进、通用的 AI 模型,由 Google DeepMind 打造,专为多模态设计,支持文本、代码、图像、音频和视频的无缝理解与处理。适用于从数据中心到移动设备的多种环境,极大提升了 AI 模型的效率与应用广泛性。
- **[DeepSeek](https://lobechat.com/discover/provider/deepseek)**: DeepSeek 是一家专注于人工智能技术研究和应用的公司,其最新模型 DeepSeek-V3 多项评测成绩超越 Qwen2.5-72B 和 Llama-3.1-405B 等开源模型,性能对齐领军闭源模型 GPT-4o 与 Claude-3.5-Sonnet。
- **[Moonshot](https://lobechat.com/discover/provider/moonshot)**: Moonshot 是由北京月之暗面科技有限公司推出的开源平台,提供多种自然语言处理模型,应用领域广泛,包括但不限于内容创作、学术研究、智能推荐、医疗诊断等,支持长文本处理和复杂生成任务。
- **[OpenRouter](https://lobechat.com/discover/provider/openrouter)**: OpenRouter 是一个提供多种前沿大模型接口的服务平台,支持 OpenAI、Anthropic、LLaMA 及更多,适合多样化的开发和应用需求。用户可根据自身需求灵活选择最优的模型和价格,助力 AI 体验的提升。
- **[HuggingFace](https://lobechat.com/discover/provider/huggingface)**: HuggingFace Inference API 提供了一种快速且免费的方式,让您可以探索成千上万种模型,适用于各种任务。无论您是在为新应用程序进行原型设计,还是在尝试机器学习的功能,这个 API 都能让您即时访问多个领域的高性能模型。
- **[OpenRouter](https://lobechat.com/discover/provider/openrouter)**: OpenRouter 是一个提供多种前沿大模型接口的服务平台,支持 OpenAI、Anthropic、LLaMA 及更多,适合多样化的开发和应用需求。用户可根据自身需求灵活选择最优的模型和价格,助力 AI 体验的提升。
- **[Cloudflare Workers AI](https://lobechat.com/discover/provider/cloudflare)**: 在 Cloudflare 的全球网络上运行由无服务器 GPU 驱动的机器学习模型。
<details><summary><kbd>See more providers (+32)</kbd></summary>
- **[GitHub](https://lobechat.com/discover/provider/github)**: 通过 GitHub 模型,开发人员可以成为 AI 工程师,并使用行业领先的 AI 模型进行构建。
<details><summary><kbd>See more providers (+31)</kbd></summary>
- **[Novita](https://lobechat.com/discover/provider/novita)**: Novita AI 是一个提供多种大语言模型与 AI 图像生成的 API 服务的平台,灵活、可靠且具有成本效益。它支持 Llama3、Mistral 等最新的开源模型,并为生成式 AI 应用开发提供了全面、用户友好且自动扩展的 API 解决方案,适合 AI 初创公司的快速发展。
- **[PPIO](https://lobechat.com/discover/provider/ppio)**: PPIO 派欧云提供稳定、高性价比的开源模型 API 服务,支持 DeepSeek 全系列、Llama、Qwen 等行业领先大模型。
- **[302.AI](https://lobechat.com/discover/provider/ai302)**: 302.AI 是一个按需付费的 AI 应用平台,提供市面上最全的 AI API 和 AI 在线应用
- **[Together AI](https://lobechat.com/discover/provider/togetherai)**: Together AI 致力于通过创新的 AI 模型实现领先的性能,提供广泛的自定义能力,包括快速扩展支持和直观的部署流程,满足企业的各种需求。
- **[Fireworks AI](https://lobechat.com/discover/provider/fireworksai)**: Fireworks AI 是一家领先的高级语言模型服务商,专注于功能调用和多模态处理。其最新模型 Firefunction V2 基于 Llama-3,优化用于函数调用、对话及指令跟随。视觉语言模型 FireLLaVA-13B 支持图像和文本混合输入。其他 notable 模型包括 Llama 系列和 Mixtral 系列,提供高效的多语言指令跟随与生成支持。
- **[Groq](https://lobechat.com/discover/provider/groq)**: Groq 的 LPU 推理引擎在最新的独立大语言模型(LLM)基准测试中表现卓越,以其惊人的速度和效率重新定义了 AI 解决方案的标准。Groq 是一种即时推理速度的代表,在基于云的部署中展现了良好的性能。
@@ -274,6 +272,7 @@ LobeChat 支持文件上传与知识库功能,你可以上传文件、图片
- **[Spark](https://lobechat.com/discover/provider/spark)**: 科大讯飞星火大模型提供多领域、多语言的强大 AI 能力,利用先进的自然语言处理技术,构建适用于智能硬件、智慧医疗、智慧金融等多种垂直场景的创新应用。
- **[SenseNova](https://lobechat.com/discover/provider/sensenova)**: 商汤日日新,依托商汤大装置的强大的基础支撑,提供高效易用的全栈大模型服务。
- **[Stepfun](https://lobechat.com/discover/provider/stepfun)**: 阶级星辰大模型具备行业领先的多模态及复杂推理能力,支持超长文本理解和强大的自主调度搜索引擎功能。
- **[Moonshot](https://lobechat.com/discover/provider/moonshot)**: Moonshot 是由北京月之暗面科技有限公司推出的开源平台,提供多种自然语言处理模型,应用领域广泛,包括但不限于内容创作、学术研究、智能推荐、医疗诊断等,支持长文本处理和复杂生成任务。
- **[Baichuan](https://lobechat.com/discover/provider/baichuan)**: 百川智能是一家专注于人工智能大模型研发的公司,其模型在国内知识百科、长文本处理和生成创作等中文任务上表现卓越,超越了国外主流模型。百川智能还具备行业领先的多模态能力,在多项权威评测中表现优异。其模型包括 Baichuan 4、Baichuan 3 Turbo 和 Baichuan 3 Turbo 128k 等,分别针对不同应用场景进行优化,提供高性价比的解决方案。
- **[Minimax](https://lobechat.com/discover/provider/minimax)**: MiniMax 是 2021 年成立的通用人工智能科技公司,致力于与用户共创智能。MiniMax 自主研发了不同模态的通用大模型,其中包括万亿参数的 MoE 文本大模型、语音大模型以及图像大模型。并推出了海螺 AI 等应用。
- **[InternLM](https://lobechat.com/discover/provider/internlm)**: 致力于大模型研究与开发工具链的开源组织。为所有 AI 开发者提供高效、易用的开源平台,让最前沿的大模型与算法技术触手可及
@@ -287,7 +286,7 @@ LobeChat 支持文件上传与知识库功能,你可以上传文件、图片
</details>
> 📊 Total providers: [<kbd>**42**</kbd>](https://lobechat.com/discover/providers)
> 📊 Total providers: [<kbd>**41**</kbd>](https://lobechat.com/discover/providers)
<!-- PROVIDER LIST -->
@@ -378,11 +377,11 @@ LobeChat 的插件生态系统是其核心功能的重要扩展,它极大地
| 最近新增 | 描述 |
| -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| [PortfolioMeta](https://lobechat.com/discover/plugin/StockData)<br/><sup>By **portfoliometa** on **2025-07-21**</sup> | 分析股票并获取全面的实时投资数据和分析。<br/>`股票` |
| [Speak](https://lobechat.com/discover/plugin/speak)<br/><sup>By **speak** on **2025-07-18**</sup> | 使用 Speak,您的 AI 语言导师,学习如何用另一种语言说任何事情。<br/>`教育` `语言` |
| [网页](https://lobechat.com/discover/plugin/web)<br/><sup>By **Proghit** on **2025-01-24**</sup> | 智能网页搜索,读取和分析页面,以提供来自 Google 结果的全面答案。<br/>`网页` `搜索` |
| [必应网页搜索](https://lobechat.com/discover/plugin/Bingsearch-identifier)<br/><sup>By **FineHow** on **2024-12-22**</sup> | 通过 BingApi 搜索互联网上的信息<br/>`bingsearch` |
| [谷歌自定义搜索引擎](https://lobechat.com/discover/plugin/google-cse)<br/><sup>By **vsnthdev** on **2024-12-02**</sup> | 通过他们的官方自定义搜索引擎 API 搜索谷歌。<br/>`网络` `搜索` |
> 📊 Total plugins: [<kbd>**42**</kbd>](https://lobechat.com/discover/plugins)
> 📊 Total plugins: [<kbd>**43**</kbd>](https://lobechat.com/discover/plugins)
<!-- PLUGIN LIST -->
+1 -2
View File
@@ -23,9 +23,8 @@ module.exports = defineConfig({
'vi-VN',
'fa-IR',
],
saveImmediately: true,
temperature: 0,
modelName: 'gpt-4.1-mini',
modelName: 'gpt-4o-mini',
experimental: {
jsonMode: true,
},
+1 -23
View File
@@ -11,16 +11,6 @@ console.log(`🚄 Build Version ${packageJSON.version}, Channel: ${channel}`);
const isNightly = channel === 'nightly';
const isBeta = packageJSON.name.includes('beta');
// 根据版本类型确定协议 scheme
const getProtocolScheme = () => {
if (isNightly) return 'lobehub-nightly';
if (isBeta) return 'lobehub-beta';
return 'lobehub';
};
const protocolScheme = getProtocolScheme();
/**
* @type {import('electron-builder').Configuration}
* @see https://www.electron.build/configuration
@@ -64,18 +54,12 @@ const config = {
linux: {
category: 'Utility',
maintainer: 'electronjs.org',
target: ['AppImage', 'snap', 'deb', 'rpm', 'tar.gz'],
target: ['AppImage', 'snap', 'deb'],
},
mac: {
compression: 'maximum',
entitlementsInherit: 'build/entitlements.mac.plist',
extendInfo: {
CFBundleURLTypes: [
{
CFBundleURLName: 'LobeHub Protocol',
CFBundleURLSchemes: [protocolScheme],
},
],
NSCameraUsageDescription: "Application requests access to the device's camera.",
NSDocumentsFolderUsageDescription:
"Application requests access to the user's Documents folder.",
@@ -107,12 +91,6 @@ const config = {
uninstallDisplayName: '${productName}',
uninstallerSidebar: './build/nsis-sidebar.bmp',
},
protocols: [
{
name: 'LobeHub Protocol',
schemes: [protocolScheme],
},
],
publish: [
{
owner: 'lobehub',
+3 -2
View File
@@ -20,10 +20,11 @@
"electron:dev": "electron-vite dev",
"electron:run-unpack": "electron .",
"format": "prettier --write ",
"i18n": "tsx scripts/i18nWorkflow/index.ts && lobe-i18n",
"i18n": "bun run scripts/i18nWorkflow/index.ts && lobe-i18n",
"postinstall": "electron-builder install-app-deps",
"install-isolated": "pnpm install",
"lint": "eslint --cache ",
"pg-server": "bun run scripts/pglite-server.ts",
"start": "electron-vite preview",
"test": "vitest --run",
"typecheck": "tsgo --noEmit -p tsconfig.json"
@@ -51,7 +52,7 @@
"@typescript/native-preview": "7.0.0-dev.20250711.1",
"consola": "^3.1.0",
"cookie": "^1.0.2",
"electron": "^37.2.0",
"electron": "~37.1.0",
"electron-builder": "^26.0.12",
"electron-is": "^3.0.0",
"electron-log": "^5.3.3",
@@ -14,7 +14,6 @@
"edit": {
"copy": "نسخ",
"cut": "قص",
"delete": "حذف",
"paste": "لصق",
"redo": "إعادة",
"selectAll": "تحديد الكل",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Копиране",
"cut": "Изрязване",
"delete": "Изтрий",
"paste": "Поставяне",
"redo": "Повторно",
"selectAll": "Избери всичко",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Kopieren",
"cut": "Ausschneiden",
"delete": "Löschen",
"paste": "Einfügen",
"redo": "Wiederherstellen",
"selectAll": "Alles auswählen",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Copy",
"cut": "Cut",
"delete": "Delete",
"paste": "Paste",
"redo": "Redo",
"selectAll": "Select All",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Copiar",
"cut": "Cortar",
"delete": "Eliminar",
"paste": "Pegar",
"redo": "Rehacer",
"selectAll": "Seleccionar todo",
@@ -14,7 +14,6 @@
"edit": {
"copy": "کپی",
"cut": "برش",
"delete": "حذف",
"paste": "چسباندن",
"redo": "انجام مجدد",
"selectAll": "انتخاب همه",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Copier",
"cut": "Couper",
"delete": "Supprimer",
"paste": "Coller",
"redo": "Rétablir",
"selectAll": "Tout sélectionner",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Copia",
"cut": "Taglia",
"delete": "Elimina",
"paste": "Incolla",
"redo": "Ripeti",
"selectAll": "Seleziona tutto",
@@ -14,7 +14,6 @@
"edit": {
"copy": "コピー",
"cut": "切り取り",
"delete": "削除",
"paste": "貼り付け",
"redo": "やり直し",
"selectAll": "すべて選択",
@@ -14,7 +14,6 @@
"edit": {
"copy": "복사",
"cut": "잘라내기",
"delete": "삭제",
"paste": "붙여넣기",
"redo": "다시 실행",
"selectAll": "모두 선택",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Kopiëren",
"cut": "Knippen",
"delete": "Verwijderen",
"paste": "Plakken",
"redo": "Opnieuw doen",
"selectAll": "Alles selecteren",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Kopiuj",
"cut": "Wytnij",
"delete": "Usuń",
"paste": "Wklej",
"redo": "Ponów",
"selectAll": "Zaznacz wszystko",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Copiar",
"cut": "Cortar",
"delete": "Excluir",
"paste": "Colar",
"redo": "Refazer",
"selectAll": "Selecionar Tudo",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Копировать",
"cut": "Вырезать",
"delete": "Удалить",
"paste": "Вставить",
"redo": "Повторить",
"selectAll": "Выбрать все",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Kopyala",
"cut": "Kes",
"delete": "Sil",
"paste": "Yapıştır",
"redo": "Yinele",
"selectAll": "Tümünü Seç",
@@ -14,7 +14,6 @@
"edit": {
"copy": "Sao chép",
"cut": "Cắt",
"delete": "Xóa",
"paste": "Dán",
"redo": "Làm lại",
"selectAll": "Chọn tất cả",
@@ -14,7 +14,6 @@
"edit": {
"copy": "复制",
"cut": "剪切",
"delete": "删除",
"paste": "粘贴",
"redo": "重做",
"selectAll": "全选",
@@ -14,7 +14,6 @@
"edit": {
"copy": "複製",
"cut": "剪下",
"delete": "刪除",
"paste": "貼上",
"redo": "重做",
"selectAll": "全選",
@@ -1,153 +0,0 @@
import { createLogger } from '@/utils/logger';
import { ControllerModule, createProtocolHandler } from '.';
import { McpSchema } from '../types/protocol';
const logger = createLogger('controllers:McpInstallCtr');
const protocolHandler = createProtocolHandler('plugin');
/**
* 验证 MCP Schema 对象结构
*/
function validateMcpSchema(schema: any): schema is McpSchema {
if (!schema || typeof schema !== 'object') return false;
// 必填字段验证
if (typeof schema.identifier !== 'string' || !schema.identifier) return false;
if (typeof schema.name !== 'string' || !schema.name) return false;
if (typeof schema.author !== 'string' || !schema.author) return false;
if (typeof schema.description !== 'string' || !schema.description) return false;
if (typeof schema.version !== 'string' || !schema.version) return false;
// 可选字段验证
if (schema.homepage !== undefined && typeof schema.homepage !== 'string') return false;
if (schema.icon !== undefined && typeof schema.icon !== 'string') return false;
// config 字段验证
if (!schema.config || typeof schema.config !== 'object') return false;
const config = schema.config;
if (config.type === 'stdio') {
if (typeof config.command !== 'string' || !config.command) return false;
if (config.args !== undefined && !Array.isArray(config.args)) return false;
if (config.env !== undefined && typeof config.env !== 'object') return false;
} else if (config.type === 'http') {
if (typeof config.url !== 'string' || !config.url) return false;
try {
new URL(config.url); // 验证URL格式
} catch {
return false;
}
if (config.headers !== undefined && typeof config.headers !== 'object') return false;
} else {
return false; // 未知的 config type
}
return true;
}
interface McpInstallParams {
id: string;
marketId?: string;
schema?: any;
}
/**
* MCP 插件安装控制器
* 负责处理 MCP 插件安装流程
*/
export default class McpInstallController extends ControllerModule {
/**
* 处理 MCP 插件安装请求
* @param parsedData 解析后的协议数据
* @returns 是否处理成功
*/
@protocolHandler('install')
public async handleInstallRequest(parsedData: McpInstallParams): Promise<boolean> {
try {
// 从参数中提取必需字段
const { id, schema: schemaParam, marketId } = parsedData;
if (!id) {
logger.warn(`🔧 [McpInstall] Missing required MCP parameters:`, {
id: !!id,
});
return false;
}
// 映射协议来源
const isOfficialMarket = marketId === 'lobehub';
// 对于官方市场,schema 是可选的;对于第三方市场,schema 是必需的
if (!isOfficialMarket && !schemaParam) {
logger.warn(`🔧 [McpInstall] Schema is required for third-party marketplace:`, {
marketId,
});
return false;
}
let mcpSchema: McpSchema | undefined;
// 如果提供了 schema 参数,则解析和验证
if (schemaParam) {
try {
mcpSchema = JSON.parse(schemaParam);
} catch (error) {
logger.error(`🔧 [McpInstall] Failed to parse MCP schema:`, error);
return false;
}
if (!validateMcpSchema(mcpSchema)) {
logger.error(`🔧 [McpInstall] Invalid MCP Schema structure`);
return false;
}
// 验证 identifier 与 id 参数匹配
if (mcpSchema.identifier !== id) {
logger.error(`🔧 [McpInstall] Schema identifier does not match URL id parameter:`, {
schemaId: mcpSchema.identifier,
urlId: id,
});
return false;
}
}
logger.debug(`🔧 [McpInstall] MCP install request validated:`, {
hasSchema: !!mcpSchema,
marketId,
pluginId: id,
pluginName: mcpSchema?.name || 'Unknown',
pluginVersion: mcpSchema?.version || 'Unknown',
});
// 广播安装请求到前端
const installRequest = {
marketId,
pluginId: id,
schema: mcpSchema,
};
logger.debug(`🔧 [McpInstall] Broadcasting install request:`, {
hasSchema: !!installRequest.schema,
marketId: installRequest.marketId,
pluginId: installRequest.pluginId,
pluginName: installRequest.schema?.name || 'Unknown',
});
// 通过应用实例广播到前端
if (this.app?.browserManager) {
this.app.browserManager.broadcastToWindow('chat', 'mcpInstallRequest', installRequest);
logger.debug(`🔧 [McpInstall] Install request broadcasted successfully`);
return true;
} else {
logger.error(`🔧 [McpInstall] App or browserManager not available`);
return false;
}
} catch (error) {
logger.error(`🔧 [McpInstall] Error processing install request:`, error);
return false;
}
}
}
+2 -2
View File
@@ -14,8 +14,8 @@ export default class MenuController extends ControllerModule {
* 显示上下文菜单
*/
@ipcClientEvent('showContextMenu')
showContextMenu(params: { data?: any; type: string }) {
return this.app.menuManager.showContextMenu(params.type, params.data);
showContextMenu(type: string, data?: any) {
return this.app.menuManager.showContextMenu(type, data);
}
/**
@@ -29,9 +29,9 @@ describe('MenuController', () => {
it('should call menuManager.refreshMenus', () => {
// 模拟返回值
mockRefreshMenus.mockReturnValueOnce(true);
const result = menuController.refreshAppMenu();
expect(mockRefreshMenus).toHaveBeenCalled();
expect(result).toBe(true);
});
@@ -41,9 +41,9 @@ describe('MenuController', () => {
it('should call menuManager.showContextMenu with type only', () => {
const menuType = 'chat';
mockShowContextMenu.mockReturnValueOnce({ shown: true });
const result = menuController.showContextMenu({ type: menuType });
const result = menuController.showContextMenu(menuType);
expect(mockShowContextMenu).toHaveBeenCalledWith(menuType, undefined);
expect(result).toEqual({ shown: true });
});
@@ -52,9 +52,9 @@ describe('MenuController', () => {
const menuType = 'file';
const menuData = { fileId: '123', filePath: '/path/to/file.txt' };
mockShowContextMenu.mockReturnValueOnce({ shown: true });
const result = menuController.showContextMenu({ type: menuType, data: menuData });
const result = menuController.showContextMenu(menuType, menuData);
expect(mockShowContextMenu).toHaveBeenCalledWith(menuType, menuData);
expect(result).toEqual({ shown: true });
});
@@ -63,20 +63,20 @@ describe('MenuController', () => {
describe('setDevMenuVisibility', () => {
it('should call menuManager.rebuildAppMenu with showDevItems true', () => {
mockRebuildAppMenu.mockReturnValueOnce(true);
const result = menuController.setDevMenuVisibility(true);
expect(mockRebuildAppMenu).toHaveBeenCalledWith({ showDevItems: true });
expect(result).toBe(true);
});
it('should call menuManager.rebuildAppMenu with showDevItems false', () => {
mockRebuildAppMenu.mockReturnValueOnce(true);
const result = menuController.setDevMenuVisibility(false);
expect(mockRebuildAppMenu).toHaveBeenCalledWith({ showDevItems: false });
expect(result).toBe(true);
});
});
});
});
@@ -44,30 +44,11 @@ const shortcutDecorator = (name: string) => (target: any, methodName: string, de
*/
export const shortcut = (method: ShortcutActionType) => shortcutDecorator(method);
const protocolDecorator =
(urlType: string, action: string) => (target: any, methodName: string, descriptor?: any) => {
const handlers = IoCContainer.protocolHandlers.get(target.constructor) || [];
handlers.push({ action, methodName, urlType });
IoCContainer.protocolHandlers.set(target.constructor, handlers);
return descriptor;
};
/**
* Protocol handler decorator
* @param urlType 协议URL类型 (如: 'plugin')
* @param action 操作类型 (如: 'install')
*/
export const createProtocolHandler = (urlType: string) => (action: string) =>
protocolDecorator(urlType, action);
interface IControllerModule {
afterAppReady?(): void;
app: App;
beforeAppReady?(): void;
}
export class ControllerModule implements IControllerModule {
constructor(public app: App) {
this.app = app;
-46
View File
@@ -16,7 +16,6 @@ import { CustomRequestHandler, createHandler } from '@/utils/next-electron-rsc';
import { BrowserManager } from './browser/BrowserManager';
import { I18nManager } from './infrastructure/I18nManager';
import { IoCContainer } from './infrastructure/IoCContainer';
import { ProtocolManager } from './infrastructure/ProtocolManager';
import { StaticFileServerManager } from './infrastructure/StaticFileServerManager';
import { StoreManager } from './infrastructure/StoreManager';
import { UpdaterManager } from './infrastructure/UpdaterManager';
@@ -28,7 +27,6 @@ const logger = createLogger('core:App');
export type IPCEventMap = Map<string, { controller: any; methodName: string }>;
export type ShortcutMethodMap = Map<string, () => Promise<void>>;
export type ProtocolHandlerMap = Map<string, { controller: any; methodName: string }>;
type Class<T> = new (...args: any[]) => T;
@@ -45,7 +43,6 @@ export class App {
shortcutManager: ShortcutManager;
trayManager: TrayManager;
staticFileServerManager: StaticFileServerManager;
protocolManager: ProtocolManager;
chromeFlags: string[] = ['OverlayScrollbar', 'FluentOverlayScrollbar', 'FluentScrollbar'];
/**
@@ -103,15 +100,11 @@ export class App {
this.shortcutManager = new ShortcutManager(this);
this.trayManager = new TrayManager(this);
this.staticFileServerManager = new StaticFileServerManager(this);
this.protocolManager = new ProtocolManager(this);
// register the schema to interceptor url
// it should register before app ready
this.registerNextHandler();
// initialize protocol handlers
this.protocolManager.initialize();
// 统一处理 before-quit 事件
app.on('before-quit', this.handleBeforeQuit);
@@ -167,10 +160,6 @@ export class App {
});
app.on('activate', this.onActivate);
// Process any pending protocol URLs after everything is ready
await this.protocolManager.processPendingUrls();
logger.info('Application bootstrap completed');
};
@@ -182,32 +171,6 @@ export class App {
return this.controllers.get(controllerClass);
}
/**
* Handle protocol request by dispatching to registered handlers
* @param urlType 协议URL类型 (如: 'plugin')
* @param action 操作类型 (如: 'install')
* @param data 解析后的协议数据
* @returns 是否成功处理
*/
async handleProtocolRequest(urlType: string, action: string, data: any): Promise<boolean> {
const key = `${urlType}:${action}`;
const handler = this.protocolHandlerMap.get(key);
if (!handler) {
logger.warn(`No protocol handler found for ${key}`);
return false;
}
try {
logger.debug(`Dispatching protocol request ${key} to controller`);
const result = await handler.controller[handler.methodName](data);
return result !== false; // 假设控制器返回 false 表示处理失败
} catch (error) {
logger.error(`Error handling protocol request ${key}:`, error);
return false;
}
}
private onActivate = () => {
logger.debug('Application activated');
this.browserManager.showMainWindow();
@@ -270,7 +233,6 @@ export class App {
private ipcClientEventMap: IPCEventMap = new Map();
private ipcServerEventMap: IPCEventMap = new Map();
shortcutMethodMap: ShortcutMethodMap = new Map();
protocolHandlerMap: ProtocolHandlerMap = new Map();
/**
* use in next router interceptor in prod browser render
@@ -346,14 +308,6 @@ export class App {
controller[shortcut.methodName]();
});
});
IoCContainer.protocolHandlers.get(ControllerClass)?.forEach((handler) => {
const key = `${handler.urlType}:${handler.action}`;
this.protocolHandlerMap.set(key, {
controller,
methodName: handler.methodName,
});
});
};
private addService = (ServiceClass: IServiceModule) => {
+4 -17
View File
@@ -9,7 +9,7 @@ import {
import { join } from 'node:path';
import { buildDir, preloadDir, resourcesDir } from '@/const/dir';
import { isDev, isMac, isWindows } from '@/const/env';
import { isDev, isWindows } from '@/const/env';
import {
BACKGROUND_DARK,
BACKGROUND_LIGHT,
@@ -269,20 +269,7 @@ export default class Browser {
hide() {
logger.debug(`Hiding window: ${this.identifier}`);
// Fix for macOS fullscreen black screen issue
// See: https://github.com/electron/electron/issues/20263
if (isMac && this.browserWindow.isFullScreen()) {
logger.debug(
`[${this.identifier}] Window is in fullscreen mode, exiting fullscreen before hiding.`,
);
this.browserWindow.once('leave-full-screen', () => {
this.browserWindow.hide();
});
this.browserWindow.setFullScreen(false);
} else {
this.browserWindow.hide();
}
this.browserWindow.hide();
}
close() {
@@ -426,7 +413,7 @@ export default class Browser {
// logger.error(`[${this.identifier}] Failed to save window state on hide:`, error);
// }
e.preventDefault();
this.hide();
browserWindow.hide();
} else {
// Window is actually closing (not keepAlive)
logger.debug(
@@ -478,7 +465,7 @@ export default class Browser {
toggleVisible() {
logger.debug(`Toggling visibility for window: ${this.identifier}`);
if (this._browserWindow.isVisible() && this._browserWindow.isFocused()) {
this.hide(); // Use the hide() method which handles fullscreen
this._browserWindow.hide();
} else {
this._browserWindow.show();
this._browserWindow.focus();
@@ -8,9 +8,5 @@ export class IoCContainer {
> = new WeakMap();
static shortcuts: WeakMap<any, { methodName: string; name: string }[]> = new WeakMap();
static protocolHandlers: WeakMap<any, { action: string; methodName: string; urlType: string }[]> =
new WeakMap();
init() {}
}
@@ -1,256 +0,0 @@
import { app } from 'electron';
import { isDev } from '@/const/env';
import { createLogger } from '@/utils/logger';
import { getProtocolScheme, parseProtocolUrl } from '@/utils/protocol';
import { App } from '../App';
// Create logger
const logger = createLogger('core:ProtocolManager');
/**
* Protocol handler manager for custom URI schemes
*/
export class ProtocolManager {
private app: App;
private protocolScheme: string;
private pendingUrls: string[] = [];
constructor(app: App) {
logger.debug('Initializing ProtocolManager');
this.app = app;
this.protocolScheme = getProtocolScheme();
logger.info(`ProtocolManager initialized for scheme: ${this.protocolScheme}://`);
}
/**
* Register protocol handlers and set up event listeners
*/
public initialize(): void {
logger.debug('Setting up protocol handlers');
this.registerProtocolHandlers();
this.setupEventListeners();
logger.debug('Protocol initialization completed');
}
/**
* Register the application as default protocol client
*/
private registerProtocolHandlers(): void {
logger.debug(`🔗 [Protocol] Registering protocol handlers for ${this.protocolScheme}://`);
// Debug info about current app
logger.debug(`🔗 [Protocol] App name: ${app.name}`);
logger.debug(`🔗 [Protocol] App path: ${app.getPath('exe')}`);
logger.debug(`🔗 [Protocol] Is development: ${isDev}`);
logger.debug(`🔗 [Protocol] Process argv[0]: ${process.argv[0]}`);
// Check if already registered
const isCurrentlyRegistered = app.isDefaultProtocolClient(this.protocolScheme);
logger.debug(`🔗 [Protocol] Is currently default protocol client: ${isCurrentlyRegistered}`);
// Register as default protocol client
let registrationResult: boolean;
if (isDev) {
// In development, use explicit parameters to ensure proper registration
const appPath = process.cwd(); // Current working directory (our app)
logger.debug(`🔗 [Protocol] Development mode: using explicit registration parameters`);
logger.debug(`🔗 [Protocol] Executable path: ${process.execPath}`);
logger.debug(`🔗 [Protocol] App path: ${appPath}`);
logger.debug(`🔗 [Protocol] Arguments: ${JSON.stringify([appPath])}`);
registrationResult = app.setAsDefaultProtocolClient(this.protocolScheme, process.execPath, [
appPath,
]);
} else {
// In production, use simple registration
registrationResult = app.setAsDefaultProtocolClient(this.protocolScheme);
}
logger.debug(`🔗 [Protocol] Registration result: ${registrationResult}`);
if (!registrationResult) {
logger.error(
`🔗 [Protocol] Failed to register as default protocol client for ${this.protocolScheme}://`,
);
} else {
logger.debug(`🔗 [Protocol] Successfully registered ${this.protocolScheme}:// protocol`);
}
// Verify registration
const isRegisteredAfter = app.isDefaultProtocolClient(this.protocolScheme);
logger.debug(`🔗 [Protocol] Final registration status: ${isRegisteredAfter}`);
}
/**
* Set up protocol event listeners
*/
private setupEventListeners(): void {
// Handle protocol URL from cold start (Windows/Linux)
const protocolUrl = this.getProtocolUrlFromArgs(process.argv);
if (protocolUrl) {
logger.debug(`🔗 [Protocol] Found protocol URL from cold start: ${protocolUrl}`);
this.pendingUrls.push(protocolUrl);
}
// Handle protocol URL from macOS open-url event
app.on('open-url', (event, url) => {
event.preventDefault();
logger.debug(`🔗 [Protocol] Received URL from open-url event: ${url}`);
logger.debug(`🔗 [Protocol] App ready state: ${app.isReady()}`);
logger.debug(`🔗 [Protocol] Event prevented, processing URL...`);
this.handleProtocolUrl(url);
});
// Handle protocol URL from second instance (Windows/Linux)
app.on('second-instance', (event, commandLine) => {
const url = this.getProtocolUrlFromArgs(commandLine);
if (url) {
logger.debug(`🔗 [Protocol] Received protocol URL from second instance: ${url}`);
this.handleProtocolUrl(url);
}
// Show main window when second instance is triggered
this.app.browserManager.showMainWindow();
});
}
/**
* Extract protocol URL from command line arguments
*/
private getProtocolUrlFromArgs(args: string[]): string | null {
const protocolPrefix = `${this.protocolScheme}://`;
logger.debug(`🔗 [Protocol] Searching for protocol URLs in args: ${JSON.stringify(args)}`);
logger.debug(`🔗 [Protocol] Looking for prefix: ${protocolPrefix}`);
for (const arg of args) {
if (arg.startsWith(protocolPrefix)) {
logger.debug(`🔗 [Protocol] Found protocol URL in args: ${arg}`);
return arg;
}
}
logger.debug(`🔗 [Protocol] No protocol URL found in args`);
return null;
}
/**
* Handle protocol URL - either immediately or store for later processing
*/
private handleProtocolUrl(url: string): void {
try {
logger.debug(`🔗 [Protocol] handleProtocolUrl called with: ${url}`);
logger.debug(`🔗 [Protocol] App ready state: ${app.isReady()}`);
logger.debug(`🔗 [Protocol] Current pending URLs count: ${this.pendingUrls.length}`);
if (!app.isReady()) {
// App not ready yet, store for later processing
logger.debug('🔗 [Protocol] App not ready, storing protocol URL for later processing');
this.pendingUrls.push(url);
logger.debug(`🔗 [Protocol] Pending URLs after push: ${this.pendingUrls.length}`);
return;
}
// App is ready, process immediately
logger.debug('🔗 [Protocol] App is ready, processing URL immediately');
this.processProtocolUrl(url);
} catch (error) {
logger.error('🔗 [Protocol] Failed to handle protocol URL:', error);
}
}
/**
* Process protocol URL by showing main window and sending to renderer
*/
private async processProtocolUrl(url: string): Promise<void> {
try {
logger.debug(`🔗 [Protocol] processProtocolUrl called with: ${url}`);
// Basic URL validation - just check if it's our protocol
if (!url.startsWith(`${this.protocolScheme}://`)) {
logger.warn(`🔗 [Protocol] Invalid protocol scheme in URL: ${url}`);
return;
}
// Show main window
logger.debug('🔗 [Protocol] Showing main window...');
this.app.browserManager.showMainWindow();
// Parse protocol URL to extract urlType and action
const parsed = parseProtocolUrl(url);
if (!parsed) {
logger.warn(`🔗 [Protocol] Failed to parse protocol URL: ${url}`);
return;
}
logger.debug(
`🔗 [Protocol] Parsed URL - type: ${parsed.urlType}, action: ${parsed.action}, data: %s`,
parsed.params,
);
// Dispatch to registered protocol handlers via App with parsed data
logger.debug('🔗 [Protocol] Dispatching to protocol handlers...');
const handled = await this.app.handleProtocolRequest(
parsed.urlType,
parsed.action,
parsed.params,
);
if (handled) {
logger.debug('🔗 [Protocol] Protocol URL processed successfully by handler');
} else {
logger.warn(
`🔗 [Protocol] No handler found for protocol: ${parsed.urlType}:${parsed.action}`,
);
}
} catch (error) {
logger.error('🔗 [Protocol] Failed to process protocol URL:', error);
logger.error('🔗 [Protocol] Error details:', error);
}
}
/**
* Process any pending protocol URLs after app is ready
*/
public async processPendingUrls(): Promise<void> {
logger.debug(`🔗 [Protocol] processPendingUrls called`);
logger.debug(`🔗 [Protocol] Pending URLs count: ${this.pendingUrls.length}`);
if (this.pendingUrls.length === 0) {
logger.debug(`🔗 [Protocol] No pending URLs to process`);
return;
}
logger.debug(
`🔗 [Protocol] Processing ${this.pendingUrls.length} pending protocol URLs:`,
this.pendingUrls,
);
for (const url of this.pendingUrls) {
logger.debug(`🔗 [Protocol] Processing pending URL: ${url}`);
await this.processProtocolUrl(url);
}
// Clear pending URLs
this.pendingUrls = [];
logger.debug(`🔗 [Protocol] All pending URLs processed and cleared`);
}
/**
* Get current protocol scheme
*/
public getScheme(): string {
return this.protocolScheme;
}
/**
* Check if protocol is registered
*/
public isRegistered(): boolean {
return app.isDefaultProtocolClient(this.protocolScheme);
}
}
@@ -14,7 +14,6 @@ const menu = {
edit: {
copy: '复制',
cut: '剪切',
delete: '删除',
paste: '粘贴',
redo: '重做',
selectAll: '全选',
+24 -9
View File
@@ -181,15 +181,29 @@ export class LinuxMenu extends BaseMenuPlatform implements IMenuPlatform {
}
private getChatContextMenuTemplate(data?: any): MenuItemConstructorOptions[] {
console.log(data);
const t = this.app.i18n.ns('menu');
const commonT = this.app.i18n.ns('common');
return [
{ accelerator: 'Ctrl+C', label: t('edit.copy'), role: 'copy' },
{ accelerator: 'Ctrl+V', label: t('edit.paste'), role: 'paste' },
const items: MenuItemConstructorOptions[] = [
{ label: t('edit.copy'), role: 'copy' },
{ label: t('edit.paste'), role: 'paste' },
{ type: 'separator' },
{ label: t('edit.selectAll'), role: 'selectAll' },
];
if (data?.messageId) {
items.push(
{ type: 'separator' },
{
click: () => {
console.log('尝试删除消息:', data.messageId);
},
label: commonT('actions.delete'),
},
);
}
return items;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -197,13 +211,14 @@ export class LinuxMenu extends BaseMenuPlatform implements IMenuPlatform {
const t = this.app.i18n.ns('menu');
return [
{ accelerator: 'Ctrl+X', label: t('edit.cut'), role: 'cut' },
{ accelerator: 'Ctrl+C', label: t('edit.copy'), role: 'copy' },
{ accelerator: 'Ctrl+V', label: t('edit.paste'), role: 'paste' },
{ label: t('edit.cut'), role: 'cut' },
{ label: t('edit.copy'), role: 'copy' },
{ label: t('edit.paste'), role: 'paste' },
{ type: 'separator' },
{ accelerator: 'Ctrl+A', label: t('edit.selectAll'), role: 'selectAll' },
{ label: t('edit.undo'), role: 'undo' },
{ label: t('edit.redo'), role: 'redo' },
{ type: 'separator' },
{ label: t('edit.delete'), role: 'delete' },
{ label: t('edit.selectAll'), role: 'selectAll' },
];
}
+28 -9
View File
@@ -301,29 +301,48 @@ export class MacOSMenu extends BaseMenuPlatform implements IMenuPlatform {
}
private getChatContextMenuTemplate(data?: any): MenuItemConstructorOptions[] {
console.log(data);
const t = this.app.i18n.ns('menu');
const commonT = this.app.i18n.ns('common');
return [
{ accelerator: 'Command+C', label: t('edit.copy'), role: 'copy' },
{ accelerator: 'Command+V', label: t('edit.paste'), role: 'paste' },
const items: MenuItemConstructorOptions[] = [
{ label: t('edit.cut'), role: 'cut' },
{ label: t('edit.copy'), role: 'copy' },
{ label: t('edit.paste'), role: 'paste' },
{ type: 'separator' },
{ label: t('edit.selectAll'), role: 'selectAll' },
];
if (data?.messageId) {
items.push(
{ type: 'separator' },
{
click: () => {
console.log('尝试删除消息:', data.messageId);
// 调用 MessageService (假设存在)
// const messageService = this.app.getService(MessageService);
// messageService?.deleteMessage(data.messageId);
},
label: commonT('actions.delete'),
},
);
}
return items;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
private getEditorContextMenuTemplate(_data?: any): MenuItemConstructorOptions[] {
const t = this.app.i18n.ns('menu');
// 编辑器特定的上下文菜单
return [
{ accelerator: 'Command+X', label: t('edit.cut'), role: 'cut' },
{ accelerator: 'Command+C', label: t('edit.copy'), role: 'copy' },
{ accelerator: 'Command+V', label: t('edit.paste'), role: 'paste' },
{ label: t('edit.cut'), role: 'cut' },
{ label: t('edit.copy'), role: 'copy' },
{ label: t('edit.paste'), role: 'paste' },
{ type: 'separator' },
{ accelerator: 'Command+A', label: t('edit.selectAll'), role: 'selectAll' },
{ label: t('edit.undo'), role: 'undo' },
{ label: t('edit.redo'), role: 'redo' },
{ type: 'separator' },
{ label: t('edit.delete'), role: 'delete' },
{ label: t('edit.selectAll'), role: 'selectAll' },
];
}
+27 -9
View File
@@ -161,15 +161,32 @@ export class WindowsMenu extends BaseMenuPlatform implements IMenuPlatform {
}
private getChatContextMenuTemplate(data?: any): MenuItemConstructorOptions[] {
console.log(data);
const t = this.app.i18n.ns('menu');
const commonT = this.app.i18n.ns('common');
return [
{ accelerator: 'Ctrl+C', label: t('edit.copy'), role: 'copy' },
{ accelerator: 'Ctrl+V', label: t('edit.paste'), role: 'paste' },
const items: MenuItemConstructorOptions[] = [
{ label: t('edit.copy'), role: 'copy' },
{ label: t('edit.paste'), role: 'paste' },
{ type: 'separator' },
{ label: t('edit.selectAll'), role: 'selectAll' },
];
if (data?.messageId) {
items.push(
{ type: 'separator' },
{
click: () => {
console.log('尝试删除消息:', data.messageId);
// 调用 MessageService (假设存在)
// const messageService = this.app.getService(MessageService);
// messageService?.deleteMessage(data.messageId);
},
label: commonT('actions.delete'),
},
);
}
return items;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -177,13 +194,14 @@ export class WindowsMenu extends BaseMenuPlatform implements IMenuPlatform {
const t = this.app.i18n.ns('menu');
return [
{ accelerator: 'Ctrl+X', label: t('edit.cut'), role: 'cut' },
{ accelerator: 'Ctrl+C', label: t('edit.copy'), role: 'copy' },
{ accelerator: 'Ctrl+V', label: t('edit.paste'), role: 'paste' },
{ label: t('edit.cut'), role: 'cut' },
{ label: t('edit.copy'), role: 'copy' },
{ label: t('edit.paste'), role: 'paste' },
{ type: 'separator' },
{ accelerator: 'Ctrl+A', label: t('edit.selectAll'), role: 'selectAll' },
{ label: t('edit.undo'), role: 'undo' },
{ label: t('edit.redo'), role: 'redo' },
{ type: 'separator' },
{ label: t('edit.delete'), role: 'delete' },
{ label: t('edit.selectAll'), role: 'selectAll' },
];
}
-60
View File
@@ -1,60 +0,0 @@
/**
* MCP Schema - stdio 配置类型
*/
export interface McpStdioConfig {
args?: string[];
command: string;
env?: Record<string, string>;
type: 'stdio';
}
/**
* MCP Schema - http 配置类型
*/
export interface McpHttpConfig {
headers?: Record<string, string>;
type: 'http';
url: string;
}
/**
* MCP Schema 配置类型
*/
export type McpConfig = McpStdioConfig | McpHttpConfig;
/**
* MCP Schema 对象
* 符合 RFC 0001 定义
*/
export interface McpSchema {
/** 插件作者 */
author: string;
/** 插件配置 */
config: McpConfig;
/** 插件描述 */
description: string;
/** 插件主页 */
homepage?: string;
/** 插件图标 */
icon?: string;
/** 插件唯一标识符,必须与URL中的id参数匹配 */
identifier: string;
/** 插件名称 */
name: string;
/** 插件版本 (semver) */
version: string;
}
/**
* 协议URL解析结果
*/
export interface ProtocolUrlParsed {
/** 操作类型 (如: 'install') */
action: string;
/** 原始URL */
originalUrl: string;
/** 解析后的所有查询参数 */
params: Record<string, string>;
/** URL类型 (如: 'plugin') */
urlType: string;
}
@@ -1,203 +0,0 @@
import { describe, expect, it } from 'vitest';
import { McpSchema } from '../../types/protocol';
import { generateRFCProtocolUrl, parseProtocolUrl } from '../protocol';
describe('Protocol', () => {
describe('generateRFCProtocolUrl', () => {
it('should generate valid RFC protocol URL for stdio type', () => {
const schema: McpSchema = {
identifier: 'edgeone-mcp',
name: 'EdgeOne MCP',
author: 'Higress Team',
description: 'EdgeOne API integration for LobeChat',
version: '1.0.0',
homepage: 'https://github.com/higress/edgeone-mcp',
config: {
type: 'stdio',
command: 'npx',
args: ['-y', '@higress/edgeone-mcp'],
env: { NODE_ENV: 'production' },
},
};
const url = generateRFCProtocolUrl({
id: 'edgeone-mcp',
schema,
marketId: 'higress',
});
expect(url).toMatch(/^lobehub:\/\/plugin\/install\?/);
expect(url).toContain('id=edgeone-mcp');
expect(url).toContain('marketId=higress');
// Verify schema is URL encoded
const urlObj = new URL(url);
const schemaParam = urlObj.searchParams.get('schema');
expect(schemaParam).toBeTruthy();
// URLSearchParams.get() 自动解码,所以这里得到的是解码后的JSON
expect(schemaParam).toContain('"'); // 解码后的引号
});
it('should generate valid RFC protocol URL for http type', () => {
const schema: McpSchema = {
identifier: 'awesome-api',
name: 'Awesome API',
author: 'Smithery',
description: 'Awesome API integration',
version: '2.0.0',
config: {
type: 'http',
url: 'https://api.smithery.ai/v1/mcp',
headers: {
'Authorization': 'Bearer token123',
'X-Custom-Header': 'value',
},
},
};
const url = generateRFCProtocolUrl({
id: 'awesome-api',
schema,
marketId: 'smithery',
});
expect(url).toMatch(/^lobehub:\/\/plugin\/install\?/);
expect(url).toContain('id=awesome-api');
expect(url).toContain('marketId=smithery');
});
it('should throw error if schema identifier does not match id', () => {
const schema: McpSchema = {
identifier: 'wrong-id',
name: 'Test',
author: 'Test',
description: 'Test',
version: '1.0.0',
config: { type: 'stdio', command: 'test' },
};
expect(() => generateRFCProtocolUrl({ id: 'different-id', schema })).toThrowError(
'Schema identifier must match the id parameter',
);
});
});
describe('parseProtocolUrl', () => {
it('should parse RFC protocol URL correctly', () => {
const schema: McpSchema = {
identifier: 'test-mcp',
name: 'Test MCP',
author: 'Test Author',
description: 'Test Description',
version: '1.0.0',
config: {
type: 'stdio',
command: 'test',
args: ['arg1', 'arg2'],
},
};
const url = generateRFCProtocolUrl({
id: 'test-mcp',
schema,
marketId: 'lobehub',
});
const parsed = parseProtocolUrl(url);
expect(parsed).toBeTruthy();
expect(parsed?.urlType).toBe('plugin');
expect(parsed?.action).toBe('install');
expect(parsed?.params.type).toBe('mcp');
expect(parsed?.params.id).toBe('test-mcp');
expect(parsed?.params.marketId).toBe('lobehub');
expect(parsed?.originalUrl).toBe(url);
// 验证 schema 可以被解析
const parsedSchema = JSON.parse(parsed?.params.schema || '{}');
expect(parsedSchema).toEqual(schema);
});
it('should return null for invalid protocol', () => {
const result = parseProtocolUrl('http://example.com');
expect(result).toBeNull();
});
it('should parse URLs with any action', () => {
const result = parseProtocolUrl('lobehub://plugin/configure?id=test');
expect(result).toBeTruthy();
expect(result?.urlType).toBe('plugin');
expect(result?.action).toBe('configure');
expect(result?.params.id).toBe('test');
});
it('should parse URLs with any query parameters', () => {
const result = parseProtocolUrl('lobehub://plugin/install?custom=value&another=param');
expect(result).toBeTruthy();
expect(result?.urlType).toBe('plugin');
expect(result?.action).toBe('install');
expect(result?.params.custom).toBe('value');
expect(result?.params.another).toBe('param');
});
it('should handle URLs without query parameters', () => {
const result = parseProtocolUrl('lobehub://plugin/install');
expect(result).toBeTruthy();
expect(result?.urlType).toBe('plugin');
expect(result?.action).toBe('install');
expect(Object.keys(result?.params || {})).toHaveLength(0);
});
it('should return null for URLs without action', () => {
const result = parseProtocolUrl('lobehub://plugin/');
expect(result).toBeNull();
});
});
describe('URL encoding/decoding', () => {
it('should handle special characters correctly', () => {
const schema: McpSchema = {
identifier: 'special-chars',
name: '特殊字符 ñ 🚀',
author: 'Test <test@example.com>',
description: 'Description with "quotes" and \'apostrophes\'',
version: '1.0.0',
config: {
type: 'stdio',
command: 'cmd',
args: ['arg with spaces', 'arg/with/slashes'],
},
};
const url = generateRFCProtocolUrl({ id: 'special-chars', schema });
const parsed = parseProtocolUrl(url);
expect(parsed).toBeTruthy();
expect(parsed?.params.id).toBe('special-chars');
expect(parsed?.params.type).toBe('mcp');
// 验证 schema 可以正确解析
const parsedSchema = JSON.parse(parsed?.params.schema || '{}');
expect(parsedSchema).toEqual(schema);
});
it('should handle different protocol schemes', () => {
const testCases = [
'lobehub://plugin/install?test=value',
'lobehub-dev://plugin/install?test=value',
'lobehub-beta://plugin/install?test=value',
'lobehub-nightly://plugin/install?test=value',
];
testCases.forEach((url) => {
const parsed = parseProtocolUrl(url);
expect(parsed).toBeTruthy();
expect(parsed?.urlType).toBe('plugin');
expect(parsed?.action).toBe('install');
expect(parsed?.params.test).toBe('value');
expect(parsed?.originalUrl).toBe(url);
});
});
});
});
-210
View File
@@ -1,210 +0,0 @@
import { app } from 'electron';
import { McpSchema, ProtocolUrlParsed } from '../types/protocol';
export type AppChannel = 'stable' | 'beta' | 'nightly';
export const getProtocolScheme = (): string => {
// 在 Electron 环境中可以通过多种方式判断版本
const bundleId = app.name;
const appPath = app.getPath('exe');
// 通过 bundle identifier 判断
if (bundleId?.toLowerCase().includes('nightly')) return 'lobehub-nightly';
if (bundleId?.toLowerCase().includes('beta')) return 'lobehub-beta';
if (bundleId?.includes('dev')) return 'lobehub-dev';
// 通过可执行文件路径判断
if (appPath?.toLowerCase().includes('nightly')) return 'lobehub-nightly';
if (appPath?.toLowerCase().includes('beta')) return 'lobehub-beta';
if (appPath?.includes('dev')) return 'lobehub-dev';
return 'lobehub';
};
export const getVersionInfo = (): { channel: AppChannel; protocolScheme: string } => {
const protocolScheme = getProtocolScheme();
let appChannel: AppChannel = 'stable';
if (protocolScheme.includes('nightly')) {
appChannel = 'nightly';
} else if (protocolScheme.includes('beta')) {
appChannel = 'beta';
}
return {
channel: appChannel,
protocolScheme,
};
};
/**
* 验证 MCP Schema 对象结构
* @param schema 待验证的对象
* @returns 是否为有效的 MCP Schema
*/
function validateMcpSchema(schema: any): schema is McpSchema {
if (!schema || typeof schema !== 'object') return false;
// 必填字段验证
if (typeof schema.identifier !== 'string' || !schema.identifier) return false;
if (typeof schema.name !== 'string' || !schema.name) return false;
if (typeof schema.author !== 'string' || !schema.author) return false;
if (typeof schema.description !== 'string' || !schema.description) return false;
if (typeof schema.version !== 'string' || !schema.version) return false;
// 可选字段验证
if (schema.homepage !== undefined && typeof schema.homepage !== 'string') return false;
if (schema.icon !== undefined && typeof schema.icon !== 'string') return false;
// config 字段验证
if (!schema.config || typeof schema.config !== 'object') return false;
const config = schema.config;
if (config.type === 'stdio') {
if (typeof config.command !== 'string' || !config.command) return false;
if (config.args !== undefined && !Array.isArray(config.args)) return false;
if (config.env !== undefined && typeof config.env !== 'object') return false;
} else if (config.type === 'http') {
if (typeof config.url !== 'string' || !config.url) return false;
try {
new URL(config.url); // 验证URL格式
} catch {
return false;
}
if (config.headers !== undefined && typeof config.headers !== 'object') return false;
} else {
return false; // 未知的 config type
}
return true;
}
/**
* 解析 lobehub:// 协议 URL (支持多版本协议)
*
* 支持的URL格式:
* - lobehub://plugin/install?id=figma&schema=xxx&marketId=lobehub
* - lobehub://plugin/configure?id=xxx&...
* - lobehub-bet://plugin/install?id=figma&schema=xxx&marketId=lobehub
* - lobehub-nightly://plugin/install?id=figma&schema=xxx&marketId=lobehub
* - lobehub-dev://plugin/install?id=figma&schema=xxx&marketId=lobehub
*
* @param url 协议 URL
* @returns 解析结果,包含基本结构和所有查询参数
*/
export const parseProtocolUrl = (url: string): ProtocolUrlParsed | null => {
try {
const parsedUrl = new URL(url);
// 支持多种协议 scheme
const validProtocols = ['lobehub:', 'lobehub-dev:', 'lobehub-nightly:', 'lobehub-beta:'];
if (!validProtocols.includes(parsedUrl.protocol)) {
return null;
}
// 对于自定义协议,URL 解析后:
// lobehub://plugin/install -> hostname: "plugin", pathname: "/install"
const urlType = parsedUrl.hostname; // "plugin"
const pathParts = parsedUrl.pathname.split('/').filter(Boolean); // ["install"]
if (pathParts.length < 1) {
return null;
}
const action = pathParts[0]; // "install"
// 解析所有查询参数
const params: Record<string, string> = {};
const searchParams = new URLSearchParams(parsedUrl.search);
for (const [key, value] of searchParams.entries()) {
params[key] = value;
}
return {
action,
originalUrl: url,
params,
urlType,
};
} catch (error) {
console.error('Failed to parse protocol URL:', error);
return null;
}
};
/**
* 生成符合 RFC 0001 的协议 URL
*
* @param params 协议参数
* @returns 生成的协议URL
*/
export function generateRFCProtocolUrl(params: {
/** 插件唯一标识符 */
id: string;
/** Marketplace ID */
marketId?: string;
/** MCP Schema 对象 */
schema: McpSchema;
/** 协议 scheme (默认: lobehub) */
scheme?: string;
}): string {
const { id, schema, marketId, scheme = 'lobehub' } = params;
// 验证 schema.identifier 与 id 匹配
if (schema.identifier !== id) {
throw new Error('Schema identifier must match the id parameter');
}
// 验证 schema 结构
if (!validateMcpSchema(schema)) {
throw new Error('Invalid MCP Schema structure');
}
// 构建基础 URL
const baseUrl = `${scheme}://plugin/install`;
// 构建查询参数
const searchParams = new URLSearchParams();
// 必需参数
searchParams.set('type', 'mcp');
searchParams.set('id', id);
// 编码 schema - 直接传 JSON 字符串,让 URLSearchParams 自动编码
const schemaJson = JSON.stringify(schema);
searchParams.set('schema', schemaJson);
// 可选参数
if (marketId) {
searchParams.set('marketId', marketId);
}
return `${baseUrl}?${searchParams.toString()}`;
}
/**
* 生成协议 URL 示例
*
* @example
* ```typescript
* const url = generateRFCProtocolUrl({
* id: 'edgeone-mcp',
* schema: {
* identifier: 'edgeone-mcp',
* name: 'EdgeOne MCP',
* author: 'Higress Team',
* description: 'EdgeOne API integration for LobeChat',
* version: '1.0.0',
* config: {
* type: 'stdio',
* command: 'npx',
* args: ['-y', '@higress/edgeone-mcp']
* }
* },
* marketId: 'higress'
* });
* // Result: lobehub://plugin/install?id=edgeone-mcp&schema=%7B%22identifier%22%3A...&marketId=higress
* ```
*/
@@ -25,34 +25,6 @@ export const setupRouteInterceptors = function () {
// 存储被阻止的路径,避免pushState重复触发
const preventedPaths = new Set<string>();
// 重写 window.open 方法来拦截 JavaScript 调用
const originalWindowOpen = window.open;
window.open = function (url?: string | URL, target?: string, features?: string) {
if (url) {
try {
const urlString = typeof url === 'string' ? url : url.toString();
const urlObj = new URL(urlString, window.location.href);
// 检查是否为外部链接
if (urlObj.origin !== window.location.origin) {
console.log(`[preload] Intercepted window.open for external URL:`, urlString);
// 调用主进程处理外部链接
invoke('openExternalLink', urlString);
return null; // 返回 null 表示没有打开新窗口
}
} catch (error) {
// 处理无效 URL 或特殊协议
console.error(`[preload] Intercepted window.open for special protocol:`, url);
console.error(error);
invoke('openExternalLink', typeof url === 'string' ? url : url.toString());
return null;
}
}
// 对于内部链接,调用原始的 window.open
return originalWindowOpen.call(window, url, target, features);
};
// 拦截所有a标签的点击事件 - 针对Next.js的Link组件
document.addEventListener(
'click',
-411
View File
@@ -1,415 +1,4 @@
[
{
"children": {
"fixes": ["Can't load custom provider config."]
},
"date": "2025-08-21",
"version": "1.114.2"
},
{
"children": {
"improvements": ["Move chain into @lobechat/prompts."]
},
"date": "2025-08-21",
"version": "1.114.1"
},
{
"children": {},
"date": "2025-08-19",
"version": "1.114.0"
},
{
"children": {
"fixes": [
"Support Grok thinking models in AiHubMix, The 'stream_options' parameter is only allowed when 'stream' is enabled."
]
},
"date": "2025-08-19",
"version": "1.113.3"
},
{
"children": {},
"date": "2025-08-18",
"version": "1.113.2"
},
{
"children": {},
"date": "2025-08-17",
"version": "1.113.1"
},
{
"children": {},
"date": "2025-08-17",
"version": "1.113.0"
},
{
"children": {
"fixes": ["Improve mcp tracing with user config."]
},
"date": "2025-08-17",
"version": "1.112.5"
},
{
"children": {
"improvements": ["Refactor prompts folder to the @lobechat/prompts pacakge."]
},
"date": "2025-08-16",
"version": "1.112.4"
},
{
"children": {
"improvements": ["Refactor const folder to a new package."]
},
"date": "2025-08-16",
"version": "1.112.3"
},
{
"children": {
"improvements": ["重构 ArgsInput 组件."]
},
"date": "2025-08-16",
"version": "1.112.2"
},
{
"children": {
"improvements": ["Add Imagen 4 GA models, style improve auth sign in box loading."]
},
"date": "2025-08-16",
"version": "1.112.1"
},
{
"children": {},
"date": "2025-08-15",
"version": "1.112.0"
},
{
"children": {},
"date": "2025-08-14",
"version": "1.111.12"
},
{
"children": {
"improvements": ["Update Mistral AI models & Optimize many model providers fetching."]
},
"date": "2025-08-13",
"version": "1.111.11"
},
{
"children": {
"improvements": ["Adjust near bottom size on thinking scroll."]
},
"date": "2025-08-12",
"version": "1.111.10"
},
{
"children": {
"improvements": ["Improve Gemini error display with promptFeedback."]
},
"date": "2025-08-12",
"version": "1.111.9"
},
{
"children": {
"improvements": ["Support new GPT-5 Verbosity params."]
},
"date": "2025-08-11",
"version": "1.111.8"
},
{
"children": {
"improvements": ["Refactor model-runtime to a seperated package."]
},
"date": "2025-08-11",
"version": "1.111.7"
},
{
"children": {
"fixes": ["Solve the cache problem caused by the same dom id when sharing pictures."]
},
"date": "2025-08-11",
"version": "1.111.6"
},
{
"children": {
"improvements": ["Add mask effect to thinking scroll, update i18n."]
},
"date": "2025-08-10",
"version": "1.111.5"
},
{
"children": {},
"date": "2025-08-09",
"version": "1.111.4"
},
{
"children": {
"improvements": [
"Improve thinking auto scroll style, Support session switch shortcut key, update i18n."
]
},
"date": "2025-08-09",
"version": "1.111.3"
},
{
"children": {},
"date": "2025-08-08",
"version": "1.111.2"
},
{
"children": {
"improvements": ["Add descriptions for the FLUX.1 Krea and Qwen Image."]
},
"date": "2025-08-08",
"version": "1.111.1"
},
{
"children": {
"features": ["Add GPT-5 series models."]
},
"date": "2025-08-08",
"version": "1.111.0"
},
{
"children": {
"fixes": ["Missing languages it-IT, pl-PL, nl-NL."]
},
"date": "2025-08-07",
"version": "1.110.7"
},
{
"children": {},
"date": "2025-08-07",
"version": "1.110.6"
},
{
"children": {
"fixes": ["Optimize Gemini error message display & Filter empty messages."]
},
"date": "2025-08-07",
"version": "1.110.5"
},
{
"children": {
"improvements": ["Refactor trace type."]
},
"date": "2025-08-06",
"version": "1.110.4"
},
{
"children": {
"improvements": ["Fix provider setting page hydration error."]
},
"date": "2025-08-06",
"version": "1.110.3"
},
{
"children": {
"fixes": ["Fix fail to fetch aihubmix model on client mode."],
"improvements": ["Add context menu for desktop, support different model tabs."]
},
"date": "2025-08-06",
"version": "1.110.2"
},
{
"children": {
"fixes": ["Fix remote avatar broken in desktop again."]
},
"date": "2025-08-06",
"version": "1.110.1"
},
{
"children": {
"features": ["Support mcp plugin install from web."]
},
"date": "2025-08-06",
"version": "1.110.0"
},
{
"children": {
"fixes": ["Fix ollama model output without thinking."],
"improvements": ["Add Claude Opus 4.1 model, update i18n."]
},
"date": "2025-08-06",
"version": "1.109.1"
},
{
"children": {
"features": ["Support gpt-oss in ollama provider."]
},
"date": "2025-08-05",
"version": "1.109.0"
},
{
"children": {
"fixes": ["Provider config checker uses outdated API key."]
},
"date": "2025-08-05",
"version": "1.108.2"
},
{
"children": {
"fixes": ["Fix remote avatar broken in desktop."],
"improvements": ["Update mask style."]
},
"date": "2025-08-05",
"version": "1.108.1"
},
{
"children": {
"features": ["Support 302ai provider."]
},
"date": "2025-08-05",
"version": "1.108.0"
},
{
"children": {
"fixes": ["Break line for Gemini Artifacts."]
},
"date": "2025-08-05",
"version": "1.107.6"
},
{
"children": {
"improvements": ["Update models."]
},
"date": "2025-08-04",
"version": "1.107.5"
},
{
"children": {
"fixes": ["When s3 files not exist , global files should delete."]
},
"date": "2025-08-04",
"version": "1.107.4"
},
{
"children": {
"fixes": ["Aihubmix provider request headers."]
},
"date": "2025-08-03",
"version": "1.107.3"
},
{
"children": {
"improvements": ["Move types to separate package."]
},
"date": "2025-08-02",
"version": "1.107.2"
},
{
"children": {
"improvements": ["Update i18n."]
},
"date": "2025-08-01",
"version": "1.107.1"
},
{
"children": {
"features": ["Support aihubmix provider."]
},
"date": "2025-08-01",
"version": "1.107.0"
},
{
"children": {
"improvements": ["Support SenseNova V6.5 models."]
},
"date": "2025-07-31",
"version": "1.106.8"
},
{
"children": {
"improvements": ["Update Aliyun Bailian models."]
},
"date": "2025-07-31",
"version": "1.106.7"
},
{
"children": {
"fixes": ["Fix oidc oauth callback pages 404."]
},
"date": "2025-07-31",
"version": "1.106.6"
},
{
"children": {
"improvements": ["Improve mcp plugin calling and display."]
},
"date": "2025-07-30",
"version": "1.106.5"
},
{
"children": {
"fixes": ["Fix mcp calling missing array content."],
"improvements": ["Update i18n."]
},
"date": "2025-07-30",
"version": "1.106.4"
},
{
"children": {
"fixes": ["Moonshot assistant messages must not be empty."],
"improvements": ["Add volcengine kimi-k2 model, Add Zhipu GLM-4.5 models."]
},
"date": "2025-07-29",
"version": "1.106.3"
},
{
"children": {
"fixes": ["Fix desktop auth redirect url error."]
},
"date": "2025-07-29",
"version": "1.106.2"
},
{
"children": {
"improvements": ["Support Minimax T2I models."]
},
"date": "2025-07-29",
"version": "1.106.1"
},
{
"children": {
"features": ["Add support for Okta Authentication."]
},
"date": "2025-07-29",
"version": "1.106.0"
},
{
"children": {
"improvements": ["Open new topic by tap Just Chat again."]
},
"date": "2025-07-29",
"version": "1.105.6"
},
{
"children": {
"fixes": ["Reorder AppTheme and Locale to fix modal i18n."]
},
"date": "2025-07-29",
"version": "1.105.5"
},
{
"children": {
"fixes": ["Revert jose to ^5 to fix auth issue on desktop."]
},
"date": "2025-07-29",
"version": "1.105.4"
},
{
"children": {
"fixes": ["Fix subscription plan tag display."]
},
"date": "2025-07-29",
"version": "1.105.3"
},
{
"children": {
"improvements": ["Add more OpenAI SDK Text2Image providers, update i18n."]
},
"date": "2025-07-29",
"version": "1.105.2"
},
{
"children": {
"improvements": ["Support more Text2Image from Qwen."]
-1
View File
@@ -27,7 +27,6 @@ AUTH_CASDOOR_ISSUER=http://localhost:8000
# Casdoor secret
AUTH_CASDOOR_ID=a387a4892ee19b1a2249
AUTH_CASDOOR_SECRET=dbf205949d704de81b0b5b3603174e23fbecc354
CASDOOR_WEBHOOK_SECRET=casdoor-secret
# MinIO S3 configuration
MINIO_ROOT_USER=admin
-1
View File
@@ -27,7 +27,6 @@ AUTH_CASDOOR_ISSUER=http://localhost:8000
# Casdoor secret
AUTH_CASDOOR_ID=a387a4892ee19b1a2249
AUTH_CASDOOR_SECRET=dbf205949d704de81b0b5b3603174e23fbecc354
CASDOOR_WEBHOOK_SECRET=casdoor-secret
# MinIO S3 配置
MINIO_ROOT_USER=admin
+1 -1
View File
@@ -60,7 +60,7 @@ services:
# version lock ref: https://github.com/lobehub/lobe-chat/pull/7331
casdoor:
image: casbin/casdoor:v2.13.0
image: casbin/casdoor:v1.843.0
container_name: lobe-casdoor
entrypoint: /bin/sh -c './server --createDatabase=true'
network_mode: 'service:network-service'
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -450,7 +450,7 @@ ENV_EXAMPLES=(
"$SUB_DIR/.env.example"
)
# Default values
CASDOOR_PASSWORD="pswd123"
CASDOOR_PASSWORD="123"
CASDOOR_SECRET="CASDOOR_SECRET"
MINIO_ROOT_PASSWORD="YOUR_MINIO_PASSWORD"
CASDOOR_HOST="localhost:8000"
@@ -657,10 +657,10 @@ section_regenerate_secrets() {
CASDOOR_PASSWORD=$(generate_key 10)
if [ $? -ne 0 ]; then
echo $(show_message "security_secrect_regenerate_failed") "CASDOOR_PASSWORD"
CASDOOR_PASSWORD="pswd123"
CASDOOR_PASSWORD="123"
else
# replace `password` in init_data.json
sed "${SED_INPLACE_ARGS[@]}" "s/"pswd123"/${CASDOOR_PASSWORD}/" init_data.json
sed "${SED_INPLACE_ARGS[@]}" "s/"123"/${CASDOOR_PASSWORD}/" init_data.json
if [ $? -ne 0 ]; then
echo $(show_message "security_secrect_regenerate_failed") "CASDOOR_PASSWORD in \`init_data.json\`"
fi
@@ -1,190 +0,0 @@
---
title: Image Generation Development Setup
description: Configure local environment for developing text-to-image and image-to-image features
---
# Image Generation Development Setup
This guide helps developers set up the local environment for developing image generation features (text-to-image, image-to-image) with file storage capabilities.
## Prerequisites
- Docker installed and running
- Node.js and pnpm installed
- PostgreSQL client tools (optional, for debugging)
<Callout type="warning">
**Security Notice**: This setup is designed for local development only. It uses default credentials and open permissions that are NOT suitable for production environments.
</Callout>
## Quick Setup
Run the provided script to automatically set up all required services:
```bash
# Set up PostgreSQL and MinIO for image storage
./scripts/setup-image-generation-dev.sh
# Start the development server
pnpm dev:desktop
```
This script will:
1. Start PostgreSQL (no authentication for local development)
2. Run database migrations to initialize schema
3. Start MinIO (S3-compatible storage)
4. Create and configure the storage bucket
5. Add necessary S3 environment variables to `.env.desktop`
## Architecture Overview
The image generation feature requires:
- **PostgreSQL**: Stores metadata about generated images
- **MinIO/S3**: Stores the actual image files
- **Server Mode**: Required for file handling (`NEXT_PUBLIC_SERVICE_MODE=server`)
## Environment Configuration
The following environment variables are automatically configured by the setup script:
```bash
# S3 Storage Configuration (MinIO for local development)
S3_ACCESS_KEY_ID=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin
S3_ENDPOINT=http://localhost:9000
S3_BUCKET=lobe-chat
S3_REGION=us-east-1
S3_PUBLIC_DOMAIN=http://localhost:9000/lobe-chat
S3_ENABLE_PATH_STYLE=1 # Required for MinIO
```
## Development Workflow
### 1. Image Generation API
When developing image generation features, generated images will be:
1. Created by the AI model
2. Uploaded to S3/MinIO via presigned URLs
3. Metadata stored in PostgreSQL
4. Served via the public S3 URL
### 2. File Storage Structure
```
lobe-chat/ # S3 Bucket
├── generated/ # Generated images
│ └── {userId}/
│ └── {sessionId}/
│ └── {imageId}.png
└── uploads/ # User uploads for image-to-image
└── {userId}/
└── {fileId}.{ext}
```
### 3. Testing Your Implementation
After setting up the environment, you can test:
```typescript
// Example: Upload generated image
const uploadUrl = await trpc.upload.createPresignedUrl.mutate({
filename: 'generated-image.png',
contentType: 'image/png',
});
// Upload to S3
await fetch(uploadUrl, {
method: 'PUT',
body: imageBlob,
headers: { 'Content-Type': 'image/png' },
});
```
## Manual Setup
If you prefer to set up services manually:
### PostgreSQL
```bash
docker run -d --name lobe-postgres \
-p 5432:5432 \
-e POSTGRES_HOST_AUTH_METHOD=trust \
-e POSTGRES_DB=postgres \
postgres:15
```
### MinIO
```bash
# Start MinIO
docker run -d --name lobe-minio \
-p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
quay.io/minio/minio:RELEASE.2025-04-22T22-12-26Z \
server /data --console-address ":9001"
# Create bucket
docker run --rm \
--link lobe-minio:minio \
--entrypoint bash \
quay.io/minio/mc:RELEASE.2025-04-18T16-45-00Z \
-c "
mc config host add minio http://minio:9000 minioadmin minioadmin &&
mc mb minio/lobe-chat &&
mc anonymous set public minio/lobe-chat
"
```
## Service URLs
- **PostgreSQL**: `postgres://postgres@localhost:5432/postgres`
- **MinIO API**: `http://localhost:9000`
- **MinIO Console**: `http://localhost:9001` (minioadmin/minioadmin)
- **Application**: `http://localhost:3015`
## Troubleshooting
### Port Conflicts
If ports are already in use:
```bash
# Check what's using the ports
lsof -i :5432 # PostgreSQL
lsof -i :9000 # MinIO API
lsof -i :9001 # MinIO Console
```
### Reset Environment
To completely reset your development environment:
```bash
# Stop and remove containers
docker stop lobe-postgres lobe-minio
docker rm lobe-postgres lobe-minio
# Re-run setup
./scripts/setup-image-generation-dev.sh
```
### Database Migrations
The setup script runs migrations automatically. If you need to run them manually:
```bash
pnpm db:migrate
```
Note: In development mode with `pnpm dev:desktop`, migrations also run automatically on startup.
## Related Documentation
- [Server Database Setup](/docs/self-hosting/server-database)
- [S3 Storage Configuration](/docs/self-hosting/advanced/s3)
- [Environment Variables](/docs/self-hosting/environment-variables)
@@ -1,190 +0,0 @@
---
title: 图像生成开发环境配置
description: 配置本地环境以开发文本生图和图像处理功能
---
# 图像生成开发环境配置
本指南帮助开发者配置本地环境,用于开发图像生成功能(文生图、图生图)等和文件存储能力。
## 前置条件
- 已安装并运行 Docker
- 已安装 Node.js 和 pnpm
- PostgreSQL 客户端工具(可选,用于调试)
<Callout type="warning">
**安全提醒**:此配置仅适用于本地开发。使用的默认凭据和开放权限不适合生产环境。
</Callout>
## 快速配置
运行提供的脚本来自动配置所有必需的服务:
```bash
# 配置 PostgreSQL 和 MinIO 用于图像存储
./scripts/setup-image-generation-dev.sh
# 启动开发服务器
pnpm dev:desktop
```
此脚本将执行:
1. 启动 PostgreSQL(本地开发无需身份验证)
2. 运行数据库迁移以初始化模式
3. 启动 MinIOS3 兼容存储)
4. 创建并配置存储桶
5. 在 `.env.desktop` 中添加必要的 S3 环境变量
## 架构概览
图像生成功能需要:
- **PostgreSQL**:存储生成图像的元数据
- **MinIO/S3**:存储实际的图像文件
- **服务器模式**:文件处理所需(`NEXT_PUBLIC_SERVICE_MODE=server`
## 环境配置
以下环境变量会被配置脚本自动设置:
```bash
# S3 存储配置(本地开发使用 MinIO)
S3_ACCESS_KEY_ID=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin
S3_ENDPOINT=http://localhost:9000
S3_BUCKET=lobe-chat
S3_REGION=us-east-1
S3_PUBLIC_DOMAIN=http://localhost:9000/lobe-chat
S3_ENABLE_PATH_STYLE=1 # MinIO 必需
```
## 开发工作流
### 1. 图像生成 API
在开发图像生成功能时,生成的图像将:
1. 由 AI 模型创建
2. 通过预签名 URL 上传到 S3/MinIO
3. 元数据存储在 PostgreSQL 中
4. 通过公共 S3 URL 提供服务
### 2. 文件存储结构
```
lobe-chat/ # S3 存储桶
├── generated/ # 生成的图像
│ └── {userId}/
│ └── {sessionId}/
│ └── {imageId}.png
└── uploads/ # 用户上传的图像处理文件
└── {userId}/
└── {fileId}.{ext}
```
### 3. 测试您的实现
配置环境后,您可以测试:
```typescript
// 示例:上传生成的图像
const uploadUrl = await trpc.upload.createPresignedUrl.mutate({
filename: 'generated-image.png',
contentType: 'image/png',
});
// 上传到 S3
await fetch(uploadUrl, {
method: 'PUT',
body: imageBlob,
headers: { 'Content-Type': 'image/png' },
});
```
## 手动配置
如果您希望手动配置服务:
### PostgreSQL
```bash
docker run -d --name lobe-postgres \
-p 5432:5432 \
-e POSTGRES_HOST_AUTH_METHOD=trust \
-e POSTGRES_DB=postgres \
postgres:15
```
### MinIO
```bash
# 启动 MinIO
docker run -d --name lobe-minio \
-p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
quay.io/minio/minio:RELEASE.2025-04-22T22-12-26Z \
server /data --console-address ":9001"
# 创建存储桶
docker run --rm \
--link lobe-minio:minio \
--entrypoint bash \
quay.io/minio/mc:RELEASE.2025-04-18T16-45-00Z \
-c "
mc config host add minio http://minio:9000 minioadmin minioadmin &&
mc mb minio/lobe-chat &&
mc anonymous set public minio/lobe-chat
"
```
## 服务地址
- **PostgreSQL**`postgres://postgres@localhost:5432/postgres`
- **MinIO API**`http://localhost:9000`
- **MinIO 控制台**`http://localhost:9001` (minioadmin/minioadmin)
- **应用程序**`http://localhost:3015`
## 故障排除
### 端口冲突
如果端口已被占用:
```bash
# 检查端口使用情况
lsof -i :5432 # PostgreSQL
lsof -i :9000 # MinIO API
lsof -i :9001 # MinIO 控制台
```
### 重置环境
要完全重置开发环境:
```bash
# 停止并删除容器
docker stop lobe-postgres lobe-minio
docker rm lobe-postgres lobe-minio
# 重新运行配置
./scripts/setup-image-generation-dev.sh
```
### 数据库迁移
配置脚本会自动运行迁移。如需手动运行:
```bash
pnpm db:migrate
```
注意:在使用 `pnpm dev:desktop` 的开发模式下,迁移也会在启动时自动运行。
## 相关文档
- [服务器数据库配置](/docs/self-hosting/server-database)
- [S3 存储配置](/docs/self-hosting/advanced/s3)
- [环境变量](/docs/self-hosting/environment-variables)
@@ -1,3 +1,5 @@
{/* eslint-disable no-irregular-whitespace */}
# Best Practices for State Management
LobeChat differs from traditional CRUD web applications in that it involves a large amount of rich interactive capabilities. Therefore, it is crucial to design a data flow architecture that is easy to develop and maintain. This document will introduce the best practices for data flow management in LobeChat.
@@ -109,8 +111,6 @@ Based on the provided directory structure of LobeChat SessionStore, we can updat
In the LobeChat application, session management is a complex functional module, so we use the Slice pattern to organize the data flow. Below is the directory structure of LobeChat SessionStore, where each directory and file has its specific purpose:
{/* eslint-disable no-irregular-whitespace */}
```bash
src/store/session
├── helpers.ts # Helper functions
@@ -1,3 +1,5 @@
{/* eslint-disable no-irregular-whitespace */}
# 状态管理最佳实践
LobeChat 不同于传统 CRUD 的网页,存在大量的富交互能力,如何设计一个易于开发与易于维护的数据流架构非常重要。本篇文档将介绍 LobeChat 中的数据流管理最佳实践。
@@ -109,8 +111,6 @@ LobeChat SessionStore
在 LobeChat 应用中,由于会话管理是一个复杂的功能模块,因此我们采用了 [slice 模式](https://github.com/pmndrs/zustand/blob/main/docs/guides/slices-pattern.md) 来组织数据流。下面是 LobeChat SessionStore 的目录结构,其中每个目录和文件都有其特定的用途:
{/* eslint-disable no-irregular-whitespace */}
```fish
src/store/session
├── index.ts # SessionStore 的聚合导出文件
-3
View File
@@ -55,8 +55,6 @@ Currently supported identity verification services include:
<Card href={'/docs/self-hosting/advanced/auth/next-auth/keycloak'} title={'Keycloak'} />
<Card href={'/docs/self-hosting/advanced/auth/next-auth/google'} title={'Google'} />
<Card href={'/docs/self-hosting/advanced/auth/next-auth/okta'} title={'Okta'} />
</Cards>
Click on the links to view the corresponding platform's configuration documentation.
@@ -80,7 +78,6 @@ The order corresponds to the display order of the SSO providers.
| ZITADEL | `zitadel` |
| Keycloak | `keycloak` |
| Google | `google` |
| Okta | `okta` |
## Other SSO Providers
@@ -51,8 +51,6 @@ LobeChat 与 Clerk 做了深度集成,能够为用户提供一个更加安全
<Card href={'/zh/docs/self-hosting/advanced/auth/next-auth/logto'} title={'Logto'} />
<Card href={'/zh/docs/self-hosting/advanced/auth/next-auth/keycloak'} title={'Keycloak'} />
<Card href={'/zh/docs/self-hosting/advanced/auth/next-auth/okta'} title={'Okta'} />
</Cards>
点击即可查看对应平台的配置文档。
@@ -75,7 +73,6 @@ LobeChat 与 Clerk 做了深度集成,能够为用户提供一个更加安全
| Microsoft Entra ID | `microsoft-entra-id` |
| ZITADEL | `zitadel` |
| Keycloak | `keycloak` |
| Okta | `okta` |
## 其他 SSO 提供商
@@ -1,65 +0,0 @@
---
title: Configure Okta Identity Verification Service for LobeChat
description: >-
Learn how to configure Okta Identity Verification Service for LobeChat for your organization, including creating applications, adding users, and configuring environment variables.
tags:
- Okta
- Identity Verification
- Single Sign-On
- Environment Variables
- User Management
- SSO Integrations
- Social Login
---
# Configure Okta Identity Verification Service
<Steps>
### Create Okta Application
Register and log in to [Okta][okta-client-page], open the "Applications" subtab in the left navigation bar, and click "Applications" to switch to the application management interface. click "Create App Integration" in the upper left corner to create an application.
Select "OIDC - OpenID Connect" in Sign-In Method and then select "Web Application" in Application Type.
Fill in the following settings:
| Setting Name | Description | Sample Information |
| ---------------------- | ------------------------------------------------------------------------------------------------------------ | --------------------------------------------- |
| App Integration Name | The Application Name your users will see | LobeChat Instance |
| Sign-in redirect URIs | Okta sends the authentication response and ID token for the user's sign-in request to these URIs | (http(s)://your-domain/api/auth/callback/okta |
| Sign-out redirect URIs | After your application contacts Okta to close the user session, Okta redirects the user to one of these URIs | (http(s)://your-domain |
<Callout type={'important'}>
You can fill in or modify all the fields after deployment, but make sure the filled URL is
consistent with the deployed URL.
</Callout>
### Add Users
Click on the "Assignments" in the top navigation bar to enter the user management interface, where you can create or assign users in your organization to log in to LobeChat.
### Configure Environment Variables
When deploying LobeChat, you need to configure the following environment variables:
| Environment Variable | Type | Description |
| ------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `NEXT_AUTH_SECRET` | Required | Key used to encrypt Auth.js session tokens. You can generate a key using the following command: `openssl rand -base64 32` |
| `NEXT_AUTH_SSO_PROVIDERS` | Required | Select the single sign-on provider for LoboChat. Use `okta` for Okta. |
| `AUTH_OKTA_ID` | Required | Client ID of the Okta application |
| `AUTH_OKTA_SECRET` | Required | Client Secret of the Okta application |
| `AUTH_OKTA_ISSUER` | Required | Domain of the Okta application, `https://example.oktapreview.com` |
| `NEXTAUTH_URL` | Optional | The URL is used to specify the callback address for the execution of OAuth authentication in Auth.js. It needs to be set only when the default address is incorrect. `https://example.com/api/auth` |
<Callout type={'tip'}>
You can refer to the related variable details at [📘Environment Variables](/docs/self-hosting/environment-variable/auth#okta).
</Callout>
</Steps>
<Callout>
After successful deployment, users will be able to authenticate and use LobeChat using the users
configured in Okta.
</Callout>
[okta-client-page]: https://login.okta.com
@@ -1,63 +0,0 @@
---
title: 在 LobeChat 中配置 Okta 身份验证服务 - 详细步骤和环境变量设置
description: >-
学习如何在 LobeChat 中为您的组织配置 Okta 身份验证服务,包括创建应用程序、添加用户和配置环境变量等。
tags:
- Okta
- 身份验证
- 单点登录
- 环境变量
- 用户管理
- SSO 集成
- 社交登录
---
# 配置 Okta 身份验证服务
<Steps>
### 创建 Okta 应用程序
注册并登录 [Okta][okta-client-page],打开左侧导航栏中的「Applications」子选项卡,点击「Applications」切换到应用程序管理界面。点击左上角的「Create App Integration」创建应用程序。
在登录方法中选择「OIDC - OpenID Connect」,然后在应用程序类型中选择「Web Application」。
填写以下设置:
| 设置名称 | 描述 | 示例信息 |
| ---------------------- | ------------------------------------------- | --------------------------------------------- |
| App Integration Name | 您的用户将看到的应用程序名称 | LobeChat Instance |
| Sign-in redirect URIs | Okta 将用户登录请求的身份验证响应和 ID 令牌发送到这些 URI | (http(s)://your-domain/api/auth/callback/okta |
| Sign-out redirect URIs | 您的应用程序联系 Okta 关闭用户会话后,Okta 将用户重定向到这些 URI 之一 | (http(s)://your-domain |
<Callout type={'important'}>
您可以在部署后填写或修改所有字段,但请确保填写的 URL 与部署的 URL 一致。
</Callout>
### 添加用户
点击顶部导航栏中的「Assignments」进入用户管理界面,您可以在此创建或分配组织中的用户来登录 LobeChat。
### 配置环境变量
在部署 LobeChat 时,您需要配置以下环境变量:
| 环境变量 | 类型 | 描述 |
| ------------------------- | -- | ------------------------------------------------------------------------------------ |
| `NEXT_AUTH_SECRET` | 必选 | 用于加密 Auth.js 会话令牌的密钥。您可以使用以下命令生成密钥:`openssl rand -base64 32` |
| `NEXT_AUTH_SSO_PROVIDERS` | 必选 | 选择 LoboChat 的单点登录提供商。使用 Okta 请填写 `okta`。 |
| `AUTH_OKTA_ID` | 必选 | Okta 应用程序的客户端 ID |
| `AUTH_OKTA_SECRET` | 必选 | Okta 应用程序的客户端密钥 |
| `AUTH_OKTA_ISSUER` | 必选 | Okta 应用程序的域名,`https://example.oktapreview.com` |
| `NEXTAUTH_URL` | 可选 | 该 URL 用于指定 Auth.js 在执行 OAuth 认证时的回调地址。仅当默认地址不正确时才需要设置。`https://example.com/api/auth` |
<Callout type={'tip'}>
您可以在 [📘环境变量](/zh/docs/self-hosting/environment-variables/auth#okta) 查阅相关变量详情。
</Callout>
</Steps>
<Callout>
部署成功后,用户将能够使用在 Okta 中配置的用户进行身份验证并使用 LobeChat。
</Callout>
[okta-client-page]: https://login.okta.com
@@ -84,16 +84,12 @@ We need to configure an S3 storage service in the server-side database to store
<Image alt={'Configure allowed site domain'} src={'https://github.com/lobehub/lobe-chat/assets/28616219/dfcc2cb3-2958-4498-a8a4-51bec584fe7d'} />
<Callout type={'info'}>
If you also plan to use the desktop client, add <code>http://localhost:3015</code> to <code>AllowedOrigins</code> so the desktop client (running locally) can access R2.
</Callout>
Example configuration is as follows:
```json
[
{
"AllowedOrigins": ["https://your-project.vercel.app", "http://localhost:3015"],
"AllowedOrigins": ["https://your-project.vercel.app"],
"AllowedMethods": ["GET", "PUT", "HEAD", "POST", "DELETE"],
"AllowedHeaders": ["*"]
}
@@ -82,17 +82,13 @@ tags:
添加跨域规则,允许你的域名(在上文是 `https://your-project.vercel.app`)来源的请求:
<Image alt={'配置允许你的站点域名'} src={'https://github.com/lobehub/lobe-chat/assets/28616219/dfcc2cb3-2958-4498-a8a4-51bec584fe7d'} />
<Callout type={'info'}>
如果你还需要在桌面端使用,请在 <code>AllowedOrigins</code> 中额外添加 <code>http://localhost:3015</code>,以便桌面端(本地运行)能够访问 R2。
</Callout>
示例配置如下:
```json
[
{
"AllowedOrigins": ["https://your-project.vercel.app", "http://localhost:3015"],
"AllowedOrigins": ["https://your-project.vercel.app"],
"AllowedMethods": ["GET", "PUT", "HEAD", "POST", "DELETE"],
"AllowedHeaders": ["*"]
}
@@ -249,29 +249,6 @@ LobeChat provides a complete authentication service capability when deployed. Th
- Default: `-`
- Example: `https://your-instance-abc123.zitadel.cloud`
### Okta
#### `AUTH_OKTA_ID`
- Type: Required
- Description: Client ID of the Okta application. This can be found under your application settings in the Okta console.
- Default: `-`
- Example: `ac12c950f3ce48c8a45a`
#### `AUTH_OKTA_SECRET`
- Type: Required
- Description: Client Secret of the Okta application. This can be found under your application settings in the Okta console.
- Default: `-`
- Example: `ex1HqvSOOkC5INqo42grOSqNvHoD4p84em1yy5QU7v88IZlaWGywFjYkrkpkSopt`
#### `AUTH_OKTA_ISSUER`
- Type: Required
- Description: Issuer of the Okta application. This is the URL of the Okta instance -- If branding is set up, it can be your custom domain.
- Default: `-`
- Example: `https://your-instance.okta.com`
### Generic OIDC
#### `AUTH_GENERIC_OIDC_ID`
@@ -245,29 +245,6 @@ LobeChat 在部署时提供了完善的身份验证服务能力,以下是相
- 默认值:`-`
- 示例:`https://your-instance-abc123.zitadel.cloud`
### Okta
#### `AUTH_OKTA_ID`
- 类型:必选
- 描述:Okta 应用程序的 Client ID。您可以在 Okta 控制台的应用程序设置中找到。
- 默认值:`-`
- 示例:`ac12c950f3ce48c8a45a`
#### `AUTH_OKTA_SECRET`
- 类型:必选
- 描述:Okta 应用程序的 Client Secret。您可以在 Okta 控制台的应用程序设置中找到。
- 默认值:`-`
- 示例:`ex1HqvSOOkC5INqo42grOSqNvHoD4p84em1yy5QU7v88IZlaWGywFjYkrkpkSopt`
#### `AUTH_OKTA_ISSUER`
- 类型:必选
- 描述:Okta 应用程序的 OpenID Connect 颁发者(issuer)。这是 Okta 实例的 URL—— 如果设置了品牌化,也可以是您的自定义域名。
- 默认值:`-`
- 示例:`https://your-instance.okta.com`
### Generic OIDC
#### `AUTH_GENERIC_OIDC_ID`
-45
View File
@@ -1,45 +0,0 @@
---
title: Using 302.AI in LobeChat
description: Learn how to configure and use 302.AI's API Key in LobeChat to start conversations and interactions.
tags:
- LobeChat
- 302.AI
- API Key
- Web UI
---
# Using 302.AI in LobeChat
<Image cover src={'https://file.302.ai/gpt/imgs/20250722/c7a6ee9959a8490fa00481dae0fbb339.jpg'} />
[302.AI](https://www.302.ai/) is a pay-as-you-go AI application platform that provides the most comprehensive AI APIs and AI online applications on the market.
This article will guide you on how to use 302.AI in LobeChat.
<Steps>
### Step 1: Obtain [302.AI](https://www.302.ai/) API Key
- Click `Get Started`, register and log in to [302.AI](https://www.302.ai/)
- Click `API Keys` on the left side
- Click `Add API KEY`, copy and save the generated API key
<Image alt={'Get API Key'} inStep src={'https://file.302.ai/gpt/imgs/20250722/7a3597061d9a484ca7358867930a8316.jpg'} />
### Step 2: Configure 302.AI in LobeChat
- Access LobeChat's `Settings` interface
- Find the `302.AI` configuration item under `Language Models`
<Image alt={'Enter API Key'} inStep src={'https://file.302.ai/gpt/imgs/20250722/b056ca4e63374668b7e3e093726fa6f0.jpg'} />
- Enter the obtained API key
- Select a 302.AI model for your AI assistant to start conversations
<Image alt={'Select 302.AI model and start conversation'} inStep src={'https://file.302.ai/gpt/imgs/20250722/c7a6ee9959a8490fa00481dae0fbb339.jpg'} />
<Callout type={'warning'}>
During usage, you may need to pay the API service provider. Please refer to 302.AI's relevant pricing policy.
</Callout>
</Steps>
Now you can use 302.AI's models for conversations in LobeChat.
-45
View File
@@ -1,45 +0,0 @@
---
title: 在 LobeChat 中使用 302.AI
description: 学习如何在 LobeChat 中配置和使用 302.AI 的API Key,以便开始对话和交互。
tags:
- LobeChat
- 302.AI
- API密钥
- Web UI
---
# 在 LobeChat 中使用 302.AI
<Image cover src={'https://file.302.ai/gpt/imgs/20250722/d346c796faa4443eb0bd4218f84205f6.jpg'} />
[302.AI](https://www.302.ai/) 是一个按需付费的 AI 应用平台,提供市面上最全的 AI API 和 AI 在线应用。
本文将指导你如何在 LobeChat 中使用 302.AI。
<Steps>
### 步骤一:获得 [302.AI](https://www.302.ai/) 的 API Key
- 点击 `开始使用`,注册并登录 [302.AI](https://www.302.ai/)
- 点击左侧的 `API Keys`
- 点击 `添加API KEY`,复制并保存生成的 API 密钥
<Image alt={'获取 API 密钥'} inStep src={'https://file.302.ai/gpt/imgs/20250722/01abd69fd61540489781fd963e504a04.jpg'} />
### 步骤二:在 LobeChat 中配置 302.AI
- 访问 LobeChat 的`设置`界面
- 在`语言模型`下找到 `302.AI` 的设置项
<Image alt={'填入 API 密钥'} inStep src={'https://file.302.ai/gpt/imgs/20250722/5247463e74c742f79bef416bbb0722bf.jpg'} />
- 填入获得的 API 密钥
- 为你的 AI 助手选择一个 302.AI 的模型即可开始对话
<Image alt={'选择 302.AI 模型并开始对话'} inStep src={'https://file.302.ai/gpt/imgs/20250722/d346c796faa4443eb0bd4218f84205f6.jpg'} />
<Callout type={'warning'}>
在使用过程中你可能需要向 API 服务提供商付费,请参考 302.AI 的相关费用政策。
</Callout>
</Steps>
至此你已经可以在 LobeChat 中使用 302.AI 提供的模型进行对话了。
-101
View File
@@ -1,101 +0,0 @@
---
title: AiHubMix 提供商配置
description: 学习如何在 LobeChat 中配置和使用 AiHubMix 提供商
tags:
- AiHubMix
- 提供商配置
- 配置指南
---
# AiHubMix 提供商配置
AiHubMix 是一个 AI 模型聚合平台,通过统一的 OpenAI 兼容 API 接口提供多种 AI 模型的访问服务。本指南将帮助您在 LobeChat 中设置 AiHubMix 提供商。
## 前置条件
在使用 AiHubMix API 之前,您需要:
1. **创建 AiHubMix 账户**
- 访问 [AiHubMix](https://lobe.li/MZmv94N)
- 注册账户
2. **获取 API 密钥**
- 登录您的 AiHubMix 控制台
- 导航到 API 设置
- 生成用于 LobeChat 的 API 密钥
## 配置
### 环境变量
在您的 `.env` 文件中添加以下环境变量:
```bash
# 启用 AiHubMix 提供商
ENABLED_AIHUBMIX=1
# AiHubMix API 密钥(必需)
AIHUBMIX_API_KEY=your_aihubmix_api_key
```
### 可用模型
AiHubMix 提供多种热门 AI 模型的访问,包括:
- **GPT-4o Mini** - OpenAI 的高性价比小型模型
- **GPT-4o** - OpenAI 的旗舰多模态模型
- **Claude 3.5 Sonnet** - Anthropic 的高级推理模型
- **Claude 3.5 Haiku** - 快速高效的 Claude 模型
- **Gemini Pro 1.5** - Google 的长上下文支持模型
- **DeepSeek V3** - 具有高级推理能力的模型
## 使用方法
1. **配置 API 密钥**
- 在环境变量中设置您的 AiHubMix API 密钥
- 重启您的 LobeChat 实例
2. **选择模型**
- 进入 LobeChat 设置
- 导航到语言模型
- 选择 AiHubMix 作为您的提供商
- 从可用模型中选择
3. **开始对话**
- 创建新对话
- 选择 AiHubMix 模型
- 开始您的对话
## 功能特性
- **多模型访问**:通过单一 API 访问各种 AI 模型
- **OpenAI 兼容**:使用标准 OpenAI API 格式
- **函数调用**:支持兼容模型的函数调用功能
- **视觉能力**:部分模型支持图像分析
- **模型获取**:自动获取可用模型列表
## 故障排除
### 常见问题
1. **401 认证错误**
- 验证您的 API 密钥是否正确
- 确保 API 密钥具有适当的权限
- 检查您的账户是否有足够的积分
2. **模型不可用**
- 某些模型可能有使用限制
- 查看 AiHubMix 文档了解模型可用性
- 验证您的账户等级是否支持请求的模型
3. **速率限制**
- AiHubMix 可能根据您的计划有速率限制
- 考虑升级您的计划以获得更高的限制
## 支持
如需更多支持:
- 访问 [AiHubMix 文档](https://docs.aihubmix.com/)
- 查看 [模型列表](https://docs.aihubmix.com/cn/api/Model-List)
- 联系 AiHubMix 支持团队解决 API 相关问题
-3
View File
@@ -46,9 +46,6 @@
"reasoningEffort": {
"title": "شدة الاستدلال"
},
"textVerbosity": {
"title": "مستوى تفصيل المخرجات النصية"
},
"thinking": {
"title": "مفتاح التفكير العميق"
},
-4
View File
@@ -21,10 +21,6 @@
"desc": "الدخول إلى وضع التحرير عن طريق الضغط على مفتاح Alt والنقر المزدوج على الرسالة",
"title": "تحرير الرسالة"
},
"navigateToChat": {
"desc": "التبديل إلى علامة تبويب المحادثة والدخول إلى دردشة عشوائية",
"title": "التبديل إلى المحادثة الافتراضية"
},
"openChatSettings": {
"desc": "عرض وتعديل إعدادات المحادثة الحالية",
"title": "فتح إعدادات المحادثة"
+1 -11
View File
@@ -189,7 +189,6 @@
"aesGcm": "سيتم استخدام خوارزمية التشفير <1>AES-GCM</1> لتشفير مفتاحك وعنوان الوكيل وما إلى ذلك",
"apiKey": {
"desc": "يرجى إدخال مفتاح API الخاص بك {{name}}",
"descWithUrl": "يرجى إدخال مفتاح API الخاص بـ {{name}}، <3>انقر هنا للحصول عليه</3>",
"placeholder": "{{name}} مفتاح API",
"title": "مفتاح API"
},
@@ -306,7 +305,6 @@
"latestTime": "آخر تحديث: {{time}}",
"noLatestTime": "لم يتم الحصول على القائمة بعد"
},
"noModelsInCategory": "لا توجد نماذج مفعلة في هذا التصنيف",
"resetAll": {
"conform": "هل أنت متأكد من إعادة تعيين جميع التعديلات على النموذج الحالي؟ بعد إعادة التعيين، ستعود قائمة النماذج الحالية إلى الحالة الافتراضية",
"success": "تمت إعادة التعيين بنجاح",
@@ -317,15 +315,7 @@
"title": "قائمة النماذج",
"total": "إجمالي {{count}} نموذج متاح"
},
"searchNotFound": "لم يتم العثور على نتائج البحث",
"tabs": {
"all": "الكل",
"chat": "الدردشة",
"embedding": "التضمين",
"image": "صورة",
"stt": "تحويل الكلام إلى نص",
"tts": "تحويل النص إلى كلام"
}
"searchNotFound": "لم يتم العثور على نتائج البحث"
},
"sortModal": {
"success": "تم تحديث الترتيب بنجاح",
+8 -230
View File
@@ -32,9 +32,6 @@
"4.0Ultra": {
"description": "Spark4.0 Ultra هو أقوى إصدار في سلسلة نماذج Spark، حيث يعزز فهم النصوص وقدرات التلخيص مع تحسين روابط البحث عبر الإنترنت. إنه حل شامل يهدف إلى تعزيز إنتاجية المكتب والاستجابة الدقيقة للاحتياجات، ويعتبر منتجًا ذكيًا رائدًا في الصناعة."
},
"AnimeSharp": {
"description": "AnimeSharp (المعروف أيضًا باسم \"4xAnimeSharp\") هو نموذج مفتوح المصدر للتكبير الفائق الدقة طوره Kim2091 استنادًا إلى بنية ESRGAN، يركز على تكبير وتوضيح الصور بأسلوب الأنمي. تم إعادة تسميته في فبراير 2022 من \"4x-TextSharpV1\"، وكان في الأصل مناسبًا أيضًا لصور النصوص لكنه تم تحسين أداؤه بشكل كبير لمحتوى الأنمي."
},
"Baichuan2-Turbo": {
"description": "يستخدم تقنية تعزيز البحث لتحقيق الربط الشامل بين النموذج الكبير والمعرفة الميدانية والمعرفة من جميع أنحاء الشبكة. يدعم تحميل مستندات PDF وWord وغيرها من المدخلات، مما يضمن الحصول على المعلومات بشكل سريع وشامل، ويقدم نتائج دقيقة واحترافية."
},
@@ -74,9 +71,6 @@
"DeepSeek-V3": {
"description": "DeepSeek-V3 هو نموذج MoE تم تطويره ذاتيًا بواسطة شركة DeepSeek. حقق DeepSeek-V3 نتائج تقييم تفوقت على نماذج مفتوحة المصدر الأخرى مثل Qwen2.5-72B و Llama-3.1-405B، وفي الأداء ينافس النماذج المغلقة الرائدة عالميًا مثل GPT-4o و Claude-3.5-Sonnet."
},
"DeepSeek-V3-Fast": {
"description": "مزود النموذج: منصة sophnet. DeepSeek V3 Fast هو النسخة السريعة عالية TPS من إصدار DeepSeek V3 0324، غير مكوّن بالكامل، يتمتع بقدرات برمجية ورياضية أقوى واستجابة أسرع!"
},
"Doubao-lite-128k": {
"description": "Doubao-lite يتميز بسرعة استجابة فائقة وقيمة أفضل مقابل المال، ويوفر خيارات أكثر مرونة للعملاء في سيناريوهات مختلفة. يدعم الاستدلال والتخصيص مع نافذة سياق 128k."
},
@@ -95,9 +89,6 @@
"Doubao-pro-4k": {
"description": "النموذج الرئيسي الأكثر فعالية، مناسب لمعالجة المهام المعقدة، ويحقق أداءً ممتازًا في سيناريوهات مثل الأسئلة المرجعية، التلخيص، الإبداع، تصنيف النصوص، ولعب الأدوار. يدعم الاستدلال والتخصيص مع نافذة سياق 4k."
},
"DreamO": {
"description": "DreamO هو نموذج توليد صور مخصص مفتوح المصدر تم تطويره بالتعاون بين ByteDance وجامعة بكين، يهدف إلى دعم مهام توليد الصور المتعددة من خلال بنية موحدة. يستخدم طريقة نمذجة مركبة فعالة لتوليد صور متسقة ومخصصة بناءً على شروط متعددة مثل الهوية، الموضوع، الأسلوب، والخلفية التي يحددها المستخدم."
},
"ERNIE-3.5-128K": {
"description": "نموذج اللغة الكبير الرائد الذي طورته بايدو، يغطي كمية هائلة من البيانات باللغة الصينية والإنجليزية، ويتميز بقدرات عامة قوية، يمكنه تلبية معظم متطلبات الحوار، والإجابة على الأسئلة، وإنشاء المحتوى، وتطبيقات الإضافات؛ يدعم الاتصال التلقائي بإضافات بحث بايدو، مما يضمن تحديث معلومات الإجابة."
},
@@ -131,39 +122,15 @@
"ERNIE-Speed-Pro-128K": {
"description": "نموذج اللغة الكبير عالي الأداء الذي طورته بايدو، والذي تم إصداره في عام 2024، يتمتع بقدرات عامة ممتازة، ويتميز بأداء أفضل من ERNIE Speed، مناسب كنموذج أساسي للتعديل الدقيق، مما يساعد على معالجة مشكلات السيناريوهات المحددة بشكل أفضل، مع أداء استدلال ممتاز."
},
"FLUX.1-Kontext-dev": {
"description": "FLUX.1-Kontext-dev هو نموذج متعدد الوسائط لتوليد وتحرير الصور طورته Black Forest Labs، يعتمد على بنية Rectified Flow Transformer ويحتوي على 12 مليار معلمة، يركز على توليد وإعادة بناء وتعزيز أو تحرير الصور بناءً على شروط سياقية محددة. يجمع النموذج بين مزايا التوليد القابل للتحكم في نماذج الانتشار وقدرات نمذجة السياق في Transformer، ويدعم إخراج صور عالية الجودة، ويستخدم على نطاق واسع في إصلاح الصور، إكمال الصور، وإعادة بناء المشاهد البصرية."
},
"FLUX.1-dev": {
"description": "FLUX.1-dev هو نموذج لغة متعدد الوسائط مفتوح المصدر طورته Black Forest Labs، مُحسّن لمهام النص والصورة، يدمج قدرات فهم وتوليد الصور والنصوص. يعتمد على نماذج اللغة الكبيرة المتقدمة مثل Mistral-7B، ويحقق معالجة متزامنة للنص والصورة واستدلالًا معقدًا من خلال مشفر بصري مصمم بعناية وضبط دقيق متعدد المراحل."
},
"Gryphe/MythoMax-L2-13b": {
"description": "MythoMax-L2 (13B) هو نموذج مبتكر، مناسب لتطبيقات متعددة المجالات والمهام المعقدة."
},
"HelloMeme": {
"description": "HelloMeme هو أداة ذكاء اصطناعي يمكنها تلقائيًا إنشاء ملصقات تعبيرية، صور متحركة أو مقاطع فيديو قصيرة بناءً على الصور أو الحركات التي تقدمها. لا تحتاج إلى مهارات رسم أو برمجة، فقط قدم صورة مرجعية، وستساعدك في إنشاء محتوى جميل، ممتع ومتناسق في الأسلوب."
},
"HiDream-I1-Full": {
"description": "HiDream-E1-Full هو نموذج تحرير صور متعدد الوسائط مفتوح المصدر أطلقته HiDream.ai، يعتمد على بنية Diffusion Transformer المتقدمة، ويجمع بين قدرات فهم اللغة القوية (مضمن LLaMA 3.1-8B-Instruct)، يدعم توليد الصور، نقل الأسلوب، التحرير الجزئي وإعادة رسم المحتوى عبر أوامر اللغة الطبيعية، ويتميز بفهم وتنفيذ ممتاز للنص والصورة."
},
"HunyuanDiT-v1.2-Diffusers-Distilled": {
"description": "hunyuandit-v1.2-distilled هو نموذج توليد صور نصية خفيف الوزن، محسن بالتقطير، قادر على توليد صور عالية الجودة بسرعة، ومناسب بشكل خاص للبيئات ذات الموارد المحدودة والمهام التي تتطلب توليدًا فوريًا."
},
"InstantCharacter": {
"description": "InstantCharacter هو نموذج توليد شخصيات مخصص بدون ضبط دقيق أصدره فريق Tencent AI في 2025، يهدف إلى تحقيق توليد شخصيات متسقة وعالية الدقة عبر مشاهد مختلفة. يدعم بناء نموذج الشخصية استنادًا إلى صورة مرجعية واحدة فقط، ويمكن نقل الشخصية بمرونة إلى أنماط، حركات وخلفيات متنوعة."
},
"InternVL2-8B": {
"description": "InternVL2-8B هو نموذج قوي للغة البصرية، يدعم المعالجة متعددة الوسائط للصورة والنص، قادر على التعرف بدقة على محتوى الصورة وتوليد أوصاف أو إجابات ذات صلة."
},
"InternVL2.5-26B": {
"description": "InternVL2.5-26B هو نموذج قوي للغة البصرية، يدعم المعالجة متعددة الوسائط للصورة والنص، قادر على التعرف بدقة على محتوى الصورة وتوليد أوصاف أو إجابات ذات صلة."
},
"Kolors": {
"description": "Kolors هو نموذج توليد صور نصية طوره فريق Kolors في Kuaishou. تم تدريبه على مليارات المعلمات، ويتميز بجودة بصرية عالية، وفهم دقيق للغة الصينية، وقدرة ممتازة على عرض النصوص."
},
"Kwai-Kolors/Kolors": {
"description": "Kolors هو نموذج توليد صور نصية واسع النطاق يعتمد على الانتشار الكامن طوره فريق Kolors في Kuaishou. تم تدريبه على مليارات أزواج نص-صورة، ويظهر تفوقًا ملحوظًا في جودة الصور، دقة الفهم الدلالي المعقد، وعرض الأحرف الصينية والإنجليزية. يدعم الإدخال باللغتين الصينية والإنجليزية، ويبرع في فهم وتوليد المحتوى الخاص باللغة الصينية."
},
"Llama-3.2-11B-Vision-Instruct": {
"description": "قدرات استدلال الصور الممتازة على الصور عالية الدقة، مناسبة لتطبيقات الفهم البصري."
},
@@ -197,15 +164,9 @@
"MiniMaxAI/MiniMax-M1-80k": {
"description": "MiniMax-M1 هو نموذج استدلال كبير الحجم مفتوح المصدر يعتمد على الانتباه المختلط، يحتوي على 456 مليار معلمة، حيث يمكن لكل رمز تفعيل حوالي 45.9 مليار معلمة. يدعم النموذج أصلاً سياقًا فائق الطول يصل إلى مليون رمز، ومن خلال آلية الانتباه السريع، يوفر 75% من العمليات الحسابية العائمة في مهام التوليد التي تصل إلى 100 ألف رمز مقارنة بـ DeepSeek R1. بالإضافة إلى ذلك، يعتمد MiniMax-M1 على بنية MoE (الخبراء المختلطون)، ويجمع بين خوارزمية CISPO وتصميم الانتباه المختلط لتدريب تعلم معزز فعال، محققًا أداءً رائدًا في الصناعة في استدلال الإدخالات الطويلة وسيناريوهات هندسة البرمجيات الحقيقية."
},
"Moonshot-Kimi-K2-Instruct": {
"description": "يحتوي على 1 تريليون معلمة و32 مليار معلمة مفعلة. من بين النماذج غير المعتمدة على التفكير، يحقق مستويات متقدمة في المعرفة الحديثة، الرياضيات والبرمجة، ويتفوق في مهام الوكيل العامة. تم تحسينه بعناية لمهام الوكيل، لا يجيب فقط على الأسئلة بل يتخذ إجراءات. مثالي للدردشة العفوية، التجارب العامة والوكيل، وهو نموذج سريع الاستجابة لا يتطلب تفكيرًا طويلًا."
},
"NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO": {
"description": "Nous Hermes 2 - Mixtral 8x7B-DPO (46.7B) هو نموذج تعليمات عالي الدقة، مناسب للحسابات المعقدة."
},
"OmniConsistency": {
"description": "يعزز OmniConsistency اتساق الأسلوب والقدرة على التعميم في مهام تحويل الصور إلى صور من خلال إدخال Transformers الانتشارية واسعة النطاق (DiTs) وبيانات نمطية مزدوجة، مما يمنع تدهور الأسلوب."
},
"Phi-3-medium-128k-instruct": {
"description": "نموذج Phi-3-medium نفسه، ولكن مع حجم سياق أكبر لـ RAG أو التوجيه القليل."
},
@@ -257,9 +218,6 @@
"Pro/deepseek-ai/DeepSeek-V3": {
"description": "DeepSeek-V3 هو نموذج لغوي مختلط الخبراء (MoE) يحتوي على 6710 مليار معلمة، يستخدم الانتباه المتعدد الرؤوس (MLA) وهيكل DeepSeekMoE، ويجمع بين استراتيجيات توازن الحمل بدون خسائر مساعدة، مما يحسن كفاءة الاستدلال والتدريب. تم تدريبه مسبقًا على 14.8 تريليون توكن عالية الجودة، وتم إجراء تعديل دقيق تحت الإشراف والتعلم المعزز، مما يجعل DeepSeek-V3 يتفوق على نماذج مفتوحة المصدر الأخرى، ويقترب من النماذج المغلقة الرائدة."
},
"Pro/moonshotai/Kimi-K2-Instruct": {
"description": "Kimi K2 هو نموذج أساسي يعتمد على بنية MoE مع قدرات قوية في البرمجة والوكيل، يحتوي على 1 تريليون معلمة و32 مليار معلمة مفعلة. يتفوق نموذج K2 في اختبارات الأداء الأساسية في مجالات المعرفة العامة، البرمجة، الرياضيات والوكيل مقارنة بالنماذج المفتوحة المصدر الأخرى."
},
"QwQ-32B-Preview": {
"description": "QwQ-32B-Preview هو نموذج معالجة اللغة الطبيعية المبتكر، قادر على معالجة مهام توليد الحوار وفهم السياق بشكل فعال."
},
@@ -320,18 +278,9 @@
"Qwen/Qwen3-235B-A22B": {
"description": "Qwen3 هو نموذج جديد من الجيل التالي مع تحسينات كبيرة في القدرات، حيث يصل إلى مستويات رائدة في الاستدلال، المهام العامة، الوكلاء، واللغات المتعددة، ويدعم تبديل وضع التفكير."
},
"Qwen/Qwen3-235B-A22B-Instruct-2507": {
"description": "Qwen3-235B-A22B-Instruct-2507 هو نموذج لغة كبير من سلسلة Qwen3 طوره فريق Alibaba Tongyi Qianwen، وهو نموذج خبير مختلط (MoE) رائد. يحتوي على 235 مليار معلمة إجمالية و22 مليار معلمة مفعلة في كل استدلال. تم إصداره كنسخة محدثة من Qwen3-235B-A22B غير التفكير، مع تحسينات كبيرة في اتباع التعليمات، الاستدلال المنطقي، فهم النصوص، الرياضيات، العلوم، البرمجة واستخدام الأدوات. يعزز التغطية المعرفية متعددة اللغات ويدعم التوافق الأفضل مع تفضيلات المستخدم في المهام الذاتية والمفتوحة لتوليد نصوص أكثر فائدة وجودة."
},
"Qwen/Qwen3-235B-A22B-Thinking-2507": {
"description": "Qwen3-235B-A22B-Thinking-2507 هو نموذج لغة كبير من سلسلة Qwen3 طوره فريق Alibaba Tongyi Qianwen، يركز على مهام الاستدلال المعقدة عالية الصعوبة. يعتمد على بنية MoE ويحتوي على 235 مليار معلمة إجمالية مع تفعيل حوالي 22 مليار معلمة لكل رمز، مما يحسن الكفاءة الحسابية مع الحفاظ على الأداء القوي. كنموذج \"تفكير\" متخصص، يظهر تحسينات كبيرة في الاستدلال المنطقي، الرياضيات، العلوم، البرمجة والاختبارات الأكاديمية، ويصل إلى مستوى رائد بين نماذج التفكير المفتوحة المصدر. يعزز القدرات العامة مثل اتباع التعليمات، استخدام الأدوات وتوليد النصوص، ويدعم فهم سياق طويل يصل إلى 256 ألف رمز، مما يجعله مناسبًا للمهام التي تتطلب استدلالًا عميقًا ومعالجة مستندات طويلة."
},
"Qwen/Qwen3-30B-A3B": {
"description": "Qwen3 هو نموذج جديد من الجيل التالي مع تحسينات كبيرة في القدرات، حيث يصل إلى مستويات رائدة في الاستدلال، المهام العامة، الوكلاء، واللغات المتعددة، ويدعم تبديل وضع التفكير."
},
"Qwen/Qwen3-30B-A3B-Instruct-2507": {
"description": "Qwen3-30B-A3B-Instruct-2507 هو نسخة محدثة من Qwen3-30B-A3B في وضع عدم التفكير. هذا نموذج خبير مختلط (MoE) يحتوي على 30.5 مليار معلمة إجمالية و3.3 مليار معلمة تنشيط. تم تعزيز النموذج بشكل كبير في عدة جوانب، بما في ذلك تحسين كبير في الالتزام بالتعليمات، والتفكير المنطقي، وفهم النصوص، والرياضيات، والعلوم، والبرمجة، واستخدام الأدوات. كما حقق تقدمًا ملموسًا في تغطية المعرفة متعددة اللغات، ويستطيع التوافق بشكل أفضل مع تفضيلات المستخدم في المهام الذاتية والمفتوحة، مما يمكنه من توليد ردود أكثر فائدة ونصوص ذات جودة أعلى. بالإضافة إلى ذلك، تم تعزيز قدرة النموذج على فهم النصوص الطويلة إلى 256 ألف رمز. هذا النموذج يدعم فقط وضع عدم التفكير، ولن ينتج علامات `<think></think>` في مخرجاته."
},
"Qwen/Qwen3-32B": {
"description": "Qwen3 هو نموذج جديد من الجيل التالي مع تحسينات كبيرة في القدرات، حيث يصل إلى مستويات رائدة في الاستدلال، المهام العامة، الوكلاء، واللغات المتعددة، ويدعم تبديل وضع التفكير."
},
@@ -365,12 +314,6 @@
"Qwen2.5-Coder-32B-Instruct": {
"description": "Qwen2.5-Coder-32B-Instruct هو نموذج لغوي كبير مصمم خصيصًا لتوليد الشيفرات، وفهم الشيفرات، ومشاهد التطوير الفعالة، مع استخدام حجم 32B من المعلمات الرائدة في الصناعة، مما يلبي احتياجات البرمجة المتنوعة."
},
"Qwen3-235B": {
"description": "Qwen3-235B-A22B هو نموذج MoE (نموذج خبير مختلط) يقدم \"وضع الاستدلال المختلط\"، ويدعم المستخدمين في التبديل السلس بين \"وضع التفكير\" و\"وضع عدم التفكير\". يدعم فهم واستدلال 119 لغة ولهجة، ويتميز بقدرات قوية على استدعاء الأدوات. في اختبارات الأداء الشاملة، والبرمجة والرياضيات، واللغات المتعددة، والمعرفة والاستدلال، ينافس هذا النموذج النماذج الرائدة في السوق مثل DeepSeek R1، OpenAI o1، o3-mini، Grok 3، وGoogle Gemini 2.5 Pro."
},
"Qwen3-32B": {
"description": "Qwen3-32B هو نموذج كثيف (Dense Model) يقدم \"وضع الاستدلال المختلط\"، ويدعم التبديل السلس بين \"وضع التفكير\" و\"وضع عدم التفكير\". بفضل تحسينات في بنية النموذج، وزيادة بيانات التدريب، وأساليب تدريب أكثر فعالية، يقدم أداءً يعادل تقريبًا Qwen2.5-72B."
},
"SenseChat": {
"description": "نموذج الإصدار الأساسي (V4)، بطول سياق 4K، يمتلك قدرات قوية وعامة."
},
@@ -407,12 +350,6 @@
"SenseChat-Vision": {
"description": "النموذج الأحدث (V5.5) يدعم إدخال صور متعددة، ويحقق تحسينات شاملة في القدرات الأساسية للنموذج، مع تحسينات كبيرة في التعرف على خصائص الكائنات، والعلاقات المكانية، والتعرف على الأحداث، وفهم المشاهد، والتعرف على المشاعر، واستنتاج المعرفة المنطقية، وفهم النصوص وتوليدها."
},
"SenseNova-V6-5-Pro": {
"description": "من خلال تحديث شامل للبيانات متعددة الوسائط، واللغوية، والاستدلالية، وتحسين استراتيجيات التدريب، حقق النموذج الجديد تحسينات ملحوظة في الاستدلال متعدد الوسائط وقدرة متابعة التعليمات العامة، ويدعم نافذة سياق تصل إلى 128 ألف رمز، ويظهر أداءً متميزًا في مهام متخصصة مثل التعرف الضوئي على الحروف (OCR) والتعرف على حقوق الملكية الفكرية في السياحة والثقافة."
},
"SenseNova-V6-5-Turbo": {
"description": "من خلال تحديث شامل للبيانات متعددة الوسائط، واللغوية، والاستدلالية، وتحسين استراتيجيات التدريب، حقق النموذج الجديد تحسينات ملحوظة في الاستدلال متعدد الوسائط وقدرة متابعة التعليمات العامة، ويدعم نافذة سياق تصل إلى 128 ألف رمز، ويظهر أداءً متميزًا في مهام متخصصة مثل التعرف الضوئي على الحروف (OCR) والتعرف على حقوق الملكية الفكرية في السياحة والثقافة."
},
"SenseNova-V6-Pro": {
"description": "تحقيق توحيد أصلي لقدرات الصور والنصوص والفيديو، متجاوزًا حدود التعدد النمطي التقليدي المنفصل، وفاز بالبطولة المزدوجة في تقييمات OpenCompass وSuperCLUE."
},
@@ -611,9 +548,6 @@
"aya:35b": {
"description": "Aya 23 هو نموذج متعدد اللغات أطلقته Cohere، يدعم 23 لغة، مما يسهل التطبيقات اللغوية المتنوعة."
},
"azure-DeepSeek-R1-0528": {
"description": "مقدم من مايكروسوفت؛ تم ترقية نموذج DeepSeek R1 بإصدار فرعي، الإصدار الحالي هو DeepSeek-R1-0528. في التحديث الأخير، حسّن DeepSeek R1 بشكل كبير عمق الاستدلال وقدرات التنبؤ من خلال زيادة موارد الحوسبة وإدخال آليات تحسين الخوارزميات في مرحلة ما بعد التدريب. النموذج يحقق أداءً ممتازًا في اختبارات معيارية متعددة مثل الرياضيات والبرمجة والمنطق العام، وأداؤه الكلي يقترب من النماذج الرائدة مثل O3 و Gemini 2.5 Pro."
},
"baichuan/baichuan2-13b-chat": {
"description": "Baichuan-13B هو نموذج لغوي كبير مفتوح المصدر قابل للاستخدام التجاري تم تطويره بواسطة Baichuan Intelligence، ويحتوي على 13 مليار معلمة، وقد حقق أفضل النتائج في المعايير الصينية والإنجليزية."
},
@@ -674,9 +608,6 @@
"claude-3-sonnet-20240229": {
"description": "Claude 3 Sonnet يوفر توازنًا مثاليًا بين الذكاء والسرعة لحمولات العمل المؤسسية. يقدم أقصى فائدة بسعر أقل، موثوق ومناسب للنشر على نطاق واسع."
},
"claude-opus-4-1-20250805": {
"description": "Claude Opus 4.1 هو أحدث وأقوى نموذج من Anthropic لمعالجة المهام المعقدة للغاية. يتميز بأداء ذكي وسلس وفهم عميق."
},
"claude-opus-4-20250514": {
"description": "Claude Opus 4 هو أقوى نموذج من Anthropic لمعالجة المهام المعقدة للغاية. إنه يتفوق في الأداء والذكاء والسلاسة والفهم."
},
@@ -1013,9 +944,6 @@
"doubao-seed-1.6-thinking": {
"description": "نموذج Doubao-Seed-1.6-thinking يعزز قدرات التفكير بشكل كبير، مقارنة بـ Doubao-1.5-thinking-pro، مع تحسينات إضافية في القدرات الأساسية مثل البرمجة والرياضيات والاستدلال المنطقي، ويدعم الفهم البصري. يدعم نافذة سياق بحجم 256k وطول إخراج يصل إلى 16k رمز."
},
"doubao-seedream-3-0-t2i-250415": {
"description": "نموذج توليد الصور Doubao طوره فريق Seed في ByteDance، يدعم إدخال النص والصورة، ويوفر تجربة توليد صور عالية الجودة وقابلة للتحكم. يولد الصور بناءً على أوامر نصية."
},
"doubao-vision-lite-32k": {
"description": "نموذج Doubao-vision هو نموذج متعدد الوسائط أطلقته Doubao، يتمتع بقدرات قوية في فهم الصور والاستدلال، بالإضافة إلى دقة عالية في فهم التعليمات. أظهر النموذج أداءً قويًا في استخراج المعلومات من النصوص والصور، والمهام الاستدلالية القائمة على الصور، مما يجعله مناسبًا لمهام الأسئلة البصرية المعقدة والواسعة."
},
@@ -1067,9 +995,6 @@
"ernie-char-fiction-8k": {
"description": "نموذج اللغة الكبير المخصص الذي طورته بايدو، مناسب لتطبيقات مثل NPC في الألعاب، محادثات خدمة العملاء، وأدوار الحوار، حيث يتميز بأسلوب شخصيات واضح ومتسق، وقدرة قوية على اتباع التعليمات، وأداء استدلال ممتاز."
},
"ernie-irag-edit": {
"description": "نموذج تحرير الصور ERNIE iRAG المطور ذاتيًا من Baidu يدعم عمليات مثل المسح (إزالة الكائنات)، إعادة الرسم (إعادة رسم الكائنات)، والتنوع (توليد متغيرات) بناءً على الصور."
},
"ernie-lite-8k": {
"description": "ERNIE Lite هو نموذج اللغة الكبير الخفيف الذي طورته بايدو، يجمع بين أداء النموذج الممتاز وأداء الاستدلال، مناسب للاستخدام مع بطاقات تسريع الذكاء الاصطناعي ذات القدرة الحاسوبية المنخفضة."
},
@@ -1097,32 +1022,14 @@
"ernie-x1-turbo-32k": {
"description": "يتميز هذا النموذج بأداء أفضل مقارنةً بـ ERNIE-X1-32K."
},
"flux-1-schnell": {
"description": "نموذج توليد صور نصية يحتوي على 12 مليار معلمة طورته Black Forest Labs، يستخدم تقنية تقطير الانتشار التنافسي الكامن، قادر على توليد صور عالية الجودة في 1 إلى 4 خطوات. أداء النموذج يضاهي البدائل المغلقة المصدر، ومتاح بموجب ترخيص Apache-2.0 للاستخدام الشخصي، البحثي والتجاري."
},
"flux-dev": {
"description": "FLUX.1 [dev] هو نموذج مفتوح المصدر للأوزان المكررة موجه للتطبيقات غير التجارية. يحافظ على جودة الصور وقدرة اتباع التعليمات مماثلة لإصدار FLUX الاحترافي، مع كفاءة تشغيل أعلى. مقارنة بالنماذج القياسية ذات الحجم المماثل، يستخدم الموارد بشكل أكثر فعالية."
},
"flux-kontext/dev": {
"description": "نموذج FLUX.1 مخصص لمهام تحرير الصور، يدعم إدخال النصوص والصور."
},
"flux-merged": {
"description": "نموذج FLUX.1-merged يجمع بين ميزات العمق التي استكشفتها نسخة \"DEV\" أثناء التطوير ومزايا التنفيذ السريع التي تمثلها نسخة \"Schnell\". من خلال هذا الدمج، يعزز FLUX.1-merged حدود أداء النموذج ويوسع نطاق تطبيقاته."
"description": "نموذج تحرير الصور Frontier."
},
"flux-pro/kontext": {
"description": "FLUX.1 Kontext [pro] قادر على معالجة النصوص والصور المرجعية كمدخلات، مما يتيح تحريرًا محليًا مستهدفًا وتحولات معقدة للمشهد الكلي بسلاسة."
},
"flux-schnell": {
"description": "FLUX.1 [schnell] هو النموذج المفتوح المصدر الأكثر تقدمًا حاليًا في فئة النماذج قليلة الخطوات، متفوقًا على المنافسين وحتى على نماذج غير مكررة قوية مثل Midjourney v6.0 وDALL·E 3 (HD). تم ضبط النموذج خصيصًا للحفاظ على تنوع المخرجات الكامل من مرحلة ما قبل التدريب، ويحقق تحسينات ملحوظة في جودة الصورة، الالتزام بالتعليمات، التغيرات في الحجم/النسبة، معالجة الخطوط وتنوع المخرجات مقارنة بأحدث النماذج في السوق، مما يوفر تجربة توليد صور إبداعية أكثر ثراءً وتنوعًا للمستخدمين."
},
"flux.1-schnell": {
"description": "محول تدفق مصحح يحتوي على 12 مليار معلمة، قادر على توليد الصور بناءً على الوصف النصي."
},
"flux/krea": {
"description": "Flux Krea [dev] هو نموذج توليد صور ذو تفضيلات جمالية، يهدف إلى إنتاج صور أكثر واقعية وطبيعية."
},
"flux/schnell": {
"description": "FLUX.1 [schnell] هو نموذج توليد صور يحتوي على 12 مليار معلمة، يركز على توليد صور عالية الجودة بسرعة."
"description": "FLUX.1 [schnell] هو نموذج محول متدفق يحتوي على 12 مليار معلمة، قادر على توليد صور عالية الجودة من النص في 1 إلى 4 خطوات، مناسب للاستخدام الشخصي والتجاري."
},
"gemini-1.0-pro-001": {
"description": "Gemini 1.0 Pro 001 (تعديل) يوفر أداءً مستقرًا وقابلًا للتعديل، وهو الخيار المثالي لحلول المهام المعقدة."
@@ -1202,6 +1109,9 @@
"gemini-2.5-flash-preview-04-17": {
"description": "معاينة فلاش جمنّي 2.5 هي النموذج الأكثر كفاءة من جوجل، حيث تقدم مجموعة شاملة من الميزات."
},
"gemini-2.5-flash-preview-04-17-thinking": {
"description": "Gemini 2.5 Flash Preview هو نموذج Google الأكثر فعالية من حيث التكلفة، يقدم وظائف شاملة."
},
"gemini-2.5-flash-preview-05-20": {
"description": "Gemini 2.5 Flash Preview هو نموذج Google الأكثر فعالية من حيث التكلفة، يقدم وظائف شاملة."
},
@@ -1280,21 +1190,6 @@
"glm-4.1v-thinking-flashx": {
"description": "سلسلة نماذج GLM-4.1V-Thinking هي أقوى نماذج اللغة البصرية المعروفة على مستوى 10 مليارات معلمة، وتدمج مهام اللغة البصرية المتقدمة من نفس المستوى، بما في ذلك فهم الفيديو، الأسئلة والأجوبة على الصور، حل المسائل العلمية، التعرف على النصوص OCR، تفسير الوثائق والرسوم البيانية، وكلاء واجهة المستخدم الرسومية، ترميز صفحات الويب الأمامية، والتثبيت الأرضي، وغيرها. تتفوق قدرات هذه المهام على نموذج Qwen2.5-VL-72B الذي يحتوي على أكثر من 8 أضعاف عدد المعلمات. من خلال تقنيات التعلم المعزز الرائدة، يتقن النموذج تحسين دقة وإثراء الإجابات عبر استدلال سلسلة التفكير، متفوقًا بشكل ملحوظ على النماذج التقليدية غير المعتمدة على التفكير من حيث النتائج النهائية وقابلية التفسير."
},
"glm-4.5": {
"description": "أحدث نموذج رائد من Zhizhu، يدعم تبديل وضع التفكير، ويحقق مستوى SOTA بين النماذج المفتوحة المصدر في القدرات الشاملة، مع طول سياق يصل إلى 128 ألف رمز."
},
"glm-4.5-air": {
"description": "نسخة خفيفة من GLM-4.5، تجمع بين الأداء والقيمة، وتدعم التبديل المرن بين نماذج التفكير المختلطة."
},
"glm-4.5-airx": {
"description": "نسخة فائقة السرعة من GLM-4.5-Air، تستجيب بسرعة أكبر، مصممة لتلبية الطلبات الكبيرة عالية السرعة."
},
"glm-4.5-flash": {
"description": "نسخة مجانية من GLM-4.5، تقدم أداءً ممتازًا في الاستدلال، البرمجة، والوكيل."
},
"glm-4.5-x": {
"description": "نسخة فائقة السرعة من GLM-4.5، تجمع بين أداء قوي وسرعة توليد تصل إلى 100 رمز في الثانية."
},
"glm-4v": {
"description": "GLM-4V يوفر قدرات قوية في فهم الصور والاستدلال، ويدعم مجموعة متنوعة من المهام البصرية."
},
@@ -1314,7 +1209,7 @@
"description": "استدلال فائق السرعة: يتمتع بسرعة استدلال فائقة وأداء استدلال قوي."
},
"glm-z1-flash": {
"description": "سلسلة GLM-Z1 تتميز بقدرات استدلال معقدة قوية، وتتفوق في مجالات الاستدلال المنطقي، الرياضيات، والبرمجة."
"description": "سلسلة GLM-Z1 تتمتع بقدرة استدلال معقدة قوية، تظهر أداءً ممتازًا في مجالات الاستدلال المنطقي، الرياضيات، والبرمجة. الحد الأقصى لطول السياق هو 32K."
},
"glm-z1-flashx": {
"description": "سرعة عالية وتكلفة منخفضة: نسخة محسنة من Flash، سرعة استدلال فائقة، وضمان تزامن أسرع."
@@ -1484,33 +1379,12 @@
"gpt-4o-transcribe": {
"description": "GPT-4o Transcribe هو نموذج تحويل الصوت إلى نص يستخدم GPT-4o لتفريغ الصوت. مقارنةً بنموذج Whisper الأصلي، يحسن معدل الخطأ في الكلمات ويعزز التعرف على اللغة والدقة. استخدمه للحصول على تفريغ أكثر دقة."
},
"gpt-5": {
"description": "أفضل نموذج للترميز والمهام الوكيلة عبر المجالات. يحقق GPT-5 قفزة في الدقة والسرعة والاستدلال والتعرف على السياق والتفكير المنظم وحل المشكلات."
},
"gpt-5-chat-latest": {
"description": "نموذج GPT-5 المستخدم في ChatGPT. يجمع بين قدرات قوية في فهم اللغة وتوليدها، مناسب لتطبيقات التفاعل الحواري."
},
"gpt-5-mini": {
"description": "نسخة أسرع وأكثر اقتصادية من GPT-5، مناسبة للمهام المحددة بوضوح. توفر استجابة أسرع مع الحفاظ على جودة عالية."
},
"gpt-5-nano": {
"description": "أسرع وأكفأ نسخة من GPT-5 من حيث التكلفة. مثالية للتطبيقات التي تتطلب استجابة سريعة وحساسة للتكلفة."
},
"gpt-image-1": {
"description": "نموذج توليد الصور متعدد الوسائط الأصلي من ChatGPT"
},
"gpt-oss": {
"description": "GPT-OSS 20B هو نموذج لغة كبير مفتوح المصدر أصدرته OpenAI، يستخدم تقنية التكميم MXFP4، ومناسب للتشغيل على وحدات معالجة الرسومات الاستهلاكية المتقدمة أو أجهزة Mac بمعالج Apple Silicon. يتميز هذا النموذج بأداء ممتاز في توليد المحادثات، وكتابة الأكواد، ومهام الاستدلال، ويدعم استدعاء الدوال واستخدام الأدوات."
},
"gpt-oss:120b": {
"description": "GPT-OSS 120B هو نموذج لغة كبير مفتوح المصدر أصدرته OpenAI، يستخدم تقنية التكميم MXFP4، ويعتبر نموذجًا رائدًا. يتطلب تشغيله بيئة متعددة وحدات معالجة الرسومات أو محطة عمل عالية الأداء، ويتميز بأداء متفوق في الاستدلال المعقد، وتوليد الأكواد، ومعالجة اللغات المتعددة، ويدعم استدعاء الدوال المتقدمة وتكامل الأدوات."
},
"grok-2-1212": {
"description": "لقد تم تحسين هذا النموذج في الدقة، والامتثال للتعليمات، والقدرة على التعامل مع لغات متعددة."
},
"grok-2-image-1212": {
"description": "نموذج توليد الصور الأحدث لدينا قادر على توليد صور حيوية وواقعية بناءً على الأوامر النصية. يبرع في مجالات التسويق، وسائل التواصل الاجتماعي، والترفيه."
},
"grok-2-vision-1212": {
"description": "لقد تم تحسين هذا النموذج في الدقة، والامتثال للتعليمات، والقدرة على التعامل مع لغات متعددة."
},
@@ -1580,9 +1454,6 @@
"hunyuan-t1-20250529": {
"description": "محسن لإنشاء النصوص وكتابة المقالات، مع تحسين القدرات في البرمجة الأمامية، الرياضيات، والمنطق العلمي، بالإضافة إلى تعزيز القدرة على اتباع التعليمات."
},
"hunyuan-t1-20250711": {
"description": "تحسين كبير في القدرات الرياضية، المنطقية والبرمجية عالية الصعوبة، مع تحسين استقرار مخرجات النموذج وتعزيز قدرات النصوص الطويلة."
},
"hunyuan-t1-latest": {
"description": "أول نموذج استدلال هجين ضخم في الصناعة، يوسع قدرات الاستدلال، بسرعة فك تشفير فائقة، ويعزز التوافق مع تفضيلات البشر."
},
@@ -1631,12 +1502,6 @@
"hunyuan-vision": {
"description": "نموذج Hunyuan الأحدث متعدد الوسائط، يدعم إدخال الصور والنصوص لتوليد محتوى نصي."
},
"image-01": {
"description": "نموذج توليد صور جديد يقدم تفاصيل دقيقة، يدعم توليد الصور من النصوص والصور."
},
"image-01-live": {
"description": "نموذج توليد صور يقدم تفاصيل دقيقة، يدعم توليد الصور من النصوص مع إمكانية ضبط الأسلوب الفني."
},
"imagen-4.0-generate-preview-06-06": {
"description": "سلسلة نموذج Imagen للجيل الرابع لتحويل النص إلى صورة"
},
@@ -1644,7 +1509,7 @@
"description": "نسخة ألترا من سلسلة نموذج Imagen للجيل الرابع لتحويل النص إلى صورة"
},
"imagen4/preview": {
"description": "نموذج توليد صور عالي الجودة مقدم من جوجل."
"description": "نموذج توليد الصور الأعلى جودة من Google"
},
"internlm/internlm2_5-7b-chat": {
"description": "InternLM2.5 يوفر حلول حوار ذكية في عدة سيناريوهات."
@@ -1661,9 +1526,6 @@
"internvl3-latest": {
"description": "أحدث نموذج متعدد الوسائط تم إصداره، يتمتع بقدرات فهم أقوى للنصوص والصور، وفهم الصور على المدى الطويل، وأدائه يتساوى مع النماذج المغلقة الرائدة. يشير بشكل افتراضي إلى أحدث نموذج من سلسلة InternVL، الحالي هو internvl3-78b."
},
"irag-1.0": {
"description": "نموذج iRAG (استرجاع معزز بالصور) المطور ذاتيًا من Baidu، يجمع بين موارد صور بحث Baidu الضخمة وقدرات النموذج الأساسي القوية لتوليد صور فائقة الواقعية، متفوقًا بشكل كبير على أنظمة توليد الصور النصية الأصلية، مع إزالة الطابع الاصطناعي وتقليل التكلفة. يتميز iRAG بعدم وجود هلوسة، واقعية فائقة، وسرعة في الحصول على النتائج."
},
"jamba-large": {
"description": "أقوى وأحدث نموذج لدينا، مصمم لمعالجة المهام المعقدة على مستوى المؤسسات، ويتميز بأداء استثنائي."
},
@@ -1673,9 +1535,6 @@
"jina-deepsearch-v1": {
"description": "البحث العميق يجمع بين البحث عبر الإنترنت، والقراءة، والاستدلال، مما يتيح إجراء تحقيق شامل. يمكنك اعتباره وكيلًا يتولى مهام البحث الخاصة بك - حيث يقوم بإجراء بحث واسع النطاق ويخضع لعدة تكرارات قبل تقديم الإجابة. تتضمن هذه العملية بحثًا مستمرًا، واستدلالًا، وحل المشكلات من زوايا متعددة. وهذا يختلف اختلافًا جوهريًا عن النماذج الكبيرة القياسية التي تولد الإجابات مباشرة من البيانات المدربة مسبقًا، وكذلك عن أنظمة RAG التقليدية التي تعتمد على البحث السطحي لمرة واحدة."
},
"kimi-k2": {
"description": "Kimi-K2 هو نموذج أساسي يعتمد على بنية MoE أطلقته Moonshot AI، يتمتع بقدرات قوية في البرمجة والوكيل، يحتوي على 1 تريليون معلمة و32 مليار معلمة مفعلة. يتفوق نموذج K2 في اختبارات الأداء الأساسية في مجالات المعرفة العامة، البرمجة، الرياضيات والوكيل مقارنة بالنماذج المفتوحة المصدر الأخرى."
},
"kimi-k2-0711-preview": {
"description": "kimi-k2 هو نموذج أساسي بمعمارية MoE يتمتع بقدرات فائقة في البرمجة والوكيل، مع إجمالي 1 تريليون معلمة و32 مليار معلمة مفعلة. في اختبارات الأداء الأساسية في مجالات المعرفة العامة، البرمجة، الرياضيات، والوكيل، يتفوق نموذج K2 على النماذج المفتوحة المصدر الرئيسية الأخرى."
},
@@ -2069,9 +1928,6 @@
"moonshotai/Kimi-Dev-72B": {
"description": "Kimi-Dev-72B هو نموذج مفتوح المصدر للبرمجة، تم تحسينه عبر تعلم معزز واسع النطاق، قادر على إنتاج تصحيحات مستقرة وجاهزة للإنتاج مباشرة. حقق هذا النموذج نتيجة قياسية جديدة بنسبة 60.4% على SWE-bench Verified، محطماً الأرقام القياسية للنماذج المفتوحة المصدر في مهام هندسة البرمجيات الآلية مثل إصلاح العيوب ومراجعة الشيفرة."
},
"moonshotai/Kimi-K2-Instruct": {
"description": "Kimi K2 هو نموذج أساسي يعتمد على بنية MoE يتمتع بقدرات قوية في البرمجة والوكيل، يحتوي على 1 تريليون معلمة و32 مليار معلمة مفعلة. يتفوق نموذج K2 في اختبارات الأداء الأساسية في مجالات المعرفة العامة، البرمجة، الرياضيات والوكيل مقارنة بالنماذج المفتوحة المصدر الأخرى."
},
"moonshotai/kimi-k2-instruct": {
"description": "kimi-k2 هو نموذج أساسي مبني على بنية MoE يتمتع بقدرات فائقة في البرمجة والوكيل، مع إجمالي 1 تريليون معلمة و32 مليار معلمة مفعلة. في اختبارات الأداء المعيارية في مجالات المعرفة العامة، البرمجة، الرياضيات، والوكيل، يتفوق نموذج K2 على النماذج المفتوحة المصدر الرئيسية الأخرى."
},
@@ -2147,12 +2003,6 @@
"openai/gpt-4o-mini": {
"description": "GPT-4o mini هو أحدث نموذج من OpenAI تم إطلاقه بعد GPT-4 Omni، ويدعم إدخال النصوص والصور وإخراج النصوص. كأحد نماذجهم المتقدمة الصغيرة، فهو أرخص بكثير من النماذج الرائدة الأخرى في الآونة الأخيرة، وأرخص بأكثر من 60% من GPT-3.5 Turbo. يحتفظ بذكاء متقدم مع قيمة ممتازة. حصل GPT-4o mini على 82% في اختبار MMLU، وهو حاليًا يتفوق على GPT-4 في تفضيلات الدردشة."
},
"openai/gpt-oss-120b": {
"description": "OpenAI GPT-OSS 120B هو نموذج لغوي رائد يحتوي على 120 مليار معلمة، مزود بميزات تصفح الإنترنت وتنفيذ الأكواد، ويتميز بقدرات استدلالية."
},
"openai/gpt-oss-20b": {
"description": "OpenAI GPT-OSS 20B هو نموذج لغوي رائد يحتوي على 20 مليار معلمة، مزود بميزات تصفح الإنترنت وتنفيذ الأكواد، ويتميز بقدرات استدلالية."
},
"openai/o1": {
"description": "o1 هو نموذج الاستدلال الجديد من OpenAI، يدعم إدخال الصور والنصوص ويخرج نصًا، مناسب للمهام المعقدة التي تتطلب معرفة عامة واسعة. يتميز هذا النموذج بسياق يصل إلى 200 ألف كلمة وتاريخ معرفة حتى أكتوبر 2023."
},
@@ -2213,9 +2063,6 @@
"qwen-coder-turbo-latest": {
"description": "نموذج Qwen للبرمجة."
},
"qwen-image": {
"description": "نموذج قوي من فريق Qwen لتوليد الصور الخام، يتميز بقدرة مميزة على توليد النصوص الصينية وأنماط بصرية متنوعة للصور."
},
"qwen-long": {
"description": "نموذج Qwen العملاق للغة، يدعم سياقات نصية طويلة، بالإضافة إلى وظائف الحوار المستندة إلى الوثائق الطويلة والعديد من الوثائق."
},
@@ -2417,21 +2264,9 @@
"qwen3-235b-a22b": {
"description": "Qwen3 هو نموذج جديد من الجيل التالي مع تحسينات كبيرة في القدرات، حيث يصل إلى مستويات رائدة في الصناعة في الاستدلال، والعموم، والوكلاء، واللغات المتعددة، ويدعم التبديل بين أنماط التفكير."
},
"qwen3-235b-a22b-instruct-2507": {
"description": "نموذج مفتوح المصدر غير تفكيري مبني على Qwen3، مع تحسينات طفيفة في القدرات الإبداعية والسلامة مقارنة بالإصدار السابق (Tongyi Qianwen 3-235B-A22B)."
},
"qwen3-235b-a22b-thinking-2507": {
"description": "نموذج مفتوح المصدر تفكيري مبني على Qwen3، مع تحسينات كبيرة في القدرات المنطقية، العامة، تعزيز المعرفة والإبداع مقارنة بالإصدار السابق (Tongyi Qianwen 3-235B-A22B)، مناسب للمهام المعقدة التي تتطلب استدلالًا قويًا."
},
"qwen3-30b-a3b": {
"description": "Qwen3 هو نموذج جديد من الجيل التالي مع تحسينات كبيرة في القدرات، حيث يصل إلى مستويات رائدة في الصناعة في الاستدلال، والعموم، والوكلاء، واللغات المتعددة، ويدعم التبديل بين أنماط التفكير."
},
"qwen3-30b-a3b-instruct-2507": {
"description": "تحسنت القدرات العامة للنموذج بشكل كبير في اللغتين الصينية والإنجليزية واللغات المتعددة مقارنة بالإصدار السابق (Qwen3-30B-A3B). تم تحسين المهام المفتوحة الذاتية بشكل خاص لتتوافق بشكل أفضل مع تفضيلات المستخدم، مما يمكنه من تقديم ردود أكثر فائدة."
},
"qwen3-30b-a3b-thinking-2507": {
"description": "نموذج مفتوح المصدر لوضع التفكير مبني على Qwen3، مع تحسينات كبيرة في القدرات المنطقية، والقدرات العامة، وتعزيز المعرفة، والقدرة الإبداعية مقارنة بالإصدار السابق (Tongyi Qianwen 3-30B-A3B)، مناسب للسيناريوهات التي تتطلب استدلالًا عالي الصعوبة."
},
"qwen3-32b": {
"description": "Qwen3 هو نموذج جديد من الجيل التالي مع تحسينات كبيرة في القدرات، حيث يصل إلى مستويات رائدة في الصناعة في الاستدلال، والعموم، والوكلاء، واللغات المتعددة، ويدعم التبديل بين أنماط التفكير."
},
@@ -2441,15 +2276,6 @@
"qwen3-8b": {
"description": "Qwen3 هو نموذج جديد من الجيل التالي مع تحسينات كبيرة في القدرات، حيث يصل إلى مستويات رائدة في الصناعة في الاستدلال، والعموم، والوكلاء، واللغات المتعددة، ويدعم التبديل بين أنماط التفكير."
},
"qwen3-coder-480b-a35b-instruct": {
"description": "نسخة مفتوحة المصدر من نموذج كود Tongyi Qianwen. أحدث نموذج qwen3-coder-480b-a35b-instruct مبني على Qwen3 لتوليد الكود، يتمتع بقدرات قوية كوكيل برمجي، بارع في استدعاء الأدوات والتفاعل مع البيئة، قادر على البرمجة الذاتية مع أداء برمجي ممتاز وقدرات عامة."
},
"qwen3-coder-flash": {
"description": "نموذج كود Tongyi Qianwen. أحدث سلسلة نماذج Qwen3-Coder مبنية على Qwen3 لتوليد الأكواد، تتمتع بقدرات وكيل ترميز قوية، بارعة في استدعاء الأدوات والتفاعل مع البيئة، قادرة على البرمجة الذاتية، وتجمع بين مهارات برمجية ممتازة وقدرات عامة."
},
"qwen3-coder-plus": {
"description": "نموذج كود Tongyi Qianwen. أحدث سلسلة نماذج Qwen3-Coder مبنية على Qwen3 لتوليد الأكواد، تتمتع بقدرات وكيل ترميز قوية، بارعة في استدعاء الأدوات والتفاعل مع البيئة، قادرة على البرمجة الذاتية، وتجمع بين مهارات برمجية ممتازة وقدرات عامة."
},
"qwq": {
"description": "QwQ هو نموذج بحث تجريبي يركز على تحسين قدرات الاستدلال للذكاء الاصطناعي."
},
@@ -2492,24 +2318,6 @@
"sonar-reasoning-pro": {
"description": "منتج API جديد مدعوم من نموذج الاستدلال DeepSeek."
},
"stable-diffusion-3-medium": {
"description": "نموذج توليد صور نصية كبير أحدث من Stability AI. هذا الإصدار يحسن جودة الصور، فهم النصوص وتنوع الأساليب بشكل ملحوظ مقارنة بالأجيال السابقة، قادر على تفسير أوامر اللغة الطبيعية المعقدة بدقة وتوليد صور أكثر دقة وتنوعًا."
},
"stable-diffusion-3.5-large": {
"description": "stable-diffusion-3.5-large هو نموذج مولد صور نصية متعدد الوسائط (MMDiT) يحتوي على 800 مليون معلمة، يتميز بجودة صور ممتازة وتوافق عالي مع الأوامر النصية، يدعم توليد صور عالية الدقة تصل إلى مليون بكسل، ويعمل بكفاءة على الأجهزة الاستهلاكية العادية."
},
"stable-diffusion-3.5-large-turbo": {
"description": "stable-diffusion-3.5-large-turbo هو نموذج مبني على stable-diffusion-3.5-large يستخدم تقنية تقطير الانتشار التنافسي (ADD) لتحقيق سرعة أعلى."
},
"stable-diffusion-v1.5": {
"description": "stable-diffusion-v1.5 تم تهيئته باستخدام أوزان نقطة التحقق stable-diffusion-v1.2، وتم ضبطه بدقة على \"laion-aesthetics v2 5+\" بدقة 512x512 عبر 595 ألف خطوة، مع تقليل شرطية النص بنسبة 10% لتحسين التوليد بدون مصنف."
},
"stable-diffusion-xl": {
"description": "stable-diffusion-xl يحتوي على تحسينات كبيرة مقارنة بالإصدار v1.5، ويعادل أداء نموذج midjourney المفتوح المصدر الرائد. تشمل التحسينات: بنية unet أكبر بثلاثة أضعاف، إضافة وحدة تحسين لتحسين جودة الصور المولدة، وتقنيات تدريب أكثر كفاءة."
},
"stable-diffusion-xl-base-1.0": {
"description": "نموذج توليد صور نصية كبير طورته Stability AI ومفتوح المصدر، يتميز بقدرات توليد صور إبداعية رائدة في الصناعة. يمتلك فهمًا ممتازًا للتعليمات ويدعم تعريف العكس (Reverse Prompt) لتوليد محتوى دقيق."
},
"step-1-128k": {
"description": "يوفر توازنًا بين الأداء والتكلفة، مناسب لمجموعة متنوعة من السيناريوهات."
},
@@ -2540,12 +2348,6 @@
"step-1v-8k": {
"description": "نموذج بصري صغير، مناسب للمهام الأساسية المتعلقة بالنصوص والصور."
},
"step-1x-edit": {
"description": "نموذج متخصص في مهام تحرير الصور، قادر على تعديل وتعزيز الصور بناءً على الصور والأوصاف النصية التي يقدمها المستخدم. يدعم تنسيقات إدخال متعددة، بما في ذلك الأوصاف النصية والصور النموذجية. يفهم نية المستخدم ويولد نتائج تحرير صور متوافقة مع المتطلبات."
},
"step-1x-medium": {
"description": "نموذج قوي لتوليد الصور يدعم الإدخال عبر الأوصاف النصية. يدعم اللغة الصينية بشكل أصلي، قادر على فهم ومعالجة الأوصاف النصية الصينية بدقة، والتقاط المعاني الدلالية وتحويلها إلى ميزات صور لتحقيق توليد صور أكثر دقة. يولد صورًا عالية الدقة والجودة، ويمتلك قدرات نقل الأسلوب."
},
"step-2-16k": {
"description": "يدعم تفاعلات سياق كبيرة، مناسب لمشاهد الحوار المعقدة."
},
@@ -2555,9 +2357,6 @@
"step-2-mini": {
"description": "نموذج كبير سريع يعتمد على بنية الانتباه الجديدة MFA، يحقق نتائج مشابهة لـ step1 بتكلفة منخفضة جداً، مع الحفاظ على قدرة أعلى على المعالجة وزمن استجابة أسرع. يمكنه التعامل مع المهام العامة، ويتميز بقدرات قوية في البرمجة."
},
"step-2x-large": {
"description": "نموذج الجيل الجديد من Step Star، يركز على مهام توليد الصور، قادر على توليد صور عالية الجودة بناءً على الأوصاف النصية المقدمة من المستخدم. يتميز النموذج الجديد بجودة صور أكثر واقعية وقدرات أفضل في توليد النصوص الصينية والإنجليزية."
},
"step-r1-v-mini": {
"description": "هذا النموذج هو نموذج استدلال كبير يتمتع بقدرة قوية على فهم الصور، يمكنه معالجة المعلومات النصية والصورية، ويخرج نصوصًا بعد تفكير عميق. يظهر هذا النموذج أداءً بارزًا في مجال الاستدلال البصري، كما يمتلك قدرات رياضية، برمجية، ونصية من الدرجة الأولى. طول السياق هو 100k."
},
@@ -2633,23 +2432,8 @@
"v0-1.5-md": {
"description": "نموذج v0-1.5-md مناسب للمهام اليومية وتوليد واجهات المستخدم (UI)"
},
"wan2.2-t2i-flash": {
"description": "نسخة Wanxiang 2.2 فائقة السرعة، أحدث نموذج حاليًا. تم تحسين الإبداع، الاستقرار، والواقعية بشكل شامل، مع سرعة توليد عالية وقيمة ممتازة مقابل التكلفة."
},
"wan2.2-t2i-plus": {
"description": "نسخة Wanxiang 2.2 الاحترافية، أحدث نموذج حاليًا. تم تحسين الإبداع، الاستقرار، والواقعية بشكل شامل، مع تفاصيل توليد غنية."
},
"wanx-v1": {
"description": "نموذج أساسي لتوليد الصور النصية. يتوافق مع نموذج Tongyi Wanxiang 1.0 الرسمي."
},
"wanx2.0-t2i-turbo": {
"description": "متخصص في توليد صور بورتريه واقعية، سرعة متوسطة وتكلفة منخفضة. يتوافق مع نموذج Tongyi Wanxiang 2.0 السريع الرسمي."
},
"wanx2.1-t2i-plus": {
"description": "نسخة مطورة شاملة. توليد صور بتفاصيل أكثر ثراءً، سرعة أقل قليلاً. يتوافق مع نموذج Tongyi Wanxiang 2.1 الاحترافي الرسمي."
},
"wanx2.1-t2i-turbo": {
"description": سخة مطورة شاملة. سرعة توليد عالية، أداء شامل، وقيمة ممتازة مقابل التكلفة. يتوافق مع نموذج Tongyi Wanxiang 2.1 السريع الرسمي."
"description": موذج توليد الصور التابع لشركة علي بابا كلاود Tongyi"
},
"whisper-1": {
"description": "نموذج التعرف على الصوت العام، يدعم التعرف على الصوت بعدة لغات، الترجمة الصوتية، والتعرف على اللغة."
@@ -2701,11 +2485,5 @@
},
"yi-vision-v2": {
"description": "نموذج مهام بصرية معقدة، يوفر فهمًا عالي الأداء وقدرات تحليلية بناءً على صور متعددة."
},
"zai-org/GLM-4.5": {
"description": "GLM-4.5 هو نموذج أساسي مصمم لتطبيقات الوكلاء الذكية، يستخدم بنية Mixture-of-Experts (MoE). تم تحسينه بعمق في مجالات استدعاء الأدوات، تصفح الويب، هندسة البرمجيات، وبرمجة الواجهة الأمامية، ويدعم التكامل السلس مع وكلاء الكود مثل Claude Code وRoo Code. يستخدم وضع استدلال مختلط ليتكيف مع سيناريوهات الاستدلال المعقدة والاستخدام اليومي."
},
"zai-org/GLM-4.5-Air": {
"description": "GLM-4.5-Air هو نموذج أساسي مصمم لتطبيقات الوكلاء الذكية، يستخدم بنية Mixture-of-Experts (MoE). تم تحسينه بعمق في مجالات استدعاء الأدوات، تصفح الويب، هندسة البرمجيات، وبرمجة الواجهة الأمامية، ويدعم التكامل السلس مع وكلاء الكود مثل Claude Code وRoo Code. يستخدم وضع استدلال مختلط ليتكيف مع سيناريوهات الاستدلال المعقدة والاستخدام اليومي."
}
}
+136 -196
View File
@@ -1,20 +1,20 @@
{
"confirm": "تأكيد",
"debug": {
"arguments": علمات الاستدعاء",
"arguments": تغيرات الاستدعاء",
"function_call": "استدعاء الدالة",
"off": "إيقاف التصحيح",
"on": "عرض معلومات استدعاء الإضافة",
"payload": "حمولة الإضافة",
"pluginState": "حالة الإضافة",
"response": "النتيجة المرجعة",
"on": "عرض معلومات استدعاء البرنامج المساعد",
"payload": "حمولة البرنامج المساعد",
"pluginState": "حالة المكون",
"response": "الرد",
"title": "تفاصيل الإضافة",
"tool_call": "طلب استدعاء الأداة"
},
"detailModal": {
"customPlugin": {
"description": "يرجى الانتقال إلى صفحة التحرير لمشاهدة التفاصيل",
"editBtn": "تحرير الآن",
"editBtn": "حرر الآن",
"title": "هذه إضافة مخصصة"
},
"emptyState": {
@@ -22,48 +22,48 @@
"title": "عرض تفاصيل الإضافة بعد التثبيت"
},
"info": {
"description": "وصف API",
"name": "اسم API"
"description": "وصف واجهة برمجة التطبيقات",
"name": "اسم واجهة برمجة التطبيقات"
},
"tabs": {
"info": "قدرات الإضافة",
"info": "قدرات البرنامج المساعد",
"manifest": "ملف التثبيت",
"settings": "الإعدادات"
},
"title": "تفاصيل الإضافة"
"title": "تفاصيل البرنامج المساعد"
},
"dev": {
"confirmDeleteDevPlugin": "سيتم حذف هذه الإضافة المحلية ولن يمكن استعادتها، هل تريد حذف هذه الإضافة؟",
"confirmDeleteDevPlugin": "سيتم حذف البرنامج المساعد المحلي، وبمجرد الحذف لن يمكن استعادته، هل ترغب في حذف هذا البرنامج المساعد؟",
"customParams": {
"useProxy": {
"label": "التثبيت عبر الوكيل (إذا واجهت خطأ وصول عبر النطاق، جرب تفعيل هذا الخيار ثم أعد التثبيت)"
"label": "تثبيت عبر الوكيل (في حالة حدوث أخطاء الوصول عبر النطاقات المتقاطعة، يمكنك تجربة تفعيل هذا الخيار ثم إعادة التثبيت)"
}
},
"deleteSuccess": "تم حذف الإضافة بنجاح",
"deleteSuccess": "تم حذف البرنامج المساعد بنجاح",
"manifest": {
"identifier": {
"desc": "المعرف الفريد للإضافة",
"desc": "العلامة المميزة للبرنامج المساعد",
"label": "المعرف"
},
"mode": {
"mcp": "إضافة MCP",
"mcp": "مكون MCP",
"mcpExp": "تجريبي",
"url": "رابط مباشر"
"url": "رابط عبر الإنترنت"
},
"name": {
"desc": "عنوان الإضافة",
"desc": "عنوان البرنامج المساعد",
"label": "العنوان",
"placeholder": "محرك البحث"
}
},
"mcp": {
"advanced": {
"title": "إعدادات متقدمة"
"title": "الإعدادات المتقدمة"
},
"args": {
"desc": "قائمة المعلمات الممررة لأمر التنفيذ، عادةً هنا يتم إدخال اسم خادم MCP أو مسار سكريبت التشغيل",
"desc": "قائمة المعلمات المرسلة إلى الأمر المنفذ، عادةً ما يتم إدخال اسم خادم MCP هنا، أو مسار البرنامج النصي للتشغيل",
"label": "معلمات الأمر",
"placeholder": "مثال: mcp-hello-world",
"placeholder": "على سبيل المثال: --port 8080 --debug",
"required": "يرجى إدخال معلمات التشغيل"
},
"auth": {
@@ -83,171 +83,171 @@
"label": "أيقونة الإضافة"
},
"command": {
"desc": "الملف التنفيذي أو السكريبت المستخدم لتشغيل خادم MCP STDIO",
"desc": "الملف القابل للتنفيذ أو البرنامج النصي المستخدم لبدء ملحق MCP STDIO",
"label": "الأمر",
"placeholder": "مثال: npx / uv / docker إلخ",
"placeholder": "على سبيل المثال: python main.py أو /path/to/executable",
"required": "يرجى إدخال أمر التشغيل"
},
"desc": {
"desc": "أضف وصفًا للإضافة",
"label": "وصف الإضافة",
"placeholder": "أضف معلومات عن استخدام الإضافة وسيناريوهاتها"
"placeholder": "أضف معلومات حول كيفية استخدام هذه الإضافة وسيناريوهاتها وغيرها"
},
"endpoint": {
"desc": "أدخل عنوان خادم MCP Streamable HTTP الخاص بك",
"label": "رابط نقطة نهاية MCP"
"label": "عنوان URL لنقطة نهاية MCP"
},
"env": {
"add": "أضف سطرًا جديدًا",
"desc": "أدخل متغيرات البيئة المطلوبة لخادم MCP",
"duplicateKeyError": "مفتاح الحقل يجب أن يكون فريدًا",
"formValidationFailed": "فشل التحقق من النموذج، يرجى مراجعة تنسيق المعلمات",
"keyRequired": "مفتاح الحقل لا يمكن أن يكون فارغًا",
"label": "متغيرات بيئة خادم MCP",
"stringifyError": "تعذر تسلسل المعلمات، يرجى مراجعة التنسيق"
"add": "إضافة سطر جديد",
"desc": "أدخل المتغيرات البيئية المطلوبة لخادم MCP الخاص بك",
"duplicateKeyError": "يجب أن تكون مفاتيح الحقول فريدة",
"formValidationFailed": "فشل التحقق من صحة النموذج، يرجى التحقق من تنسيق المعلمات",
"keyRequired": "لا يمكن أن يكون مفتاح الحقل فارغًا",
"label": "متغيرات البيئة لخادم MCP",
"stringifyError": "تعذر تسلسل المعلمات، يرجى التحقق من تنسيق المعلمات"
},
"headers": {
"add": "أضف سطرًا جديدًا",
"add": "أضف صفًا جديدًا",
"desc": "أدخل رؤوس الطلب",
"label": "رؤوس HTTP"
},
"identifier": {
"desc": "حدد اسمًا لإضافة MCP الخاصة بك، يجب أن يكون بالأحرف الإنجليزية",
"invalid": "المعرف يمكن أن يحتوي فقط على أحرف، أرقام، شرطات وشرطات سفلية",
"label": "اسم إضافة MCP",
"placeholder": "مثال: my-mcp-plugin",
"desc": "حدد اسمًا لملحق MCP الخاص بك، يجب أن يكون باستخدام أحرف إنجليزية",
"invalid": "يمكنك إدخال أحرف إنجليزية، أرقام، والرمزين - و _ فقط",
"label": "اسم ملحق MCP",
"placeholder": "على سبيل المثال: my-mcp-plugin",
"required": "يرجى إدخال معرف خدمة MCP"
},
"previewManifest": "معاينة ملف وصف الإضافة",
"quickImport": "استيراد سريع لتكوين JSON",
"quickImport": "استيراد إعدادات JSON بسرعة",
"quickImportError": {
"empty": "لا يمكن أن يكون المحتوى فارغًا",
"empty": "لا يمكن أن تكون المدخلات فارغة",
"invalidJson": "تنسيق JSON غير صالح",
"invalidStructure": "هيكل JSON غير صالح"
"invalidStructure": "تنسيق JSON غير صحيح"
},
"stdioNotSupported": "البيئة الحالية لا تدعم إضافات MCP من نوع stdio",
"stdioNotSupported": "البيئة الحالية لا تدعم مكون MCP من نوع stdio",
"testConnection": "اختبار الاتصال",
"testConnectionTip": جب أن ينجح اختبار الاتصال لكي تعمل إضافة MCP بشكل صحيح",
"testConnectionTip": مكن استخدام إضافة MCP بشكل طبيعي بعد نجاح اختبار الاتصال",
"type": {
"desc": "اختر طريقة اتصال إضافة MCP، النسخة الويب تدعم فقط Streamable HTTP",
"httpFeature1": "متوافق مع الويب وسطح المكتب",
"httpFeature2": "اتصال بخادم MCP عن بعد، لا حاجة لتثبيت إضافي",
"httpShortDesc": "بروتوكول اتصال HTTP متدفق",
"label": "نوع إضافة MCP",
"stdioFeature1": "تأخير اتصال أقل، مناسب للتنفيذ المحلي",
"stdioFeature2": "يجب تثبيت وتشغيل خادم MCP محليًا",
"stdioNotAvailable": "وضع STDIO متاح فقط في نسخة سطح المكتب",
"stdioShortDesc": "بروتوكول اتصال يعتمد على الإدخال والإخراج القياسي",
"title": "نوع إضافة MCP"
"desc": "اختر طريقة الاتصال لملحق MCP، النسخة الويب تدعم فقط Streamable HTTP",
"httpFeature1": "متوافق مع النسخة الويب وسطح المكتب",
"httpFeature2": "الاتصال بخادم MCP عن بُعد، دون الحاجة إلى تثبيت أو إعداد إضافي",
"httpShortDesc": "بروتوكول الاتصال القائم على HTTP المتدفق",
"label": "نوع ملحق MCP",
"stdioFeature1": "زمن تأخير أقل في الاتصال، مناسب للتنفيذ المحلي",
"stdioFeature2": "يجب تثبيت خادم MCP وتشغيله محليًا",
"stdioNotAvailable": "وضع STDIO متاح فقط في النسخة المكتبية",
"stdioShortDesc": "بروتوكول الاتصال القائم على الإدخال والإخراج القياسي",
"title": "نوع ملحق MCP"
},
"url": {
"desc": "أدخل عنوان MCP Server Streamable HTTP الخاص بك، لا يدعم وضع SSE",
"desc": "أدخل عنوان HTTP القابل للبث لخادم MCP الخاص بك، لا يدعم وضع SSE",
"invalid": "يرجى إدخال عنوان URL صالح",
"label": "رابط نقطة نهاية HTTP المتدفق",
"label": "عنوان URL لنقطة نهاية HTTP",
"required": "يرجى إدخال عنوان URL لخدمة MCP"
}
},
"meta": {
"author": {
"desc": "مؤلف الإضافة",
"desc": "مؤلف البرنامج المساعد",
"label": "المؤلف"
},
"avatar": {
"desc": "أيقونة الإضافة، يمكن استخدام إيموجي أو رابط URL",
"label": "الأيقونة"
"desc": "رمز البرنامج المساعد، يمكن استخدام الرموز التعبيرية أو روابط URL",
"label": "الرمز"
},
"description": {
"desc": "وصف الإضافة",
"desc": "وصف البرنامج المساعد",
"label": "الوصف",
"placeholder": "ابحث في محرك البحث للحصول على معلومات"
"placeholder": "البحث في محركات البحث للحصول على المعلومات"
},
"formFieldRequired": "هذا الحقل مطلوب",
"homepage": {
"desc": "الصفحة الرئيسية للإضافة",
"desc": "صفحة البداية للبرنامج المساعد",
"label": "الصفحة الرئيسية"
},
"identifier": {
"desc": "المعرف الفريد للإضافة، سيتم التعرف عليه تلقائيًا من ملف manifest",
"errorDuplicate": "المعرف مكرر مع إضافة موجودة، يرجى تغييره",
"desc": "العلامة المميزة للبرنامج المساعد، سيتم التعرف عليها تلقائيًا من خلال الملف التعريفي",
"errorDuplicate": "تكرار العلامة المميزة مع برنامج مساعد موجود، يرجى تعديل العلامة المميزة",
"label": "المعرف",
"pattenErrorMessage": "يمكن إدخال أحرف إنجليزية، أرقام، - و _ فقط"
"pattenErrorMessage": "يمكن إدخال الأحرف الإنجليزية والأرقام والرمزين - و_ فقط"
},
"lobe": "إضافة {{appName}}",
"manifest": {
"desc": "سيتم تثبيت {{appName}} عبر هذا الرابط",
"label": "رابط ملف وصف الإضافة (Manifest)",
"preview": "معاينة Manifest",
"desc": "{{appName}} سيتم تثبيت الإضافة من خلال هذا الرابط",
"label": "ملف وصف البرنامج المساعد (Manifest) URL",
"preview": "معاينة الملف التعريفي",
"refresh": "تحديث"
},
"openai": "إضافة OpenAI",
"title": {
"desc": "عنوان الإضافة",
"desc": "عنوان البرنامج المساعد",
"label": "العنوان",
"placeholder": "محرك البحث"
}
},
"metaConfig": "تكوين معلومات الإضافة الأساسية",
"modalDesc": "بعد إضافة إضافة مخصصة، يمكن استخدامها للتحقق من تطوير الإضافة أو استخدامها مباشرة في المحادثة. يرجى الرجوع إلى <1>وثائق التطوير↗</> لتطوير الإضافات.",
"metaConfig": "تكوين معلومات البرنامج المساعد",
"modalDesc": "بعد إضافة البرنامج المساعد المخصص، يمكن استخدامه للتحقق من تطوير البرنامج المساعد، كما يمكن استخدامه مباشرة في الدردشة. للحصول على معلومات حول تطوير البرنامج المساعد، يرجى الرجوع إلى <1>وثائق التطوير↗</>",
"openai": {
"importUrl": "استيراد من رابط URL",
"schema": "المخطط"
"schema": "مخطط"
},
"preview": {
"api": {
"noParams": "هذه الأداة لا تحتوي على معلمات",
"noResults": "لم يتم العثور على API تطابق شروط البحث",
"noParams": "لا توجد معلمات لهذه الأداة",
"noResults": "لم يتم العثور على واجهات برمجة التطبيقات التي تتوافق مع شروط البحث",
"params": "المعلمات:",
"searchPlaceholder": "ابحث عن أداة..."
"searchPlaceholder": "ابحث في الأدوات..."
},
"card": "معاينة عرض الإضافة",
"desc": "معاينة وصف الإضافة",
"card": "معاينة عرض البرنامج المساعد",
"desc": "معاينة وصف البرنامج المساعد",
"empty": {
"desc": "بعد إكمال التكوين، يمكنك معاينة قدرات الأدوات المدعومة هنا",
"title": "ابدأ المعاينة بعد تكوين الإضافة"
"desc": "بعد إكمال الإعداد، ستتمكن من معاينة قدرات الأدوات المدعومة من المكون الإضافي هنا",
"title": "ابدأ المعاينة بعد تكوين المكون الإضافي"
},
"title": "معاينة اسم الإضافة"
"title": "معاينة اسم البرنامج المساعد"
},
"save": "تثبيت الإضافة",
"saveSuccess": "تم حفظ إعدادات الإضافة بنجاح",
"save": "تثبيت البرنامج المساعد",
"saveSuccess": "تم حفظ إعدادات البرنامج المساعد بنجاح",
"tabs": {
"manifest": "قائمة وصف الوظائف (Manifest)",
"meta": "معلومات الإضافة الأساسية"
"meta": "معلومات البرنامج المساعد"
},
"title": {
"create": "إضافة إضافة مخصصة",
"edit": "تحرير إضافة مخصصة"
"create": "إضافة برنامج مساعد مخصص",
"edit": "تحرير برنامج مساعد مخصص"
},
"type": {
"lobe": "إضافة {{appName}}",
"openai": "إضافة OpenAI"
"lobe": "برنامج مساعد LobeChat",
"openai": "برنامج مساعد OpenAI"
},
"update": "تحديث",
"updateSuccess": "تم تحديث إعدادات الإضافة بنجاح"
"updateSuccess": "تم تحديث إعدادات البرنامج المساعد بنجاح"
},
"error": {
"fetchError": "فشل طلب رابط manifest، يرجى التأكد من صلاحية الرابط وفحص ما إذا كان يسمح بالوصول عبر النطاق",
"fetchError": "فشل طلب الرابط المعطى للملف، يرجى التأكد من صحة الرابط والسماح بالوصول عبر النطاقات المختلفة",
"installError": "فشل تثبيت الإضافة {{name}}",
"manifestInvalid": "الملف manifest غير مطابق للمواصفات، نتيجة التحقق: \n\n {{error}}",
"manifestInvalid": "الملف غير مطابق للمواصفات، نتيجة التحقق: \n\n {{error}}",
"noManifest": "ملف الوصف غير موجود",
"openAPIInvalid": "فشل تحليل OpenAPI، الخطأ: \n\n {{error}}",
"reinstallError": "فشل تحديث الإضافة {{name}}",
"testConnectionFailed": "فشل الحصول على Manifest: {{error}}",
"urlError": "الرابط لم يرجع محتوى بصيغة JSON، يرجى التأكد من صحة الرابط"
"testConnectionFailed": "فشل في الحصول على ملف التعريف: {{error}}",
"urlError": "الرابط لا يعيد محتوى بتنسيق JSON، يرجى التأكد من صحة الرابط"
},
"inspector": {
"args": "عرض قائمة المعلمات",
"pluginRender": "عرض واجهة الإضافة"
"pluginRender": "عرض واجهة المكون الإضافي"
},
"list": {
"item": {
"deprecated.title": "تم الحذف",
"local.config": "الإعدادات",
"deprecated.title": "مهجور",
"local.config": "التكوين",
"local.title": "مخصص"
}
},
"loading": {
"content": "جارٍ استدعاء الإضافة...",
"plugin": "تشغيل الإضافة..."
"content": "جاري استدعاء الإضافة...",
"plugin": "جاري تشغيل الإضافة..."
},
"localSystem": {
"apiName": {
@@ -255,7 +255,7 @@
"moveLocalFiles": "نقل الملفات",
"readLocalFile": "قراءة محتوى الملف",
"renameLocalFile": "إعادة تسمية",
"searchLocalFiles": "بحث في الملفات",
"searchLocalFiles": "البحث عن الملفات",
"writeLocalFile": "كتابة في الملف"
},
"title": "الملفات المحلية"
@@ -263,23 +263,23 @@
"mcpInstall": {
"CHECKING_INSTALLATION": "جارٍ فحص بيئة التثبيت...",
"COMPLETED": "اكتمل التثبيت",
"CONFIGURATION_REQUIRED": "يرجى إكمال التكوين المطلوب للمتابعة بالتثبيت",
"CONFIGURATION_REQUIRED": "يرجى إكمال التكوينات المطلوبة للمتابعة في التثبيت",
"ERROR": "خطأ في التثبيت",
"FETCHING_MANIFEST": "جارٍ الحصول على ملف وصف الإضافة...",
"FETCHING_MANIFEST": "جارٍ جلب ملف وصف الإضافة...",
"GETTING_SERVER_MANIFEST": "جارٍ تهيئة خادم MCP...",
"INSTALLING_PLUGIN": "جارٍ تثبيت الإضافة...",
"configurationDescription": "تتطلب هذه الإضافة MCP إعداد معلمات لتعمل بشكل صحيح، يرجى ملء المعلومات اللازمة",
"configurationDescription": "تتطلب هذه الإضافة من MCP إعداد معلمات لتعمل بشكل صحيح، يرجى ملء المعلومات الضرورية.",
"configurationRequired": "تكوين معلمات الإضافة",
"continueInstall": "متابعة التثبيت",
"dependenciesDescription": "تتطلب هذه الإضافة تثبيت تبعيات نظامية لتعمل بشكل صحيح، يرجى تثبيت التبعيات المفقودة حسب التعليمات ثم اضغط إعادة الفحص للمتابعة بالتثبيت.",
"dependenciesRequired": "يرجى تثبيت تبعيات النظام للإضافة",
"dependenciesDescription": "تتطلب هذه الإضافة تثبيت الاعتمادات النظامية التالية لتعمل بشكل صحيح، يرجى تثبيت الاعتمادات المفقودة حسب التعليمات ثم النقر على إعادة الفحص للمتابعة.",
"dependenciesRequired": "يرجى تثبيت الاعتمادات النظامية للإضافة",
"dependencyStatus": {
"installed": "مثبت",
"notInstalled": "غير مثبت",
"installed": "مثبّت",
"notInstalled": "غير مثبّت",
"requiredVersion": "الإصدار المطلوب: {{version}}"
},
"errorDetails": {
"args": "المعلمات",
"args": "المعطيات",
"command": "الأمر",
"connectionParams": "معلمات الاتصال",
"env": "متغيرات البيئة",
@@ -295,94 +295,34 @@
"INITIALIZATION_TIMEOUT": "انتهت مهلة التهيئة",
"PROCESS_SPAWN_ERROR": "فشل بدء العملية",
"UNKNOWN_ERROR": "خطأ غير معروف",
"VALIDATION_ERROR": "فشل التحقق من المعلمات"
"VALIDATION_ERROR": "فشل التحقق من المعطيات"
},
"installError": "فشل تثبيت إضافة MCP، السبب: {{detail}}",
"installError": "فشل تثبيت إضافة MCP، سبب الفشل: {{detail}}",
"installMethods": {
"manual": "تثبيت يدوي:",
"manual": "التثبيت اليدوي:",
"recommended": "طريقة التثبيت الموصى بها:"
},
"recheckDependencies": "إعادة فحص",
"skipDependencies": "تخطي الفحص"
},
"pluginList": "قائمة الإضافات",
"protocolInstall": {
"actions": {
"install": "تثبيت",
"installAnyway": "تثبيت على أي حال",
"installed": "مثبت"
},
"config": {
"args": "المعلمات",
"command": "الأمر",
"env": "متغيرات البيئة",
"headers": "رؤوس الطلب",
"title": "معلومات التكوين",
"type": {
"http": "النوع: HTTP",
"label": "النوع",
"stdio": "النوع: Stdio"
},
"url": "عنوان الخدمة"
},
"custom": {
"badge": "إضافة مخصصة",
"security": {
"description": "هذه الإضافة لم يتم التحقق منها رسميًا، قد تحمل مخاطر أمنية! يرجى التأكد من ثقتك بمصدر الإضافة.",
"title": "⚠️ تحذير أمني"
},
"title": "تثبيت إضافة مخصصة"
},
"marketplace": {
"title": "تثبيت إضافات الطرف الثالث",
"trustedBy": "مقدم من {{name}}",
"unverified": {
"title": "إضافات طرف ثالث غير موثوقة",
"warning": "هذه الإضافة من سوق طرف ثالث غير موثوق، يرجى التأكد من ثقتك بالمصدر قبل التثبيت."
},
"verified": "موثوقة"
},
"messages": {
"connectionTestFailed": "فشل اختبار الاتصال",
"installError": "فشل تثبيت الإضافة، يرجى المحاولة مجددًا",
"installSuccess": "تم تثبيت الإضافة {{name}} بنجاح!",
"manifestError": "فشل الحصول على تفاصيل الإضافة، يرجى التحقق من الاتصال بالشبكة والمحاولة مجددًا",
"manifestNotFound": "تعذر الحصول على ملف وصف الإضافة"
},
"meta": {
"author": "المؤلف",
"homepage": "الصفحة الرئيسية",
"identifier": "المعرف",
"source": "المصدر",
"version": "الإصدار"
},
"official": {
"badge": "إضافة رسمية من LobeHub",
"description": "تم تطوير هذه الإضافة وصيانتها رسميًا من قبل LobeHub، وتمت مراجعتها أمنيًا بدقة، يمكن استخدامها بأمان.",
"loadingMessage": "جارٍ الحصول على تفاصيل الإضافة...",
"loadingTitle": "جارٍ التحميل",
"title": "تثبيت إضافة رسمية"
},
"title": "تثبيت إضافة MCP",
"warning": "⚠️ يرجى التأكد من ثقتك بمصدر هذه الإضافة، الإضافات الخبيثة قد تضر بأمان نظامك."
},
"search": {
"apiName": {
"crawlMultiPages": "قراءة محتوى عدة صفحات",
"crawlMultiPages": "قراءة محتوى صفحات متعددة",
"crawlSinglePage": "قراءة محتوى الصفحة",
"search": "البحث في الصفحة"
"search": "بحث في الصفحة"
},
"config": {
"addKey": "إضافة مفتاح",
"close": "حذف",
"confirm": "تم إكمال التكوين وأعيد المحاولة"
"confirm": "تم تكوينه وإعادة المحاولة"
},
"crawPages": {
"crawling": "جارٍ التعرف على الروابط",
"crawling": "جاري التعرف على الروابط",
"detail": {
"preview": "معاينة",
"raw": "نص خام",
"tooLong": "النص طويل جدًا، يحتفظ سياق المحادثة فقط بأول {{characters}} حرفًا، الجزء الزائد غير مدرج في السياق"
"raw": "النص الأصلي",
"tooLong": "محتوى النص طويل جدًا، سيتم الاحتفاظ بالسياق السابق فقط بأول {{characters}} حرف، ولن يتم احتساب الأجزاء الزائدة في سياق المحادثة"
},
"meta": {
"crawler": "وضع الزحف",
@@ -390,19 +330,19 @@
}
},
"searchxng": {
"baseURL": "يرجى الإدخال",
"description": "يرجى إدخال عنوان SearchXNG للبدء في البحث عبر الإنترنت",
"keyPlaceholder": "يرجى إدخال المفتاح",
"title": "تكوين محرك البحث SearchXNG",
"unconfiguredDesc": "يرجى الاتصال بالمسؤول لإكمال تكوين محرك البحث SearchXNG للبدء في البحث عبر الإنترنت",
"unconfiguredTitle": "لم يتم تكوين محرك البحث SearchXNG بعد"
"baseURL": "الرجاء الإدخال",
"description": "الرجاء إدخال عنوان URL لـ SearchXNG لبدء البحث عبر الإنترنت",
"keyPlaceholder": "الرجاء إدخال المفتاح",
"title": "تكوين محرك بحث SearchXNG",
"unconfiguredDesc": "يرجى الاتصال بالمسؤول لإكمال تكوين محرك بحث SearchXNG لبدء البحث عبر الإنترنت",
"unconfiguredTitle": "لم يتم تكوين محرك بحث SearchXNG بعد"
},
"title": "البحث عبر الإنترنت"
},
"setting": "إعدادات الإضافة",
"settings": {
"capabilities": {
"prompts": "عبارات التوجيه",
"prompts": "نصوص التوجيه",
"resources": "الموارد",
"title": "قدرات الإضافة",
"tools": "الأدوات"
@@ -411,18 +351,18 @@
"title": "تكوين الإضافة"
},
"connection": {
"args": "معلمات التشغيل",
"args": "معطيات التشغيل",
"command": "أمر التشغيل",
"title": "معلومات الاتصال",
"type": "نوع الاتصال",
"url": "عنوان الخدمة"
},
"edit": "تحرير",
"envConfigDescription": "سيتم تمرير هذه الإعدادات كمتغيرات بيئة عند بدء تشغيل خادم MCP",
"httpTypeNotice": "إضافات MCP من نوع HTTP لا تحتاج إلى متغيرات بيئة للتكوين حاليًا",
"envConfigDescription": "سيتم تمرير هذه الإعدادات كمتغيرات بيئية إلى العملية عند بدء تشغيل خادم MCP",
"httpTypeNotice": "لا توجد متغيرات بيئية تحتاج إلى التكوين لإضافات MCP من نوع HTTP",
"indexUrl": {
"title": "فهرس السوق",
"tooltip": "لا يدعم التحرير عبر الإنترنت حاليًا، يرجى التكوين عبر متغيرات البيئة عند النشر"
"tooltip": "غير مدعوم حاليا للتحرير عبر الإنترنت، يرجى ضبطه عند نشر المتغيرات البيئية"
},
"messages": {
"connectionUpdateFailed": "فشل تحديث معلومات الاتصال",
@@ -430,41 +370,41 @@
"envUpdateFailed": "فشل حفظ متغيرات البيئة",
"envUpdateSuccess": "تم حفظ متغيرات البيئة بنجاح"
},
"modalDesc": "بعد تكوين عنوان سوق الإضافات، يمكنك استخدام سوق إضافات مخصص",
"modalDesc": "بعد ضبط عنوان سوق الإضافات، يمكن استخدام سوق الإضافات المخصص",
"rules": {
"argsRequired": "يرجى إدخال معلمات التشغيل",
"commandRequired": "يرجى إدخال أمر التشغيل",
"urlRequired": "يرجى إدخال عنوان الخدمة"
},
"saveSettings": "حفظ الإعدادات",
"title": "إعدادات سوق الإضافات"
"title": "ضبط سوق الإضافات"
},
"showInPortal": "يرجى عرض التفاصيل في مساحة العمل",
"showInPortal": "يرجى الاطلاع على التفاصيل في مساحة العمل",
"store": {
"actions": {
"cancel": "إلغاء التثبيت",
"confirmUninstall": "سيتم إلغاء تثبيت هذه الإضافة وسيتم حذف إعداداتها، يرجى تأكيد العملية",
"confirmUninstall": "سيتم إلغاء تثبيت الإضافة، وسيتم مسح تكوين الإضافة، يرجى تأكيد العملية",
"detail": "التفاصيل",
"install": "تثبيت",
"manifest": "تحرير ملف التثبيت",
"settings": "الإعدادات",
"uninstall": "إلغاء التثبيت"
},
"communityPlugin": "مجتمع الطرف الثالث",
"communityPlugin": "مجتمع ثالث",
"customPlugin": "مخصص",
"empty": "لا توجد إضافات مثبتة",
"empty": "لا توجد إضافات مثبتة حاليا",
"emptySelectHint": "اختر إضافة لمعاينة التفاصيل",
"installAllPlugins": "تثبيت الكل",
"networkError": "فشل الحصول على متجر الإضافات، يرجى التحقق من الاتصال بالشبكة والمحاولة مجددًا",
"placeholder": "ابحث عن اسم الإضافة أو الوصف أو الكلمات المفتاحية...",
"releasedAt": "نُشر في {{createdAt}}",
"networkError": "فشل الحصول على متجر الإضافات، يرجى التحقق من الاتصال بالشبكة وإعادة المحاولة",
"placeholder": "ابحث عن اسم الإضافة أو الكلمات الرئيسية...",
"releasedAt": "صدر في {{createdAt}}",
"tabs": {
"installed": "مثبت",
"mcp": "إضافات MCP",
"old": "إضافات LobeChat"
"installed": "مثبتة",
"mcp": "إضافة MCP",
"old": "إضافة LobeChat"
},
"title": "متجر الإضافات"
},
"unknownError": "خطأ غير معروف",
"unknownPlugin": "إضافة غير معروفة"
"unknownPlugin": "البرنامج المساعد غير معروف"
}
-6
View File
@@ -2,15 +2,9 @@
"ai21": {
"description": "تقوم AI21 Labs ببناء نماذج أساسية وأنظمة ذكاء اصطناعي للشركات، مما يسرع من تطبيق الذكاء الاصطناعي التوليدي في الإنتاج."
},
"ai302": {
"description": "302.AI هو منصة تطبيقات ذكاء اصطناعي تعتمد على الدفع حسب الاستخدام، تقدم أكثر واجهات برمجة التطبيقات للتعلم الآلي وتطبيقات الذكاء الاصطناعي عبر الإنترنت شمولاً في السوق"
},
"ai360": {
"description": "AI 360 هي منصة نماذج وخدمات الذكاء الاصطناعي التي أطلقتها شركة 360، تقدم مجموعة متنوعة من نماذج معالجة اللغة الطبيعية المتقدمة، بما في ذلك 360GPT2 Pro و360GPT Pro و360GPT Turbo و360GPT Turbo Responsibility 8K. تجمع هذه النماذج بين المعلمات الكبيرة والقدرات متعددة الوسائط، وتستخدم على نطاق واسع في توليد النصوص، وفهم المعاني، وأنظمة الحوار، وتوليد الشيفرات. من خلال استراتيجيات تسعير مرنة، تلبي AI 360 احتياجات المستخدمين المتنوعة، وتدعم المطورين في التكامل، مما يعزز الابتكار والتطوير في التطبيقات الذكية."
},
"aihubmix": {
"description": "يوفر AiHubMix الوصول إلى نماذج الذكاء الاصطناعي المتعددة من خلال واجهة برمجة تطبيقات موحدة."
},
"anthropic": {
"description": "Anthropic هي شركة تركز على أبحاث وتطوير الذكاء الاصطناعي، وتقدم مجموعة من نماذج اللغة المتقدمة، مثل Claude 3.5 Sonnet وClaude 3 Sonnet وClaude 3 Opus وClaude 3 Haiku. تحقق هذه النماذج توازنًا مثاليًا بين الذكاء والسرعة والتكلفة، وتناسب مجموعة متنوعة من سيناريوهات التطبيقات، من أحمال العمل على مستوى المؤسسات إلى الاستجابات السريعة. يعتبر Claude 3.5 Sonnet أحدث نماذجها، وقد أظهر أداءً ممتازًا في العديد من التقييمات مع الحفاظ على نسبة تكلفة فعالة."
},

Some files were not shown because too many files have changed in this diff Show More