Compare commits

...

136 Commits

Author SHA1 Message Date
lobehubbot 9f22867f3c 🔖 chore(release): release version v2.1.34 [skip ci] 2026-02-28 13:06:21 +00:00
Arvin Xu 49a8f6b497 🐛 fix: fix benchmarks table schema not correctly (#12532)
* fix benchmark table issue

* add new db migration

* fix types
2026-02-28 21:05:32 +08:00
LobeHub Bot 01e13959d1 🌐 chore: translate non-English comments to English in src/features/Conversation (#12410)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 00:13:27 +08:00
lobehubbot ef0e4a6743 🐛 chore(hotfix): bump version to v2.1.33 [skip ci] 2026-02-21 16:01:41 +00:00
Arvin Xu 4d1508ee9b 👷 build: update auto tag release (#12421)
update
2026-02-22 00:00:53 +08:00
Arvin Xu 84ecc1e9f6 🚀 release 20260221 (#12420)
This release includes **82 commits** and **854 changed files**. Key updates are below.

### 🚀 New Features and Enhancements

- Added **Agent Benchmark** support for more systematic agent
performance evaluation.
- Introduced the **video generation** feature end-to-end, including
entry points, sidebar “new” badge support, and skeleton loading for
topic switching.
- Expanded memory capabilities: support for memory effort/tool
permission configuration and improved timeout calculation for memory
analysis tasks.
- Added desktop editor support for image upload via file picker.

### 🤖 Models and Provider Expansion

- Added a new provider: **Straico**.
- Added/updated support for:
  - Claude Sonnet 4.6
  - Gemini 3.1 Pro Preview
  - Qwen3.5 series
  - Grok Imagine (`grok-imagine-image`)
  - MiniMax 2.5
- Added related i18n copy and model parameter adaptations.

### 🖥️ Desktop Improvements

- Integrated `electron-liquid-glass` (macOS Tahoe).
- Improved DMG background assets and desktop release workflow.

### 🛠️ Stability, Security, and UX Fixes

- Fixed multiple video generation pipeline issues: precharge refund
handling, webhook token verification, pricing parameter usage, asset
cleanup, and type safety.
- Fixed `sanitizeFileName` path traversal risks and added unit tests.
- Fixed MCP media URL generation with duplicated `APP_URL` prefix.
- Fixed Qwen3 embedding failures caused by batch-size limits.
- Fixed multiple UI/interaction issues, including mobile header agent
selector/topic count, ChatInput scrolling behavior, and tooltip stacking
context.
- Fixed missing `@napi-rs/canvas` native bindings in Docker standalone
builds.
- Improved GitHub Copilot authentication retry behavior and response
error handling in edge cases.

### 🙏 Thanks to Committers

Huge thanks to these contributors (alphabetical):

@AmAzing129 @Coooolfan @Innei @ONLY-yours @Zhouguanyang @arvinxx
@eaten-cake @hezhijie0327 @nekomeowww @rdmclin2 @rivertwilight @sxjeru
@tjx666
2026-02-21 23:37:57 +08:00
Arvin Xu 093af9889d chore: merge main into canary (#12419)
## Summary

Merge latest changes from main into canary.

## Changes

- Merge branch main into canary via
codex/merge-main-into-canary-20260221
- Resolve one merge conflict in packages/model-bank/src/types/aiModel.ts
by keeping both ModelParamsSchema and VideoModelParamsSchema imports

## Summary by Sourcery

Update NVIDIA provider to support preserved thinking and
reasoning_content for new reasoning-capable chat models and bump package
version.

New Features:
- Add NVIDIA chat model entries for MiniMax-M2.1, DeepSeek V3.2,
GLM-4.7, GLM-5, and Kimi K2.5 with reasoning support.

Enhancements:
- Extend NVIDIA runtime payload handling to map reasoning to
reasoning_content and to translate thinking into either thinking or
enable_thinking/clear_thinking depending on model capabilities.
- Refine NVIDIA provider tests to cover GLM preserved thinking behavior
and reasoning_content conversion across models.

Build:
- Bump package version from 2.1.31 to 2.1.32.
2026-02-21 23:11:28 +08:00
arvinxx 508c3ae20c Merge branch 'main' into codex/merge-main-into-canary-20260221 2026-02-21 23:08:54 +08:00
Arvin Xu e7598fe90b feat: support agent benchmark (#12355)
* improve total

fix page size issue

fix error message handler

fix eval home page

try to fix batch run agent step issue

fix run list

fix dataset loading

fix abort issue

improve jump and table column

fix error streaming

try to fix error output in vercel

refactor qstash workflow client

improve passK

add evals to proxy

refactor metrics

try to fix build

refactor tests

improve detail page

fix passK issue

improve eval-rubric

fix types

support passK

fix type

update

fix db insert issue

improve dataset ui

improve run config

finish step limit now

add step limited

100% coverage to models

add failed tests todo

support interruptOperation

fix lint

improve report detail

improve pass rate

improve sort order issue

fix timeout issue

Update db schema

完整 case 跑通

update database

improve error handling

refactor to improve database

优化 test case 的处理流程

优化部分细节体验和实现

基本完成 Benchmark 全流程功能

优化 run case 展示

优化 run case 序号问题

优化 eval test case 页面

新增 eval test 模式

新增 dataset 页面

update schema

support

finish create test run

fix

update

improve import exp

refactor data flow

improve import workflow

rubric Benchmark detail 页面

improve import ux

update schema

finish eval home page

add eval workflow endpoint

implement benchmark run model

refactor RAG eval

implement backend

update db schema

update db migration

init benchmark

* support rerun error test case

* fix tests

* fix tests
2026-02-21 20:36:40 +08:00
Zhijie He c2280561f5 💄 style: add grok-imagine-image series support via Grok Imagine API (#12365) 2026-02-21 20:21:24 +08:00
Innei 9b692c239a ♻️ chore(ci): remove unnecessary fetch-depth: 0 from workflows (#12403)
Only 4 checkouts truly need full git history (tag operations, branch sync).
The remaining 18 occurrences were used in build/lint/test jobs that only
need the current commit. Also removed redundant fetch-tags: true where
fetch-depth: 0 already implies full tag fetch.
2026-02-21 19:20:28 +08:00
LobeHub Bot e32a2fbad4 🌐 chore: translate non-English comments to English in src/libs/oidc-provider (#12383)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-21 10:27:45 +08:00
lobehubbot cb688b6cfa 🐛 chore(hotfix): bump version to v2.1.32 [skip ci] 2026-02-21 02:23:26 +00:00
Hardy ef474afe84 feat(nvidia): add new models and simplify payload handling for NVIDIA NIM (#12333)
*  feat(nvidia): add interleaved thinking support with new reasoning models

- Add MiniMax-M2.1, DeepSeek V3.2, GLM-4.7, GLM-5, Kimi K2.5 to NVIDIA model bank
- Add reasoning conversion for interleaved thinking mode
- Add tests for GLM-5 and DeepSeek V3.2 thinking

* ♻️ refactor(nvidia): simplify payload handling logic

- Remove redundant THINKING_MODELS and INTERLEAVED_THINKING_MODELS sets
- Apply reasoning -> reasoning_content conversion for all NVIDIA models
- Apply thinking -> chat_template_kwargs conversion based on user input only
- Let API decide if model supports the parameters instead of client-side filtering

* ♻️ refactor(nvidia): add preserved thinking support with model-specific params
2026-02-21 10:20:04 +08:00
YuTengjing 7a1e2b6a48 👷 chore: enable consistent-type-imports ESLint rule (#12399)
👷 chore: enable consistent-type-imports ESLint rule and fix violations
2026-02-21 10:11:38 +08:00
lobehubbot cc926f252a Merge remote-tracking branch 'origin/main' into canary 2026-02-21 02:01:38 +00:00
Arvin Xu 4260474f4e 👷 build: add build prefix to auto-tag release trigger (#12406) 2026-02-21 09:54:48 +08:00
LobeHub Bot ed4c5d125e test: add unit tests for QueueService.calculateDelay (#12356)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-21 09:49:54 +08:00
sxjeru 086dd15add 💄 style: add Claude Sonnet 4.6 model and enhance adaptive thinking logic (#12375)
 feat: add Claude Sonnet 4.6 model and enhance adaptive thinking logic
2026-02-21 09:49:24 +08:00
Zhijie He 1e506c5ebb 💄 style: add qwen3.5 series support (#12364)
style: add `qwen3.5` series support
2026-02-21 09:48:58 +08:00
Coooolfan b799c98487 🐛 fix(mcp): fix double APP_URL prefix in image/audio content URLs (#12400)
contentBlocksToString() was prepending APP_URL via urlJoin() to item.data,
but item.data already contained the full URL after processContentBlocks()
uploaded to S3. This caused URLs like:
https://example.com/https://example.com/f/uuid

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 09:37:04 +08:00
sxjeru 5475188fa0 💄 style: add Gemini 3.1 Pro Preview model (#12392)
*  feat: 添加 Gemini 3.1 Pro Preview 模型及其相关参数

*  feat: 更新 Anthropic 模型

*  feat: 移除过时的 Gemini 2.5 Flash 和 Imagen 4 预览模型

*  feat: 添加 Qwen3 Coder Next 模型并更新 Anthropic 测试用例中的模型版本
2026-02-21 09:35:10 +08:00
Zhijie He 0674eee0d4 🐛 fix: fix qwen3 embedding error due to batch size limitation (#12382)
fix: fix embdding chunk_size limit for qwen

apply suggestion

Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>

fix: fix embdding chunk_size limit for qwen

fix: fix embdding chunk_size limit for qwen
2026-02-21 01:15:14 +08:00
lobehubbot 870638ea8a Merge remote-tracking branch 'origin/main' into canary 2026-02-20 16:44:44 +00:00
Arvin Xu b155656a7c 👷 build: add benchmark db schema (#12402)
* add eval benchmark database

* fix types

* remove regions
2026-02-21 00:44:06 +08:00
lobehubbot d8b947828c 🐛 chore(hotfix): bump version to v2.1.31 [skip ci] 2026-02-20 13:04:35 +00:00
lobehubbot 8310c5755c Merge remote-tracking branch 'origin/main' into canary 2026-02-20 13:04:23 +00:00
YuTengjing bb2d760b4b 💄 style: support more Qwen i2i & t2i models (#11708)
#### 💻 Change Type

<!-- For change type, change [ ] to [x]. -->

- [ ]  feat
- [ ] 🐛 fix
- [ ] ♻️ refactor
- [X] 💄 style
- [ ] 👷 build
- [ ] ️ perf
- [ ]  test
- [ ] 📝 docs
- [ ] 🔨 chore

#### 🔗 Related Issue

Closes #10346

<!-- Link to the issue that is fixed by this PR -->

<!-- Example: Fixes #xxx, Closes #xxx, Related to #xxx -->

#### 🔀 Description of Change

1. 更新的文生图,图生图模型列表,`z-image` `wan2.5` `wan2.6` `qwen-image-plus/max`
`qwen-image-edit-plus/max`
2. 新增 `image2image` endpoint,为老版本图生图模型进行兼容
3. 默认使用 `multimodal-generation` endpoint(新模型目前调研下来都是用这个了,同时支持图生图和文生图)
4. 支持多区域 Dashscope URL,跟随 baseUrl 参数,自动切分 `/compatible-mode/v1` 默认北京区域
    北京 https://dashscope.aliyuncs.com
    新加坡 https://dashscope-intl.aliyuncs.com
    弗吉尼亚 https://dashscope-us.aliyuncs.com

|Endpoint||
|-|-|
|`multimodal-generation`|<img width="826" height="547" alt="image"
src="https://github.com/user-attachments/assets/38206851-94bc-48cc-8a57-24ed7155782f"
/><img width="521" height="383" alt="image"
src="https://github.com/user-attachments/assets/40fe0ed0-35fd-443d-868f-3ae2c27352f9"
/><img width="681" height="557" alt="image"
src="https://github.com/user-attachments/assets/8101b0f1-81c8-4892-a6e2-b51b5b0e0235"
/>|
|`text2image`|<img width="600" height="564" alt="image"
src="https://github.com/user-attachments/assets/39e82a4f-5305-4f30-ae4d-e5339f401e6d"
/>|

<!-- Thank you for your Pull Request. Please provide a description
above. -->

#### 🧪 How to Test

<!-- Please describe how you tested your changes -->

<!-- For AI features, please include test prompts or scenarios -->

- [ ] Tested locally
- [ ] Added/updated tests
- [ ] No tests needed

#### 📸 Screenshots / Videos

<!-- If this PR includes UI changes, please provide screenshots or
videos -->

| Before | After |
| ------ | ----- |
| ...    | ...   |

#### 📝 Additional Information

ref: https://help.aliyun.com/zh/model-studio/newly-released-models
ref:
https://bailian.console.aliyun.com/cn-beijing/?tab=doc#/doc/?type=model&url=2987148

<!-- Add any other context about the Pull Request here. -->

<!-- Breaking changes? Migration guide? Performance impact? -->

## Summary by Sourcery

Extend Qwen image generation support to cover new text-to-image and
image-to-image models while routing legacy models via dedicated
text2image/image2image endpoints and defaulting other models to the
multimodal-generation API.

New Features:
- Add model metadata and configuration for new Qwen image models
including Z-Image Turbo, Qwen Image Edit Max/Plus, Qwen Image Max/Plus,
and Wanxiang 2.5/2.6 variants.
- Introduce explicit handling of legacy text-to-image and image-to-image
Qwen models via separate async text2image and image2image endpoints.

Enhancements:
- Update the Qwen image creation flow to prefer the
multimodal-generation endpoint for newer models and improve error
messaging and logging across image workflows.
- Reformat select Qwen chat model descriptions for consistency without
changing behavior.

Tests:
- Adjust Qwen image creation tests to align with the new
multimodal-generation behavior and removed strict input validation on
qwen-image-edit-specific image URL requirements.
2026-02-20 21:03:45 +08:00
Sun13138 a9d9e7adf0 🐛 fix: correct mobile header agent selector and topic count (#12204) 2026-02-20 21:02:53 +08:00
YuTengjing e28593cc38 feat: add Gemini 3.1 Pro Preview model support (#12391)
- Add gemini-3.1-pro-preview to Google, Vertex AI, and LobeHub providers
- Add thinkingLevel3 extend param type (low/medium/high)
- Create ThinkingLevel3Slider component for 3-level thinking control
- Fix thinkingLevel2/3 not passing values to API due to form field name mismatch
- Add medium to GoogleThinkingLevel and ChatStreamPayload thinkingLevel types
- Update planCardModels to use gemini-3.1-pro-preview
2026-02-20 09:57:20 +08:00
sxjeru e51234443a feat: Add new provider Straico (#12219)
 feat: add Straico model provider integration and environment variable support
2026-02-19 20:02:07 +08:00
LobeHub Bot a0c4baf1aa 🌐 chore: translate non-English comments to English in src/libs (#12353)
* 🌐 chore: translate non-English comments to English in src/libs

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* 🐛 fix: update test to match translated error message

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: arvinxx <arvinx@foxmail.com>
2026-02-18 23:47:49 +08:00
LobeHub Bot 1e20edef3d 🌐 chore: translate non-English comments to English in plugin slice (#12367)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-18 22:28:30 +08:00
Ruxiao Yin 949873adbc 🐛 fix(docker): Fix the issue of missing @napi-rs/canvas platform native binding package in standalone build (#12370)
🐛 fix(docker): include platform-specific @napi-rs/canvas bindings in standalone output
2026-02-18 22:27:58 +08:00
LobeHub Bot 5030177f3d 🌐 chore: translate non-English comments to English in apps/desktop/src/main (#12376)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-18 22:15:03 +08:00
Zhijie He a96a5576a7 fix: force fix style 2026-02-18 20:54:53 +08:00
Zhijie He 9766d20979 fix: fix some bugs 2026-02-18 20:51:34 +08:00
Zhijie He 6a4118c628 feat: support switch dashscope URL based on baseURL
feat: support switch dashscope URL based on baseURL

feat: support switch dashscope URL based on baseURL

feat: support switch dashscope URL based on baseURL
2026-02-18 20:36:23 +08:00
Zhijie He 4fba491793 fix: fix multimodal-generation I2I calling
fix: fix wan2.6-image imageUrls num limit

fix: fix wan2.6-image imageUrls format
2026-02-18 20:36:23 +08:00
Zhijie He ea951b72d3 style: fix height & weight range (apply suggestion 5) 2026-02-18 20:36:23 +08:00
Zhijie He 4a29904516 chore: add imageUrl & imageUrls input validation (apply suggestion 3) 2026-02-18 20:36:23 +08:00
Zhijie He 5d7ee01bce fix: fix edit & i2i models input muti-images 2026-02-18 20:36:23 +08:00
Zhijie He 763352c56a chore: apply some suggestion (1,4,6)
chore: apply some suggestion (1,4,6)
2026-02-18 20:36:23 +08:00
Zhijie He 86624e8808 feat: improve error messages with model names for better debugging 2026-02-18 20:36:23 +08:00
Zhijie He f018a7b790 sytle: update default models 2026-02-18 20:36:23 +08:00
Zhijie He 5f10ede77a sytle: add i2i models 2026-02-18 20:36:23 +08:00
Zhijie He 9312298564 feat: support t2i mode in multimodal-generation endpoint 2026-02-18 20:36:23 +08:00
Zhijie He 6f08c302ac chore: minor code 2026-02-18 20:36:23 +08:00
Zhijie He 0aea1b0a3d feat: update Qwen image models info and code formatting 2026-02-18 20:36:23 +08:00
Zhijie He bf9df0424d feat: add model routing logic with multimodal-generation as default 2026-02-18 20:36:23 +08:00
Zhijie He 989223b355 feat: add Qwen image2image endpoint support and refactor image generation functions 2026-02-18 20:36:23 +08:00
Zhijie He d9f91fc23a Update qwen.ts 2026-02-18 20:36:23 +08:00
YuTengjing 38e1adba2f 🌐 chore: add i18n translations for Claude Sonnet 4.6 (#12374) 2026-02-18 10:13:44 +08:00
YuTengjing f91acfca95 feat(model-bank): lobehub provider add Claude Sonnet 4.6 support (#12373)
Add Claude Sonnet 4.6 model card to lobehub provider and extend
assistant turn prefill restriction to all 4.6 models.
2026-02-18 10:07:43 +08:00
Innei 1f1c49fc52 🐛 fix(tool-ui): fix icon margin and text overflow in FilePathDisplay (#12331)
* 🐛 fix(tool-ui): fix icon margin and text overflow in FilePathDisplay

Fixes LOBE-2541

* 🐛 fix(DragUploadZone): remove border-radius from upload overlay
2026-02-16 21:02:20 +08:00
AmAzing- 8db783b5b8 🔨 chore: add MiniMax 2.5 (#12345)
chore: add mini max 2.5
2026-02-16 19:40:39 +08:00
Innei b3e87f6cd4 ♻️ refactor: replace per-item Editing components with singleton EditingPopover (#12327)
* ♻️ refactor: replace per-item Editing components with singleton EditingPopover

Eliminate 3 duplicate Editing components (AgentItem, AgentGroupItem, Group)
in favor of a single imperative EditingPopover using @lobehub/ui Popover atoms.
Anchor elements are passed via React state (useState + callback ref) instead
of DOM queries. Removes agentRenamingId/groupRenamingId from homeStore.

* fix: edit group agent avaar

Signed-off-by: Innei <tukon479@gmail.com>

*  test(e2e): update rename popover selectors and allow console in tests

Support both antd Popover and @lobehub/ui Popover atoms selectors.
Use save button click instead of click-outside for non-Enter rename flow.
Disable no-console rule for e2e and test files.

*  test(e2e): fix rename popover input detection with data-testid

Add data-testid="editing-popover" to PopoverPopup. Simplify inputNewName
to use single combined selector instead of sequential try-catch loop that
caused 8s+ timeout. Support both @lobehub/ui and antd Popover.

---------

Signed-off-by: Innei <tukon479@gmail.com>
2026-02-16 18:17:59 +08:00
lobehubbot abbf53feda Merge remote-tracking branch 'origin/main' into canary 2026-02-16 06:44:35 +00:00
Arvin Xu 3f432a43d8 🐛 fix(ci): use pull_request_target to support fork PR secrets (#12350)
🐛 fix(ci): use pull_request_target to support fork PR secrets
2026-02-16 14:43:58 +08:00
Innei 8b0d1ec9e3 👷 ci: improve canary versioning to patch+1 sequential numbering (#12347)
Change canary version format from X.(Y+1).0-canary.TIMESTAMP to
X.Y.(Z+1)-canary.N with auto-incrementing sequence. Also add
release prefix as build trigger and update sync PR titles.
2026-02-16 00:49:33 +08:00
Innei b43cbae2e1 🐛 fix: remove isDesktop guard from client fetch switch visibility (#12336)
Allow desktop app users to see and toggle the "Fetch on Client" option
in provider settings. The server-side default values for desktop remain
unchanged, so this only affects UI visibility.
2026-02-16 00:48:02 +08:00
Arvin Xu d2a042cd95 🐛 fix: scroll ChatInput into view when starter mode activates (#12334)
* 🐛 fix: scroll ChatInput into view when starter mode activates

When clicking Create Agent/Group/Write, the SuggestQuestions panel
renders below the ChatInput and pushes total content beyond the
viewport, causing the ChatInput to scroll out of view. This adds
scrollIntoView + focus on mode change so the editor stays visible
and ready for input. Also improves E2E test to target contenteditable
inside ChatInput directly and wait for animation to settle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* update

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:06:14 +08:00
lobehubbot c1916a1996 Merge remote-tracking branch 'origin/main' into canary 2026-02-15 13:28:56 +00:00
sxjeru 502d94bd4c 💄 style: add new MiniMax-M2.5 model (#12289)
* feat: 添加多个新模型及其定价信息,更新模型解析配置

* fix: 更新多个模型的导入语法,添加新模型GLM-5及其属性

* feat: 添加多个Doubao模型及其定价信息,优化payload处理逻辑
2026-02-15 21:28:16 +08:00
YuTengjing f4bd332d11 🐛 fix: use batch config for computePriceParams and pass latency (#12348)
## Summary
- Pass latency (task submission → webhook callback) to
`chargeAfterGenerate` for video generation metrics
- Use `batch.config` instead of webhook `result` for
`computePriceParams` (generateAudio), ensuring pricing uses
user-submitted config
- Rename `generateAudio` top-level param to `computePriceParams: {
generateAudio }` for better structure

## Test plan
- [ ] Submit a video generation task with generateAudio enabled, verify
charge uses correct pricing
- [ ] Submit a video generation task with generateAudio disabled, verify
charge reflects the difference
- [ ] Verify latency is recorded in the charge metrics

## Summary by Sourcery

Adjust video generation charging and metadata to rely on batch config
and record end-to-end latency.

Bug Fixes:
- Ensure generateAudio pricing uses the original batch configuration
instead of the webhook result payload.

Enhancements:
- Pass task submission-to-webhook latency into video charging for
improved metrics.
- Rename chargeAfterGenerate pricing input to computePriceParams for
clearer structure and future extensibility.
- Name generated video files using the batch prompt prefix when
available to improve asset identification.

Tests:
- Add unit tests for the Volcengine video provider request/response
handling, including payload mapping, client config, and error cases.
- Add initial test scaffolding for video standard parameters, cost
computation, single-price resolution, and Volcengine video webhook
handling.
2026-02-15 20:46:29 +08:00
YuTengjing 7df81ffaa1 🐛 fix: add sanitizeFileName alias to vitest config for test resolution 2026-02-15 20:32:24 +08:00
YuTengjing ed076b3cf5 test: add unit tests for sanitizeFileName utility 2026-02-15 20:13:22 +08:00
YuTengjing 0abde1623d 🐛 fix: extract sanitizeFileName util to prevent path traversal in generated file names 2026-02-15 20:03:04 +08:00
YuTengjing 481e5c0066 🐛 fix: sanitize prompt for video file name to prevent path traversal 2026-02-15 20:00:41 +08:00
YuTengjing 8719354282 🐛 fix: use batch config for computePriceParams instead of webhook result 2026-02-15 19:47:10 +08:00
YuTengjing 5957bd4578 🐛 fix: use prompt as video file name instead of generation id 2026-02-15 19:34:14 +08:00
YuTengjing 335e246ac5 test: add unit tests for video generation feature
Cover resolveVideoSinglePrice, computeVideoCost, handleCreateVideoWebhook,
createVolcengineVideo, and video standard-parameters (63 cases total).
2026-02-15 19:34:14 +08:00
YuTengjing 918d048b3d feat: pass latency to chargeAfterGenerate for video generation metrics 2026-02-15 19:32:19 +08:00
Arvin Xu 398d8b7f3c Sync main branch to canary branch (#12339)
Automatic sync from main to canary. Merge conflicts detected.

**Resolution steps:**
```bash
git fetch origin
git checkout sync/main-to-canary-20260214-22020422229
git merge origin/main
# Resolve conflicts
git add -A && git commit
git push
```

> Do NOT merge canary into a main-based branch — always merge main INTO
the canary-based branch to keep a clean commit graph.
2026-02-15 18:52:05 +08:00
Innei 1529f31dff ci: sync workflow for main to canary branch
- Added concurrency control to prevent overlapping sync jobs.
- Improved logic for detecting changes between main and canary branches.
- Streamlined handling of fast-forward merges and conflict resolution.
- Updated PR creation process for manual conflict resolution with detailed instructions.

Signed-off-by: Innei <tukon479@gmail.com>
2026-02-15 16:36:16 +08:00
Innei b4bd5b288c Merge remote-tracking branch 'origin/main' into sync/main-to-canary-20260214-22020422229 2026-02-15 16:03:47 +08:00
YuTengjing 448cfb2cfd 🐛 fix: prevent stale topic ID from persisting in URL on remount (#12341)
## Summary
- Fix bidirectional sync race condition in `TopicUrlSync` where stale
`activeGenerationTopicId` from zustand store overwrites the URL when
navigating back to image/video pages without a `?topic=` param
- Replace `createStoreUpdater` (useEffect-based) with `useLayoutEffect`
for URL → store sync, ensuring it runs before the store → URL
subscription
- Generate latest i18n locales

## Test plan
- [ ] Visit `/video?topic=<id>`, navigate to home, click `/video` —
topic should not persist
- [ ] Visit `/image?topic=<id>`, navigate to home, click `/image` —
topic should not persist
- [ ] Click a topic in the sidebar — URL should update with
`?topic=<id>`
- [ ] Refresh page with `?topic=<id>` — correct topic should be selected

## Summary by Sourcery

Fix URL and store synchronization for generation topics and refresh
localized video page translations.

Bug Fixes:
- Prevent stale activeGenerationTopicId values in the store from
overwriting the URL when remounting image or video pages without a topic
query parameter.

Documentation:
- Regenerate and update i18n locale JSON files across all supported
languages, including new video translation files.
2026-02-15 11:11:47 +08:00
YuTengjing d8c3ef3232 🌐 chore: generate latest i18n locales 2026-02-15 11:10:47 +08:00
YuTengjing 2a23fb9a10 🐛 fix: prevent stale topic ID from persisting in URL on remount 2026-02-15 11:03:06 +08:00
YuTengjing 82f9cb4486 🔨 chore: add video generation feature (#12312)
## Summary
- Add complete video generation feature including UI pages, store
management, server routes, and webhook handling
- Support Volcengine video generation provider with text-to-video and
image-to-video capabilities
- Add video generation topic management, config panel, generation feed,
and prompt input components
- Include database migration for video generation schema
- Refactor GenerationTopicList/TopicPanel as shared components for both
image and video generation

## Test plan
- [ ] Verify video generation page renders correctly
- [ ] Test text-to-video generation flow end-to-end
- [ ] Test image-to-video generation with reference frames
- [ ] Verify video generation topic CRUD operations
- [ ] Confirm webhook handling for async video generation results
- [ ] Check video generation config panel model selection and parameter
controls
2026-02-15 10:13:43 +08:00
YuTengjing 6419fd32b1 🔧 chore: revert some lint config 2026-02-15 09:46:02 +08:00
Arvin Xu 927fe3fd22 ci: fix sync workflow by using PAT for checkout (#12338)
The GITHUB_TOKEN cannot push changes to .github/workflows/ files due to
GitHub's security restrictions. The 'workflows' permission key added in
the previous commit is not a valid workflow permission scope.

Fix: Use secrets.GH_TOKEN (PAT with workflow scope) in the checkout step
so that git push has the necessary credentials to push branches that
contain workflow file changes (e.g. from merge conflicts).

Also reverts the invalid 'workflows: write' permission.
2026-02-15 00:13:13 +08:00
Arvin Xu 03bda41c07 chore(ci): add workflows permission to sync-main-to-canary (#12337)
When merge conflicts involve .github/workflows/ files, GitHub requires
the `workflows: write` permission to push branches containing workflow
file changes. Without this permission, the sync branch push is rejected
with 'refusing to allow a GitHub App to create or update workflow without
workflows permission'.
2026-02-14 23:56:07 +08:00
LobeHub Bot e804773a7e 🌐 chore: translate non-English comments to English in lobehub-skill-store (#12316)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-14 22:22:40 +08:00
YuTengjing 67875bd60a feat: add skeleton loading screen for video topic switching 2026-02-14 21:07:01 +08:00
YuTengjing 916d4841f4 🔒 chore: hide video nav entry behind enableBusinessFeatures flag 2026-02-14 20:52:03 +08:00
YuTengjing d5b1ff20e0 🔧 chore: revert locales/ changes and remove unused locale key
- Revert locales/ directory to canary state (CI auto-generates translations)
- Remove unused `video.topic.empty` key from default locale
2026-02-14 20:16:26 +08:00
YuTengjing 212348eafe 🐛 fix: refund precharge when video task submission fails 2026-02-14 20:16:26 +08:00
YuTengjing 43820eeb2e 🐛 fix: improve video generation security and type safety
- Reject webhook requests when token is missing instead of skipping verification
- Use proper union type for generation assets instead of blanket VideoGenerationAsset cast
- Replace sync js-sha256 with Node.js crypto.createHash for video hashing
- Add 500MB size limit and 5-minute timeout for video downloads
- Add displayName to VideoLoading component
2026-02-14 20:16:26 +08:00
YuTengjing 7397d6f8c1 🐛 fix: add type assertion for prechargeResult in video webhook route 2026-02-14 20:16:26 +08:00
YuTengjing 85d5bc9e08 ♻️ refactor: add model parameter to video free quota query 2026-02-14 20:16:26 +08:00
YuTengjing 3fbc46b23a 🔒 feat: add webhook token verification for video generation callbacks
Generate a one-time crypto-random token per video task, store it in
asyncTask metadata, and append it to the callback URL. The webhook
endpoint verifies the token using timing-safe comparison before
processing, returning 401 on mismatch. Old tasks without a token
are allowed through for backward compatibility.
2026-02-14 20:16:26 +08:00
YuTengjing 6e2ef05270 feat: support new badge on sidebar nav items and enable for video 2026-02-14 20:16:26 +08:00
YuTengjing 06d65e9ce5 🙈 chore: hide Seedance 2.0 entry from home starter list
Temporarily comment out the Seedance 2.0 video button until it's ready for launch. Seedance 1.5 will be released first.
2026-02-14 20:16:26 +08:00
YuTengjing 6002863c17 feat: add video free quota query endpoint and UI stub
Add getVideoFreeQuota TRPC query and business stub for displaying
daily free video generation quota in PromptInput.
2026-02-14 20:16:26 +08:00
YuTengjing 8f2e72d1b8 🐛 fix: update generationBatch tests to match filesToDelete refactor 2026-02-14 20:16:26 +08:00
YuTengjing fcf2444fa8 feat: add eval method to RedisClient for Lua script execution 2026-02-14 20:16:25 +08:00
YuTengjing 661f1a80b4 ♻️ refactor: improve video generation webhook and type safety
- Make AsyncTaskModel.findByInferenceId static to avoid empty userId
- Extract GenerationTopicType for type-safe topic type narrowing
- Hoist batch query to eliminate duplicate DB call in webhook handler
- Add missing i18n keys for video error actions and status
- Fix comment accuracy in generationBatch deletion
2026-02-14 20:16:25 +08:00
YuTengjing 57772d1f3b 🐛 fix: add videoGeneration pricing unit and clean up all asset files on deletion
- Add videoGeneration to PricingGroup maps to fix TS2741 type errors
- Collect url and coverUrl in addition to thumbnailUrl when deleting topics/batches
- Fix createTopic test assertion to match new optional type parameter
2026-02-14 20:16:25 +08:00
YuTengjing abe4c969a5 feat: add video generation feature 2026-02-14 20:16:25 +08:00
lobehubbot b767a66d38 🐛 chore(hotfix): bump version to v2.1.30 [skip ci] 2026-02-14 11:03:50 +00:00
Innei 53e4228ea7 🐛 fix: hotfix v2.1.30 (#12321)
*  chore: enhance release workflow to include conditional release body handling

- Added environment variable `RELEASE_BODY` to capture release notes from the GitHub event.
- Updated the workflow to use this variable, ensuring proper handling of release body content during manual dispatch events.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: simplify GitHub release workflow by removing hotfix-specific logic

- Consolidated the GitHub release creation step to handle both regular and hotfix releases under a single condition.
- Removed the separate hotfix release creation step to streamline the workflow.

Signed-off-by: Innei <tukon479@gmail.com>

*  fix: replace UserPanel popover

- Introduced `PanelContentSkeleton` for better user experience during loading states in the UserPanel.
- Updated `UserPanel` to use the new skeleton and adjusted popover content handling.
- Refactored `PanelContent` to use `FC` type for better type safety.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: bump @lobehub/ui dependency to version 4.38.1

- Updated the @lobehub/ui package to the latest version for improved features and bug fixes.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 refactor: remove inset prop from Popover in UserPanel

- Cleaned up the Popover component in UserPanel by removing the unnecessary inset prop for improved clarity and maintainability.

Signed-off-by: Innei <tukon479@gmail.com>

---------

Signed-off-by: Innei <tukon479@gmail.com>
2026-02-14 19:03:00 +08:00
Innei 7efcdd2f7c 🐛 fix: resolve tooltip z-index stacking context in ModelSwitchPanel (#12324)
🐛 fix: move TooltipGroup to panel root to fix z-index stacking context
2026-02-14 18:49:23 +08:00
Neko bde1503309 🔨 chore(memory-user-memory): support effort & tool permission for configuring memory (#12311) 2026-02-14 18:17:15 +08:00
Neko 487713361a 🔨 chore(userMemories): support to auto calculate the timeout of the memory analysis task (#12325) 2026-02-14 17:36:58 +08:00
LiJian 7bad876259 🐛 fix: slove the execAgent task run error & parse crash problem (#12318)
fix: slove the execAgent task run error & parse crash problem
2026-02-14 14:22:33 +08:00
lobehubbot 229200853a 🐛 chore(hotfix): bump version to v2.1.29 [skip ci] 2026-02-14 02:09:17 +00:00
Innei 5ec89941f3 🐛 fix: bump lobehub/ui and fix workflow (#12313)
## 🩹 Hotfix v2.1.29

This PR starts a hotfix release from `main`.

### Release Process
1.  Hotfix branch created from main
2.  Pushed to remote
3. 🔄 Waiting for PR review and merge
4.  Auto tag + GitHub Release will be created after merge

---
Created by hotfix script

## Summary by Sourcery

Improve main-to-canary sync workflow robustness and tighten hotfix
auto-tagging criteria for release automation.

Enhancements:
- Make the main-to-canary sync workflow attempt direct merges to canary,
falling back to PR creation only when necessary or when conflicts occur,
and handle existing sync PRs more gracefully.
- Refine hotfix detection in the auto-tag workflow by requiring both a
hotfix branch prefix and a valid conventional commit-style PR title
prefix before tagging.
- Update the @lobehub/ui dependency to the latest patch version.

Build:
- Adjust release auto-tag workflow logic to gate hotfix tagging by both
branch naming and PR title format.

CI:
- Enhance GitHub Actions workflow for syncing main to canary with
conflict handling, direct-push optimization, and automated PR
management.
2026-02-14 10:08:31 +08:00
Innei f46916a74d feat(desktop): integrate electron-liquid-glass for macOS Tahoe (#12277)
*  feat(desktop): integrate electron-liquid-glass for macOS Tahoe

Add native liquid glass visual effect on macOS 26+ (Tahoe), replacing
vibrancy with Apple's NSGlassEffectView API via electron-liquid-glass.

- Centralize all platform visual effects in WindowThemeManager
- Strip platform props from BrowserWindow options to prevent config leaking
- Remove vibrancy from appBrowsers/WindowTemplate (managed by ThemeManager)
- Add isMacTahoe detection in env.ts and preload
- Fix applyVisualEffects to handle macOS platform symmetrically

* fix(tests): add isMacTahoe detection in Browser test environment

Introduce isMacTahoe flag in the test environment to support macOS Tahoe-specific features. This change enhances the test suite's ability to simulate and validate platform-specific behavior.

Signed-off-by: Innei <tukon479@gmail.com>

*  feat(theme): update liquid glass variant and adjust background color mix for desktop themes

- Changed liquid glass variant from 2 to 15 for improved visual effects.
- Adjusted background color mix percentages for dark and light themes on desktop to enhance visual consistency.

Signed-off-by: Innei <tukon479@gmail.com>

*  feat(theme): adjust background color mix for dark theme on desktop

- Updated the background color mix percentage for the dark theme on desktop from 70% to 90% for improved visual effect consistency.

Signed-off-by: Innei <tukon479@gmail.com>

---------

Signed-off-by: Innei <tukon479@gmail.com>
2026-02-14 00:31:16 +08:00
Arvin Xu 2ee46b8693 Sync main branch to canary branch (#12308)
Automatic sync

## Summary by Sourcery

Extend database schemas and migrations to support async task inference
tracking and typed generation topics.

New Features:
- Add an inferenceId field to async tasks with a dedicated index for
lookup by inference ID.
- Add a typed generation topic field to distinguish between image and
video topics with a default of image.

Enhancements:
- Update database schema metadata and documentation snapshots to reflect
the new async task and generation topic fields.

Tests:
- Adjust async task and generation topic tests to cover the new
inferenceId and topic type fields.
2026-02-13 23:44:28 +08:00
Innei baf0b56f64 🔧 ci: optimize sync-main-to-canary to merge directly when no conflicts (#12306)
## Summary
- Optimize the main-to-canary sync workflow to directly merge and push
when there are no conflicts, avoiding unnecessary PR creation
- When merge conflicts exist, fall back to creating a PR for manual
resolution
- Add duplicate PR detection to prevent multiple PRs on the same day

## Test plan
- [ ] Push to main with no conflicts on canary → should auto-merge
without PR
- [ ] Push to main with conflicts on canary → should create PR
- [ ] Trigger workflow twice on same day with conflicts → should not
create duplicate PRs

## Summary by Sourcery

CI:
- Update the sync-main-to-canary workflow to merge main into canary
directly on no-conflict updates, only creating a PR when merge conflicts
occur and avoiding duplicate PRs for the same sync date.
2026-02-13 17:39:19 +08:00
YuTengjing 12dc7f90be 👷 build: add video generation schema changes (#12293) 2026-02-13 17:13:16 +08:00
Innei 1b905ede31 Sync main branch to canary branch (#12297)
Automatic sync
2026-02-13 15:50:44 +08:00
Innei cfaa911153 🔧 ci: add commit prefix gate for hotfix auto-tag (#12304)
* 🔧 ci: add commit prefix gate for hotfix auto-tag

* 🔧 chore: update ESLint suppressions and dependencies

- Added new ESLint suppressions for various files to address linting issues, including `no-console` and `object-shorthand`.
- Updated ESLint version to 10.0.0 in both root and desktop package.json files.
- Adjusted linting scripts for improved performance and consistency.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: add ESLint support for YAML files in package.json

- Included ESLint fix command for YAML files (*.yml, *.yaml) in the linting scripts section.
- Ensured consistent formatting by adding a newline at the end of the file.

This update enhances linting capabilities for YAML configuration files.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: remove ESLint configuration file

- Deleted the .eslintrc.js file, which contained custom ESLint rules and overrides.
- This change simplifies the project by relying on default ESLint configurations.

Signed-off-by: Innei <tukon479@gmail.com>

---------

Signed-off-by: Innei <tukon479@gmail.com>
2026-02-13 15:49:33 +08:00
Innei e17bf4b0cc Merge remote-tracking branch 'origin/main' into canary
# Conflicts:
#	locales/ja-JP/suggestQuestions.json
#	locales/vi-VN/models.json
2026-02-13 15:43:49 +08:00
LiJian 58cf27dcf8 🐛 fix: add the Agent Meta info back into agent advance model (#12302)
fix: add the Agent Meta info back into agent advance model
2026-02-13 15:01:50 +08:00
YuTengjing f12d9fbd22 🔒 fix: upgrade next-mdx-remote to v6 for CVE-2026-0969 (#12296)
Upgrade next-mdx-remote from v5.0.0 to v6.0.0 to fix CVE-2026-0969,
an arbitrary code execution vulnerability in MDX content processing.
2026-02-13 13:36:41 +08:00
YuTengjing d4f72eb752 🐛 fix: add missing inferenceId and type fields in test mocks 2026-02-13 12:34:19 +08:00
YuTengjing e112cd6f7f 🗃️ db: add video generation schema changes
- async_tasks: add inference_id column with index
- generation_topics: add type column (default 'image')
2026-02-13 12:09:18 +08:00
Innei 9a9147ca7e feat: support image upload in editor with desktop file picker (#12285)
- Add handleShowOpenDialog and handlePickFile IPC methods for Electron
- Create useImageUpload hook for editor image upload with progress
- Refactor ReactImagePlugin config to support handleUpload and onPickFile
- Simplify slash command image insertion by delegating upload to plugin
- Upgrade @lobehub/editor to ^3.16.1
2026-02-13 01:27:22 +08:00
Innei 2d1eec4482 feat(desktop): configure DMG background image (#12284)
*  feat: configure DMG background image for macOS installer

*  feat(desktop): set DMG window size, icon positions, and retina DPI

* 🔧 chore(desktop): resize DMG background to 600x400 and adjust window/icon positions

* chore: update remote
2026-02-13 01:06:43 +08:00
Innei c11d6de7db 🔧 build: add canary desktop release workflow (#12286)
🔧 build: add canary desktop release workflow and channel support

Add automated canary build pipeline triggered by build/fix/style commits
on canary branch, with concurrency control to cancel stale builds.
2026-02-13 00:37:03 +08:00
René Wang bbbe3a8d09 feat: add banner (#12258)
* feat: add banner

* fix: type error
2026-02-12 21:22:21 +08:00
Innei e51fbba881 feat: redesign Copilot ChatInput with compact action bar layout (#12279)
* add

Signed-off-by: Innei <tukon479@gmail.com>

*  feat: enhance ChatInput with customizable action bar properties

- Added `actionSize` to `ActionBarContextValue` for flexible action sizing.
- Updated `Action` component to utilize `actionSize` for dynamic sizing.
- Introduced `actionBarStyle` and `leftContent` props in `DesktopChatInput` for custom styling and content.
- Enhanced `SendButton` to accept size from `sendButtonProps`.
- Updated `ChatInput` to support new props for improved layout customization.
- Refactored `Conversation` component to implement compact action bar style and size.

This update improves the flexibility and customization of the ChatInput feature, allowing for better user experience.

Signed-off-by: Innei <tukon479@gmail.com>

*  feat: enhance NavHeader and Copilot Toolbar with layout improvements

- Added `allowShrink` property to Flexbox components in NavHeader for better responsiveness.
- Updated Text component in Copilot Toolbar to include tooltip support for ellipsis overflow, improving user experience.

These changes enhance the layout flexibility and visual consistency across the application.

Signed-off-by: Innei <tukon479@gmail.com>

*  feat: update Conversation and AgentSelectorAction components for improved styling

- Adjusted padding in the compact action bar style for better alignment.
- Enhanced AgentSelectorAction styles with additional border radius for a refined look.
- Simplified title translation in AgentSelectorAction for consistency.

These changes enhance the visual appeal and maintainability of the components within the Copilot feature.

Signed-off-by: Innei <tukon479@gmail.com>

*  feat: update ModelSwitchPanel to improve DropdownMenuPositioner prop usage

- Changed the `hoverTrigger` prop in `DropdownMenuPositioner` from a boolean to a destructured assignment for better clarity and consistency in the component's API.

This update enhances the readability and maintainability of the ModelSwitchPanel component.

Signed-off-by: Innei <tukon479@gmail.com>

---------

Signed-off-by: Innei <tukon479@gmail.com>
2026-02-12 20:09:39 +08:00
Arvin Xu 1bfeeea6f4 🔧 chore: always run E2E tests on main and canary branches (#12268)
Skip duplicate check only applies to development branches now.
Main and canary branches will always execute E2E tests on every commit.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:42:56 +08:00
Rdmclin2 12d0ec21d0 fix: setting response error and other bugs (#12265)
* fix: setting response error and other bugs

* chore: remove  popover arrow
2026-02-12 18:20:28 +08:00
Rdmclin2 2bf0a08919 feat: support model detail dropdown (#12275)
* feat: support model detail dropdown

# Conflicts:
#	src/features/ChatInput/ActionBar/Model/index.tsx

* chore: fix test cases

* fix: type error

* fix: e2e tests
2026-02-12 17:51:52 +08:00
Innei 79e146f1a3 🐛 fix: improve RunCommand copy button visibility and ActionBar border radius (#12280)
Closes LOBE-4402
2026-02-12 16:01:44 +08:00
Innei 0e42ca5ca2 🐛 fix: improve GitHub Copilot auth retry logic (#12250)
* 🐛 fix: improve GitHub Copilot auth retry logic

Simplify auth refresh tracking from counter to boolean flag and clear
cached bearer token on 401 to ensure fresh token exchange.

* 🔧 fix: update package.json formatting and import statements in GitHub Copilot provider

Signed-off-by: Innei <tukon479@gmail.com>

* 🐛 fix: refine GitHub Copilot auth refresh logic to check for exchange credential

Update the 401 error handling to refresh the token only if an exchange credential is available, improving the authentication flow.

Signed-off-by: Innei <tukon479@gmail.com>

---------

Signed-off-by: Innei <tukon479@gmail.com>
2026-02-12 13:09:38 +08:00
LobeHub Bot 823aa29c67 Sync main branch to canary branch (#12267)
* 🔧 chore(release): bump version to v2.1.27 [skip ci]

* chore: update sync main to canary workflow

* 🐛 fix: update @lobehub/ui version and refactor dynamic import handling (#12260)

*  feat: add hotfix workflow and script for automated hotfix management

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 fix: refactor PR creation command to use execFileSync for improved reliability

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: update @lobehub/ui version and refactor dynamic import handling

- Bump @lobehub/ui dependency from ^4.35.0 to ^4.36.2 in package.json.
- Refactor settingsContentToStatic.mts to simplify dynamic import processing by removing business feature checks.
- Add initialize.ts to enable immer's map set functionality.
- Correct import path in layout.tsx from 'initiallize' to 'initialize'.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: update @types/react version in package.json

- Bump @types/react dependency from ^19.2.9 to 19.2.14.
- Add @types/react version to overrides section for consistency.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: enhance auto-tag-release workflow for strict semver validation

- Updated regex to match strict semantic versioning format, allowing for optional prerelease and build metadata.
- Added validation step to ensure the version is a valid semver before proceeding with the release process.

Signed-off-by: Innei <tukon479@gmail.com>

* 🗑️ chore: remove defaultSecurityBlacklist test file

- Deleted the test file for DEFAULT_SECURITY_BLACKLIST as it is no longer needed.
- This cleanup helps maintain a more streamlined test suite.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: update localization files for multiple languages

- Improved translations in Arabic, Bulgarian, German, English, and Spanish for chat and tool-related strings.
- Enhanced descriptions for various parameters and added new keys for file handling and security warnings.
- Adjusted phrasing for clarity and consistency across languages.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: update PR comment script to include Actions Artifacts link

- Modified the PR comment generation script to accept an additional artifactsUrl parameter.
- Updated the comment format to include both Release download and Actions Artifacts links for better accessibility.

Signed-off-by: Innei <tukon479@gmail.com>

---------

Signed-off-by: Innei <tukon479@gmail.com>

* 🐛 chore(hotfix): bump version to v2.1.28 [skip ci]

* chore: update secrets token

---------

Signed-off-by: Innei <tukon479@gmail.com>
Co-authored-by: rdmclin2 <rdmclin2@gmail.com>
Co-authored-by: Arvin Xu <arvinx@foxmail.com>
Co-authored-by: Innei <i@innei.in>
2026-02-11 23:51:35 +08:00
rdmclin2 d225da96df chore: update secrets token 2026-02-11 23:45:07 +08:00
lobehubbot 0acaf01f9a 🐛 chore(hotfix): bump version to v2.1.28 [skip ci] 2026-02-11 15:34:52 +00:00
Innei 5a8911b72d 🐛 fix: update @lobehub/ui version and refactor dynamic import handling (#12260)
*  feat: add hotfix workflow and script for automated hotfix management

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 fix: refactor PR creation command to use execFileSync for improved reliability

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: update @lobehub/ui version and refactor dynamic import handling

- Bump @lobehub/ui dependency from ^4.35.0 to ^4.36.2 in package.json.
- Refactor settingsContentToStatic.mts to simplify dynamic import processing by removing business feature checks.
- Add initialize.ts to enable immer's map set functionality.
- Correct import path in layout.tsx from 'initiallize' to 'initialize'.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: update @types/react version in package.json

- Bump @types/react dependency from ^19.2.9 to 19.2.14.
- Add @types/react version to overrides section for consistency.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: enhance auto-tag-release workflow for strict semver validation

- Updated regex to match strict semantic versioning format, allowing for optional prerelease and build metadata.
- Added validation step to ensure the version is a valid semver before proceeding with the release process.

Signed-off-by: Innei <tukon479@gmail.com>

* 🗑️ chore: remove defaultSecurityBlacklist test file

- Deleted the test file for DEFAULT_SECURITY_BLACKLIST as it is no longer needed.
- This cleanup helps maintain a more streamlined test suite.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: update localization files for multiple languages

- Improved translations in Arabic, Bulgarian, German, English, and Spanish for chat and tool-related strings.
- Enhanced descriptions for various parameters and added new keys for file handling and security warnings.
- Adjusted phrasing for clarity and consistency across languages.

Signed-off-by: Innei <tukon479@gmail.com>

* 🔧 chore: update PR comment script to include Actions Artifacts link

- Modified the PR comment generation script to accept an additional artifactsUrl parameter.
- Updated the comment format to include both Release download and Actions Artifacts links for better accessibility.

Signed-off-by: Innei <tukon479@gmail.com>

---------

Signed-off-by: Innei <tukon479@gmail.com>
2026-02-11 23:33:44 +08:00
Arvin Xu e6596e94a5 🔨 chore: update sync main to canary script (#12264)
#### 💻 Change Type

<!-- For change type, change [ ] to [x]. -->

- [ ]  feat
- [ ] 🐛 fix
- [ ] ♻️ refactor
- [ ] 💄 style
- [ ] 👷 build
- [ ] ️ perf
- [ ]  test
- [ ] 📝 docs
- [x] 🔨 chore

#### 🔗 Related Issue

<!-- Link to the issue that is fixed by this PR -->

<!-- Example: Fixes #xxx, Closes #xxx, Related to #xxx -->

#### 🔀 Description of Change

<!-- Thank you for your Pull Request. Please provide a description
above. -->

#### 🧪 How to Test

<!-- Please describe how you tested your changes -->

<!-- For AI features, please include test prompts or scenarios -->

- [ ] Tested locally
- [ ] Added/updated tests
- [ ] No tests needed

#### 📸 Screenshots / Videos

<!-- If this PR includes UI changes, please provide screenshots or
videos -->

| Before | After |
| ------ | ----- |
| ...    | ...   |

#### 📝 Additional Information

<!-- Add any other context about the Pull Request here. -->

<!-- Breaking changes? Migration guide? Performance impact? -->

## Summary by Sourcery

CI:
- Introduce a new sync-main-to-canary GitHub Actions workflow that
creates an automatic PR from main to canary on pushes to main and remove
the previous sync-main-to-dev workflow.
2026-02-11 23:18:27 +08:00
rdmclin2 9c09160154 chore: update sync main to canary workflow 2026-02-11 23:09:00 +08:00
lobehubbot d7d186df1a 🔧 chore(release): bump version to v2.1.27 [skip ci] 2026-02-11 09:33:15 +00:00
959 changed files with 88237 additions and 4934 deletions
File diff suppressed because it is too large Load Diff
+101 -3
View File
@@ -115,6 +115,91 @@ export const agentsKnowledgeBases = pgTable(
);
```
## Query Style
**Always use `db.select()` builder API. Never use `db.query.*` relational API** (`findMany`, `findFirst`, `with:`).
The relational API generates complex lateral joins with `json_build_array` that are fragile and hard to debug.
### Select Single Row
```typescript
// ✅ Good
const [result] = await this.db
.select()
.from(agents)
.where(eq(agents.id, id))
.limit(1);
return result;
// ❌ Bad: relational API
return this.db.query.agents.findFirst({
where: eq(agents.id, id),
});
```
### Select with JOIN
```typescript
// ✅ Good: explicit select + leftJoin
const rows = await this.db
.select({
runId: agentEvalRunTopics.runId,
score: agentEvalRunTopics.score,
testCase: agentEvalTestCases,
topic: topics,
})
.from(agentEvalRunTopics)
.leftJoin(agentEvalTestCases, eq(agentEvalRunTopics.testCaseId, agentEvalTestCases.id))
.leftJoin(topics, eq(agentEvalRunTopics.topicId, topics.id))
.where(eq(agentEvalRunTopics.runId, runId))
.orderBy(asc(agentEvalRunTopics.createdAt));
// ❌ Bad: relational API with `with:`
return this.db.query.agentEvalRunTopics.findMany({
where: eq(agentEvalRunTopics.runId, runId),
with: { testCase: true, topic: true },
});
```
### Select with Aggregation
```typescript
// ✅ Good: select + leftJoin + groupBy
const rows = await this.db
.select({
id: agentEvalDatasets.id,
name: agentEvalDatasets.name,
testCaseCount: count(agentEvalTestCases.id).as('testCaseCount'),
})
.from(agentEvalDatasets)
.leftJoin(agentEvalTestCases, eq(agentEvalDatasets.id, agentEvalTestCases.datasetId))
.groupBy(agentEvalDatasets.id);
```
### One-to-Many (Separate Queries)
When you need a parent record with its children, use two queries instead of relational `with:`:
```typescript
// ✅ Good: two simple queries
const [dataset] = await this.db
.select()
.from(agentEvalDatasets)
.where(eq(agentEvalDatasets.id, id))
.limit(1);
if (!dataset) return undefined;
const testCases = await this.db
.select()
.from(agentEvalTestCases)
.where(eq(agentEvalTestCases.datasetId, id))
.orderBy(asc(agentEvalTestCases.sortOrder));
return { ...dataset, testCases };
```
## Database Migrations
See `references/db-migrations.md` for detailed migration guide.
@@ -129,14 +214,27 @@ bun run db:generate:client
### Migration Best Practices
All migration SQL must be **idempotent** (safe to re-run):
```sql
-- ✅ Idempotent operations
-- ✅ Tables: IF NOT EXISTS
CREATE TABLE IF NOT EXISTS "agent_eval_runs" (...);
-- ✅ Columns: IF NOT EXISTS / IF EXISTS
ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "avatar" text;
DROP TABLE IF EXISTS "old_table";
ALTER TABLE "users" DROP COLUMN IF EXISTS "old_field";
-- ✅ Foreign keys: DROP IF EXISTS + ADD (no IF NOT EXISTS for constraints)
ALTER TABLE "t" DROP CONSTRAINT IF EXISTS "t_fk";
ALTER TABLE "t" ADD CONSTRAINT "t_fk" FOREIGN KEY ("col") REFERENCES "ref"("id") ON DELETE cascade;
-- ✅ Indexes: IF NOT EXISTS
CREATE INDEX IF NOT EXISTS "users_email_idx" ON "users" ("email");
-- ❌ Non-idempotent
-- ❌ Non-idempotent (will fail on re-run)
CREATE TABLE "agent_eval_runs" (...);
ALTER TABLE "users" ADD COLUMN "avatar" text;
ALTER TABLE "t" ADD CONSTRAINT "t_fk" FOREIGN KEY ...;
```
Rename migration files meaningfully: `0046_meaningless.sql``0046_user_add_avatar.sql`
@@ -24,27 +24,57 @@ Rename auto-generated filename to be meaningful:
## Step 3: Use Idempotent Clauses (Defensive Programming)
Always use defensive clauses to make migrations idempotent:
Always use defensive clauses to make migrations idempotent (safe to re-run):
### CREATE TABLE
```sql
-- ✅ Good: Idempotent operations
-- ✅ Good
CREATE TABLE IF NOT EXISTS "agent_eval_runs" (
"id" text PRIMARY KEY NOT NULL,
"name" text,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
-- ❌ Bad
CREATE TABLE "agent_eval_runs" (...);
```
### ALTER TABLE - Columns
```sql
-- ✅ Good
ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "avatar" text;
DROP TABLE IF EXISTS "old_table";
CREATE INDEX IF NOT EXISTS "users_email_idx" ON "users" ("email");
ALTER TABLE "posts" DROP COLUMN IF EXISTS "deprecated_field";
-- ❌ Bad: Non-idempotent operations
-- ❌ Bad
ALTER TABLE "users" ADD COLUMN "avatar" text;
```
### ALTER TABLE - Foreign Key Constraints
PostgreSQL has no `ADD CONSTRAINT IF NOT EXISTS`. Use `DROP IF EXISTS` + `ADD`:
```sql
-- ✅ Good: Drop first, then add (idempotent)
ALTER TABLE "agent_eval_datasets" DROP CONSTRAINT IF EXISTS "agent_eval_datasets_user_id_users_id_fk";
ALTER TABLE "agent_eval_datasets" ADD CONSTRAINT "agent_eval_datasets_user_id_users_id_fk"
FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
-- ❌ Bad: Will fail if constraint already exists
ALTER TABLE "agent_eval_datasets" ADD CONSTRAINT "agent_eval_datasets_user_id_users_id_fk"
FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
```
### DROP TABLE / INDEX
```sql
-- ✅ Good
DROP TABLE IF EXISTS "old_table";
CREATE INDEX IF NOT EXISTS "users_email_idx" ON "users" ("email");
CREATE UNIQUE INDEX IF NOT EXISTS "users_email_unique" ON "users" USING btree ("email");
-- ❌ Bad
DROP TABLE "old_table";
CREATE INDEX "users_email_idx" ON "users" ("email");
```
## Important
After modifying migration SQL (e.g., adding `IF NOT EXISTS` clauses), run:
```bash
bun run db:generate:client
```
This updates the hash in `packages/database/src/core/migrations.json`.
+4
View File
@@ -25,6 +25,10 @@ Brand: **Where Agents Collaborate** - Focus on collaborative agent system, not j
| 资源 | Resource |
| 库 | Library |
| 模型服务商 | Provider |
| 评测 | Evaluation |
| 基准 | Benchmark |
| 数据集 | Dataset |
| 用例 | Test Case |
## Brand Principles
@@ -0,0 +1,624 @@
---
name: store-data-structures
description: Zustand store data structure patterns for LobeHub. Covers List vs Detail data structures, Map + Reducer patterns, type definitions, and when to use each pattern. Use when designing store state, choosing data structures, or implementing list/detail pages.
---
# LobeHub Store Data Structures
This guide covers how to structure data in Zustand stores for optimal performance and user experience.
## Core Principles
### ✅ DO
1. **Separate List and Detail** - Use different structures for list pages and detail pages
2. **Use Map for Details** - Cache multiple detail pages with `Record<string, Detail>`
3. **Use Array for Lists** - Simple arrays for list display
4. **Types from @lobechat/types** - Never use `@lobechat/database` types in stores
5. **Distinguish List and Detail types** - List types may have computed UI fields
### ❌ DON'T
1. **Don't use single detail object** - Can't cache multiple pages
2. **Don't mix List and Detail types** - They have different purposes
3. **Don't use database types** - Use types from `@lobechat/types`
4. **Don't use Map for lists** - Simple arrays are sufficient
---
## Type Definitions
Types should be organized by entity in separate files:
```
@lobechat/types/src/eval/
├── benchmark.ts # Benchmark types
├── agentEvalDataset.ts # Dataset types
├── agentEvalRun.ts # Run types
└── index.ts # Re-exports
```
### Example: Benchmark Types
```typescript
// packages/types/src/eval/benchmark.ts
import type { EvalBenchmarkRubric } from './rubric';
// ============================================
// Detail Type - Full entity (for detail pages)
// ============================================
/**
* Full benchmark entity with all fields including heavy data
*/
export interface AgentEvalBenchmark {
createdAt: Date;
description?: string | null;
id: string;
identifier: string;
isSystem: boolean;
metadata?: Record<string, unknown> | null;
name: string;
referenceUrl?: string | null;
rubrics: EvalBenchmarkRubric[]; // Heavy field
updatedAt: Date;
}
// ============================================
// List Type - Lightweight (for list display)
// ============================================
/**
* Lightweight benchmark item - excludes heavy fields
* May include computed statistics for UI
*/
export interface AgentEvalBenchmarkListItem {
createdAt: Date;
description?: string | null;
id: string;
identifier: string;
isSystem: boolean;
name: string;
// Note: rubrics NOT included (heavy field)
// Computed statistics for UI display
datasetCount?: number;
runCount?: number;
testCaseCount?: number;
}
```
### Example: Document Types (with heavy content)
```typescript
// packages/types/src/document.ts
/**
* Full document entity - includes heavy content fields
*/
export interface Document {
id: string;
title: string;
description?: string;
content: string; // Heavy field - full markdown content
editorData: any; // Heavy field - editor state
metadata?: Record<string, unknown>;
createdAt: Date;
updatedAt: Date;
}
/**
* Lightweight document item - excludes heavy content
*/
export interface DocumentListItem {
id: string;
title: string;
description?: string;
// Note: content and editorData NOT included
createdAt: Date;
updatedAt: Date;
// Computed statistics
wordCount?: number;
lastEditedBy?: string;
}
```
**Key Points:**
- **Detail types** include ALL fields from database (full entity)
- **List types** are **subsets** that exclude heavy/large fields
- List types may add computed statistics for UI (e.g., `testCaseCount`)
- **Each entity gets its own file** (not mixed together)
- **All types** exported from `@lobechat/types`, NOT `@lobechat/database`
**Heavy fields to exclude from List:**
- Large text content (`content`, `editorData`, `fullDescription`)
- Complex objects (`rubrics`, `config`, `metrics`)
- Binary data (`image`, `file`)
- Large arrays (`messages`, `items`)
---
## When to Use Map vs Array
### Use Map + Reducer (for Detail Data)
**Detail page data caching** - Cache multiple detail pages simultaneously
**Optimistic updates** - Update UI before API responds
**Per-item loading states** - Track which items are being updated
**Multiple pages open** - User can navigate between details without refetching
**Structure:**
```typescript
benchmarkDetailMap: Record<string, AgentEvalBenchmark>;
```
**Example:** Benchmark detail pages, Dataset detail pages, User profiles
### Use Simple Array (for List Data)
**List display** - Lists, tables, cards
**Read-only or refresh-as-whole** - Entire list refreshes together
**No per-item updates** - No need to update individual items
**Simple data flow** - Easier to understand and maintain
**Structure:**
```typescript
benchmarkList: AgentEvalBenchmarkListItem[]
```
**Example:** Benchmark list, Dataset list, User list
---
## State Structure Pattern
### Complete Example
```typescript
// packages/types/src/eval/benchmark.ts
import type { EvalBenchmarkRubric } from './rubric';
/**
* Full benchmark entity (for detail pages)
*/
export interface AgentEvalBenchmark {
id: string;
name: string;
description?: string | null;
identifier: string;
rubrics: EvalBenchmarkRubric[]; // Heavy field
metadata?: Record<string, unknown> | null;
isSystem: boolean;
createdAt: Date;
updatedAt: Date;
}
/**
* Lightweight benchmark (for list display)
* Excludes heavy fields like rubrics
*/
export interface AgentEvalBenchmarkListItem {
id: string;
name: string;
description?: string | null;
identifier: string;
isSystem: boolean;
createdAt: Date;
// Note: rubrics excluded
// Computed statistics
testCaseCount?: number;
datasetCount?: number;
runCount?: number;
}
```
```typescript
// src/store/eval/slices/benchmark/initialState.ts
import type { AgentEvalBenchmark, AgentEvalBenchmarkListItem } from '@lobechat/types';
export interface BenchmarkSliceState {
// ============================================
// List Data - Simple Array
// ============================================
/**
* List of benchmarks for list page display
* May include computed fields like testCaseCount
*/
benchmarkList: AgentEvalBenchmarkListItem[];
benchmarkListInit: boolean;
// ============================================
// Detail Data - Map for Caching
// ============================================
/**
* Map of benchmark details keyed by ID
* Caches detail page data for multiple benchmarks
* Enables optimistic updates and per-item loading
*/
benchmarkDetailMap: Record<string, AgentEvalBenchmark>;
/**
* Track which benchmark details are being loaded/updated
* For showing spinners on specific items
*/
loadingBenchmarkDetailIds: string[];
// ============================================
// Mutation States
// ============================================
isCreatingBenchmark: boolean;
isUpdatingBenchmark: boolean;
isDeletingBenchmark: boolean;
}
export const benchmarkInitialState: BenchmarkSliceState = {
benchmarkList: [],
benchmarkListInit: false,
benchmarkDetailMap: {},
loadingBenchmarkDetailIds: [],
isCreatingBenchmark: false,
isUpdatingBenchmark: false,
isDeletingBenchmark: false,
};
```
---
## Reducer Pattern (for Detail Map)
### Why Use Reducer?
- **Immutable updates** - Immer ensures immutability
- **Type-safe actions** - TypeScript discriminated unions
- **Testable** - Pure functions easy to test
- **Reusable** - Same reducer for optimistic updates and server data
### Reducer Structure
```typescript
// src/store/eval/slices/benchmark/reducer.ts
import { produce } from 'immer';
import type { AgentEvalBenchmark } from '@lobechat/types';
// ============================================
// Action Types
// ============================================
type SetBenchmarkDetailAction = {
id: string;
type: 'setBenchmarkDetail';
value: AgentEvalBenchmark;
};
type UpdateBenchmarkDetailAction = {
id: string;
type: 'updateBenchmarkDetail';
value: Partial<AgentEvalBenchmark>;
};
type DeleteBenchmarkDetailAction = {
id: string;
type: 'deleteBenchmarkDetail';
};
export type BenchmarkDetailDispatch =
| SetBenchmarkDetailAction
| UpdateBenchmarkDetailAction
| DeleteBenchmarkDetailAction;
// ============================================
// Reducer Function
// ============================================
export const benchmarkDetailReducer = (
state: Record<string, AgentEvalBenchmark> = {},
payload: BenchmarkDetailDispatch,
): Record<string, AgentEvalBenchmark> => {
switch (payload.type) {
case 'setBenchmarkDetail': {
return produce(state, (draft) => {
draft[payload.id] = payload.value;
});
}
case 'updateBenchmarkDetail': {
return produce(state, (draft) => {
if (draft[payload.id]) {
draft[payload.id] = { ...draft[payload.id], ...payload.value };
}
});
}
case 'deleteBenchmarkDetail': {
return produce(state, (draft) => {
delete draft[payload.id];
});
}
default:
return state;
}
};
```
### Internal Dispatch Methods
```typescript
// In action.ts
export interface BenchmarkAction {
// ... other methods ...
// Internal methods - not for direct UI use
internal_dispatchBenchmarkDetail: (payload: BenchmarkDetailDispatch) => void;
internal_updateBenchmarkDetailLoading: (id: string, loading: boolean) => void;
}
export const createBenchmarkSlice: StateCreator<...> = (set, get) => ({
// ... other methods ...
// Internal - Dispatch to reducer
internal_dispatchBenchmarkDetail: (payload) => {
const currentMap = get().benchmarkDetailMap;
const nextMap = benchmarkDetailReducer(currentMap, payload);
// Only update if changed
if (isEqual(nextMap, currentMap)) return;
set(
{ benchmarkDetailMap: nextMap },
false,
`dispatchBenchmarkDetail/${payload.type}`,
);
},
// Internal - Update loading state
internal_updateBenchmarkDetailLoading: (id, loading) => {
set(
(state) => {
if (loading) {
return { loadingBenchmarkDetailIds: [...state.loadingBenchmarkDetailIds, id] };
}
return {
loadingBenchmarkDetailIds: state.loadingBenchmarkDetailIds.filter((i) => i !== id),
};
},
false,
'updateBenchmarkDetailLoading',
);
},
});
```
---
## Data Structure Comparison
### ❌ WRONG - Single Detail Object
```typescript
interface BenchmarkSliceState {
// ❌ Can only cache one detail
benchmarkDetail: AgentEvalBenchmark | null;
// ❌ Global loading state
isLoadingBenchmarkDetail: boolean;
}
```
**Problems:**
- Can only cache one detail page at a time
- Switching between details causes unnecessary refetches
- No optimistic updates
- No per-item loading states
### ✅ CORRECT - Separate List and Detail
```typescript
import type { AgentEvalBenchmark, AgentEvalBenchmarkListItem } from '@lobechat/types';
interface BenchmarkSliceState {
// ✅ List data - simple array
benchmarkList: AgentEvalBenchmarkListItem[];
benchmarkListInit: boolean;
// ✅ Detail data - map for caching
benchmarkDetailMap: Record<string, AgentEvalBenchmark>;
// ✅ Per-item loading
loadingBenchmarkDetailIds: string[];
// ✅ Mutation states
isCreatingBenchmark: boolean;
isUpdatingBenchmark: boolean;
isDeletingBenchmark: boolean;
}
```
**Benefits:**
- Cache multiple detail pages
- Fast navigation between cached details
- Optimistic updates with reducer
- Per-item loading states
- Clear separation of concerns
---
## Component Usage
### Accessing List Data
```typescript
const BenchmarkList = () => {
// Simple array access
const benchmarks = useEvalStore((s) => s.benchmarkList);
const isInit = useEvalStore((s) => s.benchmarkListInit);
if (!isInit) return <Loading />;
return (
<div>
{benchmarks.map(b => (
<BenchmarkCard
key={b.id}
name={b.name}
testCaseCount={b.testCaseCount} // Computed field
/>
))}
</div>
);
};
```
### Accessing Detail Data
```typescript
const BenchmarkDetail = () => {
const { benchmarkId } = useParams<{ benchmarkId: string }>();
// Get from map
const benchmark = useEvalStore((s) =>
benchmarkId ? s.benchmarkDetailMap[benchmarkId] : undefined,
);
// Check loading
const isLoading = useEvalStore((s) =>
benchmarkId ? s.loadingBenchmarkDetailIds.includes(benchmarkId) : false,
);
if (!benchmark) return <Loading />;
return (
<div>
<h1>{benchmark.name}</h1>
{isLoading && <Spinner />}
</div>
);
};
```
### Using Selectors (Recommended)
```typescript
// src/store/eval/slices/benchmark/selectors.ts
export const benchmarkSelectors = {
getBenchmarkDetail: (id: string) => (s: EvalStore) => s.benchmarkDetailMap[id],
isLoadingBenchmarkDetail: (id: string) => (s: EvalStore) =>
s.loadingBenchmarkDetailIds.includes(id),
};
// In component
const benchmark = useEvalStore(benchmarkSelectors.getBenchmarkDetail(benchmarkId!));
const isLoading = useEvalStore(benchmarkSelectors.isLoadingBenchmarkDetail(benchmarkId!));
```
---
## Decision Tree
```
Need to store data?
├─ Is it a LIST for display?
│ └─ ✅ Use simple array: `xxxList: XxxListItem[]`
│ - May include computed fields
│ - Refreshed as a whole
│ - No optimistic updates needed
└─ Is it DETAIL page data?
└─ ✅ Use Map: `xxxDetailMap: Record<string, Xxx>`
- Cache multiple details
- Support optimistic updates
- Per-item loading states
- Requires reducer for mutations
```
---
## Checklist
When designing store state structure:
- [ ] **Organize types by entity** in separate files (e.g., `benchmark.ts`, `agentEvalDataset.ts`)
- [ ] Create **Detail** type (full entity with all fields including heavy ones)
- [ ] Create **ListItem** type:
- [ ] Subset of Detail type (exclude heavy fields)
- [ ] May include computed statistics for UI
- [ ] **NOT** extending Detail type (it's a subset, not extension)
- [ ] Use **array** for list data: `xxxList: XxxListItem[]`
- [ ] Use **Map** for detail data: `xxxDetailMap: Record<string, Xxx>`
- [ ] Add per-item loading: `loadingXxxDetailIds: string[]`
- [ ] Create **reducer** for detail map if optimistic updates needed
- [ ] Add **internal dispatch** and **loading** methods
- [ ] Create **selectors** for clean access (optional but recommended)
- [ ] Document in comments:
- [ ] What fields are excluded from List and why
- [ ] What computed fields mean
- [ ] What each Map is for
---
## Best Practices
1. **File organization** - One entity per file, not mixed together
2. **List is subset** - ListItem excludes heavy fields, not extends Detail
3. **Clear naming** - `xxxList` for arrays, `xxxDetailMap` for maps
4. **Consistent patterns** - All detail maps follow same structure
5. **Type safety** - Never use `any`, always use proper types
6. **Document exclusions** - Comment which fields are excluded from List and why
7. **Selectors** - Encapsulate access patterns
8. **Loading states** - Per-item for details, global for lists
9. **Immutability** - Use Immer in reducers
### Common Mistakes to Avoid
**DON'T extend Detail in List:**
```typescript
// Wrong - List should not extend Detail
export interface BenchmarkListItem extends Benchmark {
testCaseCount?: number;
}
```
**DO create separate subset:**
```typescript
// Correct - List is a subset with computed fields
export interface BenchmarkListItem {
id: string;
name: string;
// ... only necessary fields
testCaseCount?: number; // Computed
}
```
**DON'T mix entities in one file:**
```typescript
// Wrong - all entities in agentEvalEntities.ts
```
**DO separate by entity:**
```typescript
// Correct - separate files
// benchmark.ts
// agentEvalDataset.ts
// agentEvalRun.ts
```
---
## Related Skills
- `data-fetching` - How to fetch and update this data
- `zustand` - General Zustand patterns
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,369 @@
# Cloud Project Workflow Configuration
This document covers cloud-specific workflow configurations and patterns for the lobehub-cloud project.
## Overview
The lobehub-cloud project extends the open-source lobehub codebase with cloud-specific features. Workflows can be implemented in either:
1. **Lobehub (open-source)** - Available to all users
2. **Lobehub-cloud (proprietary)** - Cloud-specific business logic
---
## Directory Structure
### Lobehub Submodule (Open-source)
```
lobehub/
└── src/
├── app/(backend)/api/workflows/
│ ├── memory-user-memory/ # Memory extraction workflows
│ └── agent-eval-run/ # Benchmark evaluation workflows
└── server/workflows/
├── agentEvalRun/
└── ...
```
### Lobehub-cloud (Proprietary)
```
lobehub-cloud/
└── src/
├── app/(backend)/api/workflows/
│ ├── welcome-placeholder/ # Cloud-only: AI placeholder generation
│ ├── agent-welcome/ # Cloud-only: Agent welcome messages
│ ├── agent-eval-run/ # Re-export from lobehub
│ └── memory-user-memory/ # Re-export from lobehub
└── server/workflows/
├── welcomePlaceholder/
├── agentWelcome/
└── agentEvalRun/ # Re-export from lobehub
```
---
## Cloud-Specific Patterns
### Pattern 1: Cloud-Only Workflows
**Use Case**: Features exclusive to cloud users (AI generation, premium features)
**Example**: `welcome-placeholder`, `agent-welcome`
**Implementation**:
- Implement directly in `lobehub-cloud/src/app/(backend)/api/workflows/`
- No need for re-exports
- Can use cloud-specific packages and services
**Structure**:
```
lobehub-cloud/src/
├── app/(backend)/api/workflows/
│ └── feature-name/
│ ├── process-items/route.ts
│ ├── paginate-items/route.ts
│ └── execute-item/route.ts
└── server/workflows/
└── featureName/
└── index.ts
```
---
### Pattern 2: Re-export from Lobehub
**Use Case**: Workflows implemented in open-source but also used in cloud
**Example**: `agent-eval-run`, `memory-user-memory`
**Why Re-export?**
- Cloud deployment needs to serve these endpoints
- Lobehub submodule code is not directly accessible in cloud routes
- Allows cloud-specific overrides if needed in the future
#### Re-export Implementation
**Step 1**: Implement workflow in lobehub submodule
```typescript
// lobehub/src/app/(backend)/api/workflows/feature/layer/route.ts
import { serve } from '@upstash/workflow/nextjs';
export const { POST } = serve<Payload>(
async (context) => {
// Implementation
},
{ flowControl: { ... } }
);
```
**Step 2**: Create re-export in lobehub-cloud
```typescript
// lobehub-cloud/src/app/(backend)/api/workflows/feature/layer/route.ts
export { POST } from 'lobehub/src/app/(backend)/api/workflows/feature/layer/route';
```
**Important**: Use `lobehub/src/...` path, NOT `@/...` to avoid circular imports.
#### Re-export Directory Structure
```bash
# Create directories
mkdir -p lobehub-cloud/src/app/(backend)/api/workflows/feature-name/layer-1
mkdir -p lobehub-cloud/src/app/(backend)/api/workflows/feature-name/layer-2
mkdir -p lobehub-cloud/src/app/(backend)/api/workflows/feature-name/layer-3
# Create re-export files
echo "export { POST } from 'lobehub/src/app/(backend)/api/workflows/feature-name/layer-1/route';" > \
lobehub-cloud/src/app/(backend)/api/workflows/feature-name/layer-1/route.ts
echo "export { POST } from 'lobehub/src/app/(backend)/api/workflows/feature-name/layer-2/route';" > \
lobehub-cloud/src/app/(backend)/api/workflows/feature-name/layer-2/route.ts
echo "export { POST } from 'lobehub/src/app/(backend)/api/workflows/feature-name/layer-3/route';" > \
lobehub-cloud/src/app/(backend)/api/workflows/feature-name/layer-3/route.ts
```
---
## TypeScript Path Mappings
The cloud project uses tsconfig path mappings to override lobehub code:
```json
// lobehub-cloud/tsconfig.json
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*", "./lobehub/src/*"]
}
}
}
```
**Resolution Order**:
1. `./src/*` (cloud code) - checked first
2. `./lobehub/src/*` (open-source) - fallback
This allows cloud to override specific modules while using lobehub defaults.
---
## Workflow Class Location
### Cloud-Only Workflows
Place workflow class in cloud:
```
lobehub-cloud/src/server/workflows/featureName/index.ts
```
### Shared Workflows
Place workflow class in lobehub, re-export in cloud if needed:
```
lobehub/src/server/workflows/featureName/index.ts
```
---
## Environment Variables
Both lobehub and cloud workflows require:
```bash
# Required for all workflows
APP_URL=https://your-app.com # Base URL for workflow endpoints
QSTASH_TOKEN=qstash_xxx # QStash authentication token
# Optional (for custom QStash URL)
QSTASH_URL=https://custom-qstash.com # Custom QStash endpoint
```
**Cloud-Specific**:
```bash
# Cloud database (for monetization features)
CLOUD_DATABASE_URL=postgresql://...
# Cloud-specific services
REDIS_URL=redis://...
```
---
## Best Practices
### 1. Decide: Cloud or Open-Source?
**Implement in Lobehub if**:
- Feature is useful for all LobeChat users
- No proprietary business logic
- Can be open-sourced
**Implement in Cloud if**:
- Premium/paid feature
- Uses cloud-specific services
- Contains proprietary algorithms
### 2. Re-export Pattern
**Do**:
```typescript
// Simple re-export
export { POST } from 'lobehub/src/app/(backend)/api/workflows/feature/route';
```
**Don't**:
```typescript
// Avoid circular imports with @/ path
export { POST } from '@/app/(backend)/api/workflows/feature/route'; // ❌
```
### 3. Keep Workflow Logic in Lobehub
For shared features:
- Implement core logic in `lobehub/` (open-source)
- Only override if cloud needs different behavior
- Use re-exports for cloud deployment
### 4. Directory Naming
Follow consistent naming across lobehub and cloud:
```
# Both should use same structure
lobehub/src/app/(backend)/api/workflows/feature-name/
lobehub-cloud/src/app/(backend)/api/workflows/feature-name/
```
---
## Migration Guide
### Moving Workflow from Cloud to Lobehub
**Step 1**: Copy workflow to lobehub
```bash
cp -r lobehub-cloud/src/app/(backend)/api/workflows/feature \
lobehub/src/app/(backend)/api/workflows/
```
**Step 2**: Remove cloud-specific dependencies
- Replace cloud services with generic interfaces
- Remove proprietary business logic
- Update imports to use lobehub paths
**Step 3**: Create re-exports in cloud
```typescript
// lobehub-cloud/src/app/(backend)/api/workflows/feature/*/route.ts
export { POST } from 'lobehub/src/app/(backend)/api/workflows/feature/*/route';
```
**Step 4**: Move workflow class to lobehub
```bash
mv lobehub-cloud/src/server/workflows/feature \
lobehub/src/server/workflows/
```
**Step 5**: Update cloud imports
```typescript
// Change from
import { Workflow } from '@/server/workflows/feature';
// To
import { Workflow } from 'lobehub/src/server/workflows/feature';
```
---
## Examples
### Cloud-Only Workflow: welcome-placeholder
**Location**: `lobehub-cloud/src/app/(backend)/api/workflows/welcome-placeholder/`
**Why Cloud-Only**: Uses proprietary AI generation service and Redis caching
**Structure**:
```
lobehub-cloud/
├── src/app/(backend)/api/workflows/welcome-placeholder/
│ ├── process-users/route.ts
│ ├── paginate-users/route.ts
│ └── generate-user/route.ts
└── src/server/workflows/welcomePlaceholder/
└── index.ts
```
### Re-exported Workflow: agent-eval-run
**Location**:
- Implementation: `lobehub/src/app/(backend)/api/workflows/agent-eval-run/`
- Re-export: `lobehub-cloud/src/app/(backend)/api/workflows/agent-eval-run/`
**Why Re-export**: Core feature available in open-source, also used by cloud
**Cloud Re-export Files**:
```typescript
// lobehub-cloud/src/app/(backend)/api/workflows/agent-eval-run/run-benchmark/route.ts
export { POST } from 'lobehub/src/app/(backend)/api/workflows/agent-eval-run/run-benchmark/route';
// lobehub-cloud/src/app/(backend)/api/workflows/agent-eval-run/paginate-test-cases/route.ts
export { POST } from 'lobehub/src/app/(backend)/api/workflows/agent-eval-run/paginate-test-cases/route';
// ... (all layers)
```
---
## Troubleshooting
### Circular Import Error
**Error**: `Circular definition of import alias 'POST'`
**Cause**: Using `@/` path in re-export within cloud codebase
**Solution**: Use `lobehub/src/` path instead
```typescript
// ❌ Wrong
export { POST } from '@/app/(backend)/api/workflows/feature/route';
// ✅ Correct
export { POST } from 'lobehub/src/app/(backend)/api/workflows/feature/route';
```
### Workflow Not Found (404)
**Cause**: Missing re-export in cloud
**Solution**: Create re-export files for all workflow layers
```bash
# Check if re-export exists
ls lobehub-cloud/src/app/\(backend\)/api/workflows/feature-name/
# If missing, create re-exports
mkdir -p lobehub-cloud/src/app/\(backend\)/api/workflows/feature-name/layer
echo "export { POST } from 'lobehub/src/app/(backend)/api/workflows/feature-name/layer/route';" > \
lobehub-cloud/src/app/\(backend\)/api/workflows/feature-name/layer/route.ts
```
### Type Errors After Moving to Lobehub
**Cause**: Cloud-specific types or services used in lobehub code
**Solution**:
1. Extract cloud-specific logic to cloud-only wrapper
2. Use dependency injection for services
3. Define generic interfaces in lobehub
---
## Related Documentation
- [SKILL.md](../SKILL.md) - Standard workflow patterns
+6
View File
@@ -374,6 +374,12 @@ OPENAI_API_KEY=sk-xxxxxxxxx
# Specify the Embedding model and Reranker model(unImplemented)
# DEFAULT_FILES_CONFIG="embedding_model=openai/embedding-text-3-small,reranker_model=cohere/rerank-english-v3.0,query_mode=full_text"
# Embedding batch size for processing (default: 50)
# EMBEDDING_BATCH_SIZE=50
# Embedding concurrency for parallel processing (default: 10)
# EMBEDDING_CONCURRENCY=10
# #######################################
# ######### MCP Service Config ##########
# #######################################
-63
View File
@@ -1,63 +0,0 @@
const config = require('@lobehub/lint').eslint;
config.root = true;
config.extends.push('plugin:@next/next/recommended-legacy');
config.rules['unicorn/no-negated-condition'] = 0;
config.rules['unicorn/prefer-type-error'] = 0;
config.rules['unicorn/prefer-logical-operator-over-ternary'] = 0;
config.rules['unicorn/no-null'] = 0;
config.rules['unicorn/no-typeof-undefined'] = 0;
config.rules['unicorn/explicit-length-check'] = 0;
config.rules['unicorn/prefer-code-point'] = 0;
config.rules['no-extra-boolean-cast'] = 0;
config.rules['unicorn/no-useless-undefined'] = 0;
config.rules['react/no-unknown-property'] = 0;
config.rules['unicorn/prefer-ternary'] = 0;
config.rules['unicorn/prefer-spread'] = 0;
config.rules['unicorn/catch-error-name'] = 0;
config.rules['unicorn/no-array-for-each'] = 0;
config.rules['unicorn/prefer-number-properties'] = 0;
config.rules['unicorn/prefer-query-selector'] = 0;
config.rules['unicorn/no-array-callback-reference'] = 0;
config.rules['unicorn/text-encoding-identifier-case'] = 0;
config.rules['@typescript-eslint/no-use-before-define'] = 0;
// FIXME: Linting error in src/app/[variants]/(main)/chat/features/Migration/DBReader.ts, the fundamental solution should be upgrading typescript-eslint
config.rules['@typescript-eslint/no-useless-constructor'] = 0;
config.rules['@next/next/no-img-element'] = 0;
config.overrides = [
{
extends: ['plugin:mdx/recommended'],
files: ['*.mdx'],
rules: {
'@typescript-eslint/no-unused-vars': 1,
'micromark-extension-mdx-jsx': 0,
'no-undef': 0,
'react/jsx-no-undef': 0,
'react/no-unescaped-entities': 0,
},
settings: {
'mdx/code-blocks': false,
},
},
{
files: ['src/store/image/**/*', 'src/types/generation/**/*'],
rules: {
'@typescript-eslint/no-empty-interface': 0,
'sort-keys-fix/sort-keys-fix': 0,
'typescript-sort-keys/interface': 0,
'typescript-sort-keys/string-enum': 0,
},
},
// CLI scripts legitimately use process.exit() and async IIFE patterns
{
files: ['scripts/**/*'],
rules: {
'unicorn/no-process-exit': 0,
'unicorn/prefer-top-level-await': 0,
},
},
];
module.exports = config;
+8 -13
View File
@@ -2,8 +2,7 @@
* Generate PR comment with download links for desktop builds
* and handle comment creation/update logic
*/
module.exports = async ({ github, context, releaseUrl, version, tag }) => {
// 用于识别构建评论的标识符
const prComment = async ({ github, context, releaseUrl, artifactsUrl, version, tag }) => {
const COMMENT_IDENTIFIER = '<!-- DESKTOP-BUILD-COMMENT -->';
/**
@@ -69,7 +68,7 @@ module.exports = async ({ github, context, releaseUrl, version, tag }) => {
**Version**: \`${version}\`
**Build Time**: \`${new Date().toISOString()}\`
📦 [View All Build Artifacts](${releaseUrl})
📦 [Release Download](${releaseUrl}) · 📥 [Actions Artifacts](${artifactsUrl || `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`})
## Build Artifacts
@@ -88,7 +87,7 @@ ${assetTable}
**Version**: \`${version}\`
**Build Time**: \`${new Date().toISOString()}\`
## 📦 [View All Build Artifacts](${releaseUrl})
📦 [Release Download](${releaseUrl}) · 📥 [Actions Artifacts](${artifactsUrl || `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`})
> Note: This is a temporary build for testing purposes only.
`;
@@ -96,45 +95,41 @@ ${assetTable}
};
/**
* 查找并更新或创建PR评论
* Find and update or create the PR comment
*/
const updateOrCreateComment = async () => {
// 生成评论内容
const body = await generateCommentBody();
// 查找我们之前可能创建的评论
const { data: comments } = await github.rest.issues.listComments({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
});
// 查找包含我们标识符的评论
const buildComment = comments.find((comment) => comment.body.includes(COMMENT_IDENTIFIER));
if (buildComment) {
// 如果找到现有评论,则更新它
await github.rest.issues.updateComment({
comment_id: buildComment.id,
owner: context.repo.owner,
repo: context.repo.repo,
body: body,
});
console.log(`已更新现有评论 ID: ${buildComment.id}`);
console.log(`Updated existing comment ID: ${buildComment.id}`);
return { updated: true, id: buildComment.id };
} else {
// 如果没有找到现有评论,则创建新评论
const result = await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: body,
});
console.log(`已创建新评论 ID: ${result.data.id}`);
console.log(`Created new comment ID: ${result.data.id}`);
return { updated: false, id: result.data.id };
}
};
// 执行评论更新或创建
return await updateOrCreateComment();
};
module.exports = prComment;
+126 -25
View File
@@ -4,7 +4,7 @@ permissions:
contents: write
on:
pull_request:
pull_request_target:
types: [closed]
branches:
- main
@@ -24,28 +24,91 @@ jobs:
# Fetch full history for proper tagging
fetch-depth: 0
- name: Check and extract version from PR title
id: extract-version
- name: Detect release PR (version from title)
id: release
run: |
PR_TITLE="${{ github.event.pull_request.title }}"
echo "PR Title: $PR_TITLE"
# Match "🚀 release: v{x.x.x}" format
if [[ "$PR_TITLE" =~ ^🚀[[:space:]]+release:[[:space:]]*v([0-9]+\.[0-9]+\.[0-9]+.*)$ ]]; then
# Match "🚀 release: v{x.x.x}" format (strict semver: x.y.z with optional -prerelease or +build)
if [[ "$PR_TITLE" =~ ^🚀[[:space:]]+release:[[:space:]]*v([0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?)$ ]]; then
VERSION="${BASH_REMATCH[1]}"
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "should_tag=true" >> $GITHUB_OUTPUT
echo "✅ Detected release PR, version: v$VERSION"
else
echo "should_tag=false" >> $GITHUB_OUTPUT
echo "⏭️ Not a release PR, skipping tag creation"
echo "⏭️ Not a release PR"
fi
- name: Detect patch PR (branch first, title fallback)
id: patch
if: steps.release.outputs.should_tag != 'true'
run: |
HEAD_REF="${{ github.event.pull_request.head.ref }}"
PR_TITLE="${{ github.event.pull_request.title }}"
echo "Head ref: $HEAD_REF"
echo "PR Title: $PR_TITLE"
# Priority 1: hotfix/* or release/* branch always triggers, ignore PR title gate.
if [[ "$HEAD_REF" == hotfix/* ]] || [[ "$HEAD_REF" == release/* ]]; then
echo "should_tag=true" >> $GITHUB_OUTPUT
echo "✅ Detected auto-release PR from $HEAD_REF branch (title gate bypassed)"
exit 0
fi
# Priority 2: fallback to PR title prefix gate (legacy behavior).
if echo "$PR_TITLE" | grep -qiE '^(💄[[:space:]]*)?style(\(.+\))?:|^(✨[[:space:]]*)?feat(\(.+\))?:|^(🐛[[:space:]]*)?fix(\(.+\))?:|^(♻️[[:space:]]*)?refactor(\(.+\))?:|^((🐛|🩹)[[:space:]]*)?hotfix(\(.+\))?:|^(👷[[:space:]]*)?build(\(.+\))?:'; then
echo "should_tag=true" >> $GITHUB_OUTPUT
echo "✅ Detected patch PR from title prefix gate"
else
echo "should_tag=false" >> $GITHUB_OUTPUT
echo "⏭️ Not a patch PR (neither hotfix/release branch nor style/feat/fix/refactor/hotfix/build title prefix)"
fi
- name: Prepare main branch
if: steps.release.outputs.should_tag == 'true' || steps.patch.outputs.should_tag == 'true'
run: |
git checkout main
git pull --rebase origin main
- name: Resolve patch version (patch bump)
id: patch-version
if: steps.patch.outputs.should_tag == 'true'
run: |
CURRENT_VERSION="$(node -p "require('./package.json').version")"
echo "Current version: ${CURRENT_VERSION}"
# Coerce to stable base (e.g. 2.0.0-beta.1 -> 2.0.0), then bump patch (-> 2.0.1)
BASE_VERSION="$(npx -y semver@7 "${CURRENT_VERSION}" -c)"
if [ -z "${BASE_VERSION}" ]; then
echo "❌ Invalid version in package.json: ${CURRENT_VERSION}"
exit 1
fi
NEXT_VERSION="$(npx -y semver@7 -i patch "${BASE_VERSION}")"
echo "📦 Patch version: ${NEXT_VERSION}"
echo "version=${NEXT_VERSION}" >> "$GITHUB_OUTPUT"
- name: Set context (release)
if: steps.release.outputs.should_tag == 'true'
run: |
echo "SHOULD_TAG=true" >> $GITHUB_ENV
echo "KIND=release" >> $GITHUB_ENV
echo "VERSION=${{ steps.release.outputs.version }}" >> $GITHUB_ENV
- name: Set context (patch)
if: steps.patch.outputs.should_tag == 'true'
run: |
echo "SHOULD_TAG=true" >> $GITHUB_ENV
echo "KIND=patch" >> $GITHUB_ENV
echo "VERSION=${{ steps.patch-version.outputs.version }}" >> $GITHUB_ENV
- name: Check if tag already exists
if: steps.extract-version.outputs.should_tag == 'true'
if: env.SHOULD_TAG == 'true'
id: check-tag
run: |
VERSION="${{ steps.extract-version.outputs.version }}"
VERSION="${{ env.VERSION }}"
if git rev-parse "v$VERSION" >/dev/null 2>&1; then
echo "exists=true" >> $GITHUB_OUTPUT
echo "⚠️ Tag v$VERSION already exists"
@@ -54,21 +117,59 @@ jobs:
echo "✅ Tag v$VERSION does not exist, can create"
fi
- name: Create Tag
if: steps.extract-version.outputs.should_tag == 'true' && steps.check-tag.outputs.exists == 'false'
- name: Bump package.json version (before tagging)
if: env.SHOULD_TAG == 'true' && steps.check-tag.outputs.exists == 'false'
id: bump-version
run: |
VERSION="${{ steps.extract-version.outputs.version }}"
echo "🏷️ Creating tag: v$VERSION"
VERSION="${{ env.VERSION }}"
KIND="${{ env.KIND }}"
echo "📝 Bumping package.json version to: $VERSION"
# Validate VERSION is strict semver before writing
if ! npx -y semver@7 "$VERSION" >/dev/null 2>&1; then
echo "❌ Invalid semver version: $VERSION"
exit 1
fi
# Configure git
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "lobehubbot"
git config --global user.email "i@lobehub.com"
# Get PR merge commit SHA
MERGE_SHA="${{ github.event.pull_request.merge_commit_sha }}"
# Update package.json using Node.js
node -e "
const fs = require('fs');
const pkg = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
const target = '$VERSION';
if (pkg.version === target) {
console.log('✅ package.json already at version', target);
process.exit(0);
}
pkg.version = target;
fs.writeFileSync('./package.json', JSON.stringify(pkg, null, 2) + '\n');
console.log('✅ package.json updated to', target);
"
# Commit changes (if any) and push
git add package.json
COMMIT_MSG="🔖 chore(release): release version v$VERSION [skip ci]"
git commit -m "$COMMIT_MSG" || echo "Nothing to commit"
git push origin HEAD:main
# Output the SHA we will tag
echo "tag_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Create Tag
if: env.SHOULD_TAG == 'true' && steps.check-tag.outputs.exists == 'false'
run: |
VERSION="${{ env.VERSION }}"
KIND="${{ env.KIND }}"
echo "🏷️ Creating tag: v$VERSION"
# Tag the bumped version commit SHA (not the PR merge commit SHA)
TAG_SHA="${{ steps.bump-version.outputs.tag_sha }}"
# Create annotated tag with single line message
git tag -a "v$VERSION" "$MERGE_SHA" -m "🚀 release: v$VERSION | PR #${{ github.event.pull_request.number }} | Author: ${{ github.event.pull_request.user.login }}"
git tag -a "v$VERSION" "$TAG_SHA" -m "🚀 release: v$VERSION | PR #${{ github.event.pull_request.number }} | Author: ${{ github.event.pull_request.user.login }}"
# Push tag
git push origin "v$VERSION"
@@ -76,13 +177,13 @@ jobs:
echo "✅ Tag v$VERSION created successfully!"
- name: Create GitHub Release
if: steps.extract-version.outputs.should_tag == 'true' && steps.check-tag.outputs.exists == 'false'
if: env.SHOULD_TAG == 'true' && steps.check-tag.outputs.exists == 'false'
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ steps.extract-version.outputs.version }}
name: 🚀 Release v${{ steps.extract-version.outputs.version }}
tag_name: v${{ env.VERSION }}
name: 🚀 Release v${{ env.VERSION }}
body: |
## 📦 Release v${{ steps.extract-version.outputs.version }}
## 📦 Release v${{ env.VERSION }}
This release was automatically published from PR #${{ github.event.pull_request.number }}.
@@ -97,12 +198,12 @@ jobs:
- name: Output result
run: |
if [ "${{ steps.extract-version.outputs.should_tag }}" == "true" ]; then
if [ "${{ env.SHOULD_TAG }}" == "true" ]; then
if [ "${{ steps.check-tag.outputs.exists }}" == "true" ]; then
echo "⚠️ Result: Tag v${{ steps.extract-version.outputs.version }} already exists, skipping creation"
echo "⚠️ Result: Tag v${{ env.VERSION }} already exists, skipping creation"
else
echo "✅ Result: Tag v${{ steps.extract-version.outputs.version }} created successfully!"
echo "✅ Result: Tag v${{ env.VERSION }} created successfully!"
fi
else
echo "️ Result: Not a release PR, no tag created"
echo "️ Result: Not a release/patch PR, no tag created"
fi
@@ -21,7 +21,7 @@ env:
DATABASE_DRIVER: node
KEY_VAULTS_SECRET: LA7n9k3JdEcbSgml2sxfw+4TV1AzaaFU5+R176aQz4s=
AUTH_SECRET: e2e-test-secret-key-for-better-auth-32chars!
AUTH_EMAIL_VERIFICATION: "0"
AUTH_EMAIL_VERIFICATION: '0'
S3_ACCESS_KEY_ID: e2e-mock-access-key
S3_SECRET_ACCESS_KEY: e2e-mock-secret-key
S3_BUCKET: e2e-mock-bucket
@@ -43,14 +43,13 @@ jobs:
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
ports:
- 5432:5432
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Setup Bun
uses: oven-sh/setup-bun@v2
@@ -67,7 +66,7 @@ jobs:
- name: Build application
run: bun run build
env:
SKIP_LINT: "1"
SKIP_LINT: '1'
- name: Configure Git
run: |
@@ -85,7 +84,7 @@ jobs:
uses: anthropics/claude-code-action@v1
with:
github_token: ${{ secrets.GH_TOKEN }}
allowed_non_write_users: "*"
allowed_non_write_users: '*'
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
claude_args: |
--allowedTools "Bash,Read,Edit,Write,Glob,Grep"
@@ -28,8 +28,6 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Setup Bun
uses: oven-sh/setup-bun@v2
@@ -21,8 +21,6 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Copy security prompt
run: |
@@ -28,8 +28,6 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Configure Git
run: |
-2
View File
@@ -32,8 +32,6 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Copy security prompt
run: |
-2
View File
@@ -27,8 +27,6 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Copy security prompt
run: |
+4 -1
View File
@@ -39,7 +39,10 @@ jobs:
e2e:
needs: check-duplicate-run
if: needs.check-duplicate-run.outputs.should_skip != 'true'
if: >-
github.ref == 'refs/heads/main' ||
github.ref == 'refs/heads/canary' ||
needs.check-duplicate-run.outputs.should_skip != 'true'
name: Test Web App
runs-on: ubuntu-latest
services:
@@ -51,8 +51,6 @@ jobs:
version: ${{ steps.set_version.outputs.version }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v6
@@ -103,8 +101,6 @@ jobs:
os: [macos-latest, macos-15-intel]
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node & pnpm
uses: ./.github/actions/setup-node-pnpm
@@ -181,8 +177,6 @@ jobs:
runs-on: windows-2025
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup build environment
uses: ./.github/actions/desktop-build-setup
@@ -227,8 +221,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node & pnpm
uses: ./.github/actions/setup-node-pnpm
+4 -10
View File
@@ -26,8 +26,6 @@ jobs:
steps:
- name: Checkout base
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node & Bun
uses: ./.github/actions/setup-node-bun
@@ -56,8 +54,6 @@ jobs:
version: ${{ steps.set_version.outputs.version }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v6
@@ -96,8 +92,6 @@ jobs:
os: [macos-latest, macos-15-intel, windows-2025, ubuntu-latest]
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node & pnpm
uses: ./.github/actions/setup-node-pnpm
@@ -286,8 +280,6 @@ jobs:
artifact_path: ${{ steps.set_path.outputs.path }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
# 下载合并后的构建产物
- name: Download merged artifacts
@@ -340,21 +332,23 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# 在 PR 上添加评论,包含构建信息和下载链接
# Post comment on PR with build info, release download link, and Actions artifacts link
- name: Comment on PR
uses: actions/github-script@v8
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const releaseUrl = "${{ steps.create_release.outputs.url }}";
const artifactsUrl = "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}";
const prCommentGenerator = require('${{ github.workspace }}/.github/scripts/pr-comment.js');
const result = await prCommentGenerator({
github,
context,
releaseUrl,
artifactsUrl,
version: "${{ needs.version.outputs.version }}",
tag: "v${{ needs.version.outputs.version }}"
});
console.log(`评论状态: ${result.updated ? '已更新' : '已创建'}, ID: ${result.id}`);
console.log(`Comment ${result.updated ? 'updated' : 'created'}, ID: ${result.id}`);
-4
View File
@@ -39,8 +39,6 @@ jobs:
- name: Checkout PR branch
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -107,8 +105,6 @@ jobs:
steps:
- name: Checkout PR branch
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Download digests
uses: actions/download-artifact@v7
@@ -61,8 +61,6 @@ jobs:
steps:
- name: Checkout base
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v6
@@ -91,8 +89,6 @@ jobs:
os: [macos-latest, macos-15-intel, windows-2025, ubuntu-latest]
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup build environment
uses: ./.github/actions/desktop-build-setup
@@ -0,0 +1,394 @@
name: Release Desktop Canary
# ============================================
# Canary 自动发版工作流
# ============================================
# 触发条件:
# 1. canary 分支有 push (合入 PR) 且 commit 前缀为 style/feat/fix/refactor/release (支持 gitmoji)
# 2. 手动触发 (workflow_dispatch)
#
# 并发策略:
# 同一 workflow 仅保留最新一次运行,自动取消排队中的旧 build
#
# 版本策略:
# 基于最新 stable tag 的 patch+1, postfix 为递增序号
# 格式: X.Y.(Z+1)-canary.N
# 例: 当前 tag v2.1.28 → v2.1.29-canary.1, 下次 → v2.1.29-canary.2
# ============================================
on:
push:
branches:
- canary
workflow_dispatch:
inputs:
force:
description: 'Force build (skip commit message check)'
required: false
type: boolean
default: false
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
permissions: read-all
env:
NODE_VERSION: '24.11.1'
jobs:
# ============================================
# 检查 commit 前缀并计算版本号
# ============================================
calculate-version:
name: Calculate Canary Version
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
tag: ${{ steps.version.outputs.tag }}
should_build: ${{ steps.check.outputs.should_build }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check commit message prefix
id: check
run: |
# 手动触发 + force 时跳过检查
if [ "${{ inputs.force }}" == "true" ]; then
echo "should_build=true" >> $GITHUB_OUTPUT
echo "🔧 Force build requested, skipping commit check"
exit 0
fi
# 手动触发 (无 force) 也直接构建
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "should_build=true" >> $GITHUB_OUTPUT
echo "🔧 Manual trigger, proceeding with build"
exit 0
fi
# 获取本次 push 的 head commit message
commit_msg=$(git log -1 --pretty=%s HEAD)
echo "📝 Head commit: $commit_msg"
# 检查是否匹配 style/feat/fix/refactor/release 前缀 (支持 gitmoji 前缀)
if echo "$commit_msg" | grep -qiE '^(💄\s*)?style(\(.+\))?:|^(✨\s*)?feat(\(.+\))?:|^(🐛\s*)?fix(\(.+\))?:|^(♻️\s*)?refactor(\(.+\))?:|^(🚀\s*)?release(\(.+\))?:'; then
echo "should_build=true" >> $GITHUB_OUTPUT
echo "✅ Commit matches canary build trigger: $commit_msg"
else
echo "should_build=false" >> $GITHUB_OUTPUT
echo "⏭️ Commit does not match style/feat/fix/refactor/release prefix, skipping: $commit_msg"
fi
- name: Calculate canary version
if: steps.check.outputs.should_build == 'true'
id: version
run: |
# 获取最新的 stable tag (排除 nightly/canary/beta 等)
latest_tag=$(git tag --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1)
if [ -z "$latest_tag" ]; then
echo "❌ No stable tag found"
exit 1
fi
echo "📌 Latest stable tag: $latest_tag"
# 去掉 v 前缀,解析 major.minor.patch → a.b.c 取 c+1
base_version="${latest_tag#v}"
IFS='.' read -r major minor patch <<< "$base_version"
new_patch=$((patch + 1))
base_canary="${major}.${minor}.${new_patch}"
# postfix: 同 base 下已有 canary 标签的最大序号 + 1
max_seq=0
for t in $(git tag -l "v${base_canary}-canary.*" 2>/dev/null || true); do
seq=$(echo "$t" | grep -oE '[0-9]+$' || true)
if [ -n "$seq" ] && [ "$seq" -gt "$max_seq" ] 2>/dev/null; then
max_seq=$seq
fi
done
next_seq=$((max_seq + 1))
version="${base_canary}-canary.${next_seq}"
tag="v${version}"
echo "version=${version}" >> $GITHUB_OUTPUT
echo "tag=${tag}" >> $GITHUB_OUTPUT
echo "✅ Canary version: ${version}"
echo "🏷️ Tag: ${tag}"
# ============================================
# 代码质量检查
# ============================================
test:
name: Code quality check
needs: [calculate-version]
if: needs.calculate-version.outputs.should_build == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout base
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
package-manager-cache: false
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Install deps
run: bun i
- name: Lint
run: bun run lint
# ============================================
# 多平台构建
# ============================================
build:
needs: [calculate-version, test]
if: needs.calculate-version.outputs.should_build == 'true'
name: Build Desktop App
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-15, macos-15-intel, windows-2025, ubuntu-latest]
steps:
- uses: actions/checkout@v6
- name: Setup build environment
uses: ./.github/actions/desktop-build-setup
with:
node-version: ${{ env.NODE_VERSION }}
- name: Set package version
run: npm run workflow:set-desktop-version ${{ needs.calculate-version.outputs.version }} canary
# macOS 构建前清理 (修复 hdiutil 问题)
- name: Clean previous build artifacts (macOS)
if: runner.os == 'macOS'
run: |
sudo rm -rf apps/desktop/release || true
sudo rm -rf apps/desktop/dist || true
sudo rm -rf /tmp/electron-builder* || true
# macOS 构建
- name: Build artifact on macOS
if: runner.os == 'macOS'
run: npm run desktop:package:app
env:
UPDATE_CHANNEL: canary
APP_URL: http://localhost:3015
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
CSC_LINK: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
CSC_FOR_PULL_REQUEST: true
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ secrets.UMAMI_BETA_DESKTOP_PROJECT_ID }}
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ secrets.UMAMI_BETA_DESKTOP_BASE_URL }}
# Windows 构建
- name: Build artifact on Windows
if: runner.os == 'Windows'
run: npm run desktop:package:app
env:
UPDATE_CHANNEL: canary
APP_URL: http://localhost:3015
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ secrets.UMAMI_BETA_DESKTOP_PROJECT_ID }}
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ secrets.UMAMI_BETA_DESKTOP_BASE_URL }}
TEMP: C:\temp
TMP: C:\temp
# Linux 构建
- name: Build artifact on Linux
if: runner.os == 'Linux'
run: npm run desktop:package:app
env:
UPDATE_CHANNEL: canary
APP_URL: http://localhost:3015
DATABASE_URL: 'postgresql://postgres@localhost:5432/postgres'
KEY_VAULTS_SECRET: 'oLXWIiR/AKF+rWaqy9lHkrYgzpATbW3CtJp3UfkVgpE='
NEXT_PUBLIC_DESKTOP_PROJECT_ID: ${{ secrets.UMAMI_BETA_DESKTOP_PROJECT_ID }}
NEXT_PUBLIC_DESKTOP_UMAMI_BASE_URL: ${{ secrets.UMAMI_BETA_DESKTOP_BASE_URL }}
- name: Upload artifacts
uses: ./.github/actions/desktop-upload-artifacts
with:
artifact-name: release-${{ matrix.os }}
retention-days: 3
# ============================================
# 合并 macOS 多架构 latest-mac.yml 文件
# ============================================
merge-mac-files:
needs: [build]
name: Merge macOS Release Files
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
package-manager-cache: false
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Download artifacts
uses: actions/download-artifact@v7
with:
path: release
pattern: release-*
merge-multiple: true
- name: List downloaded artifacts
run: ls -R release
- name: Install yaml only for merge step
run: |
cd scripts/electronWorkflow
if [ ! -f package.json ]; then
echo '{"name":"merge-mac-release","private":true}' > package.json
fi
bun add --no-save yaml@2.8.1
- name: Merge latest-mac.yml files
run: bun run scripts/electronWorkflow/mergeMacReleaseFiles.js
- name: Upload artifacts with merged macOS files
uses: actions/upload-artifact@v6
with:
name: merged-release
path: release/
retention-days: 1
# ============================================
# 创建 Canary Release
# ============================================
publish-release:
needs: [merge-mac-files, calculate-version]
name: Publish Canary Release
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download merged artifacts
uses: actions/download-artifact@v7
with:
name: merged-release
path: release
- name: List final artifacts
run: ls -R release
- name: Create Canary Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ needs.calculate-version.outputs.tag }}
name: 'Desktop Canary ${{ needs.calculate-version.outputs.tag }}'
prerelease: true
body: |
## 🐤 Canary Build — ${{ needs.calculate-version.outputs.tag }}
> Automated canary build from `canary` branch.
### ⚠️ Important Notes
- **This is an automated canary build and is NOT intended for production use.**
- Canary builds are triggered by `build`/`fix`/`style` commits on the `canary` branch.
- May contain **unstable or incomplete changes**. **Use at your own risk.**
- It is strongly recommended to **back up your data** before using a canary build.
### 📦 Installation
Download the appropriate installer for your platform from the assets below.
| Platform | File |
|----------|------|
| macOS (Apple Silicon) | `.dmg` (arm64) |
| macOS (Intel) | `.dmg` (x64) |
| Windows | `.exe` |
| Linux | `.AppImage` / `.deb` |
files: |
release/latest*
release/*.dmg*
release/*.zip*
release/*.exe*
release/*.AppImage
release/*.deb*
release/*.snap*
release/*.rpm*
release/*.tar.gz*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# ============================================
# 清理旧的 Canary Releases (保留最近 7 个)
# ============================================
cleanup-old-canaries:
needs: [publish-release]
name: Cleanup Old Canary Releases
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Delete old canary releases
uses: actions/github-script@v7
with:
script: |
const { data: releases } = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 100,
});
const canaryReleases = releases
.filter(r => r.tag_name.includes('-canary.'))
.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
const toDelete = canaryReleases.slice(7);
for (const release of toDelete) {
console.log(`🗑️ Deleting old canary release: ${release.tag_name}`);
// Delete the release
await github.rest.repos.deleteRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.id,
});
// Delete the tag
try {
await github.rest.git.deleteRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `tags/${release.tag_name}`,
});
} catch (e) {
console.log(`⚠️ Could not delete tag ${release.tag_name}: ${e.message}`);
}
}
console.log(`✅ Cleanup complete. Kept ${Math.min(canaryReleases.length, 7)} canary releases, deleted ${toDelete.length}.`);
@@ -48,7 +48,6 @@ jobs:
- uses: actions/checkout@v6
with:
fetch-depth: 0
fetch-tags: true
- name: Check for code changes since last nightly
id: changes
@@ -128,8 +127,6 @@ jobs:
steps:
- name: Checkout base
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v6
@@ -162,8 +159,6 @@ jobs:
os: [macos-15, macos-15-intel, windows-2025, ubuntu-latest]
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup build environment
uses: ./.github/actions/desktop-build-setup
+3 -3
View File
@@ -84,6 +84,8 @@ jobs:
steps:
- name: Check release info
id: check
env:
RELEASE_BODY: ${{ github.event.release.body || '' }}
run: |
# 判断触发方式
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
@@ -100,7 +102,7 @@ jobs:
version="${version#v}"
echo "is_manual=false" >> $GITHUB_OUTPUT
echo "version=${version}" >> $GITHUB_OUTPUT
release_body="${{ github.event.release.body }}"
release_body="${RELEASE_BODY:-}"
{
echo "release_notes<<EOF"
printf '%s\n' "$release_body"
@@ -174,8 +176,6 @@ jobs:
matrix: ${{ fromJson(needs.configure-build.outputs.matrix) }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup build environment
uses: ./.github/actions/desktop-build-setup
+1 -5
View File
@@ -3,7 +3,7 @@ permissions:
contents: read
on:
workflow_dispatch:
workflow_dispatch: {}
release:
types: [published]
@@ -33,8 +33,6 @@ jobs:
- name: Checkout base
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -93,8 +91,6 @@ jobs:
steps:
- name: Checkout base
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Download digests
uses: actions/download-artifact@v7
+9 -15
View File
@@ -73,28 +73,22 @@ jobs:
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "📦 Release version: v$VERSION"
- name: Update package.json version
- name: Verify package.json version matches tag
run: |
VERSION="${{ steps.get-version.outputs.version }}"
echo "📝 Updating package.json version to: $VERSION"
# Update package.json using Node.js
echo "🔎 Checking package.json version equals tag: $VERSION"
node -e "
const fs = require('fs');
const pkg = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
pkg.version = '$VERSION';
fs.writeFileSync('./package.json', JSON.stringify(pkg, null, 2) + '\\n');
console.log('✅ package.json updated');
const expected = '$VERSION';
const actual = pkg.version;
if (actual !== expected) {
console.error('❌ Version mismatch: package.json=' + actual + ' tag=' + expected);
process.exit(1);
}
console.log('✅ Version OK:', actual);
"
# Commit changes
git config --global user.name "lobehubbot"
git config --global user.email "i@lobehub.com"
git add package.json
git commit -m "🔧 chore(release): bump version to v$VERSION [skip ci]" || echo "Nothing to commit"
git push origin HEAD:main
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Release
run: bun run release
env:
+128
View File
@@ -0,0 +1,128 @@
name: 🔄 Branch Synchronization
on:
push:
branches:
- main
permissions:
contents: write
pull-requests: write
concurrency:
group: sync-main-to-canary
cancel-in-progress: true
jobs:
sync-branches:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
token: ${{ secrets.GH_TOKEN }}
- name: Set up Git
run: |
git config --global user.name 'lobehubbot'
git config --global user.email 'i@lobehub.com'
- name: Sync main to canary
if: github.ref == 'refs/heads/main'
run: |
# Find existing open sync PR by head branch prefix
EXISTING_PR=$(gh pr list --base canary --state open --json number,headRefName \
--jq '[.[] | select(.headRefName | startswith("sync/main-to-canary-"))][0] // empty')
EXISTING_PR_NUMBER=$(echo "$EXISTING_PR" | jq -r '.number // empty' 2>/dev/null)
# Refresh remote refs to avoid stale comparisons
git fetch origin canary main
# Check if there are actual changes to sync
if [ "$(git rev-parse origin/main)" = "$(git rev-parse origin/canary)" ]; then
echo "No changes to sync"
exit 0
fi
close_stale_pr() {
if [ -n "$EXISTING_PR_NUMBER" ]; then
gh pr close "$EXISTING_PR_NUMBER" --comment "Superseded by $1." --delete-branch || true
fi
}
# 1) Fast-forward: canary is ancestor of main → just move canary pointer
if git merge-base --is-ancestor origin/canary origin/main; then
echo "canary is ancestor of main, fast-forwarding"
git checkout canary
git reset --hard origin/main
if git push origin canary; then
close_stale_pr "fast-forward push"
exit 0
fi
echo "Fast-forward push failed, falling back to merge"
fi
# 2) Merge: canary has unique commits but no conflicts
git checkout canary
git reset --hard origin/canary
if git merge origin/main --no-edit; then
echo "Merge succeeded, pushing directly"
if git push origin canary; then
close_stale_pr "direct merge push"
exit 0
fi
# Direct push failed (e.g. non-fast-forward race), fall back to PR
echo "Direct push failed, falling back to PR"
SYNC_BRANCH="sync/main-to-canary-$(date +'%Y%m%d')-${GITHUB_RUN_ID}"
git checkout -B "$SYNC_BRANCH"
git push origin "$SYNC_BRANCH" -f
gh pr create \
--base canary \
--head "$SYNC_BRANCH" \
--title "🚀 release: sync main branch to canary" \
--body "Automatic sync from main to canary. Direct push failed, please merge this PR." || true
exit 0
fi
# 3) Conflicts: create or update PR for manual resolution
echo "Merge conflicts detected, creating PR"
git merge --abort
if [ -n "$EXISTING_PR_NUMBER" ]; then
gh pr comment "$EXISTING_PR_NUMBER" --body "New commits on \`main\`. Please pull latest \`origin/main\` into this branch to include them."
echo "Commented on existing PR #$EXISTING_PR_NUMBER"
else
SYNC_BRANCH="sync/main-to-canary-$(date +'%Y%m%d')-${GITHUB_RUN_ID}"
git checkout -B "$SYNC_BRANCH" origin/canary
if ! git merge origin/main --no-edit; then
git add -A
git commit --no-edit -m "chore: merge main into canary (has conflicts to resolve)"
fi
git push origin "$SYNC_BRANCH" -f
printf '%s\n' \
'Automatic sync from main to canary. Merge conflicts detected.' \
'' \
'**Resolution steps:**' \
'```bash' \
'git fetch origin' \
"git checkout $SYNC_BRANCH" \
'git merge origin/main' \
'# Resolve conflicts' \
'git add -A && git commit' \
'git push' \
'```' \
'' \
'> Do NOT merge canary into a main-based branch — always merge main INTO the canary-based branch to keep a clean commit graph.' \
> /tmp/pr-body.md
gh pr create \
--base canary \
--head "$SYNC_BRANCH" \
--title "🚀 release: sync main branch to canary" \
--body-file /tmp/pr-body.md
fi
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
-42
View File
@@ -1,42 +0,0 @@
name: 🔄 Branch Synchronization
on:
push:
branches:
- main
jobs:
sync-branches:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Git
run: |
git config --global user.name 'GitHub Actions'
git config --global user.email 'actions@github.com'
- name: Prepare sync branch
id: branch
run: |
echo "SYNC_BRANCH_MAIN_DEV=sync/main-to-dev-$(date +'%Y%m%d')" >> $GITHUB_ENV
- name: Sync main to dev
if: github.ref == 'refs/heads/main'
run: |
# Sync main to dev
git checkout main
SYNC_BRANCH_DEV=${{ env.SYNC_BRANCH_MAIN_DEV }}
git checkout -B $SYNC_BRANCH_DEV
DIFF=$(git diff origin/dev...)
if [ -z "$DIFF" ]; then
echo "No changes to sync"
exit 0
fi
git push origin $SYNC_BRANCH_DEV -f
gh pr create --base dev --head $SYNC_BRANCH_DEV --title "Sync main branch to dev branch" --body "Automatic sync" || exit 0
env:
GH_TOKEN: ${{ github.token }}
+1 -3
View File
@@ -23,7 +23,7 @@ on:
- 'src/components/mdx/**'
- 'src/features/DevPanel/**'
- 'src/server/translation.ts'
workflow_dispatch:
workflow_dispatch: {}
permissions:
contents: read
@@ -39,8 +39,6 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Setup Node & Bun
uses: ./.github/actions/setup-node-bun
+2 -1
View File
@@ -53,7 +53,8 @@
"typescriptreact"
],
"typescript.tsdk": "node_modules/typescript/lib",
"vitest.maximumConfigs": 20,
"vitest.disableWorkspaceWarning": true,
"vitest.maximumConfigs": 10,
"workbench.editor.customLabels.patterns": {
"**/app/**/[[]*[]]/[[]*[]]/page.tsx": "${dirname(2)}/${dirname(1)}/${dirname} • page component",
"**/app/**/[[]*[]]/page.tsx": "${dirname(1)}/${dirname} • page component",
+24 -14
View File
@@ -1,9 +1,10 @@
import dotenv from 'dotenv';
import fs from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import dotenv from 'dotenv';
import {
copyNativeModules,
copyNativeModulesToSource,
@@ -27,9 +28,11 @@ const updateServerUrl = process.env.UPDATE_SERVER_URL;
console.log(`🚄 Build Version ${packageJSON.version}, Channel: ${channel}`);
console.log(`🏗️ Building for architecture: ${arch}`);
// Channel identity derived solely from UPDATE_CHANNEL env var.
// Adding a new channel won't break stable detection.
const isStable = !channel || channel === 'stable';
const isNightly = channel === 'nightly';
const isBeta = packageJSON.name.includes('beta');
const isStable = !isNightly && !isBeta;
const isBeta = channel === 'beta';
// 根据 channel 配置不同的 publish provider
// - Stable + UPDATE_SERVER_URL: 使用 generic (自定义 HTTP 服务器)
@@ -80,9 +83,10 @@ const protocolScheme = getProtocolScheme();
// Determine icon file based on version type
const getIconFileName = () => {
if (isNightly) return 'Icon-nightly';
if (isStable) return 'Icon';
if (isBeta) return 'Icon-beta';
return 'Icon';
// nightly, canary, and any future pre-release channels share nightly icon
return 'Icon-nightly';
};
/**
@@ -196,6 +200,16 @@ const config = {
dmg: {
artifactName: '${productName}-${version}-${arch}.${ext}',
background: 'resources/dmg.png',
contents: [
{ type: 'file', x: 150, y: 240 },
{ type: 'link', path: '/Applications', x: 450, y: 240 },
],
iconSize: 80,
window: {
height: 400,
width: 600,
},
},
electronDownload: {
@@ -208,6 +222,7 @@ const config = {
// Ensure Next export assets are packaged
'dist/next/**/*',
'!resources/locales',
'!resources/dmg.png',
'!dist/next/docs',
'!dist/next/packages',
'!dist/next/.next/server/app/sitemap',
@@ -249,15 +264,10 @@ const config = {
hardenedRuntime: hasAppleCertificate,
notarize: hasAppleCertificate,
...(hasAppleCertificate ? {} : { identity: null }),
target:
// 降低构建时间,nightly 只打 dmg
// 根据当前机器架构只构建对应架构的包
isNightly
? [{ arch: [arch === 'arm64' ? 'arm64' : 'x64'], target: 'dmg' }]
: [
{ arch: [arch === 'arm64' ? 'arm64' : 'x64'], target: 'dmg' },
{ arch: [arch === 'arm64' ? 'arm64' : 'x64'], target: 'zip' },
],
target: [
{ arch: [arch === 'arm64' ? 'arm64' : 'x64'], target: 'dmg' },
{ arch: [arch === 'arm64' ? 'arm64' : 'x64'], target: 'zip' },
],
},
npmRebuild: true,
nsis: {
+1 -1
View File
@@ -33,7 +33,7 @@ const isDarwin = getTargetPlatform() === 'darwin';
*/
export const nativeModules = [
// macOS-only native modules
...(isDarwin ? ['node-mac-permissions'] : []),
...(isDarwin ? ['node-mac-permissions', 'electron-liquid-glass'] : []),
'@napi-rs/canvas',
// Add more native modules here as needed
];
+3 -2
View File
@@ -41,6 +41,7 @@
},
"dependencies": {
"@napi-rs/canvas": "^0.1.70",
"electron-liquid-glass": "^1.1.1",
"electron-updater": "^6.6.2",
"electron-window-state": "^5.0.3",
"fetch-socks": "^1.3.2",
@@ -77,7 +78,7 @@
"electron-store": "^8.2.0",
"electron-vite": "^4.0.1",
"es-toolkit": "^1.43.0",
"eslint": "^9.18.0",
"eslint": "10.0.0",
"execa": "^9.6.1",
"fast-glob": "^3.3.3",
"fix-path": "^5.0.0",
@@ -111,4 +112,4 @@
"node-mac-permissions"
]
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

+2 -20
View File
@@ -18,7 +18,6 @@ export const appBrowsers = {
path: '/',
showOnInit: true,
titleBarStyle: 'hidden',
vibrancy: 'under-window',
width: 1200,
},
devtools: {
@@ -31,7 +30,6 @@ export const appBrowsers = {
parentIdentifier: 'app',
path: '/desktop/devtools',
titleBarStyle: 'hiddenInset',
vibrancy: 'under-window',
width: 1000,
},
} satisfies Record<string, BrowserWindowOpts>;
@@ -39,7 +37,6 @@ export const appBrowsers = {
// Window templates for multi-instance windows
export interface WindowTemplate {
allowMultipleInstances: boolean;
// Include common BrowserWindow options
autoHideMenuBar?: boolean;
baseIdentifier: string;
basePath: string;
@@ -51,22 +48,8 @@ export interface WindowTemplate {
showOnInit?: boolean;
title?: string;
titleBarStyle?: 'hidden' | 'default' | 'hiddenInset' | 'customButtonsOnHover';
vibrancy?:
| 'appearance-based'
| 'content'
| 'fullscreen-ui'
| 'header'
| 'hud'
| 'menu'
| 'popover'
| 'selection'
| 'sheet'
| 'sidebar'
| 'titlebar'
| 'tooltip'
| 'under-page'
| 'under-window'
| 'window';
// Note: vibrancy / visualEffectState / transparent are intentionally omitted.
// Platform visual effects are managed exclusively by WindowThemeManager.
width?: number;
}
@@ -81,7 +64,6 @@ export const windowTemplates = {
minWidth: 400,
parentIdentifier: 'app',
titleBarStyle: 'hidden',
vibrancy: 'under-window',
width: 900,
},
} satisfies Record<string, WindowTemplate>;
+9
View File
@@ -11,6 +11,15 @@ export const isMac = macOS();
export const isWindows = windows();
export const isLinux = linux();
function getIsMacTahoe(): boolean {
if (!isMac) return false;
// macOS 26 (Tahoe) corresponds to Darwin kernel 25.x
const darwinMajor = parseInt(os.release().split('.')[0], 10);
return darwinMajor >= 25;
}
export const isMacTahoe = getIsMacTahoe();
function getIsWindows11() {
if (!isWindows) return false;
// Get OS version (e.g., "10.0.22621")
@@ -1,33 +1,37 @@
/* eslint-disable unicorn/no-array-push-push */
import {
EditLocalFileParams,
EditLocalFileResult,
GlobFilesParams,
GlobFilesResult,
GrepContentParams,
GrepContentResult,
ListLocalFileParams,
LocalMoveFilesResultItem,
LocalReadFileParams,
LocalReadFileResult,
LocalReadFilesParams,
LocalSearchFilesParams,
MoveLocalFilesParams,
OpenLocalFileParams,
OpenLocalFolderParams,
RenameLocalFileResult,
ShowSaveDialogParams,
ShowSaveDialogResult,
WriteLocalFileParams,
} from '@lobechat/electron-client-ipc';
import { SYSTEM_FILES_TO_IGNORE, loadFile } from '@lobechat/file-loaders';
import { createPatch } from 'diff';
import { dialog, shell } from 'electron';
import { constants } from 'node:fs';
import { access, mkdir, readFile, readdir, rename, stat, writeFile } from 'node:fs/promises';
import { access, mkdir, readdir, readFile, rename, stat, writeFile } from 'node:fs/promises';
import * as path from 'node:path';
import { FileResult, SearchOptions } from '@/modules/fileSearch';
import {
type EditLocalFileParams,
type EditLocalFileResult,
type GlobFilesParams,
type GlobFilesResult,
type GrepContentParams,
type GrepContentResult,
type ListLocalFileParams,
type LocalMoveFilesResultItem,
type LocalReadFileParams,
type LocalReadFileResult,
type LocalReadFilesParams,
type LocalSearchFilesParams,
type MoveLocalFilesParams,
type OpenLocalFileParams,
type OpenLocalFolderParams,
type PickFileParams,
type PickFileResult,
type RenameLocalFileResult,
type ShowOpenDialogParams,
type ShowOpenDialogResult,
type ShowSaveDialogParams,
type ShowSaveDialogResult,
type WriteLocalFileParams,
} from '@lobechat/electron-client-ipc';
import { loadFile, SYSTEM_FILES_TO_IGNORE } from '@lobechat/file-loaders';
import { createPatch } from 'diff';
import { dialog, shell } from 'electron';
import { type FileResult, type SearchOptions } from '@/modules/fileSearch';
import ContentSearchService from '@/services/contentSearchSrv';
import FileSearchService from '@/services/fileSearchSrv';
import { makeSureDirExist } from '@/utils/file-system';
@@ -85,6 +89,67 @@ export default class LocalFileCtr extends ControllerModule {
}
}
@IpcMethod()
async handleShowOpenDialog({
filters,
multiple,
title,
}: ShowOpenDialogParams): Promise<ShowOpenDialogResult> {
logger.debug('Showing open dialog:', { filters, multiple, title });
const result = await dialog.showOpenDialog({
filters,
properties: multiple ? ['openFile', 'multiSelections'] : ['openFile'],
title,
});
logger.debug('Open dialog result:', { canceled: result.canceled, filePaths: result.filePaths });
return {
canceled: result.canceled,
filePaths: result.filePaths,
};
}
@IpcMethod()
async handlePickFile({ filters, title }: PickFileParams): Promise<PickFileResult> {
logger.debug('Picking file:', { filters, title });
const result = await dialog.showOpenDialog({
filters,
properties: ['openFile'],
title,
});
if (result.canceled || result.filePaths.length === 0) {
return { canceled: true };
}
const filePath = result.filePaths[0];
const data = await readFile(filePath);
const name = path.basename(filePath);
const ext = path.extname(filePath).toLowerCase().slice(1);
const MIME_MAP: Record<string, string> = {
avif: 'image/avif',
gif: 'image/gif',
jpeg: 'image/jpeg',
jpg: 'image/jpeg',
png: 'image/png',
svg: 'image/svg+xml',
webp: 'image/webp',
};
return {
canceled: false,
file: {
data: new Uint8Array(data),
mimeType: MIME_MAP[ext] || 'application/octet-stream',
name,
},
};
}
@IpcMethod()
async handleShowSaveDialog({
defaultPath,
+14 -5
View File
@@ -110,7 +110,18 @@ export default class Browser {
// ==================== Window Creation ====================
private createBrowserWindow(): BrowserWindow {
const { title, width, height, ...rest } = this.options;
const {
title,
width,
height,
// Strip platform visual effect props — these are managed exclusively
// by WindowThemeManager.getPlatformConfig() to prevent config leaking
// from appBrowsers/windowTemplates into the BrowserWindow constructor.
vibrancy: _vibrancy,
visualEffectState: _visualEffectState,
transparent: _transparent,
...rest
} = this.options;
const resolvedState = this.stateManager.resolveState({ height, width });
logger.info(`Creating new BrowserWindow instance: ${this.identifier}`);
@@ -125,9 +136,6 @@ export default class Browser {
height: resolvedState.height,
show: false,
title,
vibrancy: 'sidebar',
visualEffectState: 'active',
webPreferences: {
backgroundThrottling: false,
contextIsolation: true,
@@ -138,6 +146,7 @@ export default class Browser {
width: resolvedState.width,
x: resolvedState.x,
y: resolvedState.y,
// Platform visual config is the SOLE source of vibrancy / transparency / titleBarOverlay.
...this.themeManager.getPlatformConfig(),
});
}
@@ -145,7 +154,7 @@ export default class Browser {
private setupWindow(browserWindow: BrowserWindow): void {
logger.debug(`[${this.identifier}] BrowserWindow instance created.`);
// Setup theme management
// Setup theme management (includes liquid glass lifecycle on macOS Tahoe)
this.themeManager.attach(browserWindow);
// Setup network interceptors
@@ -211,10 +211,10 @@ export class BrowserManager {
const identifier = options.identifier;
this.browsers.set(identifier, browser);
// 记录 WebContents identifier 的映射
// Record the mapping between WebContents and identifier
this.webContentsMap.set(browser.browserWindow.webContents, identifier);
// 当窗口关闭时清理映射
// Clean up the mapping when the window is closed
browser.browserWindow.on('close', () => {
if (browser.webContents) this.webContentsMap.delete(browser.webContents);
});
@@ -1,9 +1,12 @@
import { TITLE_BAR_HEIGHT } from '@lobechat/desktop-bridge';
import { BrowserWindow, BrowserWindowConstructorOptions, nativeTheme } from 'electron';
import { join } from 'node:path';
import { TITLE_BAR_HEIGHT } from '@lobechat/desktop-bridge';
import { type BrowserWindow, type BrowserWindowConstructorOptions, nativeTheme } from 'electron';
import { buildDir } from '@/const/dir';
import { isDev, isMac, isWindows } from '@/const/env';
import { isDev, isMac, isMacTahoe, isWindows } from '@/const/env';
import { createLogger } from '@/utils/logger';
import {
BACKGROUND_DARK,
BACKGROUND_LIGHT,
@@ -11,7 +14,6 @@ import {
SYMBOL_COLOR_LIGHT,
THEME_CHANGE_DELAY,
} from '../../const/theme';
import { createLogger } from '@/utils/logger';
const logger = createLogger('core:WindowThemeManager');
@@ -26,6 +28,18 @@ interface WindowsThemeConfig {
titleBarStyle: 'hidden';
}
// Lazy-load liquid glass only on macOS Tahoe to avoid import errors on other platforms.
// Dynamic require is intentional: native .node addons cannot be loaded via
// async import() and must be synchronously required at module init time.
let liquidGlass: typeof import('electron-liquid-glass').default | undefined;
if (isMacTahoe) {
try {
liquidGlass = require('electron-liquid-glass');
} catch {
// Native module not available (e.g. wrong architecture or missing binary)
}
}
/**
* Manages window theme configuration and visual effects
*/
@@ -34,6 +48,7 @@ export class WindowThemeManager {
private browserWindow?: BrowserWindow;
private listenerSetup = false;
private boundHandleThemeChange: () => void;
private liquidGlassViewId?: number;
constructor(identifier: string) {
this.identifier = identifier;
@@ -52,12 +67,21 @@ export class WindowThemeManager {
// ==================== Lifecycle ====================
/**
* Attach to a browser window and setup theme handling
* Attach to a browser window and setup theme handling.
* Owns the full visual effect lifecycle including liquid glass on macOS Tahoe.
*/
attach(browserWindow: BrowserWindow): void {
this.browserWindow = browserWindow;
this.setupThemeListener();
this.applyVisualEffects();
// Liquid glass must be applied after window content loads (native view needs
// a rendered surface). The effect persists across subsequent in-window navigations.
if (this.useLiquidGlass) {
browserWindow.webContents.once('did-finish-load', () => {
this.applyLiquidGlass();
});
}
}
/**
@@ -69,6 +93,7 @@ export class WindowThemeManager {
this.listenerSetup = false;
logger.debug(`[${this.identifier}] Theme listener cleaned up.`);
}
this.liquidGlassViewId = undefined;
this.browserWindow = undefined;
}
@@ -81,6 +106,13 @@ export class WindowThemeManager {
return nativeTheme.shouldUseDarkColors;
}
/**
* Whether liquid glass is available and should be used
*/
get useLiquidGlass(): boolean {
return isMacTahoe && !!liquidGlass;
}
/**
* Get platform-specific theme configuration for window creation
*/
@@ -92,8 +124,19 @@ export class WindowThemeManager {
// Calculate traffic light position to center vertically in title bar
// Traffic light buttons are approximately 12px tall
const trafficLightY = Math.round((TITLE_BAR_HEIGHT - 12) / 2);
if (this.useLiquidGlass) {
// Liquid glass requires transparent window and must NOT use vibrancy — they conflict.
return {
trafficLightPosition: { x: 12, y: trafficLightY },
transparent: true,
};
}
return {
trafficLightPosition: { x: 12, y: trafficLightY },
vibrancy: 'sidebar',
visualEffectState: 'active',
};
}
return {};
@@ -135,58 +178,37 @@ export class WindowThemeManager {
logger.debug(`[${this.identifier}] App theme mode changed, reapplying visual effects.`);
setTimeout(() => {
this.applyVisualEffects();
this.applyWindowsTitleBarOverlay();
}, THEME_CHANGE_DELAY);
}
// ==================== Visual Effects ====================
private resolveWindowsIsDarkModeFromElectron(): boolean {
/**
* Resolve dark mode from Electron theme source for runtime visual effect updates.
* Checks explicit themeSource first to handle app-level theme overrides correctly.
*/
private resolveIsDarkMode(): boolean {
if (nativeTheme.themeSource === 'dark') return true;
if (nativeTheme.themeSource === 'light') return false;
return nativeTheme.shouldUseDarkColors;
}
/**
* Apply Windows title bar overlay based on Electron theme mode.
* Mirror the structure of `applyVisualEffects`, but only updates title bar overlay.
*/
private applyWindowsTitleBarOverlay(): void {
if (!this.browserWindow || this.browserWindow.isDestroyed()) return;
logger.debug(`[${this.identifier}] Applying Windows title bar overlay`);
const isDarkMode = this.resolveWindowsIsDarkModeFromElectron();
try {
if (!isWindows) return;
this.browserWindow.setTitleBarOverlay(this.getWindowsTitleBarOverlay(isDarkMode));
logger.debug(
`[${this.identifier}] Windows title bar overlay applied successfully (dark mode: ${isDarkMode})`,
);
} catch (error) {
logger.error(`[${this.identifier}] Failed to apply Windows title bar overlay:`, error);
}
}
/**
* Apply visual effects based on current theme
* Apply visual effects based on current theme.
* Single entry point for ALL platform visual effects.
*/
applyVisualEffects(): void {
if (!this.browserWindow || this.browserWindow.isDestroyed()) return;
logger.debug(`[${this.identifier}] Applying visual effects for platform`);
const isDarkMode = this.isDarkMode;
const isDarkMode = this.resolveIsDarkMode();
logger.debug(`[${this.identifier}] Applying visual effects (dark: ${isDarkMode})`);
try {
if (isWindows) {
this.applyWindowsVisualEffects(isDarkMode);
} else if (isMac) {
this.applyMacVisualEffects();
}
logger.debug(
`[${this.identifier}] Visual effects applied successfully (dark mode: ${isDarkMode})`,
);
} catch (error) {
logger.error(`[${this.identifier}] Failed to apply visual effects:`, error);
}
@@ -207,4 +229,44 @@ export class WindowThemeManager {
this.browserWindow.setBackgroundColor(config.backgroundColor);
this.browserWindow.setTitleBarOverlay(config.titleBarOverlay);
}
/**
* Apply macOS visual effects.
* - Tahoe+: liquid glass auto-adapts to dark mode; ensure it's applied if not yet.
* - Pre-Tahoe: vibrancy is managed natively by Electron, no runtime action needed.
*/
private applyMacVisualEffects(): void {
if (!this.browserWindow) return;
if (this.useLiquidGlass) {
// Attempt apply if not yet done (e.g. initial load failed, or window recreated)
this.applyLiquidGlass();
}
}
// ==================== Liquid Glass ====================
/**
* Apply liquid glass native view to the window.
* Idempotent — guards against double-application via `liquidGlassViewId`.
*/
applyLiquidGlass(): void {
if (!this.useLiquidGlass || !liquidGlass) return;
if (!this.browserWindow || this.browserWindow.isDestroyed()) return;
if (this.liquidGlassViewId !== undefined) return;
try {
// Ensure traffic light buttons remain visible with transparent window
this.browserWindow.setWindowButtonVisibility(true);
const handle = this.browserWindow.getNativeWindowHandle();
this.liquidGlassViewId = liquidGlass.addView(handle);
liquidGlass.unstable_setVariant(this.liquidGlassViewId, 15);
logger.info(`[${this.identifier}] Liquid glass applied (viewId: ${this.liquidGlassViewId})`);
} catch (error) {
logger.error(`[${this.identifier}] Failed to apply liquid glass:`, error);
}
}
}
@@ -1,7 +1,7 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import type { App as AppCore } from '../../App';
import Browser, { BrowserWindowOpts } from '../Browser';
import { type App as AppCore } from '../../App';
import Browser, { type BrowserWindowOpts } from '../Browser';
// Use vi.hoisted to define mocks before hoisting
const { mockBrowserWindow, mockNativeTheme, mockIpcMain, mockScreen, MockBrowserWindow } =
@@ -100,6 +100,7 @@ vi.mock('@/const/dir', () => ({
vi.mock('@/const/env', () => ({
isDev: false,
isMac: false,
isMacTahoe: false,
isWindows: true,
}));
@@ -605,9 +606,9 @@ describe('Browser', () => {
const keepAliveBrowser = new Browser(keepAliveOptions, mockApp);
// Get the new close handler
const keepAliveCloseHandler = mockBrowserWindow.on.mock.calls
.filter((call) => call[0] === 'close')
.pop()?.[1];
const keepAliveCloseHandler = mockBrowserWindow.on.mock.calls.findLast(
(call) => call[0] === 'close',
)?.[1];
const mockEvent = { preventDefault: vi.fn() };
keepAliveCloseHandler(mockEvent);
@@ -13,6 +13,7 @@ const { mockNativeTheme, mockBrowserWindow } = vi.hoisted(() => ({
off: vi.fn(),
on: vi.fn(),
shouldUseDarkColors: false,
themeSource: 'system' as string,
},
}));
@@ -35,6 +36,8 @@ vi.mock('@/const/dir', () => ({
vi.mock('@/const/env', () => ({
isDev: false,
isMac: false,
isMacTahoe: false,
isWindows: true,
}));
@@ -58,6 +61,7 @@ describe('WindowThemeManager', () => {
vi.useFakeTimers();
mockNativeTheme.shouldUseDarkColors = false;
mockNativeTheme.themeSource = 'system';
mockBrowserWindow.isDestroyed.mockReturnValue(false);
manager = new WindowThemeManager('test-window');
@@ -1,5 +1,5 @@
/**
* 存储应用中需要用装饰器的类
* Stores classes in the application that require decorators
*/
export class IoCContainer {
static shortcuts: WeakMap<any, { methodName: string; name: string }[]> = new WeakMap();
@@ -36,7 +36,7 @@ export class StaticFileServerManager {
}
/**
* 初始化静态文件管理器
* Initialize the static file manager
*/
async initialize(): Promise<void> {
if (this.isInitialized) {
@@ -47,7 +47,7 @@ export class StaticFileServerManager {
logger.info('Initializing StaticFileServerManager');
try {
// 启动 HTTP 文件服务器
// Start the HTTP file server
await this.startHttpServer();
this.isInitialized = true;
@@ -61,17 +61,17 @@ export class StaticFileServerManager {
}
/**
* 启动 HTTP 文件服务器
* Start the HTTP file server
*/
private async startHttpServer(): Promise<void> {
try {
// 使用 get-port-please 获取可用端口
// Use get-port-please to find an available port
this.serverPort = await getPort({
// 备用端口
// Fallback port
host: '127.0.0.1',
port: 33_250,
// 首选端口
// Preferred ports
ports: [33_251, 33_252, 33_253, 33_254, 33_255],
});
@@ -79,7 +79,7 @@ export class StaticFileServerManager {
return new Promise((resolve, reject) => {
const server = createServer(async (req, res) => {
// 设置请求超时
// Set request timeout
req.setTimeout(30_000, () => {
logger.warn('Request timeout, closing connection');
if (!res.destroyed && !res.headersSent) {
@@ -88,7 +88,7 @@ export class StaticFileServerManager {
}
});
// 监听客户端断开连接
// Listen for client disconnection
req.on('close', () => {
logger.debug('Client disconnected during request processing');
});
@@ -98,7 +98,7 @@ export class StaticFileServerManager {
} catch (error) {
logger.error('Unhandled error in HTTP request handler:', error);
// 尝试发送错误响应,但确保不会导致进一步错误
// Attempt to send error response, but ensure it does not cause further errors
try {
if (!res.destroyed && !res.headersSent) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
@@ -110,7 +110,7 @@ export class StaticFileServerManager {
}
});
// 监听指定端口
// Listen on the specified port
server.listen(this.serverPort, '127.0.0.1', () => {
this.httpServer = server;
logger.info(`HTTP file server started on port ${this.serverPort}`);
@@ -129,21 +129,21 @@ export class StaticFileServerManager {
}
/**
* 处理 HTTP 请求
* Handle HTTP requests
*/
private async handleHttpRequest(req: any, res: any): Promise<void> {
try {
// 检查响应是否已经结束
// Check if the response has already ended
if (res.destroyed || res.headersSent) {
logger.warn('Response already ended, skipping request processing');
return;
}
// 获取请求的 Origin 并设置 CORS
// Get the request Origin and set CORS
const origin = req.headers.origin || req.headers.referer;
const allowedOrigin = getAllowedOrigin(origin);
// 处理 CORS 预检请求
// Handle CORS preflight requests
if (req.method === 'OPTIONS') {
res.writeHead(204, {
'Access-Control-Allow-Headers': 'Content-Type',
@@ -160,12 +160,12 @@ export class StaticFileServerManager {
logger.debug(`Request method: ${req.method}`);
logger.debug(`Request headers: ${JSON.stringify(req.headers)}`);
// 提取File path:从 /desktop-file/path/to/file.png 中提取相对路径
let filePath = decodeURIComponent(url.pathname.slice(1)); // 移除开头的 /
// Extract file path: extract the relative path from /desktop-file/path/to/file.png
let filePath = decodeURIComponent(url.pathname.slice(1)); // Remove the leading /
logger.debug(`Initial file path after decode: ${filePath}`);
// 如果路径以 desktop-file/ 开头,则移除该前缀
const prefixWithoutSlash = LOCAL_STORAGE_URL_PREFIX.slice(1) + '/'; // 移除开头的 / 并添加结尾的 /
// If the path starts with desktop-file/, remove that prefix
const prefixWithoutSlash = LOCAL_STORAGE_URL_PREFIX.slice(1) + '/'; // Remove the leading / and add a trailing /
logger.debug(`Prefix to remove: ${prefixWithoutSlash}`);
if (filePath.startsWith(prefixWithoutSlash)) {
@@ -182,7 +182,7 @@ export class StaticFileServerManager {
return;
}
// 使用 FileService 获取文件
// Use FileService to retrieve the file
const desktopPath = `desktop://${filePath}`;
logger.debug(`Attempting to get file: ${desktopPath}`);
const fileResult = await this.fileService.getFile(desktopPath);
@@ -190,13 +190,13 @@ export class StaticFileServerManager {
`File retrieved successfully, mime type: ${fileResult.mimeType}, size: ${fileResult.content.byteLength} bytes`,
);
// 再次检查响应状态
// Check the response status again
if (res.destroyed || res.headersSent) {
logger.warn('Response ended during file processing');
return;
}
// 设置响应头
// Set response headers
res.writeHead(200, {
'Access-Control-Allow-Origin': allowedOrigin,
'Cache-Control': 'public, max-age=31536000',
@@ -204,7 +204,7 @@ export class StaticFileServerManager {
'Content-Type': fileResult.mimeType,
});
// 发送文件内容
// Send file content
res.end(Buffer.from(fileResult.content));
logger.debug(`HTTP file served successfully: desktop://${filePath}`);
@@ -212,14 +212,14 @@ export class StaticFileServerManager {
logger.error(`Error serving HTTP file: ${error}`);
logger.error(`Error stack: ${error.stack}`);
// 检查响应是否仍然可写
// Check if the response is still writable
if (!res.destroyed && !res.headersSent) {
try {
// 获取请求的 Origin 并设置 CORS(错误响应也需要!)
// Get the request Origin and set CORS (error responses also need this!)
const origin = req.headers.origin || req.headers.referer;
const allowedOrigin = getAllowedOrigin(origin);
// 判断是否是文件未找到错误
// Determine whether it is a file not found error
if (error.name === 'FileNotFoundError') {
res.writeHead(404, {
'Access-Control-Allow-Origin': allowedOrigin,
@@ -255,7 +255,7 @@ export class StaticFileServerManager {
}
/**
* 销毁静态文件管理器
* Destroy the static file manager
*/
destroy() {
logger.info('Destroying StaticFileServerManager');
+18 -18
View File
@@ -67,56 +67,56 @@ export class TrayManager {
}
/**
* 通过标识符获取托盘实例
* @param identifier 托盘标识符
* Retrieve a tray instance by identifier
* @param identifier Tray identifier
*/
retrieveByIdentifier(identifier: TrayIdentifiers) {
logger.debug(`通过标识符获取托盘: ${identifier}`);
logger.debug(`Retrieving tray by identifier: ${identifier}`);
return this.trays.get(identifier);
}
/**
* 向所有托盘广播消息
* @param event 事件名称
* @param data 事件数据
* Broadcast a message to all trays
* @param event Event name
* @param data Event data
*/
broadcastToAllTrays = <T extends MainBroadcastEventKey>(
event: T,
data: MainBroadcastParams<T>,
) => {
logger.debug(`向所有托盘广播事件 ${event}`);
logger.debug(`Broadcasting event ${event} to all trays`);
this.trays.forEach((tray) => {
tray.broadcast(event, data);
});
};
/**
* 向指定托盘广播消息
* @param identifier 托盘标识符
* @param event 事件名称
* @param data 事件数据
* Broadcast a message to a specific tray
* @param identifier Tray identifier
* @param event Event name
* @param data Event data
*/
broadcastToTray = <T extends MainBroadcastEventKey>(
identifier: TrayIdentifiers,
event: T,
data: MainBroadcastParams<T>,
) => {
logger.debug(`向托盘 ${identifier} 广播事件 ${event}`);
logger.debug(`Broadcasting event ${event} to tray ${identifier}`);
this.trays.get(identifier)?.broadcast(event, data);
};
/**
* 获取或创建托盘实例
* @param options 托盘选项
* Retrieve or create a tray instance
* @param options Tray options
*/
private retrieveOrInitialize(options: TrayOptions) {
let tray = this.trays.get(options.identifier as TrayIdentifiers);
if (tray) {
logger.debug(`获取现有托盘: ${options.identifier}`);
logger.debug(`Retrieved existing tray: ${options.identifier}`);
return tray;
}
logger.debug(`创建新托盘: ${options.identifier}`);
logger.debug(`Creating new tray: ${options.identifier}`);
tray = new Tray(options, this.app);
this.trays.set(options.identifier as TrayIdentifiers, tray);
@@ -125,10 +125,10 @@ export class TrayManager {
}
/**
* 销毁所有托盘
* Destroy all trays
*/
destroyAll() {
logger.debug('销毁所有托盘');
logger.debug('Destroying all trays');
this.trays.forEach((tray) => {
tray.destroy();
});
+1 -1
View File
@@ -24,7 +24,7 @@ export const createMenuImpl = (app: App): IMenuPlatform => {
}
default: {
// 提供一个备用或抛出错误
// Provide a fallback or throw an error
console.warn(
`Unsupported platform for menu: ${currentPlatform}, using Windows implementation as fallback.`,
);
+4 -4
View File
@@ -158,7 +158,7 @@ export default class FileService extends ServiceModule {
async getFile(path: string): Promise<{ content: ArrayBuffer; mimeType: string }> {
logger.info(`Getting file content: ${path}`);
try {
// 处理desktop://路径
// Handle desktop:// paths
if (!path.startsWith('desktop://')) {
logger.error(`Invalid desktop file path: ${path}`);
throw new Error(`Invalid desktop file path: ${path}`);
@@ -208,7 +208,7 @@ export default class FileService extends ServiceModule {
logger.error(
`Both legacy and fallback paths failed. Legacy error: ${(firstError as Error).message}, Fallback error: ${(fallbackError as Error).message}`,
);
throw firstError; // 抛出原始错误
throw firstError; // Re-throw the original error
}
} else {
throw firstError;
@@ -286,7 +286,7 @@ export default class FileService extends ServiceModule {
async deleteFile(path: string): Promise<{ success: boolean }> {
logger.info(`Deleting file: ${path}`);
try {
// 处理desktop://路径
// Handle desktop:// paths
if (!path.startsWith('desktop://')) {
logger.error(`Invalid desktop file path: ${path}`);
throw new Error(`Invalid desktop file path: ${path}`);
@@ -333,7 +333,7 @@ export default class FileService extends ServiceModule {
logger.error(
`Both legacy and fallback deletion failed. Legacy error: ${(firstError as Error).message}, Fallback error: ${(fallbackError as Error).message}`,
);
throw firstError; // 抛出原始错误
throw firstError; // Re-throw the original error
}
} else {
throw firstError;
+4 -1
View File
@@ -51,7 +51,7 @@ describe('setupElectronApi', () => {
});
});
it('should expose lobeEnv with darwinMajorVersion', () => {
it('should expose lobeEnv with darwinMajorVersion and isMacTahoe', () => {
setupElectronApi();
const call = mockContextBridgeExposeInMainWorld.mock.calls.find((i) => i[0] === 'lobeEnv');
@@ -63,6 +63,9 @@ describe('setupElectronApi', () => {
exposedEnv.darwinMajorVersion === undefined ||
typeof exposedEnv.darwinMajorVersion === 'number',
).toBe(true);
expect(Object.prototype.hasOwnProperty.call(exposedEnv, 'isMacTahoe')).toBe(true);
expect(typeof exposedEnv.isMacTahoe).toBe('boolean');
});
it('should expose both APIs in correct order', () => {
+3 -2
View File
@@ -22,9 +22,10 @@ export const setupElectronApi = () => {
const os = require('node:os');
const osInfo = os.release();
const darwinMajorVersion = osInfo.split('.')[0];
const darwinMajorVersion = Number(osInfo.split('.')[0]);
contextBridge.exposeInMainWorld('lobeEnv', {
darwinMajorVersion: Number(darwinMajorVersion),
darwinMajorVersion,
isMacTahoe: process.platform === 'darwin' && darwinMajorVersion >= 25,
});
};
+147
View File
@@ -11,6 +11,7 @@ table agents {
plugins jsonb
client_id text
user_id text [not null]
agency_config jsonb
chat_config jsonb
few_shots jsonb
model text
@@ -71,6 +72,26 @@ table agents_knowledge_bases {
}
}
table agent_bot_providers {
id uuid [pk, not null, default: `gen_random_uuid()`]
agent_id text [not null]
user_id text [not null]
platform varchar(50) [not null]
application_id varchar(255) [not null]
credentials text
enabled boolean [not null, default: true]
accessed_at "timestamp with time zone" [not null, default: `now()`]
created_at "timestamp with time zone" [not null, default: `now()`]
updated_at "timestamp with time zone" [not null, default: `now()`]
indexes {
(platform, application_id) [name: 'agent_bot_providers_platform_app_id_unique', unique]
platform [name: 'agent_bot_providers_platform_idx']
agent_id [name: 'agent_bot_providers_agent_id_idx']
user_id [name: 'agent_bot_providers_user_id_idx']
}
}
table agent_cron_jobs {
id text [pk, not null]
agent_id text [not null]
@@ -102,6 +123,109 @@ table agent_cron_jobs {
}
}
table agent_eval_benchmarks {
id text [pk, not null]
identifier text [not null]
name text [not null]
description text
rubrics jsonb [not null]
reference_url text
metadata jsonb
user_id text
is_system boolean [not null, default: true]
accessed_at "timestamp with time zone" [not null, default: `now()`]
created_at "timestamp with time zone" [not null, default: `now()`]
updated_at "timestamp with time zone" [not null, default: `now()`]
indexes {
(identifier, user_id) [name: 'agent_eval_benchmarks_identifier_user_id_unique', unique]
is_system [name: 'agent_eval_benchmarks_is_system_idx']
user_id [name: 'agent_eval_benchmarks_user_id_idx']
}
}
table agent_eval_datasets {
id text [pk, not null]
benchmark_id text [not null]
identifier text [not null]
user_id text
name text [not null]
description text
eval_mode text
eval_config jsonb
metadata jsonb
accessed_at "timestamp with time zone" [not null, default: `now()`]
created_at "timestamp with time zone" [not null, default: `now()`]
updated_at "timestamp with time zone" [not null, default: `now()`]
indexes {
(identifier, user_id) [name: 'agent_eval_datasets_identifier_user_id_unique', unique]
benchmark_id [name: 'agent_eval_datasets_benchmark_id_idx']
user_id [name: 'agent_eval_datasets_user_id_idx']
}
}
table agent_eval_run_topics {
user_id text [not null]
run_id text [not null]
topic_id text [not null]
test_case_id text [not null]
status text
score real
passed boolean
eval_result jsonb
created_at "timestamp with time zone" [not null, default: `now()`]
indexes {
(run_id, topic_id) [pk]
user_id [name: 'agent_eval_run_topics_user_id_idx']
run_id [name: 'agent_eval_run_topics_run_id_idx']
test_case_id [name: 'agent_eval_run_topics_test_case_id_idx']
}
}
table agent_eval_runs {
id text [pk, not null]
dataset_id text [not null]
target_agent_id text
user_id text [not null]
name text
status text [not null, default: 'idle']
config jsonb
metrics jsonb
started_at "timestamp with time zone"
accessed_at "timestamp with time zone" [not null, default: `now()`]
created_at "timestamp with time zone" [not null, default: `now()`]
updated_at "timestamp with time zone" [not null, default: `now()`]
indexes {
dataset_id [name: 'agent_eval_runs_dataset_id_idx']
user_id [name: 'agent_eval_runs_user_id_idx']
status [name: 'agent_eval_runs_status_idx']
target_agent_id [name: 'agent_eval_runs_target_agent_id_idx']
}
}
table agent_eval_test_cases {
id text [pk, not null]
user_id text [not null]
dataset_id text [not null]
content jsonb [not null]
eval_mode text
eval_config jsonb
metadata jsonb
sort_order integer
accessed_at "timestamp with time zone" [not null, default: `now()`]
created_at "timestamp with time zone" [not null, default: `now()`]
updated_at "timestamp with time zone" [not null, default: `now()`]
indexes {
user_id [name: 'agent_eval_test_cases_user_id_idx']
dataset_id [name: 'agent_eval_test_cases_dataset_id_idx']
sort_order [name: 'agent_eval_test_cases_sort_order_idx']
}
}
table agent_skills {
id text [pk, not null]
name text [not null]
@@ -201,6 +325,7 @@ table async_tasks {
type text
status text
error jsonb
inference_id text
user_id text [not null]
duration integer
parent_id uuid
@@ -213,6 +338,7 @@ table async_tasks {
user_id [name: 'async_tasks_user_id_idx']
parent_id [name: 'async_tasks_parent_id_idx']
(type, status) [name: 'async_tasks_type_status_idx']
inference_id [name: 'async_tasks_inference_id_idx']
metadata [name: 'async_tasks_metadata_idx']
}
}
@@ -479,6 +605,7 @@ table generation_topics {
user_id text [not null]
title text
cover_url text
type varchar(32) [not null, default: 'image']
accessed_at "timestamp with time zone" [not null, default: `now()`]
created_at "timestamp with time zone" [not null, default: `now()`]
updated_at "timestamp with time zone" [not null, default: `now()`]
@@ -1195,6 +1322,7 @@ table threads {
(client_id, user_id) [name: 'threads_client_id_user_id_unique', unique]
user_id [name: 'threads_user_id_idx']
topic_id [name: 'threads_topic_id_idx']
type [name: 'threads_type_idx']
agent_id [name: 'threads_agent_id_idx']
group_id [name: 'threads_group_id_idx']
parent_thread_id [name: 'threads_parent_thread_id_idx']
@@ -1257,6 +1385,7 @@ table topics {
session_id [name: 'topics_session_id_idx']
group_id [name: 'topics_group_id_idx']
agent_id [name: 'topics_agent_id_idx']
trigger [name: 'topics_trigger_idx']
() [name: 'topics_extract_status_gin_idx']
}
}
@@ -1560,6 +1689,24 @@ ref: auth_sessions.user_id > users.id
ref: two_factor.user_id > users.id
ref: agent_eval_datasets.benchmark_id > agent_eval_benchmarks.id
ref: agent_eval_datasets.user_id - users.id
ref: agent_eval_run_topics.run_id > agent_eval_runs.id
ref: agent_eval_run_topics.topic_id - topics.id
ref: agent_eval_run_topics.test_case_id > agent_eval_test_cases.id
ref: agent_eval_runs.dataset_id > agent_eval_datasets.id
ref: agent_eval_runs.target_agent_id - agents.id
ref: agent_eval_runs.user_id - users.id
ref: agent_eval_test_cases.dataset_id > agent_eval_datasets.id
ref: agents_files.file_id > files.id
ref: agents_files.agent_id > agents.id
@@ -1,9 +1,8 @@
---
title: LobeHub Model Service Providers - Environment Variables and Configuration
description: >-
Learn about the environment variables and configuration settings for various
model service providers like OpenAI, Google AI, AWS Bedrock, Ollama,
Perplexity AI, Anthropic AI, Mistral AI, Groq AI, OpenRouter AI, and 01.AI.
Learn about the environment variables and configuration settings for various model service providers like OpenAI, Google AI, AWS Bedrock, Ollama, Perplexity AI, Anthropic AI, Mistral AI, Groq AI, OpenRouter AI, and 01.AI.
tags:
- Model Service Providers
- Environment Variables
@@ -737,7 +736,10 @@ The above example disables all models first, then enables `fal-ai/flux/schnell`
- Example: `{"X-Auth-Token": "your-token", "X-Custom-Header": "value"}`
<Callout type={'info'}>
ComfyUI supports multiple authentication methods. Please choose the appropriate authentication type and corresponding authentication parameters according to your ComfyUI service configuration. If your ComfyUI service has no authentication set up, you can skip configuring authentication-related environment variables.
ComfyUI supports multiple authentication methods. Please choose the appropriate authentication
type and corresponding authentication parameters according to your ComfyUI service configuration.
If your ComfyUI service has no authentication set up, you can skip configuring
authentication-related environment variables.
</Callout>
## BFL
@@ -824,4 +826,20 @@ NewAPI is a multi-provider model aggregation service that supports automatic mod
- Default: `-`
- Example: `-all,+claude-opus-4-1-20250805,+claude-opus-4-20250514=claude-opus-4`
## Straico
### `STRAICO_API_KEY`
- Type: Required
- Description: This is the API key you applied for in the Straico service.
- Default: -
- Example: `sk-xxxxxx...xxxxxx`
### `STRAICO_MODEL_LIST`
- Type: Optional
- Description: Used to control the Straico model list. Use `+` to add a model, `-` to hide a model, and `model_name=display_name` to customize the display name of a model. Separate multiple entries with commas. The definition syntax follows the same rules as other providers' model lists.
- Default: `-`
- Example: `-all,+straico-model-1,+straico-model-2=straico-special`
[model-list]: /docs/self-hosting/advanced/model-list
@@ -251,7 +251,8 @@ LobeHub 在部署时提供了丰富的模型服务商相关的环境变量,你
- 示例:`{"X-Auth-Token": "your-token", "X-Custom-Header": "value"}`
<Callout type={'info'}>
ComfyUI 支持多种认证方式,请根据您的 ComfyUI 服务配置选择合适的认证类型和相应的认证参数。如果您的 ComfyUI 服务没有设置认证,可以不配置认证相关的环境变量。
ComfyUI 支持多种认证方式,请根据您的 ComfyUI 服务配置选择合适的认证类型和相应的认证参数。如果您的
ComfyUI 服务没有设置认证,可以不配置认证相关的环境变量。
</Callout>
## DeepSeek AI
@@ -827,4 +828,20 @@ LobeHub 在部署时提供了丰富的模型服务商相关的环境变量,你
- 默认值:`-`
- 示例:`-all,+claude-opus-4-1-20250805,+claude-opus-4-20250514=claude-opus-4`
## Straico
### `STRAICO_API_KEY`
- 类型:必选
- 描述:这是你在 Straico 服务中申请的 API 密钥
- 默认值:-
- 示例:`sk-xxxxxx...xxxxxx`
### `STRAICO_MODEL_LIST`
- 类型:可选
- 描述:用来控制 Straico 模型列表,使用 `+` 增加一个模型,使用 `-` 来隐藏一个模型,使用 `模型名=展示名` 来自定义模型的展示名,用英文逗号隔开。模型定义语法规则与其他 provider 保持一致。
- 默认值:`-`
- 示例:`-all,+straico-model-1,+straico-model-2=straico-special`
[model-list]: /zh/docs/self-hosting/advanced/model-list
+21 -59
View File
@@ -10,7 +10,7 @@ import { Given, Then, When } from '@cucumber/cucumber';
import { expect } from '@playwright/test';
import { TEST_USER } from '../../support/seedTestUser';
import { CustomWorld, WAIT_TIMEOUT } from '../../support/world';
import { type CustomWorld, WAIT_TIMEOUT } from '../../support/world';
// ============================================
// Helper Functions
@@ -23,67 +23,29 @@ async function inputNewName(
): Promise<void> {
await this.page.waitForTimeout(300);
// Try to find the popover input
const popoverInputSelectors = [
'.ant-popover-inner input',
'.ant-popover-content input',
'.ant-popover input',
];
// Primary: find input inside EditingPopover (data-testid) or antd Popover
const renameInput = this.page
.locator('[data-testid="editing-popover"] input, .ant-popover input')
.first();
let renameInput = null;
await renameInput.waitFor({ state: 'visible', timeout: 5000 });
await renameInput.click();
await renameInput.clear();
await renameInput.fill(newName);
for (const selector of popoverInputSelectors) {
try {
const locator = this.page.locator(selector).first();
await locator.waitFor({ state: 'visible', timeout: 2000 });
renameInput = locator;
break;
} catch {
// Try next selector
}
}
if (!renameInput) {
// Fallback: find any visible input
const allInputs = this.page.locator('input:visible');
const count = await allInputs.count();
for (let i = 0; i < count; i++) {
const input = allInputs.nth(i);
const placeholder = (await input.getAttribute('placeholder').catch(() => '')) || '';
if (placeholder.includes('Search') || placeholder.includes('搜索')) continue;
const isInPopover = await input.evaluate((el) => {
return el.closest('.ant-popover') !== null || el.closest('[class*="popover"]') !== null;
});
if (isInPopover || count <= 2) {
renameInput = input;
break;
}
}
}
if (renameInput) {
await renameInput.click();
await renameInput.clear();
await renameInput.fill(newName);
if (pressEnter) {
await renameInput.press('Enter');
} else {
await this.page.click('body', { position: { x: 10, y: 10 } });
}
if (pressEnter) {
await renameInput.press('Enter');
} else {
// Keyboard fallback
await this.page.keyboard.press('Meta+A');
await this.page.waitForTimeout(50);
await this.page.keyboard.type(newName, { delay: 20 });
if (pressEnter) {
await this.page.keyboard.press('Enter');
} else {
await this.page.click('body', { position: { x: 10, y: 10 } });
// Click the save button (ActionIcon with Check icon) next to the input
const saveButton = this.page
.locator('[data-testid="editing-popover"] svg.lucide-check, .ant-popover svg.lucide-check')
.first();
try {
await saveButton.waitFor({ state: 'visible', timeout: 2000 });
await saveButton.click();
} catch {
// Fallback: press Enter to save
await renameInput.press('Enter');
}
}
+27 -25
View File
@@ -1,3 +1,4 @@
/* eslint-disable no-console */
/**
* Home Starter Steps
*
@@ -12,7 +13,7 @@ import { Given, Then, When } from '@cucumber/cucumber';
import { expect } from '@playwright/test';
import { llmMockManager, presetResponses } from '../../mocks/llm';
import { CustomWorld, WAIT_TIMEOUT } from '../../support/world';
import { type CustomWorld, WAIT_TIMEOUT } from '../../support/world';
// Store created IDs for verification
let createdAgentId: string | null = null;
@@ -61,7 +62,9 @@ When('用户点击创建 Agent 按钮', async function (this: CustomWorld) {
await expect(createAgentButton).toBeVisible({ timeout: WAIT_TIMEOUT });
await createAgentButton.click();
await this.page.waitForTimeout(500);
// Wait for mode switch animation and ChatInput scroll-into-view to settle
await this.page.waitForTimeout(800);
console.log(' ✅ 已点击创建 Agent 按钮');
});
@@ -76,7 +79,9 @@ When('用户点击创建 Group 按钮', async function (this: CustomWorld) {
await expect(createGroupButton).toBeVisible({ timeout: WAIT_TIMEOUT });
await createGroupButton.click();
await this.page.waitForTimeout(500);
// Wait for mode switch animation and ChatInput scroll-into-view to settle
await this.page.waitForTimeout(800);
console.log(' ✅ 已点击创建 Group 按钮');
});
@@ -89,7 +94,9 @@ When('用户点击写作按钮', async function (this: CustomWorld) {
await expect(writeButton).toBeVisible({ timeout: WAIT_TIMEOUT });
await writeButton.click();
await this.page.waitForTimeout(500);
// Wait for mode switch animation and ChatInput scroll-into-view to settle
await this.page.waitForTimeout(800);
console.log(' ✅ 已点击写作按钮');
});
@@ -97,36 +104,28 @@ When('用户点击写作按钮', async function (this: CustomWorld) {
When('用户在输入框中输入 {string}', async function (this: CustomWorld, message: string) {
console.log(` 📍 Step: 在输入框中输入 "${message}"...`);
// The chat input is a contenteditable editor, need to click first then type
// The chat input is a contenteditable editor, need to click first then type.
// Target the contenteditable element INSIDE the ChatInput container directly,
// since clicking the container might hit the action bar/footer area instead.
const chatInputContainer = this.page.locator('[data-testid="chat-input"]').first();
await expect(chatInputContainer).toBeVisible({ timeout: WAIT_TIMEOUT });
// If data-testid not found, try alternative selectors
let inputFound = false;
if ((await chatInputContainer.count()) > 0) {
await chatInputContainer.click();
inputFound = true;
} else {
// Try to find the editor by its contenteditable attribute
const editor = this.page.locator('[contenteditable="true"]').first();
if ((await editor.count()) > 0) {
await editor.click();
inputFound = true;
}
}
if (!inputFound) {
throw new Error('Could not find chat input');
}
const editor = chatInputContainer.locator('[contenteditable="true"]').first();
await editor.click();
await this.page.waitForTimeout(300);
await this.page.keyboard.type(message, { delay: 30 });
console.log(` ✅ 已输入 "${message}"`);
});
When('用户按 Enter 发送', async function (this: CustomWorld) {
When('用户按 Enter 发送', { timeout: 30_000 }, async function (this: CustomWorld) {
console.log(' 📍 Step: 按 Enter 发送...');
// Wait for editor's debounced onChange (100ms default) to sync inputMessage to store.
// The send() function reads directly from the editor as a fallback, but this wait
// ensures maximum reliability.
await this.page.waitForTimeout(200);
// Listen for navigation to capture the agent/group ID
const navigationPromise = this.page.waitForURL(/\/(agent|group)\/.*\/profile/, {
timeout: 30_000,
@@ -156,9 +155,12 @@ When('用户按 Enter 发送', async function (this: CustomWorld) {
console.log(' ✅ 已发送消息');
});
When('用户按 Enter 发送创建文档', async function (this: CustomWorld) {
When('用户按 Enter 发送创建文档', { timeout: 30_000 }, async function (this: CustomWorld) {
console.log(' 📍 Step: 按 Enter 发送创建文档...');
// Wait for editor's debounced onChange (100ms default) to sync inputMessage to store
await this.page.waitForTimeout(200);
// Listen for navigation to capture the document ID
const navigationPromise = this.page.waitForURL(/\/page\/[^/]+/, {
timeout: 30_000,
+179 -66
View File
@@ -1,21 +1,56 @@
{
"src/app/(backend)/api/dev/memory-user-memory/benchmark-locomo/route.ts": {
"no-console": {
"count": 6
}
},
"src/app/(backend)/api/webhooks/logto/route.ts": {
"no-console": {
"count": 1
}
},
"src/app/(backend)/trpc/async/[trpc]/route.ts": {
"no-console": {
"count": 1
}
},
"src/app/(backend)/trpc/mobile/[trpc]/route.ts": {
"no-console": {
"count": 1
}
},
"src/app/(backend)/webapi/chat/[provider]/route.ts": {
"no-console": {
"count": 1
}
},
"src/app/[variants]/(auth)/market-auth-callback/page.tsx": {
"no-console": {
"count": 2
}
},
"src/app/[variants]/(desktop)/desktop-onboarding/features/WelcomeStep.tsx": {
"@eslint-react/no-nested-component-definitions": {
"count": 1
}
},
"src/app/[variants]/(main)/agent/profile/features/Header/AgentPublishButton/PublishButton.tsx": {
"import-x/consistent-type-specifier-style": {
"src/app/[variants]/(main)/agent/features/Conversation/AgentWelcome/ToolAuthAlert.tsx": {
"no-console": {
"count": 1
}
},
"src/app/[variants]/(main)/community/(detail)/agent/features/Details/Capabilities/PluginItem.tsx": {
"simple-import-sort/imports": {
"src/app/[variants]/(main)/agent/profile/features/Header/AgentForkTag.tsx": {
"no-console": {
"count": 1
}
},
"src/app/[variants]/(main)/community/(detail)/agent/features/Header.tsx": {
"simple-import-sort/imports": {
"src/app/[variants]/(main)/community/(detail)/agent/features/AgentForkTag.tsx": {
"no-console": {
"count": 1
}
},
"src/app/[variants]/(main)/community/(detail)/user/features/UserAgentList.tsx": {
"no-console": {
"count": 1
}
},
@@ -24,19 +59,6 @@
"count": 2
}
},
"src/app/[variants]/(main)/home/_layout/Body/Agent/Modals/ConfigGroupModal/GroupItem.tsx": {
"import-x/consistent-type-specifier-style": {
"count": 1
}
},
"src/app/[variants]/(main)/home/_layout/Body/Agent/Modals/ConfigGroupModal/index.tsx": {
"@typescript-eslint/consistent-type-imports": {
"count": 1
},
"simple-import-sort/imports": {
"count": 1
}
},
"src/app/[variants]/(main)/home/features/RecentPage/Item.tsx": {
"regexp/no-super-linear-backtracking": {
"count": 1
@@ -52,6 +74,11 @@
"count": 1
}
},
"src/app/[variants]/(main)/memory/features/MemoryAnalysis/index.tsx": {
"no-console": {
"count": 1
}
},
"src/app/[variants]/(main)/resource/features/hooks/useResourceManagerUrlSync.ts": {
"react-hooks/exhaustive-deps": {
"count": 1
@@ -65,6 +92,21 @@
"count": 1
}
},
"src/app/[variants]/(main)/settings/skill/features/KlavisSkillItem.tsx": {
"no-console": {
"count": 2
}
},
"src/app/[variants]/(main)/settings/skill/features/LobehubSkillItem.tsx": {
"no-console": {
"count": 1
}
},
"src/app/[variants]/onboarding/components/KlavisServerList/hooks/useKlavisOAuth.ts": {
"no-console": {
"count": 1
}
},
"src/app/[variants]/onboarding/features/ResponseLanguageStep.tsx": {
"@eslint-react/no-nested-component-definitions": {
"count": 1
@@ -88,6 +130,16 @@
"count": 1
}
},
"src/components/DebugNode.tsx": {
"no-console": {
"count": 1
}
},
"src/components/FeedbackModal/index.tsx": {
"no-console": {
"count": 1
}
},
"src/components/Loading/CircleLoading/index.tsx": {
"unicorn/no-anonymous-default-export": {
"count": 1
@@ -114,9 +166,6 @@
}
},
"src/envs/auth.ts": {
"perfectionist/sort-interfaces": {
"count": 19
},
"sort-keys-fix/sort-keys-fix": {
"count": 1
},
@@ -150,6 +199,21 @@
"count": 1
}
},
"src/features/ChatInput/ActionBar/Tools/KlavisServerItem.tsx": {
"no-console": {
"count": 2
}
},
"src/features/ChatInput/ActionBar/Tools/LobehubSkillServerItem.tsx": {
"no-console": {
"count": 3
}
},
"src/features/CommandMenu/SearchResults.tsx": {
"no-console": {
"count": 1
}
},
"src/features/Conversation/Error/OllamaBizError/index.tsx": {
"regexp/no-dupe-characters-character-class": {
"count": 1
@@ -158,13 +222,8 @@
"count": 1
}
},
"src/features/Conversation/Messages/CompressedGroup/index.tsx": {
"import-x/consistent-type-specifier-style": {
"count": 1
}
},
"src/features/Conversation/Messages/Supervisor/components/ContentBlock.tsx": {
"simple-import-sort/imports": {
"src/features/Conversation/store/slices/message/action/sendMessage.ts": {
"no-console": {
"count": 1
}
},
@@ -183,11 +242,6 @@
"count": 1
}
},
"src/features/NavPanel/SideBarHeaderLayout.tsx": {
"@eslint-react/dom/no-flush-sync": {
"count": 1
}
},
"src/features/PluginsUI/Render/utils/iframeOnReady.test.ts": {
"unicorn/no-invalid-remove-event-listener": {
"count": 1
@@ -228,7 +282,20 @@
"count": 1
}
},
"src/hooks/useAgentOwnershipCheck.ts": {
"no-console": {
"count": 6
}
},
"src/hooks/useHotkeys/useHotkeyById.ts": {
"no-console": {
"count": 1
}
},
"src/layout/AuthProvider/MarketAuth/oidc.ts": {
"no-console": {
"count": 17
},
"prefer-const": {
"count": 1
}
@@ -254,6 +321,16 @@
"count": 1
}
},
"src/libs/swr/localStorageProvider.ts": {
"no-console": {
"count": 1
}
},
"src/libs/traces/index.ts": {
"no-console": {
"count": 1
}
},
"src/libs/trpc/middleware/openTelemetry.test.ts": {
"import/first": {
"count": 1
@@ -267,9 +344,14 @@
"count": 1
}
},
"src/server/modules/Mecha/ContextEngineering/index.ts": {
"sort-keys-fix/sort-keys-fix": {
"count": 1
"src/server/manifest.ts": {
"object-shorthand": {
"count": 3
}
},
"src/server/modules/KeyVaultsEncrypt/index.ts": {
"object-shorthand": {
"count": 2
}
},
"src/server/modules/ModelRuntime/apiKeyManager.test.ts": {
@@ -287,6 +369,16 @@
"count": 2
}
},
"src/server/routers/lambda/agent.ts": {
"no-console": {
"count": 1
}
},
"src/server/routers/lambda/aiAgent.ts": {
"no-console": {
"count": 1
}
},
"src/server/routers/lambda/aiChat.ts": {
"prefer-const": {
"count": 1
@@ -302,32 +394,26 @@
"count": 2
}
},
"src/server/routers/lambda/knowledge.ts": {
"no-console": {
"count": 1
}
},
"src/server/routers/lambda/ragEval.ts": {
"sort-keys-fix/sort-keys-fix": {
"count": 1
}
},
"src/server/routers/lambda/sessionGroup.ts": {
"no-console": {
"count": 1
}
},
"src/server/routers/lambda/user.ts": {
"sort-keys-fix/sort-keys-fix": {
"count": 2
}
},
"src/server/routers/lambda/userMemory.ts": {
"@typescript-eslint/consistent-type-imports": {
"count": 1
},
"import-x/no-duplicates": {
"count": 2
},
"simple-import-sort/imports": {
"count": 1
}
},
"src/server/routers/tools/_helpers/scheduleToolCallReport.test.ts": {
"simple-import-sort/imports": {
"count": 1
}
},
"src/server/routers/tools/mcp.ts": {
"sort-keys-fix/sort-keys-fix": {
"count": 1
@@ -431,16 +517,26 @@
"count": 7
}
},
"src/server/services/webhookUser/index.ts": {
"no-console": {
"count": 2
}
},
"src/services/_url.ts": {
"sort-keys-fix/sort-keys-fix": {
"count": 1
}
},
"src/services/chat/mecha/contextEngineering.ts": {
"sort-keys-fix/sort-keys-fix": {
"src/services/models.ts": {
"no-console": {
"count": 1
}
},
"src/services/tableViewer/client.ts": {
"no-console": {
"count": 2
}
},
"src/store/agent/slices/cron/action.ts": {
"no-unused-private-class-members": {
"count": 1
@@ -485,14 +581,6 @@
"count": 1
}
},
"src/store/chat/slices/aiChat/actions/__tests__/StreamingHandler.test.ts": {
"import-x/consistent-type-specifier-style": {
"count": 1
},
"unused-imports/no-unused-imports": {
"count": 1
}
},
"src/store/chat/slices/aiChat/actions/conversationControl.ts": {
"no-unused-private-class-members": {
"count": 1
@@ -538,6 +626,11 @@
"count": 1
}
},
"src/store/chat/slices/message/supervisor.ts": {
"no-console": {
"count": 5
}
},
"src/store/chat/slices/operation/types.ts": {
"sort-keys-fix/sort-keys-fix": {
"count": 1
@@ -680,6 +773,11 @@
"count": 1
}
},
"src/store/file/slices/chat/action.ts": {
"no-console": {
"count": 1
}
},
"src/store/file/slices/chunk/action.ts": {
"no-unused-private-class-members": {
"count": 1
@@ -710,6 +808,11 @@
"count": 1
}
},
"src/store/home/slices/homeInput/action.ts": {
"no-console": {
"count": 1
}
},
"src/store/image/slices/generationConfig/initialState.ts": {
"sort-keys-fix/sort-keys-fix": {
"count": 1
@@ -733,6 +836,11 @@
"count": 1
}
},
"src/store/session/slices/homeInput/action.ts": {
"no-console": {
"count": 1
}
},
"src/store/session/slices/session/action.ts": {
"typescript-sort-keys/interface": {
"count": 1
@@ -746,8 +854,13 @@
"count": 1
}
},
"src/store/tool/slices/builtin/executors/index.ts": {
"import-x/consistent-type-specifier-style": {
"src/store/tool/slices/klavisStore/action.ts": {
"no-console": {
"count": 1
}
},
"src/store/tool/slices/mcpStore/action.ts": {
"no-console": {
"count": 1
}
},
@@ -779,4 +892,4 @@
"count": 1
}
}
}
}
+24
View File
@@ -1,6 +1,10 @@
import { fileURLToPath } from 'node:url';
import { eslint } from '@lobehub/lint';
import { flat as mdxFlat } from 'eslint-plugin-mdx';
const tsconfigRootDir = fileURLToPath(new URL('.', import.meta.url));
export default eslint(
{
ignores: [
@@ -40,6 +44,13 @@ export default eslint(
next: true,
react: 'next',
},
{
languageOptions: {
parserOptions: {
tsconfigRootDir,
},
},
},
// Global rule overrides
{
rules: {
@@ -50,6 +61,12 @@ export default eslint(
'react/no-unknown-property': 0,
'regexp/match-any': 0,
'unicorn/better-regex': 0,
'@typescript-eslint/consistent-type-imports': [
2,
{
fixStyle: 'separate-type-imports',
},
],
},
},
// MDX files
@@ -81,4 +98,11 @@ export default eslint(
'unicorn/prefer-top-level-await': 0,
},
},
// E2E and test files - allow console.log for debugging
{
files: ['e2e/**/*', '**/*.test.ts', '**/*.test.tsx'],
rules: {
'no-console': 0,
},
},
);
+3 -2
View File
@@ -58,13 +58,13 @@
"duplicateTitle": "نسخة {{title}}",
"emptyAgent": "لا يوجد وكلاء بعد. ابدأ بأول وكيل لك — وابنِ نظامك بمرور الوقت.",
"emptyAgentAction": "إنشاء وكيل",
"extendParams.disableContextCaching.desc": "يقلل ما يصل إلى 90٪ من تكلفة توليد محادثة واحدة ويوفر سرعة تصل إلى 4 أضعاف. تفعيل هذا سيقوم تلقائيًا بإلغاء الحد على عدد الرسائل التاريخية. <1>اعرف المزيد</1>",
"extendParams.disableContextCaching.desc": "قلل تكلفة إنشاء محادثة واحدة بنسبة تصل إلى 90٪ وزد السرعة حتى 4 أضعاف. <1>اعرف المزيد</1>",
"extendParams.disableContextCaching.title": "تفعيل تخزين السياق المؤقت",
"extendParams.effort.desc": "تحكم في عدد الرموز التي يستخدمها كلود عند الرد باستخدام معلمة الجهد.",
"extendParams.effort.title": "الجهد",
"extendParams.enableAdaptiveThinking.desc": "اسمح لكلود باتخاذ قرارات ديناميكية حول متى وكم يفكر باستخدام وضع التفكير التكيفي.",
"extendParams.enableAdaptiveThinking.title": "تفعيل التفكير التكيفي",
"extendParams.enableReasoning.desc": "استنادًا إلى آلية التفكير في Claude، فإن تفعيل هذا سيقوم تلقائيًا بإلغاء الحد على عدد الرسائل التاريخية. <1>اعرف المزيد</1>",
"extendParams.enableReasoning.desc": "استنادًا إلى حد آلية التفكير في Claude. <1>اعرف المزيد</1>",
"extendParams.enableReasoning.title": "تفعيل التفكير العميق",
"extendParams.imageAspectRatio.title": "نسبة أبعاد الصورة",
"extendParams.imageResolution.title": "دقة الصورة",
@@ -165,6 +165,7 @@
"messageAction.delAndRegenerate": "حذف وإعادة التوليد",
"messageAction.deleteDisabledByThreads": "لا يمكن حذف هذه الرسالة لأنها تحتوي على موضوع فرعي",
"messageAction.expand": "توسيع الرسالة",
"messageAction.reaction": "إضافة تفاعل",
"messageAction.regenerate": "إعادة التوليد",
"messages.dm.sentTo": "مرئي فقط لـ {{name}}",
"messages.dm.title": "رسالة خاصة",
+2
View File
@@ -143,6 +143,7 @@
"cmdk.keywords.stats": "إحصائيات تحليلات بيانات",
"cmdk.keywords.submitIssue": "مشكلة خلل عطل ملاحظات",
"cmdk.keywords.usage": "الاستخدام الإحصائيات الاستهلاك الحصة",
"cmdk.keywords.video": "فيديو،إنشاء،سيدانص،كلينغ",
"cmdk.memory": "الذاكرة",
"cmdk.mentionAgent": "اذكر الوكيل",
"cmdk.navigate": "تنقل",
@@ -193,6 +194,7 @@
"cmdk.themeLight": "فاتح",
"cmdk.toOpen": "فتح",
"cmdk.toSelect": "تحديد",
"cmdk.video": "فيديو بالذكاء الاصطناعي",
"confirm": "تأكيد",
"contact": "اتصل بنا",
"copy": "نسخ",
+31
View File
@@ -43,6 +43,8 @@
"FileManager.emptyStatus.or": "أو",
"FileManager.emptyStatus.title": "اسحب الملفات أو المجلدات إلى هنا",
"FileManager.noFolders": "لا توجد مجلدات متاحة",
"FileManager.search.noResults": "لم يتم العثور على ملفات",
"FileManager.search.placeholder": "ابحث في الملفات...",
"FileManager.sort.dateAdded": "تاريخ الإضافة",
"FileManager.sort.name": "الاسم",
"FileManager.sort.size": "الحجم",
@@ -94,6 +96,35 @@
"ModelSelect.removed": "النموذج غير موجود في القائمة. سيتم حذفه تلقائيًا إذا تم إلغاء تحديده.",
"ModelSwitchPanel.byModel": "حسب النموذج",
"ModelSwitchPanel.byProvider": "حسب المزوّد",
"ModelSwitchPanel.detail.abilities": "القدرات",
"ModelSwitchPanel.detail.abilities.files": "الملفات",
"ModelSwitchPanel.detail.abilities.functionCall": "استدعاء الأداة",
"ModelSwitchPanel.detail.abilities.imageOutput": "إخراج الصورة",
"ModelSwitchPanel.detail.abilities.reasoning": "الاستدلال",
"ModelSwitchPanel.detail.abilities.search": "البحث",
"ModelSwitchPanel.detail.abilities.video": "الفيديو",
"ModelSwitchPanel.detail.abilities.vision": "الرؤية",
"ModelSwitchPanel.detail.config": "إعداد النموذج",
"ModelSwitchPanel.detail.context": "طول السياق",
"ModelSwitchPanel.detail.pricing": "الأسعار",
"ModelSwitchPanel.detail.pricing.cachedInput": "المدخلات المخزنة ${{amount}}/مليون",
"ModelSwitchPanel.detail.pricing.group.audio": "الصوت",
"ModelSwitchPanel.detail.pricing.group.image": "الصورة",
"ModelSwitchPanel.detail.pricing.group.text": "النص",
"ModelSwitchPanel.detail.pricing.input": "المدخلات ${{amount}}/مليون",
"ModelSwitchPanel.detail.pricing.output": "المخرجات ${{amount}}/مليون",
"ModelSwitchPanel.detail.pricing.unit.audioInput": "مدخل صوتي",
"ModelSwitchPanel.detail.pricing.unit.audioInput_cacheRead": "مدخل صوتي (مخزن)",
"ModelSwitchPanel.detail.pricing.unit.audioOutput": "مخرج صوتي",
"ModelSwitchPanel.detail.pricing.unit.imageGeneration": "توليد الصور",
"ModelSwitchPanel.detail.pricing.unit.imageInput": "مدخل صورة",
"ModelSwitchPanel.detail.pricing.unit.imageInput_cacheRead": "مدخل صورة (مخزن)",
"ModelSwitchPanel.detail.pricing.unit.imageOutput": "مخرج صورة",
"ModelSwitchPanel.detail.pricing.unit.textInput": "مدخل",
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "مدخل (مخزن)",
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "مدخل (كتابة في التخزين)",
"ModelSwitchPanel.detail.pricing.unit.textOutput": "مخرج",
"ModelSwitchPanel.detail.releasedAt": "تم الإصدار في {{date}}",
"ModelSwitchPanel.emptyModel": "لا يوجد نموذج مفعل. يرجى الذهاب إلى الإعدادات لتفعيله.",
"ModelSwitchPanel.emptyProvider": "لا يوجد مزود مفعل. يرجى الذهاب إلى الإعدادات لتفعيل أحدهم.",
"ModelSwitchPanel.goToSettings": "الذهاب إلى الإعدادات",
+9
View File
@@ -150,6 +150,9 @@
"groupAgents.tag": "مجموعة",
"groupAgents.underReview": "قيد المراجعة",
"home.communityAgents": "وكلاء المجتمع",
"home.creatorReward.action": "قدّم الآن",
"home.creatorReward.subtitle": "برنامج مكافآت المبدعين لعام 2026 أصبح متاحًا رسميًا.",
"home.creatorReward.title": "أنشئ. شارك. واحصل على مقابل.",
"home.featuredAssistants": "وكلاء مميزون",
"home.featuredModels": "نماذج مميزة",
"home.featuredPlugins": "مهارات مميزة",
@@ -194,6 +197,8 @@
"mcp.categories.tools.name": "أدوات مساعدة",
"mcp.categories.travel-transport.description": "تخطيط السفر والمواصلات",
"mcp.categories.travel-transport.name": "السفر والمواصلات",
"mcp.categories.utility.description": "خدمات التنبؤ بالطقس والأرصاد الجوية",
"mcp.categories.utility.name": "الخدمات",
"mcp.categories.weather.description": "توقعات الطقس وخدمات الأرصاد الجوية",
"mcp.categories.weather.name": "الطقس",
"mcp.categories.web-search.description": "البحث على الويب واسترجاع المعلومات",
@@ -478,6 +483,10 @@
"tab.plugin": "المهارة",
"tab.provider": "المزود",
"tab.user": "المستخدم",
"time.formatOtherYear": "D MMM، YYYY",
"time.formatThisYear": "D MMM",
"time.today": "اليوم",
"time.yesterday": "أمس",
"user.agents": "الوكلاء",
"user.downloads": "التنزيلات",
"user.editProfile": "تعديل الملف الشخصي",
+1
View File
@@ -10,5 +10,6 @@
"starter.deepResearch": "بحث معمق",
"starter.developing": "قريبًا",
"starter.image": "صورة",
"starter.seedance": "سيدانس 2.0",
"starter.write": "كتابة"
}
+4 -1
View File
@@ -9,7 +9,10 @@
"addToKnowledgeBase.title": "إضافة إلى المكتبة",
"addToKnowledgeBase.totalFiles": "{{count}} ملف/ملفات محددة",
"createNew.confirm": "إنشاء جديد",
"createNew.description.placeholder": "وصف المكتبة (اختياري)",
"createNew.description.label": "وصف المكتبة (اختياري)",
"createNew.description.placeholder": "يساعد الوصف نموذج اللغة الكبير على فهم مكتبتك بشكل أفضل",
"createNew.edit.confirm": "حفظ التغييرات",
"createNew.edit.title": "تعديل المكتبة",
"createNew.formTitle": "المعلومات الأساسية",
"createNew.name.placeholder": "اسم المكتبة",
"createNew.name.required": "يرجى إدخال اسم المكتبة",
+4
View File
@@ -38,6 +38,10 @@
"messages.success.submit": "تم التفويض بنجاح! يمكنك الآن نشر وكيلك.",
"messages.success.upload": "تم التفويض بنجاح! يمكنك الآن نشر إصدار جديد.",
"profileSetup.cancel": "إلغاء",
"profileSetup.confirmChangeUserId.cancel": "إلغاء",
"profileSetup.confirmChangeUserId.confirm": "تغيير معرف المستخدم",
"profileSetup.confirmChangeUserId.description": "بمجرد التبديل إلى @{{newId}}، يمكن لأي شخص المطالبة بمعرفك القديم @{{oldId}} وستتوقف جميع الروابط الحالية إلى ملفك الشخصي عن العمل. لا يمكن التراجع عن هذا الإجراء. هل أنت متأكد أنك تريد المتابعة؟",
"profileSetup.confirmChangeUserId.title": "تغيير معرف المستخدم؟",
"profileSetup.descriptionEdit": "قم بتحديث معلومات ملفك الشخصي في المجتمع.",
"profileSetup.descriptionFirstTime": "قم بإعداد ملفك لإكمال ملفك الشخصي في المجتمع.",
"profileSetup.errors.fileTooLarge": "حجم الملف لا يمكن أن يتجاوز 2 ميغابايت",
+1 -1
View File
@@ -260,8 +260,8 @@
"providerModels.item.modelConfig.type.options.realtime": "دردشة فورية",
"providerModels.item.modelConfig.type.options.stt": "تحويل الكلام إلى نص",
"providerModels.item.modelConfig.type.options.text2music": "نص إلى موسيقى",
"providerModels.item.modelConfig.type.options.text2video": "نص إلى فيديو",
"providerModels.item.modelConfig.type.options.tts": "تحويل النص إلى كلام",
"providerModels.item.modelConfig.type.options.video": "توليد الفيديو",
"providerModels.item.modelConfig.type.placeholder": "يرجى اختيار نوع النموذج",
"providerModels.item.modelConfig.type.title": "نوع النموذج",
"providerModels.item.modelConfig.video.extra": "يُمكّن هذا الإعداد تكوين التعرف على الفيديو داخل التطبيق. يعتمد الدعم على النموذج نفسه. يرجى اختباره.",
+42 -12
View File
@@ -74,7 +74,11 @@
"MiniMax-M1.description": "نموذج استدلال داخلي جديد بسلسلة تفكير تصل إلى 80K ومدخلات حتى 1M، يقدم أداءً مماثلاً لأفضل النماذج العالمية.",
"MiniMax-M2-Stable.description": "مصمم لتدفقات العمل البرمجية والوكلاء بكفاءة عالية، مع قدرة تزامن أعلى للاستخدام التجاري.",
"MiniMax-M2.1-Lightning.description": "قدرات برمجة متعددة اللغات قوية وتجربة برمجة مطورة بالكامل. أسرع وأكثر كفاءة.",
"MiniMax-M2.1-highspeed.description": "قدرات برمجة متعددة اللغات قوية مع استنتاج أسرع وأكثر كفاءة.",
"MiniMax-M2.1.description": "MiniMax-M2.1 هو نموذج مفتوح المصدر رائد من MiniMax، يركز على حل المهام الواقعية المعقدة. يتميز بقدرات برمجة متعددة اللغات والقدرة على أداء المهام المعقدة كوكلاء ذكي.",
"MiniMax-M2.5-Lightning.description": "M2.5 Lightning: نفس الأداء، أسرع وأكثر رشاقة (تقريباً 100 tps).",
"MiniMax-M2.5-highspeed.description": "نفس أداء M2.5 مع استنتاج أسرع بشكل ملحوظ.",
"MiniMax-M2.5.description": "أداء من الدرجة الأولى وفعالية تكلفة قصوى، يتعامل بسهولة مع المهام المعقدة (تقريباً 60 tps).",
"MiniMax-M2.description": "مصمم خصيصًا للبرمجة الفعالة وتدفقات عمل الوكلاء.",
"MiniMax-Text-01.description": "MiniMax-01 يقدم انتباهًا خطيًا واسع النطاق يتجاوز Transformers التقليدية، مع 456 مليار معامل و45.9 مليار مفعّلة في كل تمرير. يحقق أداءً من الدرجة الأولى ويدعم حتى 4 ملايين رمز سياقي (32× GPT-4o، 20× Claude-3.5-Sonnet).",
"MiniMaxAI/MiniMax-M1-80k.description": "MiniMax-M1 هو نموذج استدلال واسع النطاق بوزن مفتوح يستخدم انتباهًا هجينًا، يحتوي على 456 مليار معامل إجماليًا و~45.9 مليار مفعّلة لكل رمز. يدعم سياقًا يصل إلى 1M ويستخدم Flash Attention لتقليل FLOPs بنسبة 75% عند توليد 100K رمز مقارنة بـ DeepSeek R1. بهيكل MoE وتدريب RL هجين، يحقق أداءً رائدًا في الاستدلال طويل المدخلات ومهام هندسة البرمجيات الواقعية.",
@@ -107,6 +111,7 @@
"Pro/moonshotai/Kimi-K2-Thinking.description": "Kimi K2 Thinking Turbo هو إصدار Turbo محسّن لسرعة الاستدلال والإنتاجية مع الحفاظ على قدرات التفكير متعدد الخطوات واستخدام الأدوات في K2 Thinking. إنه نموذج MoE يحتوي على حوالي 1 تريليون معلمة إجمالية، ويدعم سياقًا أصليًا بطول 256 ألف رمز، واستدعاء أدوات واسع النطاق ومستقر لسيناريوهات الإنتاج التي تتطلب زمن استجابة وتزامنًا صارمين.",
"Pro/moonshotai/Kimi-K2.5.description": "Kimi K2.5 هو نموذج وكيل متعدد الوسائط مفتوح المصدر، مبني على Kimi-K2-Base، ومدرب على حوالي 1.5 تريليون رمز من النصوص والرؤية. يستخدم بنية MoE بعدد إجمالي 1 تريليون مع 32 مليار معلمات نشطة، ويدعم نافذة سياق تصل إلى 256 ألف، مما يدمج الفهم البصري واللغوي بسلاسة.",
"Pro/zai-org/glm-4.7.description": "GLM-4.7 هو النموذج الرائد من الجيل الجديد لشركة Zhipu، يحتوي على 355 مليار معلمة إجمالية و32 مليار معلمة نشطة، وقد تم تطويره بالكامل في مجالات الحوار العام، والاستدلال، وقدرات الوكلاء. يعزز GLM-4.7 التفكير المتداخل ويقدم مفاهيم التفكير المحفوظ والتفكير على مستوى الدور.",
"Pro/zai-org/glm-5.description": "GLM-5 هو نموذج لغة كبير جديد من Z.ai، يركز على هندسة الأنظمة المعقدة ومهام الوكيل طويلة الأمد. توسعت معلمات النموذج إلى 744B معلمة (40B نشطة)، وتم دمج DeepSeek Sparse Attention.",
"QwQ-32B-Preview.description": "Qwen QwQ هو نموذج بحث تجريبي يركز على تحسين الاستدلال.",
"Qwen/QVQ-72B-Preview.description": "QVQ-72B-Preview هو نموذج بحث من Qwen يركز على الاستدلال البصري، يتميز بفهم المشاهد المعقدة وحل مسائل الرياضيات البصرية.",
"Qwen/QwQ-32B-Preview.description": "Qwen QwQ هو نموذج بحث تجريبي يركز على تحسين استدلال الذكاء الاصطناعي.",
@@ -274,22 +279,28 @@
"chatgpt-4o-latest.description": "ChatGPT-4o هو نموذج ديناميكي يتم تحديثه في الوقت الفعلي، يجمع بين الفهم العميق والقدرة على التوليد لتلبية احتياجات الاستخدام الواسعة مثل دعم العملاء والتعليم والدعم الفني.",
"claude-2.0.description": "Claude 2 يقدم تحسينات رئيسية للمؤسسات، بما في ذلك سياق 200 ألف رمز، تقليل الهلوسة، دعم التعليمات النظامية، وميزة جديدة: استدعاء الأدوات.",
"claude-2.1.description": "Claude 2 يقدم تحسينات رئيسية للمؤسسات، بما في ذلك سياق 200 ألف رمز، تقليل الهلوسة، دعم التعليمات النظامية، وميزة جديدة: استدعاء الأدوات.",
"claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku هو أسرع نموذج من الجيل الجديد تقدمه Anthropic. مقارنةً بـ Claude 3 Haiku، فإنه يُظهر تحسنًا في المهارات ويتفوق على أكبر نموذج سابق Claude 3 Opus في العديد من اختبارات الذكاء.",
"claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku هو أسرع نموذج من الجيل الجديد من Anthropic، يتميز بتحسينات في المهارات ويتفوق على النموذج الرائد السابق Claude 3 Opus في العديد من المعايير.",
"claude-3-5-haiku-latest.description": "Claude 3.5 Haiku يقدم استجابات سريعة للمهام الخفيفة.",
"claude-3-7-sonnet-20250219.description": "Claude 3.7 Sonnet هو أذكى نموذج من Anthropic وأول نموذج هجيني للاستدلال في السوق. يمكنه تقديم ردود شبه فورية أو استدلالات متسلسلة خطوة بخطوة يمكن للمستخدمين متابعتها. يتميز Sonnet بقوة خاصة في البرمجة وعلوم البيانات والرؤية والمهام المعتمدة على الوكلاء.",
"claude-3-7-sonnet-20250219.description": "Claude Sonnet 3.7 هو أذكى نموذج من Anthropic وأول نموذج هجيني للاستدلال في السوق، يدعم الاستجابات الفورية أو التفكير المطول مع تحكم دقيق.",
"claude-3-7-sonnet-latest.description": "Claude 3.7 Sonnet هو أحدث وأقوى نموذج من Anthropic للمهام المعقدة، يتميز بالأداء العالي، الذكاء، الطلاقة، والفهم العميق.",
"claude-3-haiku-20240307.description": "Claude 3 Haiku هو أسرع وأصغر نموذج من Anthropic، مصمم لتقديم استجابات شبه فورية بأداء سريع ودقيق.",
"claude-3-opus-20240229.description": "Claude 3 Opus هو أقوى نموذج من Anthropic للمهام المعقدة، يتميز بالأداء العالي، الذكاء، الطلاقة، والفهم.",
"claude-3-sonnet-20240229.description": "Claude 3 Sonnet يوازن بين الذكاء والسرعة لتلبية احتياجات المؤسسات، ويوفر فائدة عالية بتكلفة أقل ونشر موثوق على نطاق واسع.",
"claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 هو أسرع وأذكى نموذج Haiku من Anthropic، يتميز بسرعة فائقة وقدرة على الاستدلال الموسع.",
"claude-3.5-sonnet.description": "يتميز Claude 3.5 Sonnet بقدرات عالية في البرمجة والكتابة والتفكير المعقد.",
"claude-3.7-sonnet-thought.description": "Claude 3.7 Sonnet مزود بقدرات تفكير موسعة للمهام التي تتطلب استدلالًا معقدًا.",
"claude-3.7-sonnet.description": "Claude 3.7 Sonnet هو إصدار مطور يتمتع بسياق موسع وقدرات محسّنة.",
"claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 هو أسرع وأذكى نموذج Haiku من Anthropic، يتميز بسرعة فائقة وقدرة على التفكير المتعمق.",
"claude-haiku-4.5.description": "Claude Haiku 4.5 نموذج سريع وفعّال لمجموعة متنوعة من المهام.",
"claude-opus-4-1-20250805-thinking.description": "Claude Opus 4.1 Thinking هو إصدار متقدم يمكنه عرض عملية تفكيره.",
"claude-opus-4-1-20250805.description": "Claude Opus 4.1 هو أحدث وأقوى نموذج من Anthropic للمهام المعقدة للغاية، يتميز بالأداء العالي والذكاء والطلاقة والفهم العميق.",
"claude-opus-4-20250514.description": "Claude Opus 4 هو أقوى نموذج من Anthropic للمهام المعقدة للغاية، يتميز بالأداء والذكاء والطلاقة والاستيعاب.",
"claude-opus-4-1-20250805.description": "Claude Opus 4.1 هو أحدث وأقوى نموذج من Anthropic للمهام المعقدة للغاية، يتفوق في الأداء والذكاء والطلاقة والفهم.",
"claude-opus-4-20250514.description": "Claude Opus 4 هو أقوى نموذج من Anthropic للمهام المعقدة للغاية، يتميز بأداء فائق وذكاء وطلاقة وفهم عميق.",
"claude-opus-4-5-20251101.description": "Claude Opus 4.5 هو النموذج الرائد من Anthropic، يجمع بين الذكاء الاستثنائي والأداء القابل للتوسع، مثالي للمهام المعقدة التي تتطلب استجابات عالية الجودة وتفكير متقدم.",
"claude-opus-4-6.description": "Claude Opus 4.6 هو أذكى نموذج من Anthropic لتطوير الوكلاء والبرمجة.",
"claude-sonnet-4-20250514-thinking.description": "Claude Sonnet 4 Thinking يمكنه تقديم استجابات شبه فورية أو تفكير متسلسل مرئي.",
"claude-sonnet-4-20250514.description": "Claude Sonnet 4 يمكنه تقديم ردود شبه فورية أو تفكير متسلسل خطوة بخطوة مع عرض واضح للعملية.",
"claude-sonnet-4-5-20250929.description": "Claude Sonnet 4.5 هو أذكى نموذج قدمته Anthropic حتى الآن.",
"claude-sonnet-4-20250514.description": "Claude Sonnet 4 هو أذكى نموذج من Anthropic حتى الآن، يوفر استجابات شبه فورية أو تفكيرًا متسلسلًا بخطوات دقيقة لمستخدمي واجهة البرمجة.",
"claude-sonnet-4-5-20250929.description": "Claude Sonnet 4.5 هو أذكى نموذج من Anthropic حتى الآن.",
"claude-sonnet-4-6.description": "Claude Sonnet 4.6 هو أفضل مزيج من السرعة والذكاء من Anthropic.",
"claude-sonnet-4.description": "Claude Sonnet 4 هو الجيل الأحدث مع أداء محسّن في جميع المهام.",
"codegeex-4.description": "CodeGeeX-4 هو مساعد برمجة ذكي يدعم الأسئلة والأجوبة متعددة اللغات وإكمال الشيفرة لزيادة إنتاجية المطورين.",
"codegeex4-all-9b.description": "CodeGeeX4-ALL-9B هو نموذج توليد شيفرة متعدد اللغات يدعم الإكمال والتوليد، تفسير الشيفرة، البحث عبر الإنترنت، استدعاء الوظائف، وأسئلة وأجوبة على مستوى المستودع، ويغطي مجموعة واسعة من سيناريوهات تطوير البرمجيات. يُعد من أفضل نماذج الشيفرة تحت 10B.",
"codegemma.description": "CodeGemma هو نموذج خفيف الوزن لمهام البرمجة المتنوعة، يتيح التكرار السريع والتكامل السلس.",
@@ -358,7 +369,7 @@
"deepseek-ai/deepseek-v3.1-terminus.description": "DeepSeek V3.1 هو نموذج تفكير من الجيل التالي يتمتع بقدرات أقوى في التفكير المعقد وسلسلة التفكير لمهام التحليل العميق.",
"deepseek-ai/deepseek-v3.1.description": "DeepSeek V3.1 هو نموذج تفكير من الجيل التالي يتمتع بقدرات أقوى في التفكير المعقد وسلسلة التفكير لمهام التحليل العميق.",
"deepseek-ai/deepseek-vl2.description": "DeepSeek-VL2 هو نموذج رؤية-لغة MoE يعتمد على DeepSeekMoE-27B مع تنشيط متفرق، ويحقق أداءً قويًا باستخدام 4.5 مليار معلمة نشطة فقط. يتميز في الأسئلة البصرية، وOCR، وفهم المستندات/الجداول/المخططات، والتأريض البصري.",
"deepseek-chat.description": "نموذج مفتوح المصدر جديد يجمع بين القدرات العامة والبرمجية. يحافظ على حوار النموذج العام وقوة النموذج البرمجي، مع تحسين التوافق مع تفضيلات المستخدم. كما يُحسن DeepSeek-V2.5 من مهارات الكتابة واتباع التعليمات.",
"deepseek-chat.description": "DeepSeek V3.2 يوازن بين الاستدلال وطول المخرجات لمهام الأسئلة والأجوبة اليومية وتطبيقات الوكلاء. يحقق نتائج تضاهي GPT-5 في المعايير العامة، وهو الأول في دمج التفكير مع استخدام الأدوات، مما يجعله رائدًا في تقييمات الوكلاء مفتوحة المصدر.",
"deepseek-coder-33B-instruct.description": "DeepSeek Coder 33B هو نموذج لغة برمجية تم تدريبه على 2 تريليون رمز (87٪ كود، 13٪ نص صيني/إنجليزي). يقدم نافذة سياق 16K ومهام الإكمال في المنتصف، ويوفر إكمال كود على مستوى المشاريع وملء مقاطع الكود.",
"deepseek-coder-v2.description": "DeepSeek Coder V2 هو نموذج كود MoE مفتوح المصدر يتميز بأداء قوي في مهام البرمجة، ويضاهي GPT-4 Turbo.",
"deepseek-coder-v2:236b.description": "DeepSeek Coder V2 هو نموذج كود MoE مفتوح المصدر يتميز بأداء قوي في مهام البرمجة، ويضاهي GPT-4 Turbo.",
@@ -381,7 +392,7 @@
"deepseek-r1-fast-online.description": "الإصدار الكامل السريع من DeepSeek R1 مع بحث ويب في الوقت الحقيقي، يجمع بين قدرات بحجم 671B واستجابة أسرع.",
"deepseek-r1-online.description": "الإصدار الكامل من DeepSeek R1 مع 671 مليار معلمة وبحث ويب في الوقت الحقيقي، يوفر فهمًا وتوليدًا أقوى.",
"deepseek-r1.description": "يستخدم DeepSeek-R1 بيانات البداية الباردة قبل التعلم المعزز ويؤدي أداءً مماثلًا لـ OpenAI-o1 في الرياضيات، والبرمجة، والتفكير.",
"deepseek-reasoner.description": "وضع التفكير في DeepSeek V3.2 يُنتج سلسلة من الأفكار قبل الإجابة النهائية لتحسين الدقة.",
"deepseek-reasoner.description": "DeepSeek V3.2 Thinking هو نموذج استدلال عميق يولد سلسلة من الأفكار قبل المخرجات لتحقيق دقة أعلى، ويحقق نتائج تنافسية عالية واستدلالًا يقارن بـ Gemini-3.0-Pro.",
"deepseek-v2.description": "DeepSeek V2 هو نموذج MoE فعال لمعالجة منخفضة التكلفة.",
"deepseek-v2:236b.description": "DeepSeek V2 236B هو نموذج DeepSeek الموجه للبرمجة مع قدرات قوية في توليد الكود.",
"deepseek-v3-0324.description": "DeepSeek-V3-0324 هو نموذج MoE يحتوي على 671 مليار معلمة يتميز بقوة في البرمجة، والقدرات التقنية، وفهم السياق، والتعامل مع النصوص الطويلة.",
@@ -439,6 +450,10 @@
"doubao-seed-1.6-vision.description": "Doubao-Seed-1.6-vision هو نموذج استدلال بصري عميق يوفر فهمًا واستدلالًا متعدد الوسائط أقوى للتعليم، ومراجعة الصور، والتفتيش/الأمن، والبحث الذكي. يدعم نافذة سياق بحجم 256k وما يصل إلى 64k من الرموز الناتجة.",
"doubao-seed-1.6.description": "Doubao-Seed-1.6 هو نموذج استدلال عميق متعدد الوسائط جديد يدعم أوضاع التفكير التلقائي، والتفكير، وعدم التفكير. في وضع عدم التفكير، يتفوق بشكل كبير على Doubao-1.5-pro/250115. يدعم نافذة سياق بحجم 256k وما يصل إلى 16k من الرموز الناتجة.",
"doubao-seed-1.8.description": "Doubao-Seed-1.8 يتمتع بفهم متعدد الوسائط أقوى وقدرات وكيل متقدمة، ويدعم إدخال النصوص/الصور/الفيديو وتخزين السياق المؤقت، ويقدم أداءً ممتازًا في المهام المعقدة.",
"doubao-seed-2.0-code.description": "Doubao-Seed-2.0-code مُحسن بشكل عميق للبرمجة الوكيلية، يدعم المدخلات متعددة الوسائط ونافذة سياق تصل إلى 256k، مناسب للبرمجة وفهم الرؤية وتدفقات عمل الوكيل.",
"doubao-seed-2.0-lite.description": "Doubao-Seed-2.0-lite هو نموذج جديد للتفكير العميق متعدد الوسائط يقدم قيمة أفضل وخيار قوي للمهام الشائعة، مع نافذة سياق تصل إلى 256k.",
"doubao-seed-2.0-mini.description": "Doubao-Seed-2.0-mini هو نموذج خفيف الوزن مع استجابة سريعة وأداء عالي، مناسب للمهام الصغيرة وسيناريوهات التزامن العالي.",
"doubao-seed-2.0-pro.description": "Doubao-Seed-2.0-pro هو النموذج العام الرائد من ByteDance، مع قفزات شاملة في تخطيط وتنفيذ المهام المعقدة.",
"doubao-seed-code.description": "Doubao-Seed-Code مُحسَّن بعمق للبرمجة الوكيلة، ويدعم إدخالات متعددة الوسائط (نص/صورة/فيديو) ونافذة سياق بحجم 256k، ومتوافق مع واجهة Anthropic API، ومناسب للبرمجة، وفهم الرؤية، وسير عمل الوكلاء.",
"doubao-seededit-3-0-i2i-250628.description": "نموذج الصور Doubao من ByteDance Seed يدعم إدخال النصوص والصور مع توليد صور عالية الجودة وقابلة للتحكم بدرجة كبيرة. يدعم تحرير الصور الموجه بالنص، مع أحجام إخراج تتراوح بين 512 و1536 على الجانب الطويل.",
"doubao-seedream-3-0-t2i-250415.description": "Seedream 3.0 هو نموذج توليد صور من ByteDance Seed، يدعم إدخال النصوص والصور مع توليد صور عالية الجودة وقابلة للتحكم بدرجة كبيرة. يُولّد الصور من التعليمات النصية.",
@@ -471,7 +486,8 @@
"ernie-speed-pro-128k.description": "ERNIE Speed Pro 128K هو نموذج عالي التوازي وعالي القيمة للخدمات عبر الإنترنت واسعة النطاق وتطبيقات المؤسسات.",
"ernie-x1-turbo-32k.description": "ERNIE X1 Turbo 32K هو نموذج تفكير سريع بسياق 32K للاستدلال المعقد والدردشة متعددة الأدوار.",
"ernie-x1.1-preview.description": "معاينة ERNIE X1.1 هو نموذج تفكير مخصص للتقييم والاختبار.",
"fal-ai/bytedance/seedream/v4.description": "Seedream 4.0 هو نموذج توليد صور من ByteDance Seed، يدعم إدخال النصوص والصور ويتميز بإنتاج صور عالية الجودة وقابلة للتحكم بدرجة كبيرة. يُولّد الصور من التعليمات النصية.",
"fal-ai/bytedance/seedream/v4.5.description": "Seedream 4.5، من تطوير فريق Seed في ByteDance، يدعم تحرير الصور المتعددة وتركيبها. يتميز بثبات أكبر في العناصر، ودقة في تنفيذ التعليمات، وفهم للمنطق المكاني، وتعبير جمالي، وتصميم الملصقات والشعارات مع عرض دقيق للنصوص والصور.",
"fal-ai/bytedance/seedream/v4.description": "Seedream 4.0، من تطوير فريق Seed في ByteDance، يدعم إدخال النصوص والصور لتوليد صور عالية الجودة وقابلة للتحكم بدرجة كبيرة من خلال الأوامر.",
"fal-ai/flux-kontext/dev.description": "نموذج FLUX.1 يركز على تحرير الصور، ويدعم إدخال النصوص والصور.",
"fal-ai/flux-pro/kontext.description": "FLUX.1 Kontext [pro] يقبل النصوص وصور مرجعية كمدخلات، مما يتيح تعديلات محلية مستهدفة وتحولات معقدة في المشهد العام.",
"fal-ai/flux/krea.description": "Flux Krea [dev] هو نموذج لتوليد الصور يتميز بميول جمالية نحو صور أكثر واقعية وطبيعية.",
@@ -479,8 +495,8 @@
"fal-ai/hunyuan-image/v3.description": "نموذج قوي لتوليد الصور متعدد الوسائط أصلي.",
"fal-ai/imagen4/preview.description": "نموذج عالي الجودة لتوليد الصور من Google.",
"fal-ai/nano-banana.description": "Nano Banana هو أحدث وأسرع وأكثر نماذج Google كفاءةً لتوليد وتحرير الصور من خلال المحادثة.",
"fal-ai/qwen-image-edit.description": "نموذج احترافي لتحرير الصور من فريق Qwen، يدعم التعديلات الدلالية والمظهرية، ويحرر النصوص الصينية والإنجليزية بدقة، كما يتيح تعديلات عالية الجودة مثل نقل الأسلوب وتدوير العناصر.",
"fal-ai/qwen-image.description": "نموذج قوي لتوليد الصور من فريق Qwen يتميز بعرض مميز للنصوص الصينية وأنماط بصرية متنوعة.",
"fal-ai/qwen-image-edit.description": "نموذج احترافي لتحرير الصور من فريق Qwen، يدعم التعديلات الدلالية والمظهرية، وتحرير النصوص بدقة باللغتين الصينية والإنجليزية، ونقل الأسلوب، والتدوير، والمزيد.",
"fal-ai/qwen-image.description": "نموذج قوي لتوليد الصور من فريق Qwen يتميز بعرض قوي للنصوص الصينية وأنماط بصرية متنوعة.",
"flux-1-schnell.description": "نموذج تحويل النص إلى صورة يحتوي على 12 مليار معلمة من Black Forest Labs يستخدم تقنيات تقطير الانتشار العدائي الكامن لتوليد صور عالية الجودة في 1-4 خطوات. ينافس البدائل المغلقة ومتاح بموجب ترخيص Apache-2.0 للاستخدام الشخصي والبحثي والتجاري.",
"flux-dev.description": "FLUX.1 [dev] هو نموذج مفتوح الأوزان ومقطر للاستخدام غير التجاري. يحافظ على جودة صور قريبة من المستوى الاحترافي واتباع التعليمات مع كفاءة تشغيل أعلى مقارنة بالنماذج القياسية من نفس الحجم.",
"flux-kontext-max.description": "توليد وتحرير صور سياقية متقدمة، تجمع بين النصوص والصور لتحقيق نتائج دقيقة ومتسقة.",
@@ -511,6 +527,8 @@
"gemini-2.0-flash-lite-001.description": "إصدار من Gemini 2.0 Flash محسن لتقليل التكلفة وتقليل التأخير.",
"gemini-2.0-flash-lite.description": "إصدار من Gemini 2.0 Flash محسن لتقليل التكلفة وتقليل التأخير.",
"gemini-2.0-flash.description": "Gemini 2.0 Flash يقدم ميزات الجيل التالي بما في ذلك السرعة الاستثنائية، واستخدام الأدوات الأصلية، والتوليد متعدد الوسائط، وسياق يصل إلى مليون رمز.",
"gemini-2.5-flash-image-preview.description": "Nano Banana هو أحدث وأسرع وأكثر النماذج متعددة الوسائط كفاءة من Google، يتيح توليد الصور وتحريرها من خلال المحادثة.",
"gemini-2.5-flash-image-preview:image.description": "Nano Banana هو أحدث وأسرع وأكثر النماذج متعددة الوسائط كفاءة من Google، يتيح توليد الصور وتحريرها من خلال المحادثة.",
"gemini-2.5-flash-image.description": "Nano Banana هو أحدث وأسرع وأكثر نماذج Google متعددة الوسائط كفاءة، يتيح توليد الصور وتحريرها عبر المحادثة.",
"gemini-2.5-flash-image:image.description": "Nano Banana هو أحدث وأسرع وأكثر نماذج Google متعددة الوسائط كفاءة، يتيح توليد الصور وتحريرها عبر المحادثة.",
"gemini-2.5-flash-lite-preview-06-17.description": "Gemini 2.5 Flash-Lite Preview هو أصغر نموذج من Google وأفضلها من حيث القيمة، مصمم للاستخدام واسع النطاق.",
@@ -565,6 +583,7 @@
"glm-4v-plus-0111.description": "GLM-4V-Plus يفهم الفيديو والصور المتعددة، مما يجعله مناسبًا للمهام متعددة الوسائط.",
"glm-4v-plus.description": "GLM-4V-Plus يفهم الفيديو والصور المتعددة، مما يجعله مناسبًا للمهام متعددة الوسائط.",
"glm-4v.description": "GLM-4V يقدم فهمًا قويًا للصور واستدلالًا عبر المهام البصرية.",
"glm-5.description": "نموذج قوي للتفكير والوكالة من Z.ai مع 744B إجمالي المعلمات (40B نشطة)، مصمم لهندسة الأنظمة المعقدة والمهام طويلة الأمد.",
"glm-z1-air.description": "نموذج استدلال يتمتع بقدرات استنتاج قوية للمهام التي تتطلب استدلالًا عميقًا.",
"glm-z1-airx.description": "استدلال فائق السرعة مع جودة استدلال عالية.",
"glm-z1-flash.description": "سلسلة GLM-Z1 تقدم استدلالًا معقدًا قويًا، وتتفوق في المنطق، الرياضيات، والبرمجة.",
@@ -604,6 +623,7 @@
"google/text-embedding-005.description": "نموذج تضمين نصي يركز على اللغة الإنجليزية، محسّن لمهام البرمجة واللغة الإنجليزية.",
"google/text-multilingual-embedding-002.description": "نموذج تضمين نصي متعدد اللغات محسّن للمهام عبر اللغات المختلفة.",
"gpt-3.5-turbo-0125.description": "GPT 3.5 Turbo لتوليد النصوص وفهمها؛ يشير حاليًا إلى gpt-3.5-turbo-0125.",
"gpt-3.5-turbo-0613.description": "GPT 3.5 Turbo نموذج سريع وفعّال لمهام متعددة.",
"gpt-3.5-turbo-1106.description": "GPT 3.5 Turbo لتوليد النصوص وفهمها؛ يشير حاليًا إلى gpt-3.5-turbo-0125.",
"gpt-3.5-turbo-instruct.description": "GPT 3.5 Turbo لمهام توليد النصوص والفهم، محسّن لاتباع التعليمات.",
"gpt-3.5-turbo.description": "GPT 3.5 Turbo لتوليد النصوص وفهمها؛ يشير حاليًا إلى gpt-3.5-turbo-0125.",
@@ -614,10 +634,12 @@
"gpt-4-1106-preview.description": "أحدث إصدار من GPT-4 Turbo يدعم الرؤية. الطلبات البصرية تدعم وضع JSON واستدعاء الوظائف. إنه نموذج متعدد الوسائط فعال من حيث التكلفة يوازن بين الدقة والكفاءة للتطبيقات في الوقت الحقيقي.",
"gpt-4-32k-0613.description": "يوفر GPT-4 نافذة سياق أكبر للتعامل مع مدخلات أطول في السيناريوهات التي تتطلب دمج معلومات واسع وتحليل بيانات.",
"gpt-4-32k.description": "يوفر GPT-4 نافذة سياق أكبر للتعامل مع مدخلات أطول في السيناريوهات التي تتطلب دمج معلومات واسع وتحليل بيانات.",
"gpt-4-o-preview.description": "GPT-4o هو النموذج متعدد الوسائط الأكثر تقدمًا، يدعم إدخال النصوص والصور.",
"gpt-4-turbo-2024-04-09.description": "أحدث إصدار من GPT-4 Turbo يدعم الرؤية. الطلبات البصرية تدعم وضع JSON واستدعاء الوظائف. إنه نموذج متعدد الوسائط فعال من حيث التكلفة يوازن بين الدقة والكفاءة للتطبيقات في الوقت الحقيقي.",
"gpt-4-turbo-preview.description": "أحدث إصدار من GPT-4 Turbo يدعم الرؤية. الطلبات البصرية تدعم وضع JSON واستدعاء الوظائف. إنه نموذج متعدد الوسائط فعال من حيث التكلفة يوازن بين الدقة والكفاءة للتطبيقات في الوقت الحقيقي.",
"gpt-4-turbo.description": "أحدث إصدار من GPT-4 Turbo يدعم الرؤية. الطلبات البصرية تدعم وضع JSON واستدعاء الوظائف. إنه نموذج متعدد الوسائط فعال من حيث التكلفة يوازن بين الدقة والكفاءة للتطبيقات في الوقت الحقيقي.",
"gpt-4-vision-preview.description": "معاينة GPT-4 Vision، مصمم لمهام تحليل ومعالجة الصور.",
"gpt-4.1-2025-04-14.description": "GPT-4.1 هو النموذج الرائد للمهام المعقدة، مثالي لحل المشكلات متعددة المجالات.",
"gpt-4.1-mini.description": "GPT-4.1 mini يوازن بين الذكاء والسرعة والتكلفة، مما يجعله جذابًا للعديد من الاستخدامات.",
"gpt-4.1-nano.description": "GPT-4.1 nano هو الأسرع والأكثر فعالية من حيث التكلفة بين نماذج GPT-4.1.",
"gpt-4.1.description": "GPT-4.1 هو نموذجنا الرائد للمهام المعقدة وحل المشكلات عبر المجالات.",
@@ -627,6 +649,7 @@
"gpt-4o-2024-08-06.description": "ChatGPT-4o هو نموذج ديناميكي يتم تحديثه في الوقت الحقيقي، يجمع بين الفهم القوي والتوليد لتطبيقات واسعة النطاق مثل دعم العملاء والتعليم والمساعدة التقنية.",
"gpt-4o-2024-11-20.description": "ChatGPT-4o هو نموذج ديناميكي يتم تحديثه في الوقت الحقيقي، يجمع بين الفهم القوي والتوليد لتطبيقات واسعة النطاق مثل دعم العملاء والتعليم والدعم الفني.",
"gpt-4o-audio-preview.description": "نموذج معاينة GPT-4o Audio مع إدخال وإخراج صوتي.",
"gpt-4o-mini-2024-07-18.description": "GPT-4o mini هو حل اقتصادي لمجموعة واسعة من مهام النصوص والصور.",
"gpt-4o-mini-audio-preview.description": "نموذج GPT-4o mini Audio مع إدخال وإخراج صوتي.",
"gpt-4o-mini-realtime-preview.description": "إصدار GPT-4o-mini الفوري مع إدخال وإخراج صوتي ونصي في الوقت الحقيقي.",
"gpt-4o-mini-search-preview.description": "GPT-4o mini Search Preview مدرب على فهم وتنفيذ استعلامات البحث عبر الإنترنت من خلال واجهة Chat Completions API. يتم احتساب تكلفة البحث عبر الإنترنت لكل استخدام أداة بالإضافة إلى تكلفة الرموز.",
@@ -863,6 +886,7 @@
"mimo-v2-flash.description": "MiMo-V2-Flash: نموذج فعال للاستدلال، والبرمجة، وبناء الأسس للوكيل الذكي.",
"minicpm-v.description": "MiniCPM-V هو نموذج متعدد الوسائط من الجيل التالي من OpenBMB يتميز بقدرات ممتازة في التعرف البصري للنصوص وفهم الوسائط المتعددة لمجموعة واسعة من الاستخدامات.",
"minimax-m2.1.description": "MiniMax-M2.1 هو أحدث إصدار من سلسلة MiniMax، مُحسّن للبرمجة متعددة اللغات والمهام المعقدة الواقعية. كنموذج أصلي للذكاء الاصطناعي، يحقق MiniMax-M2.1 تحسينات كبيرة في الأداء، ودعم أطر الوكلاء، والتكيف مع سيناريوهات متعددة، بهدف مساعدة الأفراد والشركات على تبني نمط حياة وعمل قائم على الذكاء الاصطناعي بسرعة أكبر.",
"minimax-m2.5.description": "MiniMax-M2.5 هو نموذج لغة كبير متقدم مصمم للإنتاجية الواقعية ومهام البرمجة.",
"minimax-m2.description": "MiniMax M2 هو نموذج لغوي كبير وفعّال صُمم خصيصًا للبرمجة وسير عمل الوكلاء.",
"minimax/minimax-m2.1.description": "MiniMax-M2.1 هو نموذج لغوي كبير وخفيف الوزن ومتطور، مُحسّن للبرمجة وسير عمل الوكلاء وتطوير التطبيقات الحديثة، ويقدم مخرجات أنظف وأكثر إيجازًا واستجابة أسرع.",
"minimax/minimax-m2.description": "MiniMax-M2 هو نموذج عالي القيمة يتميز في مهام البرمجة والوكلاء في العديد من سيناريوهات الهندسة.",
@@ -980,6 +1004,8 @@
"openai/text-embedding-3-small.description": "إصدار محسّن عالي الأداء من نموذج تضمين ada.",
"openai/text-embedding-ada-002.description": "نموذج تضمين النصوص القديم من OpenAI.",
"openrouter/auto.description": "استنادًا إلى طول السياق والموضوع والتعقيد، يتم توجيه طلبك إلى Llama 3 70B Instruct أو Claude 3.5 Sonnet (بمراقبة ذاتية) أو GPT-4o.",
"oswe-vscode-prime.description": "Raptor mini هو نموذج تجريبي محسن لمهام البرمجة.",
"oswe-vscode-secondary.description": "Raptor mini هو نموذج تجريبي محسن لمهام البرمجة.",
"perplexity/sonar-pro.description": "المنتج الرائد من Perplexity مع دعم البحث، يدعم الاستفسارات المتقدمة والمتابعة.",
"perplexity/sonar-reasoning-pro.description": "نموذج متقدم يركز على التفكير، ينتج سلسلة تفكير (CoT) مع بحث محسّن، بما في ذلك استعلامات بحث متعددة لكل طلب.",
"perplexity/sonar-reasoning.description": "نموذج يركز على التفكير، ينتج سلسلة تفكير (CoT) مع شروحات مفصلة مدعومة بالبحث.",
@@ -1122,6 +1148,7 @@
"qwq.description": "QwQ هو نموذج استدلال من عائلة Qwen. مقارنة بالنماذج المضبوطة على التعليمات، يقدم قدرات تفكير واستدلال تعزز الأداء بشكل كبير، خاصة في المشكلات الصعبة. QwQ-32B هو نموذج متوسط الحجم ينافس أفضل نماذج الاستدلال مثل DeepSeek-R1 و o1-mini.",
"qwq_32b.description": "نموذج استدلال متوسط الحجم من عائلة Qwen. مقارنة بالنماذج المضبوطة على التعليمات، تعزز قدرات التفكير والاستدلال في QwQ الأداء بشكل كبير، خاصة في المشكلات الصعبة.",
"r1-1776.description": "R1-1776 هو إصدار ما بعد التدريب من DeepSeek R1 مصمم لتقديم معلومات واقعية غير خاضعة للرقابة أو التحيز.",
"seedance-1-5-pro-251215.description": "Seedance 1.5 Pro من ByteDance يدعم تحويل النصوص إلى فيديو، والصور إلى فيديو (الإطار الأول، أو الإطار الأول والأخير)، وتوليد الصوت المتزامن مع العناصر البصرية.",
"solar-mini-ja.description": "Solar Mini (Ja) يوسع Solar Mini مع تركيز على اللغة اليابانية مع الحفاظ على الأداء القوي والكفاءة في الإنجليزية والكورية.",
"solar-mini.description": "Solar Mini هو نموذج لغة مدمج يتفوق على GPT-3.5، يتميز بقدرات متعددة اللغات قوية تدعم الإنجليزية والكورية، ويقدم حلاً فعالاً بصمة صغيرة.",
"solar-pro.description": "Solar Pro هو نموذج لغة عالي الذكاء من Upstage، يركز على اتباع التعليمات باستخدام وحدة معالجة رسومات واحدة، مع درجات IFEval تتجاوز 80. حالياً يدعم اللغة الإنجليزية؛ وكان من المقرر إصدار النسخة الكاملة في نوفمبر 2024 مع دعم لغات موسع وسياق أطول.",
@@ -1162,7 +1189,9 @@
"tencent/Hunyuan-A13B-Instruct.description": "Hunyuan-A13B-Instruct يستخدم 80 مليار معلمة إجمالية مع 13 مليار نشطة لمضاهاة النماذج الأكبر. يدعم الاستدلال الهجين السريع/البطيء، وفهم النصوص الطويلة بثبات، وقدرات وكيل رائدة على BFCL-v3 وτ-Bench. تدعم تنسيقات GQA والتكميم المتعدد الاستدلال بكفاءة.",
"tencent/Hunyuan-MT-7B.description": "نموذج الترجمة Hunyuan يشمل Hunyuan-MT-7B وHunyuan-MT-Chimera. Hunyuan-MT-7B هو نموذج ترجمة خفيف بسعة 7B يدعم 33 لغة بالإضافة إلى 5 لغات صينية محلية. حصل على المركز الأول في 30 من أصل 31 زوج لغوي في WMT25. يستخدم Hunyuan من Tencent سلسلة تدريب كاملة من التدريب المسبق إلى SFT إلى الترجمة بالتعلم المعزز، محققًا أداءً رائدًا بحجمه وسهولة في النشر.",
"text-embedding-3-large.description": "أقوى نموذج تضمين للمهام باللغة الإنجليزية وغير الإنجليزية.",
"text-embedding-3-small-inference.description": "نموذج Embedding V3 صغير (للاستدلال) لتضمين النصوص.",
"text-embedding-3-small.description": "نموذج تضمين من الجيل التالي فعال من حيث التكلفة ومناسب للاسترجاع وسيناريوهات RAG.",
"text-embedding-ada-002.description": "نموذج Embedding V2 Ada لتضمين النصوص.",
"thudm/glm-4-32b.description": "GLM-4-32B-0414 هو نموذج ثنائي اللغة (صيني/إنجليزي) بسعة 32B وأوزان مفتوحة، مُحسَّن لتوليد الشيفرات، واستدعاء الوظائف، ومهام الوكلاء. تم تدريبه مسبقًا على 15 تريليون رمز عالي الجودة ومليء بالاستدلال، وتم تحسينه بموازنة تفضيلات البشر، وأخذ العينات بالرفض، والتعلم المعزز. يتفوق في الاستدلال المعقد، وتوليد المخرجات المنظمة، ويصل إلى مستوى أداء GPT-4o وDeepSeek-V3-0324 في العديد من المعايير.",
"thudm/glm-4-32b:free.description": "GLM-4-32B-0414 هو نموذج ثنائي اللغة (صيني/إنجليزي) بسعة 32B وأوزان مفتوحة، مُحسَّن لتوليد الشيفرات، واستدعاء الوظائف، ومهام الوكلاء. تم تدريبه مسبقًا على 15 تريليون رمز عالي الجودة ومليء بالاستدلال، وتم تحسينه بموازنة تفضيلات البشر، وأخذ العينات بالرفض، والتعلم المعزز. يتفوق في الاستدلال المعقد، وتوليد المخرجات المنظمة، ويصل إلى مستوى أداء GPT-4o وDeepSeek-V3-0324 في العديد من المعايير.",
"thudm/glm-4-9b-chat.description": "الإصدار مفتوح المصدر من نموذج GLM-4 الأحدث من Zhipu AI.",
@@ -1222,6 +1251,7 @@
"z-ai/glm-4.5.description": "GLM 4.5 هو النموذج الرائد من Z.AI باستدلال هجين مُحسّن للهندسة والمهام طويلة السياق.",
"z-ai/glm-4.6.description": "GLM 4.6 هو النموذج الرائد من Z.AI مع طول سياق ممتد وقدرات برمجية متقدمة.",
"z-ai/glm-4.7.description": "GLM-4.7 هو النموذج الرائد الأحدث من Zhipu، يقدم قدرات عامة محسَّنة، وردودًا أبسط وأكثر طبيعية، وتجربة كتابة أكثر تفاعلية.",
"z-ai/glm5.description": "نموذج قوي للتفكير والوكالة من Z.ai مع 744B إجمالي المعلمات (40B نشطة)، مصمم لهندسة الأنظمة المعقدة والمهام طويلة الأمد.",
"zai-org/GLM-4.5-Air.description": "GLM-4.5-Air هو نموذج أساسي لتطبيقات الوكلاء يستخدم بنية Mixture-of-Experts. مُحسّن لاستخدام الأدوات، وتصفح الويب، والهندسة البرمجية، وبرمجة الواجهات، ويتكامل مع وكلاء البرمجة مثل Claude Code وRoo Code. يستخدم استدلالًا هجينًا للتعامل مع السيناريوهات المعقدة واليومية.",
"zai-org/GLM-4.5.description": "GLM-4.5 هو نموذج أساسي لتطبيقات الوكلاء يستخدم بنية Mixture-of-Experts. مُحسّن بعمق لاستخدام الأدوات، وتصفح الويب، والهندسة البرمجية، وبرمجة الواجهات، ويتكامل مع وكلاء البرمجة مثل Claude Code وRoo Code. يستخدم استدلالًا هجينًا للتعامل مع السيناريوهات المعقدة واليومية.",
"zai-org/GLM-4.5V.description": "GLM-4.5V هو أحدث نموذج رؤية من Zhipu AI، مبني على نموذج النص الرائد GLM-4.5-Air (إجمالي 106 مليار، 12 مليار نشط) باستخدام بنية MoE لأداء قوي بتكلفة أقل. يتبع مسار GLM-4.1V-Thinking ويضيف 3D-RoPE لتحسين الاستدلال المكاني ثلاثي الأبعاد. مُحسّن من خلال التدريب المسبق، والتعلم الخاضع للإشراف، والتعلم المعزز، ويتعامل مع الصور، والفيديو، والمستندات الطويلة، ويتصدر النماذج المفتوحة في 41 معيارًا متعدد الوسائط. يتيح وضع التفكير للمستخدمين التوازن بين السرعة والعمق.",
+1
View File
@@ -30,6 +30,7 @@
"internlm.description": "منظمة مفتوحة المصدر تركز على أبحاث النماذج الكبيرة والأدوات، وتوفر منصة فعالة وسهلة الاستخدام تتيح الوصول إلى أحدث النماذج والخوارزميات.",
"jina.description": "تأسست Jina AI في عام 2020، وهي شركة رائدة في مجال البحث الذكي. تشمل تقنياتها نماذج المتجهات، ومعيدو الترتيب، ونماذج لغوية صغيرة لبناء تطبيقات بحث توليدية ومتعددة الوسائط عالية الجودة.",
"lmstudio.description": "LM Studio هو تطبيق سطح مكتب لتطوير وتجربة النماذج اللغوية الكبيرة على جهازك.",
"lobehub.description": "يستخدم LobeHub Cloud واجهات برمجة التطبيقات الرسمية للوصول إلى نماذج الذكاء الاصطناعي، ويقيس الاستخدام من خلال الأرصدة المرتبطة برموز النماذج.",
"minimax.description": "تأسست MiniMax في عام 2021، وتبني نماذج ذكاء اصطناعي متعددة الوسائط للأغراض العامة، بما في ذلك نماذج نصية بمليارات المعلمات، ونماذج صوتية وبصرية، بالإضافة إلى تطبيقات مثل Hailuo AI.",
"mistral.description": "تقدم Mistral نماذج متقدمة عامة ومتخصصة وبحثية للتفكير المعقد، والمهام متعددة اللغات، وتوليد الأكواد، مع دعم استدعاء الوظائف للتكامل المخصص.",
"modelscope.description": "ModelScope هي منصة نماذج كخدمة من Alibaba Cloud، تقدم مجموعة واسعة من النماذج وخدمات الاستدلال.",
+1
View File
@@ -14,6 +14,7 @@
"table.columns.totalTokens": "استخدام الرموز",
"table.columns.type.enums.chat": "توليد نصوص",
"table.columns.type.enums.imageGeneration": "توليد صور",
"table.columns.type.enums.videoGeneration": "توليد الفيديو",
"table.columns.type.title": "النوع",
"table.desc": "تفاصيل استخدام الاعتمادات الحاسوبية لتوليد النصوص، التضمين، توليد الصور، وغيرها.",
"table.more": "عرض التفاصيل",
+6
View File
@@ -131,6 +131,12 @@
"limitation.providers.prompter.subTitle": "خدمة API المخصصة متاحة فقط للخطط المدفوعة. قم بالترقية الآن للاستفادة من خدمات النماذج العالمية",
"limitation.providers.prompter.title": "اشترك الآن لاستخدام خدمة API مخصصة",
"limitation.providers.tooltip": "خدمة API المخصصة متاحة فقط للخطط المدفوعة",
"limitation.video.success.action": "تابع التوليد",
"limitation.video.success.desc": "تمت ترقية اشتراكك في خطة {{plan}} بنجاح. استمتع بتوليد الفيديو باستخدام الذكاء الاصطناعي. خطتك الحالية تتضمن:",
"limitation.video.success.title": "تمت الترقية بنجاح",
"limitation.video.topupSuccess.action": "تابع التوليد",
"limitation.video.topupSuccess.desc": "تم تفعيل رصيد الشحن الخاص بك. استمتع بتوليد الفيديو باستخدام الذكاء الاصطناعي. خطتك الحالية تتضمن:",
"limitation.video.topupSuccess.title": "تم الشحن بنجاح",
"modelPricing.button": "عرض مستندات التسعير",
"modelPricing.desc": "يستخدم {{name}} الأرصدة لقياس استخدام نموذج الذكاء الاصطناعي. يوضح الجدول أدناه أرصدة الحوسبة لكل 1M رموز.",
"modelPricing.title": "تسعير نموذج النص",
+35
View File
@@ -86,6 +86,10 @@
"localFiles.editFile.replaceFirst": "استبدال التكرار الأول فقط",
"localFiles.file": "ملف",
"localFiles.folder": "مجلد",
"localFiles.globFiles.pattern": "النمط",
"localFiles.grepContent.glob": "تصفية الملفات",
"localFiles.grepContent.pattern": "نمط البحث",
"localFiles.grepContent.type": "نوع الملف",
"localFiles.moveFiles.itemsMoved": "تم نقل {{count}} عنصر(عناصر):",
"localFiles.moveFiles.itemsMoved_one": "تم نقل عنصر واحد:",
"localFiles.moveFiles.itemsMoved_other": "تم نقل {{count}} عناصر:",
@@ -95,11 +99,17 @@
"localFiles.open": "فتح",
"localFiles.openFile": "فتح ملف",
"localFiles.openFolder": "فتح مجلد",
"localFiles.outOfScope.requestedPaths": "المسارات المطلوبة",
"localFiles.outOfScope.warning": "تحذير: المسار(ات) التالية تقع خارج دليل العمل المُحدد. يرجى التأكيد إذا كنت ترغب في السماح بالوصول.",
"localFiles.outOfScope.workingDirectory": "دليل العمل",
"localFiles.read.more": "عرض المزيد",
"localFiles.readFile": "قراءة الملف",
"localFiles.readFile.lineRange": "الأسطر {{start}} - {{end}}",
"localFiles.readFileError": "فشل في قراءة الملف، يرجى التحقق من صحة المسار",
"localFiles.readFiles": "قراءة الملفات",
"localFiles.readFilesError": "فشل في قراءة الملفات، يرجى التحقق من صحة المسار",
"localFiles.searchFiles.keywords": "الكلمات المفتاحية",
"localFiles.securityBlacklist.warning": "تنبيه أمني: تم تمييز هذه العملية بواسطة قواعد الأمان وتتطلب موافقتك الصريحة.",
"localFiles.writeFile.characters": "أحرف",
"localFiles.writeFile.preview": "معاينة المحتوى",
"localFiles.writeFile.truncated": "مقتطع",
@@ -136,6 +146,31 @@
"search.summary": "الملخص",
"search.summaryTooltip": "تلخيص المحتوى الحالي",
"search.viewMoreResults": "عرض {{results}} نتيجة إضافية",
"securityBlacklist.awsCredentials": "الوصول إلى بيانات اعتماد AWS قد يؤدي إلى تسريب مفاتيح الوصول السحابية",
"securityBlacklist.browserCredentials": "الوصول إلى تخزين بيانات اعتماد المتصفح قد يؤدي إلى تسريب كلمات المرور",
"securityBlacklist.chownSystemDirs": "تغيير ملكية مجلدات النظام أمر خطير",
"securityBlacklist.ddDiskWrite": "كتابة بيانات عشوائية على أجهزة التخزين قد يؤدي إلى تدمير البيانات",
"securityBlacklist.directMemoryAccess": "الوصول المباشر إلى الذاكرة أمر بالغ الخطورة",
"securityBlacklist.disableFirewall": "تعطيل جدار الحماية يعرض النظام للهجمات",
"securityBlacklist.dockerConfig": "قراءة إعدادات Docker قد تكشف بيانات اعتماد التسجيل",
"securityBlacklist.envFiles": "قراءة ملفات .env قد تؤدي إلى تسريب بيانات اعتماد حساسة ومفاتيح API",
"securityBlacklist.etcPasswd": "تعديل /etc/passwd قد يؤدي إلى فقدان الوصول إلى النظام",
"securityBlacklist.forkBomb": "قنبلة fork قد تتسبب في انهيار النظام",
"securityBlacklist.formatPartition": "تهيئة أقسام النظام ستؤدي إلى تدمير البيانات",
"securityBlacklist.gcpCredentials": "قراءة بيانات اعتماد GCP قد تؤدي إلى تسريب مفاتيح حسابات الخدمات السحابية",
"securityBlacklist.gitCredentials": "قراءة ملف بيانات اعتماد Git قد يؤدي إلى تسريب رموز الوصول",
"securityBlacklist.historyFiles": "قراءة ملفات السجل قد تكشف أوامر وبيانات اعتماد حساسة",
"securityBlacklist.kernelParams": "تعديل معلمات النواة بدون فهم قد يؤدي إلى انهيار النظام",
"securityBlacklist.kubeConfig": "قراءة إعدادات Kubernetes قد تكشف بيانات اعتماد الكتلة",
"securityBlacklist.npmrc": "قراءة ملف رمز npm قد يؤدي إلى تسريب بيانات اعتماد مستودع الحزم",
"securityBlacklist.removeSystemPackages": "إزالة حزم النظام الأساسية قد تؤدي إلى تعطل النظام",
"securityBlacklist.rmForceRecursive": "الحذف القسري التكراري بدون هدف محدد أمر بالغ الخطورة",
"securityBlacklist.rmHomeDir": "الحذف التكراري لمجلد المنزل أمر بالغ الخطورة",
"securityBlacklist.rmRootDir": "الحذف التكراري لمجلد الجذر سيؤدي إلى تدمير النظام",
"securityBlacklist.sshConfig": "تغيير إعدادات SSH قد يؤدي إلى فقدان الوصول",
"securityBlacklist.sshPrivateKeys": "قراءة مفاتيح SSH الخاصة قد تعرض أمان النظام للخطر",
"securityBlacklist.sudoers": "تعديل ملف sudoers بدون تحقق مناسب أمر خطير",
"securityBlacklist.suidShells": "تعيين SUID للأصداف أو المفسرات يمثل خطراً أمنياً",
"updateArgs.duplicateKeyError": "يجب أن يكون مفتاح الحقل فريدًا",
"updateArgs.form.add": "إضافة عنصر",
"updateArgs.form.key": "مفتاح الحقل",
+28
View File
@@ -0,0 +1,28 @@
{
"config.aspectRatio.label": "نسبة العرض إلى الارتفاع",
"config.cameraFixed.label": "كاميرا ثابتة",
"config.duration.label": "المدة",
"config.endImageUrl.label": "الإطار النهائي",
"config.generateAudio.label": "توليد صوت",
"config.header.title": "فيديو",
"config.imageUrl.label": "الإطار الابتدائي",
"config.prompt.placeholder": "صف الفيديو الذي ترغب في إنشائه",
"config.referenceImage.label": "صورة مرجعية",
"config.resolution.label": "الدقة",
"config.seed.label": "البذرة",
"config.seed.random": "عشوائي",
"generation.actions.copyError": "نسخ رسالة الخطأ",
"generation.actions.errorCopied": "تم نسخ رسالة الخطأ إلى الحافظة",
"generation.actions.errorCopyFailed": "فشل في نسخ رسالة الخطأ",
"generation.actions.generate": "إنشاء",
"generation.freeQuota.exhausted": "🎁 تم استهلاك الحصة المجانية، سيتم استخدام الرصيد",
"generation.freeQuota.remaining": "🎁 {{remaining}} فيديو مجاني متبقٍ اليوم",
"generation.status.failed": "فشل في الإنشاء",
"generation.status.generating": "جارٍ الإنشاء...",
"generation.validation.endFrameRequiresStartFrame": "لا يمكن استخدام الإطار النهائي بدون إطار ابتدائي. يرجى تعيين إطار ابتدائي أولاً.",
"topic.createNew": "موضوع جديد",
"topic.deleteConfirm": "حذف موضوع الفيديو",
"topic.deleteConfirmDesc": "أنت على وشك حذف موضوع الفيديو هذا. لا يمكن التراجع عن هذا الإجراء.",
"topic.title": "مواضيع الفيديو",
"topic.untitled": "موضوع افتراضي"
}
+3 -2
View File
@@ -58,13 +58,13 @@
"duplicateTitle": "{{title}} - Копие",
"emptyAgent": "Все още няма Агенти. Започнете с първия си Агент — изградете системата си с времето.",
"emptyAgentAction": "Създай Агент",
"extendParams.disableContextCaching.desc": "Намалява до 90% от разходите за генериране на един разговор и увеличава скоростта до 4 пъти. Активирането автоматично премахва ограничението за брой исторически съобщения. <1>Научете повече</1>",
"extendParams.disableContextCaching.desc": "Намалете до 90% от разходите за генериране на един разговор и постигнете до 4 пъти по-висока скорост. <1>Научете повече</1>",
"extendParams.disableContextCaching.title": "Активирай кеширане на контекста",
"extendParams.effort.desc": "Контролирайте колко токени използва Claude при отговор чрез параметъра за усилие.",
"extendParams.effort.title": "Усилие",
"extendParams.enableAdaptiveThinking.desc": "Позволете на Claude динамично да решава кога и колко да мисли с режима за адаптивно мислене.",
"extendParams.enableAdaptiveThinking.title": "Активирай адаптивно мислене",
"extendParams.enableReasoning.desc": "Въз основа на ограничението на механизма Claude Thinking, активирането автоматично премахва ограничението за брой исторически съобщения. <1>Научете повече</1>",
"extendParams.enableReasoning.desc": "Базирано на ограничението на механизма за мислене на Claude. <1>Научете повече</1>",
"extendParams.enableReasoning.title": "Активирай дълбоко мислене",
"extendParams.imageAspectRatio.title": "Съотношение на изображението",
"extendParams.imageResolution.title": "Резолюция на изображението",
@@ -165,6 +165,7 @@
"messageAction.delAndRegenerate": "Изтрий и генерирай отново",
"messageAction.deleteDisabledByThreads": "Това съобщение има подтема и не може да бъде изтрито",
"messageAction.expand": "Разгъни съобщението",
"messageAction.reaction": "Добави реакция",
"messageAction.regenerate": "Генерирай отново",
"messages.dm.sentTo": "Видимо само за {{name}}",
"messages.dm.title": "ЛС",
+2
View File
@@ -143,6 +143,7 @@
"cmdk.keywords.stats": "статистики анализи",
"cmdk.keywords.submitIssue": "проблем бъг обратна връзка",
"cmdk.keywords.usage": "използване статистика консумация квота",
"cmdk.keywords.video": "видео,генерирай,seedance,kling",
"cmdk.memory": "Памет",
"cmdk.mentionAgent": "Спомени агент",
"cmdk.navigate": "Навигирай",
@@ -193,6 +194,7 @@
"cmdk.themeLight": "Светла",
"cmdk.toOpen": "Отвори",
"cmdk.toSelect": "Избери",
"cmdk.video": "AI Видео",
"confirm": "Потвърди",
"contact": "Свържете се с нас",
"copy": "Копирай",
+31
View File
@@ -43,6 +43,8 @@
"FileManager.emptyStatus.or": "или",
"FileManager.emptyStatus.title": "Плъзнете файлове или папки тук",
"FileManager.noFolders": "Няма налични папки",
"FileManager.search.noResults": "Няма намерени файлове",
"FileManager.search.placeholder": "Търсене на файлове...",
"FileManager.sort.dateAdded": "Дата на добавяне",
"FileManager.sort.name": "Име",
"FileManager.sort.size": "Размер",
@@ -94,6 +96,35 @@
"ModelSelect.removed": "Моделът не е в списъка. Ще бъде автоматично премахнат, ако бъде деселектиран.",
"ModelSwitchPanel.byModel": "По модел",
"ModelSwitchPanel.byProvider": "По доставчик",
"ModelSwitchPanel.detail.abilities": "Възможности",
"ModelSwitchPanel.detail.abilities.files": "Файлове",
"ModelSwitchPanel.detail.abilities.functionCall": "Извикване на инструмент",
"ModelSwitchPanel.detail.abilities.imageOutput": "Изход на изображение",
"ModelSwitchPanel.detail.abilities.reasoning": "Разсъждение",
"ModelSwitchPanel.detail.abilities.search": "Търсене",
"ModelSwitchPanel.detail.abilities.video": "Видео",
"ModelSwitchPanel.detail.abilities.vision": "Визия",
"ModelSwitchPanel.detail.config": "Конфигурация на модела",
"ModelSwitchPanel.detail.context": "Дължина на контекста",
"ModelSwitchPanel.detail.pricing": "Ценообразуване",
"ModelSwitchPanel.detail.pricing.cachedInput": "Кеширан вход ${{amount}}/М",
"ModelSwitchPanel.detail.pricing.group.audio": "Аудио",
"ModelSwitchPanel.detail.pricing.group.image": "Изображение",
"ModelSwitchPanel.detail.pricing.group.text": "Текст",
"ModelSwitchPanel.detail.pricing.input": "Вход ${{amount}}/М",
"ModelSwitchPanel.detail.pricing.output": "Изход ${{amount}}/М",
"ModelSwitchPanel.detail.pricing.unit.audioInput": "Аудио вход",
"ModelSwitchPanel.detail.pricing.unit.audioInput_cacheRead": "Аудио вход (кеширан)",
"ModelSwitchPanel.detail.pricing.unit.audioOutput": "Аудио изход",
"ModelSwitchPanel.detail.pricing.unit.imageGeneration": "Генериране на изображение",
"ModelSwitchPanel.detail.pricing.unit.imageInput": "Вход на изображение",
"ModelSwitchPanel.detail.pricing.unit.imageInput_cacheRead": "Вход на изображение (кеширан)",
"ModelSwitchPanel.detail.pricing.unit.imageOutput": "Изход на изображение",
"ModelSwitchPanel.detail.pricing.unit.textInput": "Вход",
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Вход (кеширан)",
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Вход (запис в кеш)",
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Изход",
"ModelSwitchPanel.detail.releasedAt": "Пуснат на {{date}}",
"ModelSwitchPanel.emptyModel": "Няма активиран модел. Моля, отидете в настройките, за да активирате.",
"ModelSwitchPanel.emptyProvider": "Няма активирани доставчици. Моля, отидете в настройките, за да активирате такъв.",
"ModelSwitchPanel.goToSettings": "Отиди в настройките",
+9
View File
@@ -150,6 +150,9 @@
"groupAgents.tag": "Група",
"groupAgents.underReview": "В процес на преглед",
"home.communityAgents": "Агенти от общността",
"home.creatorReward.action": "Кандидатствай сега",
"home.creatorReward.subtitle": "Програмата за възнаграждение на създатели за 2026 г. е официално стартирана.",
"home.creatorReward.title": "Създавай. Споделяй. Получавай възнаграждение.",
"home.featuredAssistants": "Препоръчани агенти",
"home.featuredModels": "Препоръчани модели",
"home.featuredPlugins": "Препоръчани умения",
@@ -194,6 +197,8 @@
"mcp.categories.tools.name": "Помощни инструменти",
"mcp.categories.travel-transport.description": "Планиране на пътувания и транспорт",
"mcp.categories.travel-transport.name": "Пътуване и транспорт",
"mcp.categories.utility.description": "Прогноза за времето и метеорологични услуги",
"mcp.categories.utility.name": "Услуги",
"mcp.categories.weather.description": "Прогноза за времето и метеорологични услуги",
"mcp.categories.weather.name": "Времето",
"mcp.categories.web-search.description": "Уеб търсене и извличане на информация",
@@ -478,6 +483,10 @@
"tab.plugin": "Умение",
"tab.provider": "Доставчик",
"tab.user": "Потребител",
"time.formatOtherYear": "D MMM, YYYY",
"time.formatThisYear": "D MMM",
"time.today": "Днес",
"time.yesterday": "Вчера",
"user.agents": "Агенти",
"user.downloads": "Изтегляния",
"user.editProfile": "Редактирай профил",
+1
View File
@@ -10,5 +10,6 @@
"starter.deepResearch": "Задълбочено проучване",
"starter.developing": "Очаквайте скоро",
"starter.image": "Изображение",
"starter.seedance": "Seedance 2.0",
"starter.write": "Писане"
}
+4 -1
View File
@@ -9,7 +9,10 @@
"addToKnowledgeBase.title": "Добавяне към библиотека",
"addToKnowledgeBase.totalFiles": "{{count}} избрани файла",
"createNew.confirm": "Създай нова",
"createNew.description.placeholder": "Описание на библиотеката (по избор)",
"createNew.description.label": "Описание на библиотеката (по избор)",
"createNew.description.placeholder": "Описанието помага на LLM да разбере по-добре вашата библиотека",
"createNew.edit.confirm": "Запази промените",
"createNew.edit.title": "Редактиране на библиотека",
"createNew.formTitle": "Основна информация",
"createNew.name.placeholder": "Име на библиотеката",
"createNew.name.required": "Моля, въведете име на библиотеката",
+4
View File
@@ -38,6 +38,10 @@
"messages.success.submit": "Удостоверяването е успешно! Вече можете да публикувате своя агент.",
"messages.success.upload": "Удостоверяването е успешно! Вече можете да публикувате нова версия.",
"profileSetup.cancel": "Отказ",
"profileSetup.confirmChangeUserId.cancel": "Отказ",
"profileSetup.confirmChangeUserId.confirm": "Промени потребителското име",
"profileSetup.confirmChangeUserId.description": "След като преминете към @{{newId}}, всеки ще може да заеме старото ви потребителско име @{{oldId}} и всички съществуващи връзки към вашия профил ще спрат да работят. Това действие не може да бъде отменено. Сигурни ли сте, че искате да продължите?",
"profileSetup.confirmChangeUserId.title": "Промяна на потребителското име?",
"profileSetup.descriptionEdit": "Актуализирай информацията в профила си в общността.",
"profileSetup.descriptionFirstTime": "Настрой профила си, за да го завършиш.",
"profileSetup.errors.fileTooLarge": "Размерът на файла не може да надвишава 2MB",
+1 -1
View File
@@ -260,8 +260,8 @@
"providerModels.item.modelConfig.type.options.realtime": "Чат в реално време",
"providerModels.item.modelConfig.type.options.stt": "Реч към текст",
"providerModels.item.modelConfig.type.options.text2music": "Текст към музика",
"providerModels.item.modelConfig.type.options.text2video": "Текст към видео",
"providerModels.item.modelConfig.type.options.tts": "Текст към реч",
"providerModels.item.modelConfig.type.options.video": "Генериране на видео",
"providerModels.item.modelConfig.type.placeholder": "Изберете тип модел",
"providerModels.item.modelConfig.type.title": "Тип модел",
"providerModels.item.modelConfig.video.extra": "Активира конфигурация за разпознаване на видео. Поддръжката зависи от модела. Моля, тествайте.",
+83 -11
View File
@@ -74,7 +74,11 @@
"MiniMax-M1.description": "Нов вътрешен модел за разсъждение с 80K верига на мисълта и 1M вход, предлагащ производителност, сравнима с водещите глобални модели.",
"MiniMax-M2-Stable.description": "Създаден за ефективно програмиране и агентски работни потоци, с по-висока едновременност за търговска употреба.",
"MiniMax-M2.1-Lightning.description": "Мощни многоезични възможности за програмиране и цялостно подобрено програмистко изживяване. По-бързо и по-ефективно.",
"MiniMax-M2.1-highspeed.description": "Мощни многоезични програмни възможности с по-бързо и ефективно извеждане.",
"MiniMax-M2.1.description": "MiniMax-M2.1 е водеща отворена голяма езикова система от MiniMax, фокусирана върху решаването на сложни реални задачи. Основните ѝ предимства са възможностите за програмиране на множество езици и способността да действа като агент за решаване на сложни задачи.",
"MiniMax-M2.5-Lightning.description": "M2.5 Lightning: Същата производителност, по-бърз и по-агилен (приблизително 100 tps).",
"MiniMax-M2.5-highspeed.description": "Същата производителност като M2.5 с значително по-бързо извеждане.",
"MiniMax-M2.5.description": "Висококласна производителност и максимална икономичност, лесно справяне със сложни задачи (приблизително 60 tps).",
"MiniMax-M2.description": "Създаден специално за ефективно програмиране и работни потоци с агенти",
"MiniMax-Text-01.description": "MiniMax-01 въвежда мащабно линейно внимание отвъд класическите трансформери, с 456B параметри и 45.9B активирани на преминаване. Постига водеща производителност и поддържа до 4M токена контекст (32× GPT-4o, 20× Claude-3.5-Sonnet).",
"MiniMaxAI/MiniMax-M1-80k.description": "MiniMax-M1 е отворен модел с голям мащаб и хибридно внимание, с общо 456B параметри и ~45.9B активни на токен. Поддържа нативно 1M контекст и използва Flash Attention за 75% по-малко FLOPs при генериране на 100K токена спрямо DeepSeek R1. С MoE архитектура, CISPO и хибридно обучение с внимание и RL, постига водеща производителност при дълги входове и реални задачи по софтуерно инженерство.",
@@ -107,6 +111,7 @@
"Pro/moonshotai/Kimi-K2-Thinking.description": "Kimi K2 Thinking Turbo е ускорен вариант, оптимизиран за скорост на разсъждение и пропускателна способност, като запазва многoетапното разсъждение и използване на инструменти от K2 Thinking. Това е MoE модел с ~1T общи параметри, роден 256K контекст и стабилно мащабируемо извикване на инструменти за производствени сценарии с по-строги изисквания за латентност и едновременност.",
"Pro/moonshotai/Kimi-K2.5.description": "Kimi K2.5 е отворен мултимодален агентен модел, базиран на Kimi-K2-Base, обучен върху приблизително 1.5 трилиона смесени визуални и текстови токени. Моделът използва MoE архитектура с общо 1T параметри и 32B активни параметри, поддържа контекстен прозорец от 256K и безпроблемно интегрира визуално и езиково разбиране.",
"Pro/zai-org/glm-4.7.description": "GLM-4.7 е най-новият флагмански модел на Zhipu с общо 355 милиарда параметъра и 32 милиарда активни параметъра. Той е напълно обновен в областите на общ диалог, логическо мислене и агентни способности. GLM-4.7 подобрява Междинното мислене и въвежда Запазено мислене и Мислене на ниво обръщение.",
"Pro/zai-org/glm-5.description": "GLM-5 е новото поколение голям езиков модел, представен от Zhipu, фокусиран върху сложни системни инженерни задачи и дългосрочни агентски задачи. Моделът разширява параметрите до 744B (40B активни) и интегрира DeepSeek Sparse Attention.",
"QwQ-32B-Preview.description": "Qwen QwQ е експериментален изследователски модел, фокусиран върху подобряване на разсъждението.",
"Qwen/QVQ-72B-Preview.description": "QVQ-72B-Preview е изследователски модел от Qwen, насочен към визуално разсъждение, със силни страни в разбирането на сложни сцени и визуални математически задачи.",
"Qwen/QwQ-32B-Preview.description": "Qwen QwQ е експериментален изследователски модел, фокусиран върху подобрено AI разсъждение.",
@@ -274,22 +279,28 @@
"chatgpt-4o-latest.description": "ChatGPT-4o е динамичен модел, актуализиран в реално време, комбиниращ силно разбиране и генериране за мащабни приложения като клиентска поддръжка, образование и техническа помощ.",
"claude-2.0.description": "Claude 2 предлага ключови подобрения за предприятия, включително водещ контекст от 200 000 токена, намалени халюцинации, системни подканвания и нова тестова функция: използване на инструменти.",
"claude-2.1.description": "Claude 2 предлага ключови подобрения за предприятия, включително водещ контекст от 200 000 токена, намалени халюцинации, системни подканвания и нова тестова функция: използване на инструменти.",
"claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku е най-бързият модел от ново поколение на Anthropic. В сравнение с Claude 3 Haiku, той показва подобрения в различни умения и надминава предишния най-голям модел Claude 3 Opus в много интелигентни бенчмаркове.",
"claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku е най-бързият модел от ново поколение на Anthropic, с подобрени умения и превъзхождащ предишния водещ модел Claude 3 Opus в много бенчмаркове.",
"claude-3-5-haiku-latest.description": "Claude 3.5 Haiku осигурява бързи отговори за леки задачи.",
"claude-3-7-sonnet-20250219.description": "Claude 3.7 Sonnet е най-интелигентният модел на Anthropic и първият хибриден модел за разсъждение на пазара. Той може да генерира почти мигновени отговори или разширено поетапно разсъждение, което потребителите могат да проследят. Sonnet е особено силен в програмиране, анализ на данни, визуални задачи и задачи за агенти.",
"claude-3-7-sonnet-20250219.description": "Claude Sonnet 3.7 е най-интелигентният модел на Anthropic и първият хибриден модел за разсъждение на пазара, предлагащ почти мигновени отговори или разширено мислене с прецизен контрол.",
"claude-3-7-sonnet-latest.description": "Claude 3.7 Sonnet е най-новият и най-способен модел на Anthropic за силно сложни задачи, отличаващ се с производителност, интелигентност, плавност и разбиране.",
"claude-3-haiku-20240307.description": "Claude 3 Haiku е най-бързият и най-компактен модел на Anthropic, проектиран за почти мигновени отговори с бърза и точна производителност.",
"claude-3-opus-20240229.description": "Claude 3 Opus е най-мощният модел на Anthropic за силно сложни задачи, отличаващ се с производителност, интелигентност, плавност и разбиране.",
"claude-3-sonnet-20240229.description": "Claude 3 Sonnet балансира интелигентност и скорост за корпоративни натоварвания, осигурявайки висока полезност на по-ниска цена и надеждно мащабно внедряване.",
"claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 е най-бързият и най-интелигентен Haiku модел на Anthropic, с мълниеносна скорост и разширено разсъждение.",
"claude-3.5-sonnet.description": "Claude 3.5 Sonnet се отличава в програмиране, писане и сложни разсъждения.",
"claude-3.7-sonnet-thought.description": "Claude 3.7 Sonnet с разширено мислене за задачи, изискващи сложни разсъждения.",
"claude-3.7-sonnet.description": "Claude 3.7 Sonnet е надградена версия с разширен контекст и възможности.",
"claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 е най-бързият и най-интелигентен Haiku модел на Anthropic, с мълниеносна скорост и разширено мислене.",
"claude-haiku-4.5.description": "Claude Haiku 4.5 е бърз и ефективен модел за различни задачи.",
"claude-opus-4-1-20250805-thinking.description": "Claude Opus 4.1 Thinking е усъвършенстван вариант, който може да разкрие процеса си на разсъждение.",
"claude-opus-4-1-20250805.description": "Claude Opus 4.1 е най-новият и най-способен модел на Anthropic за изключително сложни задачи, отличаващ се с висока производителност, интелигентност, плавност и разбиране.",
"claude-opus-4-20250514.description": "Claude Opus 4 е най-мощният модел на Anthropic за изключително сложни задачи, отличаващ се с висока производителност, интелигентност, плавност и разбиране.",
"claude-opus-4-5-20251101.description": "Claude Opus 4.5 е флагманският модел на Anthropic, комбиниращ изключителна интелигентност с мащабируема производителност, идеален за сложни задачи, изискващи най-висококачествени отговори и разсъждение.",
"claude-opus-4-6.description": "Claude Opus 4.6 е най-интелигентният модел на Anthropic за изграждане на агенти и програмиране.",
"claude-sonnet-4-20250514-thinking.description": "Claude Sonnet 4 Thinking може да генерира почти мигновени отговори или разширено стъпково мислене с видим процес.",
"claude-sonnet-4-20250514.description": "Claude Sonnet 4 може да генерира почти мигновени отговори или разширено поетапно мислене с видим процес.",
"claude-sonnet-4-5-20250929.description": "Claude Sonnet 4.5 е най-интелигентният модел на Anthropic до момента.",
"claude-sonnet-4-20250514.description": "Claude Sonnet 4 е най-интелигентният модел на Anthropic досега, предлагащ почти мигновени отговори или разширено поетапно мислене с прецизен контрол за потребителите на API.",
"claude-sonnet-4-5-20250929.description": "Claude Sonnet 4.5 е най-интелигентният модел на Anthropic досега.",
"claude-sonnet-4-6.description": "Claude Sonnet 4.6 е най-добрата комбинация от скорост и интелигентност на Anthropic.",
"claude-sonnet-4.description": "Claude Sonnet 4 е най-новото поколение с подобрена производителност във всички задачи.",
"codegeex-4.description": "CodeGeeX-4 е мощен AI асистент за програмиране, който поддържа многоезични въпроси и допълване на код, повишавайки продуктивността на разработчиците.",
"codegeex4-all-9b.description": "CodeGeeX4-ALL-9B е многоезичен модел за генериране на код, който поддържа допълване и създаване на код, интерпретиране, уеб търсене, извикване на функции и въпроси на ниво хранилище. Подходящ е за широк спектър от софтуерни сценарии и е водещ модел под 10 милиарда параметри.",
"codegemma.description": "CodeGemma е лек модел за разнообразни програмни задачи, позволяващ бърза итерация и интеграция.",
@@ -358,7 +369,7 @@
"deepseek-ai/deepseek-v3.1-terminus.description": "DeepSeek V3.1 е модел за разсъждение от ново поколение с по-силни способности за сложни разсъждения и верига от мисли за задълбочени аналитични задачи.",
"deepseek-ai/deepseek-v3.1.description": "DeepSeek V3.1 е модел за разсъждение от ново поколение с по-силни способности за сложни разсъждения и верига от мисли за задълбочени аналитични задачи.",
"deepseek-ai/deepseek-vl2.description": "DeepSeek-VL2 е MoE модел за визия и език, базиран на DeepSeekMoE-27B със слаба активация, постигайки висока производителност с едва 4.5 милиарда активни параметъра. Отличава се в визуални въпроси и отговори, OCR, разбиране на документи/таблици/графики и визуално привързване.",
"deepseek-chat.description": "Нов отворен модел, съчетаващ общи и програмни способности. Съхранява общия диалогов капацитет на чат модела и силните програмни умения на кодиращия модел, с по-добро съответствие с предпочитанията. DeepSeek-V2.5 също така подобрява писането и следването на инструкции.",
"deepseek-chat.description": "DeepSeek V3.2 балансира разсъждението и дължината на отговорите за ежедневни въпроси и задачи на агенти. Публичните бенчмаркове достигат нивата на GPT-5, а това е първият модел, който интегрира мислене в използването на инструменти, водещ в оценките на отворен код за агенти.",
"deepseek-coder-33B-instruct.description": "DeepSeek Coder 33B е езиков модел за програмиране, обучен върху 2 трилиона токени (87% код, 13% китайски/английски текст). Въвежда 16K контекстен прозорец и задачи за попълване в средата, осигурявайки допълване на код на ниво проект и попълване на фрагменти.",
"deepseek-coder-v2.description": "DeepSeek Coder V2 е отворен MoE модел за програмиране, който се представя на ниво GPT-4 Turbo.",
"deepseek-coder-v2:236b.description": "DeepSeek Coder V2 е отворен MoE модел за програмиране, който се представя на ниво GPT-4 Turbo.",
@@ -381,7 +392,7 @@
"deepseek-r1-fast-online.description": "Пълна бърза версия на DeepSeek R1 с търсене в реално време в уеб, комбинираща възможности от мащаб 671B и по-бърз отговор.",
"deepseek-r1-online.description": "Пълна версия на DeepSeek R1 с 671 милиарда параметъра и търсене в реално време в уеб, предлагаща по-силно разбиране и генериране.",
"deepseek-r1.description": "DeepSeek-R1 използва данни от студен старт преди подсиленото обучение и се представя наравно с OpenAI-o1 в математика, програмиране и разсъждение.",
"deepseek-reasoner.description": "Режимът на мислене DeepSeek V3.2 извежда верига от мисли преди крайния отговор за повишена точност.",
"deepseek-reasoner.description": "DeepSeek V3.2 Thinking е дълбок разсъждаващ модел, който генерира верига от мисли преди отговорите за по-висока точност, с водещи резултати в състезания и разсъждение, сравнимо с Gemini-3.0-Pro.",
"deepseek-v2.description": "DeepSeek V2 е ефективен MoE модел за икономична обработка.",
"deepseek-v2:236b.description": "DeepSeek V2 236B е модел на DeepSeek, фокусиран върху програмиране, с висока производителност при генериране на код.",
"deepseek-v3-0324.description": "DeepSeek-V3-0324 е MoE модел с 671 милиарда параметъра, с изключителни способности в програмиране, технически задачи, разбиране на контекст и обработка на дълги текстове.",
@@ -439,6 +450,10 @@
"doubao-seed-1.6-vision.description": "Doubao-Seed-1.6-vision е визуален дълбок разсъждаващ модел, който осигурява по-силно мултимодално разбиране и разсъждение за образование, преглед на изображения, инспекция/сигурност и AI търсене с въпроси и отговори. Поддържа контекстен прозорец от 256k и до 64k изходни токена.",
"doubao-seed-1.6.description": "Doubao-Seed-1.6 е нов мултимодален дълбок разсъждаващ модел с режими auto, thinking и non-thinking. В non-thinking режим значително превъзхожда Doubao-1.5-pro/250115. Поддържа контекстен прозорец от 256k и до 16k изходни токена.",
"doubao-seed-1.8.description": "Doubao-Seed-1.8 притежава по-силно мултимодално разбиране и агентни способности, поддържа вход от текст/изображение/видео и кеширане на контекст, като осигурява отлична производителност при сложни задачи.",
"doubao-seed-2.0-code.description": "Doubao-Seed-2.0-code е дълбоко оптимизиран за агентско програмиране, поддържа мултимодални входове и контекстен прозорец от 256k, подходящ за програмиране, разбиране на визия и агентски работни потоци.",
"doubao-seed-2.0-lite.description": "Doubao-Seed-2.0-lite е нов мултимодален модел за дълбоко разсъждение, който предлага по-добра стойност и е силен избор за общи задачи, с контекстен прозорец до 256k.",
"doubao-seed-2.0-mini.description": "Doubao-Seed-2.0-mini е лек модел с бърз отговор и висока производителност, подходящ за малки задачи и сценарии с висока конкуренция.",
"doubao-seed-2.0-pro.description": "Doubao-Seed-2.0-pro е водещият общ агентски модел на ByteDance, с цялостни подобрения в планирането и изпълнението на сложни задачи.",
"doubao-seed-code.description": "Doubao-Seed-Code е дълбоко оптимизиран за агентно програмиране, поддържа мултимодални входове (текст/изображение/видео) и контекстен прозорец от 256k, съвместим е с Anthropic API и е подходящ за програмиране, разбиране на визия и работни потоци с агенти.",
"doubao-seededit-3-0-i2i-250628.description": "Моделът за изображения на Doubao от ByteDance Seed поддържа вход от текст и изображения с високо контролируемо, висококачествено генериране на изображения. Поддържа редактиране на изображения, водено от текст, с размери на изхода между 512 и 1536 по дългата страна.",
"doubao-seedream-3-0-t2i-250415.description": "Seedream 3.0 е модел за генериране на изображения от ByteDance Seed, поддържащ вход от текст и изображения с високо контролируемо, висококачествено генериране на изображения. Генерира изображения от текстови подсказки.",
@@ -471,7 +486,8 @@
"ernie-speed-pro-128k.description": "ERNIE Speed Pro 128K е модел с висока едновременност и висока стойност за мащабни онлайн услуги и корпоративни приложения.",
"ernie-x1-turbo-32k.description": "ERNIE X1 Turbo 32K е бърз мислещ модел с 32K контекст за сложни разсъждения и многозавойни разговори.",
"ernie-x1.1-preview.description": "ERNIE X1.1 Preview е предварителен модел за мислене, предназначен за оценка и тестване.",
"fal-ai/bytedance/seedream/v4.description": "Seedream 4.0 е модел за генериране на изображения от ByteDance Seed, поддържащ вход от текст и изображения с висока степен на контрол и качество. Генерира изображения от текстови подсказки.",
"fal-ai/bytedance/seedream/v4.5.description": "Seedream 4.5, разработен от екипа Seed на ByteDance, поддържа редактиране и композиране на множество изображения. Отличава се с подобрена последователност на обектите, точно следване на инструкции, разбиране на пространствена логика, естетическо изразяване, оформление на постери и дизайн на лога с високопрецизно визуално-текстово рендиране.",
"fal-ai/bytedance/seedream/v4.description": "Seedream 4.0, разработен от ByteDance Seed, поддържа текстови и визуални входове за висококачествено и силно контролируемо генериране на изображения от подсказки.",
"fal-ai/flux-kontext/dev.description": "FLUX.1 модел, фокусиран върху редактиране на изображения, поддържащ вход от текст и изображения.",
"fal-ai/flux-pro/kontext.description": "FLUX.1 Kontext [pro] приема текст и референтни изображения като вход, позволявайки целенасочени локални редакции и сложни глобални трансформации на сцени.",
"fal-ai/flux/krea.description": "Flux Krea [dev] е модел за генериране на изображения с естетично предпочитание към по-реалистични и естествени изображения.",
@@ -479,8 +495,8 @@
"fal-ai/hunyuan-image/v3.description": "Мощен роден мултимодален модел за генериране на изображения.",
"fal-ai/imagen4/preview.description": "Модел за висококачествено генериране на изображения от Google.",
"fal-ai/nano-banana.description": "Nano Banana е най-новият, най-бърз и най-ефективен роден мултимодален модел на Google, позволяващ генериране и редактиране на изображения чрез разговор.",
"fal-ai/qwen-image-edit.description": "Професионален модел за редактиране на изображения от екипа на Qwen, който поддържа семантични и визуални редакции, прецизно редактира китайски и английски текст и позволява висококачествени трансформации като смяна на стил и завъртане на обекти.",
"fal-ai/qwen-image.description": "Мощен модел за генериране на изображения от екипа на Qwen с впечатляващо визуализиране на китайски текст и разнообразни визуални стилове.",
"fal-ai/qwen-image-edit.description": "Професионален модел за редактиране на изображения от екипа Qwen, поддържащ семантични и визуални редакции, прецизно редактиране на текст на китайски/английски, трансфер на стил, завъртане и други.",
"fal-ai/qwen-image.description": "Мощен модел за генериране на изображения от екипа Qwen с отлично визуализиране на китайски текст и разнообразни визуални стилове.",
"flux-1-schnell.description": "Модел за преобразуване на текст в изображение с 12 милиарда параметъра от Black Forest Labs, използващ латентна дифузионна дестилация за генериране на висококачествени изображения в 1–4 стъпки. Съперничи на затворени алтернативи и е пуснат под лиценз Apache-2.0 за лична, изследователска и търговска употреба.",
"flux-dev.description": "FLUX.1 [dev] е дестилиран модел с отворени тегла за нетърговска употреба. Запазва почти професионално качество на изображенията и следване на инструкции, като същевременно работи по-ефективно и използва ресурсите по-добре от стандартни модели със същия размер.",
"flux-kontext-max.description": "Съвременно генериране и редактиране на изображения с контекст, комбиниращо текст и изображения за прецизни и последователни резултати.",
@@ -511,6 +527,8 @@
"gemini-2.0-flash-lite-001.description": "Вариант на Gemini 2.0 Flash, оптимизиран за ниска цена и ниска латентност.",
"gemini-2.0-flash-lite.description": "Вариант на Gemini 2.0 Flash, оптимизиран за ниска цена и ниска латентност.",
"gemini-2.0-flash.description": "Gemini 2.0 Flash предлага функции от ново поколение, включително изключителна скорост, вградена употреба на инструменти, мултимодално генериране и контекстен прозорец от 1 милион токена.",
"gemini-2.5-flash-image-preview.description": "Nano Banana е най-новият, най-бърз и най-ефективен роден мултимодален модел на Google, позволяващ разговорно генериране и редактиране на изображения.",
"gemini-2.5-flash-image-preview:image.description": "Nano Banana е най-новият, най-бърз и най-ефективен роден мултимодален модел на Google, позволяващ разговорно генериране и редактиране на изображения.",
"gemini-2.5-flash-image.description": "Nano Banana е най-новият, най-бърз и най-ефективен роден мултимодален модел на Google, позволяващ разговорно генериране и редактиране на изображения.",
"gemini-2.5-flash-image:image.description": "Nano Banana е най-новият, най-бърз и най-ефективен роден мултимодален модел на Google, позволяващ разговорно генериране и редактиране на изображения.",
"gemini-2.5-flash-lite-preview-06-17.description": "Gemini 2.5 Flash-Lite Preview е най-малкият и най-изгоден модел на Google, проектиран за мащабна употреба.",
@@ -525,7 +543,7 @@
"gemini-2.5-pro.description": "Gemini 2.5 Pro е най-усъвършенстваният модел за разсъждение на Google, способен да разсъждава върху код, математика и STEM проблеми и да анализира големи набори от данни, кодови бази и документи с дълъг контекст.",
"gemini-3-flash-preview.description": "Gemini 3 Flash е най-интелигентният модел, създаден за скорост, съчетаващ авангардна интелигентност с отлично търсене и обоснованост.",
"gemini-3-pro-image-preview.description": "Gemini 3 Pro ImageNano Banana Pro)е модел на Google за генериране на изображения, който също така поддържа мултимодален диалог.",
"gemini-3-pro-image-preview:image.description": "Gemini 3 Pro Image (Nano Banana Pro) е модел на Google за генериране на изображения, който също поддържа мултимодален чат.",
"gemini-3-pro-image-preview:image.description": "Gemini 3 Pro Image (Nano Banana Pro) е моделът на Google за генериране на изображения и поддържа мултимодален чат.",
"gemini-3-pro-preview.description": "Gemini 3 Pro е най-мощният агентен и „vibe-coding“ модел на Google, който предлага по-богати визуализации и по-дълбоко взаимодействие, базирано на съвременно логическо мислене.",
"gemini-flash-latest.description": "Най-новата версия на Gemini Flash",
"gemini-flash-lite-latest.description": "Най-новата версия на Gemini Flash-Lite",
@@ -565,6 +583,7 @@
"glm-4v-plus-0111.description": "GLM-4V-Plus разбира видео и множество изображения, подходящ за мултимодални задачи.",
"glm-4v-plus.description": "GLM-4V-Plus разбира видео и множество изображения, подходящ за мултимодални задачи.",
"glm-4v.description": "GLM-4V осигурява силно разбиране на изображения и логическо мислене в различни визуални задачи.",
"glm-5.description": "Силен модел за разсъждение и агентски задачи от Z.ai с общо 744B параметри (40B активни), създаден за сложни системни инженерни задачи и дългосрочни задачи.",
"glm-z1-air.description": "Модел за логическо мислене със силни способности за дълбоко разсъждение при сложни задачи.",
"glm-z1-airx.description": "Ултра-бързо логическо мислене с високо качество на разсъжденията.",
"glm-z1-flash.description": "Серията GLM-Z1 осигурява силно логическо мислене при сложни задачи, отличавайки се в логика, математика и програмиране.",
@@ -604,6 +623,7 @@
"google/text-embedding-005.description": "Модел за вграждане на текст, фокусиран върху английски език, оптимизиран за задачи с код и английски език.",
"google/text-multilingual-embedding-002.description": "Многоезичен модел за вграждане на текст, оптимизиран за задачи с кръстосан езиков обхват на много езици.",
"gpt-3.5-turbo-0125.description": "GPT 3.5 Turbo за генериране и разбиране на текст; в момента сочи към gpt-3.5-turbo-0125.",
"gpt-3.5-turbo-0613.description": "GPT 3.5 Turbo е бърз и ефективен модел за различни задачи.",
"gpt-3.5-turbo-1106.description": "GPT 3.5 Turbo за генериране и разбиране на текст; в момента сочи към gpt-3.5-turbo-0125.",
"gpt-3.5-turbo-instruct.description": "GPT 3.5 Turbo за задачи с генериране и разбиране на текст, оптимизиран за следване на инструкции.",
"gpt-3.5-turbo.description": "GPT 3.5 Turbo за генериране и разбиране на текст; в момента сочи към gpt-3.5-turbo-0125.",
@@ -614,10 +634,12 @@
"gpt-4-1106-preview.description": "Най-новият GPT-4 Turbo добавя възможности за визуално разпознаване. Визуалните заявки поддържат JSON режим и извикване на функции. Това е рентабилен мултимодален модел, който балансира точността и ефективността за приложения в реално време.",
"gpt-4-32k-0613.description": "GPT-4 предлага по-голям контекстов прозорец за обработка на по-дълги входове в сценарии, изискващи интеграция на широка информация и анализ на данни.",
"gpt-4-32k.description": "GPT-4 предлага по-голям контекстов прозорец за обработка на по-дълги входове в сценарии, изискващи интеграция на широка информация и анализ на данни.",
"gpt-4-o-preview.description": "GPT-4o е най-усъвършенстваният мултимодален модел, който обработва текстови и визуални входове.",
"gpt-4-turbo-2024-04-09.description": "Най-новият GPT-4 Turbo добавя възможности за визуално разпознаване. Визуалните заявки поддържат JSON режим и извикване на функции. Това е рентабилен мултимодален модел, който балансира точността и ефективността за приложения в реално време.",
"gpt-4-turbo-preview.description": "Най-новият GPT-4 Turbo добавя възможности за визуално разпознаване. Визуалните заявки поддържат JSON режим и извикване на функции. Това е рентабилен мултимодален модел, който балансира точността и ефективността за приложения в реално време.",
"gpt-4-turbo.description": "Най-новият GPT-4 Turbo добавя възможности за визуално разпознаване. Визуалните заявки поддържат JSON режим и извикване на функции. Това е рентабилен мултимодален модел, който балансира точността и ефективността за приложения в реално време.",
"gpt-4-vision-preview.description": "Предварителен преглед на GPT-4 Vision, създаден за задачи по анализ и обработка на изображения.",
"gpt-4.1-2025-04-14.description": "GPT-4.1 е водещият модел за сложни задачи, идеален за междудисциплинарно решаване на проблеми.",
"gpt-4.1-mini.description": "GPT-4.1 mini балансира интелигентност, скорост и цена, което го прави привлекателен за множество приложения.",
"gpt-4.1-nano.description": "GPT-4.1 nano е най-бързият и най-рентабилен модел от серията GPT-4.1.",
"gpt-4.1.description": "GPT-4.1 е водещият ни модел за сложни задачи и решаване на проблеми в различни области.",
@@ -627,6 +649,7 @@
"gpt-4o-2024-08-06.description": "ChatGPT-4o е динамичен модел, актуализиран в реално време. Съчетава силно езиково разбиране и генериране за мащабни приложения като клиентска поддръжка, образование и техническа помощ.",
"gpt-4o-2024-11-20.description": "ChatGPT-4o е динамичен модел, актуализиран в реално време, който съчетава силно разбиране и генериране за мащабни приложения като клиентска поддръжка, образование и техническа помощ.",
"gpt-4o-audio-preview.description": "Предварителен преглед на GPT-4o Audio модел с аудио вход и изход.",
"gpt-4o-mini-2024-07-18.description": "GPT-4o mini е икономично решение за широк спектър от текстови и визуални задачи.",
"gpt-4o-mini-audio-preview.description": "GPT-4o mini Audio модел с аудио вход и изход.",
"gpt-4o-mini-realtime-preview.description": "GPT-4o-mini вариант в реално време с аудио и текстов вход/изход в реално време.",
"gpt-4o-mini-search-preview.description": "GPT-4o mini Search Preview е обучен да разбира и изпълнява заявки за уеб търсене чрез Chat Completions API. Уеб търсенето се таксува на извикване на инструмент в допълнение към разходите за токени.",
@@ -779,6 +802,49 @@
"llava.description": "LLaVA е мултимодален модел, комбиниращ визуален енкодер и Vicuna за силно разбиране на визия и език.",
"llava:13b.description": "LLaVA е мултимодален модел, комбиниращ визуален енкодер и Vicuna за силно разбиране на визия и език.",
"llava:34b.description": "LLaVA е мултимодален модел, комбиниращ визуален енкодер и Vicuna за силно разбиране на визия и език.",
"magistral-medium-latest.description": "Magistral Medium 1.2 е авангарден модел за разсъждение от Mistral AI (септември 2025) с поддръжка на визуални данни.",
"magistral-small-2509.description": "Magistral Small 1.2 е малък, с отворен код модел за разсъждение от Mistral AI (септември 2025) с поддръжка на визуални данни.",
"mathstral.description": "MathΣtral е създаден за научни изследвания и математическо разсъждение, с мощни изчислителни и обяснителни способности.",
"max-32k.description": "Spark Max 32K предлага обработка на голям контекст с по-добро разбиране и логическо разсъждение, поддържайки входове до 32K токена за четене на дълги документи и въпроси с частни знания.",
"megrez-3b-instruct.description": "Megrez 3B Instruct е малък, ефективен модел от Wuwen Xinqiong.",
"meituan/longcat-flash-chat.description": "Модел с отворен код от Meituan, оптимизиран за диалог и агентски задачи, силен в използването на инструменти и сложни многократни взаимодействия.",
"meta-llama-3-70b-instruct.description": "Мощен модел с 70 милиарда параметъра, който се отличава в разсъждение, програмиране и широк спектър от езикови задачи.",
"meta-llama-3-8b-instruct.description": "Универсален модел с 8 милиарда параметъра, оптимизиран за чат и генериране на текст.",
"meta-llama-3.1-405b-instruct.description": "Llama 3.1 е текстов модел, обучен с инструкции, оптимизиран за многоезичен чат, с високи резултати в индустриалните бенчмаркове сред отворени и затворени модели.",
"meta-llama-3.1-70b-instruct.description": "Llama 3.1 е текстов модел, обучен с инструкции, оптимизиран за многоезичен чат, с високи резултати в индустриалните бенчмаркове сред отворени и затворени модели.",
"meta-llama-3.1-8b-instruct.description": "Llama 3.1 е текстов модел, обучен с инструкции, оптимизиран за многоезичен чат, с високи резултати в индустриалните бенчмаркове сред отворени и затворени модели.",
"meta-llama/Llama-2-13b-chat-hf.description": "LLaMA-2 Chat (13B) предлага силна езикова обработка и стабилно чат изживяване.",
"meta-llama/Llama-2-70b-hf.description": "LLaMA-2 предлага силна езикова обработка и стабилно взаимодействие.",
"meta-llama/Llama-3-70b-chat-hf.description": "Llama 3 70B Instruct Reference е мощен чат модел за сложни диалози.",
"meta-llama/Llama-3-8b-chat-hf.description": "Llama 3 8B Instruct Reference предлага многоезична поддръжка и обширни познания в различни области.",
"meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo.description": "LLaMA 3.2 е създаден за задачи, съчетаващи визия и текст. Отличава се в описване на изображения и визуални въпроси, свързвайки езиковото генериране с визуалното разсъждение.",
"meta-llama/Llama-3.2-3B-Instruct-Turbo.description": "LLaMA 3.2 е създаден за задачи, съчетаващи визия и текст. Отличава се в описване на изображения и визуални въпроси, свързвайки езиковото генериране с визуалното разсъждение.",
"meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo.description": "LLaMA 3.2 е създаден за задачи, съчетаващи визия и текст. Отличава се в описване на изображения и визуални въпроси, свързвайки езиковото генериране с визуалното разсъждение.",
"meta-llama/Llama-3.3-70B-Instruct-Turbo.description": "Meta Llama 3.3 е многоезичен LLM с 70 милиарда параметъра (текстов вход/изход), предварително обучен и настроен с инструкции. Версията, обучена с инструкции, е оптимизирана за многоезичен чат и превъзхожда много отворени и затворени модели в индустриалните бенчмаркове.",
"meta-llama/Llama-Vision-Free.description": "LLaMA 3.2 е създаден за задачи, съчетаващи визия и текст. Отличава се в описване на изображения и визуални въпроси, свързвайки езиковото генериране с визуалното разсъждение.",
"meta-llama/Meta-Llama-3-70B-Instruct-Lite.description": "Llama 3 70B Instruct Lite е създаден за висока производителност с ниска латентност.",
"meta-llama/Meta-Llama-3-70B-Instruct-Turbo.description": "Llama 3 70B Instruct Turbo предлага силно разбиране и генериране за най-взискателните натоварвания.",
"meta-llama/Meta-Llama-3-8B-Instruct-Lite.description": "Llama 3 8B Instruct Lite балансира производителността за среди с ограничени ресурси.",
"meta-llama/Meta-Llama-3-8B-Instruct-Turbo.description": "Llama 3 8B Instruct Turbo е високопроизводителен LLM за широк спектър от приложения.",
"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo.description": "Моделът Llama 3.1 Turbo с 405 милиарда параметъра предлага огромен контекстов капацитет за обработка на големи данни и се отличава в мащабни AI приложения.",
"meta-llama/Meta-Llama-3.1-405B-Instruct.description": "Llama 3.1 е водещото семейство модели на Meta, достигащо до 405 милиарда параметъра за сложни диалози, многоезичен превод и анализ на данни.",
"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo.description": "Llama 3.1 70B е фино настроен за приложения с високо натоварване; FP8 квантизацията осигурява ефективни изчисления и точност при сложни сценарии.",
"meta-llama/Meta-Llama-3.1-70B.description": "Llama 3.1 е водещото семейство модели на Meta, достигащо до 405 милиарда параметъра за сложни диалози, многоезичен превод и анализ на данни.",
"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo.description": "Llama 3.1 8B използва FP8 квантизация, поддържа до 131 072 токена контекст и е сред водещите отворени модели за сложни задачи според множество бенчмаркове.",
"meta-llama/llama-3-70b-instruct.description": "Llama 3 70B Instruct е оптимизиран за висококачествени диалози и показва отлични резултати в човешки оценки.",
"meta-llama/llama-3-8b-instruct.description": "Llama 3 8B Instruct е оптимизиран за висококачествени диалози, превъзхождайки много затворени модели.",
"meta-llama/llama-3.1-70b-instruct.description": "Най-новата серия Llama 3.1 на Meta, 70B вариант, обучен с инструкции, оптимизиран за висококачествени диалози. В индустриални оценки показва силна производителност спрямо водещи затворени модели. (Достъпен само за потвърдени бизнес потребители.)",
"meta-llama/llama-3.1-8b-instruct.description": "Най-новата серия Llama 3.1 на Meta, 8B вариант, обучен с инструкции, е особено бърз и ефективен. В индустриални оценки показва силна производителност, надминавайки много водещи затворени модели. (Достъпен само за потвърдени бизнес потребители.)",
"meta-llama/llama-3.1-8b-instruct:free.description": "LLaMA 3.1 предлага многоезична поддръжка и е сред водещите генеративни модели.",
"meta-llama/llama-3.2-11b-vision-instruct.description": "LLaMA 3.2 е създаден за задачи, съчетаващи визия и текст. Отличава се в описване на изображения и визуални въпроси, свързвайки езиковото генериране с визуалното разсъждение.",
"meta-llama/llama-3.2-3b-instruct.description": "meta-llama/llama-3.2-3b-instruct",
"meta-llama/llama-3.2-90b-vision-instruct.description": "LLaMA 3.2 е създаден за задачи, съчетаващи визия и текст. Отличава се в описване на изображения и визуални въпроси, свързвайки езиковото генериране с визуалното разсъждение.",
"meta-llama/llama-3.3-70b-instruct.description": "Llama 3.3 е най-усъвършенстваният многоезичен отворен модел от серията Llama, предлагащ производителност, близка до 405B, на много ниска цена. Базиран е на Transformer архитектура и подобрен чрез SFT и RLHF за полезност и безопасност. Версията, обучена с инструкции, е оптимизирана за многоезичен чат и превъзхожда много отворени и затворени модели в индустриалните бенчмаркове. Край на знанията: декември 2023.",
"meta-llama/llama-3.3-70b-instruct:free.description": "Llama 3.3 е най-усъвършенстваният многоезичен отворен модел от серията Llama, предлагащ производителност, близка до 405B, на много ниска цена. Базиран е на Transformer архитектура и подобрен чрез SFT и RLHF за полезност и безопасност. Версията, обучена с инструкции, е оптимизирана за многоезичен чат и превъзхожда много отворени и затворени модели в индустриалните бенчмаркове. Край на знанията: декември 2023.",
"meta.llama3-1-405b-instruct-v1:0.description": "Meta Llama 3.1 405B Instruct е най-големият и най-мощен модел от серията Llama 3.1 Instruct – изключително напреднал модел за диалогово разсъждение и генериране на синтетични данни, отлична основа за дообучение в специфични домейни. Многоезичните LLM модели Llama 3.1 са предварително обучени и настроени с инструкции в размери 8B, 70B и 405B (текстов вход/изход). Моделите, обучени с инструкции, са оптимизирани за многоезичен диалог и превъзхождат много отворени чат модели в индустриалните бенчмаркове. Llama 3.1 е предназначен за търговска и изследователска употреба на различни езици. Моделите, обучени с инструкции, са подходящи за чат в стил асистент, докато предварително обучените модели са подходящи за по-широки задачи по генериране на естествен език. Изходите от Llama 3.1 могат да се използват и за подобряване на други модели, включително чрез генериране и прецизиране на синтетични данни. Llama 3.1 е автогенеративен Transformer модел с оптимизирана архитектура. Настроените версии използват SFT и RLHF за съответствие с човешките предпочитания за полезност и безопасност.",
"meta.llama3-1-70b-instruct-v1:0.description": "Обновен Meta Llama 3.1 70B Instruct с разширен контекст до 128K токена, многоезична поддръжка и подобрено разсъждение. Многоезичните LLM модели Llama 3.1 са предварително обучени и настроени с инструкции в размери 8B, 70B и 405B (текстов вход/изход). Моделите, обучени с инструкции, са оптимизирани за многоезичен диалог и превъзхождат много отворени чат модели в индустриалните бенчмаркове. Llama 3.1 е предназначен за търговска и изследователска употреба на различни езици. Моделите, обучени с инструкции, са подходящи за чат в стил асистент, докато предварително обучените модели са подходящи за по-широки задачи по генериране на естествен език. Изходите от Llama 3.1 могат да се използват и за подобряване на други модели, включително чрез генериране и прецизиране на синтетични данни. Llama 3.1 е автогенеративен Transformer модел с оптимизирана архитектура. Настроените версии използват SFT и RLHF за съответствие с човешките предпочитания за полезност и безопасност.",
"meta.llama3-1-8b-instruct-v1:0.description": "Обновен Meta Llama 3.1 8B Instruct с контекст до 128K токена, многоезична поддръжка и подобрено разсъждение. Семейството Llama 3.1 включва 8B, 70B и 405B модели, обучени с инструкции, оптимизирани за многоезичен чат и висока производителност в бенчмаркове. Предназначен е за търговска и изследователска употреба на различни езици; моделите, обучени с инструкции, са подходящи за чат в стил асистент, а предварително обучените – за по-широки задачи по генериране. Изходите от Llama 3.1 могат да се използват и за подобряване на други модели (напр. синтетични данни и прецизиране). Това е автогенеративен Transformer модел с SFT и RLHF за съответствие с човешките предпочитания за полезност и безопасност.",
"meta.llama3-70b-instruct-v1:0.description": "Meta Llama 3 е отворен LLM за разработчици, изследователи и предприятия, създаден да им помага да изграждат, експериментират и отговорно мащабират идеи в генеративния AI. Като част от основата за глобални иновации, той е подходящ за създаване на съдържание, разговорен AI, езиково разбиране, научноизследователска и развойна дейност и бизнес приложения.",
"meta.llama3-8b-instruct-v1:0.description": "Meta Llama 3 е отворен LLM, предназначен за разработчици, изследователи и предприятия, създаден да им помага да изграждат, експериментират и отговорно мащабират идеи за генеративен ИИ. Като част от основата за глобални иновации в общността, той е подходящ за среди с ограничени изчислителни ресурси, крайни устройства и по-бързо обучение.",
"meta/Llama-3.2-11B-Vision-Instruct.description": "Силен визуален анализ на изображения с висока резолюция, подходящ за приложения за визуално разбиране.",
"meta/Llama-3.2-90B-Vision-Instruct.description": "Разширен визуален анализ за приложения с агенти за визуално разбиране.",
@@ -820,6 +886,7 @@
"mimo-v2-flash.description": "MiMo-V2-Flash: Ефективен модел за разсъждение, програмиране и основи на агентни системи.",
"minicpm-v.description": "MiniCPM-V е следващо поколение мултимодален модел на OpenBMB с отлични OCR и мултимодални възможности за широк спектър от приложения.",
"minimax-m2.1.description": "MiniMax-M2.1 е най-новата версия от серията MiniMax, оптимизирана за многоезично програмиране и реални сложни задачи. Като AI-нативен модел, MiniMax-M2.1 постига значителни подобрения в производителността, поддръжката на агентни рамки и адаптацията към различни сценарии, с цел да помогне на предприятия и индивидуални потребители да открият AI-нативен начин на работа и живот по-бързо.",
"minimax-m2.5.description": "MiniMax-M2.5 е съвременен голям езиков модел, проектиран за реална продуктивност и задачи за програмиране.",
"minimax-m2.description": "MiniMax M2 е ефективен голям езиков модел, създаден специално за програмиране и агентни работни потоци.",
"minimax/minimax-m2.1.description": "MiniMax-M2.1 е лек, авангарден голям езиков модел, оптимизиран за програмиране, агентни работни потоци и съвременно разработване на приложения, осигуряващ по-чист, по-кратък изход и по-бърза реакция.",
"minimax/minimax-m2.description": "MiniMax-M2 е високостойностен модел, който се отличава в програмиране и агентни задачи в множество инженерни сценарии.",
@@ -1046,6 +1113,7 @@
"qwen3-14b.description": "Qwen3 14B е среден по размер модел за многоезични въпроси и отговори и генериране на текст.",
"qwen3-235b-a22b-instruct-2507.description": "Qwen3 235B A22B Instruct 2507 е водещ модел с инструкции за широк спектър от задачи по генериране и разсъждение.",
"qwen3-235b-a22b-thinking-2507.description": "Qwen3 235B A22B Thinking 2507 е ултраголям модел за дълбоко разсъждение.",
"qwen3-235b-a22b.description": "Qwen3 е следващо поколение модел Tongyi Qwen с големи подобрения в разсъждението, общите способности, агентските възможности и многоезичната производителност, с поддръжка на превключване между мисловни режими.",
"qwen3-30b-a3b-instruct-2507.description": "Qwen3 30B A3B Instruct 2507 е средно-голям модел с инструкции за висококачествено генериране и въпроси и отговори.",
"qwen3-30b-a3b-thinking-2507.description": "Qwen3 30B A3B Thinking 2507 е средно-голям модел за разсъждение, балансиращ точност и разходи.",
"qwen3-30b-a3b.description": "Qwen3 30B A3B е средно-голям универсален модел, балансиращ между цена и качество.",
@@ -1057,6 +1125,7 @@
"qwen3-coder-flash.description": "Модел за програмиране Qwen. Най-новата серия Qwen3-Coder е базирана на Qwen3 и предлага силни способности за програмиране чрез агенти, използване на инструменти и взаимодействие със среди за автономно програмиране, с отлично представяне при код и стабилни общи възможности.",
"qwen3-coder-plus.description": "Модел за програмиране Qwen. Най-новата серия Qwen3-Coder е базирана на Qwen3 и предлага силни способности за програмиране чрез агенти, използване на инструменти и взаимодействие със среди за автономно програмиране, с отлично представяне при код и стабилни общи възможности.",
"qwen3-coder:480b.description": "Високопроизводителен модел на Alibaba с дълъг контекст за задачи с агенти и програмиране.",
"qwen3-max-2026-01-23.description": "Моделите Qwen3 Max предлагат значителни подобрения спрямо серията 2.5 в общите способности, разбиране на китайски/английски, следване на сложни инструкции, субективни отворени задачи, многоезичност и използване на инструменти, с по-малко халюцинации. Най-новият qwen3-max подобрява агентското програмиране и използването на инструменти спрямо qwen3-max-preview. Това издание достига върхови резултати в областта и е насочено към по-сложни нужди на агентите.",
"qwen3-max-preview.description": "Най-добре представящият се модел Qwen за сложни, многоетапни задачи. Прегледната версия поддържа разсъждение.",
"qwen3-max.description": "Моделите Qwen3 Max предлагат значителни подобрения спрямо серията 2.5 в общите способности, разбиране на китайски/английски, следване на сложни инструкции, субективни отворени задачи, многоезичност и използване на инструменти, с по-малко халюцинации. Най-новият qwen3-max подобрява програмирането чрез агенти и използването на инструменти спрямо qwen3-max-preview. Тази версия достига водещи резултати в индустрията и е насочена към по-сложни нужди на агентите.",
"qwen3-next-80b-a3b-instruct.description": "Следващо поколение отворен модел Qwen3 без мисловни способности. В сравнение с предишната версия (Qwen3-235B-A22B-Instruct-2507), предлага по-добро разбиране на китайски, по-силна логическа аргументация и подобрено генериране на текст.",
@@ -1079,6 +1148,7 @@
"qwq.description": "QwQ е модел за аргументация от семейството на Qwen. В сравнение със стандартните модели, обучени с инструкции, предлага мисловни и логически способности, които значително подобряват ефективността при трудни задачи. QwQ-32B е среден по размер модел, който се конкурира с водещи модели като DeepSeek-R1 и o1-mini.",
"qwq_32b.description": "Среден по размер модел за аргументация от семейството на Qwen. В сравнение със стандартните модели, обучени с инструкции, мисловните и логическите способности на QwQ значително подобряват ефективността при трудни задачи.",
"r1-1776.description": "R1-1776 е дообучен вариант на DeepSeek R1, създаден да предоставя неконфронтирана, обективна и фактическа информация.",
"seedance-1-5-pro-251215.description": "Seedance 1.5 Pro от ByteDance поддържа генериране на видео от текст, от изображение към видео (първи кадър, първи+последен кадър) и синхронизирано с визуалното съдържание аудио.",
"solar-mini-ja.description": "Solar Mini (Ja) разширява Solar Mini с фокус върху японски език, като запазва ефективността и силната производителност на английски и корейски.",
"solar-mini.description": "Solar Mini е компактен LLM, който превъзхожда GPT-3.5, с мощни многоезични възможности, поддържащ английски и корейски, и предлага ефективно решение с малък отпечатък.",
"solar-pro.description": "Solar Pro е интелигентен LLM от Upstage, фокусиран върху следване на инструкции на един GPU, с IFEval резултати над 80. Понастоящем поддържа английски; пълното издание е планирано за ноември 2024 с разширена езикова поддръжка и по-дълъг контекст.",
@@ -1135,6 +1205,7 @@
"us.anthropic.claude-3-5-sonnet-20241022-v2:0.description": "Claude 3.5 Sonnet поставя нов стандарт в индустрията, надминавайки конкурентите и Claude 3 Opus в широки оценки, като запазва средна скорост и цена.",
"us.anthropic.claude-3-7-sonnet-20250219-v1:0.description": "Claude 3.7 Sonnet е най-бързият модел от ново поколение на Anthropic. В сравнение с Claude 3 Haiku, подобрява всички умения и надминава предишния флагман Claude 3 Opus в много интелектуални бенчмаркове.",
"us.anthropic.claude-haiku-4-5-20251001-v1:0.description": "Claude Haiku 4.5 е най-бързият и интелигентен Haiku модел на Anthropic, с мълниеносна скорост и разширено мислене.",
"us.anthropic.claude-opus-4-6-v1.description": "Claude Opus 4.6 е най-интелигентният модел на Anthropic за изграждане на агенти и програмиране.",
"us.anthropic.claude-sonnet-4-5-20250929-v1:0.description": "Claude Sonnet 4.5 е най-интелигентният модел на Anthropic до момента.",
"v0-1.0-md.description": "v0-1.0-md е наследен модел, достъпен чрез v0 API.",
"v0-1.5-lg.description": "v0-1.5-lg е подходящ за напреднали мисловни или логически задачи.",
@@ -1180,6 +1251,7 @@
"z-ai/glm-4.5.description": "GLM 4.5 е флагманският модел на Z.AI с хибридно разсъждение, оптимизиран за инженерни и задачи с дълъг контекст.",
"z-ai/glm-4.6.description": "GLM 4.6 е флагманският модел на Z.AI с разширен контекст и подобрени възможности за програмиране.",
"z-ai/glm-4.7.description": "GLM-4.7 е най-новият водещ модел на Zhipu, предлагащ подобрени общи възможности, по-прости и естествени отговори и по-завладяващо писмено изживяване.",
"z-ai/glm5.description": "Силен модел за разсъждение и агентски задачи от Z.ai с общо 744B параметри (40B активни), създаден за сложни системни инженерни задачи и дългосрочни задачи.",
"zai-org/GLM-4.5-Air.description": "GLM-4.5-Air е базов модел за агентни приложения с архитектура Mixture-of-Experts. Оптимизиран е за използване на инструменти, уеб браузване, софтуерно инженерство и фронтенд програмиране, и се интегрира с кодови агенти като Claude Code и Roo Code. Използва хибридно разсъждение за справяне както със сложни, така и с ежедневни задачи.",
"zai-org/GLM-4.5.description": "GLM-4.5 е базов модел, създаден за агентни приложения с архитектура Mixture-of-Experts. Дълбоко оптимизиран за използване на инструменти, уеб браузване, софтуерно инженерство и фронтенд програмиране, и се интегрира с кодови агенти като Claude Code и Roo Code. Използва хибридно разсъждение за справяне както със сложни, така и с ежедневни задачи.",
"zai-org/GLM-4.5V.description": "GLM-4.5V е най-новият визуален езиков модел (VLM) на Zhipu AI, изграден върху флагманския текстов модел GLM-4.5-Air (106B общо, 12B активни) с MoE архитектура за висока производителност при по-ниска цена. Следва пътя на GLM-4.1V-Thinking и добавя 3D-RoPE за подобрено пространствено разсъждение в 3D. Оптимизиран чрез предварително обучение, SFT и RL, обработва изображения, видео и дълги документи и е сред водещите отворени модели в 41 публични мултимодални бенчмарка. Режимът Thinking позволява на потребителите да балансират между скорост и дълбочина.",
+1
View File
@@ -30,6 +30,7 @@
"internlm.description": "Open-source организация, фокусирана върху изследвания и инструменти за големи модели, предоставяща ефективна и лесна за използване платформа за достъп до водещи модели и алгоритми.",
"jina.description": "Основана през 2020 г., Jina AI е водеща компания в областта на търсещия AI. Технологичният ѝ стек включва векторни модели, преоценители и малки езикови модели за създаване на надеждни генеративни и мултимодални търсещи приложения.",
"lmstudio.description": "LM Studio е десктоп приложение за разработка и експериментиране с LLM на вашия компютър.",
"lobehub.description": "LobeHub Cloud използва официални API-та за достъп до AI модели и измерва използването чрез Кредити, свързани с токени на модела.",
"minimax.description": "Основана през 2021 г., MiniMax създава универсален AI с мултимодални базови модели, включително текстови модели с трилиони параметри, речеви и визуални модели, както и приложения като Hailuo AI.",
"mistral.description": "Mistral предлага усъвършенствани универсални, специализирани и изследователски модели за сложни разсъждения, многоезични задачи и генериране на код, с извикване на функции за персонализирани интеграции.",
"modelscope.description": "ModelScope е платформа на Alibaba Cloud за модели като услуга, предлагаща широка гама от AI модели и услуги за инференция.",
+1
View File
@@ -14,6 +14,7 @@
"table.columns.totalTokens": "Използвани токени",
"table.columns.type.enums.chat": "Генериране на текст",
"table.columns.type.enums.imageGeneration": "Генериране на изображения",
"table.columns.type.enums.videoGeneration": "Генериране на видео",
"table.columns.type.title": "Тип",
"table.desc": "Подробности за използването на изчислителни кредити за генериране на текст, вграждане, генериране на изображения и др.",
"table.more": "Виж подробности",
+6
View File
@@ -131,6 +131,12 @@
"limitation.providers.prompter.subTitle": "Персонализираната API услуга е достъпна само за платени планове. Надстрой сега, за да използваш глобални водещи модели",
"limitation.providers.prompter.title": "Абонирай се сега, за да използваш персонализирана API услуга",
"limitation.providers.tooltip": "Персонализираната API услуга е достъпна само за платени планове",
"limitation.video.success.action": "Продължи с генерирането",
"limitation.video.success.desc": "Вашият абонамент {{plan}} беше успешно надграден. Насладете се на AI видео генериране. Текущият ви план включва:",
"limitation.video.success.title": "Успешно надграждане",
"limitation.video.topupSuccess.action": "Продължи с генерирането",
"limitation.video.topupSuccess.desc": "Вашите допълнителни кредити вече са активни. Насладете се на AI видео генериране. Текущият ви план включва:",
"limitation.video.topupSuccess.title": "Успешно зареждане",
"modelPricing.button": "Виж документацията за ценообразуване",
"modelPricing.desc": "{{name}} използва кредити за измерване на използването на AI модел. Таблицата по-долу показва изчислителните кредити на 1M токена.",
"modelPricing.title": "Цени на текстови модели",
+35
View File
@@ -86,6 +86,10 @@
"localFiles.editFile.replaceFirst": "Замени само първото срещане",
"localFiles.file": "Файл",
"localFiles.folder": "Папка",
"localFiles.globFiles.pattern": "Шаблон",
"localFiles.grepContent.glob": "Филтър за файлове",
"localFiles.grepContent.pattern": "Шаблон за търсене",
"localFiles.grepContent.type": "Тип файл",
"localFiles.moveFiles.itemsMoved": "{{count}} елемент(а) преместени:",
"localFiles.moveFiles.itemsMoved_one": "{{count}} елемент преместен:",
"localFiles.moveFiles.itemsMoved_other": "{{count}} елемента преместени:",
@@ -95,11 +99,17 @@
"localFiles.open": "Отвори",
"localFiles.openFile": "Отвори файл",
"localFiles.openFolder": "Отвори папка",
"localFiles.outOfScope.requestedPaths": "Заявени пътища",
"localFiles.outOfScope.warning": "Предупреждение: Следните пътища са извън конфигурираната работна директория. Моля, потвърдете, че желаете да разрешите достъп.",
"localFiles.outOfScope.workingDirectory": "Работна директория",
"localFiles.read.more": "Виж повече",
"localFiles.readFile": "Прочети файл",
"localFiles.readFile.lineRange": "Редове {{start}} - {{end}}",
"localFiles.readFileError": "Неуспешно четене на файл, моля проверете дали пътят е правилен",
"localFiles.readFiles": "Прочети файлове",
"localFiles.readFilesError": "Неуспешно четене на файлове, моля проверете дали пътят е правилен",
"localFiles.searchFiles.keywords": "Ключови думи",
"localFiles.securityBlacklist.warning": "Сигнал за сигурност: Тази операция е маркирана от правилата за сигурност и изисква вашето изрично одобрение.",
"localFiles.writeFile.characters": "знаци",
"localFiles.writeFile.preview": "Преглед на съдържанието",
"localFiles.writeFile.truncated": "съкратено",
@@ -136,6 +146,31 @@
"search.summary": "Обобщение",
"search.summaryTooltip": "Обобщи текущото съдържание",
"search.viewMoreResults": "Виж още {{results}} резултата",
"securityBlacklist.awsCredentials": "Достъпът до AWS идентификационни данни може да изтече ключове за достъп до облака",
"securityBlacklist.browserCredentials": "Достъпът до съхранени в браузъра идентификационни данни може да разкрие пароли",
"securityBlacklist.chownSystemDirs": "Промяната на собствеността на системни директории е опасна",
"securityBlacklist.ddDiskWrite": "Записването на произволни данни върху дискови устройства може да унищожи данни",
"securityBlacklist.directMemoryAccess": "Директният достъп до паметта е изключително опасен",
"securityBlacklist.disableFirewall": "Изключването на защитната стена излага системата на атаки",
"securityBlacklist.dockerConfig": "Четенето на Docker конфигурация може да разкрие идентификационни данни за регистъра",
"securityBlacklist.envFiles": "Четенето на .env файлове може да разкрие чувствителни идентификационни данни и API ключове",
"securityBlacklist.etcPasswd": "Промяната на /etc/passwd може да ви заключи извън системата",
"securityBlacklist.forkBomb": "Fork бомба може да срине системата",
"securityBlacklist.formatPartition": "Форматирането на системни дялове ще унищожи данни",
"securityBlacklist.gcpCredentials": "Четенето на GCP идентификационни данни може да разкрие ключове за достъп до облачни услуги",
"securityBlacklist.gitCredentials": "Четенето на Git файл с идентификационни данни може да разкрие токени за достъп",
"securityBlacklist.historyFiles": "Четенето на файлове с история може да разкрие чувствителни команди и идентификационни данни",
"securityBlacklist.kernelParams": "Промяната на параметри на ядрото без разбиране може да срине системата",
"securityBlacklist.kubeConfig": "Четенето на Kubernetes конфигурация може да разкрие идентификационни данни за клъстера",
"securityBlacklist.npmrc": "Четенето на npm токен файл може да разкрие идентификационни данни за регистъра на пакети",
"securityBlacklist.removeSystemPackages": "Премахването на основни системни пакети може да повреди системата",
"securityBlacklist.rmForceRecursive": "Принудително рекурсивно изтриване без конкретна цел е твърде опасно",
"securityBlacklist.rmHomeDir": "Рекурсивното изтриване на домашната директория е изключително опасно",
"securityBlacklist.rmRootDir": "Рекурсивното изтриване на root директорията ще унищожи системата",
"securityBlacklist.sshConfig": "Промяната на SSH конфигурацията може да ви заключи извън системата",
"securityBlacklist.sshPrivateKeys": "Четенето на SSH частни ключове може да компрометира сигурността на системата",
"securityBlacklist.sudoers": "Промяната на файла sudoers без подходяща проверка е опасна",
"securityBlacklist.suidShells": "Задаването на SUID на shell-ове или интерпретатори е риск за сигурността",
"updateArgs.duplicateKeyError": "Ключът на полето трябва да е уникален",
"updateArgs.form.add": "Добави елемент",
"updateArgs.form.key": "Ключ на полето",
+28
View File
@@ -0,0 +1,28 @@
{
"config.aspectRatio.label": "Съотношение на страните",
"config.cameraFixed.label": "Фиксирана камера",
"config.duration.label": "Продължителност",
"config.endImageUrl.label": "Крайна рамка",
"config.generateAudio.label": "Генерирай аудио",
"config.header.title": "Видео",
"config.imageUrl.label": "Начална рамка",
"config.prompt.placeholder": "Опишете видеото, което искате да генерирате",
"config.referenceImage.label": "Референтно изображение",
"config.resolution.label": "Резолюция",
"config.seed.label": "Сийд",
"config.seed.random": "Случаен",
"generation.actions.copyError": "Копирай съобщението за грешка",
"generation.actions.errorCopied": "Съобщението за грешка е копирано в клипборда",
"generation.actions.errorCopyFailed": "Неуспешно копиране на съобщението за грешка",
"generation.actions.generate": "Генерирай",
"generation.freeQuota.exhausted": "🎁 Използвахте безплатната квота, ще се използват кредити",
"generation.freeQuota.remaining": "🎁 {{remaining}} безплатни видеа днес",
"generation.status.failed": "Генерирането неуспешно",
"generation.status.generating": "Генериране...",
"generation.validation.endFrameRequiresStartFrame": "Крайната рамка не може да се използва без начална рамка. Моля, задайте първо начална рамка.",
"topic.createNew": "Нова тема",
"topic.deleteConfirm": "Изтриване на видео тема",
"topic.deleteConfirmDesc": "Ще изтриете тази видео тема. Това действие не може да бъде отменено.",
"topic.title": "Видео теми",
"topic.untitled": "Тема по подразбиране"
}
+3 -2
View File
@@ -58,13 +58,13 @@
"duplicateTitle": "{{title}} Kopie",
"emptyAgent": "Noch keine Agenten. Beginnen Sie mit Ihrem ersten Agenten bauen Sie Ihr System nach und nach auf.",
"emptyAgentAction": "Agent erstellen",
"extendParams.disableContextCaching.desc": "Reduziert die Kosten pro Gespräch um bis zu 90 % und erhöht die Geschwindigkeit um bis zu das 4-Fache. Aktivieren Sie dies, um die Begrenzung der historischen Nachrichten automatisch zu deaktivieren. <1>Mehr erfahren</1>",
"extendParams.disableContextCaching.desc": "Reduzieren Sie die Kosten für die Generierung eines einzelnen Gesprächs um bis zu 90 % und erreichen Sie eine bis zu 4-fache Geschwindigkeit. <1>Mehr erfahren</1>",
"extendParams.disableContextCaching.title": "Kontext-Caching aktivieren",
"extendParams.effort.desc": "Steuern Sie mit dem Parameter 'Aufwand', wie viele Tokens Claude bei der Antwort verwendet.",
"extendParams.effort.title": "Aufwand",
"extendParams.enableAdaptiveThinking.desc": "Ermöglicht Claude im adaptiven Denkmodus dynamisch zu entscheiden, wann und wie intensiv gedacht wird.",
"extendParams.enableAdaptiveThinking.title": "Adaptives Denken aktivieren",
"extendParams.enableReasoning.desc": "Basierend auf der Begrenzung des Claude-Denkmechanismus deaktiviert diese Option automatisch die Begrenzung der historischen Nachrichten. <1>Mehr erfahren</1>",
"extendParams.enableReasoning.desc": "Basierend auf der Begrenzung des Claude-Denkmechanismus. <1>Mehr erfahren</1>",
"extendParams.enableReasoning.title": "Tiefes Denken aktivieren",
"extendParams.imageAspectRatio.title": "Bildseitenverhältnis",
"extendParams.imageResolution.title": "Bildauflösung",
@@ -165,6 +165,7 @@
"messageAction.delAndRegenerate": "Löschen und neu generieren",
"messageAction.deleteDisabledByThreads": "Diese Nachricht hat ein Unterthema und kann nicht gelöscht werden",
"messageAction.expand": "Nachricht ausklappen",
"messageAction.reaction": "Reaktion hinzufügen",
"messageAction.regenerate": "Neu generieren",
"messages.dm.sentTo": "Nur sichtbar für {{name}}",
"messages.dm.title": "Direktnachricht",
+2
View File
@@ -143,6 +143,7 @@
"cmdk.keywords.stats": "Statistiken Analyse Auswertung",
"cmdk.keywords.submitIssue": "Problem Fehler Feedback Anliegen",
"cmdk.keywords.usage": "Nutzung Statistik Verbrauch Kontingent",
"cmdk.keywords.video": "video,erstellen,seedance,kling",
"cmdk.memory": "Gedächtnis",
"cmdk.mentionAgent": "Agent erwähnen",
"cmdk.navigate": "Navigieren",
@@ -193,6 +194,7 @@
"cmdk.themeLight": "Hell",
"cmdk.toOpen": "Öffnen",
"cmdk.toSelect": "Auswählen",
"cmdk.video": "KI-Video",
"confirm": "Bestätigen",
"contact": "Kontaktieren Sie uns",
"copy": "Kopieren",
+31
View File
@@ -43,6 +43,8 @@
"FileManager.emptyStatus.or": "oder",
"FileManager.emptyStatus.title": "Dateien oder Ordner hierher ziehen",
"FileManager.noFolders": "Keine Ordner verfügbar",
"FileManager.search.noResults": "Keine Dateien gefunden",
"FileManager.search.placeholder": "Dateien durchsuchen...",
"FileManager.sort.dateAdded": "Hinzugefügt am",
"FileManager.sort.name": "Name",
"FileManager.sort.size": "Größe",
@@ -94,6 +96,35 @@
"ModelSelect.removed": "Das Modell ist nicht in der Liste. Es wird automatisch entfernt, wenn es abgewählt wird.",
"ModelSwitchPanel.byModel": "Nach Modell",
"ModelSwitchPanel.byProvider": "Nach Anbieter",
"ModelSwitchPanel.detail.abilities": "Fähigkeiten",
"ModelSwitchPanel.detail.abilities.files": "Dateien",
"ModelSwitchPanel.detail.abilities.functionCall": "Werkzeugaufruf",
"ModelSwitchPanel.detail.abilities.imageOutput": "Bildausgabe",
"ModelSwitchPanel.detail.abilities.reasoning": "Schlussfolgerung",
"ModelSwitchPanel.detail.abilities.search": "Suche",
"ModelSwitchPanel.detail.abilities.video": "Video",
"ModelSwitchPanel.detail.abilities.vision": "Visuelle Erkennung",
"ModelSwitchPanel.detail.config": "Modellkonfiguration",
"ModelSwitchPanel.detail.context": "Kontextlänge",
"ModelSwitchPanel.detail.pricing": "Preise",
"ModelSwitchPanel.detail.pricing.cachedInput": "Gecachter Input ${{amount}}/M",
"ModelSwitchPanel.detail.pricing.group.audio": "Audio",
"ModelSwitchPanel.detail.pricing.group.image": "Bild",
"ModelSwitchPanel.detail.pricing.group.text": "Text",
"ModelSwitchPanel.detail.pricing.input": "Input ${{amount}}/M",
"ModelSwitchPanel.detail.pricing.output": "Output ${{amount}}/M",
"ModelSwitchPanel.detail.pricing.unit.audioInput": "Audioeingabe",
"ModelSwitchPanel.detail.pricing.unit.audioInput_cacheRead": "Audioeingabe (Cache)",
"ModelSwitchPanel.detail.pricing.unit.audioOutput": "Audioausgabe",
"ModelSwitchPanel.detail.pricing.unit.imageGeneration": "Bilderzeugung",
"ModelSwitchPanel.detail.pricing.unit.imageInput": "Bildeingabe",
"ModelSwitchPanel.detail.pricing.unit.imageInput_cacheRead": "Bildeingabe (Cache)",
"ModelSwitchPanel.detail.pricing.unit.imageOutput": "Bildausgabe",
"ModelSwitchPanel.detail.pricing.unit.textInput": "Eingabe",
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Eingabe (Cache)",
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Eingabe (Cache-Schreiben)",
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Ausgabe",
"ModelSwitchPanel.detail.releasedAt": "Veröffentlicht am {{date}}",
"ModelSwitchPanel.emptyModel": "Kein Modell aktiviert. Bitte aktivieren Sie eines in den Einstellungen.",
"ModelSwitchPanel.emptyProvider": "Keine Anbieter aktiviert. Bitte aktivieren Sie einen in den Einstellungen.",
"ModelSwitchPanel.goToSettings": "Zu den Einstellungen",
+9
View File
@@ -150,6 +150,9 @@
"groupAgents.tag": "Gruppe",
"groupAgents.underReview": "Wird überprüft",
"home.communityAgents": "Community-Agenten",
"home.creatorReward.action": "Jetzt bewerben",
"home.creatorReward.subtitle": "Das Creator-Belohnungsprogramm 2026 ist offiziell gestartet.",
"home.creatorReward.title": "Kreieren. Teilen. Geld verdienen.",
"home.featuredAssistants": "Empfohlene Agenten",
"home.featuredModels": "Empfohlene Modelle",
"home.featuredPlugins": "Empfohlene Fähigkeiten",
@@ -194,6 +197,8 @@
"mcp.categories.tools.name": "Hilfsprogramme",
"mcp.categories.travel-transport.description": "Reiseplanung und Transport",
"mcp.categories.travel-transport.name": "Reise & Transport",
"mcp.categories.utility.description": "Wettervorhersage und meteorologische Dienste",
"mcp.categories.utility.name": "Dienstprogramme",
"mcp.categories.weather.description": "Wettervorhersage und meteorologische Dienste",
"mcp.categories.weather.name": "Wetter",
"mcp.categories.web-search.description": "Websuche und Informationsabruf",
@@ -478,6 +483,10 @@
"tab.plugin": "Fähigkeit",
"tab.provider": "Anbieter",
"tab.user": "Benutzer",
"time.formatOtherYear": "D. MMM YYYY",
"time.formatThisYear": "D. MMM",
"time.today": "Heute",
"time.yesterday": "Gestern",
"user.agents": "Agenten",
"user.downloads": "Downloads",
"user.editProfile": "Profil bearbeiten",
+1
View File
@@ -10,5 +10,6 @@
"starter.deepResearch": "Tiefgehende Recherche",
"starter.developing": "Demnächst verfügbar",
"starter.image": "Bild",
"starter.seedance": "Seedance 2.0",
"starter.write": "Schreiben"
}
+4 -1
View File
@@ -9,7 +9,10 @@
"addToKnowledgeBase.title": "Zur Bibliothek hinzufügen",
"addToKnowledgeBase.totalFiles": "{{count}} Dateien ausgewählt",
"createNew.confirm": "Neu erstellen",
"createNew.description.placeholder": "Bibliotheksbeschreibung (optional)",
"createNew.description.label": "Bibliotheksbeschreibung (optional)",
"createNew.description.placeholder": "Die Beschreibung hilft dem LLM, Ihre Bibliothek besser zu verstehen",
"createNew.edit.confirm": "Änderungen speichern",
"createNew.edit.title": "Bibliothek bearbeiten",
"createNew.formTitle": "Grundinformationen",
"createNew.name.placeholder": "Name der Bibliothek",
"createNew.name.required": "Bitte geben Sie einen Namen für die Bibliothek ein",
+4
View File
@@ -38,6 +38,10 @@
"messages.success.submit": "Autorisierung erfolgreich! Du kannst jetzt deinen Agenten veröffentlichen.",
"messages.success.upload": "Autorisierung erfolgreich! Du kannst jetzt eine neue Version veröffentlichen.",
"profileSetup.cancel": "Abbrechen",
"profileSetup.confirmChangeUserId.cancel": "Abbrechen",
"profileSetup.confirmChangeUserId.confirm": "Benutzer-ID ändern",
"profileSetup.confirmChangeUserId.description": "Sobald du zu @{{newId}} wechselst, kann jeder deine alte ID @{{oldId}} übernehmen und alle bestehenden Links zu deinem Profil werden ungültig. Dies kann nicht rückgängig gemacht werden. Bist du sicher, dass du fortfahren möchtest?",
"profileSetup.confirmChangeUserId.title": "Benutzer-ID ändern?",
"profileSetup.descriptionEdit": "Aktualisiere die Informationen deines Community-Profils.",
"profileSetup.descriptionFirstTime": "Richte dein Profil ein, um dein Community-Profil abzuschließen.",
"profileSetup.errors.fileTooLarge": "Dateigröße darf 2 MB nicht überschreiten",
+1 -1
View File
@@ -260,8 +260,8 @@
"providerModels.item.modelConfig.type.options.realtime": "Echtzeit-Chat",
"providerModels.item.modelConfig.type.options.stt": "Sprache-zu-Text",
"providerModels.item.modelConfig.type.options.text2music": "Text-zu-Musik",
"providerModels.item.modelConfig.type.options.text2video": "Text-zu-Video",
"providerModels.item.modelConfig.type.options.tts": "Text-zu-Sprache",
"providerModels.item.modelConfig.type.options.video": "Videoerstellung",
"providerModels.item.modelConfig.type.placeholder": "Bitte wählen Sie einen Modelltyp",
"providerModels.item.modelConfig.type.title": "Modelltyp",
"providerModels.item.modelConfig.video.extra": "Diese Einstellung aktiviert die Videorekognition innerhalb der Anwendung. Ob dies unterstützt wird, hängt vom Modell ab. Bitte testen Sie die Verfügbarkeit dieser Funktion.",
+41 -11
View File
@@ -74,7 +74,11 @@
"MiniMax-M1.description": "Ein neues Inhouse-Argumentationsmodell mit 80K Chain-of-Thought und 1M Eingabe, vergleichbar mit führenden globalen Modellen.",
"MiniMax-M2-Stable.description": "Entwickelt für effizientes Coden und Agenten-Workflows mit höherer Parallelität für den kommerziellen Einsatz.",
"MiniMax-M2.1-Lightning.description": "Leistungsstarke mehrsprachige Programmierfunktionen, umfassend verbesserte Programmiererfahrung. Schneller und effizienter.",
"MiniMax-M2.1-highspeed.description": "Leistungsstarke mehrsprachige Programmierfähigkeiten mit schnellerer und effizienterer Inferenz.",
"MiniMax-M2.1.description": "MiniMax-M2.1 ist das Flaggschiff unter den Open-Source-Großmodellen von MiniMax und konzentriert sich auf die Lösung komplexer Aufgaben aus der realen Welt. Seine zentralen Stärken liegen in der mehrsprachigen Programmierfähigkeit und der Fähigkeit, als Agent komplexe Aufgaben zu bewältigen.",
"MiniMax-M2.5-Lightning.description": "M2.5 Lightning: Gleiche Leistung, schneller und agiler (ca. 100 tps).",
"MiniMax-M2.5-highspeed.description": "Gleiche Leistung wie M2.5 mit deutlich schnellerer Inferenz.",
"MiniMax-M2.5.description": "Erstklassige Leistung und ultimative Kosteneffizienz, bewältigt mühelos komplexe Aufgaben (ca. 60 tps).",
"MiniMax-M2.description": "Speziell für effizientes Programmieren und Agenten-Workflows entwickelt",
"MiniMax-Text-01.description": "MiniMax-01 führt großskalige lineare Aufmerksamkeit über klassische Transformer hinaus ein. Mit 456B Parametern und 45,9B aktiv pro Durchlauf erreicht es Spitzenleistung und unterstützt bis zu 4M Token Kontext (32× GPT-4o, 20× Claude-3.5-Sonnet).",
"MiniMaxAI/MiniMax-M1-80k.description": "MiniMax-M1 ist ein Open-Weights-Modell für großskalige hybride Aufmerksamkeits- und Schlussfolgerungsaufgaben mit insgesamt 456 Milliarden Parametern und etwa 45,9 Milliarden aktiven Parametern pro Token. Es unterstützt nativ einen Kontext von 1 Million Tokens und nutzt Flash Attention, um die FLOPs bei der Generierung von 100.000 Tokens im Vergleich zu DeepSeek R1 um 75 % zu reduzieren. Durch die MoE-Architektur, CISPO und hybrides RL-Training erzielt es führende Leistungen bei Aufgaben mit langen Eingaben und realer Softwareentwicklung.",
@@ -107,6 +111,7 @@
"Pro/moonshotai/Kimi-K2-Thinking.description": "Kimi K2 Thinking Turbo ist die Turbo-Variante, die für hohe Geschwindigkeit und Durchsatz beim logischen Denken optimiert wurde, während die Fähigkeit zu mehrstufigem Denken und Werkzeugnutzung von K2 Thinking erhalten bleibt. Es handelt sich um ein MoE-Modell mit etwa 1 Billion Parametern, nativem 256K-Kontext und stabiler großskaliger Tool-Nutzung für Produktionsszenarien mit strengen Anforderungen an Latenz und Parallelität.",
"Pro/moonshotai/Kimi-K2.5.description": "Kimi K2.5 ist ein Open-Source-natives multimodales Agentenmodell, basierend auf Kimi-K2-Base, trainiert mit etwa 1,5 Billionen gemischten Bild- und Text-Tokens. Das Modell verwendet eine MoE-Architektur mit insgesamt 1 Billion Parametern und 32 Milliarden aktiven Parametern, unterstützt ein Kontextfenster von 256K und integriert nahtlos visuelle und sprachliche Verständnisfähigkeiten.",
"Pro/zai-org/glm-4.7.description": "GLM-4.7 ist Zhipus neue Flaggschiff-Generation mit insgesamt 355 Milliarden Parametern und 32 Milliarden aktiven Parametern. Das Modell wurde umfassend in den Bereichen allgemeiner Dialog, logisches Denken und Agentenfähigkeiten verbessert. GLM-4.7 stärkt das Interleaved Thinking und führt Preserved Thinking sowie Turn-level Thinking ein.",
"Pro/zai-org/glm-5.description": "GLM-5 ist das neue Generationen-Sprachmodell von Zhipu, das sich auf komplexe Systemtechnik und langfristige Agentenaufgaben konzentriert. Die Modellparameter wurden auf 744B Parameter (40B aktiv) erweitert und integrieren DeepSeek Sparse Attention.",
"QwQ-32B-Preview.description": "Qwen QwQ ist ein experimentelles Forschungsmodell mit Fokus auf die Verbesserung logischer Schlussfolgerungen.",
"Qwen/QVQ-72B-Preview.description": "QVQ-72B-Preview ist ein Forschungsmodell von Qwen mit Schwerpunkt auf visuellem Denken. Es überzeugt durch seine Fähigkeit zur Analyse komplexer Szenen und zur Lösung visueller Mathematikaufgaben.",
"Qwen/QwQ-32B-Preview.description": "Qwen QwQ ist ein experimentelles Forschungsmodell zur Verbesserung der KI-Logik und des Denkvermögens.",
@@ -274,22 +279,28 @@
"chatgpt-4o-latest.description": "ChatGPT-4o ist ein dynamisches Modell mit Echtzeit-Updates, das starkes Verständnis und Textgenerierung für großflächige Anwendungsfälle wie Kundensupport, Bildung und technischen Support kombiniert.",
"claude-2.0.description": "Claude 2 bietet wichtige Verbesserungen für Unternehmen, darunter einen führenden Kontext von 200.000 Token, reduzierte Halluzinationen, System-Prompts und ein neues Test-Feature: Tool-Nutzung.",
"claude-2.1.description": "Claude 2 bietet wichtige Verbesserungen für Unternehmen, darunter einen führenden Kontext von 200.000 Token, reduzierte Halluzinationen, System-Prompts und ein neues Test-Feature: Tool-Nutzung.",
"claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku ist das schnellste Next-Gen-Modell von Anthropic. Im Vergleich zu Claude 3 Haiku bietet es verbesserte Fähigkeiten und übertrifft das bisher größte Modell Claude 3 Opus in vielen Intelligenz-Benchmarks.",
"claude-3-5-haiku-20241022.description": "Claude 3.5 Haiku ist das schnellste Next-Gen-Modell von Anthropic und verbessert sich in zahlreichen Fähigkeiten. Es übertrifft das bisherige Flaggschiff Claude 3 Opus in vielen Benchmarks.",
"claude-3-5-haiku-latest.description": "Claude 3.5 Haiku liefert schnelle Antworten für leichte Aufgaben.",
"claude-3-7-sonnet-20250219.description": "Claude 3.7 Sonnet ist das intelligenteste Modell von Anthropic und das erste hybride Reasoning-Modell auf dem Markt. Es kann nahezu sofortige Antworten liefern oder schrittweise Denkprozesse darstellen, die für Nutzer sichtbar sind. Sonnet überzeugt besonders in den Bereichen Programmierung, Data Science, Bildverarbeitung und Agentenaufgaben.",
"claude-3-7-sonnet-20250219.description": "Claude Sonnet 3.7 ist das intelligenteste Modell von Anthropic und das erste Hybrid-Reasoning-Modell auf dem Markt. Es ermöglicht nahezu sofortige Antworten oder tiefgehendes Denken mit präziser Steuerung.",
"claude-3-7-sonnet-latest.description": "Claude 3.7 Sonnet ist das neueste und leistungsfähigste Modell von Anthropic für hochkomplexe Aufgaben. Es überzeugt in Leistung, Intelligenz, Sprachfluss und Verständnis.",
"claude-3-haiku-20240307.description": "Claude 3 Haiku ist das schnellste und kompakteste Modell von Anthropic, entwickelt für nahezu sofortige Antworten mit schneller, präziser Leistung.",
"claude-3-opus-20240229.description": "Claude 3 Opus ist das leistungsstärkste Modell von Anthropic für hochkomplexe Aufgaben. Es überzeugt in Leistung, Intelligenz, Sprachfluss und Verständnis.",
"claude-3-sonnet-20240229.description": "Claude 3 Sonnet bietet eine ausgewogene Kombination aus Intelligenz und Geschwindigkeit für Unternehmensanwendungen. Es liefert hohe Nutzbarkeit bei geringeren Kosten und zuverlässiger Skalierbarkeit.",
"claude-3.5-sonnet.description": "Claude 3.5 Sonnet überzeugt durch herausragende Leistungen in den Bereichen Programmierung, Schreiben und komplexes Denken.",
"claude-3.7-sonnet-thought.description": "Claude 3.7 Sonnet mit erweitertem Denkvermögen für anspruchsvolle Aufgaben im Bereich komplexes Schlussfolgern.",
"claude-3.7-sonnet.description": "Claude 3.7 Sonnet ist eine verbesserte Version mit erweitertem Kontext und erweiterten Fähigkeiten.",
"claude-haiku-4-5-20251001.description": "Claude Haiku 4.5 ist das schnellste und intelligenteste Haiku-Modell von Anthropic mit blitzschneller Reaktionszeit und erweitertem Denkvermögen.",
"claude-haiku-4.5.description": "Claude Haiku 4.5 ist ein schnelles und effizientes Modell für vielfältige Aufgaben.",
"claude-opus-4-1-20250805-thinking.description": "Claude Opus 4.1 Thinking ist eine erweiterte Variante, die ihren Denkprozess offenlegen kann.",
"claude-opus-4-1-20250805.description": "Claude Opus 4.1 ist das neueste und leistungsfähigste Modell von Anthropic für hochkomplexe Aufgaben und überzeugt durch herausragende Leistung, Intelligenz, Sprachgewandtheit und Verständnis.",
"claude-opus-4-1-20250805.description": "Claude Opus 4.1 ist das neueste und leistungsfähigste Modell von Anthropic für hochkomplexe Aufgaben. Es überzeugt durch herausragende Leistung, Intelligenz, Sprachgewandtheit und Verständnis.",
"claude-opus-4-20250514.description": "Claude Opus 4 ist das leistungsstärkste Modell von Anthropic für hochkomplexe Aufgaben und zeichnet sich durch exzellente Leistung, Intelligenz, Sprachgewandtheit und Verständnis aus.",
"claude-opus-4-5-20251101.description": "Claude Opus 4.5 ist das Flaggschiffmodell von Anthropic. Es kombiniert herausragende Intelligenz mit skalierbarer Leistung und ist ideal für komplexe Aufgaben, die höchste Qualität bei Antworten und logischem Denken erfordern.",
"claude-opus-4-6.description": "Claude Opus 4.6 ist das intelligenteste Modell von Anthropic für die Entwicklung von Agenten und Programmierung.",
"claude-opus-4-6.description": "Claude Opus 4.6 ist das intelligenteste Modell von Anthropic für den Aufbau von Agenten und das Programmieren.",
"claude-sonnet-4-20250514-thinking.description": "Claude Sonnet 4 Thinking kann nahezu sofortige Antworten oder schrittweises Denken mit sichtbarem Prozess erzeugen.",
"claude-sonnet-4-20250514.description": "Claude Sonnet 4 kann nahezu sofortige Antworten liefern oder schrittweise Denkprozesse mit sichtbarem Ablauf darstellen.",
"claude-sonnet-4-20250514.description": "Claude Sonnet 4 ist das bisher intelligenteste Modell von Anthropic. Es bietet nahezu sofortige Antworten oder schrittweises Denken mit feingranularer Steuerung für API-Nutzer.",
"claude-sonnet-4-5-20250929.description": "Claude Sonnet 4.5 ist das bisher intelligenteste Modell von Anthropic.",
"claude-sonnet-4-6.description": "Claude Sonnet 4.6 ist die beste Kombination aus Geschwindigkeit und Intelligenz von Anthropic.",
"claude-sonnet-4.description": "Claude Sonnet 4 ist die neueste Generation mit verbesserter Leistung in allen Aufgabenbereichen.",
"codegeex-4.description": "CodeGeeX-4 ist ein leistungsstarker KI-Coding-Assistent, der mehrsprachige Q&A und Codevervollständigung unterstützt, um die Produktivität von Entwicklern zu steigern.",
"codegeex4-all-9b.description": "CodeGeeX4-ALL-9B ist ein mehrsprachiges Codegenerierungsmodell, das Codevervollständigung, Codeinterpretation, Websuche, Funktionsaufrufe und Q&A auf Repositoriumsebene unterstützt. Es deckt eine Vielzahl von Softwareentwicklungsszenarien ab und ist eines der besten Code-Modelle unter 10 Milliarden Parametern.",
"codegemma.description": "CodeGemma ist ein leichtgewichtiges Modell für verschiedene Programmieraufgaben, das schnelle Iteration und Integration ermöglicht.",
@@ -358,7 +369,7 @@
"deepseek-ai/deepseek-v3.1-terminus.description": "DeepSeek V3.1 ist ein Next-Gen-Denkmodell mit stärkerem komplexem Denken und Chain-of-Thought für tiefgreifende Analyseaufgaben.",
"deepseek-ai/deepseek-v3.1.description": "DeepSeek V3.1 ist ein Next-Gen-Denkmodell mit stärkerem komplexem Denken und Chain-of-Thought für tiefgreifende Analyseaufgaben.",
"deepseek-ai/deepseek-vl2.description": "DeepSeek-VL2 ist ein MoE Vision-Language-Modell auf Basis von DeepSeekMoE-27B mit sparsamer Aktivierung. Es erreicht starke Leistung mit nur 4,5B aktiven Parametern und überzeugt bei visuellen QA-Aufgaben, OCR, Dokument-/Tabellen-/Diagrammverständnis und visueller Verankerung.",
"deepseek-chat.description": "Ein neues Open-Source-Modell, das allgemeine Fähigkeiten und Programmierkompetenz vereint. Es bewahrt die Dialogfähigkeit des Chat-Modells und die starke Codierungsleistung des Coder-Modells mit verbesserter Präferenzanpassung. DeepSeek-V2.5 verbessert zudem das Schreiben und das Befolgen von Anweisungen.",
"deepseek-chat.description": "DeepSeek V3.2 bietet ein ausgewogenes Verhältnis zwischen logischem Denken und Ausgabelänge für tägliche Frage-Antwort- und Agentenaufgaben. Öffentliche Benchmarks erreichen GPT-5-Niveau. Es ist das erste Modell, das Denken in die Werkzeugnutzung integriert und führend in Open-Source-Agentenbewertungen.",
"deepseek-coder-33B-instruct.description": "DeepSeek Coder 33B ist ein Code-Sprachmodell, trainiert auf 2B Tokens (87% Code, 13% chinesisch/englischer Text). Es bietet ein 16K-Kontextfenster und Fill-in-the-Middle-Aufgaben für projektweite Codevervollständigung und Snippet-Ergänzung.",
"deepseek-coder-v2.description": "DeepSeek Coder V2 ist ein Open-Source-MoE-Code-Modell mit starker Leistung bei Programmieraufgaben, vergleichbar mit GPT-4 Turbo.",
"deepseek-coder-v2:236b.description": "DeepSeek Coder V2 ist ein Open-Source-MoE-Code-Modell mit starker Leistung bei Programmieraufgaben, vergleichbar mit GPT-4 Turbo.",
@@ -381,7 +392,7 @@
"deepseek-r1-fast-online.description": "DeepSeek R1 Schnellversion mit Echtzeit-Websuche kombiniert 671B-Fähigkeiten mit schneller Reaktion.",
"deepseek-r1-online.description": "DeepSeek R1 Vollversion mit 671B Parametern und Echtzeit-Websuche bietet stärkeres Verständnis und bessere Generierung.",
"deepseek-r1.description": "DeepSeek-R1 nutzt Cold-Start-Daten vor dem RL und erreicht vergleichbare Leistungen wie OpenAI-o1 bei Mathematik, Programmierung und logischem Denken.",
"deepseek-reasoner.description": "Der Denkmodus DeepSeek V3.2 gibt vor der finalen Antwort eine Gedankenkette aus, um die Genauigkeit zu erhöhen.",
"deepseek-reasoner.description": "DeepSeek V3.2 Thinking ist ein Modell für tiefes logisches Denken, das vor der Ausgabe eine Gedankenkette generiert, um die Genauigkeit zu erhöhen. Es erzielt Spitzenwerte in Wettbewerben und bietet ein Denkvermögen vergleichbar mit Gemini-3.0-Pro.",
"deepseek-v2.description": "DeepSeek V2 ist ein effizientes MoE-Modell für kostengünstige Verarbeitung.",
"deepseek-v2:236b.description": "DeepSeek V2 236B ist das codefokussierte Modell von DeepSeek mit starker Codegenerierung.",
"deepseek-v3-0324.description": "DeepSeek-V3-0324 ist ein MoE-Modell mit 671B Parametern und herausragenden Stärken in Programmierung, technischer Kompetenz, Kontextverständnis und Langtextverarbeitung.",
@@ -439,6 +450,10 @@
"doubao-seed-1.6-vision.description": "Doubao-Seed-1.6-vision ist ein visuelles Modell für tiefes logisches Denken mit verbesserter multimodaler Analyse für Bildung, Bildprüfung, Inspektion/Sicherheit und KI-gestützte Fragenbeantwortung. Unterstützt ein Kontextfenster von 256k und bis zu 64k Ausgabetokens.",
"doubao-seed-1.6.description": "Doubao-Seed-1.6 ist ein neues multimodales Modell für tiefes logisches Denken mit Auto-, Denk- und Nicht-Denk-Modi. Im Nicht-Denk-Modus übertrifft es Doubao-1.5-pro/250115 deutlich. Unterstützt ein Kontextfenster von 256k und bis zu 16k Ausgabetokens.",
"doubao-seed-1.8.description": "Doubao-Seed-1.8 bietet verbesserte multimodale Verständnis- und Agentenfähigkeiten, unterstützt Text-, Bild- und Videoeingaben sowie Kontext-Caching und liefert herausragende Ergebnisse bei komplexen Aufgaben.",
"doubao-seed-2.0-code.description": "Doubao-Seed-2.0-code ist tief optimiert für agentisches Codieren, unterstützt multimodale Eingaben und ein 256k-Kontextfenster, geeignet für Codierung, visuelles Verständnis und Agenten-Workflows.",
"doubao-seed-2.0-lite.description": "Doubao-Seed-2.0-lite ist ein neues multimodales Modell für tiefgehendes Denken, das ein besseres Preis-Leistungs-Verhältnis bietet und eine starke Wahl für allgemeine Aufgaben ist, mit einem Kontextfenster von bis zu 256k.",
"doubao-seed-2.0-mini.description": "Doubao-Seed-2.0-mini ist ein leichtgewichtiges Modell mit schneller Reaktionszeit und hoher Leistung, geeignet für kleine Aufgaben und Szenarien mit hoher Parallelität.",
"doubao-seed-2.0-pro.description": "Doubao-Seed-2.0-pro ist das Flaggschiff-Agentenmodell von ByteDance, mit umfassenden Fortschritten in der Planung und Ausführung komplexer Aufgaben.",
"doubao-seed-code.description": "Doubao-Seed-Code ist speziell für agentenbasiertes Programmieren optimiert, unterstützt multimodale Eingaben (Text/Bild/Video) und ein Kontextfenster von 256k. Es ist kompatibel mit der Anthropic API und eignet sich für Programmierung, visuelles Verständnis und Agenten-Workflows.",
"doubao-seededit-3-0-i2i-250628.description": "Das Doubao-Bildmodell von ByteDance Seed unterstützt Text- und Bildeingaben mit hochgradig kontrollierbarer, hochwertiger Bildgenerierung. Es unterstützt textgesteuerte Bildbearbeitung mit Ausgabengrößen zwischen 512 und 1536 auf der langen Seite.",
"doubao-seedream-3-0-t2i-250415.description": "Seedream 3.0 ist ein Bildgenerierungsmodell von ByteDance Seed, das Text- und Bildeingaben unterstützt und eine hochgradig kontrollierbare, hochwertige Bildgenerierung ermöglicht. Es erzeugt Bilder aus Texteingaben.",
@@ -471,7 +486,8 @@
"ernie-speed-pro-128k.description": "ERNIE Speed Pro 128K ist ein hochgradig skalierbares Modell für großflächige Online-Dienste und Unternehmensanwendungen.",
"ernie-x1-turbo-32k.description": "ERNIE X1 Turbo 32K ist ein schnelles Denkmodell mit 32K Kontext für komplexe Schlussfolgerungen und mehrstufige Gespräche.",
"ernie-x1.1-preview.description": "ERNIE X1.1 Preview ist ein Vorschau-Modell mit Denkfähigkeit zur Bewertung und zum Testen.",
"fal-ai/bytedance/seedream/v4.description": "Seedream 4.0 ist ein Bildgenerierungsmodell von ByteDance Seed, das Text- und Bildeingaben unterstützt und eine hochgradig steuerbare, hochwertige Bildgenerierung ermöglicht. Es erstellt Bilder aus Texteingaben.",
"fal-ai/bytedance/seedream/v4.5.description": "Seedream 4.5, entwickelt vom Seed-Team bei ByteDance, unterstützt Multi-Image-Bearbeitung und -Komposition. Es bietet verbesserte Subjektkonsistenz, präzise Befolgung von Anweisungen, Verständnis räumlicher Logik, ästhetischen Ausdruck, Poster-Layout und Logo-Design mit hochpräziser Text-Bild-Darstellung.",
"fal-ai/bytedance/seedream/v4.description": "Seedream 4.0, entwickelt von ByteDance Seed, unterstützt Text- und Bildeingaben für eine hochgradig steuerbare, qualitativ hochwertige Bildgenerierung aus Prompts.",
"fal-ai/flux-kontext/dev.description": "FLUX.1-Modell mit Fokus auf Bildbearbeitung, unterstützt Text- und Bildeingaben.",
"fal-ai/flux-pro/kontext.description": "FLUX.1 Kontext [pro] akzeptiert Texte und Referenzbilder als Eingabe und ermöglicht gezielte lokale Bearbeitungen sowie komplexe globale Szenentransformationen.",
"fal-ai/flux/krea.description": "Flux Krea [dev] ist ein Bildgenerierungsmodell mit ästhetischer Ausrichtung auf realistischere, natürliche Bilder.",
@@ -479,8 +495,8 @@
"fal-ai/hunyuan-image/v3.description": "Ein leistungsstarkes natives multimodales Bildgenerierungsmodell.",
"fal-ai/imagen4/preview.description": "Hochwertiges Bildgenerierungsmodell von Google.",
"fal-ai/nano-banana.description": "Nano Banana ist das neueste, schnellste und effizienteste native multimodale Modell von Google. Es ermöglicht Bildgenerierung und -bearbeitung im Dialog.",
"fal-ai/qwen-image-edit.description": "Ein professionelles Bildbearbeitungsmodell des Qwen-Teams, das semantische und visuelle Bearbeitungen unterstützt, chinesischen und englischen Text präzise bearbeitet und hochwertige Anpassungen wie Stilübertragungen und Objektrotation ermöglicht.",
"fal-ai/qwen-image.description": "Ein leistungsstarkes Bildgenerierungsmodell des Qwen-Teams mit beeindruckender Darstellung chinesischer Texte und vielfältigen visuellen Stilen.",
"fal-ai/qwen-image-edit.description": "Ein professionelles Bildbearbeitungsmodell des Qwen-Teams, das semantische und visuelle Bearbeitungen, präzise Textbearbeitung in Chinesisch/Englisch, Stilübertragungen, Drehungen und mehr unterstützt.",
"fal-ai/qwen-image.description": "Ein leistungsstarkes Bildgenerierungsmodell des Qwen-Teams mit starker chinesischer Textrendering-Fähigkeit und vielfältigen visuellen Stilen.",
"flux-1-schnell.description": "Ein Text-zu-Bild-Modell mit 12 Milliarden Parametern von Black Forest Labs, das latente adversariale Diffusionsdistillation nutzt, um hochwertige Bilder in 14 Schritten zu erzeugen. Es konkurriert mit geschlossenen Alternativen und ist unter Apache-2.0 für persönliche, Forschungs- und kommerzielle Nutzung verfügbar.",
"flux-dev.description": "FLUX.1 [dev] ist ein Modell mit offenen Gewichten für nicht-kommerzielle Nutzung. Es bietet nahezu professionelle Bildqualität und Befolgung von Anweisungen bei effizienterer Nutzung von Ressourcen im Vergleich zu Standardmodellen gleicher Größe.",
"flux-kontext-max.description": "Modernste kontextuelle Bildgenerierung und -bearbeitung, kombiniert Text und Bilder für präzise, kohärente Ergebnisse.",
@@ -511,6 +527,8 @@
"gemini-2.0-flash-lite-001.description": "Eine Gemini 2.0 Flash-Variante, optimiert für Kosteneffizienz und geringe Latenz.",
"gemini-2.0-flash-lite.description": "Eine Gemini 2.0 Flash-Variante, optimiert für Kosteneffizienz und geringe Latenz.",
"gemini-2.0-flash.description": "Gemini 2.0 Flash bietet Next-Gen-Funktionen wie außergewöhnliche Geschwindigkeit, native Tool-Nutzung, multimodale Generierung und ein Kontextfenster von 1 Million Tokens.",
"gemini-2.5-flash-image-preview.description": "Nano Banana ist das neueste, schnellste und effizienteste native multimodale Modell von Google und ermöglicht dialogbasierte Bildgenerierung und -bearbeitung.",
"gemini-2.5-flash-image-preview:image.description": "Nano Banana ist das neueste, schnellste und effizienteste native multimodale Modell von Google und ermöglicht dialogbasierte Bildgenerierung und -bearbeitung.",
"gemini-2.5-flash-image.description": "Nano Banana ist Googles neuestes, schnellstes und effizientestes natives multimodales Modell für konversationale Bildgenerierung und -bearbeitung.",
"gemini-2.5-flash-image:image.description": "Nano Banana ist Googles neuestes, schnellstes und effizientestes natives multimodales Modell für konversationale Bildgenerierung und -bearbeitung.",
"gemini-2.5-flash-lite-preview-06-17.description": "Gemini 2.5 Flash-Lite Preview ist Googles kleinstes und kosteneffizientestes Modell für großflächige Nutzung.",
@@ -525,7 +543,7 @@
"gemini-2.5-pro.description": "Gemini 2.5 Pro ist Googles fortschrittlichstes Reasoning-Modell, das über Code, Mathematik und MINT-Probleme nachdenken und große Datensätze, Codebasen und Dokumente mit langem Kontext analysieren kann.",
"gemini-3-flash-preview.description": "Gemini 3 Flash ist das intelligenteste Modell, das auf Geschwindigkeit ausgelegt ist es vereint modernste Intelligenz mit exzellenter Suchverankerung.",
"gemini-3-pro-image-preview.description": "Gemini 3 Pro Image (Nano Banana Pro) ist Googles Bildgenerierungsmodell mit Unterstützung für multimodale Dialoge.",
"gemini-3-pro-image-preview:image.description": "Gemini 3 Pro Image (Nano Banana Pro) ist Googles Bildgenerierungsmodell und unterstützt auch multimodale Chats.",
"gemini-3-pro-image-preview:image.description": "Gemini 3 Pro Image (Nano Banana Pro) ist Googles Modell zur Bildgenerierung und unterstützt auch multimodale Konversationen.",
"gemini-3-pro-preview.description": "Gemini 3 Pro ist Googles leistungsstärkstes Agenten- und Vibe-Coding-Modell. Es bietet reichhaltigere visuelle Inhalte und tiefere Interaktionen auf Basis modernster logischer Fähigkeiten.",
"gemini-flash-latest.description": "Neueste Version von Gemini Flash",
"gemini-flash-lite-latest.description": "Neueste Version von Gemini Flash-Lite",
@@ -565,6 +583,7 @@
"glm-4v-plus-0111.description": "GLM-4V-Plus versteht Videos und mehrere Bilder und eignet sich für multimodale Aufgaben.",
"glm-4v-plus.description": "GLM-4V-Plus versteht Videos und mehrere Bilder und eignet sich für multimodale Aufgaben.",
"glm-4v.description": "GLM-4V bietet starkes Bildverständnis und logisches Denken für visuelle Aufgaben.",
"glm-5.description": "Ein starkes Modell für Schlussfolgerungen und agentische Aufgaben von Z.ai mit insgesamt 744B Parametern (40B aktiv), entwickelt für komplexe Systemtechnik und langfristige Aufgaben.",
"glm-z1-air.description": "Ein Modell mit starker Argumentationsfähigkeit für Aufgaben, die tiefes Schlussfolgern erfordern.",
"glm-z1-airx.description": "Ultraschnelles Schlussfolgern bei gleichzeitig hoher Denkqualität.",
"glm-z1-flash.description": "Die GLM-Z1-Serie bietet starke Fähigkeiten im komplexen logischen Denken, insbesondere in Logik, Mathematik und Programmierung.",
@@ -604,6 +623,7 @@
"google/text-embedding-005.description": "Ein auf Englisch fokussiertes Text-Embedding-Modell, optimiert für Code- und Sprachaufgaben.",
"google/text-multilingual-embedding-002.description": "Ein mehrsprachiges Text-Embedding-Modell, optimiert für sprachübergreifende Aufgaben in vielen Sprachen.",
"gpt-3.5-turbo-0125.description": "GPT 3.5 Turbo für Textgenerierung und -verständnis; verweist derzeit auf gpt-3.5-turbo-0125.",
"gpt-3.5-turbo-0613.description": "GPT 3.5 Turbo ist ein schnelles und effizientes Modell für vielfältige Aufgaben.",
"gpt-3.5-turbo-1106.description": "GPT 3.5 Turbo für Textgenerierung und -verständnis; verweist derzeit auf gpt-3.5-turbo-0125.",
"gpt-3.5-turbo-instruct.description": "GPT 3.5 Turbo für Textgenerierung und -verständnis, optimiert für die Befolgung von Anweisungen.",
"gpt-3.5-turbo.description": "GPT 3.5 Turbo für Textgenerierung und -verständnis; verweist derzeit auf gpt-3.5-turbo-0125.",
@@ -614,10 +634,12 @@
"gpt-4-1106-preview.description": "Das neueste GPT-4 Turbo unterstützt jetzt auch visuelle Eingaben. Visuelle Anfragen unterstützen den JSON-Modus und Funktionsaufrufe. Es ist ein kosteneffizientes multimodales Modell, das Genauigkeit und Effizienz für Echtzeitanwendungen ausbalanciert.",
"gpt-4-32k-0613.description": "GPT-4 bietet ein größeres Kontextfenster zur Verarbeitung längerer Eingaben ideal für umfassende Informationssynthese und Datenanalyse.",
"gpt-4-32k.description": "GPT-4 bietet ein größeres Kontextfenster zur Verarbeitung längerer Eingaben ideal für umfassende Informationssynthese und Datenanalyse.",
"gpt-4-o-preview.description": "GPT-4o ist das fortschrittlichste multimodale Modell und verarbeitet sowohl Text- als auch Bildeingaben.",
"gpt-4-turbo-2024-04-09.description": "Das neueste GPT-4 Turbo unterstützt jetzt auch visuelle Eingaben. Visuelle Anfragen unterstützen den JSON-Modus und Funktionsaufrufe. Es ist ein kosteneffizientes multimodales Modell, das Genauigkeit und Effizienz für Echtzeitanwendungen ausbalanciert.",
"gpt-4-turbo-preview.description": "Das neueste GPT-4 Turbo unterstützt jetzt auch visuelle Eingaben. Visuelle Anfragen unterstützen den JSON-Modus und Funktionsaufrufe. Es ist ein kosteneffizientes multimodales Modell, das Genauigkeit und Effizienz für Echtzeitanwendungen ausbalanciert.",
"gpt-4-turbo.description": "Das neueste GPT-4 Turbo unterstützt jetzt auch visuelle Eingaben. Visuelle Anfragen unterstützen den JSON-Modus und Funktionsaufrufe. Es ist ein kosteneffizientes multimodales Modell, das Genauigkeit und Effizienz für Echtzeitanwendungen ausbalanciert.",
"gpt-4-vision-preview.description": "Vorschau von GPT-4 Vision, entwickelt für Aufgaben der Bildanalyse und -verarbeitung.",
"gpt-4.1-2025-04-14.description": "GPT-4.1 ist das Spitzenmodell für komplexe Aufgaben und ideal für interdisziplinäre Problemlösungen.",
"gpt-4.1-mini.description": "GPT-4.1 mini vereint Intelligenz, Geschwindigkeit und Kostenersparnis ideal für viele Anwendungsfälle.",
"gpt-4.1-nano.description": "GPT-4.1 nano ist das schnellste und kostengünstigste Modell der GPT-4.1-Reihe.",
"gpt-4.1.description": "GPT-4.1 ist unser Flaggschiffmodell für komplexe Aufgaben und domänenübergreifende Problemlösungen.",
@@ -627,6 +649,7 @@
"gpt-4o-2024-08-06.description": "ChatGPT-4o ist ein dynamisches Modell, das in Echtzeit aktualisiert wird. Es kombiniert ein starkes Sprachverständnis mit leistungsfähiger Textgenerierung für großflächige Anwendungsfälle wie Kundensupport, Bildung und technische Unterstützung.",
"gpt-4o-2024-11-20.description": "ChatGPT-4o ist ein dynamisches Modell mit Echtzeit-Updates, das starkes Sprachverständnis und Textgenerierung für großflächige Anwendungsfälle wie Kundensupport, Bildung und technische Hilfe vereint.",
"gpt-4o-audio-preview.description": "GPT-4o Audio-Vorschau-Modell mit Audioeingabe und -ausgabe.",
"gpt-4o-mini-2024-07-18.description": "GPT-4o mini ist eine kosteneffiziente Lösung für ein breites Spektrum an Text- und Bildaufgaben.",
"gpt-4o-mini-audio-preview.description": "GPT-4o Mini Audio-Modell mit Audioeingabe und -ausgabe.",
"gpt-4o-mini-realtime-preview.description": "GPT-4o-mini-Echtzeitvariante mit Audio- und Textein-/ausgabe in Echtzeit.",
"gpt-4o-mini-search-preview.description": "GPT-4o Mini Search Preview ist darauf trainiert, Websuchanfragen über die Chat Completions API zu verstehen und auszuführen. Websuchen werden zusätzlich zu den Tokenkosten pro Tool-Aufruf abgerechnet.",
@@ -863,6 +886,7 @@
"mimo-v2-flash.description": "MiMo-V2-Flash: Ein effizientes Modell für logisches Denken, Programmierung und Agenten-Grundlagen.",
"minicpm-v.description": "MiniCPM-V ist das nächste multimodale Modell von OpenBMB mit exzellenter OCR- und multimodaler Verständnisleistung für vielfältige Anwendungsfälle.",
"minimax-m2.1.description": "MiniMax-M2.1 ist die neueste Version der MiniMax-Serie, optimiert für mehrsprachige Programmierung und komplexe Aufgaben in der realen Welt. Als AI-natives Modell bietet es deutliche Verbesserungen in der Modellleistung, Unterstützung von Agenten-Frameworks und Anpassung an verschiedene Szenarien mit dem Ziel, Unternehmen und Einzelpersonen schneller zu einem AI-nativen Arbeits- und Lebensstil zu verhelfen.",
"minimax-m2.5.description": "MiniMax-M2.5 ist ein hochmodernes Sprachmodell, das für Produktivitäts- und Codierungsaufgaben in der realen Welt entwickelt wurde.",
"minimax-m2.description": "MiniMax M2 ist ein effizientes großes Sprachmodell, das speziell für Programmierung und Agenten-Workflows entwickelt wurde.",
"minimax/minimax-m2.1.description": "MiniMax-M2.1 ist ein leichtgewichtiges, hochmodernes großes Sprachmodell, optimiert für Programmierung, Proxy-Workflows und moderne Anwendungsentwicklung. Es liefert klarere, prägnantere Ausgaben und schnellere Reaktionszeiten.",
"minimax/minimax-m2.description": "MiniMax-M2 ist ein leistungsstarkes Modell, das sich in vielen technischen Szenarien bei Programmier- und Agentenaufgaben bewährt.",
@@ -980,6 +1004,8 @@
"openai/text-embedding-3-small.description": "OpenAIs verbesserte, leistungsstärkere Variante des ada-Embedding-Modells.",
"openai/text-embedding-ada-002.description": "OpenAIs älteres Text-Embedding-Modell.",
"openrouter/auto.description": "Basierend auf Kontextlänge, Thema und Komplexität wird Ihre Anfrage an Llama 3 70B Instruct, Claude 3.5 Sonnet (selbstmoderiert) oder GPT-4o weitergeleitet.",
"oswe-vscode-prime.description": "Raptor mini ist ein Vorschau-Modell, das für Aufgaben rund ums Programmieren optimiert wurde.",
"oswe-vscode-secondary.description": "Raptor mini ist ein Vorschau-Modell, das für Aufgaben rund ums Programmieren optimiert wurde.",
"perplexity/sonar-pro.description": "Perplexitys Flaggschiffprodukt mit Suchverankerung, unterstützt komplexe Anfragen und Folgefragen.",
"perplexity/sonar-reasoning-pro.description": "Ein fortschrittliches Modell mit Fokus auf logisches Denken, das CoT mit erweiterter Suche ausgibt, einschließlich mehrerer Suchanfragen pro Anfrage.",
"perplexity/sonar-reasoning.description": "Ein Modell mit Fokus auf logisches Denken, das Chain-of-Thought (CoT) mit detaillierten, suchbasierten Erklärungen liefert.",
@@ -1122,6 +1148,7 @@
"qwq.description": "QwQ ist ein Schlussfolgerungsmodell aus der Qwen-Familie. Im Vergleich zu standardmäßig instruktionstunierten Modellen bietet es überlegene Denk- und Schlussfolgerungsfähigkeiten, die die Leistung bei nachgelagerten Aufgaben deutlich verbessern insbesondere bei schwierigen Problemen. QwQ-32B ist ein mittelgroßes Modell, das mit führenden Schlussfolgerungsmodellen wie DeepSeek-R1 und o1-mini mithalten kann.",
"qwq_32b.description": "Mittelgroßes Schlussfolgerungsmodell aus der Qwen-Familie. Im Vergleich zu standardmäßig instruktionstunierten Modellen steigern QwQs Denk- und Schlussfolgerungsfähigkeiten die Leistung bei nachgelagerten Aufgaben deutlich insbesondere bei schwierigen Problemen.",
"r1-1776.description": "R1-1776 ist eine nachtrainierte Variante von DeepSeek R1, die darauf ausgelegt ist, unzensierte, objektive und faktenbasierte Informationen bereitzustellen.",
"seedance-1-5-pro-251215.description": "Seedance 1.5 Pro von ByteDance unterstützt Text-zu-Video, Bild-zu-Video (erstes Bild, erstes+letztes Bild) sowie Audiogenerierung synchronisiert mit visuellen Inhalten.",
"solar-mini-ja.description": "Solar Mini (Ja) erweitert Solar Mini mit einem Fokus auf Japanisch und behält dabei eine effiziente und starke Leistung in Englisch und Koreanisch bei.",
"solar-mini.description": "Solar Mini ist ein kompaktes LLM, das GPT-3.5 übertrifft. Es bietet starke mehrsprachige Fähigkeiten in Englisch und Koreanisch und ist eine effiziente Lösung mit kleinem Ressourcenbedarf.",
"solar-pro.description": "Solar Pro ist ein hochintelligentes LLM von Upstage, das auf Befolgen von Anweisungen auf einer einzelnen GPU ausgelegt ist und IFEval-Werte über 80 erreicht. Derzeit wird Englisch unterstützt; die vollständige Veröffentlichung mit erweitertem Sprachsupport und längeren Kontexten war für November 2024 geplant.",
@@ -1162,7 +1189,9 @@
"tencent/Hunyuan-A13B-Instruct.description": "Hunyuan-A13B-Instruct nutzt insgesamt 80B Parameter, davon 13B aktiv, um mit größeren Modellen zu konkurrieren. Es unterstützt hybrides schnelles/langsames Denken, stabiles Langtextverständnis und führende Agentenfähigkeiten auf BFCL-v3 und τ-Bench. GQA- und Multi-Quant-Formate ermöglichen effiziente Inferenz.",
"tencent/Hunyuan-MT-7B.description": "Das Hunyuan-Übersetzungsmodell umfasst Hunyuan-MT-7B und das Ensemble Hunyuan-MT-Chimera. Hunyuan-MT-7B ist ein leichtgewichtiges 7B-Modell, das 33 Sprachen sowie 5 chinesische Minderheitensprachen unterstützt. Bei WMT25 erzielte es 30 erste Plätze in 31 Sprachpaaren. Tencent Hunyuan verwendet eine vollständige Trainingspipeline von Pretraining über SFT bis hin zu RL für Übersetzung und Ensemble, und erreicht führende Leistung bei einfacher, effizienter Bereitstellung.",
"text-embedding-3-large.description": "Das leistungsfähigste Embedding-Modell für englische und nicht-englische Aufgaben.",
"text-embedding-3-small-inference.description": "Embedding V3 Small (Inference) Modell für Text-Einbettungen.",
"text-embedding-3-small.description": "Ein effizientes, kostengünstiges Next-Gen-Embedding-Modell für Retrieval- und RAG-Szenarien.",
"text-embedding-ada-002.description": "Embedding V2 Ada Modell für Text-Einbettungen.",
"thudm/glm-4-32b.description": "GLM-4-32B-0414 ist ein 32B zweisprachiges (Chinesisch/Englisch) Open-Weights-Modell, optimiert für Codegenerierung, Funktionsaufrufe und Agentenaufgaben. Es wurde mit 15T hochwertigen, reasoning-intensiven Daten vortrainiert und durch menschliche Präferenzanpassung, Rejection Sampling und RL weiter verfeinert. Es überzeugt bei komplexem Denken, Artefakterstellung und strukturierten Ausgaben und erreicht GPT-4o- und DeepSeek-V3-0324-Niveau in mehreren Benchmarks.",
"thudm/glm-4-32b:free.description": "GLM-4-32B-0414 ist ein 32B zweisprachiges (Chinesisch/Englisch) Open-Weights-Modell, optimiert für Codegenerierung, Funktionsaufrufe und Agentenaufgaben. Es wurde mit 15T hochwertigen, reasoning-intensiven Daten vortrainiert und durch menschliche Präferenzanpassung, Rejection Sampling und RL weiter verfeinert. Es überzeugt bei komplexem Denken, Artefakterstellung und strukturierten Ausgaben und erreicht GPT-4o- und DeepSeek-V3-0324-Niveau in mehreren Benchmarks.",
"thudm/glm-4-9b-chat.description": "Die Open-Source-Version des neuesten GLM-4-Pretraining-Modells von Zhipu AI.",
@@ -1222,6 +1251,7 @@
"z-ai/glm-4.5.description": "GLM 4.5 ist Z.AIs Flaggschiffmodell mit hybridem Reasoning, optimiert für Engineering- und Langkontextaufgaben.",
"z-ai/glm-4.6.description": "GLM 4.6 ist Z.AIs Flaggschiffmodell mit erweitertem Kontextumfang und Codierungsfähigkeiten.",
"z-ai/glm-4.7.description": "GLM-4.7 ist das neueste Flaggschiffmodell von Zhipu mit verbesserten allgemeinen Fähigkeiten, natürlicheren und einfacheren Antworten sowie einem immersiveren Schreiberlebnis.",
"z-ai/glm5.description": "Ein starkes Modell für Schlussfolgerungen und agentische Aufgaben von Z.ai mit insgesamt 744B Parametern (40B aktiv), entwickelt für komplexe Systemtechnik und langfristige Aufgaben.",
"zai-org/GLM-4.5-Air.description": "GLM-4.5-Air ist ein Basismodell für Agentenanwendungen mit Mixture-of-Experts-Architektur. Es ist optimiert für Toolnutzung, Web-Browsing, Softwareentwicklung und Frontend-Codierung und integriert sich mit Code-Agenten wie Claude Code und Roo Code. Es nutzt hybrides Reasoning für komplexe und alltägliche Szenarien.",
"zai-org/GLM-4.5.description": "GLM-4.5 ist ein Basismodell für Agentenanwendungen mit Mixture-of-Experts-Architektur. Es ist tiefgreifend optimiert für Toolnutzung, Web-Browsing, Softwareentwicklung und Frontend-Codierung und integriert sich mit Code-Agenten wie Claude Code und Roo Code. Es nutzt hybrides Reasoning für komplexe und alltägliche Szenarien.",
"zai-org/GLM-4.5V.description": "GLM-4.5V ist Zhipu AIs neuestes VLM, basierend auf dem GLM-4.5-Air-Textmodell (106B gesamt, 12B aktiv) mit MoE-Architektur für starke Leistung bei geringeren Kosten. Es folgt dem GLM-4.1V-Thinking-Ansatz und fügt 3D-RoPE zur Verbesserung des 3D-Räumlichkeitsdenkens hinzu. Optimiert durch Pretraining, SFT und RL, verarbeitet es Bilder, Videos und lange Dokumente und belegt Spitzenplätze unter offenen Modellen in 41 öffentlichen multimodalen Benchmarks. Ein Thinking-Modus-Schalter ermöglicht die Balance zwischen Geschwindigkeit und Tiefe.",
+1
View File
@@ -30,6 +30,7 @@
"internlm.description": "Eine Open-Source-Organisation für Forschung und Tools rund um große Modelle mit einer effizienten, benutzerfreundlichen Plattform für den Zugang zu modernsten Modellen und Algorithmen.",
"jina.description": "Jina AI wurde 2020 gegründet und ist ein führendes Unternehmen im Bereich Such-KI. Der Such-Stack umfasst Vektormodelle, Reranker und kleine Sprachmodelle für zuverlässige, hochwertige generative und multimodale Suchanwendungen.",
"lmstudio.description": "LM Studio ist eine Desktop-App zur Entwicklung und zum Experimentieren mit LLMs auf dem eigenen Computer.",
"lobehub.description": "LobeHub Cloud verwendet offizielle APIs, um auf KI-Modelle zuzugreifen, und misst die Nutzung anhand von Credits, die an Modell-Token gebunden sind.",
"minimax.description": "MiniMax wurde 2021 gegründet und entwickelt allgemeine KI mit multimodalen Foundation-Modellen, darunter Textmodelle mit Billionen Parametern, Sprach- und Bildmodelle sowie Apps wie Hailuo AI.",
"mistral.description": "Mistral bietet fortschrittliche allgemeine, spezialisierte und Forschungsmodelle für komplexes Denken, mehrsprachige Aufgaben und Codegenerierung inklusive Funktionsaufrufen für individuelle Integrationen.",
"modelscope.description": "ModelScope ist die Model-as-a-Service-Plattform von Alibaba Cloud mit einer breiten Auswahl an KI-Modellen und Inferenzdiensten.",
+1
View File
@@ -14,6 +14,7 @@
"table.columns.totalTokens": "Token-Nutzung",
"table.columns.type.enums.chat": "Textgenerierung",
"table.columns.type.enums.imageGeneration": "Bildgenerierung",
"table.columns.type.enums.videoGeneration": "Videoerstellung",
"table.columns.type.title": "Typ",
"table.desc": "Details zur Nutzung von Rechen-Credits für Textgenerierung, Einbettung, Bildgenerierung usw.",
"table.more": "Details anzeigen",
+6
View File
@@ -131,6 +131,12 @@
"limitation.providers.prompter.subTitle": "Benutzerdefinierter API-Service ist nur in kostenpflichtigen Plänen verfügbar. Upgrade jetzt, um globale Modellanbieter zu nutzen",
"limitation.providers.prompter.title": "Jetzt abonnieren, um benutzerdefinierten API-Service zu nutzen",
"limitation.providers.tooltip": "Benutzerdefinierter API-Service ist nur in kostenpflichtigen Plänen verfügbar",
"limitation.video.success.action": "Weiter generieren",
"limitation.video.success.desc": "Ihr {{plan}}-Abonnement wurde erfolgreich aktualisiert. Viel Spaß mit der KI-Videoerstellung. Ihr aktueller Plan beinhaltet:",
"limitation.video.success.title": "Upgrade erfolgreich",
"limitation.video.topupSuccess.action": "Weiter generieren",
"limitation.video.topupSuccess.desc": "Ihre zusätzlichen Guthaben sind jetzt aktiv. Viel Spaß mit der KI-Videoerstellung. Ihr aktueller Plan beinhaltet:",
"limitation.video.topupSuccess.title": "Aufladung erfolgreich",
"modelPricing.button": "Preisdokumentation anzeigen",
"modelPricing.desc": "{{name}} verwendet Credits zur Messung der Nutzung von KI-Modellen. Die folgende Tabelle zeigt die Rechen-Credits pro 1 Mio. Tokens.",
"modelPricing.title": "Preise für Textmodelle",
+35
View File
@@ -86,6 +86,10 @@
"localFiles.editFile.replaceFirst": "Nur erstes Vorkommen ersetzen",
"localFiles.file": "Datei",
"localFiles.folder": "Ordner",
"localFiles.globFiles.pattern": "Muster",
"localFiles.grepContent.glob": "Dateifilter",
"localFiles.grepContent.pattern": "Suchmuster",
"localFiles.grepContent.type": "Dateityp",
"localFiles.moveFiles.itemsMoved": "{{count}} Element(e) verschoben:",
"localFiles.moveFiles.itemsMoved_one": "{{count}} Element verschoben:",
"localFiles.moveFiles.itemsMoved_other": "{{count}} Elemente verschoben:",
@@ -95,11 +99,17 @@
"localFiles.open": "Öffnen",
"localFiles.openFile": "Datei öffnen",
"localFiles.openFolder": "Ordner öffnen",
"localFiles.outOfScope.requestedPaths": "Angeforderte Pfade",
"localFiles.outOfScope.warning": "Warnung: Die folgenden Pfade liegen außerhalb des konfigurierten Arbeitsverzeichnisses. Bitte bestätigen Sie, dass Sie den Zugriff erlauben möchten.",
"localFiles.outOfScope.workingDirectory": "Arbeitsverzeichnis",
"localFiles.read.more": "Mehr anzeigen",
"localFiles.readFile": "Datei lesen",
"localFiles.readFile.lineRange": "Zeilen {{start}} - {{end}}",
"localFiles.readFileError": "Datei konnte nicht gelesen werden. Bitte überprüfen Sie den Dateipfad.",
"localFiles.readFiles": "Dateien lesen",
"localFiles.readFilesError": "Dateien konnten nicht gelesen werden. Bitte überprüfen Sie den Dateipfad.",
"localFiles.searchFiles.keywords": "Stichwörter",
"localFiles.securityBlacklist.warning": "Sicherheitswarnung: Diese Aktion wurde durch Sicherheitsregeln markiert und erfordert Ihre ausdrückliche Zustimmung.",
"localFiles.writeFile.characters": "Zeichen",
"localFiles.writeFile.preview": "Inhaltsvorschau",
"localFiles.writeFile.truncated": "gekürzt",
@@ -136,6 +146,31 @@
"search.summary": "Zusammenfassung",
"search.summaryTooltip": "Aktuellen Inhalt zusammenfassen",
"search.viewMoreResults": "{{results}} weitere Ergebnisse anzeigen",
"securityBlacklist.awsCredentials": "Der Zugriff auf AWS-Zugangsdaten kann Cloud-Zugriffsschlüssel offenlegen",
"securityBlacklist.browserCredentials": "Der Zugriff auf gespeicherte Browser-Zugangsdaten kann Passwörter offenlegen",
"securityBlacklist.chownSystemDirs": "Das Ändern des Besitzes von Systemverzeichnissen ist gefährlich",
"securityBlacklist.ddDiskWrite": "Das Schreiben zufälliger Daten auf Datenträger kann Daten zerstören",
"securityBlacklist.directMemoryAccess": "Direkter Speicherzugriff ist äußerst gefährlich",
"securityBlacklist.disableFirewall": "Das Deaktivieren der Firewall setzt das System Angriffen aus",
"securityBlacklist.dockerConfig": "Das Lesen der Docker-Konfiguration kann Registry-Zugangsdaten offenlegen",
"securityBlacklist.envFiles": "Das Lesen von .env-Dateien kann sensible Zugangsdaten und API-Schlüssel offenlegen",
"securityBlacklist.etcPasswd": "Das Ändern von /etc/passwd kann den Systemzugang sperren",
"securityBlacklist.forkBomb": "Eine Fork-Bombe kann das System zum Absturz bringen",
"securityBlacklist.formatPartition": "Das Formatieren von Systempartitionen zerstört Daten",
"securityBlacklist.gcpCredentials": "Das Lesen von GCP-Zugangsdaten kann Cloud-Service-Konten kompromittieren",
"securityBlacklist.gitCredentials": "Das Lesen der Git-Zugangsdaten kann Zugriffstoken offenlegen",
"securityBlacklist.historyFiles": "Das Lesen von Verlaufdateien kann sensible Befehle und Zugangsdaten offenlegen",
"securityBlacklist.kernelParams": "Das Ändern von Kernel-Parametern ohne Fachwissen kann das System zum Absturz bringen",
"securityBlacklist.kubeConfig": "Das Lesen der Kubernetes-Konfiguration kann Cluster-Zugangsdaten offenlegen",
"securityBlacklist.npmrc": "Das Lesen der npm-Token-Datei kann Registry-Zugangsdaten offenlegen",
"securityBlacklist.removeSystemPackages": "Das Entfernen essenzieller Systempakete kann das System beschädigen",
"securityBlacklist.rmForceRecursive": "Erzwingtes rekursives Löschen ohne konkretes Ziel ist zu gefährlich",
"securityBlacklist.rmHomeDir": "Rekursives Löschen des Home-Verzeichnisses ist äußerst gefährlich",
"securityBlacklist.rmRootDir": "Rekursives Löschen des Root-Verzeichnisses zerstört das System",
"securityBlacklist.sshConfig": "Das Ändern der SSH-Konfiguration kann den Zugang zum System sperren",
"securityBlacklist.sshPrivateKeys": "Das Lesen privater SSH-Schlüssel kann die Systemsicherheit gefährden",
"securityBlacklist.sudoers": "Das Ändern der sudoers-Datei ohne Validierung ist gefährlich",
"securityBlacklist.suidShells": "Das Setzen von SUID auf Shells oder Interpreter stellt ein Sicherheitsrisiko dar",
"updateArgs.duplicateKeyError": "Feldschlüssel muss eindeutig sein",
"updateArgs.form.add": "Eintrag hinzufügen",
"updateArgs.form.key": "Feldschlüssel",
+28
View File
@@ -0,0 +1,28 @@
{
"config.aspectRatio.label": "Seitenverhältnis",
"config.cameraFixed.label": "Feste Kamera",
"config.duration.label": "Dauer",
"config.endImageUrl.label": "Endbild",
"config.generateAudio.label": "Audio generieren",
"config.header.title": "Video",
"config.imageUrl.label": "Startbild",
"config.prompt.placeholder": "Beschreiben Sie das Video, das Sie erstellen möchten",
"config.referenceImage.label": "Referenzbild",
"config.resolution.label": "Auflösung",
"config.seed.label": "Seed",
"config.seed.random": "Zufällig",
"generation.actions.copyError": "Fehlermeldung kopieren",
"generation.actions.errorCopied": "Fehlermeldung in die Zwischenablage kopiert",
"generation.actions.errorCopyFailed": "Fehlermeldung konnte nicht kopiert werden",
"generation.actions.generate": "Erstellen",
"generation.freeQuota.exhausted": "🎁 Freikontingent aufgebraucht, es werden Credits verwendet",
"generation.freeQuota.remaining": "🎁 {{remaining}} kostenlose Videos heute verfügbar",
"generation.status.failed": "Erstellung fehlgeschlagen",
"generation.status.generating": "Wird erstellt...",
"generation.validation.endFrameRequiresStartFrame": "Ein Endbild kann nicht ohne ein Startbild verwendet werden. Bitte zuerst ein Startbild festlegen.",
"topic.createNew": "Neues Thema",
"topic.deleteConfirm": "Video-Thema löschen",
"topic.deleteConfirmDesc": "Sie sind dabei, dieses Video-Thema zu löschen. Diese Aktion kann nicht rückgängig gemacht werden.",
"topic.title": "Video-Themen",
"topic.untitled": "Standardthema"
}
+2 -2
View File
@@ -58,13 +58,13 @@
"duplicateTitle": "{{title}} Copy",
"emptyAgent": "No Agents yet. Start with your first Agent—build your system over time.",
"emptyAgentAction": "Create Agent",
"extendParams.disableContextCaching.desc": "Reduce by up to 90% of the cost of generating a single conversation and bring a max of 4x speed. Enabling this will automatically disable the limit on the number of historical messages. <1>Learn more</1>",
"extendParams.disableContextCaching.desc": "Reduce by up to 90% of the cost of generating a single conversation and bring a max of 4x speed. <1>Learn more</1>",
"extendParams.disableContextCaching.title": "Enable Context Caching",
"extendParams.effort.desc": "Control how many tokens Claude uses when responding with the effort parameter.",
"extendParams.effort.title": "Effort",
"extendParams.enableAdaptiveThinking.desc": "Let Claude dynamically decide when and how much to think with adaptive thinking mode.",
"extendParams.enableAdaptiveThinking.title": "Enable Adaptive Thinking",
"extendParams.enableReasoning.desc": "Based on the Claude Thinking mechanism limit, enabling this will automatically disable the limit on the number of historical messages. <1>Learn more</1>",
"extendParams.enableReasoning.desc": "Based on the Claude Thinking mechanism limit. <1>Learn more</1>",
"extendParams.enableReasoning.title": "Enable Deep Thinking",
"extendParams.imageAspectRatio.title": "Image Aspect Ratio",
"extendParams.imageResolution.title": "Image Resolution",

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