mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-17 04:55:51 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0469464c37 |
@@ -1,298 +0,0 @@
|
||||
---
|
||||
name: bot
|
||||
description: 'Bot platform architecture (Discord, Slack, Telegram, Feishu/Lark, QQ, WeChat). Use when working on inbound webhooks, Chat SDK message routing, agent execution from chat platforms, queue-mode callbacks, gateway lifecycle (websocket/polling), bot provider CRUD/credentials, or platform-specific clients/adapters/schemas. Triggers on bot, channel, webhook, mention, Chat SDK, agent bot provider, gateway, bot-callback, qstash bot.'
|
||||
---
|
||||
|
||||
# Bot System
|
||||
|
||||
> **Last updated: 2026-04-08.** Implementation evolves quickly — this doc is a map, not the source of truth. Always read the key files below to verify behavior, especially per-platform quirks. Update this doc when the architecture changes.
|
||||
|
||||
LobeChat agents can answer inside external chat platforms. Inbound messages flow through the Chat SDK (`chat` npm package), get routed to the right agent by `(platform, applicationId)`, executed via `AiAgentService`, and replied back through a per-platform `PlatformClient`. There are **two execution modes** (in-memory vs queue/QStash) and **three connection modes** (`webhook`, `websocket`, `polling`).
|
||||
|
||||
## Supported Platforms
|
||||
|
||||
| Platform | id | Default mode | Markdown | Edit | Notes |
|
||||
| -------- | ---------- | ------------------------------- | ----------------- | ------ | -------------------------------------------------------------------------------------- |
|
||||
| Discord | `discord` | `websocket` | yes | yes | Persistent gateway via Chat SDK adapter; reaction-thread quirks; native slash commands |
|
||||
| Slack | `slack` | `websocket` (Socket Mode) | yes (mrkdwn) | yes | Multi-mode — user can pick `webhook` per provider |
|
||||
| Telegram | `telegram` | `webhook` | yes (HTML) | yes | `setMyCommands` menu via `registerBotCommands` |
|
||||
| Feishu | `feishu` | `websocket` (Lark SDK WSClient) | **no** (stripped) | yes | Multi-mode; shared client with Lark |
|
||||
| Lark | `lark` | `websocket` | **no** | yes | Same client/schema as Feishu, different domain |
|
||||
| QQ | `qq` | `websocket` | **no** | **no** | All replies are final-only |
|
||||
| WeChat | `wechat` | `polling` (iLink long-poll) | **no** | **no** | 10-minute gateway window |
|
||||
|
||||
`supportsMarkdown=false` ⇒ outbound markdown is stripped to plain text via `stripMarkdown` and the AI is told not to use markdown. `supportsMessageEdit=false` ⇒ no progress edits — only the final reply is sent.
|
||||
|
||||
**Multi-mode connection** — Slack/Feishu/Lark/QQ shipped as websocket but support `webhook` per-provider via `settings.connectionMode`. Legacy rows without that field stay on `webhook` (see `LEGACY_WEBHOOK_PLATFORMS` in `platforms/utils.ts`) — **never add new platforms to that list**.
|
||||
|
||||
## Inbound Flow (one webhook → reply)
|
||||
|
||||
```
|
||||
Platform server
|
||||
│ POST /api/agent/webhooks/[platform]/[appId]
|
||||
▼
|
||||
route.ts ── catch-all `[[...appId]]` route
|
||||
│
|
||||
▼
|
||||
BotMessageRouter (singleton)
|
||||
│ • lazy-loads bot per `platform:applicationId`
|
||||
│ • merges schema defaults + provider.settings (mergeWithDefaults)
|
||||
│ • builds Chat SDK Chat<any> with createIoRedisState (if Redis available)
|
||||
│ • registerHandlers: onNewMention / onSubscribedMessage / onNewMessage(/.dm)
|
||||
│ • registerCommands: /new (reset topic), /stop (interrupt)
|
||||
│
|
||||
▼
|
||||
chatBot.webhooks[platform](req) ← Chat SDK parses → fires events
|
||||
│
|
||||
▼
|
||||
AgentBridgeService.handleMention / handleSubscribedMessage
|
||||
│ • activeThreads guard (no duplicate runs per thread)
|
||||
│ • adds 👀 reaction (eyes), startTyping
|
||||
│ • merges debounced/queued skipped messages (mergeSkippedMessages)
|
||||
│ • extractFiles (buffer → fetchData → url)
|
||||
│ • formatPrompt (sanitize mention + speaker tag + referenced_message)
|
||||
│
|
||||
├── In-memory mode ──► AiAgentService.execAgent({ stepCallbacks })
|
||||
│ → onAfterStep edits progress message live
|
||||
│ → onComplete edits final reply, splits via splitMessage(charLimit)
|
||||
│
|
||||
└── Queue mode (isQueueAgentRuntimeEnabled) ──► execAgent({ stepWebhook, completionWebhook, webhookDelivery: 'qstash' })
|
||||
→ returns immediately, callbacks land at /api/agent/webhooks/bot-callback
|
||||
```
|
||||
|
||||
The router caches loaded bots in memory. Cache is **invalidated** by `BotMessageRouter.invalidateBot(platform, appId)` whenever the TRPC `update`/`delete` mutations run, so new credentials/settings take effect on the next webhook.
|
||||
|
||||
## Execution Modes
|
||||
|
||||
### In-memory (default)
|
||||
|
||||
`AgentBridgeService.executeWithInMemoryCallbacks` wraps `execAgent` with `stepCallbacks`. Lives in one process — Promise-based wait, 30-min timeout, edits the same `progressMessage` after every step. Topic title is summarized inline via `SystemAgentService`.
|
||||
|
||||
### Queue (`isQueueAgentRuntimeEnabled`)
|
||||
|
||||
`AgentBridgeService.executeWithWebhooks`:
|
||||
|
||||
1. Posts the `renderStart` placeholder, captures `progressMessageId`.
|
||||
2. Calls `execAgent` with `stepWebhook` and `completionWebhook` pointing at `${INTERNAL_APP_URL ?? APP_URL}/api/agent/webhooks/bot-callback`, plus `webhookDelivery: 'qstash'`.
|
||||
3. Returns immediately; the bridge `finally` block keeps the active-thread marker held until the `completion` callback fires.
|
||||
|
||||
`/api/agent/webhooks/bot-callback/route.ts` verifies the QStash signature and hands off to `BotCallbackService.handleCallback`:
|
||||
|
||||
- `type: 'step'` → `handleStep` re-renders `renderStepProgress`, edits `progressMessageId` (skipped if `displayToolCalls=false` or platform `supportsMessageEdit=false`).
|
||||
- `type: 'completion'` → `handleCompletion` writes the final reply (or error/interrupted message), removes the 👀 reaction, clears active-thread tracker, fires async `summarizeTopicTitle`.
|
||||
|
||||
`BotCallbackService.createMessenger` reloads provider + credentials from DB and rebuilds a `PlatformClient` per call (no in-memory state).
|
||||
|
||||
## Commands
|
||||
|
||||
Defined in `BotMessageRouter.buildCommands` and registered via two paths:
|
||||
|
||||
- **Native slash commands** (Slack/Discord): `bot.onSlashCommand('/<name>', ...)`
|
||||
- **Text-based fallback** (Telegram/Feishu/QQ/Lark/WeChat): `bot.onNewMessage(/^\/(new|stop)(\s|$|@)/, ...)` plus a per-mention `tryDispatch` so commands work even before subscribe.
|
||||
|
||||
Built-in commands:
|
||||
|
||||
- `/new` — clears `topicId` in thread state, next message starts a fresh topic.
|
||||
- `/stop` — interrupts the active execution (calls `AiAgentService.interruptTask` if `operationId` is known; otherwise queues a deferred stop via `requestStop`/`pendingStopThreads`, also aborts the startup phase via `startupControllers`).
|
||||
|
||||
To add a command, append to `buildCommands` — it auto-registers everywhere; on Telegram it also surfaces in the `/` menu via `client.registerBotCommands` → `setMyCommands`.
|
||||
|
||||
## Active-thread State (statics on `AgentBridgeService`)
|
||||
|
||||
- `activeThreads: Set<threadId>` — prevents duplicate runs per thread (must guard before stale-topic check, otherwise concurrent messages can drop).
|
||||
- `activeOperations: Map<threadId, operationId>` — needed by `/stop` once `execAgent` returns.
|
||||
- `startupControllers: Map<threadId, AbortController>` — cancels pre-`operationId` work (topic/tool prep).
|
||||
- `pendingStopThreads: Set<threadId>` — `/stop` arrived before `operationId` existed; consumed once available.
|
||||
|
||||
In **queue mode**, the bridge `finally` skips cleanup so the marker persists until `BotCallbackService.handleCompletion` calls `clearActiveThread`.
|
||||
|
||||
## Topic Lifecycle in Threads
|
||||
|
||||
- `handleMention` always treats the message as the start of a new conversation.
|
||||
- `handleSubscribedMessage` reads `topicId` from `thread.state`. If the topic is stale (`> 4 hours` since `updatedAt`), state is cleared and it retries as a fresh mention.
|
||||
- If `execAgent` fails with a Postgres FK violation on `topic_id` (cached topic was deleted), the bridge clears state and retries as a mention.
|
||||
- `subscribe()` is gated by `client.shouldSubscribe(threadId)` — Discord top-level channels return `false` so we don't follow up there.
|
||||
|
||||
## Attachments
|
||||
|
||||
`AgentBridgeService.extractFiles` resolves attachments in priority order:
|
||||
|
||||
1. `att.buffer` — already downloaded by the adapter (WeChat/Feishu inbound).
|
||||
2. `att.fetchData()` — adapter-provided lazy download with auth (Telegram, Slack, Feishu history). **Required** when URLs are token-protected — naive `fetch(url)` later in `ingestAttachment.ts` has no credentials.
|
||||
3. `att.url` — public CDN fallback (Discord, public QQ).
|
||||
|
||||
`inferMimeType` / `inferName` patch Telegram-style `photo` payloads (no `mimeType`/`name` from Bot API → defaults to `image/jpeg`) so vision models actually see them. Quoted-message attachments are also pulled from `raw.referenced_message.attachments` (Discord).
|
||||
|
||||
## Concurrency
|
||||
|
||||
`settings.concurrency` is `'queue'` or `'debounce'`:
|
||||
|
||||
- `debounce` → Chat SDK debounces inbound messages by `debounceMs`; `mergeSkippedMessages` joins skipped texts/attachments into the current message before handing to the agent.
|
||||
- `queue` → Chat SDK serializes per-thread; the bridge's own `activeThreads` set is still required because in queue mode the SDK lock releases before the agent finishes.
|
||||
|
||||
## Gateway (persistent platforms)
|
||||
|
||||
Webhook platforms run fine in serverless functions. Persistent platforms (`websocket`, `polling`) need a long-running listener — that's the **gateway**.
|
||||
|
||||
**`GatewayService.startClient(platform, appId, userId)`** (`src/server/services/gateway/index.ts`):
|
||||
|
||||
- On Vercel + persistent mode → `BotConnectQueue.push` (Redis hash) and mark runtime status `queued`. The cron picks it up.
|
||||
- On Vercel + webhook mode → start the client inline (one HTTP call).
|
||||
- Off-Vercel → `GatewayManager` singleton holds long-lived clients in process.
|
||||
|
||||
**`GET /api/agent/gateway/route.ts`** (cron, `Bearer ${CRON_SECRET}`):
|
||||
|
||||
- Iterates registered platforms and starts every enabled persistent provider with `durationMs = 10min`, then in `after(...)` polls `BotConnectQueue` every 30s for new connect requests, until the window expires.
|
||||
- `getEffectiveConnectionMode(platform, settings)` is the only place that resolves per-provider mode — respect it everywhere.
|
||||
|
||||
**`POST /api/agent/gateway/start/route.ts`** is the non-Vercel `ensureRunning` entry point (`Bearer ${KEY_VAULTS_SECRET}`).
|
||||
|
||||
**Runtime status** is stored in Redis at `bot:runtime-status:platform:appId` with TTL ≈ `durationMs + 60s`. States: `starting | connected | disconnected | failed | queued`. Updated by each `PlatformClient.start/stop` and by the gateway service.
|
||||
|
||||
## Platform Definitions
|
||||
|
||||
Each platform exposes a `PlatformDefinition` registered in `platforms/index.ts`:
|
||||
|
||||
```ts
|
||||
{
|
||||
id: 'discord',
|
||||
name: 'Discord',
|
||||
connectionMode: 'websocket', // recommended default
|
||||
schema: FieldSchema[], // applicationId + credentials + settings
|
||||
clientFactory: new DiscordClientFactory(),
|
||||
supportsMarkdown?: boolean, // default true
|
||||
supportsMessageEdit?: boolean, // default true
|
||||
documentation?: { portalUrl, setupGuideUrl },
|
||||
}
|
||||
```
|
||||
|
||||
`schema` drives both server validation (`mergeWithDefaults`, `extractDefaults`) **and** the auto-generated UI form. Top-level keys `applicationId` / `credentials` / `settings` map to DB columns. Common settings fields live in `platforms/const.ts` (`displayToolCallsField`, `serverIdField`, `userIdField`).
|
||||
|
||||
Each platform implements `PlatformClient` (see `platforms/types.ts`):
|
||||
|
||||
- Lifecycle: `start(opts?)`, `stop()`
|
||||
- Inbound: `createAdapter()` → Chat SDK adapter map
|
||||
- Outbound: `getMessenger(platformThreadId)` → `{ createMessage, editMessage, removeReaction, triggerTyping, updateThreadName? }`
|
||||
- Formatting: `formatMarkdown?`, `formatReply?` (usage-stats footer when `showUsageStats`)
|
||||
- Helpers: `extractChatId`, `parseMessageId`, `sanitizeUserInput`, `shouldSubscribe`, `resolveReactionThreadId`
|
||||
- Optional patches: `applyChatPatches(chatBot)` (Discord uses this for `forwardedInteractions` + `threadRecovery`)
|
||||
- Optional menu: `registerBotCommands(commands)` (Telegram `setMyCommands`)
|
||||
|
||||
`ClientFactory.validateCredentials` is called from the TRPC `testConnection` mutation — implement it to hit the platform API and return useful per-field errors.
|
||||
|
||||
## Database
|
||||
|
||||
**Schema** (`packages/database/src/schemas/agentBotProvider.ts`):
|
||||
|
||||
```ts
|
||||
agent_bot_providers (
|
||||
id uuid pk,
|
||||
agent_id text fk → agents.id (cascade),
|
||||
user_id text fk → users.id (cascade),
|
||||
platform varchar(50), // 'discord' | 'slack' | …
|
||||
application_id varchar(255),
|
||||
credentials text, // KeyVaults-encrypted JSON
|
||||
settings jsonb default '{}',
|
||||
enabled boolean default true,
|
||||
…timestamps
|
||||
)
|
||||
unique (platform, application_id)
|
||||
```
|
||||
|
||||
**Model** (`packages/database/src/models/agentBotProvider.ts`):
|
||||
|
||||
- User-scoped: `create / update / delete / query / findById / findByAgentId / findEnabledByApplicationId`. Credentials are encrypted/decrypted via the injected `KeyVaultsGateKeeper`.
|
||||
- Static (system-wide): `findByPlatformAndAppId`, `findEnabledByPlatform` — used by webhook routing & gateway sync, since they don't have a user context yet.
|
||||
|
||||
**TRPC router** (`src/server/routers/lambda/agentBotProvider.ts`):
|
||||
|
||||
| Procedure | Notes | |
|
||||
| -------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------ |
|
||||
| `listPlatforms` | Returns `SerializedPlatformDefinition[]` (no `clientFactory`) | |
|
||||
| `create` / `update` / `delete` | Calls `BotMessageRouter.invalidateBot` + `GatewayService.stopClient` so changes take effect | |
|
||||
| `list` / `getByAgentId` / `getRuntimeStatus` | Decorate rows with Redis runtime status | |
|
||||
| `connectBot` | Returns \`{ status: 'started' | 'queued' }\` |
|
||||
| `testConnection` | Calls `clientFactory.validateCredentials` | |
|
||||
| `wechatGetQrCode` / `wechatPollQrStatus` | iLink onboarding flow | |
|
||||
|
||||
Client service: `src/services/agentBotProvider.ts`. Store actions: `src/store/agent/slices/bot/action.ts`. UI: `src/routes/(main)/agent/channel/{list,detail}` — settings form is auto-generated from each platform's `schema`.
|
||||
|
||||
## Reply Templates
|
||||
|
||||
`src/server/services/bot/replyTemplate.ts` exports `renderStart`, `renderStepProgress`, `renderFinalReply`, `renderError`, `renderStopped`, `splitMessage`. Step progress carries elapsed time, last LLM content, last tools, totals; final reply uses `client.formatMarkdown` then `client.formatReply` (which optionally appends `formatUsageStats`). `splitMessage(text, charLimit)` chunks at paragraph → line → hard cut.
|
||||
|
||||
`src/server/services/bot/ackPhrases/` provides randomized ack phrases.
|
||||
|
||||
## Key Files
|
||||
|
||||
```plaintext
|
||||
Webhook routes:
|
||||
src/app/(backend)/api/agent/webhooks/[platform]/[[...appId]]/route.ts — inbound catch-all
|
||||
src/app/(backend)/api/agent/webhooks/bot-callback/route.ts — qstash bot callback
|
||||
src/app/(backend)/api/agent/gateway/route.ts — cron gateway (10min window)
|
||||
src/app/(backend)/api/agent/gateway/start/route.ts — non-Vercel ensureRunning
|
||||
|
||||
Bot service:
|
||||
src/server/services/bot/index.ts — barrel
|
||||
src/server/services/bot/BotMessageRouter.ts — lazy bot loading + handler registration + commands
|
||||
src/server/services/bot/AgentBridgeService.ts — Chat SDK ↔ AiAgentService bridge, both exec modes
|
||||
src/server/services/bot/BotCallbackService.ts — qstash callback handler
|
||||
src/server/services/bot/formatPrompt.ts — speaker tag + referenced_message + sanitize
|
||||
src/server/services/bot/replyTemplate.ts — render*/splitMessage
|
||||
src/server/services/bot/ackPhrases/ — randomized acks
|
||||
src/server/services/bot/__tests__/ — unit tests for the above
|
||||
|
||||
Platform abstraction:
|
||||
src/server/services/bot/platforms/index.ts — registry singleton + exports
|
||||
src/server/services/bot/platforms/types.ts — PlatformClient/Definition/FieldSchema/ClientFactory
|
||||
src/server/services/bot/platforms/registry.ts — PlatformRegistry class
|
||||
src/server/services/bot/platforms/utils.ts — mergeWithDefaults, getEffectiveConnectionMode, formatUsageStats, runtimeKey
|
||||
src/server/services/bot/platforms/const.ts — shared FieldSchema fragments (displayToolCalls, serverId, userId)
|
||||
src/server/services/bot/platforms/stripMarkdown.ts — used by no-markdown platforms
|
||||
|
||||
Per-platform (each ships definition.ts, schema.ts, client.ts, const.ts, protocol-spec.md):
|
||||
src/server/services/bot/platforms/discord/ — websocket gateway + chat patches
|
||||
src/server/services/bot/platforms/slack/ — multi-mode (Socket Mode / webhook), markdownToMrkdwn
|
||||
src/server/services/bot/platforms/telegram/ — webhook, markdownToHTML, registerBotCommands
|
||||
src/server/services/bot/platforms/feishu/ — feishu + lark share client/schema (definitions/{feishu,lark,shared}.ts)
|
||||
src/server/services/bot/platforms/qq/ — websocket, no markdown, no edit
|
||||
src/server/services/bot/platforms/wechat/ — long-poll, no markdown, no edit
|
||||
|
||||
Gateway:
|
||||
src/server/services/gateway/index.ts — GatewayService (Vercel-aware startClient/stopClient)
|
||||
src/server/services/gateway/GatewayManager.ts — long-running client registry (non-Vercel)
|
||||
src/server/services/gateway/botConnectQueue.ts — Redis hash queue with TTL
|
||||
src/server/services/gateway/runtimeStatus.ts — Redis bot:runtime-status keys
|
||||
|
||||
Database:
|
||||
packages/database/src/schemas/agentBotProvider.ts — agent_bot_providers table
|
||||
packages/database/src/models/agentBotProvider.ts — encrypted CRUD + system-wide finders
|
||||
|
||||
TRPC + client:
|
||||
src/server/routers/lambda/agentBotProvider.ts — TRPC router
|
||||
src/services/agentBotProvider.ts — client wrapper
|
||||
src/store/agent/slices/bot/action.ts — Zustand actions
|
||||
|
||||
UI:
|
||||
src/routes/(main)/agent/channel/list.tsx — channel list
|
||||
src/routes/(main)/agent/channel/detail/ — auto-generated form (Header/Body/Footer)
|
||||
src/routes/(main)/agent/channel/const.ts — platform icons
|
||||
|
||||
Types & runtime status:
|
||||
src/types/botRuntimeStatus.ts — BOT_RUNTIME_STATUSES enum + snapshot type
|
||||
```
|
||||
|
||||
## Adding a New Platform
|
||||
|
||||
1. Create `src/server/services/bot/platforms/<id>/`:
|
||||
- `definition.ts` — `PlatformDefinition` registered in `platforms/index.ts`
|
||||
- `schema.ts` — `FieldSchema[]` (`applicationId` + `credentials` + `settings`); reuse fragments from `../const.ts`
|
||||
- `client.ts` — `class XClientFactory extends ClientFactory` returning a `PlatformClient` (lifecycle + adapter + messenger + helpers)
|
||||
- `const.ts` — `DEFAULT_X_CONNECTION_MODE`, history limits, etc.
|
||||
- `protocol-spec.md` — protocol notes (every existing platform has one)
|
||||
2. Pick the right `connectionMode` — webhook is much simpler if the platform supports it.
|
||||
3. If the platform can't render markdown, set `supportsMarkdown: false` and implement `formatMarkdown` via `stripMarkdown`.
|
||||
4. If it can't edit messages, set `supportsMessageEdit: false` — `BotCallbackService` will skip step edits and only send the final reply.
|
||||
5. Implement `validateCredentials` so the UI's "Test connection" button gives useful errors.
|
||||
6. Add the platform icon in `src/routes/(main)/agent/channel/const.ts` and register the platform in `src/server/services/bot/platforms/index.ts`.
|
||||
7. Add i18n keys under `channel.*` in `src/locales/default/setting.ts` (or wherever the channel namespace lives) — the schema's `label`/`description`/`placeholder`/`enumLabels` are i18n keys.
|
||||
@@ -379,30 +379,621 @@ agent-browser --auto-connect snapshot -i
|
||||
|
||||
# Part 2: osascript (Native macOS App Bot Testing)
|
||||
|
||||
Use AppleScript via `osascript` to control native macOS desktop apps for bot testing. Works with any app that supports macOS Accessibility, no CDP or Chromium needed.
|
||||
Use AppleScript via `osascript` to control native macOS desktop apps for bot testing. This works with any app that supports macOS Accessibility, without needing CDP or Chromium.
|
||||
|
||||
The pattern is the same for every platform:
|
||||
## Core osascript Patterns
|
||||
|
||||
1. **Activate** the app (`tell application "X" to activate`)
|
||||
2. **Navigate** to a channel/chat (Quick Switcher `Cmd+K` or Search `Cmd+F`)
|
||||
3. **Send** a message (clipboard paste `Cmd+V` + Enter)
|
||||
4. **Wait** for the bot response
|
||||
5. **Screenshot** for verification (`screencapture` + `Read` tool)
|
||||
### Activate an App
|
||||
|
||||
## Per-Platform References
|
||||
```bash
|
||||
osascript -e 'tell application "Discord" to activate'
|
||||
```
|
||||
|
||||
Pick the file for your target platform — each contains activation, navigation, send-message, and verification snippets specific to that app:
|
||||
### Type Text
|
||||
|
||||
| Platform | Reference | Quick switcher |
|
||||
| ------------- | ------------------------------------------------ | -------------- |
|
||||
| Discord | [reference/discord.md](./reference/discord.md) | `Cmd+K` |
|
||||
| Slack | [reference/slack.md](./reference/slack.md) | `Cmd+K` |
|
||||
| Telegram | [reference/telegram.md](./reference/telegram.md) | `Cmd+F` |
|
||||
| WeChat / 微信 | [reference/wechat.md](./reference/wechat.md) | `Cmd+F` |
|
||||
| Lark / 飞书 | [reference/lark.md](./reference/lark.md) | `Cmd+K` |
|
||||
| QQ | [reference/qq.md](./reference/qq.md) | `Cmd+F` |
|
||||
```bash
|
||||
# Type character by character (reliable, but slow for long text)
|
||||
osascript -e 'tell application "System Events" to keystroke "Hello world"'
|
||||
|
||||
For **shared osascript patterns** (activate, type, paste, screenshot, read accessibility, common workflow template, gotchas), see [reference/osascript-common.md](./reference/osascript-common.md). Read this first if you're new to osascript automation.
|
||||
# Press Enter
|
||||
osascript -e 'tell application "System Events" to key code 36'
|
||||
|
||||
# Press Tab
|
||||
osascript -e 'tell application "System Events" to key code 48'
|
||||
|
||||
# Press Escape
|
||||
osascript -e 'tell application "System Events" to key code 53'
|
||||
```
|
||||
|
||||
### Paste from Clipboard (fast, for long text)
|
||||
|
||||
```bash
|
||||
# Set clipboard and paste — much faster than keystroke for long messages
|
||||
osascript -e 'set the clipboard to "Your long message here"'
|
||||
osascript -e 'tell application "System Events" to keystroke "v" using command down'
|
||||
```
|
||||
|
||||
Or in one shot:
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
set the clipboard to "Your long message here"
|
||||
tell application "System Events" to keystroke "v" using command down
|
||||
'
|
||||
```
|
||||
|
||||
### Keyboard Shortcuts
|
||||
|
||||
```bash
|
||||
# Cmd+K (quick switcher in Discord/Slack)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
|
||||
# Cmd+F (search)
|
||||
osascript -e 'tell application "System Events" to keystroke "f" using command down'
|
||||
|
||||
# Cmd+N (new message/chat)
|
||||
osascript -e 'tell application "System Events" to keystroke "n" using command down'
|
||||
|
||||
# Cmd+Shift+K (example: multi-modifier)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using {command down, shift down}'
|
||||
```
|
||||
|
||||
### Click at Position
|
||||
|
||||
```bash
|
||||
# Click at absolute screen coordinates
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
click at {500, 300}
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Get Window Info
|
||||
|
||||
```bash
|
||||
# Get window position and size
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
tell process "Discord"
|
||||
get {position, size} of window 1
|
||||
end tell
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Screenshot
|
||||
|
||||
```bash
|
||||
# Full screen
|
||||
screencapture /tmp/screenshot.png
|
||||
|
||||
# Interactive region select
|
||||
screencapture -i /tmp/screenshot.png
|
||||
|
||||
# Specific window (by window ID from CGWindowList)
|
||||
screencapture -l < WINDOW_ID > /tmp/screenshot.png
|
||||
```
|
||||
|
||||
To get window ID for a specific app:
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
tell process "Discord"
|
||||
get id of window 1
|
||||
end tell
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Read Accessibility Elements
|
||||
|
||||
```bash
|
||||
# Get all UI elements of the frontmost window (can be slow/large)
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
tell process "Discord"
|
||||
entire contents of window 1
|
||||
end tell
|
||||
end tell
|
||||
'
|
||||
|
||||
# Get a specific element's value
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
tell process "Discord"
|
||||
get value of text field 1 of window 1
|
||||
end tell
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
> **Warning:** `entire contents` can be extremely slow on complex UIs. Prefer screenshots + `Read` tool for visual verification.
|
||||
|
||||
### Read Screen Text via Clipboard
|
||||
|
||||
For reading the latest message or response from an app:
|
||||
|
||||
```bash
|
||||
# Select all text in the focused area and copy
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "a" using command down
|
||||
keystroke "c" using command down
|
||||
end tell
|
||||
'
|
||||
sleep 0.5
|
||||
# Read clipboard
|
||||
pbpaste
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Client: Discord
|
||||
|
||||
**App name:** `Discord` | **Process name:** `Discord`
|
||||
|
||||
### Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate Discord
|
||||
osascript -e 'tell application "Discord" to activate'
|
||||
sleep 1
|
||||
|
||||
# Open Quick Switcher (Cmd+K) to navigate to a channel
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
sleep 0.5
|
||||
osascript -e 'tell application "System Events" to keystroke "bot-testing"'
|
||||
sleep 1
|
||||
osascript -e 'tell application "System Events" to key code 36' # Enter
|
||||
sleep 2
|
||||
```
|
||||
|
||||
### Send Message to Bot
|
||||
|
||||
```bash
|
||||
# The message input is focused after navigating to a channel
|
||||
# Type a message
|
||||
osascript -e 'tell application "System Events" to keystroke "/hello"'
|
||||
sleep 0.5
|
||||
osascript -e 'tell application "System Events" to key code 36' # Enter
|
||||
```
|
||||
|
||||
### Send Long Message (via clipboard)
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "Discord" to activate
|
||||
delay 0.5
|
||||
set the clipboard to "Write a 3000 word essay about space exploration"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Verify Bot Response
|
||||
|
||||
```bash
|
||||
# Wait for bot to respond, then screenshot
|
||||
sleep 10
|
||||
screencapture /tmp/discord-bot-response.png
|
||||
# Read with the Read tool for visual verification
|
||||
```
|
||||
|
||||
### Full Bot Test Example
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# test-discord-bot.sh — Send message and verify bot response
|
||||
|
||||
# 1. Activate Discord and navigate to channel
|
||||
osascript -e '
|
||||
tell application "Discord" to activate
|
||||
delay 1
|
||||
-- Quick Switcher
|
||||
tell application "System Events" to keystroke "k" using command down
|
||||
delay 0.5
|
||||
tell application "System Events" to keystroke "bot-testing"
|
||||
delay 1
|
||||
tell application "System Events" to key code 36
|
||||
delay 2
|
||||
'
|
||||
|
||||
# 2. Send test message
|
||||
osascript -e '
|
||||
set the clipboard to "!ping"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
|
||||
# 3. Wait for response and capture
|
||||
sleep 5
|
||||
screencapture /tmp/discord-test-result.png
|
||||
echo "Screenshot saved to /tmp/discord-test-result.png"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Client: Slack
|
||||
|
||||
**App name:** `Slack` | **Process name:** `Slack`
|
||||
|
||||
### Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate Slack
|
||||
osascript -e 'tell application "Slack" to activate'
|
||||
sleep 1
|
||||
|
||||
# Quick Switcher (Cmd+K)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
sleep 0.5
|
||||
osascript -e 'tell application "System Events" to keystroke "bot-testing"'
|
||||
sleep 1
|
||||
osascript -e 'tell application "System Events" to key code 36' # Enter
|
||||
sleep 2
|
||||
```
|
||||
|
||||
### Send Message to Bot
|
||||
|
||||
```bash
|
||||
# Direct message input (focused after channel nav)
|
||||
osascript -e 'tell application "System Events" to keystroke "@mybot hello"'
|
||||
sleep 0.3
|
||||
osascript -e 'tell application "System Events" to key code 36'
|
||||
```
|
||||
|
||||
### Send Long Message
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "Slack" to activate
|
||||
delay 0.5
|
||||
set the clipboard to "A long test message for the bot..."
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Slash Command Test
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "Slack" to activate
|
||||
delay 0.5
|
||||
tell application "System Events"
|
||||
keystroke "/ask What is the meaning of life?"
|
||||
delay 0.5
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/slack-bot-response.png
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Client: Telegram
|
||||
|
||||
**App name:** `Telegram` | **Process name:** `Telegram`
|
||||
|
||||
### Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate Telegram
|
||||
osascript -e 'tell application "Telegram" to activate'
|
||||
sleep 1
|
||||
|
||||
# Search for a bot (Cmd+F or click search)
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "f" using command down
|
||||
delay 0.5
|
||||
keystroke "MyTestBot"
|
||||
delay 1
|
||||
key code 36 -- Enter to select
|
||||
end tell
|
||||
'
|
||||
sleep 2
|
||||
```
|
||||
|
||||
### Send Message to Bot
|
||||
|
||||
```bash
|
||||
# After navigating to bot chat, input is focused
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "/start"
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Send Long Message
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "Telegram" to activate
|
||||
delay 0.5
|
||||
set the clipboard to "Tell me about quantum computing in detail"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/telegram-bot-response.png
|
||||
```
|
||||
|
||||
### Telegram Bot API (programmatic alternative)
|
||||
|
||||
For sending messages directly to the bot's chat without UI:
|
||||
|
||||
```bash
|
||||
# Send message as the bot (for testing webhooks/responses)
|
||||
curl -s "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
|
||||
-d "chat_id=$CHAT_ID&text=test message"
|
||||
|
||||
# Get recent updates
|
||||
curl -s "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/getUpdates?limit=5" | jq .
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Client: WeChat / 微信
|
||||
|
||||
**App name:** `微信` or `WeChat` | **Process name:** `WeChat`
|
||||
|
||||
### Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate WeChat
|
||||
osascript -e 'tell application "微信" to activate'
|
||||
sleep 1
|
||||
|
||||
# Search for a contact/bot (Cmd+F)
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "f" using command down
|
||||
delay 0.5
|
||||
keystroke "TestBot"
|
||||
delay 1
|
||||
key code 36 -- Enter to select
|
||||
end tell
|
||||
'
|
||||
sleep 2
|
||||
```
|
||||
|
||||
### Send Message
|
||||
|
||||
```bash
|
||||
# After navigating to a chat, the input is focused
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "Hello bot!"
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Send Long Message (clipboard)
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "微信" to activate
|
||||
delay 0.5
|
||||
set the clipboard to "Please help me with this task..."
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/wechat-bot-response.png
|
||||
```
|
||||
|
||||
### WeChat-Specific Notes
|
||||
|
||||
- WeChat macOS app name can be `微信` or `WeChat` depending on system language. Try both:
|
||||
```bash
|
||||
osascript -e 'tell application "微信" to activate' 2> /dev/null \
|
||||
|| osascript -e 'tell application "WeChat" to activate'
|
||||
```
|
||||
- WeChat uses **Enter** to send (not Cmd+Enter by default, but configurable)
|
||||
- For multi-line messages without sending, use **Shift+Enter**:
|
||||
```bash
|
||||
osascript -e 'tell application "System Events" to key code 36 using shift down'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Client: Lark / 飞书
|
||||
|
||||
**App name:** `Lark` or `飞书` | **Process name:** `Lark` or `飞书`
|
||||
|
||||
### Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate Lark (auto-detects Lark or 飞书)
|
||||
osascript -e 'tell application "Lark" to activate' 2> /dev/null \
|
||||
|| osascript -e 'tell application "飞书" to activate'
|
||||
sleep 1
|
||||
|
||||
# Quick Switcher / Search (Cmd+K)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
sleep 0.5
|
||||
osascript -e '
|
||||
set the clipboard to "bot-testing"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 1.5
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
sleep 2
|
||||
```
|
||||
|
||||
### Send Message to Bot
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
set the clipboard to "@MyBot help me with this task"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/lark-bot-response.png
|
||||
```
|
||||
|
||||
### Lark-Specific Notes
|
||||
|
||||
- App name varies: `Lark` (international) vs `飞书` (China mainland) — the script auto-detects
|
||||
- Uses `Cmd+K` for quick search (same as Discord/Slack)
|
||||
- Enter sends message by default
|
||||
|
||||
---
|
||||
|
||||
## Client: QQ
|
||||
|
||||
**App name:** `QQ` | **Process name:** `QQ`
|
||||
|
||||
### Activate & Navigate
|
||||
|
||||
```bash
|
||||
osascript -e 'tell application "QQ" to activate'
|
||||
sleep 1
|
||||
|
||||
# Search for contact/group (Cmd+F)
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "f" using command down
|
||||
delay 0.8
|
||||
end tell
|
||||
'
|
||||
osascript -e '
|
||||
set the clipboard to "bot-testing"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 1.5
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
sleep 2
|
||||
```
|
||||
|
||||
### Send Message to Bot
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
set the clipboard to "Hello bot!"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/qq-bot-response.png
|
||||
```
|
||||
|
||||
### QQ-Specific Notes
|
||||
|
||||
- Enter sends message by default; Shift+Enter for newlines
|
||||
- Uses `Cmd+F` for search
|
||||
- Always use clipboard paste for CJK characters
|
||||
|
||||
---
|
||||
|
||||
## Common Bot Testing Workflow (osascript)
|
||||
|
||||
Regardless of platform, the pattern is:
|
||||
|
||||
```bash
|
||||
APP_NAME="Discord" # or "Slack", "Telegram", "微信"
|
||||
CHANNEL="bot-testing"
|
||||
MESSAGE="Hello bot!"
|
||||
WAIT_SECONDS=10
|
||||
|
||||
# 1. Activate
|
||||
osascript -e "tell application \"$APP_NAME\" to activate"
|
||||
sleep 1
|
||||
|
||||
# 2. Navigate to channel/chat (via Quick Switcher or Search)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
sleep 0.5
|
||||
osascript -e "tell application \"System Events\" to keystroke \"$CHANNEL\""
|
||||
sleep 1
|
||||
osascript -e 'tell application "System Events" to key code 36'
|
||||
sleep 2
|
||||
|
||||
# 3. Send message
|
||||
osascript -e "set the clipboard to \"$MESSAGE\""
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
|
||||
# 4. Wait for bot response
|
||||
sleep "$WAIT_SECONDS"
|
||||
|
||||
# 5. Screenshot for verification
|
||||
screencapture /tmp/"${APP_NAME,,}"-bot-test.png
|
||||
echo "Result saved to /tmp/${APP_NAME,,}-bot-test.png"
|
||||
```
|
||||
|
||||
### Tips
|
||||
|
||||
- **Use clipboard paste** (`Cmd+V`) for messages containing special characters or long text — `keystroke` can mangle non-ASCII
|
||||
- **Add `delay`** between actions — apps need time to process UI events
|
||||
- **Screenshot for verification** — use `screencapture` + `Read` tool for visual checks
|
||||
- **Use a dedicated test channel/chat** — avoid polluting real conversations
|
||||
- **Check app name** — some apps have different names in different locales (e.g., `微信` vs `WeChat`)
|
||||
- **Accessibility permissions required** — System Events automation requires granting Accessibility access in System Preferences > Privacy & Security > Accessibility
|
||||
|
||||
---
|
||||
|
||||
@@ -415,7 +1006,6 @@ Ready-to-use scripts in `.agents/skills/local-testing/scripts/`:
|
||||
| `electron-dev.sh` | Manage Electron dev env (start/stop/status/restart) |
|
||||
| `capture-app-window.sh` | Capture screenshot of a specific app window |
|
||||
| `record-electron-demo.sh` | Record Electron app demo with ffmpeg |
|
||||
| `record-app-screen.sh` | Record app screen (video + screenshots, start/stop) |
|
||||
| `test-discord-bot.sh` | Send message to Discord bot via osascript |
|
||||
| `test-slack-bot.sh` | Send message to Slack bot via osascript |
|
||||
| `test-telegram-bot.sh` | Send message to Telegram bot via osascript |
|
||||
@@ -478,16 +1068,25 @@ Each script: activates the app, navigates to the channel/contact, pastes the mes
|
||||
|
||||
# Screen Recording
|
||||
|
||||
Record automated demos using `record-app-screen.sh` (start/stop lifecycle, CDP screenshots + ffmpeg assembly). See [references/record-app-screen.md](references/record-app-screen.md) for full documentation.
|
||||
Record automated demos by combining `ffmpeg` screen capture with `agent-browser` automation. The script `.agents/skills/local-testing/scripts/record-electron-demo.sh` handles the full lifecycle for Electron.
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
./.agents/skills/local-testing/scripts/electron-dev.sh start
|
||||
./.agents/skills/local-testing/scripts/record-app-screen.sh start my-demo
|
||||
# ... run automation ...
|
||||
./.agents/skills/local-testing/scripts/record-app-screen.sh stop
|
||||
# Run the built-in demo (queue-edit feature)
|
||||
./.agents/skills/local-testing/scripts/record-electron-demo.sh
|
||||
|
||||
# Run a custom automation script
|
||||
./.agents/skills/local-testing/scripts/record-electron-demo.sh ./my-demo.sh /tmp/my-demo.mp4
|
||||
```
|
||||
|
||||
Outputs to `.records/` directory (gitignored): `<name>.mp4` (video) + `<name>/` (screenshots every 3s).
|
||||
The script automatically:
|
||||
|
||||
1. Starts Electron with CDP and waits for SPA to load
|
||||
2. Detects window position, screen, and Retina scale via Swift/CGWindowList
|
||||
3. Records only the Electron window region using `ffmpeg -f avfoundation` with crop
|
||||
4. Runs the demo (built-in or custom script receiving CDP port as `$1`)
|
||||
5. Stops recording and cleans up
|
||||
|
||||
---
|
||||
|
||||
@@ -513,4 +1112,14 @@ Outputs to `.records/` directory (gitignored): `<name>.mp4` (video) + `<name>/`
|
||||
|
||||
### osascript
|
||||
|
||||
See [reference/osascript-common.md](./reference/osascript-common.md#gotchas) for the full osascript gotchas list (accessibility permissions, `keystroke` non-ASCII issues, locale-specific app names, rate limiting, etc.).
|
||||
- **Accessibility permission required** — first run will prompt for access; grant it in System Preferences > Privacy & Security > Accessibility for Terminal / iTerm / Claude Code
|
||||
- **`keystroke` is slow for long text** — always use clipboard paste (`Cmd+V`) for messages over \~20 characters
|
||||
- **`keystroke` can mangle non-ASCII** — use clipboard paste for Chinese, emoji, or special characters
|
||||
- **`key code 36` is Enter** — this is the hardware key code, works regardless of keyboard layout
|
||||
- **`entire contents` is extremely slow** — avoid for complex UIs; use screenshots instead
|
||||
- **App name varies by locale** — `微信` vs `WeChat`, `企业微信` vs `WeCom`; handle both
|
||||
- **WeChat Enter sends immediately** — use `Shift+Enter` for newlines within a message
|
||||
- **Rate limiting** — don't send messages too fast; platforms may throttle or flag automated input
|
||||
- **Lark / 飞书 app name varies** — `Lark` (international) vs `飞书` (China mainland); scripts auto-detect
|
||||
- **QQ uses `Cmd+F` for search** — not `Cmd+K` like Discord/Slack/Lark
|
||||
- **Bot response times vary** — AI-powered bots may take 10-60s; use generous sleep values
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
# Discord Bot Testing
|
||||
|
||||
**App name:** `Discord` | **Process name:** `Discord`
|
||||
|
||||
See [osascript-common.md](./osascript-common.md) for shared patterns.
|
||||
|
||||
## Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate Discord
|
||||
osascript -e 'tell application "Discord" to activate'
|
||||
sleep 1
|
||||
|
||||
# Open Quick Switcher (Cmd+K) to navigate to a channel
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
sleep 0.5
|
||||
osascript -e 'tell application "System Events" to keystroke "bot-testing"'
|
||||
sleep 1
|
||||
osascript -e 'tell application "System Events" to key code 36' # Enter
|
||||
sleep 2
|
||||
```
|
||||
|
||||
## Send Message to Bot
|
||||
|
||||
```bash
|
||||
# The message input is focused after navigating to a channel
|
||||
# Type a message
|
||||
osascript -e 'tell application "System Events" to keystroke "/hello"'
|
||||
sleep 0.5
|
||||
osascript -e 'tell application "System Events" to key code 36' # Enter
|
||||
```
|
||||
|
||||
## Send Long Message (via clipboard)
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "Discord" to activate
|
||||
delay 0.5
|
||||
set the clipboard to "Write a 3000 word essay about space exploration"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Verify Bot Response
|
||||
|
||||
```bash
|
||||
# Wait for bot to respond, then screenshot
|
||||
sleep 10
|
||||
screencapture /tmp/discord-bot-response.png
|
||||
# Read with the Read tool for visual verification
|
||||
```
|
||||
|
||||
## Full Bot Test Example
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# test-discord-bot.sh — Send message and verify bot response
|
||||
|
||||
# 1. Activate Discord and navigate to channel
|
||||
osascript -e '
|
||||
tell application "Discord" to activate
|
||||
delay 1
|
||||
-- Quick Switcher
|
||||
tell application "System Events" to keystroke "k" using command down
|
||||
delay 0.5
|
||||
tell application "System Events" to keystroke "bot-testing"
|
||||
delay 1
|
||||
tell application "System Events" to key code 36
|
||||
delay 2
|
||||
'
|
||||
|
||||
# 2. Send test message
|
||||
osascript -e '
|
||||
set the clipboard to "!ping"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
|
||||
# 3. Wait for response and capture
|
||||
sleep 5
|
||||
screencapture /tmp/discord-test-result.png
|
||||
echo "Screenshot saved to /tmp/discord-test-result.png"
|
||||
```
|
||||
|
||||
## Script
|
||||
|
||||
```bash
|
||||
./.agents/skills/local-testing/scripts/test-discord-bot.sh "bot-testing" "!ping"
|
||||
./.agents/skills/local-testing/scripts/test-discord-bot.sh "bot-testing" "/ask Tell me a joke" 30
|
||||
```
|
||||
@@ -1,61 +0,0 @@
|
||||
# Lark / 飞书 Bot Testing
|
||||
|
||||
**App name:** `Lark` or `飞书` | **Process name:** `Lark` or `飞书`
|
||||
|
||||
See [osascript-common.md](./osascript-common.md) for shared patterns.
|
||||
|
||||
## Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate Lark (auto-detects Lark or 飞书)
|
||||
osascript -e 'tell application "Lark" to activate' 2> /dev/null \
|
||||
|| osascript -e 'tell application "飞书" to activate'
|
||||
sleep 1
|
||||
|
||||
# Quick Switcher / Search (Cmd+K)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
sleep 0.5
|
||||
osascript -e '
|
||||
set the clipboard to "bot-testing"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 1.5
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
sleep 2
|
||||
```
|
||||
|
||||
## Send Message to Bot
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
set the clipboard to "@MyBot help me with this task"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/lark-bot-response.png
|
||||
```
|
||||
|
||||
## Lark-Specific Notes
|
||||
|
||||
- App name varies: `Lark` (international) vs `飞书` (China mainland) — the script auto-detects
|
||||
- Uses `Cmd+K` for quick search (same as Discord/Slack)
|
||||
- Enter sends message by default
|
||||
- Always use clipboard paste for CJK characters
|
||||
|
||||
## Script
|
||||
|
||||
```bash
|
||||
./.agents/skills/local-testing/scripts/test-lark-bot.sh "bot-testing" "@MyBot hello"
|
||||
./.agents/skills/local-testing/scripts/test-lark-bot.sh "bot-testing" "Help me with this" 30
|
||||
```
|
||||
@@ -1,217 +0,0 @@
|
||||
# osascript Common Patterns
|
||||
|
||||
Shared AppleScript / `osascript` patterns used by all platform bot tests. Read this first, then refer to the per-platform file for app-specific quirks.
|
||||
|
||||
## Core Patterns
|
||||
|
||||
### Activate an App
|
||||
|
||||
```bash
|
||||
osascript -e 'tell application "Discord" to activate'
|
||||
```
|
||||
|
||||
### Type Text
|
||||
|
||||
```bash
|
||||
# Type character by character (reliable, but slow for long text)
|
||||
osascript -e 'tell application "System Events" to keystroke "Hello world"'
|
||||
|
||||
# Press Enter
|
||||
osascript -e 'tell application "System Events" to key code 36'
|
||||
|
||||
# Press Tab
|
||||
osascript -e 'tell application "System Events" to key code 48'
|
||||
|
||||
# Press Escape
|
||||
osascript -e 'tell application "System Events" to key code 53'
|
||||
```
|
||||
|
||||
### Paste from Clipboard (fast, for long text)
|
||||
|
||||
```bash
|
||||
# Set clipboard and paste — much faster than keystroke for long messages
|
||||
osascript -e 'set the clipboard to "Your long message here"'
|
||||
osascript -e 'tell application "System Events" to keystroke "v" using command down'
|
||||
```
|
||||
|
||||
Or in one shot:
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
set the clipboard to "Your long message here"
|
||||
tell application "System Events" to keystroke "v" using command down
|
||||
'
|
||||
```
|
||||
|
||||
### Keyboard Shortcuts
|
||||
|
||||
```bash
|
||||
# Cmd+K (quick switcher in Discord/Slack)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
|
||||
# Cmd+F (search)
|
||||
osascript -e 'tell application "System Events" to keystroke "f" using command down'
|
||||
|
||||
# Cmd+N (new message/chat)
|
||||
osascript -e 'tell application "System Events" to keystroke "n" using command down'
|
||||
|
||||
# Cmd+Shift+K (example: multi-modifier)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using {command down, shift down}'
|
||||
```
|
||||
|
||||
### Click at Position
|
||||
|
||||
```bash
|
||||
# Click at absolute screen coordinates
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
click at {500, 300}
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Get Window Info
|
||||
|
||||
```bash
|
||||
# Get window position and size
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
tell process "Discord"
|
||||
get {position, size} of window 1
|
||||
end tell
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Screenshot
|
||||
|
||||
```bash
|
||||
# Full screen
|
||||
screencapture /tmp/screenshot.png
|
||||
|
||||
# Interactive region select
|
||||
screencapture -i /tmp/screenshot.png
|
||||
|
||||
# Specific window (by window ID from CGWindowList)
|
||||
screencapture -l < WINDOW_ID > /tmp/screenshot.png
|
||||
```
|
||||
|
||||
To get window ID for a specific app:
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
tell process "Discord"
|
||||
get id of window 1
|
||||
end tell
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
### Read Accessibility Elements
|
||||
|
||||
```bash
|
||||
# Get all UI elements of the frontmost window (can be slow/large)
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
tell process "Discord"
|
||||
entire contents of window 1
|
||||
end tell
|
||||
end tell
|
||||
'
|
||||
|
||||
# Get a specific element's value
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
tell process "Discord"
|
||||
get value of text field 1 of window 1
|
||||
end tell
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
> **Warning:** `entire contents` can be extremely slow on complex UIs. Prefer screenshots + `Read` tool for visual verification.
|
||||
|
||||
### Read Screen Text via Clipboard
|
||||
|
||||
For reading the latest message or response from an app:
|
||||
|
||||
```bash
|
||||
# Select all text in the focused area and copy
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "a" using command down
|
||||
keystroke "c" using command down
|
||||
end tell
|
||||
'
|
||||
sleep 0.5
|
||||
# Read clipboard
|
||||
pbpaste
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Bot Testing Workflow
|
||||
|
||||
Regardless of platform, the pattern is:
|
||||
|
||||
```bash
|
||||
APP_NAME="Discord" # or "Slack", "Telegram", "微信"
|
||||
CHANNEL="bot-testing"
|
||||
MESSAGE="Hello bot!"
|
||||
WAIT_SECONDS=10
|
||||
|
||||
# 1. Activate
|
||||
osascript -e "tell application \"$APP_NAME\" to activate"
|
||||
sleep 1
|
||||
|
||||
# 2. Navigate to channel/chat (via Quick Switcher or Search)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
sleep 0.5
|
||||
osascript -e "tell application \"System Events\" to keystroke \"$CHANNEL\""
|
||||
sleep 1
|
||||
osascript -e 'tell application "System Events" to key code 36'
|
||||
sleep 2
|
||||
|
||||
# 3. Send message
|
||||
osascript -e "set the clipboard to \"$MESSAGE\""
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
|
||||
# 4. Wait for bot response
|
||||
sleep "$WAIT_SECONDS"
|
||||
|
||||
# 5. Screenshot for verification
|
||||
screencapture /tmp/"${APP_NAME,,}"-bot-test.png
|
||||
echo "Result saved to /tmp/${APP_NAME,,}-bot-test.png"
|
||||
```
|
||||
|
||||
### Tips
|
||||
|
||||
- **Use clipboard paste** (`Cmd+V`) for messages containing special characters or long text — `keystroke` can mangle non-ASCII
|
||||
- **Add `delay`** between actions — apps need time to process UI events
|
||||
- **Screenshot for verification** — use `screencapture` + `Read` tool for visual checks
|
||||
- **Use a dedicated test channel/chat** — avoid polluting real conversations
|
||||
- **Check app name** — some apps have different names in different locales (e.g., `微信` vs `WeChat`)
|
||||
- **Accessibility permissions required** — System Events automation requires granting Accessibility access in System Preferences > Privacy & Security > Accessibility
|
||||
|
||||
---
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **Accessibility permission required** — first run will prompt for access; grant it in System Preferences > Privacy & Security > Accessibility for Terminal / iTerm / Claude Code
|
||||
- **`keystroke` is slow for long text** — always use clipboard paste (`Cmd+V`) for messages over \~20 characters
|
||||
- **`keystroke` can mangle non-ASCII** — use clipboard paste for Chinese, emoji, or special characters
|
||||
- **`key code 36` is Enter** — this is the hardware key code, works regardless of keyboard layout
|
||||
- **`entire contents` is extremely slow** — avoid for complex UIs; use screenshots instead
|
||||
- **App name varies by locale** — `微信` vs `WeChat`, `企业微信` vs `WeCom`; handle both
|
||||
- **WeChat Enter sends immediately** — use `Shift+Enter` for newlines within a message
|
||||
- **Rate limiting** — don't send messages too fast; platforms may throttle or flag automated input
|
||||
- **Lark / 飞书 app name varies** — `Lark` (international) vs `飞书` (China mainland); scripts auto-detect
|
||||
- **QQ uses `Cmd+F` for search** — not `Cmd+K` like Discord/Slack/Lark
|
||||
- **Bot response times vary** — AI-powered bots may take 10-60s; use generous sleep values
|
||||
@@ -1,62 +0,0 @@
|
||||
# QQ Bot Testing
|
||||
|
||||
**App name:** `QQ` | **Process name:** `QQ`
|
||||
|
||||
See [osascript-common.md](./osascript-common.md) for shared patterns.
|
||||
|
||||
## Activate & Navigate
|
||||
|
||||
```bash
|
||||
osascript -e 'tell application "QQ" to activate'
|
||||
sleep 1
|
||||
|
||||
# Search for contact/group (Cmd+F)
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "f" using command down
|
||||
delay 0.8
|
||||
end tell
|
||||
'
|
||||
osascript -e '
|
||||
set the clipboard to "bot-testing"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 1.5
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
sleep 2
|
||||
```
|
||||
|
||||
## Send Message to Bot
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
set the clipboard to "Hello bot!"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36 -- Enter
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/qq-bot-response.png
|
||||
```
|
||||
|
||||
## QQ-Specific Notes
|
||||
|
||||
- Enter sends message by default; Shift+Enter for newlines
|
||||
- Uses `Cmd+F` for search (not `Cmd+K` like Discord/Slack/Lark)
|
||||
- Always use clipboard paste for CJK characters
|
||||
|
||||
## Script
|
||||
|
||||
```bash
|
||||
./.agents/skills/local-testing/scripts/test-qq-bot.sh "bot-testing" "Hello bot" 15
|
||||
./.agents/skills/local-testing/scripts/test-qq-bot.sh "MyBot" "/help" 10
|
||||
```
|
||||
@@ -1,73 +0,0 @@
|
||||
# Slack Bot Testing
|
||||
|
||||
**App name:** `Slack` | **Process name:** `Slack`
|
||||
|
||||
See [osascript-common.md](./osascript-common.md) for shared patterns.
|
||||
|
||||
## Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate Slack
|
||||
osascript -e 'tell application "Slack" to activate'
|
||||
sleep 1
|
||||
|
||||
# Quick Switcher (Cmd+K)
|
||||
osascript -e 'tell application "System Events" to keystroke "k" using command down'
|
||||
sleep 0.5
|
||||
osascript -e 'tell application "System Events" to keystroke "bot-testing"'
|
||||
sleep 1
|
||||
osascript -e 'tell application "System Events" to key code 36' # Enter
|
||||
sleep 2
|
||||
```
|
||||
|
||||
## Send Message to Bot
|
||||
|
||||
```bash
|
||||
# Direct message input (focused after channel nav)
|
||||
osascript -e 'tell application "System Events" to keystroke "@mybot hello"'
|
||||
sleep 0.3
|
||||
osascript -e 'tell application "System Events" to key code 36'
|
||||
```
|
||||
|
||||
## Send Long Message
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "Slack" to activate
|
||||
delay 0.5
|
||||
set the clipboard to "A long test message for the bot..."
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Slash Command Test
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "Slack" to activate
|
||||
delay 0.5
|
||||
tell application "System Events"
|
||||
keystroke "/ask What is the meaning of life?"
|
||||
delay 0.5
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/slack-bot-response.png
|
||||
```
|
||||
|
||||
## Script
|
||||
|
||||
```bash
|
||||
./.agents/skills/local-testing/scripts/test-slack-bot.sh "bot-testing" "@mybot hello"
|
||||
./.agents/skills/local-testing/scripts/test-slack-bot.sh "bot-testing" "/ask What is 2+2?" 20
|
||||
```
|
||||
@@ -1,80 +0,0 @@
|
||||
# Telegram Bot Testing
|
||||
|
||||
**App name:** `Telegram` | **Process name:** `Telegram`
|
||||
|
||||
See [osascript-common.md](./osascript-common.md) for shared patterns.
|
||||
|
||||
## Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate Telegram
|
||||
osascript -e 'tell application "Telegram" to activate'
|
||||
sleep 1
|
||||
|
||||
# Search for a bot (Cmd+F or click search)
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "f" using command down
|
||||
delay 0.5
|
||||
keystroke "MyTestBot"
|
||||
delay 1
|
||||
key code 36 -- Enter to select
|
||||
end tell
|
||||
'
|
||||
sleep 2
|
||||
```
|
||||
|
||||
## Send Message to Bot
|
||||
|
||||
```bash
|
||||
# After navigating to bot chat, input is focused
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "/start"
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Send Long Message
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "Telegram" to activate
|
||||
delay 0.5
|
||||
set the clipboard to "Tell me about quantum computing in detail"
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/telegram-bot-response.png
|
||||
```
|
||||
|
||||
## Telegram Bot API (programmatic alternative)
|
||||
|
||||
For sending messages directly to the bot's chat without UI:
|
||||
|
||||
```bash
|
||||
# Send message as the bot (for testing webhooks/responses)
|
||||
curl -s "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
|
||||
-d "chat_id=$CHAT_ID&text=test message"
|
||||
|
||||
# Get recent updates
|
||||
curl -s "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/getUpdates?limit=5" | jq .
|
||||
```
|
||||
|
||||
## Script
|
||||
|
||||
```bash
|
||||
./.agents/skills/local-testing/scripts/test-telegram-bot.sh "MyTestBot" "/start"
|
||||
./.agents/skills/local-testing/scripts/test-telegram-bot.sh "GPTBot" "Hello" 60
|
||||
```
|
||||
@@ -1,81 +0,0 @@
|
||||
# WeChat / 微信 Bot Testing
|
||||
|
||||
**App name:** `微信` or `WeChat` | **Process name:** `WeChat`
|
||||
|
||||
See [osascript-common.md](./osascript-common.md) for shared patterns.
|
||||
|
||||
## Activate & Navigate
|
||||
|
||||
```bash
|
||||
# Activate WeChat
|
||||
osascript -e 'tell application "微信" to activate'
|
||||
sleep 1
|
||||
|
||||
# Search for a contact/bot (Cmd+F)
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "f" using command down
|
||||
delay 0.5
|
||||
keystroke "TestBot"
|
||||
delay 1
|
||||
key code 36 -- Enter to select
|
||||
end tell
|
||||
'
|
||||
sleep 2
|
||||
```
|
||||
|
||||
## Send Message
|
||||
|
||||
```bash
|
||||
# After navigating to a chat, the input is focused
|
||||
osascript -e '
|
||||
tell application "System Events"
|
||||
keystroke "Hello bot!"
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Send Long Message (clipboard)
|
||||
|
||||
```bash
|
||||
osascript -e '
|
||||
tell application "微信" to activate
|
||||
delay 0.5
|
||||
set the clipboard to "Please help me with this task..."
|
||||
tell application "System Events"
|
||||
keystroke "v" using command down
|
||||
delay 0.3
|
||||
key code 36
|
||||
end tell
|
||||
'
|
||||
```
|
||||
|
||||
## Verify Response
|
||||
|
||||
```bash
|
||||
sleep 10
|
||||
screencapture /tmp/wechat-bot-response.png
|
||||
```
|
||||
|
||||
## WeChat-Specific Notes
|
||||
|
||||
- WeChat macOS app name can be `微信` or `WeChat` depending on system language. Try both:
|
||||
```bash
|
||||
osascript -e 'tell application "微信" to activate' 2> /dev/null \
|
||||
|| osascript -e 'tell application "WeChat" to activate'
|
||||
```
|
||||
- WeChat uses **Enter** to send (not Cmd+Enter by default, but configurable)
|
||||
- For multi-line messages without sending, use **Shift+Enter**:
|
||||
```bash
|
||||
osascript -e 'tell application "System Events" to key code 36 using shift down'
|
||||
```
|
||||
- Always use clipboard paste for CJK characters — `keystroke` mangles non-ASCII
|
||||
|
||||
## Script
|
||||
|
||||
```bash
|
||||
./.agents/skills/local-testing/scripts/test-wechat-bot.sh "文件传输助手" "test message" 5
|
||||
./.agents/skills/local-testing/scripts/test-wechat-bot.sh "MyBot" "Tell me a joke" 30
|
||||
```
|
||||
@@ -1,142 +0,0 @@
|
||||
# record-app-screen.sh
|
||||
|
||||
General-purpose screen recording tool for the Electron app. Captures CDP screenshots as video frames and gallery snapshots, then assembles into an MP4 on stop.
|
||||
|
||||
## Why CDP Screenshots Instead of ffmpeg Screen Capture
|
||||
|
||||
- **Works on any screen** — CDP screenshots capture the browser viewport directly, so external monitors, Retina scaling, and window positioning are all handled automatically
|
||||
- **No signal handling issues** — ffmpeg-static (npm) produces corrupt MP4 files when killed (missing moov atom). CDP screenshots avoid this entirely
|
||||
- **Consistent output** — Screenshots are resolution-independent and don't require crop coordinate calculations
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Start recording (Electron must be running with CDP)
|
||||
.agents/skills/local-testing/scripts/record-app-screen.sh start [output_name]
|
||||
|
||||
# Stop recording and assemble video
|
||||
.agents/skills/local-testing/scripts/record-app-screen.sh stop
|
||||
|
||||
# Check if recording is active
|
||||
.agents/skills/local-testing/scripts/record-app-screen.sh status
|
||||
```
|
||||
|
||||
### Arguments
|
||||
|
||||
| Argument | Default | Description |
|
||||
| ------------- | --------------------------- | -------------------------- |
|
||||
| `output_name` | `recording-YYYYMMDD-HHMMSS` | Base name for output files |
|
||||
|
||||
### Environment Variables
|
||||
|
||||
| Variable | Default | Description |
|
||||
| ---------------------- | ------- | -------------------------------------- |
|
||||
| `CDP_PORT` | `9222` | Chrome DevTools Protocol port |
|
||||
| `SCREENSHOT_INTERVAL` | `3` | Seconds between gallery screenshots |
|
||||
| `VIDEO_FRAME_INTERVAL` | `0.5` | Seconds between video frames (\~2 fps) |
|
||||
|
||||
## Output Structure
|
||||
|
||||
```
|
||||
.records/
|
||||
<name>.mp4 # Video assembled from frames (~2 fps)
|
||||
<name>/ # Gallery screenshots (every 3s)
|
||||
0000.png
|
||||
0001.png
|
||||
0002.png
|
||||
...
|
||||
```
|
||||
|
||||
The `.records/` directory is at the project root and is gitignored.
|
||||
|
||||
## How It Works
|
||||
|
||||
### Start
|
||||
|
||||
1. Creates two background loops:
|
||||
- **Video frames** — `agent-browser screenshot` every `VIDEO_FRAME_INTERVAL` seconds into a temp directory (`/tmp/record-frames-XXXXXX/`)
|
||||
- **Gallery screenshots** — `agent-browser screenshot` every `SCREENSHOT_INTERVAL` seconds into `.records/<name>/`
|
||||
2. Saves PIDs and paths to `/tmp/record-app-screen.pids` and `/tmp/record-app-screen.state`
|
||||
|
||||
### Stop
|
||||
|
||||
1. Kills both background loops
|
||||
2. Assembles video frames into MP4 using ffmpeg:
|
||||
```
|
||||
ffmpeg -framerate 2 -i frame_%06d.png -c:v libx264 -crf 23 -pix_fmt yuv420p <output>.mp4
|
||||
```
|
||||
3. Cleans up temp frame directory
|
||||
4. Reports file sizes and paths
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Basic Test Recording
|
||||
|
||||
```bash
|
||||
# Start Electron
|
||||
.agents/skills/local-testing/scripts/electron-dev.sh start
|
||||
|
||||
# Start recording
|
||||
.agents/skills/local-testing/scripts/record-app-screen.sh start my-test
|
||||
|
||||
# Run automation
|
||||
agent-browser --cdp 9222 click @e61
|
||||
agent-browser --cdp 9222 type @e42 "hello"
|
||||
agent-browser --cdp 9222 press Enter
|
||||
sleep 10
|
||||
|
||||
# Stop and get results
|
||||
.agents/skills/local-testing/scripts/record-app-screen.sh stop
|
||||
# → .records/my-test.mp4 + .records/my-test/*.png
|
||||
```
|
||||
|
||||
### Gateway Streaming Demo
|
||||
|
||||
```bash
|
||||
.agents/skills/local-testing/scripts/electron-dev.sh start
|
||||
|
||||
# Inject gateway URL
|
||||
agent-browser --cdp 9222 eval --stdin << 'EOF'
|
||||
(function() {
|
||||
var store = window.global_serverConfigStore;
|
||||
store.setState({ serverConfig: { ...store.getState().serverConfig,
|
||||
agentGatewayUrl: 'https://agent-gateway.lobehub.com' } });
|
||||
return 'ready';
|
||||
})()
|
||||
EOF
|
||||
|
||||
# Record
|
||||
.agents/skills/local-testing/scripts/record-app-screen.sh start gateway-demo
|
||||
|
||||
# Navigate to agent, send message, wait for completion...
|
||||
# (automation commands here)
|
||||
|
||||
.agents/skills/local-testing/scripts/record-app-screen.sh stop
|
||||
open .records/gateway-demo.mp4
|
||||
```
|
||||
|
||||
### Check Active Recording
|
||||
|
||||
```bash
|
||||
.agents/skills/local-testing/scripts/record-app-screen.sh status
|
||||
# [record] Active recording
|
||||
# Frames: 42 captured (running: yes)
|
||||
# Screenshots: 14 captured (running: yes)
|
||||
# Output: .records/my-test.mp4
|
||||
```
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- **ffmpeg** — For video assembly. Install via `bun add -g ffmpeg-static` or `brew install ffmpeg`
|
||||
- **agent-browser** — For CDP screenshots. Install via `npm i -g agent-browser`
|
||||
- **Electron app running** — With CDP enabled (use `electron-dev.sh start`)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Problem | Solution |
|
||||
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------ |
|
||||
| "No active recording found" on stop | PID file was cleaned up. Check if background processes are still running with `ps aux \| grep agent-browser` |
|
||||
| "A recording is already active" | Run `stop` first, or manually clean: `rm /tmp/record-app-screen.pids /tmp/record-app-screen.state` |
|
||||
| Video is 0 bytes | No frames were captured. Ensure Electron is running and CDP port is correct |
|
||||
| Screenshots are blank/white | SPA may not have loaded yet. Wait for `electron-dev.sh` to report "Renderer ready" |
|
||||
| ffmpeg assembly fails | Check `/tmp/ffmpeg-assemble.log`. Ensure ffmpeg is installed and frames exist |
|
||||
@@ -1,189 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# record-app-screen.sh — Record the Electron app window (video + screenshots)
|
||||
#
|
||||
# Captures screenshots via agent-browser (CDP), then assembles into video on stop.
|
||||
# Works on any screen (including external monitors) since it uses CDP, not screen capture.
|
||||
#
|
||||
# Usage:
|
||||
# ./record-app-screen.sh start [output_name] # Begin recording
|
||||
# ./record-app-screen.sh stop # Stop and save
|
||||
# ./record-app-screen.sh status # Check recording state
|
||||
#
|
||||
# Outputs to .records/ directory:
|
||||
# .records/<name>.mp4 — Video assembled from screenshots (~2 fps)
|
||||
# .records/<name>/ — Screenshots every SCREENSHOT_INTERVAL seconds
|
||||
#
|
||||
# Prerequisites:
|
||||
# - ffmpeg installed (bun add -g ffmpeg-static, or brew install ffmpeg)
|
||||
# - agent-browser CLI installed
|
||||
# - Electron app already running with CDP enabled
|
||||
#
|
||||
# Environment variables:
|
||||
# CDP_PORT — Chrome DevTools Protocol port (default: 9222)
|
||||
# SCREENSHOT_INTERVAL — Seconds between gallery screenshots (default: 3)
|
||||
# VIDEO_FRAME_INTERVAL — Seconds between video frames (default: 0.5)
|
||||
#
|
||||
# Examples:
|
||||
# ./electron-dev.sh start
|
||||
# ./record-app-screen.sh start gateway-demo
|
||||
# # ... run automation via agent-browser ...
|
||||
# ./record-app-screen.sh stop
|
||||
#
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT_DIR="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
|
||||
|
||||
RECORDS_DIR="$PROJECT_DIR/.records"
|
||||
PID_FILE="/tmp/record-app-screen.pids"
|
||||
STATE_FILE="/tmp/record-app-screen.state"
|
||||
|
||||
CDP_PORT="${CDP_PORT:-9222}"
|
||||
SCREENSHOT_INTERVAL="${SCREENSHOT_INTERVAL:-3}"
|
||||
VIDEO_FRAME_INTERVAL="${VIDEO_FRAME_INTERVAL:-0.5}"
|
||||
|
||||
AB="agent-browser --cdp $CDP_PORT"
|
||||
|
||||
# ─── Commands ───
|
||||
|
||||
cmd_start() {
|
||||
local output_name="${1:-recording-$(date +%Y%m%d-%H%M%S)}"
|
||||
local output_video="$RECORDS_DIR/${output_name}.mp4"
|
||||
local screenshot_dir="$RECORDS_DIR/${output_name}"
|
||||
local frames_dir
|
||||
frames_dir=$(mktemp -d /tmp/record-frames-XXXXXX)
|
||||
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
echo "[record] A recording is already active. Run '$0 stop' first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$RECORDS_DIR" "$screenshot_dir"
|
||||
|
||||
# Video frames loop (~2 fps via agent-browser CDP screenshots)
|
||||
(
|
||||
local idx=0
|
||||
while true; do
|
||||
local fname
|
||||
fname=$(printf "%s/frame_%06d.png" "$frames_dir" "$idx")
|
||||
$AB screenshot "$fname" 2>/dev/null || true
|
||||
idx=$((idx + 1))
|
||||
sleep "$VIDEO_FRAME_INTERVAL"
|
||||
done
|
||||
) &
|
||||
local frames_pid=$!
|
||||
|
||||
# Gallery screenshots loop (every N seconds for human review)
|
||||
(
|
||||
local idx=0
|
||||
while true; do
|
||||
local fname
|
||||
fname=$(printf "%s/%04d.png" "$screenshot_dir" "$idx")
|
||||
$AB screenshot "$fname" 2>/dev/null || true
|
||||
idx=$((idx + 1))
|
||||
sleep "$SCREENSHOT_INTERVAL"
|
||||
done
|
||||
) &
|
||||
local screenshot_pid=$!
|
||||
|
||||
# Save state
|
||||
echo "$frames_pid $screenshot_pid" > "$PID_FILE"
|
||||
echo "$output_video $frames_dir $screenshot_dir" > "$STATE_FILE"
|
||||
|
||||
echo "[record] Started!"
|
||||
echo " Video frames: every ${VIDEO_FRAME_INTERVAL}s (PID $frames_pid)"
|
||||
echo " Screenshots: every ${SCREENSHOT_INTERVAL}s → $screenshot_dir/"
|
||||
echo " Stop with: $0 stop"
|
||||
}
|
||||
|
||||
cmd_stop() {
|
||||
if [ ! -f "$PID_FILE" ] || [ ! -f "$STATE_FILE" ]; then
|
||||
echo "[record] No active recording found."
|
||||
return 0
|
||||
fi
|
||||
|
||||
local frames_pid screenshot_pid
|
||||
read -r frames_pid screenshot_pid < "$PID_FILE"
|
||||
|
||||
local output_video frames_dir screenshot_dir
|
||||
read -r output_video frames_dir screenshot_dir < "$STATE_FILE"
|
||||
|
||||
# Stop both capture loops
|
||||
kill "$frames_pid" 2>/dev/null || true
|
||||
kill "$screenshot_pid" 2>/dev/null || true
|
||||
wait "$frames_pid" 2>/dev/null || true
|
||||
wait "$screenshot_pid" 2>/dev/null || true
|
||||
|
||||
# Assemble frames into video
|
||||
local frame_count
|
||||
frame_count=$(ls -1 "$frames_dir"/frame_*.png 2>/dev/null | wc -l | tr -d ' ')
|
||||
|
||||
if [ "$frame_count" -gt 0 ]; then
|
||||
echo "[record] Assembling $frame_count frames into video..."
|
||||
ffmpeg -y -framerate 2 -i "$frames_dir/frame_%06d.png" \
|
||||
-c:v libx264 -crf 23 -pix_fmt yuv420p -an \
|
||||
"$output_video" > /tmp/ffmpeg-assemble.log 2>&1
|
||||
|
||||
if [ ! -s "$output_video" ]; then
|
||||
echo " [warn] Video assembly failed. Check /tmp/ffmpeg-assemble.log"
|
||||
echo " Frames preserved in: $frames_dir/"
|
||||
fi
|
||||
else
|
||||
echo " [warn] No frames captured."
|
||||
fi
|
||||
|
||||
rm -rf "$frames_dir" 2>/dev/null
|
||||
rm -f "$PID_FILE" "$STATE_FILE"
|
||||
|
||||
local video_size screenshot_count
|
||||
video_size=$(ls -lh "$output_video" 2>/dev/null | awk '{print $5}' || echo "?")
|
||||
screenshot_count=$(ls -1 "$screenshot_dir"/*.png 2>/dev/null | wc -l | tr -d ' ' || echo "0")
|
||||
|
||||
echo "[record] Stopped!"
|
||||
echo " Video: $output_video ($video_size)"
|
||||
echo " Screenshots: ${screenshot_count} files in $screenshot_dir/"
|
||||
echo " Play: open $output_video"
|
||||
}
|
||||
|
||||
cmd_status() {
|
||||
if [ ! -f "$PID_FILE" ]; then
|
||||
echo "[record] No active recording."
|
||||
return 0
|
||||
fi
|
||||
|
||||
local frames_pid screenshot_pid
|
||||
read -r frames_pid screenshot_pid < "$PID_FILE"
|
||||
|
||||
local frames_ok="no" screenshot_ok="no"
|
||||
kill -0 "$frames_pid" 2>/dev/null && frames_ok="yes"
|
||||
kill -0 "$screenshot_pid" 2>/dev/null && screenshot_ok="yes"
|
||||
|
||||
if [ -f "$STATE_FILE" ]; then
|
||||
local output_video frames_dir screenshot_dir
|
||||
read -r output_video frames_dir screenshot_dir < "$STATE_FILE"
|
||||
local frame_count ss_count
|
||||
frame_count=$(ls -1 "$frames_dir"/frame_*.png 2>/dev/null | wc -l | tr -d ' ' || echo "0")
|
||||
ss_count=$(ls -1 "$screenshot_dir"/*.png 2>/dev/null | wc -l | tr -d ' ' || echo "0")
|
||||
echo "[record] Active recording"
|
||||
echo " Frames: $frame_count captured (running: $frames_ok)"
|
||||
echo " Screenshots: $ss_count captured (running: $screenshot_ok)"
|
||||
echo " Output: $output_video"
|
||||
fi
|
||||
}
|
||||
|
||||
# ─── Main ───
|
||||
|
||||
case "${1:-}" in
|
||||
start) shift; cmd_start "$@" ;;
|
||||
stop) cmd_stop ;;
|
||||
status) cmd_status ;;
|
||||
*)
|
||||
echo "Usage: $0 {start [name] | stop | status}"
|
||||
echo ""
|
||||
echo " start [name] Start recording (default: recording-YYYYMMDD-HHMMSS)"
|
||||
echo " stop Stop recording and save outputs"
|
||||
echo " status Check if recording is active"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: pr
|
||||
description: "Create a PR for the current branch. Use when the user asks to create a pull request, submit PR, or says 'pr'."
|
||||
user-invocable: true
|
||||
user_invocable: true
|
||||
---
|
||||
|
||||
# Create Pull Request
|
||||
|
||||
@@ -71,18 +71,15 @@ internal_createTopic: async (params) => {
|
||||
**Actions:**
|
||||
|
||||
- Public: `createTopic`, `sendMessage`
|
||||
|
||||
- Internal: `internal_createTopic`, `internal_updateMessageContent`
|
||||
|
||||
- Dispatch: `internal_dispatchTopic`
|
||||
**State:**
|
||||
- Toggle: `internal_toggleMessageLoading`
|
||||
|
||||
- ID arrays: `topicEditingIds`
|
||||
**State:**
|
||||
|
||||
- ID arrays: `messageLoadingIds`, `topicEditingIds`
|
||||
- Maps: `topicMaps`, `messagesMap`
|
||||
|
||||
- Active: `activeTopicId`
|
||||
|
||||
- Init flags: `topicsInit`
|
||||
|
||||
## Detailed Guides
|
||||
|
||||
@@ -30,13 +30,16 @@ internal_createMessage: async (message, context) => {
|
||||
let tempId = context?.tempMessageId;
|
||||
if (!tempId) {
|
||||
tempId = internal_createTmpMessage(message);
|
||||
internal_toggleMessageLoading(true, tempId);
|
||||
}
|
||||
|
||||
try {
|
||||
const id = await messageService.createMessage(message);
|
||||
await refreshMessages();
|
||||
internal_toggleMessageLoading(false, tempId);
|
||||
return id;
|
||||
} catch (e) {
|
||||
internal_toggleMessageLoading(false, tempId);
|
||||
internal_dispatchMessage({
|
||||
id: tempId,
|
||||
type: 'updateMessage',
|
||||
|
||||
@@ -408,14 +408,3 @@ OPENAI_API_KEY=sk-xxxxxxxxx
|
||||
# IMPORTANT: This key is stored server-side only and NEVER exposed to the client
|
||||
# When this key is set, Klavis integration will be automatically enabled
|
||||
# KLAVIS_API_KEY=your_klavis_api_key_here
|
||||
|
||||
# #######################################
|
||||
# #### Message Gateway (IM Integration) ##
|
||||
# #######################################
|
||||
|
||||
# External message-gateway for unified IM platform connection management.
|
||||
# Set ENABLED=1 to activate. To migrate away, remove ENABLED first (keep URL/TOKEN)
|
||||
# so LobeHub can automatically disconnect leftover gateway connections.
|
||||
# MESSAGE_GATEWAY_ENABLED=1
|
||||
# MESSAGE_GATEWAY_URL=https://message-gateway.lobehub.com
|
||||
# MESSAGE_GATEWAY_SERVICE_TOKEN=your_service_token_here
|
||||
|
||||
+1
-9
@@ -25,9 +25,6 @@ Desktop.ini
|
||||
*.code-workspace
|
||||
.vscode/sessions.json
|
||||
prd
|
||||
# Recordings
|
||||
.records/
|
||||
|
||||
# Temporary files
|
||||
.temp/
|
||||
temp/
|
||||
@@ -140,10 +137,5 @@ pnpm-lock.yaml
|
||||
.turbo
|
||||
spaHtmlTemplates.ts
|
||||
|
||||
# Embedded CLI bundle (built at pack time)
|
||||
apps/desktop/resources/bin/lobe-cli.js
|
||||
apps/desktop/resources/cli-package.json
|
||||
|
||||
# Superpowers plugin brainstorm/spec outputs (local only; do not commit)
|
||||
.superpowers/
|
||||
docs/superpowers/
|
||||
docs/superpowers
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
const { defineConfig } = require('@lobehub/i18n-cli');
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = defineConfig({
|
||||
entry: 'locales/en-US',
|
||||
@@ -27,14 +27,14 @@ module.exports = defineConfig({
|
||||
],
|
||||
temperature: 0,
|
||||
saveImmediately: true,
|
||||
modelName: 'gpt-5.1-chat-latest',
|
||||
modelName: 'chatgpt-4o-latest',
|
||||
experimental: {
|
||||
jsonMode: true,
|
||||
},
|
||||
markdown: {
|
||||
reference:
|
||||
'You need to maintain the component format of the mdx file; the output text does not need to be wrapped in any code block syntax on the outermost layer.\n' +
|
||||
fs.readFileSync(path.join(__dirname, 'docs/glossary.md'), 'utf8'),
|
||||
fs.readFileSync(path.join(__dirname, 'docs/glossary.md'), 'utf-8'),
|
||||
entry: ['./README.md', './docs/**/*.md', './docs/**/*.mdx'],
|
||||
entryLocale: 'en-US',
|
||||
outputLocales: ['zh-CN'],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.\" Code generated by `npm run man:generate`; DO NOT EDIT.
|
||||
.\" Manual command details come from the Commander command tree.
|
||||
.TH LH 1 "" "@lobehub/cli 0.0.6" "User Commands"
|
||||
.TH LH 1 "" "@lobehub/cli 0.0.3" "User Commands"
|
||||
.SH NAME
|
||||
lh \- LobeHub CLI \- manage and connect to LobeHub services
|
||||
.SH SYNOPSIS
|
||||
@@ -98,9 +98,6 @@ Manage messages
|
||||
.B model
|
||||
Manage AI models
|
||||
.TP
|
||||
.B notify
|
||||
Send a callback message to a topic and trigger the agent to process it
|
||||
.TP
|
||||
.B provider
|
||||
Manage AI providers
|
||||
.TP
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@lobehub/cli",
|
||||
"version": "0.0.6",
|
||||
"version": "0.0.3",
|
||||
"type": "module",
|
||||
"bin": {
|
||||
"lh": "./dist/index.js",
|
||||
|
||||
@@ -37,25 +37,7 @@ export async function getAuthInfo(): Promise<AuthInfo> {
|
||||
};
|
||||
}
|
||||
|
||||
export type AgentStreamTokenType = 'jwt' | 'apiKey';
|
||||
|
||||
export interface AgentStreamAuthInfo {
|
||||
headers: Record<string, string>;
|
||||
serverUrl: string;
|
||||
/**
|
||||
* Raw token value (without header prefix). Used for WebSocket auth messages
|
||||
* where header-based auth is not available.
|
||||
*/
|
||||
token: string;
|
||||
/**
|
||||
* How the token should be verified by downstream services (agent gateway WS).
|
||||
* jwt → validate with JWKS
|
||||
* apiKey → validate by calling /api/v1/users/me
|
||||
*/
|
||||
tokenType: AgentStreamTokenType;
|
||||
}
|
||||
|
||||
export async function getAgentStreamAuthInfo(): Promise<AgentStreamAuthInfo> {
|
||||
export async function getAgentStreamAuthInfo(): Promise<Pick<AuthInfo, 'headers' | 'serverUrl'>> {
|
||||
const serverUrl = resolveServerUrl();
|
||||
|
||||
const envJwt = process.env.LOBEHUB_JWT;
|
||||
@@ -63,8 +45,6 @@ export async function getAgentStreamAuthInfo(): Promise<AgentStreamAuthInfo> {
|
||||
return {
|
||||
headers: { 'Oidc-Auth': envJwt },
|
||||
serverUrl,
|
||||
token: envJwt,
|
||||
tokenType: 'jwt',
|
||||
};
|
||||
}
|
||||
|
||||
@@ -73,8 +53,6 @@ export async function getAgentStreamAuthInfo(): Promise<AgentStreamAuthInfo> {
|
||||
return {
|
||||
headers: { 'X-API-Key': envApiKey },
|
||||
serverUrl,
|
||||
token: envApiKey,
|
||||
tokenType: 'apiKey',
|
||||
};
|
||||
}
|
||||
|
||||
@@ -86,15 +64,11 @@ export async function getAgentStreamAuthInfo(): Promise<AgentStreamAuthInfo> {
|
||||
return {
|
||||
headers: {},
|
||||
serverUrl,
|
||||
token: '',
|
||||
tokenType: 'jwt',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
headers: { 'Oidc-Auth': result.credentials.accessToken },
|
||||
serverUrl,
|
||||
token: result.credentials.accessToken,
|
||||
tokenType: 'jwt',
|
||||
};
|
||||
}
|
||||
|
||||
@@ -258,10 +258,6 @@ export function registerAgentCommand(program: Command) {
|
||||
'--device <target>',
|
||||
'Target device ID, or use "local" for the current connected device',
|
||||
)
|
||||
.option(
|
||||
'--no-headless',
|
||||
"Disable headless mode and wait for human approval on tool calls (default: headless — tools auto-run, matching the CLI's non-interactive nature)",
|
||||
)
|
||||
.option('--json', 'Output full JSON event stream')
|
||||
.option('-v, --verbose', 'Show detailed tool call info')
|
||||
.option('--replay <file>', 'Replay events from a saved JSON file (offline)')
|
||||
@@ -271,7 +267,6 @@ export function registerAgentCommand(program: Command) {
|
||||
agentId?: string;
|
||||
autoStart?: boolean;
|
||||
device?: string;
|
||||
headless?: boolean;
|
||||
json?: boolean;
|
||||
prompt?: string;
|
||||
replay?: string;
|
||||
@@ -345,11 +340,6 @@ export function registerAgentCommand(program: Command) {
|
||||
if (options.slug) input.slug = options.slug;
|
||||
if (options.topicId) input.appContext = { topicId: options.topicId };
|
||||
if (options.autoStart === false) input.autoStart = false;
|
||||
// commander's --no-headless sets `headless` to false. Anything else
|
||||
// (undefined, true) → headless mode is on and tool calls auto-execute.
|
||||
if (options.headless !== false) {
|
||||
input.userInterventionConfig = { approvalMode: 'headless' };
|
||||
}
|
||||
|
||||
const result = await client.aiAgent.execAgent.mutate(input as any);
|
||||
const r = result as any;
|
||||
@@ -365,17 +355,16 @@ export function registerAgentCommand(program: Command) {
|
||||
}
|
||||
|
||||
// 2. Connect to stream (WebSocket via Gateway, or fallback to SSE)
|
||||
const { serverUrl, headers, token, tokenType } = await getAgentStreamAuthInfo();
|
||||
const { serverUrl, headers } = await getAgentStreamAuthInfo();
|
||||
const agentGatewayUrl = options.sse ? undefined : resolveAgentGatewayUrl();
|
||||
|
||||
if (agentGatewayUrl) {
|
||||
const token = headers['Oidc-Auth'] || headers['X-API-Key'] || '';
|
||||
await streamAgentEventsViaWebSocket({
|
||||
gatewayUrl: agentGatewayUrl,
|
||||
json: options.json,
|
||||
operationId,
|
||||
serverUrl,
|
||||
token,
|
||||
tokenType,
|
||||
verbose: options.verbose,
|
||||
});
|
||||
} else {
|
||||
|
||||
@@ -270,48 +270,6 @@ describe('generate command', () => {
|
||||
);
|
||||
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Video generation started'));
|
||||
});
|
||||
|
||||
it('should pass image-to-video params', async () => {
|
||||
mockTrpcClient.generationTopic.createTopic.mutate.mockResolvedValue('topic-3');
|
||||
mockTrpcClient.video.createVideo.mutate.mockResolvedValue({
|
||||
data: { generationId: 'gen-v2' },
|
||||
success: true,
|
||||
});
|
||||
|
||||
const program = createProgram();
|
||||
await program.parseAsync([
|
||||
'node',
|
||||
'test',
|
||||
'generate',
|
||||
'video',
|
||||
'a cat waving',
|
||||
'--model',
|
||||
'cogvideox',
|
||||
'--provider',
|
||||
'zhipu',
|
||||
'--image',
|
||||
'https://example.com/first.png',
|
||||
'--end-image',
|
||||
'https://example.com/last.png',
|
||||
'--images',
|
||||
'https://example.com/a.png',
|
||||
'https://example.com/b.png',
|
||||
]);
|
||||
|
||||
expect(mockTrpcClient.video.createVideo.mutate).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
generationTopicId: 'topic-3',
|
||||
model: 'cogvideox',
|
||||
params: {
|
||||
endImageUrl: 'https://example.com/last.png',
|
||||
imageUrl: 'https://example.com/first.png',
|
||||
imageUrls: ['https://example.com/a.png', 'https://example.com/b.png'],
|
||||
prompt: 'a cat waving',
|
||||
},
|
||||
provider: 'zhipu',
|
||||
}),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('tts', () => {
|
||||
|
||||
@@ -6,16 +6,13 @@ import { getTrpcClient } from '../../api/client';
|
||||
export function registerVideoCommand(parent: Command) {
|
||||
parent
|
||||
.command('video <prompt>')
|
||||
.description('Generate a video from text or image(s)')
|
||||
.description('Generate a video from text')
|
||||
.requiredOption('-m, --model <model>', 'Model ID')
|
||||
.requiredOption('-p, --provider <provider>', 'Provider name')
|
||||
.option('--aspect-ratio <ratio>', 'Aspect ratio (e.g. 16:9)')
|
||||
.option('--duration <sec>', 'Duration in seconds')
|
||||
.option('--resolution <res>', 'Resolution (e.g. 720p, 1080p)')
|
||||
.option('--seed <n>', 'Random seed')
|
||||
.option('--image <url>', 'First-frame image URL (image-to-video)')
|
||||
.option('--images <urls...>', 'Multiple reference image URLs')
|
||||
.option('--end-image <url>', 'Last-frame image URL')
|
||||
.option('--json', 'Output raw JSON')
|
||||
.action(
|
||||
async (
|
||||
@@ -23,9 +20,6 @@ export function registerVideoCommand(parent: Command) {
|
||||
options: {
|
||||
aspectRatio?: string;
|
||||
duration?: string;
|
||||
endImage?: string;
|
||||
image?: string;
|
||||
images?: string[];
|
||||
json?: boolean;
|
||||
model: string;
|
||||
provider: string;
|
||||
@@ -41,9 +35,6 @@ export function registerVideoCommand(parent: Command) {
|
||||
if (options.duration) params.duration = Number.parseInt(options.duration, 10);
|
||||
if (options.resolution) params.resolution = options.resolution;
|
||||
if (options.seed) params.seed = Number.parseInt(options.seed, 10);
|
||||
if (options.image) params.imageUrl = options.image;
|
||||
if (options.images && options.images.length > 0) params.imageUrls = options.images;
|
||||
if (options.endImage) params.endImageUrl = options.endImage;
|
||||
|
||||
const result = await client.video.createVideo.mutate({
|
||||
generationTopicId: topicId as string,
|
||||
|
||||
@@ -79,57 +79,6 @@ describe('message command', () => {
|
||||
);
|
||||
expect(mockTrpcClient.message.listAll.query).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should keep first page on the backend default offset for filtered queries', async () => {
|
||||
mockTrpcClient.message.getMessages.query.mockResolvedValue([]);
|
||||
|
||||
const program = createProgram();
|
||||
await program.parseAsync([
|
||||
'node',
|
||||
'test',
|
||||
'message',
|
||||
'list',
|
||||
'--topic-id',
|
||||
't1',
|
||||
'-L',
|
||||
'200',
|
||||
]);
|
||||
|
||||
expect(mockTrpcClient.message.getMessages.query).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ pageSize: 200, topicId: 't1' }),
|
||||
);
|
||||
});
|
||||
|
||||
it('should convert page 2 to current 1 for filtered queries', async () => {
|
||||
mockTrpcClient.message.getMessages.query.mockResolvedValue([]);
|
||||
|
||||
const program = createProgram();
|
||||
await program.parseAsync([
|
||||
'node',
|
||||
'test',
|
||||
'message',
|
||||
'list',
|
||||
'--topic-id',
|
||||
't1',
|
||||
'--page',
|
||||
'2',
|
||||
]);
|
||||
|
||||
expect(mockTrpcClient.message.getMessages.query).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ current: 1, topicId: 't1' }),
|
||||
);
|
||||
});
|
||||
|
||||
it('should support the short page flag for filtered queries', async () => {
|
||||
mockTrpcClient.message.getMessages.query.mockResolvedValue([]);
|
||||
|
||||
const program = createProgram();
|
||||
await program.parseAsync(['node', 'test', 'message', 'list', '--topic-id', 't1', '-P', '2']);
|
||||
|
||||
expect(mockTrpcClient.message.getMessages.query).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ current: 1, topicId: 't1' }),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('search', () => {
|
||||
|
||||
@@ -16,7 +16,7 @@ export function registerMessageCommand(program: Command) {
|
||||
.option('--topic-id <id>', 'Filter by topic ID')
|
||||
.option('--agent-id <id>', 'Filter by agent ID')
|
||||
.option('-L, --limit <n>', 'Page size', '30')
|
||||
.option('-P, --page <n>', 'Page number', '1')
|
||||
.option('--page <n>', 'Page number', '1')
|
||||
.option('--user', 'Only show user messages')
|
||||
.option('--json [fields]', 'Output JSON, optionally specify fields (comma-separated)')
|
||||
.action(
|
||||
@@ -32,9 +32,7 @@ export function registerMessageCommand(program: Command) {
|
||||
|
||||
const hasFilter = options.topicId || options.agentId;
|
||||
const pageSize = options.limit ? Number.parseInt(options.limit, 10) : undefined;
|
||||
const current = options.page
|
||||
? Math.max(Number.parseInt(options.page, 10) - 1, 0)
|
||||
: undefined;
|
||||
const current = options.page ? Number.parseInt(options.page, 10) : undefined;
|
||||
|
||||
let items: any[];
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ function readAgentProfile(workspacePath: string): AgentProfile {
|
||||
// Try to extract **Emoji:** value (single emoji)
|
||||
const emojiMatch = content.match(/\*{0,2}Emoji:?\*{0,2}\s*(.+)/i);
|
||||
const rawAvatar = emojiMatch ? emojiMatch[1].trim() : undefined;
|
||||
// Filter out placeholder text like (待定)(Chinese TBD), _(待定)_, (TBD), N/A, etc.
|
||||
// Filter out placeholder text like (待定), _(待定)_, (TBD), N/A, etc.
|
||||
const isPlaceholder =
|
||||
rawAvatar && /^[_*((].*[))_*]$|^(?:tbd|todo|n\/?a|none|待定|未定)$/i.test(rawAvatar);
|
||||
const avatar = rawAvatar && !isPlaceholder ? rawAvatar : undefined;
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
import type { Command } from 'commander';
|
||||
import pc from 'picocolors';
|
||||
|
||||
import { getTrpcClient } from '../api/client';
|
||||
import { log } from '../utils/logger';
|
||||
|
||||
export function registerNotifyCommand(program: Command) {
|
||||
program
|
||||
.command('notify')
|
||||
.description('Send a callback message to a topic and trigger the agent to process it')
|
||||
.requiredOption('--topic <topicId>', 'Target topic ID')
|
||||
.requiredOption('-c, --content <content>', 'Message content')
|
||||
.option('--agent-id <agentId>', 'Agent ID (overrides topic default)')
|
||||
.option('--thread-id <threadId>', 'Thread ID for threaded conversations')
|
||||
.option('--json', 'Output JSON')
|
||||
.action(
|
||||
async (options: {
|
||||
agentId?: string;
|
||||
content: string;
|
||||
json?: boolean;
|
||||
threadId?: string;
|
||||
topic: string;
|
||||
}) => {
|
||||
log.debug('notify: topic=%s, agentId=%s', options.topic, options.agentId);
|
||||
|
||||
const client = await getTrpcClient();
|
||||
|
||||
try {
|
||||
const result = await client.agentNotify.notify.mutate({
|
||||
agentId: options.agentId,
|
||||
content: options.content,
|
||||
threadId: options.threadId,
|
||||
topicId: options.topic,
|
||||
});
|
||||
|
||||
if (options.json) {
|
||||
console.log(JSON.stringify(result, null, 2));
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`${pc.green('✓')} Message sent to topic ${pc.bold(result.topicId)}`);
|
||||
if (result.operationId) {
|
||||
console.log(` Operation ID: ${result.operationId}`);
|
||||
}
|
||||
} catch (error: any) {
|
||||
console.error(`${pc.red('✗')} Failed to send notification: ${error.message}`);
|
||||
process.exit(1);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -77,48 +77,6 @@ describe('topic command', () => {
|
||||
expect.objectContaining({ agentId: 'a1' }),
|
||||
);
|
||||
});
|
||||
|
||||
it('should keep first page on the backend default offset', async () => {
|
||||
mockTrpcClient.topic.getTopics.query.mockResolvedValue([]);
|
||||
|
||||
const program = createProgram();
|
||||
await program.parseAsync(['node', 'test', 'topic', 'list', '--agent-id', 'a1', '-L', '200']);
|
||||
|
||||
expect(mockTrpcClient.topic.getTopics.query).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ agentId: 'a1', pageSize: 200 }),
|
||||
);
|
||||
});
|
||||
|
||||
it('should convert page 2 to current 1', async () => {
|
||||
mockTrpcClient.topic.getTopics.query.mockResolvedValue([]);
|
||||
|
||||
const program = createProgram();
|
||||
await program.parseAsync([
|
||||
'node',
|
||||
'test',
|
||||
'topic',
|
||||
'list',
|
||||
'--agent-id',
|
||||
'a1',
|
||||
'--page',
|
||||
'2',
|
||||
]);
|
||||
|
||||
expect(mockTrpcClient.topic.getTopics.query).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ agentId: 'a1', current: 1 }),
|
||||
);
|
||||
});
|
||||
|
||||
it('should support the short page flag', async () => {
|
||||
mockTrpcClient.topic.getTopics.query.mockResolvedValue([]);
|
||||
|
||||
const program = createProgram();
|
||||
await program.parseAsync(['node', 'test', 'topic', 'list', '--agent-id', 'a1', '-P', '2']);
|
||||
|
||||
expect(mockTrpcClient.topic.getTopics.query).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ agentId: 'a1', current: 1 }),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('search', () => {
|
||||
|
||||
@@ -17,7 +17,7 @@ export function registerTopicCommand(program: Command) {
|
||||
.description('List topics')
|
||||
.option('--agent-id <id>', 'Filter by agent ID')
|
||||
.option('-L, --limit <n>', 'Page size', '30')
|
||||
.option('-P, --page <n>', 'Page number', '1')
|
||||
.option('--page <n>', 'Page number', '1')
|
||||
.option('--json [fields]', 'Output JSON, optionally specify fields (comma-separated)')
|
||||
.action(
|
||||
async (options: {
|
||||
@@ -31,8 +31,7 @@ export function registerTopicCommand(program: Command) {
|
||||
const input: Record<string, any> = {};
|
||||
if (options.agentId) input.agentId = options.agentId;
|
||||
if (options.limit) input.pageSize = Number.parseInt(options.limit, 10);
|
||||
const page = options.page ? Number.parseInt(options.page, 10) : undefined;
|
||||
if (page !== undefined && page > 1) input.current = page - 1;
|
||||
if (options.page) input.current = Number.parseInt(options.page, 10);
|
||||
|
||||
const result = await client.topic.getTopics.query(input as any);
|
||||
const items = Array.isArray(result) ? result : ((result as any).items ?? []);
|
||||
|
||||
@@ -160,7 +160,7 @@ export function spawnDaemon(args: string[]): number {
|
||||
// Re-run the same entry with --daemon-child (internal flag)
|
||||
const child = spawn(process.execPath, [...process.execArgv, ...args, '--daemon-child'], {
|
||||
detached: true,
|
||||
env: { ...process.env, ELECTRON_RUN_AS_NODE: '1', LOBEHUB_DAEMON: '1' },
|
||||
env: { ...process.env, LOBEHUB_DAEMON: '1' },
|
||||
stdio: ['ignore', logFd, logFd],
|
||||
});
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
import { createProgram } from './program';
|
||||
|
||||
createProgram().parse(process.argv, { from: 'node' });
|
||||
createProgram().parse();
|
||||
|
||||
@@ -22,7 +22,6 @@ import { registerMemoryCommand } from './commands/memory';
|
||||
import { registerMessageCommand } from './commands/message';
|
||||
import { registerMigrateCommand } from './commands/migrate';
|
||||
import { registerModelCommand } from './commands/model';
|
||||
import { registerNotifyCommand } from './commands/notify';
|
||||
import { registerPluginCommand } from './commands/plugin';
|
||||
import { registerProviderCommand } from './commands/provider';
|
||||
import { registerSearchCommand } from './commands/search';
|
||||
@@ -69,7 +68,6 @@ export function createProgram() {
|
||||
registerTopicCommand(program);
|
||||
registerMessageCommand(program);
|
||||
registerModelCommand(program);
|
||||
registerNotifyCommand(program);
|
||||
registerProviderCommand(program);
|
||||
registerPluginCommand(program);
|
||||
registerUserCommand(program);
|
||||
|
||||
@@ -279,10 +279,8 @@ describe('streamAgentEventsViaWebSocket', () => {
|
||||
await flush();
|
||||
|
||||
const ws = capturedWs!;
|
||||
// Note: serverUrl is not set here, and JSON.stringify drops undefined keys,
|
||||
// so the parsed auth message will not contain a `serverUrl` field.
|
||||
expect(ws.sent.map((s) => JSON.parse(s))).toEqual([
|
||||
{ token: 'test-token', tokenType: 'jwt', type: 'auth' },
|
||||
{ token: 'test-token', type: 'auth' },
|
||||
{ lastEventId: '', type: 'resume' },
|
||||
]);
|
||||
|
||||
@@ -290,31 +288,6 @@ describe('streamAgentEventsViaWebSocket', () => {
|
||||
await promise;
|
||||
});
|
||||
|
||||
it('should send tokenType=apiKey and serverUrl when the caller uses an API key', async () => {
|
||||
const promise = streamAgentEventsViaWebSocket({
|
||||
gatewayUrl: 'https://gw.test.com',
|
||||
operationId: 'op-1',
|
||||
serverUrl: 'https://app.lobehub.com',
|
||||
token: 'lh_sk_abc',
|
||||
tokenType: 'apiKey',
|
||||
});
|
||||
|
||||
await flush();
|
||||
|
||||
const ws = capturedWs!;
|
||||
// serverUrl is forwarded so the gateway can call back to /api/v1/users/me
|
||||
// to verify the API key.
|
||||
expect(ws.sent.map((s) => JSON.parse(s))[0]).toEqual({
|
||||
serverUrl: 'https://app.lobehub.com',
|
||||
token: 'lh_sk_abc',
|
||||
tokenType: 'apiKey',
|
||||
type: 'auth',
|
||||
});
|
||||
|
||||
ws.simulateMessage({ id: '1', type: 'session_complete' });
|
||||
await promise;
|
||||
});
|
||||
|
||||
it('should render agent_event messages using existing renderEvent', async () => {
|
||||
const promise = streamAgentEventsViaWebSocket({
|
||||
gatewayUrl: 'https://gw.test.com',
|
||||
|
||||
@@ -20,18 +20,7 @@ interface StreamOptions {
|
||||
interface WebSocketStreamOptions extends StreamOptions {
|
||||
gatewayUrl: string;
|
||||
operationId: string;
|
||||
/**
|
||||
* LobeHub server URL the gateway should call back to when verifying
|
||||
* an apiKey token (via `/api/v1/users/me`). Required when
|
||||
* `tokenType === 'apiKey'`; ignored for JWT.
|
||||
*/
|
||||
serverUrl?: string;
|
||||
token: string;
|
||||
/**
|
||||
* How the gateway should verify `token`. `jwt` is the default for
|
||||
* backwards compatibility with existing callers.
|
||||
*/
|
||||
tokenType?: 'jwt' | 'apiKey';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -179,13 +168,13 @@ const HEARTBEAT_INTERVAL = 30_000;
|
||||
export async function streamAgentEventsViaWebSocket(
|
||||
options: WebSocketStreamOptions,
|
||||
): Promise<void> {
|
||||
const { gatewayUrl, operationId, serverUrl, token, tokenType = 'jwt', ...streamOpts } = options;
|
||||
const { gatewayUrl, operationId, token, ...streamOpts } = options;
|
||||
const wsUrl = urlJoin(
|
||||
gatewayUrl.replace(/^http/, 'ws'),
|
||||
`/ws?operationId=${encodeURIComponent(operationId)}`,
|
||||
);
|
||||
|
||||
log.debug(`Connecting to gateway: ${wsUrl} (auth: ${tokenType})`);
|
||||
log.debug(`Connecting to gateway: ${wsUrl}`);
|
||||
|
||||
return new Promise<void>((resolve, reject) => {
|
||||
const ws = new WebSocket(wsUrl);
|
||||
@@ -203,10 +192,7 @@ export async function streamAgentEventsViaWebSocket(
|
||||
};
|
||||
|
||||
ws.onopen = () => {
|
||||
// `serverUrl` is required so the gateway can call back to verify an
|
||||
// apiKey token. Harmless (but unused) for JWT, so we always include it
|
||||
// when available to match the device-gateway-client contract.
|
||||
ws.send(JSON.stringify({ serverUrl, token, tokenType, type: 'auth' }));
|
||||
ws.send(JSON.stringify({ token, type: 'auth' }));
|
||||
};
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
|
||||
@@ -9,10 +9,6 @@ export default defineConfig({
|
||||
entry: ['src/index.ts'],
|
||||
fixedExtension: false,
|
||||
format: ['esm'],
|
||||
minify: true,
|
||||
outputOptions: {
|
||||
codeSplitting: false,
|
||||
},
|
||||
platform: 'node',
|
||||
target: 'node18',
|
||||
});
|
||||
|
||||
@@ -109,26 +109,6 @@ const config = {
|
||||
|
||||
console.info('📦 Downloading agent-browser binary...');
|
||||
execSync('node scripts/download-agent-browser.mjs', { stdio: 'inherit', cwd: __dirname });
|
||||
|
||||
// Build and copy CLI bundle for embedding
|
||||
console.info('📦 Building CLI for embedding...');
|
||||
execSync('npm run build', { stdio: 'inherit', cwd: path.resolve(__dirname, '../cli') });
|
||||
const cliSrc = path.resolve(__dirname, '../cli/dist/index.js');
|
||||
const cliDest = path.resolve(__dirname, 'resources/bin/lobe-cli.js');
|
||||
await fs.copyFile(cliSrc, cliDest);
|
||||
|
||||
// Write a minimal package.json next to the CLI bundle so that
|
||||
// createRequire('../package.json') resolves correctly in the packaged app.
|
||||
// The CLI script lives at Resources/bin/lobe-cli.js, so '../package.json'
|
||||
// resolves to Resources/package.json.
|
||||
const cliPkg = JSON.parse(
|
||||
await fs.readFile(path.resolve(__dirname, '../cli/package.json'), 'utf8'),
|
||||
);
|
||||
await fs.writeFile(
|
||||
path.resolve(__dirname, 'resources/cli-package.json'),
|
||||
JSON.stringify({ name: cliPkg.name, type: 'module', version: cliPkg.version }),
|
||||
);
|
||||
console.info('✅ CLI bundle copied to resources/bin/lobe-cli.js');
|
||||
},
|
||||
/**
|
||||
* AfterPack hook for post-processing:
|
||||
@@ -316,10 +296,7 @@ const config = {
|
||||
releaseNotes: process.env.RELEASE_NOTES || undefined,
|
||||
},
|
||||
|
||||
extraResources: [
|
||||
{ from: 'resources/bin', to: 'bin' },
|
||||
{ from: 'resources/cli-package.json', to: 'package.json' },
|
||||
],
|
||||
extraResources: [{ from: 'resources/bin', to: 'bin' }],
|
||||
|
||||
win: {
|
||||
executableName: 'LobeHub',
|
||||
|
||||
@@ -90,6 +90,7 @@ export default defineConfig({
|
||||
outDir: 'dist/preload',
|
||||
sourcemap: isDev ? 'inline' : false,
|
||||
},
|
||||
|
||||
resolve: {
|
||||
alias: {
|
||||
'@': path.resolve(__dirname, 'src/main'),
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"author": "LobeHub",
|
||||
"main": "./dist/main/index.js",
|
||||
"scripts": {
|
||||
"build:cli": "cd ../cli && bun run build",
|
||||
"build:main": "cross-env NODE_OPTIONS=--max-old-space-size=8192 electron-vite build",
|
||||
"build:run-unpack": "electron .",
|
||||
"dev": "electron-vite dev",
|
||||
|
||||
@@ -12,7 +12,6 @@ import { BrowserWindow, shell } from 'electron';
|
||||
import GatewayConnectionService from '@/services/gatewayConnectionSrv';
|
||||
import { appendVercelCookie } from '@/utils/http-headers';
|
||||
import { createLogger } from '@/utils/logger';
|
||||
import { netFetch } from '@/utils/net-fetch';
|
||||
|
||||
import { ControllerModule, IpcMethod } from './index';
|
||||
import RemoteServerConfigCtr from './RemoteServerConfigCtr';
|
||||
@@ -361,10 +360,10 @@ export default class AuthCtr extends ControllerModule {
|
||||
|
||||
logger.debug(`Polling for credentials: ${url.toString()}`);
|
||||
|
||||
// Use Electron net.fetch to respect system CA store (self-signed/private CA certs)
|
||||
// Send HTTP request directly
|
||||
const headers: Record<string, string> = { 'Content-Type': 'application/json' };
|
||||
appendVercelCookie(headers);
|
||||
const response = await netFetch(url.toString(), { headers, method: 'GET' });
|
||||
const response = await fetch(url.toString(), { headers, method: 'GET' });
|
||||
|
||||
// Check response status
|
||||
if (response.status === 404) {
|
||||
@@ -482,7 +481,7 @@ export default class AuthCtr extends ControllerModule {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
};
|
||||
appendVercelCookie(tokenHeaders);
|
||||
const response = await netFetch(tokenUrl.toString(), {
|
||||
const response = await fetch(tokenUrl.toString(), {
|
||||
body,
|
||||
headers: tokenHeaders,
|
||||
method: 'POST',
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
import { exec } from 'node:child_process';
|
||||
import path from 'node:path';
|
||||
import process from 'node:process';
|
||||
import { promisify } from 'node:util';
|
||||
|
||||
import { getCliWrapperDir } from '@/modules/cliEmbedding';
|
||||
import { createLogger } from '@/utils/logger';
|
||||
|
||||
import { ControllerModule, IpcMethod } from './index';
|
||||
import RemoteServerConfigCtr from './RemoteServerConfigCtr';
|
||||
|
||||
const logger = createLogger('controllers:CliCtr');
|
||||
|
||||
function normalizeServerUrl(url: string): string {
|
||||
return url.replace(/\/$/, '');
|
||||
}
|
||||
|
||||
export default class CliCtr extends ControllerModule {
|
||||
static override readonly groupName = 'cli';
|
||||
|
||||
@IpcMethod()
|
||||
async runCliCommand(args: string): Promise<{ exitCode: number; stderr: string; stdout: string }> {
|
||||
const execAsync = promisify(exec);
|
||||
const wrapperDir = getCliWrapperDir();
|
||||
const cmd = process.platform === 'win32' ? 'lobehub.cmd' : 'lobehub';
|
||||
const wrapperPath = path.join(wrapperDir, cmd);
|
||||
|
||||
const env = { ...process.env };
|
||||
|
||||
const remoteCtr = this.app.getController(RemoteServerConfigCtr);
|
||||
if (remoteCtr) {
|
||||
const [token, serverUrl] = await Promise.all([
|
||||
remoteCtr.getAccessToken(),
|
||||
remoteCtr.getRemoteServerUrl(),
|
||||
]);
|
||||
|
||||
if (token && serverUrl) {
|
||||
env.LOBEHUB_JWT = token;
|
||||
env.LOBEHUB_SERVER = normalizeServerUrl(serverUrl);
|
||||
logger.debug('Injected LOBEHUB_JWT / LOBEHUB_SERVER for CLI command');
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const { stdout, stderr } = await execAsync(`"${wrapperPath}" ${args}`, {
|
||||
env,
|
||||
timeout: 15_000,
|
||||
});
|
||||
return { exitCode: 0, stderr, stdout };
|
||||
} catch (error: any) {
|
||||
return {
|
||||
exitCode: error.code ?? 1,
|
||||
stderr: error.stderr ?? '',
|
||||
stdout: error.stdout ?? String(error.message),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -48,7 +48,6 @@ import { type FileResult, type SearchOptions } from '@/modules/fileSearch';
|
||||
import ContentSearchService from '@/services/contentSearchSrv';
|
||||
import FileSearchService from '@/services/fileSearchSrv';
|
||||
import { createLogger } from '@/utils/logger';
|
||||
import { netFetch } from '@/utils/net-fetch';
|
||||
|
||||
import { ControllerModule, IpcMethod } from './index';
|
||||
|
||||
@@ -342,7 +341,7 @@ export default class LocalFileCtr extends ControllerModule {
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await netFetch(url);
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
`Failed to download skill package: ${response.status} ${response.statusText}`,
|
||||
|
||||
@@ -3,7 +3,7 @@ import type {
|
||||
ShowDesktopNotificationParams,
|
||||
} from '@lobechat/electron-client-ipc';
|
||||
import { app, Notification } from 'electron';
|
||||
import { linux, macOS, windows } from 'electron-is';
|
||||
import { macOS, windows } from 'electron-is';
|
||||
|
||||
import { getIpcContext } from '@/utils/ipc';
|
||||
import { createLogger } from '@/utils/logger';
|
||||
@@ -131,12 +131,7 @@ export default class NotificationCtr extends ControllerModule {
|
||||
silent: params.silent || false,
|
||||
timeoutType: 'default',
|
||||
title: params.title,
|
||||
// On Linux/GNOME Shell, urgency 'normal' causes notifications to appear as banners.
|
||||
// Clicking the dismiss (X) button on such banners can freeze the system for 30-45 seconds
|
||||
// due to heavy gnome-shell processing. Using 'low' urgency routes notifications to the
|
||||
// message tray instead, preventing the banner's X button from being shown.
|
||||
// The urgency option is ignored on macOS and Windows.
|
||||
urgency: linux() ? 'low' : 'normal',
|
||||
urgency: 'normal',
|
||||
});
|
||||
|
||||
// Add more event listeners for debugging
|
||||
|
||||
@@ -9,7 +9,6 @@ import { OFFICIAL_CLOUD_SERVER } from '@/const/env';
|
||||
import GatewayConnectionService from '@/services/gatewayConnectionSrv';
|
||||
import { appendVercelCookie } from '@/utils/http-headers';
|
||||
import { createLogger } from '@/utils/logger';
|
||||
import { netFetch } from '@/utils/net-fetch';
|
||||
|
||||
import { ControllerModule, IpcMethod } from './index';
|
||||
|
||||
@@ -486,7 +485,7 @@ export default class RemoteServerConfigCtr extends ControllerModule {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
};
|
||||
appendVercelCookie(headers);
|
||||
const response = await netFetch(tokenUrl.toString(), { body, headers, method: 'POST' });
|
||||
const response = await fetch(tokenUrl.toString(), { body, headers, method: 'POST' });
|
||||
|
||||
if (!response.ok) {
|
||||
// Try to parse error response
|
||||
|
||||
@@ -10,38 +10,17 @@ import { runCommand, ShellProcessManager } from '@lobechat/local-file-shell';
|
||||
|
||||
import { createLogger } from '@/utils/logger';
|
||||
|
||||
import CliCtr from './CliCtr';
|
||||
import { ControllerModule, IpcMethod } from './index';
|
||||
|
||||
const logger = createLogger('controllers:ShellCommandCtr');
|
||||
|
||||
const processManager = new ShellProcessManager();
|
||||
|
||||
/** Prefix for a simple `lh`/`lobe`/`lobehub` invocation (keyword + boundary, args via slice). */
|
||||
const SIMPLE_LH_PREFIX = /^\s*(?:lh|lobe|lobehub)(?=\s|$)/;
|
||||
|
||||
export default class ShellCommandCtr extends ControllerModule {
|
||||
static override readonly groupName = 'shellCommand';
|
||||
|
||||
@IpcMethod()
|
||||
async handleRunCommand(params: RunCommandParams): Promise<RunCommandResult> {
|
||||
const prefixMatch = SIMPLE_LH_PREFIX.exec(params.command);
|
||||
if (prefixMatch) {
|
||||
const cliCtr = this.app.getController(CliCtr);
|
||||
if (cliCtr) {
|
||||
const args = params.command.slice(prefixMatch[0].length).trim();
|
||||
logger.debug('Routing lh command to CliCtr.runCliCommand:', args);
|
||||
const result = await cliCtr.runCliCommand(args);
|
||||
return {
|
||||
exit_code: result.exitCode,
|
||||
output: result.stdout + result.stderr,
|
||||
stderr: result.stderr,
|
||||
stdout: result.stdout,
|
||||
success: result.exitCode === 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return runCommand(params, { logger, processManager });
|
||||
}
|
||||
|
||||
|
||||
@@ -29,11 +29,6 @@ vi.mock('electron', () => ({
|
||||
ipcMain: {
|
||||
handle: ipcMainHandleMock,
|
||||
},
|
||||
net: {
|
||||
fetch: vi.fn((input: RequestInfo | URL, init?: RequestInit) =>
|
||||
global.fetch(input as any, init as any),
|
||||
),
|
||||
},
|
||||
shell: {
|
||||
openExternal: vi.fn().mockResolvedValue(undefined),
|
||||
},
|
||||
|
||||
@@ -5,14 +5,11 @@ import { type App } from '@/core/App';
|
||||
|
||||
import LocalFileCtr from '../LocalFileCtr';
|
||||
|
||||
const { ipcMainHandleMock, fetchMock } = vi.hoisted(() => ({
|
||||
const { ipcMainHandleMock } = vi.hoisted(() => ({
|
||||
ipcMainHandleMock: vi.fn(),
|
||||
fetchMock: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@/utils/net-fetch', () => ({
|
||||
netFetch: fetchMock,
|
||||
}));
|
||||
const fetchMock = vi.fn();
|
||||
|
||||
// Mock logger
|
||||
vi.mock('@/utils/logger', () => ({
|
||||
@@ -40,6 +37,8 @@ vi.mock('electron', () => ({
|
||||
},
|
||||
}));
|
||||
|
||||
vi.stubGlobal('fetch', fetchMock);
|
||||
|
||||
// Mock node:fs/promises and node:fs
|
||||
vi.mock('node:fs/promises', () => ({
|
||||
access: vi.fn(),
|
||||
|
||||
@@ -41,7 +41,6 @@ vi.mock('electron', () => {
|
||||
|
||||
// Mock electron-is
|
||||
vi.mock('electron-is', () => ({
|
||||
linux: vi.fn(() => false),
|
||||
macOS: vi.fn(() => false),
|
||||
windows: vi.fn(() => false),
|
||||
}));
|
||||
@@ -181,26 +180,6 @@ describe('NotificationCtr', () => {
|
||||
expect(result).toEqual({ success: true });
|
||||
});
|
||||
|
||||
it('should use low urgency on Linux to prevent GNOME Shell freeze', async () => {
|
||||
const { linux } = await import('electron-is');
|
||||
const { Notification } = await import('electron');
|
||||
vi.mocked(linux).mockReturnValue(true);
|
||||
vi.mocked(Notification.isSupported).mockReturnValue(true);
|
||||
mockBrowserWindow.isVisible.mockReturnValue(false);
|
||||
|
||||
const promise = controller.showDesktopNotification(params);
|
||||
vi.advanceTimersByTime(100);
|
||||
await promise;
|
||||
|
||||
expect(Notification).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
urgency: 'low',
|
||||
}),
|
||||
);
|
||||
|
||||
vi.mocked(linux).mockReturnValue(false);
|
||||
});
|
||||
|
||||
it('should show notification when window is minimized', async () => {
|
||||
const { Notification } = await import('electron');
|
||||
vi.mocked(Notification.isSupported).mockReturnValue(true);
|
||||
|
||||
@@ -5,13 +5,8 @@ import type { App } from '@/core/App';
|
||||
|
||||
import RemoteServerConfigCtr from '../RemoteServerConfigCtr';
|
||||
|
||||
const { ipcMainHandleMock, mockFetch } = vi.hoisted(() => ({
|
||||
const { ipcMainHandleMock } = vi.hoisted(() => ({
|
||||
ipcMainHandleMock: vi.fn(),
|
||||
mockFetch: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@/utils/net-fetch', () => ({
|
||||
netFetch: mockFetch,
|
||||
}));
|
||||
|
||||
// Mock logger
|
||||
@@ -425,6 +420,13 @@ describe('RemoteServerConfigCtr', () => {
|
||||
});
|
||||
|
||||
describe('refreshAccessToken', () => {
|
||||
let mockFetch: ReturnType<typeof vi.fn>;
|
||||
|
||||
beforeEach(() => {
|
||||
mockFetch = vi.fn();
|
||||
global.fetch = mockFetch;
|
||||
});
|
||||
|
||||
it('should return error when remote server is not active', async () => {
|
||||
mockStoreManager.get.mockImplementation((key) => {
|
||||
if (key === 'dataSyncConfig') {
|
||||
|
||||
@@ -2,7 +2,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import type { App } from '@/core/App';
|
||||
|
||||
import CliCtr from '../CliCtr';
|
||||
import ShellCommandCtr from '../ShellCommandCtr';
|
||||
|
||||
const { ipcMainHandleMock } = vi.hoisted(() => ({
|
||||
@@ -33,17 +32,7 @@ vi.mock('node:crypto', () => ({
|
||||
randomUUID: vi.fn(() => 'test-uuid-123'),
|
||||
}));
|
||||
|
||||
vi.mock('../CliCtr', () => ({
|
||||
default: class CliCtr {},
|
||||
}));
|
||||
|
||||
const mockCliCtr = {
|
||||
runCliCommand: vi.fn().mockResolvedValue({ exitCode: 0, stderr: '', stdout: 'cli output\n' }),
|
||||
};
|
||||
|
||||
const mockApp = {
|
||||
getController: vi.fn((c: unknown) => (c === CliCtr ? mockCliCtr : undefined)),
|
||||
} as unknown as App;
|
||||
const mockApp = {} as unknown as App;
|
||||
|
||||
describe('ShellCommandCtr (thin wrapper)', () => {
|
||||
let ctr: ShellCommandCtr;
|
||||
@@ -129,28 +118,6 @@ describe('ShellCommandCtr (thin wrapper)', () => {
|
||||
expect(mockChildProcess.kill).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should route lh commands to CliCtr.runCliCommand', async () => {
|
||||
const result = await ctr.handleRunCommand({
|
||||
command: 'lh status --json',
|
||||
description: 'lh status',
|
||||
});
|
||||
|
||||
expect(mockCliCtr.runCliCommand).toHaveBeenCalledWith('status --json');
|
||||
expect(result.success).toBe(true);
|
||||
expect(result.stdout).toContain('cli output');
|
||||
expect(mockSpawn).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should route lobehub commands to CliCtr.runCliCommand', async () => {
|
||||
const result = await ctr.handleRunCommand({
|
||||
command: 'lobehub search test',
|
||||
description: 'lobehub search',
|
||||
});
|
||||
|
||||
expect(mockCliCtr.runCliCommand).toHaveBeenCalledWith('search test');
|
||||
expect(result.success).toBe(true);
|
||||
});
|
||||
|
||||
it('should return error for non-existent shell_id', async () => {
|
||||
const result = await ctr.handleGetCommandOutput({
|
||||
shell_id: 'non-existent',
|
||||
|
||||
@@ -2,7 +2,6 @@ import type { CreateServicesResult, IpcServiceConstructor, MergeIpcService } fro
|
||||
|
||||
import AuthCtr from './AuthCtr';
|
||||
import BrowserWindowsCtr from './BrowserWindowsCtr';
|
||||
import CliCtr from './CliCtr';
|
||||
import DevtoolsCtr from './DevtoolsCtr';
|
||||
import GatewayConnectionCtr from './GatewayConnectionCtr';
|
||||
import LocalFileCtr from './LocalFileCtr';
|
||||
@@ -24,7 +23,6 @@ import UploadFileCtr from './UploadFileCtr';
|
||||
export const controllerIpcConstructors = [
|
||||
AuthCtr,
|
||||
BrowserWindowsCtr,
|
||||
CliCtr,
|
||||
DevtoolsCtr,
|
||||
GatewayConnectionCtr,
|
||||
LocalFileCtr,
|
||||
|
||||
@@ -13,7 +13,6 @@ import { isDev } from '@/const/env';
|
||||
import { ELECTRON_BE_PROTOCOL_SCHEME } from '@/const/protocol';
|
||||
import type { IControlModule } from '@/controllers';
|
||||
import AuthCtr from '@/controllers/AuthCtr';
|
||||
import { generateCliWrapper, getCliWrapperDir } from '@/modules/cliEmbedding';
|
||||
import {
|
||||
astSearchDetectors,
|
||||
browserAutomationDetectors,
|
||||
@@ -90,9 +89,9 @@ export class App {
|
||||
logger.info('----------------------------------------------');
|
||||
logger.info('Starting LobeHub...');
|
||||
|
||||
// Append bundled binaries and CLI wrapper directories to PATH for tool resolution
|
||||
// Append bundled binaries directory to PATH for fallback tool resolution
|
||||
const pathSep = process.platform === 'win32' ? ';' : ':';
|
||||
process.env.PATH = `${process.env.PATH}${pathSep}${binDir}${pathSep}${getCliWrapperDir()}`;
|
||||
process.env.PATH = `${process.env.PATH}${pathSep}${binDir}`;
|
||||
|
||||
logger.debug('Initializing App');
|
||||
// Initialize store manager
|
||||
@@ -227,11 +226,6 @@ export class App {
|
||||
// Initialize app
|
||||
await this.makeAppReady();
|
||||
|
||||
// Generate CLI wrapper for terminal usage
|
||||
generateCliWrapper().catch((error) => {
|
||||
logger.warn('Failed to generate CLI wrapper:', error);
|
||||
});
|
||||
|
||||
// Initialize i18n. Note: app.getLocale() must be called after app.whenReady() to get the correct value
|
||||
await this.i18n.init();
|
||||
this.menuManager.initialize();
|
||||
|
||||
@@ -4,7 +4,6 @@ import { BrowserWindow, type Session } from 'electron';
|
||||
import { isDev } from '@/const/env';
|
||||
import { appendVercelCookie } from '@/utils/http-headers';
|
||||
import { createLogger } from '@/utils/logger';
|
||||
import { netFetch } from '@/utils/net-fetch';
|
||||
|
||||
interface BackendProxyProtocolManagerOptions {
|
||||
getAccessToken: () => Promise<string | undefined | null>;
|
||||
@@ -138,7 +137,7 @@ export class BackendProxyProtocolManager {
|
||||
|
||||
let upstreamResponse: Response;
|
||||
try {
|
||||
upstreamResponse = await netFetch(rewrittenUrl, requestInit);
|
||||
upstreamResponse = await fetch(rewrittenUrl, requestInit);
|
||||
} catch (error) {
|
||||
this.logger.error(`${logPrefix} upstream fetch failed: ${rewrittenUrl}`, error);
|
||||
|
||||
|
||||
-5
@@ -43,11 +43,6 @@ vi.mock('electron', () => ({
|
||||
BrowserWindow: {
|
||||
getAllWindows: vi.fn(),
|
||||
},
|
||||
net: {
|
||||
fetch: vi.fn((input: RequestInfo | URL, init?: RequestInit) =>
|
||||
global.fetch(input as any, init as any),
|
||||
),
|
||||
},
|
||||
}));
|
||||
|
||||
describe('BackendProxyProtocolManager', () => {
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
import { chmod, mkdir, rename, symlink, unlink, writeFile } from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
|
||||
import { app } from 'electron';
|
||||
|
||||
import { createLogger } from '@/utils/logger';
|
||||
|
||||
const logger = createLogger('modules:cliEmbedding');
|
||||
|
||||
/**
|
||||
* Resolve the correct Electron binary path per platform.
|
||||
* - AppImage: use APPIMAGE env var (the actual .AppImage file)
|
||||
* - Others: app.getPath('exe')
|
||||
*/
|
||||
function resolveElectronBinary(): string {
|
||||
if (process.platform === 'linux' && process.env.APPIMAGE) {
|
||||
return process.env.APPIMAGE;
|
||||
}
|
||||
return app.getPath('exe');
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the CLI script path inside packaged resources.
|
||||
*/
|
||||
function resolveCliScript(): string {
|
||||
if (app.isPackaged) {
|
||||
return path.join(process.resourcesPath, 'bin', 'lobe-cli.js');
|
||||
}
|
||||
// Dev mode: app.getAppPath() points to apps/desktop/, go up to apps/cli/
|
||||
return path.join(app.getAppPath(), '..', 'cli', 'dist', 'index.js');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the user-writable bin directory for CLI wrapper.
|
||||
*/
|
||||
export function getCliWrapperDir(): string {
|
||||
return path.join(app.getPath('userData'), 'bin');
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate shell wrapper scripts that invoke the embedded CLI
|
||||
* using Electron's Node.js runtime via ELECTRON_RUN_AS_NODE=1.
|
||||
*
|
||||
* Called on every app launch to keep paths up-to-date after auto-updates.
|
||||
*/
|
||||
export async function generateCliWrapper(): Promise<void> {
|
||||
const electronBin = resolveElectronBinary();
|
||||
const cliScript = resolveCliScript();
|
||||
const wrapperDir = getCliWrapperDir();
|
||||
|
||||
await mkdir(wrapperDir, { recursive: true });
|
||||
|
||||
if (process.platform === 'win32') {
|
||||
const content = [
|
||||
'@echo off',
|
||||
'set ELECTRON_RUN_AS_NODE=1',
|
||||
`"${electronBin}" "${cliScript}" %*`,
|
||||
].join('\r\n');
|
||||
|
||||
const cmdPath = path.join(wrapperDir, 'lobehub.cmd');
|
||||
await atomicWrite(cmdPath, content);
|
||||
|
||||
// Create short aliases: lh.cmd, lobe.cmd (copies on Windows, symlinks unreliable)
|
||||
for (const alias of ['lh.cmd', 'lobe.cmd']) {
|
||||
await atomicWrite(path.join(wrapperDir, alias), content);
|
||||
}
|
||||
|
||||
logger.info(`CLI wrapper generated: ${cmdPath}`);
|
||||
} else {
|
||||
const content = [
|
||||
'#!/bin/sh',
|
||||
`ELECTRON_RUN_AS_NODE=1 exec "${electronBin}" "${cliScript}" "$@"`,
|
||||
].join('\n');
|
||||
|
||||
const wrapperPath = path.join(wrapperDir, 'lobehub');
|
||||
await atomicWrite(wrapperPath, content);
|
||||
await chmod(wrapperPath, 0o755);
|
||||
|
||||
// Create short aliases: lh, lobe → lobehub
|
||||
for (const alias of ['lh', 'lobe']) {
|
||||
const linkPath = path.join(wrapperDir, alias);
|
||||
await unlink(linkPath).catch(() => {});
|
||||
await symlink('lobehub', linkPath);
|
||||
}
|
||||
|
||||
logger.info(`CLI wrapper generated: ${wrapperPath}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Atomic write: write to temp file then rename to avoid partial reads.
|
||||
*/
|
||||
async function atomicWrite(filePath: string, content: string): Promise<void> {
|
||||
const tmpPath = `${filePath}.tmp.${process.pid}`;
|
||||
await writeFile(tmpPath, content, 'utf8');
|
||||
await rename(tmpPath, filePath);
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export { generateCliWrapper, getCliWrapperDir } from './generateCliWrapper';
|
||||
@@ -63,82 +63,11 @@ export const pythonDetector: IToolDetector = {
|
||||
priority: 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* Bun runtime detector
|
||||
*/
|
||||
export const bunDetector: IToolDetector = createCommandDetector('bun', {
|
||||
description: 'Bun - fast JavaScript runtime and package manager',
|
||||
priority: 4,
|
||||
});
|
||||
|
||||
/**
|
||||
* Bunx package runner detector
|
||||
*/
|
||||
export const bunxDetector: IToolDetector = createCommandDetector('bunx', {
|
||||
description: 'bunx - Bun package runner for executing npm packages',
|
||||
priority: 5,
|
||||
});
|
||||
|
||||
/**
|
||||
* pnpm package manager detector
|
||||
*/
|
||||
export const pnpmDetector: IToolDetector = createCommandDetector('pnpm', {
|
||||
description: 'pnpm - fast, disk space efficient package manager',
|
||||
priority: 6,
|
||||
});
|
||||
|
||||
/**
|
||||
* uv Python package manager detector
|
||||
*/
|
||||
export const uvDetector: IToolDetector = createCommandDetector('uv', {
|
||||
description: 'uv - extremely fast Python package manager',
|
||||
priority: 7,
|
||||
});
|
||||
|
||||
/**
|
||||
* LobeHub CLI detector
|
||||
* Tries lobehub, lobe, lh in order; validates via --help output containing "LobeHub"
|
||||
*/
|
||||
export const lobehubDetector: IToolDetector = {
|
||||
description: 'LobeHub CLI - manage and connect to LobeHub services',
|
||||
async detect(): Promise<ToolStatus> {
|
||||
const commands = ['lobehub', 'lobe', 'lh'];
|
||||
const whichCmd = platform() === 'win32' ? 'where' : 'which';
|
||||
|
||||
for (const cmd of commands) {
|
||||
try {
|
||||
const { stdout: pathOut } = await execPromise(`${whichCmd} ${cmd}`, { timeout: 3000 });
|
||||
const toolPath = pathOut.trim().split('\n')[0];
|
||||
|
||||
// Validate it's actually LobeHub CLI by checking help output
|
||||
const { stdout: helpOut } = await execPromise(`${cmd} --help`, { timeout: 3000 });
|
||||
if (!helpOut.includes('LobeHub')) continue;
|
||||
|
||||
const { stdout: versionOut } = await execPromise(`${cmd} --version`, { timeout: 3000 });
|
||||
const version = versionOut.trim().split('\n')[0];
|
||||
|
||||
return { available: true, path: toolPath, version };
|
||||
} catch {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return { available: false };
|
||||
},
|
||||
name: 'lobehub',
|
||||
priority: 0,
|
||||
};
|
||||
|
||||
/**
|
||||
* All runtime environment detectors
|
||||
*/
|
||||
export const runtimeEnvironmentDetectors: IToolDetector[] = [
|
||||
lobehubDetector,
|
||||
nodeDetector,
|
||||
npmDetector,
|
||||
pythonDetector,
|
||||
bunDetector,
|
||||
bunxDetector,
|
||||
pnpmDetector,
|
||||
uvDetector,
|
||||
];
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
import { net } from 'electron';
|
||||
|
||||
/**
|
||||
* Fetch using Electron's net module (Chromium networking stack).
|
||||
*
|
||||
* Unlike Node.js `fetch`, `net.fetch` respects the OS certificate store
|
||||
* (e.g. macOS Keychain, Windows Certificate Store), so self-signed or
|
||||
* private-CA certificates trusted at the system level work automatically.
|
||||
*
|
||||
* This must be called only after `app.whenReady()` has resolved.
|
||||
*/
|
||||
export const netFetch: typeof globalThis.fetch = (input, init?) => {
|
||||
return net.fetch(input as any, init as any);
|
||||
};
|
||||
@@ -465,7 +465,5 @@
|
||||
"https://github.com/user-attachments/assets/fa8fab19-ace2-4f85-8428-a3a0e28845bb": "/blog/assets/2d678631c55369ba7d753c3ffcb73782.webp",
|
||||
"https://github.com/user-attachments/assets/facdc83c-e789-4649-8060-7f7a10a1b1dd": "/blog/assets05b20e40c03ced0ec8707fed2e8e0f25.webp",
|
||||
"https://github.com/user-attachments/assets/fcdfb9c5-819a-488f-b28d-0857fe861219": "/blog/assets8477415ecec1f37e38ab38ff1217d0a7.webp",
|
||||
"https://github.com/user-attachments/assets/fd60ab55-ead2-4930-ad00-fdf77662f5a0": "/blog/assets276a4e8748e9bd300b30dcd9d0e24980.webp",
|
||||
"https://file.rene.wang/clipboard-1775701725582-123f8f8cf73f8.png": "/blog/assets7ea204859aeb5aa9be5810a20ba1669a.webp",
|
||||
"https://file.rene.wang/changlog-04-14.png": "/blog/assets300abe7e259d293da6c5ed4f642a1be6.webp"
|
||||
}
|
||||
"https://github.com/user-attachments/assets/fd60ab55-ead2-4930-ad00-fdf77662f5a0": "/blog/assets276a4e8748e9bd300b30dcd9d0e24980.webp"
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
---
|
||||
title: Bot Management
|
||||
title: Agent Task System & Bot Management
|
||||
description: >-
|
||||
Introduced in-app notifications, bot management, and improved onboarding
|
||||
experience.
|
||||
Introduced agent task system, in-app notifications, bot management, and improved onboarding experience.
|
||||
|
||||
|
||||
tags:
|
||||
- Agent Tasks
|
||||
- Bot Management
|
||||
@@ -10,7 +11,9 @@ tags:
|
||||
- Onboarding
|
||||
---
|
||||
|
||||
# Bot Management & Notification
|
||||
# Agent Task System & Bot Management
|
||||
|
||||
This week LobeHub introduced powerful new agent capabilities and a smoother getting-started experience.
|
||||
|
||||
## Key Updates
|
||||
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
title: Agent Gateway & Customizable Sidebar
|
||||
description: >-
|
||||
Server-side agent execution via Gateway mode, customizable sidebar layout,
|
||||
agent workspace with document management, and new model support.
|
||||
tags:
|
||||
- Gateway
|
||||
- Sidebar
|
||||
- Agent Workspace
|
||||
- Task Manager
|
||||
---
|
||||
|
||||
# Agent Gateway & Customizable Sidebar
|
||||
|
||||
Server-side agent execution over WebSocket, a fully customizable sidebar, and a new agent workspace for managing documents and tasks.
|
||||
|
||||
## Key Updates
|
||||
|
||||
- Gateway mode: agents now execute server-side and stream results back over WebSocket, with auto-reconnect when switching topics and seamless resume after disconnects
|
||||
- Customizable sidebar: choose which items appear in the sidebar and reorder them through a new customize modal, plus a recents section with search, rename, and quick actions
|
||||
- Agent workspace: a right-side panel for managing agent documents — browse, rename, delete files, and view document history all in one place
|
||||
- Task manager: a dedicated task manager view with its own topic state, so running tasks no longer interfere with your main conversations
|
||||
- Prompt rewrite & translate: rewrite or translate your prompt directly in the chat input before sending
|
||||
- Desktop CLI: the LobeHub CLI is now embedded in the desktop app and can be installed to your PATH from settings
|
||||
- Screen capture: capture your screen with an overlay picker and attach it directly to a conversation
|
||||
- New models: GLM-5.1 from Zhipu, Seedance 2.0 video generation, and a new StreamLake provider
|
||||
|
||||
## Experience Improvements
|
||||
|
||||
- Desktop app now uses Electron's native fetch for remote requests, improving connection reliability
|
||||
- Loading states during optimistic updates prevent flickering when the assistant is thinking
|
||||
- Agent details pages load correctly on refresh instead of showing a perpetual spinner
|
||||
- Improved error classification for insufficient balance and deactivated accounts shows clearer messages
|
||||
- Fixed a context engine crash when non-string content was passed to document injection
|
||||
@@ -1,32 +0,0 @@
|
||||
---
|
||||
title: Agent 网关与可自定义侧边栏
|
||||
description: 通过网关模式实现服务端智能体执行、可自定义侧边栏布局、带文档管理的智能体工作区,以及新模型支持。
|
||||
tags:
|
||||
- 网关
|
||||
- 侧边栏
|
||||
- 智能体工作区
|
||||
- 任务管理器
|
||||
---
|
||||
|
||||
# Agent 网关与可自定义侧边栏
|
||||
|
||||
通过 WebSocket 实现服务端智能体执行、完全可自定义的侧边栏,以及用于管理文档和任务的全新智能体工作区。
|
||||
|
||||
## 重要更新
|
||||
|
||||
- 网关模式:智能体现在在服务端执行并通过 WebSocket 实时推送结果,切换话题时自动重连,断线后无缝恢复
|
||||
- 可自定义侧边栏:通过新的自定义弹窗选择侧边栏显示哪些项目并调整排序,还新增了支持搜索、重命名和快捷操作的「最近」板块
|
||||
- 智能体工作区:右侧面板用于管理智能体文档 —— 在同一界面中浏览、重命名、删除文件并查看文档历史
|
||||
- 任务管理器:专属的任务管理视图拥有独立的话题状态,运行中的任务不再干扰你的主要对话
|
||||
- 提示词改写与翻译:发送前可直接在聊天输入框中改写或翻译你的提示词
|
||||
- 桌面端 CLI:LobeHub CLI 现已内嵌在桌面应用中,可从设置中安装到系统 PATH
|
||||
- 屏幕截图:使用覆盖层选择器截取屏幕内容,直接附加到对话中
|
||||
- 新模型:智谱 GLM-5.1、Seedance 2.0 视频生成,以及新的 StreamLake 提供商
|
||||
|
||||
## 体验优化
|
||||
|
||||
- 桌面应用现使用 Electron 原生 fetch 进行远程请求,提升连接稳定性
|
||||
- 乐观更新时的加载状态防止了助手思考时的界面闪烁
|
||||
- 智能体详情页在刷新后正确加载,不再显示无限加载动画
|
||||
- 改进了余额不足和账户停用的错误分类,展示更清晰的提示信息
|
||||
- 修复了非字符串内容传入文档注入时的上下文引擎崩溃问题
|
||||
+35
-147
@@ -3,323 +3,211 @@
|
||||
"cloud": [],
|
||||
"community": [
|
||||
{
|
||||
"image": "/blog/assets300abe7e259d293da6c5ed4f642a1be6.webp",
|
||||
"id": "2026-04-13-gateway-sidebar",
|
||||
"date": "2026-04-13",
|
||||
"versionRange": [
|
||||
"2.1.46"
|
||||
]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets7ea204859aeb5aa9be5810a20ba1669a.webp",
|
||||
"id": "2026-04-06-auto-completion",
|
||||
"date": "2026-04-06",
|
||||
"versionRange": [
|
||||
"2.1.46"
|
||||
]
|
||||
"versionRange": ["2.1.46"]
|
||||
},
|
||||
{
|
||||
"id": "2026-03-30-agent-tasks",
|
||||
"date": "2026-03-30",
|
||||
"versionRange": [
|
||||
"2.1.45",
|
||||
"2.1.46"
|
||||
]
|
||||
"versionRange": ["2.1.45", "2.1.46"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets53e6ec9cf72554dbc1f8224fc0550a03.webp",
|
||||
"id": "2026-03-23-media-memory",
|
||||
"date": "2026-03-23",
|
||||
"versionRange": [
|
||||
"2.1.44"
|
||||
]
|
||||
"versionRange": ["2.1.44"]
|
||||
},
|
||||
{
|
||||
"image": "https://hub-apac-1.lobeobjects.space/blog/assets/4a68a7644501cb513d08670b102a446e.webp",
|
||||
"id": "2026-03-16-search",
|
||||
"date": "2026-03-16",
|
||||
"versionRange": [
|
||||
"2.1.38",
|
||||
"2.1.43"
|
||||
]
|
||||
"versionRange": ["2.1.38", "2.1.43"]
|
||||
},
|
||||
{
|
||||
"id": "2026-02-08-runtime-auth",
|
||||
"date": "2026-02-08",
|
||||
"versionRange": [
|
||||
"2.1.6",
|
||||
"2.1.26"
|
||||
]
|
||||
"versionRange": ["2.1.6", "2.1.26"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assetsa8e504275f2cd891fabecca985998de0.webp",
|
||||
"id": "2026-01-27-v2",
|
||||
"date": "2026-01-27",
|
||||
"versionRange": [
|
||||
"2.0.1",
|
||||
"2.1.5"
|
||||
]
|
||||
"versionRange": ["2.0.1", "2.1.5"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets7f3b38c1d76cceb91edb29d6b1eb60db.webp",
|
||||
"id": "2025-12-20-mcp",
|
||||
"date": "2025-12-20",
|
||||
"versionRange": [
|
||||
"1.142.8",
|
||||
"1.143.0"
|
||||
]
|
||||
"versionRange": ["1.142.8", "1.143.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets3a7f0b29839603336e39e923b423409b.webp",
|
||||
"id": "2025-11-08-comfy-ui",
|
||||
"date": "2025-11-08",
|
||||
"versionRange": [
|
||||
"1.133.5",
|
||||
"1.142.8"
|
||||
]
|
||||
"versionRange": ["1.133.5", "1.142.8"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets35e6aa692b0c16009c61964279514166.webp",
|
||||
"id": "2025-10-08-python",
|
||||
"date": "2025-10-08",
|
||||
"versionRange": [
|
||||
"1.120.7",
|
||||
"1.133.5"
|
||||
]
|
||||
"versionRange": ["1.120.7", "1.133.5"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assetsce5d6dc93676f974be2e162e8ace03f0.webp",
|
||||
"id": "2025-09-08-gemini",
|
||||
"date": "2025-09-08",
|
||||
"versionRange": [
|
||||
"1.109.1",
|
||||
"1.120.7"
|
||||
]
|
||||
"versionRange": ["1.109.1", "1.120.7"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assetsdf48eed9de76b7e37c269b294285f09d.webp",
|
||||
"id": "2025-08-08-image-generation",
|
||||
"date": "2025-08-08",
|
||||
"versionRange": [
|
||||
"1.97.10",
|
||||
"1.109.1"
|
||||
]
|
||||
"versionRange": ["1.97.10", "1.109.1"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets902eb746fe2042fc2ea831c71002be72.webp",
|
||||
"id": "2025-07-08-mcp-market",
|
||||
"date": "2025-07-08",
|
||||
"versionRange": [
|
||||
"1.93.3",
|
||||
"1.97.10"
|
||||
]
|
||||
"versionRange": ["1.93.3", "1.97.10"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets5cc27b8cae995074da20d4ffe06a1460.webp",
|
||||
"id": "2025-06-08-claude-4",
|
||||
"date": "2025-06-08",
|
||||
"versionRange": [
|
||||
"1.84.27",
|
||||
"1.93.3"
|
||||
]
|
||||
"versionRange": ["1.84.27", "1.93.3"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets2a36d86a4eed6e7938dd6e9c684701ed.webp",
|
||||
"id": "2025-05-08-desktop-app",
|
||||
"date": "2025-05-08",
|
||||
"versionRange": [
|
||||
"1.77.17",
|
||||
"1.84.27"
|
||||
]
|
||||
"versionRange": ["1.77.17", "1.84.27"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assetsc0efdb82443556ae3acefe00099b3f23.webp",
|
||||
"id": "2025-04-06-exports",
|
||||
"date": "2025-04-06",
|
||||
"versionRange": [
|
||||
"1.67.2",
|
||||
"1.77.17"
|
||||
]
|
||||
"versionRange": ["1.67.2", "1.77.17"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assetse743f0a47127390dde766a0a790476db.webp",
|
||||
"id": "2025-03-02-new-models",
|
||||
"date": "2025-03-02",
|
||||
"versionRange": [
|
||||
"1.49.13",
|
||||
"1.67.2"
|
||||
]
|
||||
"versionRange": ["1.49.13", "1.67.2"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets18168d5fe64ea34905a7e52fd82d0e9d.webp",
|
||||
"id": "2025-02-02-deepseek-r1",
|
||||
"date": "2025-02-02",
|
||||
"versionRange": [
|
||||
"1.47.8",
|
||||
"1.49.12"
|
||||
]
|
||||
"versionRange": ["1.47.8", "1.49.12"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assetsf9ed064fe764cbeff2f46910e7099a91.webp",
|
||||
"id": "2025-01-22-new-ai-provider",
|
||||
"date": "2025-01-22",
|
||||
"versionRange": [
|
||||
"1.43.1",
|
||||
"1.47.7"
|
||||
]
|
||||
"versionRange": ["1.43.1", "1.47.7"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets2d409f43b58953ad5396c6beab8a0719.webp",
|
||||
"id": "2025-01-03-user-profile",
|
||||
"date": "2025-01-03",
|
||||
"versionRange": [
|
||||
"1.34.1",
|
||||
"1.43.0"
|
||||
]
|
||||
"versionRange": ["1.34.1", "1.43.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/d9cbfcbef130183bc490d515d8a38aa4.webp",
|
||||
"id": "2024-11-27-forkable-chat",
|
||||
"date": "2024-11-27",
|
||||
"versionRange": [
|
||||
"1.33.1",
|
||||
"1.34.0"
|
||||
]
|
||||
"versionRange": ["1.33.1", "1.34.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/2d678631c55369ba7d753c3ffcb73782.webp",
|
||||
"id": "2024-11-25-november-providers",
|
||||
"date": "2024-11-25",
|
||||
"versionRange": [
|
||||
"1.30.1",
|
||||
"1.33.0"
|
||||
]
|
||||
"versionRange": ["1.30.1", "1.33.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/f10a4b98782e36797c38071eed785c6f.webp",
|
||||
"id": "2024-11-06-share-text-json",
|
||||
"date": "2024-11-06",
|
||||
"versionRange": [
|
||||
"1.26.1",
|
||||
"1.28.0"
|
||||
]
|
||||
"versionRange": ["1.26.1", "1.28.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/944c671604833cd2457445b211ebba33.webp",
|
||||
"id": "2024-10-27-pin-assistant",
|
||||
"date": "2024-10-27",
|
||||
"versionRange": [
|
||||
"1.19.1",
|
||||
"1.26.0"
|
||||
]
|
||||
"versionRange": ["1.19.1", "1.26.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/f6d047a345e47a52592cff916c9a64ce.webp",
|
||||
"id": "2024-09-20-artifacts",
|
||||
"date": "2024-09-20",
|
||||
"versionRange": [
|
||||
"1.17.1",
|
||||
"1.19.0"
|
||||
]
|
||||
"versionRange": ["1.17.1", "1.19.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/d7e57f8e69f97b76b3c2414f3441b6e4.webp",
|
||||
"id": "2024-09-13-openai-o1-models",
|
||||
"date": "2024-09-13",
|
||||
"versionRange": [
|
||||
"1.12.1",
|
||||
"1.17.0"
|
||||
]
|
||||
"versionRange": ["1.12.1", "1.17.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/d6129350de510a62fe87b2d2f0fb9477.webp",
|
||||
"id": "2024-08-21-file-upload-and-knowledge-base",
|
||||
"date": "2024-08-21",
|
||||
"versionRange": [
|
||||
"1.8.1",
|
||||
"1.12.0"
|
||||
]
|
||||
"versionRange": ["1.8.1", "1.12.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/37d85fdfccff9ed56e9c6827faee01c7.webp",
|
||||
"id": "2024-08-02-lobe-chat-database-docker",
|
||||
"date": "2024-08-02",
|
||||
"versionRange": [
|
||||
"1.6.1",
|
||||
"1.8.0"
|
||||
]
|
||||
"versionRange": ["1.6.1", "1.8.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/39d7890f8cbe21e77db8d3c94f7f22e4.webp",
|
||||
"id": "2024-07-19-gpt-4o-mini",
|
||||
"date": "2024-07-19",
|
||||
"versionRange": [
|
||||
"1.0.1",
|
||||
"1.6.0"
|
||||
]
|
||||
"versionRange": ["1.0.1", "1.6.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/eb477e62217f4d1b644eff975c7ac168.webp",
|
||||
"id": "2024-06-19-lobe-chat-v1",
|
||||
"date": "2024-06-19",
|
||||
"versionRange": [
|
||||
"0.147.0",
|
||||
"1.0.0"
|
||||
]
|
||||
"versionRange": ["0.147.0", "1.0.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/8a8d361b4c0cce6da350cc0de65c0ad6.webp",
|
||||
"id": "2024-02-14-ollama",
|
||||
"date": "2024-02-14",
|
||||
"versionRange": [
|
||||
"0.125.1",
|
||||
"0.127.0"
|
||||
]
|
||||
"versionRange": ["0.125.1", "0.127.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/9498087e85f27e692716a63cb3b58d79.webp",
|
||||
"id": "2024-02-08-sso-oauth",
|
||||
"date": "2024-02-08",
|
||||
"versionRange": [
|
||||
"0.118.1",
|
||||
"0.125.0"
|
||||
]
|
||||
"versionRange": ["0.118.1", "0.125.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/603fefbb944bc6761ebdab5956fc0084.webp",
|
||||
"id": "2023-12-22-dalle-3",
|
||||
"date": "2023-12-22",
|
||||
"versionRange": [
|
||||
"0.102.1",
|
||||
"0.118.0"
|
||||
]
|
||||
"versionRange": ["0.102.1", "0.118.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/8d4c2cc0ce8654fa8ac06cc036a7f941.webp",
|
||||
"id": "2023-11-19-tts-stt",
|
||||
"date": "2023-11-19",
|
||||
"versionRange": [
|
||||
"0.101.1",
|
||||
"0.102.0"
|
||||
]
|
||||
"versionRange": ["0.101.1", "0.102.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/d47654360d626f80144cdedb979a3526.webp",
|
||||
"id": "2023-11-14-gpt4-vision",
|
||||
"date": "2023-11-14",
|
||||
"versionRange": [
|
||||
"0.90.0",
|
||||
"0.101.0"
|
||||
]
|
||||
"versionRange": ["0.90.0", "0.101.0"]
|
||||
},
|
||||
{
|
||||
"image": "/blog/assets/50b38eac1769ae6f13aef72f3d725eec.webp",
|
||||
"id": "2023-09-09-plugin-system",
|
||||
"date": "2023-09-09",
|
||||
"versionRange": [
|
||||
"0.67.0",
|
||||
"0.72.0"
|
||||
]
|
||||
"versionRange": ["0.67.0", "0.72.0"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -337,7 +337,6 @@ import { schema } from './schema';
|
||||
export const myPlatform: PlatformDefinition = {
|
||||
id: '<platform>',
|
||||
name: 'Platform Name',
|
||||
connectionMode: 'webhook', // 'webhook' | 'websocket' | 'polling'
|
||||
description: 'Connect a Platform bot',
|
||||
documentation: {
|
||||
portalUrl: 'https://developers.example.com',
|
||||
|
||||
@@ -334,7 +334,6 @@ import { schema } from './schema';
|
||||
export const myPlatform: PlatformDefinition = {
|
||||
id: '<platform>',
|
||||
name: 'Platform Name',
|
||||
connectionMode: 'webhook', // 'webhook' | 'websocket' | 'polling'
|
||||
description: 'Connect a Platform bot',
|
||||
documentation: {
|
||||
portalUrl: 'https://developers.example.com',
|
||||
|
||||
+12
-34
@@ -20,15 +20,6 @@ By connecting a QQ channel to your LobeHub agent, users can interact with the AI
|
||||
- A LobeHub account with an active subscription
|
||||
- A QQ account
|
||||
|
||||
## Connection Modes
|
||||
|
||||
LobeHub supports two connection modes for QQ bots:
|
||||
|
||||
- **WebSocket (Recommended)** — Persistent connection. Events are delivered in real time via WebSocket. No callback URL configuration required. This is the default mode for new bots.
|
||||
- **Webhook** — Stateless HTTP callbacks. Use this mode if your bot already has a callback URL configured on the QQ Open Platform and cannot switch.
|
||||
|
||||
> **Note:** On the QQ Open Platform, once a bot is configured with a Webhook callback URL, it cannot be switched to WebSocket mode. New bots that have not configured a callback URL should use WebSocket mode.
|
||||
|
||||
## Step 1: Create a QQ Bot
|
||||
|
||||
<Steps>
|
||||
@@ -51,11 +42,9 @@ LobeHub supports two connection modes for QQ bots:
|
||||
|
||||

|
||||
|
||||
### Configure Event Delivery (Webhook Only)
|
||||
### Configure Webhook URL
|
||||
|
||||
If you are using **Webhook mode**, navigate to **Development Settings** → **Callback Configuration** in the QQ Open Platform. You will need to paste the LobeHub Callback URL here after completing Step 2.
|
||||
|
||||
If you are using **WebSocket mode** (default), skip this step — no callback URL is needed.
|
||||
In the QQ Open Platform, navigate to **Development Settings** → **Callback Configuration**. You will need to paste the LobeHub Callback URL here after completing Step 2.
|
||||
</Steps>
|
||||
|
||||
## Step 2: Configure QQ in LobeHub
|
||||
@@ -72,26 +61,16 @@ LobeHub supports two connection modes for QQ bots:
|
||||
- **Application ID** — The App ID from the QQ Open Platform
|
||||
- **App Secret** — The App Secret from the QQ Open Platform
|
||||
|
||||
### Select Connection Mode
|
||||
### Save and Copy the Callback URL
|
||||
|
||||
In **Advanced Settings**, choose the **Connection Mode**:
|
||||
Click **Save Configuration**. After saving, a **Callback URL** will be displayed. Copy this URL.
|
||||
|
||||
- **WebSocket** (default) — Recommended for new bots
|
||||
- **Webhook** — For bots with an existing callback URL on QQ Open Platform
|
||||
|
||||
### Save Configuration
|
||||
|
||||
Click **Save Configuration**. Your credentials will be encrypted and stored securely.
|
||||
|
||||
- In **WebSocket mode**, the bot will automatically connect to the QQ gateway. No further configuration is needed.
|
||||
- In **Webhook mode**, a **Callback URL** will be displayed after saving. Copy this URL for Step 3.
|
||||
Your credentials will be encrypted and stored securely.
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
## Step 3: Configure Callback in QQ Open Platform (Webhook Only)
|
||||
|
||||
> Skip this step if you are using WebSocket mode.
|
||||
## Step 3: Configure Callback in QQ Open Platform
|
||||
|
||||
<Steps>
|
||||
### Paste the Callback URL
|
||||
@@ -142,11 +121,11 @@ To use the bot in QQ groups:
|
||||
|
||||
## Configuration Reference
|
||||
|
||||
| Field | Required | Description |
|
||||
| ------------------- | -------- | --------------------------------------------------------------------------------------- |
|
||||
| **Application ID** | Yes | Your bot's App ID from QQ Open Platform |
|
||||
| **App Secret** | Yes | Your bot's App Secret from QQ Open Platform |
|
||||
| **Connection Mode** | No | `websocket` (default) or `webhook`. Choose based on your QQ Open Platform configuration |
|
||||
| Field | Required | Description |
|
||||
| ------------------ | -------- | -------------------------------------------------------- |
|
||||
| **Application ID** | Yes | Your bot's App ID from QQ Open Platform |
|
||||
| **App Secret** | Yes | Your bot's App Secret from QQ Open Platform |
|
||||
| **Callback URL** | — | Auto-generated after saving; paste into QQ Open Platform |
|
||||
|
||||
## Limitations
|
||||
|
||||
@@ -157,8 +136,7 @@ To use the bot in QQ groups:
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- **Bot not connecting (WebSocket mode):** Verify the App ID and App Secret are correct. Ensure the bot has not been configured with a callback URL on QQ Open Platform — once a callback URL is set, WebSocket mode is unavailable.
|
||||
- **Callback URL verification failed (Webhook mode):** Ensure you saved the configuration in LobeHub first and the URL was copied correctly. LobeHub handles Ed25519 verification automatically.
|
||||
- **Callback URL verification failed:** Ensure you saved the configuration in LobeHub first and the URL was copied correctly. LobeHub handles Ed25519 verification automatically.
|
||||
- **Bot not responding:** Verify the App ID and App Secret are correct, the bot is published (or you are a sandbox test user), and the required message events are subscribed.
|
||||
- **Group chat issues:** Make sure the bot has been added to the group. @mention the bot to trigger a response.
|
||||
- **Test Connection failed:** Double-check the App ID and App Secret in LobeHub's channel settings.
|
||||
|
||||
@@ -17,15 +17,6 @@ tags:
|
||||
- 一个拥有有效订阅的 LobeHub 账户
|
||||
- 一个 QQ 账户
|
||||
|
||||
## 连接模式
|
||||
|
||||
LobeHub ��持两种 QQ 机器人连接模式:
|
||||
|
||||
- **WebSocket(推荐)** — 持久连接。事件通过 WebSocket 实时推送,无需配置回调地址。这是新机器人的默认模式。
|
||||
- **Webhook** — 无状态 HTTP ��调。如果您的机器人已在 QQ 开放平台配置了回调地址且无法切换,请使用此模式。
|
||||
|
||||
> **注意:** 在 QQ 开放平台上,一旦机器人配置了 Webhook 回调地址,就无法切换到 WebSocket 模式。尚未配置回调地址的新机器人应使用 WebSocket 模式。
|
||||
|
||||
## 第一步:创建 QQ 机器人
|
||||
|
||||
<Steps>
|
||||
@@ -48,11 +39,9 @@ LobeHub ��持两种 QQ 机器人连接模式:
|
||||
|
||||

|
||||
|
||||
### 配置事件接收方式(仅 Webhook 模式)
|
||||
### 配置回调地址
|
||||
|
||||
如果您使用的是 **Webhook 模式**,请在 QQ 开放平台中导航到 **开发设置** → **回调配置**。您需要在完成第二步后将 LobeHub 的回调地址粘贴到此处。
|
||||
|
||||
如果您使用的是 **WebSocket 模式**(默认),请跳过此步骤 — 无需配置回调地址。
|
||||
在 QQ 开放平台中,导航到 **开发设置** → **回调配置**。您需要在完成第二步后将 LobeHub 的回调地址粘贴到此处。
|
||||
</Steps>
|
||||
|
||||
## 第二步:在 LobeHub 中配置 QQ
|
||||
@@ -60,7 +49,7 @@ LobeHub ��持两种 QQ 机器人连接模式:
|
||||
<Steps>
|
||||
### 打开渠道设置
|
||||
|
||||
在 LobeHub 中,导航到您的代理设置,然后选择 **渠道** 标签页。��平台列表中点击 **QQ**。
|
||||
在 LobeHub 中,导航到您的代理设置,然后选择 **渠道** 标签页。从平台列表中点击 **QQ**。
|
||||
|
||||
### 输入应用凭证
|
||||
|
||||
@@ -69,26 +58,16 @@ LobeHub ��持两种 QQ 机器人连接模式:
|
||||
- **应用 ID** — 来自 QQ 开放平台的 App ID
|
||||
- **App Secret** — 来自 QQ 开放平台的 App Secret
|
||||
|
||||
### 选择连接模式
|
||||
### 保存并复制回调地址
|
||||
|
||||
在 **高级设置** 中,选择 **连接模式**:
|
||||
点击 **保存配置**。保存后,将显示一个 **回调地址(Callback URL)**。复制此地址。
|
||||
|
||||
- **WebSocket**(默认)— 推荐新机器人使用
|
||||
- **Webhook** — 适用于已在 QQ 开放平台配置了回调地址的机器人
|
||||
|
||||
### 保存配置
|
||||
|
||||
点击 **保存配置**。您的凭证将被加密并安全存储。
|
||||
|
||||
- 在 **WebSocket 模式** 下,机器人会自动连接到 QQ 网关,无需额外配置。
|
||||
- 在 **Webhook 模式** 下,保存后将显示 **回调地址(Callback URL)**。复制此地址用于第三步。
|
||||
您的凭证将被加密并安全存储。
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
## 第三步:在 QQ 开放平台配置回调(仅 Webhook 模式)
|
||||
|
||||
> 如果您使用的是 WebSocket 模式,请跳过此步骤。
|
||||
## 第三步:在 QQ 开放平台配置回调
|
||||
|
||||
<Steps>
|
||||
### 粘贴回调地址
|
||||
@@ -139,11 +118,11 @@ LobeHub ��持两种 QQ 机器人连接模式:
|
||||
|
||||
## 配置参考
|
||||
|
||||
| 字段 | 是否必需 | 描述 |
|
||||
| -------------- | ---- | ----------------------------------------- |
|
||||
| **应用 ID** | 是 | 来自 QQ 开放平台的 App ID |
|
||||
| **App Secret** | 是 | 来自 QQ 开放平台的 App Secret |
|
||||
| **连接模式** | 否 | `websocket`(默认)或 `webhook`,根据 QQ 开放平台配置选择 |
|
||||
| 字段 | 是否必需 | 描述 |
|
||||
| -------------- | ---- | ---------------------- |
|
||||
| **应用 ID** | 是 | 来自 QQ 开放平台的 App ID |
|
||||
| **App Secret** | 是 | 来自 QQ 开放平台的 App Secret |
|
||||
| **回调地址** | — | 保存后自动生成;粘贴到 QQ 开放平台 |
|
||||
|
||||
## 功能限制
|
||||
|
||||
@@ -154,8 +133,7 @@ LobeHub ��持两种 QQ 机器人连接模式:
|
||||
|
||||
## 故障排除
|
||||
|
||||
- **机器人无法连接(WebSocket 模式):** 验证 App ID 和 App Secret 是否正确。确保机��人在 QQ 开放平台上未配置回调地址 — 一旦设置了回调地址,WebSocket 模式将不可用。
|
||||
- **回调地址验证失败(Webhook 模式):** 确保您已在 LobeHub 中保存配置,并正确复制了 URL。LobeHub 会自动处理 Ed25519 验证。
|
||||
- **回调地址验证失败:** 确保您已在 LobeHub 中保存配置,并正确复制了 URL。LobeHub 会自动处理 Ed25519 验证。
|
||||
- **机器人未响应:** 验证 App ID 和 App Secret 是否正确,机器人是否已发布(或您是沙盒测试用户),以及是否订阅了所需的消息事件。
|
||||
- **群聊问题:** 确保机器人已被添加到群聊中。@提及机器人以触发响应。
|
||||
- **测试连接失败:** 仔细检查 LobeHub 渠道设置中的 App ID 和 App Secret。
|
||||
|
||||
+72
-156
@@ -20,213 +20,129 @@ By connecting a Slack channel to your LobeHub agent, users can interact with the
|
||||
- A LobeHub account with an active subscription
|
||||
- A Slack workspace where you have permission to install apps
|
||||
|
||||
## Connection Modes
|
||||
|
||||
LobeHub supports two connection modes for Slack:
|
||||
|
||||
- **Socket Mode / WebSocket (Recommended)** — Real-time event delivery via WebSocket. No public URL required. Ideal for development and private deployments.
|
||||
- **Webhook** — Stateless HTTP callbacks via the Events API. Requires a publicly accessible URL. Use this if your Slack app already has Event Subscriptions configured.
|
||||
|
||||
## Socket Mode Setup (Recommended)
|
||||
|
||||
### Step 1: Create a Slack App from Manifest
|
||||
## Step 1: Create a Slack App
|
||||
|
||||
<Steps>
|
||||
### Open the Slack API Dashboard
|
||||
### Go to the Slack API Dashboard
|
||||
|
||||
Visit [api.slack.com/apps](https://api.slack.com/apps) and click **Create New App** → **From an app manifest**.
|
||||
Visit [Slack API Apps](https://api.slack.com/apps) and click **Create New App**. Choose **From scratch**, give your app a name (e.g., "LobeHub Assistant"), select the workspace to install it in, and click **Create App**.
|
||||
|
||||
### Select Your Workspace
|
||||
|
||||
Choose the Slack workspace where you want to install the app.
|
||||
|
||||
### Paste the Manifest
|
||||
|
||||
Select **YAML** format and paste the following manifest template:
|
||||
|
||||
```yaml
|
||||
display_information:
|
||||
name: LobeHub Assistant
|
||||
description: AI assistant powered by LobeHub
|
||||
features:
|
||||
app_home:
|
||||
home_tab_enabled: false
|
||||
messages_tab_enabled: true
|
||||
messages_tab_read_only_enabled: false
|
||||
bot_user:
|
||||
display_name: LobeHub Assistant
|
||||
always_online: true
|
||||
slash_commands:
|
||||
- command: /new
|
||||
description: Start a new conversation
|
||||
should_escape: false
|
||||
- command: /stop
|
||||
description: Stop the current execution
|
||||
should_escape: false
|
||||
oauth_config:
|
||||
scopes:
|
||||
bot:
|
||||
- app_mentions:read
|
||||
- channels:history
|
||||
- channels:read
|
||||
- chat:write
|
||||
- commands
|
||||
- groups:history
|
||||
- groups:read
|
||||
- im:history
|
||||
- im:read
|
||||
- mpim:history
|
||||
- mpim:read
|
||||
- reactions:read
|
||||
- reactions:write
|
||||
- users:read
|
||||
- assistant:write
|
||||
settings:
|
||||
event_subscriptions:
|
||||
bot_events:
|
||||
- app_mention
|
||||
- message.channels
|
||||
- message.groups
|
||||
- message.im
|
||||
- message.mpim
|
||||
- member_joined_channel
|
||||
- assistant_thread_started
|
||||
- assistant_thread_context_changed
|
||||
interactivity:
|
||||
is_enabled: true
|
||||
org_deploy_enabled: false
|
||||
socket_mode_enabled: true
|
||||
token_rotation_enabled: false
|
||||
```
|
||||
|
||||
> **Note:** `socket_mode_enabled: true` means no Request URL is needed. Events (including Slash Commands) are delivered via WebSocket.
|
||||
|
||||
### Create the App
|
||||
|
||||
Review the summary and click **Create**.
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
### Step 2: Collect Credentials
|
||||
|
||||
<Steps>
|
||||
### Copy the App ID and Signing Secret
|
||||
|
||||
On the **Basic Information** page, copy:
|
||||
On the **Basic Information** page, copy and save:
|
||||
|
||||
- **App ID** — displayed at the top
|
||||
- **Signing Secret** — under **App Credentials**
|
||||
- **App ID** — displayed at the top of the page
|
||||
- **Signing Secret** — under the **App Credentials** section
|
||||
|
||||
### Generate an App-Level Token
|
||||

|
||||
|
||||
Scroll down to **App-Level Tokens** and click **Generate Token and Scopes**. Name it (e.g., "socket-mode"), add the `connections:write` scope, and click **Generate**.
|
||||
### Add Bot Token Scopes
|
||||
|
||||
Copy the token (starts with `xapp-`).
|
||||
In the left sidebar, go to **OAuth & Permissions**. Scroll down to **Scopes** → **Bot Token Scopes** and add the following:
|
||||
|
||||
> **Important:** This token is only shown once. Store it securely.
|
||||
- `app_mentions:read` — Detect when the bot is mentioned
|
||||
- `channels:history` — Read messages in public channels
|
||||
- `channels:read` — Read channel info
|
||||
- `chat:write` — Send messages
|
||||
- `groups:history` — Read messages in private channels
|
||||
- `groups:read` — Read private channel info
|
||||
- `im:history` — Read direct messages
|
||||
- `im:read` — Read DM channel info
|
||||
- `mpim:history` — Read group DM messages
|
||||
- `mpim:read` — Read group DM channel info
|
||||
- `reactions:read` — Read reactions
|
||||
- `reactions:write` — Add reactions
|
||||
- `users:read` — Look up user info
|
||||
|
||||
**Optional scopes** (for Slack Assistants API support):
|
||||
|
||||
- `assistant:write` — Enable the Slack Assistants API features
|
||||
|
||||
### Install the App to Your Workspace
|
||||
|
||||
Go to **OAuth & Permissions** in the sidebar, click **Install to Workspace**, and authorize. Copy the **Bot User OAuth Token** (starts with `xoxb-`).
|
||||
Still on the **OAuth & Permissions** page, click **Install to Workspace** and authorize the app. After installation, copy the **Bot User OAuth Token** (starts with `xoxb-`).
|
||||
|
||||
> **Important:** Treat your bot token like a password. Never share it publicly or commit it to version control.
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
### Step 3: Configure Slack in LobeHub
|
||||
## Step 2: Configure Slack in LobeHub
|
||||
|
||||
<Steps>
|
||||
### Open Channel Settings
|
||||
|
||||
In LobeHub, navigate to your agent's settings → **Channels** tab → click **Slack**.
|
||||
In LobeHub, navigate to your agent's settings, then select the **Channels** tab. Click **Slack** from the platform list.
|
||||
|
||||
### Enter Credentials
|
||||
### Fill in the Credentials
|
||||
|
||||
Fill in:
|
||||
Enter the following fields:
|
||||
|
||||
- **Application ID** — The App ID
|
||||
- **Bot Token** — The Bot User OAuth Token (`xoxb-...`)
|
||||
- **Signing Secret** — The Signing Secret
|
||||
- **App-Level Token** — The app-level token (`xapp-...`)
|
||||
- **Application ID** — The App ID from your Slack app's Basic Information page
|
||||
- **Bot Token** — The Bot User OAuth Token (xoxb-...) from OAuth & Permissions
|
||||
- **Signing Secret** — The Signing Secret from your Slack app's Basic Information page
|
||||
|
||||
### Select Connection Mode
|
||||
|
||||
In **Advanced Settings**, set **Connection Mode** to **WebSocket**.
|
||||
Your token will be encrypted and stored securely.
|
||||
|
||||
### Save Configuration
|
||||
|
||||
Click **Save Configuration**. The bot will automatically connect via Socket Mode. No webhook URL configuration is needed.
|
||||
Click **Save Configuration**. LobeHub will save your credentials and display a **Webhook URL**.
|
||||
|
||||
### Copy the Webhook URL
|
||||
|
||||
Copy the displayed Webhook URL — you will need it in the next step to configure Slack's Event Subscriptions.
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
### Step 4: Test the Connection
|
||||
|
||||
Click **Test Connection** in LobeHub, then go to Slack, invite the bot to a channel, and mention it with `@LobeHub Assistant` to confirm it responds.
|
||||
|
||||
> **Slash Commands:** If you used the manifest template above, the `/new` and `/stop` commands are automatically configured. Type `/new` in Slack to reset the conversation, or `/stop` to stop the current execution. You can also use these commands via `@bot /new`.
|
||||
|
||||
---
|
||||
|
||||
## Webhook Setup (Alternative)
|
||||
|
||||
Use this method if your Slack app already has Event Subscriptions configured with a public HTTP endpoint, or if you cannot use Socket Mode.
|
||||
## Step 3: Configure Event Subscriptions
|
||||
|
||||
<Steps>
|
||||
### Create a Slack App
|
||||
### Enable Events
|
||||
|
||||
Visit [api.slack.com/apps](https://api.slack.com/apps), click **Create New App** → **From scratch**. Name your app and select the workspace.
|
||||
Back in the [Slack API Dashboard](https://api.slack.com/apps), go to **Event Subscriptions** and toggle **Enable Events** to **On**.
|
||||
|
||||
### Add Bot Token Scopes
|
||||
### Set the Request URL
|
||||
|
||||
Go to **OAuth & Permissions** → **Bot Token Scopes** and add: `app_mentions:read`, `channels:history`, `channels:read`, `chat:write`, `groups:history`, `groups:read`, `im:history`, `im:read`, `mpim:history`, `mpim:read`, `reactions:read`, `reactions:write`, `users:read`.
|
||||
Paste the **Webhook URL** you copied from LobeHub into the **Request URL** field. Slack will send a verification challenge — LobeHub will respond automatically.
|
||||
|
||||
### Install to Workspace
|
||||
### Subscribe to Bot Events
|
||||
|
||||
Click **Install to Workspace** and copy the **Bot User OAuth Token** (`xoxb-...`).
|
||||
Under **Subscribe to bot events**, add:
|
||||
|
||||
### Configure in LobeHub
|
||||
- `app_mention` — Triggered when someone mentions the bot
|
||||
- `message.channels` — Messages in public channels
|
||||
- `message.groups` — Messages in private channels
|
||||
- `message.im` — Direct messages to the bot
|
||||
- `message.mpim` — Messages in group DMs
|
||||
- `member_joined_channel` — When a user joins a channel
|
||||
|
||||
Enter **Application ID**, **Bot Token**, and **Signing Secret** in LobeHub's Slack channel settings. Set **Connection Mode** to **Webhook** in Advanced Settings. Save and copy the displayed **Webhook URL**.
|
||||
**Optional events** (for Slack Assistants API support):
|
||||
|
||||
### Enable App Home Messaging
|
||||
- `assistant_thread_started` — When a user opens a new assistant thread
|
||||
- `assistant_thread_context_changed` — When a user navigates to a different channel with the assistant panel open
|
||||
|
||||
In the Slack API Dashboard → **App Home**, find the **Show Tabs** section, enable **Messages Tab**, and make sure **"Allow users to send Slash commands and messages from the messages tab"** is checked. This allows users to chat with the bot via direct messages.
|
||||
### Save Changes
|
||||
|
||||
### Configure Event Subscriptions
|
||||
|
||||
In the Slack API Dashboard → **Event Subscriptions**, enable events, paste the Webhook URL as the **Request URL**, and subscribe to bot events: `app_mention`, `message.channels`, `message.groups`, `message.im`, `message.mpim`, `member_joined_channel`.
|
||||
Click **Save Changes** at the bottom of the page.
|
||||
|
||||

|
||||
|
||||
### Configure Slash Commands (Optional)
|
||||
|
||||
In the Slack API Dashboard → **Slash Commands**, click **Create New Command** and add the following commands:
|
||||
|
||||
| Command | Request URL | Short Description |
|
||||
| ------- | ------------------------- | -------------------------- |
|
||||
| `/new` | Same Webhook URL as above | Start a new conversation |
|
||||
| `/stop` | Same Webhook URL as above | Stop the current execution |
|
||||
|
||||
> **Note:** The Request URL is required for Webhook mode. If you are using Socket Mode, we recommend creating the app from the Manifest template above, which automatically configures Slash Commands without manual setup.
|
||||
|
||||
Also ensure you add the `commands` scope under **OAuth & Permissions** → **Bot Token Scopes**, and enable **Interactivity & Shortcuts** with the same Webhook URL as the Request URL.
|
||||
</Steps>
|
||||
|
||||
## Step 4: Test the Connection
|
||||
|
||||
Back in LobeHub's channel settings for Slack, click **Test Connection** to verify the integration. Then go to your Slack workspace, invite the bot to a channel, and mention it with `@YourBotName` to confirm it responds.
|
||||
|
||||
## Configuration Reference
|
||||
|
||||
| Field | Required | Description |
|
||||
| ------------------- | ---------------- | ----------------------------------------------------- |
|
||||
| **Application ID** | Yes | Your Slack app's ID |
|
||||
| **Bot Token** | Yes | Bot User OAuth Token (`xoxb-...`) |
|
||||
| **Signing Secret** | Yes | Used to verify requests from Slack |
|
||||
| **App-Level Token** | Socket Mode only | App-level token (`xapp-...`) for WebSocket connection |
|
||||
| **Connection Mode** | No | `websocket` or `webhook` (default: `webhook`) |
|
||||
| Field | Required | Description |
|
||||
| ------------------ | -------- | ------------------------------------------ |
|
||||
| **Application ID** | Yes | Your Slack app's ID |
|
||||
| **Bot Token** | Yes | Bot User OAuth Token (xoxb-...) |
|
||||
| **Signing Secret** | Yes | Used to verify webhook requests from Slack |
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- **DM shows "Sending messages to this app has been turned off":** In the Slack API Dashboard → **App Home** → **Show Tabs**, make sure **Messages Tab** is enabled and "Allow users to send Slash commands and messages from the messages tab" is checked. This is already enabled if you created the app using the Manifest template.
|
||||
- **Bot not responding:** Confirm the bot has been invited to the channel. For Socket Mode, ensure the App-Level Token is correct and Socket Mode is enabled in Slack app settings.
|
||||
- **Test Connection failed:** Double-check the Application ID and Bot Token. Ensure the app is installed to the workspace.
|
||||
- **Webhook verification failed (Webhook mode):** Make sure the Signing Secret matches and the Webhook URL is correct.
|
||||
- **Socket Mode not connecting:** Verify the App-Level Token has the `connections:write` scope. Check that Socket Mode is enabled in your Slack app settings under **Socket Mode**.
|
||||
- **Bot not responding:** Confirm the bot has been invited to the channel and the Event Subscriptions are correctly configured with the right webhook URL.
|
||||
- **Test Connection failed:** Double-check the Application ID and Bot Token are correct. Ensure the app is installed to the workspace.
|
||||
- **Webhook verification failed:** Make sure the Signing Secret matches the one in your Slack app's Basic Information page.
|
||||
|
||||
@@ -17,213 +17,129 @@ tags:
|
||||
- 一个拥有有效订阅的 LobeHub 账户
|
||||
- 一个拥有安装应用权限的 Slack 工作区
|
||||
|
||||
## 连接模式
|
||||
|
||||
LobeHub 支持两种 Slack 连接模式:
|
||||
|
||||
- **Socket Mode / WebSocket(推荐)** — 通过 WebSocket 实时接收事件。无需公网 URL。适合开发环境和私有部署。
|
||||
- **Webhook** — 通过 Events API 的无状态 HTTP 回调。需要公网可访问的 URL。如果您的 Slack 应用已配置了事件订阅,请使用此模式。
|
||||
|
||||
## Socket Mode 设置(推荐)
|
||||
|
||||
### 第一步:通过 Manifest 创建 Slack 应用
|
||||
## 第一步:创建 Slack 应用
|
||||
|
||||
<Steps>
|
||||
### 打开 Slack API 控制台
|
||||
### 访问 Slack API 控制台
|
||||
|
||||
访问 [api.slack.com/apps](https://api.slack.com/apps),点击 **Create New App** → **From an app manifest**。
|
||||
访问 [Slack API Apps](https://api.slack.com/apps),点击 **Create New App**。选择 **From scratch**,为您的应用命名(例如 "LobeHub 助手"),选择要安装到的工作区,然后点击 **Create App**。
|
||||
|
||||
### 选择工作区
|
||||
|
||||
选择您要安装应用的 Slack 工作区。
|
||||
|
||||
### 粘贴 Manifest 模板
|
||||
|
||||
选择 **YAML** 格式,粘贴以下模板:
|
||||
|
||||
```yaml
|
||||
display_information:
|
||||
name: LobeHub Assistant
|
||||
description: AI assistant powered by LobeHub
|
||||
features:
|
||||
app_home:
|
||||
home_tab_enabled: false
|
||||
messages_tab_enabled: true
|
||||
messages_tab_read_only_enabled: false
|
||||
bot_user:
|
||||
display_name: LobeHub Assistant
|
||||
always_online: true
|
||||
slash_commands:
|
||||
- command: /new
|
||||
description: Start a new conversation
|
||||
should_escape: false
|
||||
- command: /stop
|
||||
description: Stop the current execution
|
||||
should_escape: false
|
||||
oauth_config:
|
||||
scopes:
|
||||
bot:
|
||||
- app_mentions:read
|
||||
- channels:history
|
||||
- channels:read
|
||||
- chat:write
|
||||
- commands
|
||||
- groups:history
|
||||
- groups:read
|
||||
- im:history
|
||||
- im:read
|
||||
- mpim:history
|
||||
- mpim:read
|
||||
- reactions:read
|
||||
- reactions:write
|
||||
- users:read
|
||||
- assistant:write
|
||||
settings:
|
||||
event_subscriptions:
|
||||
bot_events:
|
||||
- app_mention
|
||||
- message.channels
|
||||
- message.groups
|
||||
- message.im
|
||||
- message.mpim
|
||||
- member_joined_channel
|
||||
- assistant_thread_started
|
||||
- assistant_thread_context_changed
|
||||
interactivity:
|
||||
is_enabled: true
|
||||
org_deploy_enabled: false
|
||||
socket_mode_enabled: true
|
||||
token_rotation_enabled: false
|
||||
```
|
||||
|
||||
> **注意:** `socket_mode_enabled: true` 表示无需配置 Request URL。事件(包括 Slash Commands)通过 WebSocket 推送。
|
||||
|
||||
### 创建应用
|
||||
|
||||
确认配置摘要后,点击 **Create**。
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
### 第二步:获取凭证
|
||||
|
||||
<Steps>
|
||||
### 复制 App ID 和 Signing Secret
|
||||
|
||||
在 **Basic Information** 页面,复制:
|
||||
在 **Basic Information** 页面,复制并保存:
|
||||
|
||||
- **App ID** — 显示在页面顶部
|
||||
- **Signing Secret** — 在 **App Credentials** 部分
|
||||
- **Signing Secret** — 在 **App Credentials** 部分下
|
||||
|
||||
### 生成应用级别 Token
|
||||

|
||||
|
||||
向下滚动到 **App-Level Tokens**,点击 **Generate Token and Scopes**。命名(如 "socket-mode"),添加 `connections:write` 权限,点击 **Generate**。
|
||||
### 添加 Bot Token 权限范围
|
||||
|
||||
复制生成的 Token(以 `xapp-` 开头)。
|
||||
在左侧菜单中,进入 **OAuth & Permissions**。向下滚动到 **Scopes** → **Bot Token Scopes**,添加以下权限:
|
||||
|
||||
> **重要:** 此 Token 仅显示一次,请妥善保管。
|
||||
- `app_mentions:read` — 检测机器人被提及
|
||||
- `channels:history` — 读取公共频道中的消息
|
||||
- `channels:read` — 读取频道信息
|
||||
- `chat:write` — 发送消息
|
||||
- `groups:history` — 读取私有频道中的消息
|
||||
- `groups:read` — 读取私有频道信息
|
||||
- `im:history` — 读取私信
|
||||
- `im:read` — 读取私信频道信息
|
||||
- `mpim:history` — 读取群组私信消息
|
||||
- `mpim:read` — 读取群组私信信息
|
||||
- `reactions:read` — 读取表情回应
|
||||
- `reactions:write` — 添加表情回应
|
||||
- `users:read` — 查询用户信息
|
||||
|
||||
**可选权限**(用于 Slack Assistants API):
|
||||
|
||||
- `assistant:write` — 启用 Slack Assistants API 功能
|
||||
|
||||
### 安装应用到工作区
|
||||
|
||||
进入侧边栏的 **OAuth & Permissions**,点击 **Install to Workspace** 并授权。复制 **Bot User OAuth Token**(以 `xoxb-` 开头)。
|
||||
仍然在 **OAuth & Permissions** 页面,点击 **Install to Workspace** 并授权应用。安装完成后,复制 **Bot User OAuth Token**(以 `xoxb-` 开头)。
|
||||
|
||||
> **重要提示:** 请将您的 Bot Token 视为密码。切勿公开分享或提交到版本控制系统。
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
### 第三步:在 LobeHub 中配置 Slack
|
||||
## 第二步:在 LobeHub 中配置 Slack
|
||||
|
||||
<Steps>
|
||||
### 打开渠道设置
|
||||
|
||||
在 LobeHub 中,导航到代理设置 → **渠道** 标签 → 点击 **Slack**。
|
||||
在 LobeHub 中,导航到您的代理设置,然后选择 **渠道** 标签。点击平台列表中的 **Slack**。
|
||||
|
||||
### 输入凭证
|
||||
### 填写凭据
|
||||
|
||||
填写:
|
||||
输入以下字段:
|
||||
|
||||
- **应用 ID** — App ID
|
||||
- **Bot Token** — Bot User OAuth Token(`xoxb-...`)
|
||||
- **签名密钥** — Signing Secret
|
||||
- **应用级别 Token** — App-Level Token(`xapp-...`)
|
||||
- **应用 ID** — 来自 Slack 应用 Basic Information 页面的 App ID
|
||||
- **Bot Token** — 来自 OAuth & Permissions 页面的 Bot User OAuth Token(xoxb-...)
|
||||
- **签名密钥** — 来自 Slack 应用 Basic Information 页面的 Signing Secret
|
||||
|
||||
### 选择连接模式
|
||||
|
||||
在 **高级设置** 中,将 **连接模式** 设置为 **WebSocket**。
|
||||
您的令牌将被加密并安全存储。
|
||||
|
||||
### 保存配置
|
||||
|
||||
点击 **保存配置**。机器人将自动通过 Socket Mode 连接。无需配置 Webhook URL。
|
||||
点击 **保存配置**。LobeHub 将保存您的凭据并显示一个 **Webhook URL**。
|
||||
|
||||
### 复制 Webhook URL
|
||||
|
||||
复制显示的 Webhook URL —— 您将在下一步中使用它来配置 Slack 的事件订阅。
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
### 第四步:测试连接
|
||||
|
||||
在 LobeHub 点击 **测试连接**,然后进入 Slack,将机器人邀请到频道,通过 `@LobeHub Assistant` 提及它,确认是否正常响应。
|
||||
|
||||
> **Slash Commands:** 如果您使用了上方的 Manifest 模板,`/new` 和 `/stop` 命令已自动配置。在 Slack 输入 `/new` 可以重置对话,输入 `/stop` 可以停止当前执行。您也可以通过 `@bot /new` 的方式使用这些命令。
|
||||
|
||||
---
|
||||
|
||||
## Webhook 设置(备选方案)
|
||||
|
||||
如果您的 Slack 应用已配置了 Event Subscriptions 的公网 HTTP 端点,或无法使用 Socket Mode,请使用此方式。
|
||||
## 第三步:配置事件订阅
|
||||
|
||||
<Steps>
|
||||
### 创建 Slack 应用
|
||||
### 启用事件
|
||||
|
||||
访问 [api.slack.com/apps](https://api.slack.com/apps),点击 **Create New App** → **From scratch**。命名应用并选择工作区。
|
||||
返回 [Slack API 控制台](https://api.slack.com/apps),进入 **Event Subscriptions**,将 **Enable Events** 切换为 **On**。
|
||||
|
||||
### 添加 Bot Token 权限
|
||||
### 设置请求 URL
|
||||
|
||||
进入 **OAuth & Permissions** → **Bot Token Scopes**,添加:`app_mentions:read`、`channels:history`、`channels:read`、`chat:write`、`groups:history`、`groups:read`、`im:history`、`im:read`、`mpim:history`、`mpim:read`、`reactions:read`、`reactions:write`、`users:read`。
|
||||
将您从 LobeHub 复制的 **Webhook URL** 粘贴到 **Request URL** 字段中。Slack 将发送一个验证请求 —— LobeHub 会自动响应。
|
||||
|
||||
### 安装到工作区
|
||||
### 订阅机器人事件
|
||||
|
||||
点击 **Install to Workspace**,复制 **Bot User OAuth Token**(`xoxb-...`)。
|
||||
在 **Subscribe to bot events** 下,添加:
|
||||
|
||||
### 在 LobeHub 中配置
|
||||
- `app_mention` — 当有人提及机器人时触发
|
||||
- `message.channels` — 公共频道中的消息
|
||||
- `message.groups` — 私有频道中的消息
|
||||
- `message.im` — 发送给机器人的私信
|
||||
- `message.mpim` — 群组私信中的消息
|
||||
- `member_joined_channel` — 当用户加入频道时触发
|
||||
|
||||
在 LobeHub 的 Slack 渠道设置中输入 **应用 ID**、**Bot Token** 和 **签名密钥**。在高级设置中将 **连接模式** 设为 **Webhook**。保存后复制显示的 **Webhook URL**。
|
||||
**可选事件**(用于 Slack Assistants API):
|
||||
|
||||
### 启用 App Home 消息功能
|
||||
- `assistant_thread_started` — 当用户打开新的助手会话时触发
|
||||
- `assistant_thread_context_changed` — 当用户在助手面板打开时切换到不同频道时触发
|
||||
|
||||
在 Slack API 控制台 → **App Home** 中,找到 **Show Tabs** 区域,勾选 **Messages Tab**,并确保 **"Allow users to send Slash commands and messages from the messages tab"** 已启用。这样用户才能在私信中与机器人对话。
|
||||
### 保存更改
|
||||
|
||||
### 配置事件订阅
|
||||
|
||||
在 Slack API 控制台 → **Event Subscriptions** 中,启用事件,将 Webhook URL 粘贴为 **Request URL**,订阅事件:`app_mention`、`message.channels`、`message.groups`、`message.im`、`message.mpim`、`member_joined_channel`。
|
||||
点击页面底部的 **Save Changes**。
|
||||
|
||||

|
||||
|
||||
### 配置 Slash Commands(可选)
|
||||
|
||||
在 Slack API 控制台 → **Slash Commands** 中,点击 **Create New Command**,添加以下命令:
|
||||
|
||||
| Command | Request URL | Short Description |
|
||||
| ------- | ------------------ | -------------------------- |
|
||||
| `/new` | 与上方相同的 Webhook URL | Start a new conversation |
|
||||
| `/stop` | 与上方相同的 Webhook URL | Stop the current execution |
|
||||
|
||||
> **注意:** Webhook 模式下 Request URL 为必填项。如果您使用 Socket Mode,推荐通过 Manifest 模板创建应用,Slash Commands 会自动配置,无需手动添加。
|
||||
|
||||
同时确保在 **OAuth & Permissions** → **Bot Token Scopes** 中添加 `commands` 权限,并在 **Interactivity & Shortcuts** 中启用 Interactivity,将 Request URL 设为相同的 Webhook URL。
|
||||
</Steps>
|
||||
|
||||
## 第四步:测试连接
|
||||
|
||||
返回 LobeHub 的 Slack 渠道设置,点击 **测试连接** 以验证集成是否正确。然后进入您的 Slack 工作区,将机器人邀请到一个频道,通过 `@你的机器人名称` 提及它,确认其是否响应。
|
||||
|
||||
## 配置参考
|
||||
|
||||
| 字段 | 是否必需 | 描述 |
|
||||
| -------------- | ------------- | -------------------------------------- |
|
||||
| **应用 ID** | 是 | 您的 Slack 应用 ID |
|
||||
| **Bot Token** | 是 | Bot User OAuth Token(`xoxb-...`) |
|
||||
| **签名密钥** | 是 | 用于验证来自 Slack 的请求 |
|
||||
| **应用级别 Token** | 仅 Socket Mode | 应用级别 Token(`xapp-...`),用于 WebSocket 连接 |
|
||||
| **连接模式** | 否 | `websocket` 或 `webhook`(默认:`webhook`) |
|
||||
| 字段 | 是否必需 | 描述 |
|
||||
| ------------- | ---- | ------------------------------ |
|
||||
| **应用 ID** | 是 | 您的 Slack 应用的 ID |
|
||||
| **Bot Token** | 是 | Bot User OAuth Token(xoxb-...) |
|
||||
| **签名密钥** | 是 | 用于验证来自 Slack 的 Webhook 请求 |
|
||||
|
||||
## 故障排除
|
||||
|
||||
- **私信显示 "Sending messages to this app has been turned off":** 在 Slack API 控制台 → **App Home** → **Show Tabs** 中,确保 **Messages Tab** 已启用,并勾选 "Allow users to send Slash commands and messages from the messages tab"。如果使用 Manifest 模板创建应用则默认已开启。
|
||||
- **机器人未响应:** 确认机器人已被邀请到频道。Socket Mode 下请确保应用级别 Token 正确且 Socket Mode 已在 Slack 应用设置中启用。
|
||||
- **机器人未响应:** 确认机器人已被邀请到频道,且事件订阅已正确配置了正确的 Webhook URL。
|
||||
- **测试连接失败:** 仔细检查应用 ID 和 Bot Token 是否正确。确保应用已安装到工作区。
|
||||
- **Webhook 验证失败(Webhook 模式):** 确保签名密钥匹配且 Webhook URL 正确。
|
||||
- **Socket Mode 无法连接:** 验证应用级别 Token 具有 `connections:write` 权限。检查 Slack 应用设置中的 **Socket Mode** 是否已启用。
|
||||
- **Webhook 验证失败:** 确保签名密钥与 Slack 应用 Basic Information 页面中的一致。
|
||||
|
||||
@@ -40,7 +40,6 @@ export default eslint(
|
||||
// AI coding tools directories
|
||||
'.claude',
|
||||
'.serena',
|
||||
'.i18nrc.js',
|
||||
],
|
||||
next: true,
|
||||
react: 'next',
|
||||
|
||||
@@ -22,10 +22,6 @@
|
||||
"channel.connectSuccess": "تم الاتصال بالروبوت بنجاح",
|
||||
"channel.connecting": "جارٍ الاتصال...",
|
||||
"channel.connectionConfig": "إعدادات الاتصال",
|
||||
"channel.connectionMode": "وضع الاتصال",
|
||||
"channel.connectionModeHint": "يُفضَّل استخدام WebSocket للروبوتات الجديدة. استخدم Webhook إذا كان روبوتك يحتوي بالفعل على عنوان URL مُعدّ لرد النداء على منصة QQ المفتوحة.",
|
||||
"channel.connectionModeWebSocket": "WebSocket",
|
||||
"channel.connectionModeWebhook": "Webhook",
|
||||
"channel.copied": "تم النسخ إلى الحافظة",
|
||||
"channel.copy": "نسخ",
|
||||
"channel.credentials": "بيانات الاعتماد",
|
||||
@@ -61,8 +57,6 @@
|
||||
"channel.endpointUrlHint": "يرجى نسخ هذا العنوان ولصقه في الحقل <bold>{{fieldName}}</bold> في بوابة مطوري {{name}}.",
|
||||
"channel.exportConfig": "تصدير التكوين",
|
||||
"channel.feishu.description": "قم بتوصيل هذا المساعد بـ Feishu للدردشة الخاصة والجماعية.",
|
||||
"channel.feishu.webhookMigrationDesc": "يوفّر وضع WebSocket تسليمًا فوريًا للأحداث دون الحاجة إلى عنوان URL عام لرد النداء. للانتقال، قم بتغيير وضع الاتصال إلى WebSocket في الإعدادات المتقدمة. لا يلزم أي إعداد إضافي على منصة Feishu/Lark المفتوحة.",
|
||||
"channel.feishu.webhookMigrationTitle": "النظر في الترقية إلى وضع WebSocket",
|
||||
"channel.historyLimit": "حد رسائل السجل",
|
||||
"channel.historyLimitHint": "العدد الافتراضي للرسائل التي يتم جلبها عند قراءة سجل القناة",
|
||||
"channel.importConfig": "استيراد التكوين",
|
||||
@@ -77,8 +71,6 @@
|
||||
"channel.publicKeyPlaceholder": "مطلوب للتحقق من التفاعل",
|
||||
"channel.qq.appIdHint": "معرّف تطبيق QQ Bot الخاص بك من منصة QQ المفتوحة",
|
||||
"channel.qq.description": "قم بتوصيل هذا المساعد بـ QQ للمحادثات الجماعية والرسائل المباشرة.",
|
||||
"channel.qq.webhookMigrationDesc": "يوفّر وضع WebSocket تسليمًا فوريًا للأحداث وإعادة اتصال تلقائية دون الحاجة إلى عنوان URL لرد النداء. للانتقال، أنشئ روبوتًا جديدًا على منصة QQ المفتوحة دون إعداد عنوان URL لرد النداء، ثم غيّر وضع الاتصال إلى WebSocket في الإعدادات المتقدمة.",
|
||||
"channel.qq.webhookMigrationTitle": "النظر في الترقية إلى وضع WebSocket",
|
||||
"channel.removeChannel": "إزالة القناة",
|
||||
"channel.removeFailed": "فشل في إزالة القناة",
|
||||
"channel.removed": "تمت إزالة القناة",
|
||||
@@ -101,11 +93,7 @@
|
||||
"channel.signingSecret": "سر التوقيع",
|
||||
"channel.signingSecretHint": "يُستخدم للتحقق من طلبات الويب هوك.",
|
||||
"channel.slack.appIdHint": "معرف تطبيق Slack الخاص بك من لوحة تحكم API Slack (يبدأ بـ A).",
|
||||
"channel.slack.appToken": "رمز على مستوى التطبيق",
|
||||
"channel.slack.appTokenHint": "مطلوب لوضع Socket Mode (WebSocket). أنشئ رمزًا على مستوى التطبيق (xapp-...) من قسم المعلومات الأساسية في إعدادات تطبيق Slack الخاص بك.",
|
||||
"channel.slack.description": "قم بتوصيل هذا المساعد بـ Slack للمحادثات القنوية والرسائل المباشرة.",
|
||||
"channel.slack.webhookMigrationDesc": "يوفّر وضع Socket Mode تسليمًا فوريًا للأحداث عبر WebSocket دون الحاجة إلى تعريض نقطة نهاية HTTP عامة. للانتقال، فعّل Socket Mode في إعدادات تطبيق Slack، وأنشئ رمزًا على مستوى التطبيق، ثم غيّر وضع الاتصال إلى WebSocket في الإعدادات المتقدمة.",
|
||||
"channel.slack.webhookMigrationTitle": "النظر في الترقية إلى وضع Socket Mode (WebSocket)",
|
||||
"channel.telegram.description": "قم بتوصيل هذا المساعد بـ Telegram للدردشة الخاصة والجماعية.",
|
||||
"channel.testConnection": "اختبار الاتصال",
|
||||
"channel.testFailed": "فشل اختبار الاتصال",
|
||||
|
||||
@@ -42,11 +42,6 @@
|
||||
"confirmRemoveGroupSuccess": "تم حذف المجموعة بنجاح",
|
||||
"confirmRemoveSessionItemAlert": "أنت على وشك حذف هذا الوكيل. بمجرد الحذف، لا يمكن استعادته. يرجى تأكيد الإجراء.",
|
||||
"confirmRemoveSessionSuccess": "تم حذف الوكيل بنجاح",
|
||||
"createModal.createBlank": "إنشاء صفحة فارغة",
|
||||
"createModal.groupPlaceholder": "صِف ما ينبغي أن يقوم به هذا الفريق...",
|
||||
"createModal.groupTitle": "ما الذي ينبغي أن يقوم به فريقك؟",
|
||||
"createModal.placeholder": "صِف ما ينبغي أن يقوم به وكيلك...",
|
||||
"createModal.title": "ما الذي ينبغي أن يقوم به وكيلك؟",
|
||||
"defaultAgent": "الوكيل الافتراضي",
|
||||
"defaultGroupChat": "مجموعة",
|
||||
"defaultList": "القائمة الافتراضية",
|
||||
@@ -234,7 +229,6 @@
|
||||
"operation.contextCompression": "السياق طويل جدًا، يتم ضغط السجل...",
|
||||
"operation.execAgentRuntime": "جارٍ تحضير الرد",
|
||||
"operation.execClientTask": "تنفيذ المهمة",
|
||||
"operation.execServerAgentRuntime": "قيد التنفيذ… يمكنك تغيير المهام أو إغلاق الصفحة — ستستمر المهمة بالعمل.",
|
||||
"operation.sendMessage": "جارٍ إرسال الرسالة",
|
||||
"owner": "مالك المجموعة",
|
||||
"pageCopilot.title": "وكيل الصفحة",
|
||||
@@ -388,7 +382,6 @@
|
||||
"task.status.fetchingDetails": "جارٍ جلب التفاصيل...",
|
||||
"task.status.initializing": "جارٍ تهيئة المهمة...",
|
||||
"task.subtask": "مهمة فرعية",
|
||||
"task.title": "المهام",
|
||||
"thread.divider": "موضوع فرعي",
|
||||
"thread.threadMessageCount": "{{messageCount}} رسالة",
|
||||
"thread.title": "موضوع فرعي",
|
||||
@@ -436,11 +429,9 @@
|
||||
"toolAuth.title": "تفويض المهارات لهذا الوكيل",
|
||||
"topic.checkOpenNewTopic": "هل تريد بدء موضوع جديد؟",
|
||||
"topic.checkSaveCurrentMessages": "هل تريد حفظ المحادثة الحالية كموضوع؟",
|
||||
"topic.defaultTitle": "موضوع بدون عنوان",
|
||||
"topic.openNewTopic": "فتح موضوع جديد",
|
||||
"topic.recent": "المواضيع الأخيرة",
|
||||
"topic.saveCurrentMessages": "حفظ الجلسة الحالية كموضوع",
|
||||
"topic.viewAll": "عرض جميع المواضيع",
|
||||
"translate.action": "ترجمة",
|
||||
"translate.clear": "مسح الترجمة",
|
||||
"tts.action": "تحويل النص إلى كلام",
|
||||
|
||||
@@ -343,19 +343,10 @@
|
||||
"mail.support": "دعم عبر البريد الإلكتروني",
|
||||
"more": "المزيد",
|
||||
"navPanel.agent": "الوكيل",
|
||||
"navPanel.customizeSidebar": "تخصيص الشريط الجانبي",
|
||||
"navPanel.displayItems": "عناصر العرض",
|
||||
"navPanel.hidden": "مخفي",
|
||||
"navPanel.hideSection": "إخفاء القسم",
|
||||
"navPanel.library": "المكتبة",
|
||||
"navPanel.moveDown": "نقل لأسفل",
|
||||
"navPanel.moveUp": "نقل لأعلى",
|
||||
"navPanel.pinned": "مثبّت",
|
||||
"navPanel.searchAgent": "بحث عن وكيل...",
|
||||
"navPanel.searchRecent": "البحث في الأخير...",
|
||||
"navPanel.searchResultEmpty": "لم يتم العثور على نتائج",
|
||||
"navPanel.show": "إظهار",
|
||||
"navPanel.visible": "مرئي",
|
||||
"new": "جديد",
|
||||
"noContent": "لا يوجد محتوى",
|
||||
"oauth": "تسجيل الدخول الموحد",
|
||||
@@ -371,12 +362,6 @@
|
||||
"productHunt.actionLabel": "ادعمنا",
|
||||
"productHunt.description": "ادعمنا على Product Hunt. دعمك يعني لنا الكثير!",
|
||||
"productHunt.title": "نحن على Product Hunt!",
|
||||
"promptTransform.action": "تنقية الفكرة",
|
||||
"promptTransform.actions.rewrite": "توسيع التفاصيل",
|
||||
"promptTransform.actions.translate": "ترجمة",
|
||||
"promptTransform.status.rewrite": "جارٍ توسيع التفاصيل...",
|
||||
"promptTransform.status.translate": "جارٍ الترجمة...",
|
||||
"recents": "العناصر الأخيرة",
|
||||
"regenerate": "إعادة التوليد",
|
||||
"releaseNotes": "تفاصيل الإصدار",
|
||||
"rename": "إعادة التسمية",
|
||||
@@ -415,7 +400,6 @@
|
||||
"tab.audio": "الصوت",
|
||||
"tab.chat": "الدردشة",
|
||||
"tab.community": "المجتمع",
|
||||
"tab.create": "إنشاء",
|
||||
"tab.discover": "اكتشف",
|
||||
"tab.eval": "مختبر التقييم",
|
||||
"tab.files": "الملفات",
|
||||
|
||||
@@ -124,7 +124,6 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "الصوت",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "الصورة",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "النص",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "فيديو",
|
||||
"ModelSwitchPanel.detail.pricing.input": "المدخلات ${{amount}}/مليون",
|
||||
"ModelSwitchPanel.detail.pricing.output": "المخرجات ${{amount}}/مليون",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / صورة",
|
||||
@@ -140,7 +139,6 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "مدخل (مخزن)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "مدخل (كتابة في التخزين)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "مخرج",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "إنشاء الفيديو",
|
||||
"ModelSwitchPanel.detail.releasedAt": "تم الإصدار في {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "لا يوجد نموذج مفعل. يرجى الذهاب إلى الإعدادات لتفعيله.",
|
||||
"ModelSwitchPanel.emptyProvider": "لا يوجد مزود مفعل. يرجى الذهاب إلى الإعدادات لتفعيل أحدهم.",
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
"config.model.label": "النموذج",
|
||||
"config.prompt.placeholder": "صف ما ترغب في إنشائه",
|
||||
"config.prompt.placeholderWithRef": "وصف كيف تريد تعديل الصورة",
|
||||
"config.promptExtend.label": "توسيع المطلب",
|
||||
"config.quality.label": "جودة الصورة",
|
||||
"config.quality.options.hd": "عالية الدقة",
|
||||
"config.quality.options.standard": "قياسية",
|
||||
@@ -25,8 +24,6 @@
|
||||
"config.size.label": "الحجم",
|
||||
"config.steps.label": "الخطوات",
|
||||
"config.title": "الإعدادات",
|
||||
"config.watermark.label": "علامة مائية",
|
||||
"config.webSearch.label": "بحث ويب",
|
||||
"config.width.label": "العرض",
|
||||
"generation.actions.applySeed": "تطبيق البذرة",
|
||||
"generation.actions.copyError": "نسخ رسالة الخطأ",
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
{
|
||||
"features.assistantMessageGroup.desc": "تجميع رسائل الوكيل ونتائج استدعاء الأدوات معًا للعرض",
|
||||
"features.assistantMessageGroup.title": "تجميع رسائل الوكيل",
|
||||
"features.gatewayMode.desc": "تنفيذ مهام الوكيل على الخادم عبر بوابة WebSocket بدلًا من التشغيل محليًا، مما يتيح تنفيذًا أسرع ويقلل من استهلاك موارد العميل.",
|
||||
"features.gatewayMode.title": "تنفيذ الوكيل من جانب الخادم (البوابة)",
|
||||
"features.groupChat.desc": "تمكين تنسيق الدردشة الجماعية متعددة الوكلاء.",
|
||||
"features.groupChat.title": "دردشة جماعية (متعددة الوكلاء)",
|
||||
"features.inputMarkdown.desc": "عرض Markdown في منطقة الإدخال في الوقت الفعلي (نص عريض، كتل الشيفرة، جداول، إلخ).",
|
||||
|
||||
+27
-104
@@ -20,7 +20,6 @@
|
||||
"Baichuan4-Turbo.description": "نموذج رائد في الصين، يتفوق على النماذج العالمية في المهام الصينية مثل المعرفة، النصوص الطويلة، والتوليد الإبداعي. كما يتميز بقدرات متعددة الوسائط رائدة في الصناعة ونتائج قوية في المعايير الموثوقة.",
|
||||
"Baichuan4.description": "أداء محلي رائد، يتفوق على النماذج العالمية في المهام الصينية مثل المعرفة الموسوعية، النصوص الطويلة، والتوليد الإبداعي. كما يقدم قدرات متعددة الوسائط رائدة ونتائج قوية في المعايير.",
|
||||
"ByteDance-Seed/Seed-OSS-36B-Instruct.description": "Seed-OSS هي عائلة من النماذج مفتوحة المصدر من ByteDance Seed، مصممة للتعامل مع السياقات الطويلة، والاستدلال، والمهام العامة. Seed-OSS-36B-Instruct هو نموذج موجه بالتعليم يحتوي على 36 مليار معلمة مع دعم أصلي للسياقات الطويلة جدًا لمعالجة المستندات الكبيرة أو قواعد الشيفرة. يتميز بقدرات قوية في الاستدلال وتوليد الشيفرة واستخدام الأدوات. من أبرز ميزاته \"ميزانية التفكير\" التي تسمح بطول استدلال مرن لتحسين الكفاءة.",
|
||||
"DeepSeek-OCR.description": "يعد DeepSeek-OCR نموذج رؤية-لغة من DeepSeek AI يركز على التعرف البصري على الحروف و\"الضغط السياقي البصري\". يستكشف ضغط السياق المستخرج من الصور، ويعالج المستندات بكفاءة، ويحوّلها إلى نص منظم (مثل Markdown). يقدّم دقة عالية في التعرف على النص داخل الصور، مما يجعله مناسباً لرقمنة المستندات واستخراج النصوص والمعالجة الهيكلية.",
|
||||
"DeepSeek-R1-Distill-Llama-70B.description": "تم تقطير DeepSeek R1، النموذج الأكبر والأذكى في مجموعة DeepSeek، إلى بنية Llama 70B. تُظهر المعايير والتقييمات البشرية أنه أذكى من Llama 70B الأساسي، خاصة في مهام الرياضيات ودقة الحقائق.",
|
||||
"DeepSeek-R1-Distill-Qwen-1.5B.description": "نموذج مقطر من DeepSeek-R1 يعتمد على Qwen2.5-Math-1.5B. يعمل التعلم المعزز وبيانات البداية الباردة على تحسين أداء الاستدلال، مما يضع معايير جديدة للمهام المتعددة في النماذج المفتوحة.",
|
||||
"DeepSeek-R1-Distill-Qwen-14B.description": "نماذج DeepSeek-R1-Distill مدربة بدقة من نماذج مفتوحة المصدر باستخدام بيانات عينة تم إنشاؤها بواسطة DeepSeek-R1.",
|
||||
@@ -31,7 +30,6 @@
|
||||
"DeepSeek-V3-Fast.description": "المزود: sophnet. DeepSeek V3 Fast هو الإصدار عالي السرعة من DeepSeek V3 0324، بدقة كاملة (غير مضغوطة) مع أداء أقوى في البرمجة والرياضيات واستجابات أسرع.",
|
||||
"DeepSeek-V3.1-Fast.description": "DeepSeek V3.1 Fast هو الإصدار السريع عالي السرعة من DeepSeek V3.1. وضع تفكير هجين: من خلال قوالب الدردشة، يدعم نموذج واحد كلاً من أوضاع التفكير وغير التفكير. استخدام أدوات أذكى: التحسينات بعد التدريب تعزز أداء المهام التي تتطلب أدوات ووكلاء.",
|
||||
"DeepSeek-V3.1-Think.description": "وضع التفكير في DeepSeek-V3.1: نموذج استدلال هجين جديد يدعم أوضاع التفكير وغير التفكير، أكثر كفاءة من DeepSeek-R1-0528. التحسينات بعد التدريب تعزز بشكل كبير استخدام الأدوات وأداء المهام التي تتطلب وكلاء.",
|
||||
"DeepSeek-V3.2.description": "يقدم deepseek-v3.2 آلية انتباه متفرّق تهدف إلى تحسين كفاءة التدريب والاستدلال عند معالجة النصوص الطويلة، مع كلفة أقل مقارنة بـ deepseek-v3.1.",
|
||||
"DeepSeek-V3.description": "DeepSeek-V3 هو نموذج MoE تم تطويره بواسطة DeepSeek. يتفوق على نماذج مفتوحة أخرى مثل Qwen2.5-72B وLlama-3.1-405B في العديد من المعايير، ويتنافس مع النماذج المغلقة الرائدة مثل GPT-4o وClaude 3.5 Sonnet.",
|
||||
"Doubao-lite-128k.description": "يوفر Doubao-lite استجابات فائقة السرعة وقيمة أفضل، مع خيارات مرنة عبر السيناريوهات. يدعم سياق 128K للاستدلال والتدريب الدقيق.",
|
||||
"Doubao-lite-32k.description": "يوفر Doubao-lite استجابات فائقة السرعة وقيمة أفضل، مع خيارات مرنة عبر السيناريوهات. يدعم سياق 32K للاستدلال والتدريب الدقيق.",
|
||||
@@ -59,9 +57,9 @@
|
||||
"GLM-4.5.description": "GLM-4.5: نموذج عالي الأداء للمنطق، البرمجة، ومهام الوكلاء.",
|
||||
"GLM-4.6.description": "GLM-4.6: نموذج الجيل السابق.",
|
||||
"GLM-4.7.description": "GLM-4.7 هو النموذج الرائد الأحدث من Zhipu، معزز لسيناريوهات البرمجة الوكيلية مع تحسين قدرات البرمجة، تخطيط المهام طويلة الأمد، والتعاون مع الأدوات.",
|
||||
"GLM-5-Turbo.description": "GLM-5-Turbo هو نموذج أساس مُحسَّن بعمق لسيناريوهات الوكلاء. تم تحسينه خصيصاً لتلبية المتطلبات الأساسية لمهام الوكلاء منذ مرحلة التدريب، مما يعزز القدرات الأساسية مثل استدعاء الأدوات، تنفيذ الأوامر، وسلاسل التنفيذ الطويلة. وهو مثالي لبناء مساعدين ذكيين عاليي الأداء.",
|
||||
"GLM-5-Turbo.description": "GLM-5-Turbo: إصدار محسن من GLM-5 مع استدلال أسرع لمهام البرمجة.",
|
||||
"GLM-5.1.description": "GLM-5.1 هو أحدث نموذج رائد من Zhipu، وهو نسخة محسّنة من GLM-5 مع قدرات هندسية وكيلة محسّنة لأنظمة الهندسة المعقدة والمهام طويلة الأمد.",
|
||||
"GLM-5.description": "GLM-5 هو نموذج الجيل القادم الأساسي من شركة Zhipu، مصمّم خصيصاً لهندسة الوكلاء. يقدّم إنتاجية موثوقة في هندسة الأنظمة المعقدة ومهام الوكلاء طويلة الأمد. في قدرات البرمجة والوكلاء، يحقق GLM-5 أداءً رائداً بين النماذج مفتوحة المصدر. وفي سيناريوهات البرمجة الواقعية، يقترب في تجربة المستخدم من Claude Opus 4.5. يتفوق في هندسة الأنظمة المعقدة ومهام الوكلاء طويلة المدى، مما يجعله نموذجاً أساسياً مثالياً للمساعدين العامين.",
|
||||
"GLM-5.description": "GLM-5 هو نموذج الأساس الرائد من الجيل التالي لـ Zhipu، مصمم خصيصًا للهندسة الوكيلية. يوفر إنتاجية موثوقة في هندسة الأنظمة المعقدة ومهام الوكلاء طويلة الأمد. في قدرات البرمجة والوكلاء، يحقق GLM-5 أداءً رائدًا بين النماذج مفتوحة المصدر.",
|
||||
"Gryphe/MythoMax-L2-13b.description": "MythoMax-L2 (13B) هو نموذج مبتكر لمجالات متنوعة ومهام معقدة.",
|
||||
"HY-Image-V3.0.description": "قدرات قوية لاستخراج الميزات من الصور الأصلية والحفاظ على التفاصيل، مما يوفر نسيجًا بصريًا أكثر ثراءً وينتج صورًا عالية الدقة ومتقنة ومناسبة للإنتاج.",
|
||||
"HelloMeme.description": "HelloMeme هي أداة ذكاء اصطناعي لإنشاء الميمات، الصور المتحركة (GIFs)، أو مقاطع الفيديو القصيرة من الصور أو الحركات التي تقدمها. لا تتطلب مهارات رسم أو برمجة—فقط صورة مرجعية—لإنتاج محتوى ممتع وجذاب ومتناسق من حيث الأسلوب.",
|
||||
@@ -74,11 +72,6 @@
|
||||
"InstantCharacter.description": "InstantCharacter هو نموذج توليد شخصيات مخصص بدون ضبط من Tencent AI لعام 2025، يهدف إلى توليد شخصيات عالية الدقة ومتسقة عبر السيناريوهات. يمكنه نمذجة شخصية من صورة مرجعية واحدة ونقلها بمرونة عبر الأساليب، الحركات، والخلفيات.",
|
||||
"InternVL2-8B.description": "InternVL2-8B هو نموذج رؤية-لغة قوي يدعم معالجة الصور والنصوص متعددة الوسائط، يتعرف بدقة على محتوى الصور ويولد أوصافًا أو إجابات ذات صلة.",
|
||||
"InternVL2.5-26B.description": "InternVL2.5-26B هو نموذج رؤية-لغة قوي يدعم معالجة الصور والنصوص متعددة الوسائط، يتعرف بدقة على محتوى الصور ويولد أوصافًا أو إجابات ذات صلة.",
|
||||
"KAT-Coder-Air-V1.description": "إصدار خفيف الوزن ضمن سلسلة KAT-Coder. مصمم خصيصاً للبرمجة عبر الوكلاء، ويغطي بشكل شامل مهام البرمجة وسيناريوهاتها. وبالاعتماد على التعلم المعزز واسع النطاق القائم على الوكلاء، يتيح ظهور سلوكيات ذكية ويتفوق بشكل كبير على النماذج المماثلة في أداء البرمجة.",
|
||||
"KAT-Coder-Exp-72B-1010.description": "يعد KAT-Coder-Exp-72B الإصدار التجريبي المعتمد على الابتكار بالتعلم المعزز في سلسلة KAT-Coder، وقد حقق أداءً مذهلاً بنسبة 74.6٪ على معيار SWE-Bench Verified، مسجلاً رقماً قياسياً جديداً للنماذج مفتوحة المصدر. وهو يركز على البرمجة عبر الوكلاء ويدعم حالياً فقط هيكل SWE-Agent، لكنه قابل أيضاً للاستخدام في المحادثات البسيطة.",
|
||||
"KAT-Coder-Pro-V1.description": "مصمم للبرمجة عبر الوكلاء، يغطي بشكل شامل مهام البرمجة وسيناريوهاتها، ويحقق سلوكاً ذكياً ناشئاً عبر التعلم المعزز واسع النطاق، متفوقاً بشكل كبير على النماذج المشابهة في أداء كتابة الأكواد.",
|
||||
"KAT-Coder-Pro-V2.description": "أحدث نموذج عالي الأداء من فريق Kwaipilot لدى Kuaishou، مصمم للمشاريع المؤسسية المعقدة وتكامل SaaS. يتفوق في سيناريوهات البرمجة، ويتوافق مع مختلف أطر الوكلاء (Claude Code، OpenCode، KiloCode)، ويدعم OpenClaw أصلياً، ومُحسَّن خصيصاً لجماليات واجهات الويب الأمامية.",
|
||||
"Kimi-K2.5.description": "Kimi K2.5 هو أقوى نموذج من سلسلة Kimi، ويقدم أداءً متقدماً مفتوح المصدر في مهام الوكلاء والبرمجة وفهم الرؤية. يدعم الإدخال متعدد الوسائط ووضعَي التفكير وغير التفكير.",
|
||||
"Kolors.description": "Kolors هو نموذج تحويل نص إلى صورة طوره فريق Kolors في Kuaishou. مدرب على مليارات المعاملات، يتميز بجودة بصرية عالية، فهم دلالي قوي للغة الصينية، وقدرات متميزة في عرض النصوص.",
|
||||
"Kwai-Kolors/Kolors.description": "Kolors هو نموذج تحويل نص إلى صورة واسع النطاق من فريق Kolors في Kuaishou. مدرب على مليارات أزواج النصوص والصور، يتفوق في الجودة البصرية، الدقة الدلالية المعقدة، وعرض النصوص الصينية/الإنجليزية، مع فهم وتوليد قويين للمحتوى الصيني.",
|
||||
"Kwaipilot/KAT-Dev.description": "KAT-Dev (32B) هو نموذج مفتوح المصدر لمهام هندسة البرمجيات. يحقق معدل حل 62.4% على SWE-Bench Verified، ويحتل المرتبة الخامسة بين النماذج المفتوحة. تم تحسينه عبر التدريب الوسيط، SFT، وRL لإكمال الشيفرة، إصلاح الأخطاء، ومراجعة الشيفرة.",
|
||||
@@ -97,18 +90,18 @@
|
||||
"Meta-Llama-3.2-3B-Instruct.description": "نموذج لغة صغير متطور يتمتع بفهم لغوي قوي، استدلال ممتاز، وتوليد نصوص عالي الجودة.",
|
||||
"Meta-Llama-3.3-70B-Instruct.description": "Llama 3.3 هو النموذج مفتوح المصدر متعدد اللغات الأكثر تقدمًا من Llama، يقدم أداءً قريبًا من نموذج 405B بتكلفة منخفضة جدًا. يعتمد على بنية Transformer ومحسن باستخدام SFT وRLHF لتحقيق الفائدة والسلامة. النسخة المضبوطة على التعليمات محسنّة للمحادثة متعددة اللغات وتتفوّق على العديد من النماذج المفتوحة والمغلقة في معايير الصناعة. تاريخ التحديث المعرفي: ديسمبر 2023.",
|
||||
"Meta-Llama-4-Maverick-17B-128E-Instruct-FP8.description": "Llama 4 Maverick هو نموذج MoE كبير مع تفعيل خبراء فعال لأداء استدلال قوي.",
|
||||
"MiMo-V2-Pro.description": "MiMo-V2-Pro مصمم خصيصاً لتدفقات عمل الوكلاء عالية الكثافة في السيناريوهات الواقعية. يحتوي على أكثر من تريليون معلمة إجمالية (42 مليار معلمة مفعلة)، ويعتمد بنية انتباه هجينة مبتكرة، ويدعم طول سياق هائل يصل إلى مليون رمز. يعتمد على نموذج أساس قوي، ونواصل توسيع الموارد الحاسوبية عبر نطاق أوسع من سيناريوهات الوكلاء، مما يوسع فضاء الحركة للذكاء ويحقق تعميماً كبيراً — من البرمجة إلى تنفيذ المهام الواقعية (\"claw\").",
|
||||
"MiniMax-Hailuo-02.description": "تم إصدار نموذج إنشاء الفيديو من الجيل التالي، MiniMax Hailuo 02، رسميًا، ويدعم دقة 1080P وإنشاء فيديو لمدة 10 ثوانٍ.",
|
||||
"MiniMax-Hailuo-2.3-Fast.description": "نموذج جديد لإنشاء الفيديو مع تحسينات شاملة في حركة الجسم، والواقعية الفيزيائية، واتباع التعليمات.",
|
||||
"MiniMax-Hailuo-2.3.description": "نموذج جديد لإنشاء الفيديو مع تحسينات شاملة في حركة الجسم، والواقعية الفيزيائية، واتباع التعليمات.",
|
||||
"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-highspeed.description": "MiniMax M2.5 Highspeed: نفس أداء M2.5 مع استدلال أسرع.",
|
||||
"MiniMax-M2.5.description": "أداء من الدرجة الأولى وفعالية تكلفة قصوى، يتعامل بسهولة مع المهام المعقدة (تقريباً 60 tps).",
|
||||
"MiniMax-M2.7-highspeed.description": "MiniMax M2.7 Highspeed: نفس أداء M2.7 مع استدلال أسرع بشكل ملحوظ.",
|
||||
"MiniMax-M2.7.description": "أول نموذج ذاتي التطور يتميز بأداء رائد في البرمجة والمهام عبر الوكلاء (~60 رمزاً في الثانية).",
|
||||
"MiniMax-M2.7.description": "MiniMax M2.7: بداية رحلة التحسين الذاتي التكراري، قدرات هندسية واقعية رائدة.",
|
||||
"MiniMax-M2.description": "MiniMax M2: نموذج الجيل السابق.",
|
||||
"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 مليار نشطة لكل رمز. يدعم سياق 1 مليون بشكل طبيعي ويستخدم Flash Attention لتقليل FLOPs بنسبة 75% على توليد 100 ألف رمز مقارنة بـ DeepSeek R1. مع بنية MoE بالإضافة إلى CISPO وتدريب RL الهجين، يحقق أداءً رائدًا في الاستدلال طويل المدخلات ومهام الهندسة البرمجية الواقعية.",
|
||||
@@ -136,7 +129,6 @@
|
||||
"Pro/moonshotai/Kimi-K2-Instruct-0905.description": "Kimi K2-Instruct-0905 هو أحدث وأقوى إصدار من Kimi K2. إنه نموذج MoE من الدرجة الأولى يحتوي على إجمالي 1 تريليون و32 مليار معلمة نشطة. من أبرز ميزاته الذكاء البرمجي القوي مع تحسينات كبيرة في المعايير ومهام الوكلاء الواقعية، بالإضافة إلى تحسينات في جمالية واجهة الشيفرة وسهولة الاستخدام.",
|
||||
"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-5.1.description": "GLM-5.1 هو نموذج الجيل التالي الرائد المصمم لهندسة الوكلاء، ويستخدم بنية خبراء مختلطة (MoE) بـ 754 مليار معلمة. يعزز قدرات البرمجة بشكل كبير، محققاً نتائج متقدمة على SWE-Bench Pro، ويتفوق بوضوح على سابقه في مقاييس مثل NL2Repo وTerminal-Bench 2.0. مصمم لمهام الوكلاء طويلة الأمد، ويتعامل مع الأسئلة الغامضة بشكل أدق، ويحلل المهام المعقدة، وينفذ التجارب، ويفحص النتائج، ويواصل التحسين عبر مئات الدورات وآلاف استدعاءات الأدوات.",
|
||||
"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، يركز على هندسة الأنظمة المعقدة ومهام الوكيل طويلة المدة. تم توسيع معلمات النموذج إلى 744 مليار (40 مليار نشطة) وتدمج DeepSeek Sparse Attention.",
|
||||
"QwQ-32B-Preview.description": "Qwen QwQ هو نموذج بحث تجريبي يركز على تحسين الاستدلال.",
|
||||
@@ -197,7 +189,6 @@
|
||||
"Qwen3-235B-A22B-Instruct-2507-FP8.description": "Qwen3 235B A22B Instruct 2507 مُحسَّن للاستدلال المتقدم واتباع التعليمات، ويستخدم بنية MoE للحفاظ على كفاءة الاستدلال على نطاق واسع.",
|
||||
"Qwen3-235B.description": "Qwen3-235B-A22B هو نموذج MoE يُقدِّم وضع استدلال هجين، يتيح للمستخدمين التبديل بسلاسة بين التفكير وعدم التفكير. يدعم الفهم والاستدلال عبر 119 لغة ولهجة، ويتمتع بقدرات قوية على استدعاء الأدوات، ويتنافس مع نماذج رائدة مثل DeepSeek R1 وOpenAI o1 وo3-mini وGrok 3 وGoogle Gemini 2.5 Pro في اختبارات القدرات العامة، والبرمجة والرياضيات، والقدرات متعددة اللغات، واستدلال المعرفة.",
|
||||
"Qwen3-32B.description": "Qwen3-32B هو نموذج كثيف يُقدِّم وضع استدلال هجين، يتيح للمستخدمين التبديل بين التفكير وعدم التفكير. بفضل تحسينات في البنية، وبيانات أكثر، وتدريب أفضل، يقدم أداءً مماثلًا لـ Qwen2.5-72B.",
|
||||
"Qwen3.5-Plus.description": "يدعم Qwen3.5 Plus إدخال النصوص والصور والفيديو. أداؤه في المهام النصية البحتة مماثل لـ Qwen3 Max، مع أداء أفضل وتكلفة أقل. وقد تحسّنت قدراته متعددة الوسائط بشكل ملحوظ مقارنة بسلسلة Qwen3 VL.",
|
||||
"S2V-01.description": "النموذج الأساسي لتحويل المرجع إلى فيديو من سلسلة 01.",
|
||||
"SenseChat-128K.description": "الإصدار الرابع الأساسي مع سياق 128 ألف رمز، قوي في فهم وتوليد النصوص الطويلة.",
|
||||
"SenseChat-32K.description": "الإصدار الرابع الأساسي مع سياق 32 ألف رمز، مرن لمجموعة متنوعة من السيناريوهات.",
|
||||
@@ -319,20 +310,20 @@
|
||||
"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-haiku-4-5-20251001.description": "Claude Haiku 4.5 هو النموذج الأسرع والأكثر ذكاءً من Anthropic، يتميز بسرعة البرق وقدرات تفكير ممتدة.",
|
||||
"claude-haiku-4.5.description": "Claude Haiku 4.5 هو نموذج Haiku الأسرع والأذكى من Anthropic، يتميز بسرعة البرق وقدرات استدلال موسعة.",
|
||||
"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-opus-4-6.description": "Claude Opus 4.6 هو النموذج الأكثر ذكاءً من Anthropic لبناء الوكلاء والبرمجة.",
|
||||
"claude-opus-4.5.description": "Claude Opus 4.5 هو النموذج الرائد من Anthropic، يجمع بين الذكاء الفائق والأداء القابل للتوسع لمهام الاستدلال المعقدة وعالية الجودة.",
|
||||
"claude-opus-4.6-fast.description": "Claude Opus 4.6 هو النموذج الأكثر ذكاءً من 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-6.description": "Claude Sonnet 4.6 يقدم أفضل مزيج بين السرعة والذكاء من 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.5.description": "Claude Sonnet 4.5 هو النموذج الأكثر ذكاءً من Anthropic حتى الآن.",
|
||||
"claude-sonnet-4.6.description": "Claude Sonnet 4.6 هو أفضل مزيج من السرعة والذكاء من Anthropic.",
|
||||
"claude-sonnet-4.description": "Claude Sonnet 4 يمكنه إنتاج استجابات شبه فورية أو استدلال خطوة بخطوة ممتد يمكن للمستخدمين رؤيته. يمكن لمستخدمي API التحكم بدقة في مدة تفكير النموذج.",
|
||||
@@ -406,7 +397,7 @@
|
||||
"deepseek-ai/deepseek-v3.1-terminus.description": "DeepSeek V3.1 هو نموذج تفكير من الجيل التالي يتمتع بقدرات أقوى في التفكير المعقد وسلسلة التفكير لمهام التحليل العميق.",
|
||||
"deepseek-ai/deepseek-v3.1.description": "DeepSeek V3.1 هو نموذج تفكير من الجيل التالي يتمتع بقدرات أقوى في التفكير المعقد وسلسلة التفكير لمهام التحليل العميق.",
|
||||
"deepseek-ai/deepseek-v3.2.description": "DeepSeek V3.2 هو نموذج استدلال من الجيل التالي يتميز بقدرات استدلال معقدة وسلسلة التفكير.",
|
||||
"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.",
|
||||
@@ -429,7 +420,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 مليار معلمة يتميز بقوة في البرمجة، والقدرات التقنية، وفهم السياق، والتعامل مع النصوص الطويلة.",
|
||||
@@ -532,7 +523,8 @@
|
||||
"ernie-x1-turbo-32k.description": "ERNIE X1 Turbo 32K هو نموذج تفكير سريع بسياق 32K للاستدلال المعقد والدردشة متعددة الأدوار.",
|
||||
"ernie-x1.1-preview.description": "معاينة ERNIE X1.1 هو نموذج تفكير مخصص للتقييم والاختبار.",
|
||||
"ernie-x1.1.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، الذي تم تطويره بواسطة فريق ByteDance Seed، يدعم تحرير الصور المتعددة والتكوين. يتميز باتساق الموضوع المحسن، واتباع التعليمات بدقة، وفهم المنطق المكاني، والتعبير الجمالي، وتخطيط الملصقات وتصميم الشعارات مع تقديم نصوص وصور عالية الدقة.",
|
||||
"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] هو نموذج لتوليد الصور يتميز بميول جمالية نحو صور أكثر واقعية وطبيعية.",
|
||||
@@ -540,15 +532,17 @@
|
||||
"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-dev.description": "FLUX.1 [dev] هو نموذج مفتوح الأوزان ومقطر للاستخدام غير التجاري. يحافظ على جودة صور قريبة من المستوى الاحترافي واتباع التعليمات مع كفاءة تشغيل أعلى مقارنة بالنماذج القياسية من نفس الحجم.",
|
||||
"flux-kontext-max.description": "توليد وتحرير صور سياقية متقدمة، تجمع بين النصوص والصور لتحقيق نتائج دقيقة ومتسقة.",
|
||||
"flux-kontext-pro.description": "توليد وتحرير صور سياقية متقدمة، تجمع بين النصوص والصور لتحقيق نتائج دقيقة ومتسقة.",
|
||||
"flux-merged.description": "FLUX.1 [merged] يجمع بين الميزات العميقة المستكشفة في \"DEV\" مع مزايا السرعة العالية لـ \"Schnell\"، مما يوسع حدود الأداء ويوسع التطبيقات.",
|
||||
"flux-pro-1.1-ultra.description": "توليد صور بدقة فائقة تصل إلى 4 ميغابكسل، تنتج صورًا واضحة في غضون 10 ثوانٍ.",
|
||||
"flux-pro-1.1.description": "نموذج توليد صور احترافي مطور يتميز بجودة صور ممتازة واتباع دقيق للأوامر.",
|
||||
"flux-pro.description": "نموذج توليد صور تجاري من الدرجة الأولى بجودة صور لا مثيل لها ومخرجات متنوعة.",
|
||||
"flux-schnell.description": "FLUX.1 [schnell] هو أكثر النماذج مفتوحة المصدر تقدمًا في توليد الصور بعدد خطوات قليلة، يتفوق على المنافسين المماثلين وحتى النماذج غير المقطرة القوية مثل Midjourney v6.0 و DALL-E 3 (HD). تم ضبطه بدقة للحفاظ على تنوع ما قبل التدريب، مما يحسن بشكل كبير من جودة الصور، واتباع التعليمات، وتنوع الحجم/النسبة، والتعامل مع الخطوط، وتنوع المخرجات.",
|
||||
"flux.1-schnell.description": "FLUX.1-schnell هو نموذج عالي الأداء لتوليد الصور يدعم أنماطًا متعددة بسرعة.",
|
||||
"gemini-1.0-pro-001.description": "Gemini 1.0 Pro 001 (Tuning) يوفر أداءً مستقرًا وقابلًا للضبط للمهام المعقدة.",
|
||||
"gemini-1.0-pro-002.description": "Gemini 1.0 Pro 002 (Tuning) يوفر دعمًا متعدد الوسائط قويًا للمهام المعقدة.",
|
||||
@@ -581,10 +575,10 @@
|
||||
"gemini-2.5-pro.description": "Gemini 2.5 Pro هو النموذج الرائد من Google في مجال الاستدلال، يدعم السياق الطويل للمهام المعقدة.",
|
||||
"gemini-3-flash-preview.description": "Gemini 3 Flash هو أذكى نموذج تم تصميمه للسرعة، يجمع بين الذكاء المتقدم وأساس بحث ممتاز.",
|
||||
"gemini-3-pro-image-preview.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-image-preview:image.description": "Gemini 3 Pro Image (Nano Banana Pro) هو نموذج إنشاء الصور من Google ويدعم أيضًا الدردشة متعددة الوسائط.",
|
||||
"gemini-3-pro-preview.description": "Gemini 3 Pro هو أقوى نموذج من Google للوكيل الذكي والبرمجة الإبداعية، يقدم تفاعلاً أعمق وصورًا أغنى مع استدلال متقدم.",
|
||||
"gemini-3.1-flash-image-preview.description": "Gemini 3.1 Flash Image (Nano Banana 2) يقدم جودة صور احترافية بسرعة فائقة مع دعم الدردشة متعددة الوسائط.",
|
||||
"gemini-3.1-flash-image-preview:image.description": "Gemini 3.1 Flash Image (Nano Banana 2) هو أسرع نموذج توليد صور أصلي من Google مع دعم التفكير، وتوليد الصور التفاعلي، والتحرير.",
|
||||
"gemini-3.1-flash-image-preview:image.description": "Gemini 3.1 Flash Image (Nano Banana 2) يقدم جودة صور بمستوى احترافي بسرعة Flash مع دعم الدردشة متعددة الوسائط.",
|
||||
"gemini-3.1-flash-lite-preview.description": "Gemini 3.1 Flash-Lite Preview هو النموذج الأكثر كفاءة من حيث التكلفة من Google، مُحسّن للمهام الوكيلة ذات الحجم الكبير، الترجمة، ومعالجة البيانات.",
|
||||
"gemini-3.1-pro-preview.description": "Gemini 3.1 Pro Preview يحسن من Gemini 3 Pro مع قدرات استدلال محسّنة ويضيف دعم مستوى التفكير المتوسط.",
|
||||
"gemini-flash-latest.description": "أحدث إصدار من Gemini Flash",
|
||||
@@ -812,6 +806,7 @@
|
||||
"jamba-large.description": "أقوى وأحدث نماذجنا، مصمم للمهام المؤسسية المعقدة بأداء متميز.",
|
||||
"jamba-mini.description": "أكثر النماذج كفاءة في فئته، يوازن بين السرعة والجودة مع استهلاك منخفض للموارد.",
|
||||
"jina-deepsearch-v1.description": "DeepSearch يجمع بين البحث عبر الإنترنت، والقراءة، والاستدلال لإجراء تحقيقات شاملة. فكر فيه كوكيل يأخذ مهمة البحث الخاصة بك، ويجري عمليات بحث واسعة متعددة المراحل، ثم يقدم إجابة. تتضمن العملية بحثًا مستمرًا، واستدلالًا، وحلًا متعدد الزوايا للمشكلات، وهو مختلف جوهريًا عن نماذج LLM التقليدية التي تعتمد على بيانات التدريب المسبق أو أنظمة RAG التقليدية التي تعتمد على بحث سطحي لمرة واحدة.",
|
||||
"k2p5.description": "Kimi K2.5 هو النموذج الأكثر تنوعًا لـ Kimi حتى الآن، يتميز بهيكل متعدد الوسائط يدعم إدخال الرؤية والنصوص، أوضاع 'التفكير' و'غير التفكير'، بالإضافة إلى المهام الحوارية والوكيلة.",
|
||||
"kimi-k2-0711-preview.description": "kimi-k2 هو نموذج MoE أساسي يتمتع بقدرات قوية في البرمجة والوكالة (1 تريليون معلمة إجمالية، 32 مليار نشطة)، ويتفوق على النماذج المفتوحة السائدة في اختبارات الاستدلال، البرمجة، الرياضيات، والوكالة.",
|
||||
"kimi-k2-0905-preview.description": "kimi-k2-0905-preview يوفر نافذة سياق 256k، برمجة وكيلة أقوى، جودة أفضل لرموز الواجهة الأمامية، وفهم سياقي محسن.",
|
||||
"kimi-k2-instruct.description": "Kimi K2 Instruct هو النموذج الرسمي للاستدلال من Kimi مع سياق طويل للبرمجة، الأسئلة والأجوبة، والمزيد.",
|
||||
@@ -821,13 +816,8 @@
|
||||
"kimi-k2.5.description": "Kimi K2.5 هو النموذج الأكثر تنوعًا من Kimi حتى الآن، يتميز ببنية متعددة الوسائط تدعم المدخلات البصرية والنصية، أوضاع \"التفكير\" و\"غير التفكير\"، ومهام المحادثة والوكلاء.",
|
||||
"kimi-k2.description": "Kimi-K2 هو نموذج MoE أساسي من Moonshot AI يتمتع بقدرات قوية في البرمجة والوكالة، بإجمالي 1 تريليون معلمة و32 مليار نشطة. يتفوق على النماذج المفتوحة السائدة في اختبارات الاستدلال العام، البرمجة، الرياضيات، ومهام الوكالة.",
|
||||
"kimi-k2:1t.description": "Kimi K2 هو نموذج LLM كبير من نوع MoE من Moonshot AI بإجمالي 1 تريليون معلمة و32 مليار نشطة لكل تمرير أمامي. مُحسّن لقدرات الوكالة بما في ذلك استخدام الأدوات المتقدمة، الاستدلال، وتوليد الشيفرة.",
|
||||
"kling/kling-v3-image-generation.description": "يدعم ما يصل إلى 10 صور مرجعية، مما يتيح لك تثبيت الموضوعات والعناصر ونغمات الألوان لضمان نمط متسق. يجمع بين نقل النمط، الإشارة إلى الصور الشخصية/الشخصيات، دمج الصور المتعددة، والتلوين المحلي للتحكم المرن. يقدم تفاصيل واقعية للصور الشخصية، مع مرئيات عامة دقيقة وغنية بالطبقات، تتميز بألوان وأجواء سينمائية.",
|
||||
"kling/kling-v3-omni-image-generation.description": "افتح مرئيات سرد القصص السينمائية مع توليد الصور الجديدة وإخراج مباشر بدقة 2K/4K. يحلل بعمق العناصر السمعية والبصرية في التعليمات لتنفيذ الإبداع بدقة. يدعم إدخالات مرجعية متعددة مرنة وترقيات جودة شاملة، مثالي للقصص المصورة، فن المفاهيم السردية، وتصميم المشاهد.",
|
||||
"kling/kling-v3-omni-video-generation.description": "ميزة جديدة \"المرجع الشامل\" تدعم مقاطع فيديو من 3 إلى 8 ثوانٍ أو صور متعددة لتثبيت عناصر الشخصيات. يمكنها مطابقة الصوت الأصلي وحركات الشفاه لتمثيل الشخصيات بشكل أصيل. تعزز اتساق الفيديو والتعبير الديناميكي. تدعم التزامن السمعي البصري والتخطيط الذكي للقصص.",
|
||||
"kling/kling-v3-video-generation.description": "التخطيط الذكي للقصص يفهم انتقالات المشاهد داخل النصوص، ويرتب تلقائيًا مواقع الكاميرا وأنواع اللقطات. إطار متعدد الوسائط أصلي يضمن التناسق السمعي البصري. يزيل قيود المدة، مما يتيح سرد القصص متعدد اللقطات بشكل أكثر مرونة.",
|
||||
"kuaishou/kat-coder-pro-v1.description": "KAT-Coder-Pro-V1 (مجاني لفترة محدودة) يركز على فهم الشيفرة والأتمتة لوكلاء البرمجة الفعالة.",
|
||||
"labs-devstral-small-2512.description": "Devstral Small 2 يتفوق في استخدام الأدوات لاستكشاف قواعد الأكواد، وتحرير ملفات متعددة، وتشغيل وكلاء هندسة البرمجيات.",
|
||||
"labs-leanstral-2603.description": "أول وكيل كود مفتوح المصدر من Mistral مصمم لـ Lean 4، مبني للهندسة الإثباتية الرسمية في المستودعات الواقعية. 119 مليار معلمة مع 6.5 مليار نشطة.",
|
||||
"lite.description": "Spark Lite هو نموذج LLM خفيف الوزن بزمن استجابة منخفض للغاية ومعالجة فعالة. مجاني بالكامل ويدعم البحث الفوري عبر الإنترنت. يقدم استجابات سريعة ويعمل جيدًا على الأجهزة منخفضة القدرة ولتخصيص النماذج، مما يوفر كفاءة تكلفة عالية وتجربة ذكية، خاصة في سيناريوهات الأسئلة المعرفية، توليد المحتوى، والبحث.",
|
||||
"llama-3.1-70b-versatile.description": "Llama 3.1 70B يقدم استدلالًا أقوى للذكاء الاصطناعي لتطبيقات معقدة، ويدعم الحوسبة الثقيلة بكفاءة ودقة عالية.",
|
||||
"llama-3.1-8b-instant.description": "Llama 3.1 8B هو نموذج عالي الكفاءة لتوليد النصوص بسرعة، مثالي للتطبيقات واسعة النطاق وذات التكلفة المنخفضة.",
|
||||
@@ -851,7 +841,6 @@
|
||||
"llava.description": "LLaVA هو نموذج متعدد الوسائط يجمع بين مشفر بصري ونموذج Vicuna لفهم قوي بين الرؤية واللغة.",
|
||||
"llava:13b.description": "LLaVA هو نموذج متعدد الوسائط يجمع بين مشفر بصري ونموذج Vicuna لفهم قوي بين الرؤية واللغة.",
|
||||
"llava:34b.description": "LLaVA هو نموذج متعدد الوسائط يجمع بين مشفر بصري ونموذج Vicuna لفهم قوي بين الرؤية واللغة.",
|
||||
"magistral-medium-2509.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 معالجة لسياقات طويلة مع فهم أعمق للسياق واستدلال منطقي قوي، ويدعم مدخلات تصل إلى 32 ألف رمز لقراءة المستندات الطويلة والإجابة على الأسئلة المعتمدة على المعرفة الخاصة.",
|
||||
@@ -940,25 +929,15 @@
|
||||
"minimax/minimax-m2.1.description": "MiniMax-M2.1 هو نموذج لغوي كبير وخفيف الوزن ومتطور، مُحسّن للبرمجة وسير عمل الوكلاء وتطوير التطبيقات الحديثة، ويقدم مخرجات أنظف وأكثر إيجازًا واستجابة أسرع.",
|
||||
"minimax/minimax-m2.description": "MiniMax-M2 هو نموذج عالي القيمة يتميز في مهام البرمجة والوكلاء في العديد من سيناريوهات الهندسة.",
|
||||
"minimaxai/minimax-m2.5.description": "MiniMax-M2.5 هو أحدث نموذج لغة كبير من MiniMax، يتميز ببنية Mixture-of-Experts (MoE) مع إجمالي 229 مليار معلمة. يحقق أداءً رائدًا في الصناعة في البرمجة، استدعاء أدوات الوكيل، مهام البحث، وسيناريوهات المكتب.",
|
||||
"ministral-3:14b.description": "Ministral 3 14B هو أكبر نموذج في سلسلة Ministral 3، يقدم أداءً متقدمًا مماثلًا لنظيره الأكبر Mistral Small 3.2 24B. مُحسن للنشر المحلي، يقدم أداءً عاليًا على مختلف الأجهزة بما في ذلك الإعدادات المحلية.",
|
||||
"ministral-3:3b.description": "Ministral 3 3B هو أصغر وأكفأ نموذج في سلسلة Ministral 3، يقدم قدرات قوية في اللغة والرؤية في حزمة مدمجة. مصمم للنشر على الحافة، يقدم أداءً عاليًا على مختلف الأجهزة بما في ذلك الإعدادات المحلية.",
|
||||
"ministral-3:8b.description": "Ministral 3 8B هو نموذج قوي وفعال في سلسلة Ministral 3، يقدم قدرات نصية ورؤية من الدرجة الأولى. مُصمم للنشر على الحافة، يقدم أداءً عاليًا على مختلف الأجهزة بما في ذلك الإعدادات المحلية.",
|
||||
"ministral-3b-latest.description": "Ministral 3B هو النموذج الرائد من Mistral للأجهزة الطرفية.",
|
||||
"ministral-8b-latest.description": "Ministral 8B هو نموذج فعال من حيث التكلفة من Mistral للأجهزة الطرفية.",
|
||||
"mistral-ai/Mistral-Large-2411.description": "النموذج الرئيسي من Mistral للمهام المعقدة التي تتطلب استدلالًا واسع النطاق أو تخصصًا (توليد نصوص اصطناعية، توليد كود، استرجاع معلومات، أو وكلاء).",
|
||||
"mistral-ai/Mistral-Nemo.description": "Mistral Nemo هو نموذج لغوي متقدم يتميز بأحدث تقنيات الاستدلال والمعرفة العالمية والبرمجة بالنسبة لحجمه.",
|
||||
"mistral-ai/mistral-small-2503.description": "Mistral Small مناسب لأي مهمة لغوية تتطلب كفاءة عالية وزمن استجابة منخفض.",
|
||||
"mistral-large-2411.description": "Mistral Large هو النموذج الرئيسي، قوي في المهام متعددة اللغات، التفكير المعقد، وتوليد الكود—مثالي للتطبيقات المتقدمة.",
|
||||
"mistral-large-2512.description": "Mistral Large 3، هو نموذج متعدد الوسائط مفتوح الوزن ومتقدم مع بنية دقيقة لمزيج الخبراء. يتميز بـ 41 مليار معلمة نشطة و675 مليار معلمة إجمالية.",
|
||||
"mistral-large-3:675b.description": "Mistral Large 3 هو نموذج متعدد الوسائط مفتوح الوزن ومتقدم مع بنية مزيج الخبراء المكررة. يحتوي على 41 مليار معلمة نشطة و675 مليار معلمة إجمالية.",
|
||||
"mistral-large-instruct.description": "Mistral-Large-Instruct-2407 هو نموذج لغوي كثيف متقدم يحتوي على 123 مليار معامل، يتميز بأحدث تقنيات الاستدلال والمعرفة والبرمجة.",
|
||||
"mistral-large-latest.description": "Mistral Large هو النموذج الرئيسي، يتفوق في المهام متعددة اللغات، التفكير المعقد، وتوليد الكود للتطبيقات المتقدمة.",
|
||||
"mistral-large.description": "Mixtral Large هو النموذج الرئيسي من Mistral، يجمع بين توليد الكود، والرياضيات، والاستدلال مع نافذة سياق 128K.",
|
||||
"mistral-medium-2508.description": "Mistral Medium 3.1 يقدم أداءً متقدمًا بتكلفة أقل بـ 8 مرات ويُبسط نشر المؤسسات.",
|
||||
"mistral-nemo-instruct.description": "Mistral-Nemo-Instruct-2407 هو الإصدار الموجه بالتعليمات من Mistral-Nemo-Base-2407.",
|
||||
"mistral-nemo.description": "Mistral Nemo هو نموذج فعال يحتوي على 12 مليار معامل من Mistral AI وNVIDIA.",
|
||||
"mistral-small-2506.description": "Mistral Small هو خيار اقتصادي وسريع وموثوق للترجمة، التلخيص، وتحليل المشاعر.",
|
||||
"mistral-small-2603.description": "نموذج هجين قوي من Mistral يجمع بين التعليمات، التفكير، وقدرات الترميز في نموذج واحد. 119 مليار معلمة مع 6.5 مليار نشطة.",
|
||||
"mistral-small-latest.description": "Mistral Small هو خيار سريع وموثوق وفعال من حيث التكلفة للترجمة، والتلخيص، وتحليل المشاعر.",
|
||||
"mistral-small.description": "Mistral Small مناسب لأي مهمة لغوية تتطلب كفاءة عالية وزمن استجابة منخفض.",
|
||||
"mistral.description": "Mistral هو نموذج 7B من Mistral AI، مناسب لمهام لغوية متنوعة.",
|
||||
@@ -1004,11 +983,6 @@
|
||||
"moonshotai/kimi-k2.description": "Kimi K2 هو نموذج MoE كبير من Moonshot AI يحتوي على تريليون معلمة إجمالية و32 مليار معلمة نشطة لكل تمرير أمامي، مُحسّن لقدرات الوكلاء بما في ذلك استخدام الأدوات المتقدمة، والتفكير، وتوليد الشيفرة.",
|
||||
"morph/morph-v3-fast.description": "Morph يقدم نموذجًا متخصصًا لتطبيق تغييرات الشيفرة المقترحة من نماذج متقدمة (مثل Claude أو GPT-4o) على ملفاتك الحالية بسرعة تزيد عن 4500 رمز/ثانية. يُعد الخطوة الأخيرة في سير عمل البرمجة بالذكاء الاصطناعي ويدعم 16k من رموز الإدخال/الإخراج.",
|
||||
"morph/morph-v3-large.description": "Morph يقدم نموذجًا متخصصًا لتطبيق تغييرات الشيفرة المقترحة من نماذج متقدمة (مثل Claude أو GPT-4o) على ملفاتك الحالية بسرعة تزيد عن 2500 رمز/ثانية. يُعد الخطوة الأخيرة في سير عمل البرمجة بالذكاء الاصطناعي ويدعم 16k من رموز الإدخال/الإخراج.",
|
||||
"musesteamer-2.0-lite-i2v.description": "مقارنةً بـ Turbo، يقدم أداءً متفوقًا مع فعالية تكلفة ممتازة.",
|
||||
"musesteamer-2.0-pro-i2v.description": "مبني على Turbo، يدعم توليد فيديو ديناميكي بدقة 1080P، يقدم جودة بصرية أعلى وتعبير فيديو معزز.",
|
||||
"musesteamer-2.0-turbo-i2v-audio.description": "يدعم توليد فيديو ديناميكي بدقة 720P لمدة 5 و10 ثوانٍ مع الصوت. يتيح إنشاء صوت وصورة متزامنة متعددة الأشخاص، مع صوت وصورة متزامنة، صور بجودة سينمائية، وحركات كاميرا على مستوى الماستر.",
|
||||
"musesteamer-2.0-turbo-i2v.description": "يدعم توليد فيديو ديناميكي صامت بدقة 720P لمدة 5 ثوانٍ، يتميز بصور بجودة سينمائية، حركات كاميرا معقدة، ومشاعر وأفعال شخصيات واقعية.",
|
||||
"musesteamer-air-i2v.description": "نموذج توليد الفيديو Baidu MuseSteamer Air يقدم أداءً جيدًا في اتساق الموضوع، الواقعية الفيزيائية، تأثيرات حركة الكاميرا، وسرعة التوليد. يدعم توليد فيديو ديناميكي صامت بدقة 720P لمدة 5 ثوانٍ، يقدم صورًا بجودة سينمائية، توليد سريع، وفعالية تكلفة ممتازة.",
|
||||
"musesteamer-air-image.description": "musesteamer-air-image هو نموذج لتوليد الصور تم تطويره بواسطة فريق البحث في Baidu لتقديم أداء استثنائي من حيث التكلفة. يمكنه بسرعة توليد صور واضحة ومتسقة الحركة بناءً على مطالبات المستخدم، مما يحول أوصاف المستخدم بسهولة إلى صور.",
|
||||
"nousresearch/hermes-2-pro-llama-3-8b.description": "Hermes 2 Pro Llama 3 8B هو إصدار محدث من Nous Hermes 2 باستخدام أحدث مجموعات البيانات المطورة داخليًا.",
|
||||
"nvidia/Llama-3.1-Nemotron-70B-Instruct-HF.description": "Llama 3.1 Nemotron 70B هو نموذج LLM مخصص من NVIDIA لتحسين الفائدة. يحقق أداءً قويًا في Arena Hard وAlpacaEval 2 LC وGPT-4-Turbo MT-Bench، ويحتل المرتبة الأولى في جميع معايير المحاذاة التلقائية الثلاثة حتى 1 أكتوبر 2024. تم تدريبه من Llama-3.1-70B-Instruct باستخدام RLHF (REINFORCE)، وLlama-3.1-Nemotron-70B-Reward، ومطالبات HelpSteer2-Preference.",
|
||||
@@ -1078,13 +1052,6 @@
|
||||
"phi3:14b.description": "Phi-3 هو نموذج مفتوح وخفيف من Microsoft للتكامل الفعال والتفكير واسع النطاق.",
|
||||
"pixtral-12b-2409.description": "Pixtral يتميز بفهم الرسوم البيانية/الصور، والإجابة على الأسئلة من المستندات، والتفكير متعدد الوسائط، واتباع التعليمات. يستوعب الصور بدقة ونسبة أبعاد أصلية ويدعم أي عدد من الصور ضمن نافذة سياق 128K.",
|
||||
"pixtral-large-latest.description": "Pixtral Large هو نموذج متعدد الوسائط مفتوح يحتوي على 124 مليار معامل، مبني على Mistral Large 2، الثاني في عائلتنا متعددة الوسائط مع فهم متقدم للصور.",
|
||||
"pixverse/pixverse-v5.6-it2v.description": "قم بتحميل أي صورة لتخصيص القصة، الإيقاع، والنمط بحرية، وتوليد فيديوهات حيوية ومتناسقة. PixVerse V5.6 هو نموذج توليد الفيديو الكبير المطور ذاتيًا من Aishi Technology، يقدم ترقيات شاملة في قدرات النص إلى الفيديو والصورة إلى الفيديو. النموذج يعزز بشكل كبير وضوح الصورة، الاستقرار في الحركة المعقدة، والتزامن السمعي البصري. دقة مزامنة الشفاه والتعبير العاطفي الطبيعي تتحسن في مشاهد الحوار متعددة الشخصيات. يتم تحسين التكوين، الإضاءة، واتساق القوام، مما يرفع جودة التوليد العامة. PixVerse V5.6 يحتل مرتبة عالية عالميًا في قائمة Artificial Analysis للنص إلى الفيديو والصورة إلى الفيديو.",
|
||||
"pixverse/pixverse-v5.6-kf2v.description": "حقق انتقالات سلسة بين أي صورتين، مما يخلق تغييرات مشهد أكثر سلاسة وطبيعية مع تأثيرات بصرية ملفتة. PixVerse V5.6 هو نموذج توليد الفيديو الكبير المطور ذاتيًا من Aishi Technology، يقدم ترقيات شاملة في قدرات النص إلى الفيديو والصورة إلى الفيديو. النموذج يعزز بشكل كبير وضوح الصورة، الاستقرار في الحركة المعقدة، والتزامن السمعي البصري. دقة مزامنة الشفاه والتعبير العاطفي الطبيعي تتحسن في مشاهد الحوار متعددة الشخصيات. يتم تحسين التكوين، الإضاءة، واتساق القوام، مما يرفع جودة التوليد العامة. PixVerse V5.6 يحتل مرتبة عالية عالميًا في قائمة Artificial Analysis للنص إلى الفيديو والصورة إلى الفيديو.",
|
||||
"pixverse/pixverse-v5.6-r2v.description": "قم بإدخال 2–7 صور لدمج مواضيع مختلفة بذكاء مع الحفاظ على نمط موحد وحركة منسقة، مما يسهل بناء مشاهد سردية غنية وتعزيز التحكم في المحتوى والحرية الإبداعية. PixVerse V5.6 هو نموذج توليد الفيديو الكبير المطور ذاتيًا من Aishi Technology، يقدم ترقيات شاملة في قدرات النص إلى الفيديو والصورة إلى الفيديو. النموذج يعزز بشكل كبير وضوح الصورة، الاستقرار في الحركة المعقدة، والتزامن السمعي البصري. دقة مزامنة الشفاه والتعبير العاطفي الطبيعي تتحسن في مشاهد الحوار متعددة الشخصيات. يتم تحسين التكوين، الإضاءة، واتساق القوام، مما يرفع جودة التوليد العامة. PixVerse V5.6 يحتل مرتبة عالية عالميًا في قائمة Artificial Analysis للنص إلى الفيديو والصورة إلى الفيديو.",
|
||||
"pixverse/pixverse-v5.6-t2v.description": "قم بإدخال وصف نصي لتوليد فيديوهات عالية الجودة بسرعة على مستوى الثانية ومواءمة دقيقة للمعاني، مع دعم أنماط متعددة. PixVerse V5.6 هو نموذج توليد الفيديو الكبير المطور ذاتيًا من Aishi Technology، يقدم ترقيات شاملة في قدرات النص إلى الفيديو والصورة إلى الفيديو. النموذج يعزز بشكل كبير وضوح الصورة، الاستقرار في الحركة المعقدة، والتزامن السمعي البصري. دقة مزامنة الشفاه والتعبير العاطفي الطبيعي تتحسن في مشاهد الحوار متعددة الشخصيات. يتم تحسين التكوين، الإضاءة، واتساق القوام، مما يرفع جودة التوليد العامة. PixVerse V5.6 يحتل مرتبة عالية عالميًا في قائمة Artificial Analysis للنص إلى الفيديو والصورة إلى الفيديو.",
|
||||
"pixverse/pixverse-v6-it2v.description": "V6 هو النموذج الجديد من PixVerse الذي تم إطلاقه في نهاية مارس 2026. نموذج it2v (الصورة إلى الفيديو) يحتل المرتبة الثانية عالميًا. بالإضافة إلى قدرات التحكم في التعليمات الخاصة بـ t2v (النص إلى الفيديو)، يمكن لـ it2v إعادة إنتاج الألوان، التشبع، المشاهد، وميزات الشخصيات من الصور المرجعية بدقة، مما يقدم مشاعر شخصيات أقوى وأداء حركة عالي السرعة. يدعم فيديوهات تصل إلى 15 ثانية، إخراج مباشر للموسيقى والفيديو، ولغات متعددة. مثالي لسيناريوهات مثل لقطات المنتجات في التجارة الإلكترونية، العروض الترويجية الإعلانية، ونمذجة C4D المحاكاة لعرض هياكل المنتجات، مع إخراج مباشر بنقرة واحدة.",
|
||||
"pixverse/pixverse-v6-kf2v.description": "V6 هو النموذج الجديد من PixVerse الذي تم إطلاقه في نهاية مارس 2026. نموذج kf2v (الإطار الرئيسي إلى الفيديو) يمكنه ربط أي صورتين بسلاسة، مما ينتج انتقالات فيديو أكثر سلاسة وطبيعية. يدعم فيديوهات تصل إلى 15 ثانية، إخراج مباشر للموسيقى والفيديو، ولغات متعددة.",
|
||||
"pixverse/pixverse-v6-t2v.description": "V6 هو النموذج الجديد من PixVerse الذي تم إطلاقه في نهاية مارس 2026. نموذج t2v (النص إلى الفيديو) يسمح بالتحكم الدقيق في مرئيات الفيديو من خلال التعليمات، مما يعيد إنتاج تقنيات سينمائية متنوعة بدقة. حركات الكاميرا مثل الدفع، السحب، التحريك، الإمالة، التتبع، والمتابعة تكون سلسة وطبيعية، مع تبديل منظور دقيق وقابل للتحكم. يدعم فيديوهات تصل إلى 15 ثانية، إخراج مباشر للموسيقى والفيديو، ولغات متعددة.",
|
||||
"pro-128k.description": "Spark Pro 128K يوفر سعة سياق كبيرة جدًا تصل إلى 128K، مثالي للمستندات الطويلة التي تتطلب تحليل نص كامل وتماسك بعيد المدى، مع منطق سلس ودعم استشهاد متنوع في المناقشات المعقدة.",
|
||||
"pro-deepseek-r1.description": "نموذج خدمة مخصص للمؤسسات مع تزامن مدمج.",
|
||||
"pro-deepseek-v3.description": "نموذج خدمة مخصص للمؤسسات مع تزامن مدمج.",
|
||||
@@ -1248,12 +1215,13 @@
|
||||
"sonar-reasoning.description": "منتج بحث متقدم يعتمد على البحث الموجه لفهم الاستفسارات المعقدة والمتابعة.",
|
||||
"sonar.description": "منتج بحث خفيف الوزن يعتمد على البحث الموجه، أسرع وأقل تكلفة من Sonar Pro.",
|
||||
"sophnet/deepseek-v3.2.description": "DeepSeek V3.2 هو نموذج يوازن بين الكفاءة الحسابية العالية وأداء الاستدلال والوكيل الممتاز.",
|
||||
"sora-2-pro.description": "Sora 2 Pro هو نموذجنا الأكثر تقدمًا لتوليد الوسائط، يولد فيديوهات مع صوت متزامن. يمكنه إنشاء مقاطع غنية بالتفاصيل وديناميكية من اللغة الطبيعية أو الصور.",
|
||||
"sora-2.description": "Sora 2 هو نموذجنا الجديد القوي لتوليد الوسائط، يولد فيديوهات مع صوت متزامن. يمكنه إنشاء مقاطع غنية بالتفاصيل وديناميكية من اللغة الطبيعية أو الصور.",
|
||||
"spark-x.description": "نظرة عامة على قدرات X2: 1. يقدم تعديل ديناميكي لوضع الاستدلال، يتم التحكم فيه عبر الحقل `thinking`. 2. طول سياق موسع: 64K رموز إدخال و128K رموز إخراج. 3. يدعم وظيفة استدعاء الأدوات.",
|
||||
"stable-diffusion-3-medium.description": "أحدث نموذج تحويل النص إلى صورة من Stability AI. هذا الإصدار يحسن جودة الصور، وفهم النص، وتنوع الأساليب بشكل كبير، ويفسر التعليمات الطبيعية المعقدة بدقة أكبر وينتج صورًا أكثر دقة وتنوعًا.",
|
||||
"stable-diffusion-3.5-large-turbo.description": "Stable Diffusion 3.5 Large Turbo يركز على توليد صور عالية الجودة مع قوة ممتازة في إظهار التفاصيل وواقعية المشاهد.",
|
||||
"stable-diffusion-3.5-large-turbo.description": "stable-diffusion-3.5-large-turbo يستخدم تقنيات تقطير الانتشار العدائي (ADD) لتسريع stable-diffusion-3.5-large.",
|
||||
"stable-diffusion-3.5-large.description": "stable-diffusion-3.5-large هو نموذج تحويل نص إلى صورة بسعة 800 مليون معلمة، يتميز بجودة عالية وتوافق ممتاز مع التعليمات، ويدعم صورًا بدقة 1 ميغابيكسل وتشغيلًا فعالًا على الأجهزة الاستهلاكية.",
|
||||
"stable-diffusion-v1.5.description": "stable-diffusion-v1.5 تم تهيئته من نقطة التحقق v1.2 وتم تحسينه لمدة 595 ألف خطوة على \"laion-aesthetics v2 5+\" بدقة 512x512، مع تقليل تكييف النص بنسبة 10% لتحسين التوجيه بدون مصنف.",
|
||||
"stable-diffusion-xl-base-1.0.description": "نموذج تحويل نص إلى صورة مفتوح المصدر من Stability AI يتميز بإبداع رائد في توليد الصور. يتمتع بفهم قوي للتعليمات ويدعم تعريف التعليمات العكسية لتوليد دقيق.",
|
||||
"stable-diffusion-xl.description": "stable-diffusion-xl يقدم تحسينات كبيرة مقارنة بـ v1.5 ويضاهي أفضل نتائج النماذج المفتوحة لتحويل النص إلى صورة. تشمل التحسينات مضاعفة حجم UNet ثلاث مرات، ووحدة تحسين لجودة الصورة، وتقنيات تدريب أكثر كفاءة.",
|
||||
"step-1-128k.description": "يوفر توازنًا بين الأداء والتكلفة للسيناريوهات العامة.",
|
||||
"step-1-256k.description": "يدعم السياقات الطويلة جدًا، مثالي لتحليل المستندات الطويلة.",
|
||||
"step-1-32k.description": "يدعم المحادثات متوسطة الطول لمجموعة واسعة من الاستخدامات.",
|
||||
@@ -1301,68 +1269,23 @@
|
||||
"v0-1.0-md.description": "v0-1.0-md هو نموذج قديم يتم تقديمه عبر واجهة برمجة التطبيقات v0.",
|
||||
"v0-1.5-lg.description": "v0-1.5-lg مناسب للمهام المتقدمة التي تتطلب تفكيرًا أو استدلالًا.",
|
||||
"v0-1.5-md.description": "v0-1.5-md مناسب للمهام اليومية وتوليد واجهات المستخدم.",
|
||||
"veo-2.0-generate-001.description": "نموذجنا المتقدم لتوليد الفيديو، متاح للمطورين على المستوى المدفوع من Gemini API.",
|
||||
"veo-3.0-fast-generate-001.description": "نموذجنا المستقر لتوليد الفيديو، متاح للمطورين على المستوى المدفوع من Gemini API.",
|
||||
"veo-3.0-generate-001.description": "نموذجنا المستقر لتوليد الفيديو، متاح للمطورين على المستوى المدفوع من Gemini API.",
|
||||
"veo-3.1-fast-generate-preview.description": "نموذجنا الأحدث لتوليد الفيديو، متاح للمطورين على المستوى المدفوع من Gemini API.",
|
||||
"veo-3.1-generate-preview.description": "نموذجنا الأحدث لتوليد الفيديو، متاح للمطورين على المستوى المدفوع من Gemini API.",
|
||||
"vercel/v0-1.0-md.description": "الوصول إلى النماذج التي تقف خلف v0 لتوليد، وتصحيح، وتحسين تطبيقات الويب الحديثة باستخدام استدلال خاص بالأطر ومعرفة محدثة.",
|
||||
"vercel/v0-1.5-md.description": "الوصول إلى النماذج التي تقف خلف v0 لتوليد، وتصحيح، وتحسين تطبيقات الويب الحديثة باستخدام استدلال خاص بالأطر ومعرفة محدثة.",
|
||||
"vidu/viduq2-pro_img2video.description": "قم بإدخال صورة ووصف نصي لتوليد فيديو. ViduQ2-Pro الصورة إلى الفيديو هو أول نموذج فيديو في العالم \"كل شيء يمكن أن يكون مرجعًا\". يدعم ستة أبعاد مرجعية—التأثيرات، التعبيرات، القوام، الأفعال، الشخصيات، والمشاهد—مما يتيح تحرير الفيديو المتطور بالكامل. من خلال الإضافة، الحذف، والتعديل القابل للتحكم، يحقق تحرير فيديو دقيق، مصمم كمحرك إنشاء على مستوى الإنتاج لسلاسل الرسوم المتحركة، الدراما القصيرة، وإنتاج الأفلام.",
|
||||
"vidu/viduq2-pro_reference2video.description": "قم بإدخال فيديوهات مرجعية، صور، ووصف نصي لتوليد فيديو. ViduQ2-Pro المرجع إلى الفيديو هو أول نموذج فيديو في العالم \"كل شيء يمكن أن يكون مرجعًا\". يدعم ستة أبعاد مرجعية—التأثيرات، التعبيرات، القوام، الأفعال، الشخصيات، والمشاهد—مما يتيح تحرير الفيديو المتطور بالكامل. من خلال الإضافة، الحذف، والتعديل القابل للتحكم، يحقق تحرير فيديو دقيق، مصمم كمحرك إنشاء على مستوى الإنتاج لسلاسل الرسوم المتحركة، الدراما القصيرة، وإنتاج الأفلام.",
|
||||
"vidu/viduq2-pro_start-end2video.description": "قم بإدخال صور الإطار الأول والأخير مع وصف نصي لتوليد فيديو. ViduQ2-Pro الإطار الرئيسي إلى الفيديو هو أول نموذج فيديو في العالم \"كل شيء يمكن أن يكون مرجعًا\". يدعم ستة أبعاد مرجعية—التأثيرات، التعبيرات، القوام، الأفعال، الشخصيات، والمشاهد—مما يتيح تحرير الفيديو المتطور بالكامل. من خلال الإضافة، الحذف، والتعديل القابل للتحكم، يحقق تحرير فيديو دقيق، مصمم كمحرك إنشاء على مستوى الإنتاج لسلاسل الرسوم المتحركة، الدراما القصيرة، وإنتاج الأفلام.",
|
||||
"vidu/viduq2-turbo_img2video.description": "قم بإدخال صورة ووصف نصي لتوليد فيديو. ViduQ2-Turbo الصورة إلى الفيديو هو محرك توليد سريع للغاية. يمكن توليد فيديو 5 ثوانٍ بدقة 720P في غضون 19 ثانية فقط، وفيديو 5 ثوانٍ بدقة 1080P في حوالي 27 ثانية. أفعال الشخصيات وتعبيراتها طبيعية وواقعية، تقدم أصالة قوية وأداء ممتاز في المشاهد عالية الديناميكية مثل تسلسلات الحركة، مع نطاق واسع للحركة.",
|
||||
"vidu/viduq2-turbo_start-end2video.description": "قم بإدخال صور الإطار الأول والأخير مع وصف نصي لتوليد فيديو. ViduQ2-Turbo الإطار الرئيسي إلى الفيديو هو محرك توليد سريع للغاية. يمكن إنتاج فيديو 5 ثوانٍ بدقة 720P في غضون 19 ثانية فقط، وفيديو 5 ثوانٍ بدقة 1080P في حوالي 27 ثانية. أفعال الشخصيات وتعبيراتها طبيعية وواقعية، مع أصالة قوية، تتفوق في المشاهد عالية الديناميكية مثل تسلسلات الحركة، وتدعم نطاقًا واسعًا للحركة.",
|
||||
"vidu/viduq2_reference2video.description": "قم بإدخال صور مرجعية مع وصف نصي لتوليد فيديو. ViduQ2 المرجع إلى الفيديو هو نموذج مصمم للالتزام الدقيق بالتعليمات والتقاط المشاعر الدقيقة. يقدم تحكمًا سرديًا ممتازًا، يفسر ويعبر بدقة عن تغييرات التعبيرات الدقيقة؛ يتميز بلغة سينمائية غنية، حركات كاميرا سلسة، وتوتر بصري قوي. يُستخدم على نطاق واسع في الأفلام والرسوم المتحركة، الإعلانات والتجارة الإلكترونية، الدراما القصيرة، وصناعات السياحة الثقافية.",
|
||||
"vidu/viduq2_text2video.description": "أدخل تعليمات نصية لتوليد فيديو. ViduQ2 النص إلى الفيديو هو نموذج مصمم للالتزام الدقيق بالتعليمات والتقاط المشاعر الدقيقة. يقدم تحكمًا سرديًا ممتازًا، يفسر ويعبر بدقة عن تغييرات التعبيرات الدقيقة؛ يتميز بلغة سينمائية غنية، حركات كاميرا سلسة، وتوتر بصري قوي. يُستخدم على نطاق واسع في الأفلام والرسوم المتحركة، الإعلانات والتجارة الإلكترونية، الدراما القصيرة، وصناعات السياحة الثقافية.",
|
||||
"vidu/viduq3-pro_img2video.description": "قم بإدخال صورة ووصف نصي لتوليد فيديو. ViduQ3-Pro الصورة إلى الفيديو هو نموذج صوتي بصري أصلي على مستوى الرائد. يدعم ما يصل إلى 16 ثانية من التوليد الصوتي البصري المتزامن، مما يتيح التبديل الحر بين اللقطات مع التحكم الدقيق في الإيقاع، المشاعر، واستمرارية السرد. مع مقياس معلمات رائد، يقدم جودة صورة استثنائية، اتساق الشخصيات، والتعبير العاطفي، يلبي المعايير السينمائية. مثالي لسيناريوهات الإنتاج الاحترافية مثل الإعلانات (التجارة الإلكترونية، TVC، حملات الأداء)، سلاسل الرسوم المتحركة، الدراما الحية، والألعاب.",
|
||||
"vidu/viduq3-pro_start-end2video.description": "قم بإدخال صور الإطار الأول والأخير مع وصف نصي لتوليد فيديو. ViduQ3-Pro الإطار الرئيسي إلى الفيديو هو نموذج صوتي بصري أصلي على مستوى الرائد. يدعم ما يصل إلى 16 ثانية من التوليد الصوتي البصري المتزامن، مما يتيح التبديل الحر بين اللقطات مع التحكم الدقيق في الإيقاع، المشاعر، واستمرارية السرد. مع مقياس معلمات رائد، يقدم جودة صورة استثنائية، اتساق الشخصيات، والتعبير العاطفي، يلبي المعايير السينمائية. مثالي لسيناريوهات الإنتاج الاحترافية مثل الإعلانات (التجارة الإلكترونية، TVC، حملات الأداء)، سلاسل الرسوم المتحركة، الدراما الحية، والألعاب.",
|
||||
"vidu/viduq3-pro_text2video.description": "أدخل تعليمات نصية لتوليد فيديو. ViduQ3-Pro النص إلى الفيديو هو نموذج صوتي بصري أصلي على مستوى الرائد. يدعم ما يصل إلى 16 ثانية من التوليد الصوتي البصري المتزامن، مما يتيح التبديل الحر بين اللقطات مع التحكم الدقيق في الإيقاع، المشاعر، واستمرارية السرد. مع مقياس معلمات رائد، يقدم جودة صورة استثنائية، اتساق الشخصيات، والتعبير العاطفي، يلبي المعايير السينمائية. مثالي لسيناريوهات الإنتاج الاحترافية مثل الإعلانات (التجارة الإلكترونية، TVC، حملات الأداء)، سلاسل الرسوم المتحركة، الدراما الحية، والألعاب.",
|
||||
"vidu/viduq3-turbo_img2video.description": "قم بإدخال صورة ووصف نصي لتوليد فيديو. ViduQ3-Turbo الصورة إلى الفيديو هو نموذج تسريع عالي الأداء. يقدم توليدًا سريعًا للغاية مع الحفاظ على جودة بصرية عالية وتعبير ديناميكي، يتفوق في مشاهد الحركة، تقديم المشاعر، وفهم المعاني. فعال من حيث التكلفة ومثالي لسيناريوهات الترفيه العادية مثل صور وسائل التواصل الاجتماعي، رفقاء الذكاء الاصطناعي، وأصول المؤثرات الخاصة.",
|
||||
"vidu/viduq3-turbo_start-end2video.description": "قم بإدخال صور الإطار الأول والأخير مع وصف نصي لتوليد فيديو. ViduQ3-Turbo الإطار الرئيسي إلى الفيديو هو نموذج تسريع عالي الأداء. يقدم توليدًا سريعًا للغاية مع الحفاظ على جودة بصرية عالية وتعبير ديناميكي، يتفوق في مشاهد الحركة، تقديم المشاعر، وفهم المعاني. فعال من حيث التكلفة ومثالي لسيناريوهات الترفيه العادية مثل صور وسائل التواصل الاجتماعي، رفقاء الذكاء الاصطناعي، وأصول المؤثرات الخاصة.",
|
||||
"vidu/viduq3-turbo_text2video.description": "أدخل تعليمات نصية لتوليد فيديو. ViduQ3-Turbo النص إلى الفيديو هو نموذج تسريع عالي الأداء. يقدم توليدًا سريعًا للغاية مع الحفاظ على جودة بصرية عالية وتعبير ديناميكي، يتفوق في مشاهد الحركة، تقديم المشاعر، وفهم المعاني. فعال من حيث التكلفة ومناسب جيدًا لسيناريوهات الترفيه العادية مثل صور وسائل التواصل الاجتماعي، رفقاء الذكاء الاصطناعي، وأصول المؤثرات الخاصة.",
|
||||
"vidu2-image.description": "Vidu 2 هو نموذج أساسي لتوليد الفيديو مصمم لتحقيق التوازن بين السرعة والجودة. يركز على توليد الصورة إلى الفيديو والتحكم في الإطار الأول والأخير، يدعم فيديوهات مدتها 4 ثوانٍ بدقة 720P. سرعة التوليد تحسنت بشكل كبير بينما تم تقليل التكاليف بشكل كبير. توليد الصورة إلى الفيديو يحل مشاكل تغيير الألوان السابقة، مما يقدم مرئيات مستقرة وقابلة للتحكم مناسبة للتجارة الإلكترونية وتطبيقات مشابهة. بالإضافة إلى ذلك، تم تحسين فهم المعاني للإطار الأول والأخير والاتساق عبر صور مرجعية متعددة، مما يجعله أداة فعالة لإنتاج المحتوى على نطاق واسع في الترفيه العام، وسائل الإعلام على الإنترنت، الدراما القصيرة المتحركة، والإعلانات.",
|
||||
"vidu2-reference.description": "Vidu 2 هو نموذج أساسي لتوليد الفيديو مصمم لتحقيق التوازن بين السرعة والجودة. يركز على توليد الصورة إلى الفيديو والتحكم في الإطار الأول والأخير، يدعم فيديوهات مدتها 4 ثوانٍ بدقة 720P. سرعة التوليد تحسنت بشكل كبير بينما تم تقليل التكاليف بشكل كبير. توليد الصورة إلى الفيديو يحل مشاكل تغيير الألوان السابقة، مما يقدم مرئيات مستقرة وقابلة للتحكم مناسبة للتجارة الإلكترونية وتطبيقات مشابهة. بالإضافة إلى ذلك، تم تحسين فهم المعاني للإطار الأول والأخير والاتساق عبر صور مرجعية متعددة، مما يجعله أداة فعالة لإنتاج المحتوى على نطاق واسع في الترفيه العام، وسائل الإعلام على الإنترنت، الدراما القصيرة المتحركة، والإعلانات.",
|
||||
"vidu2-start-end.description": "Vidu 2 هو نموذج أساسي لتوليد الفيديو مصمم لتحقيق التوازن بين السرعة والجودة. يركز على توليد الصورة إلى الفيديو والتحكم في الإطار الأول والأخير، يدعم فيديوهات مدتها 4 ثوانٍ بدقة 720P. سرعة التوليد تحسنت بشكل كبير بينما تم تقليل التكاليف بشكل كبير. توليد الصورة إلى الفيديو يحل مشاكل تغيير الألوان السابقة، مما يقدم مرئيات مستقرة وقابلة للتحكم مناسبة للتجارة الإلكترونية وتطبيقات مشابهة. بالإضافة إلى ذلك، تم تحسين فهم المعاني للإطار الأول والأخير والاتساق عبر صور مرجعية متعددة، مما يجعله أداة فعالة لإنتاج المحتوى على نطاق واسع في الترفيه العام، وسائل الإعلام على الإنترنت، الدراما القصيرة المتحركة، والإعلانات.",
|
||||
"viduq1-image.description": "Vidu Q1 هو النموذج الأساسي لتوليد الفيديو من الجيل التالي لـ Vidu، يركز على إنشاء فيديوهات عالية الجودة. ينتج محتوى بمواصفات ثابتة لمدة 5 ثوانٍ، 24 إطارًا في الثانية، ودقة 1080P. من خلال تحسين عميق لوضوح المرئيات، يتم تحسين جودة الصورة العامة والقوام بشكل كبير، بينما يتم تقليل مشاكل تشوه اليد واهتزاز الإطار بشكل كبير. النمط الواقعي يقترب بشكل كبير من المشاهد الواقعية، ويتم الحفاظ على أنماط الرسوم المتحركة ثنائية الأبعاد بدقة عالية. الانتقالات بين الإطار الأول والأخير تكون أكثر سلاسة، مما يجعله مناسبًا جيدًا لسيناريوهات الإبداع عالية الطلب مثل إنتاج الأفلام، الإعلانات، والدراما القصيرة المتحركة.",
|
||||
"viduq1-start-end.description": "Vidu Q1 هو النموذج الأساسي لتوليد الفيديو من الجيل التالي لـ Vidu، يركز على إنشاء فيديوهات عالية الجودة. ينتج محتوى بمواصفات ثابتة لمدة 5 ثوانٍ، 24 إطارًا في الثانية، ودقة 1080P. من خلال تحسين عميق لوضوح المرئيات، يتم تحسين جودة الصورة العامة والقوام بشكل كبير، بينما يتم تقليل مشاكل تشوه اليد واهتزاز الإطار بشكل كبير. النمط الواقعي يقترب بشكل كبير من المشاهد الواقعية، ويتم الحفاظ على أنماط الرسوم المتحركة ثنائية الأبعاد بدقة عالية. الانتقالات بين الإطار الأول والأخير تكون أكثر سلاسة، مما يجعله مناسبًا جيدًا لسيناريوهات الإبداع عالية الطلب مثل إنتاج الأفلام، الإعلانات، والدراما القصيرة المتحركة.",
|
||||
"viduq1-text.description": "Vidu Q1 هو النموذج الأساسي لتوليد الفيديو من الجيل التالي لـ Vidu، يركز على إنشاء فيديوهات عالية الجودة. ينتج محتوى بمواصفات ثابتة لمدة 5 ثوانٍ، 24 إطارًا في الثانية، ودقة 1080P. من خلال تحسين عميق لوضوح المرئيات، يتم تحسين جودة الصورة العامة والقوام بشكل كبير، بينما يتم تقليل مشاكل تشوه اليد واهتزاز الإطار بشكل كبير. النمط الواقعي يقترب بشكل كبير من المشاهد الواقعية، ويتم الحفاظ على أنماط الرسوم المتحركة ثنائية الأبعاد بدقة عالية. الانتقالات بين الإطار الأول والأخير تكون أكثر سلاسة، مما يجعله مناسبًا جيدًا لسيناريوهات الإبداع عالية الطلب مثل إنتاج الأفلام، الإعلانات، والدراما القصيرة المتحركة.",
|
||||
"volcengine/doubao-seed-2-0-code.description": "Doubao-Seed-2.0-Code مُحسّن لتلبية احتياجات البرمجة على مستوى المؤسسات. يعتمد على قدرات Agent و VLM الممتازة في Seed 2.0، ويعزز بشكل خاص قدرات البرمجة مع أداء واجهة أمامية متميز وتحسين مستهدف لمتطلبات البرمجة متعددة اللغات الشائعة في المؤسسات، مما يجعله مثاليًا للتكامل مع أدوات البرمجة بالذكاء الاصطناعي المختلفة.",
|
||||
"volcengine/doubao-seed-2-0-lite.description": "يوازن بين جودة الإنتاج وسرعة الاستجابة، مناسب كنموذج إنتاجي عام.",
|
||||
"volcengine/doubao-seed-2-0-mini.description": "يشير إلى أحدث إصدار من doubao-seed-2-0-mini.",
|
||||
"volcengine/doubao-seed-2-0-pro.description": "يشير إلى أحدث إصدار من doubao-seed-2-0-pro.",
|
||||
"volcengine/doubao-seed-code.description": "Doubao-Seed-Code هو نموذج لغة كبير من محرك ByteDance Volcano، مُحسّن للبرمجة الذاتية، ويؤدي أداءً قويًا في اختبارات البرمجة والوكلاء مع دعم سياق يصل إلى 256 ألف.",
|
||||
"wan2.2-i2v-flash.description": "Wanxiang 2.2 الإصدار السريع يقدم توليدًا فائق السرعة، مع فهم أكثر دقة للتعليمات وتحكم في الكاميرا. يحافظ على اتساق العناصر البصرية مع تحسين الاستقرار العام ومعدل النجاح بشكل كبير.",
|
||||
"wan2.2-i2v-plus.description": "Wanxiang 2.2 الإصدار الاحترافي يقدم فهمًا أكثر دقة للتعليمات وحركات كاميرا قابلة للتحكم. يحافظ على اتساق العناصر البصرية مع تحسين الاستقرار ومعدل النجاح بشكل كبير، ويولد محتوى أكثر ثراءً وتفصيلًا.",
|
||||
"wan2.2-kf2v-flash.description": "Wanxiang 2.2 الإصدار السريع",
|
||||
"wan2.2-kf2v-plus.description": "Wanxiang 2.2 الإصدار الاحترافي",
|
||||
"wan2.2-t2i-flash.description": "Wanxiang 2.2 Flash هو أحدث نموذج مع تحسينات في الإبداع، الاستقرار، والواقعية، يقدم توليدًا سريعًا وقيمة عالية.",
|
||||
"wan2.2-t2i-plus.description": "Wanxiang 2.2 Plus هو أحدث نموذج مع تحسينات في الإبداع، الاستقرار، والواقعية، ينتج تفاصيل أكثر ثراءً.",
|
||||
"wan2.2-t2v-plus.description": "Wanxiang 2.2 الإصدار الاحترافي يقدم فهمًا أكثر دقة للتعليمات، يولد حركة سلسة ومستقرة، وينتج مرئيات أكثر ثراءً وتفصيلًا.",
|
||||
"wan2.5-i2i-preview.description": "Wanxiang 2.5 I2I Preview يدعم تحرير الصور الفردية ودمج الصور المتعددة.",
|
||||
"wan2.5-i2v-preview.description": "Wanxiang 2.5 المعاينة يدعم توليد التعليق الصوتي التلقائي والقدرة على دمج ملفات صوتية مخصصة.",
|
||||
"wan2.5-t2i-preview.description": "Wanxiang 2.5 T2I يدعم اختيارًا مرنًا لأبعاد الصور ضمن قيود إجمالي مساحة البكسل ونسبة العرض إلى الارتفاع.",
|
||||
"wan2.5-t2v-preview.description": "Wanxiang 2.5 المعاينة يدعم توليد التعليق الصوتي التلقائي والقدرة على دمج ملفات صوتية مخصصة.",
|
||||
"wan2.6-i2v-flash.description": "Wanxiang 2.6 يقدم قدرات سرد متعددة اللقطات، ويدعم أيضًا توليد التعليق الصوتي التلقائي والقدرة على دمج ملفات صوتية مخصصة.",
|
||||
"wan2.6-i2v.description": "Wanxiang 2.6 يقدم قدرات سرد متعددة اللقطات، ويدعم أيضًا توليد التعليق الصوتي التلقائي والقدرة على دمج ملفات صوتية مخصصة.",
|
||||
"wan2.6-image.description": "Wanxiang 2.6 Image يدعم تحرير الصور وإخراج تخطيط مختلط للنصوص والصور.",
|
||||
"wan2.6-r2v-flash.description": "Wanxiang 2.6 المرجع إلى الفيديو – الإصدار السريع يقدم توليدًا أسرع وأداء تكلفة أفضل. يدعم الإشارة إلى شخصيات محددة أو أي كائنات، يحافظ بدقة على الاتساق في المظهر والصوت، ويمكّن الإشارة إلى شخصيات متعددة للأداء المشترك.",
|
||||
"wan2.6-r2v.description": "Wanxiang 2.6 المرجع إلى الفيديو يدعم الإشارة إلى شخصيات محددة أو أي كائنات، يحافظ بدقة على الاتساق في المظهر والصوت، ويمكّن الإشارة إلى شخصيات متعددة للأداء المشترك. ملاحظة: عند استخدام الفيديوهات كمرجع، سيتم احتساب الفيديو المدخل ضمن التكلفة. يرجى الرجوع إلى وثائق تسعير النموذج للحصول على التفاصيل.",
|
||||
"wan2.6-t2i.description": "Wanxiang 2.6 T2I يدعم اختيارًا مرنًا لأبعاد الصور ضمن قيود إجمالي مساحة البكسل ونسبة العرض إلى الارتفاع (مثل Wanxiang 2.5).",
|
||||
"wan2.6-t2v.description": "Wanxiang 2.6 يقدم قدرات سرد متعددة اللقطات، ويدعم أيضًا توليد التعليق الصوتي التلقائي والقدرة على دمج ملفات صوتية مخصصة.",
|
||||
"wan2.7-i2v.description": "Wanxiang 2.7 الصورة إلى الفيديو يقدم ترقية شاملة في قدرات الأداء. المشاهد الدرامية تتميز بتعبير عاطفي دقيق وطبيعي، بينما تكون تسلسلات الحركة مكثفة ومؤثرة. مع انتقالات لقطات أكثر ديناميكية وموجهة بالإيقاع، يحقق أداءً أقوى وسردًا قصصيًا.",
|
||||
"wan2.7-image-pro.description": "Wanxiang 2.7 الصورة الإصدار الاحترافي، يدعم إخراج بدقة 4K عالية الوضوح.",
|
||||
"wan2.7-image.description": "Wanxiang 2.7 الصورة، سرعة توليد الصور أسرع.",
|
||||
"wan2.7-r2v.description": "Wanxiang 2.7 المرجع إلى الفيديو يقدم مراجع أكثر استقرارًا للشخصيات، الدعائم، والمشاهد. يدعم ما يصل إلى 5 صور أو فيديوهات مرجعية مختلطة، مع الإشارة إلى نغمة الصوت. مع قدرات أساسية مطورة، يقدم أداءً أقوى وقوة تعبيرية.",
|
||||
"wan2.7-t2v.description": "Wanxiang 2.7 النص إلى الفيديو يقدم ترقية شاملة في قدرات الأداء. المشاهد الدرامية تتميز بتعبير عاطفي دقيق وطبيعي، بينما تكون تسلسلات الحركة مكثفة ومؤثرة. مع انتقالات لقطات أكثر ديناميكية وموجهة بالإيقاع، يحقق أداءً أقوى وسردًا قصصيًا.",
|
||||
"wanx-v1.description": "نموذج تحويل النص إلى صورة الأساسي. يُقابل Tongyi Wanxiang 1.0 General.",
|
||||
"wanx2.0-t2i-turbo.description": "يتفوّق في الصور الشخصية الملمّسة بسرعة معتدلة وتكلفة منخفضة. يُقابل Tongyi Wanxiang 2.0 Speed.",
|
||||
"wanx2.1-i2v-plus.description": "Wanxiang 2.1 الإصدار الاحترافي يقدم صورًا أكثر دقة وجودة أعلى.",
|
||||
"wanx2.1-i2v-turbo.description": "Wanxiang 2.1 الإصدار السريع يقدم أداءً عالي التكلفة.",
|
||||
"wanx2.1-t2i-plus.description": "إصدار مطوّر بالكامل مع تفاصيل صور أغنى وسرعة أبطأ قليلاً. يُقابل Tongyi Wanxiang 2.1 Pro.",
|
||||
"wanx2.1-t2i-turbo.description": "إصدار مطوّر بالكامل مع توليد سريع وجودة شاملة قوية وقيمة عالية. يُقابل Tongyi Wanxiang 2.1 Speed.",
|
||||
"wanx2.1-t2v-plus.description": "Wanxiang 2.1 الإصدار الاحترافي يقدم نسيجًا بصريًا أكثر ثراءً وصورًا بجودة أعلى.",
|
||||
"wanx2.1-t2v-turbo.description": "Wanxiang 2.1 الإصدار السريع يقدم أداءً ممتازًا من حيث التكلفة.",
|
||||
"whisper-1.description": "نموذج عام للتعرف على الكلام يدعم التعرف على الكلام متعدد اللغات، وترجمة الكلام، وتحديد اللغة.",
|
||||
"wizardlm2.description": "WizardLM 2 هو نموذج لغوي من Microsoft AI يتفوّق في الحوارات المعقدة، والمهام متعددة اللغات، والاستدلال، والمساعدات الذكية.",
|
||||
"wizardlm2:8x22b.description": "WizardLM 2 هو نموذج لغوي من Microsoft AI يتفوّق في الحوارات المعقدة، والمهام متعددة اللغات، والاستدلال، والمساعدات الذكية.",
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
{
|
||||
"agent.banner.label": "تسجيل وكيل",
|
||||
"agent.completion.sentence.readyWhenYouAre": "جاهز متى شئت :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} هنا - أنا جاهز!",
|
||||
"agent.completionSubtitle": "كل شيء جاهز - لنبدأ عندما تكون مستعدًا.",
|
||||
"agent.completionTitle": "أنت على وشك الانتهاء",
|
||||
"agent.enterApp": "أنا جاهز",
|
||||
"agent.completionSubtitle": "تم إعداد مساعدك وهو جاهز للعمل.",
|
||||
"agent.completionTitle": "تم الإعداد بالكامل!",
|
||||
"agent.enterApp": "دخول التطبيق",
|
||||
"agent.greeting.emojiLabel": "رمز تعبيري",
|
||||
"agent.greeting.nameLabel": "الاسم",
|
||||
"agent.greeting.namePlaceholder": "مثلًا: لومي، أطلس، نيكو...",
|
||||
@@ -13,19 +11,13 @@
|
||||
"agent.greeting.vibePlaceholder": "مثلًا: دافئ وودود، حاد ومباشر...",
|
||||
"agent.history.current": "الحالي",
|
||||
"agent.history.title": "مواضيع السجل",
|
||||
"agent.layout.mode.agent": "وضع الوكيل",
|
||||
"agent.layout.mode.classic": "الوضع الكلاسيكي",
|
||||
"agent.layout.skip": "تخطي هذه الخطوة",
|
||||
"agent.layout.skipConfirm.content": "هل ترغب في المغادرة الآن؟ أستطيع مساعدتك في تخصيص الأمور خلال ثوانٍ.",
|
||||
"agent.layout.skipConfirm.ok": "تخطي الآن",
|
||||
"agent.layout.skipConfirm.title": "تخطي الإعداد الآن؟",
|
||||
"agent.layout.switchMessage": "لست في مزاج لذلك اليوم؟ يمكنك التبديل إلى <modeLink><modeText>{{mode}}</modeText></modeLink> أو <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "تفاعلي",
|
||||
"agent.modeSwitch.classic": "كلاسيكي",
|
||||
"agent.modeSwitch.debug": "تصدير التصحيح",
|
||||
"agent.modeSwitch.label": "اختر وضع التسجيل",
|
||||
"agent.modeSwitch.reset": "إعادة ضبط التدفق",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "تخطي التسجيل",
|
||||
"agent.stage.agentIdentity": "هوية الوكيل",
|
||||
"agent.stage.painPoints": "نقاط الألم",
|
||||
"agent.stage.proSettings": "الإعدادات المتقدمة",
|
||||
@@ -41,16 +33,6 @@
|
||||
"agent.telemetryHint": "يمكنك أيضًا الإجابة بكلماتك الخاصة.",
|
||||
"agent.title": "تسجيل المحادثة",
|
||||
"agent.welcome": "...هم؟ لقد استيقظت للتو — ذهني فارغ. من أنت؟ وأيضًا — ماذا يجب أن يُطلق علي؟ أحتاج إلى اسم أيضًا.",
|
||||
"agent.welcome.footer": "قم بتكوين وكيل Lobe AI الخاص بك. يعمل على خادمك، ويتعلم من كل تفاعل، ويصبح أقوى كلما استمر في العمل.",
|
||||
"agent.welcome.guide.growTogether.desc": "مع كل محادثة، سأفهمك بشكل أفضل وأصبح زميلًا أقوى مع مرور الوقت.",
|
||||
"agent.welcome.guide.growTogether.title": "النمو معك",
|
||||
"agent.welcome.guide.knowYou.desc": "ما الذي يشغل بالك هذه الأيام؟ القليل من السياق يساعدني في دعمك بشكل أفضل.",
|
||||
"agent.welcome.guide.knowYou.title": "التعرف عليك",
|
||||
"agent.welcome.guide.name.desc": "امنحني اسمًا ليكون الأمر أكثر شخصية منذ البداية.",
|
||||
"agent.welcome.guide.name.title": "امنحني اسمًا",
|
||||
"agent.welcome.sentence.1": "سررت بلقائك! دعنا نتعرّف على بعض.",
|
||||
"agent.welcome.sentence.2": "ما نوع الشريك الذي تريدني أن أكونه؟",
|
||||
"agent.welcome.sentence.3": "أولًا، اختر لي اسمًا :)",
|
||||
"back": "رجوع",
|
||||
"finish": "ابدأ الآن",
|
||||
"interests.area.business": "الأعمال والاستراتيجية",
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"arguments.moreParams": "إجمالي {{count}} من المعاملات",
|
||||
"arguments.title": "المعلمات",
|
||||
"builtins.lobe-activator.apiName.activateTools": "تفعيل الأدوات",
|
||||
"builtins.lobe-activator.inspector.activateTools.notFoundCount": "{{count}} غير موجود",
|
||||
"builtins.lobe-agent-builder.apiName.getAvailableModels": "الحصول على النماذج المتاحة",
|
||||
"builtins.lobe-agent-builder.apiName.getAvailableTools": "الحصول على المهارات المتاحة",
|
||||
"builtins.lobe-agent-builder.apiName.getConfig": "الحصول على الإعدادات",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"jina.description": "تأسست Jina AI في عام 2020، وهي شركة رائدة في مجال البحث الذكي. تشمل تقنياتها نماذج المتجهات، ومعيدو الترتيب، ونماذج لغوية صغيرة لبناء تطبيقات بحث توليدية ومتعددة الوسائط عالية الجودة.",
|
||||
"kimicodingplan.description": "كود Kimi من Moonshot AI يوفر الوصول إلى نماذج Kimi بما في ذلك K2.5 لأداء مهام الترميز.",
|
||||
"lmstudio.description": "LM Studio هو تطبيق سطح مكتب لتطوير وتجربة النماذج اللغوية الكبيرة على جهازك.",
|
||||
"lobehub.description": "يستخدم LobeHub Cloud واجهات برمجة التطبيقات الرسمية للوصول إلى نماذج الذكاء الاصطناعي ويقيس الاستخدام باستخدام أرصدة مرتبطة برموز النماذج.",
|
||||
"longcat.description": "LongCat هو سلسلة من نماذج الذكاء الاصطناعي التوليدية الكبيرة التي تم تطويرها بشكل مستقل بواسطة Meituan. تم تصميمه لتعزيز إنتاجية المؤسسة الداخلية وتمكين التطبيقات المبتكرة من خلال بنية حسابية فعالة وقدرات متعددة الوسائط قوية.",
|
||||
"minimax.description": "تأسست MiniMax في عام 2021، وتبني نماذج ذكاء اصطناعي متعددة الوسائط للأغراض العامة، بما في ذلك نماذج نصية بمليارات المعلمات، ونماذج صوتية وبصرية، بالإضافة إلى تطبيقات مثل Hailuo AI.",
|
||||
"minimaxcodingplan.description": "خطة الرموز MiniMax توفر الوصول إلى نماذج MiniMax بما في ذلك M2.7 لأداء مهام الترميز عبر اشتراك ثابت الرسوم.",
|
||||
@@ -59,7 +60,6 @@
|
||||
"spark.description": "يوفر iFLYTEK Spark ذكاءً اصطناعيًا متعدد اللغات قويًا عبر مجالات متعددة، مما يمكّن من الابتكار في الأجهزة الذكية والرعاية الصحية والتمويل وغيرها.",
|
||||
"stepfun.description": "تقدم نماذج Stepfun قدرات رائدة في التعدد الوسائطي والتفكير المعقد، مع فهم طويل للسياق وتنظيم بحث مستقل قوي.",
|
||||
"straico.description": "يُبسط Straico دمج الذكاء الاصطناعي من خلال توفير مساحة عمل موحدة تجمع بين أفضل نماذج الذكاء الاصطناعي التوليدية للنصوص والصور والصوت، مما يمكّن المسوقين ورواد الأعمال والهواة من الوصول السلس إلى أدوات الذكاء الاصطناعي المتنوعة.",
|
||||
"streamlake.description": "تعد StreamLake منصة سحابية للموديلات الذكية وحوسبة الذكاء الاصطناعي على مستوى المؤسسات، تجمع بين استدلال الموديلات عالي الأداء، وتخصيص الموديلات منخفض التكلفة، وخدمات مُدارة بالكامل، لتمكين المؤسسات من التركيز على ابتكار تطبيقات الذكاء الاصطناعي دون القلق بشأن تعقيد موارد الحوسبة الأساسية أو تكلفتها.",
|
||||
"taichu.description": "Taichu هو نموذج متعدد الوسائط من الجيل التالي من CASIA ومعهد ووهان للذكاء الاصطناعي، يدعم الأسئلة والأجوبة متعددة الجولات، والكتابة، وتوليد الصور، وفهم الأبعاد الثلاثية، وتحليل الإشارات بقدرات إدراكية وإبداعية متقدمة.",
|
||||
"tencentcloud.description": "توفر Tencent Cloud محرك معرفة قائم على النماذج اللغوية الكبيرة يقدم إجابات معرفية شاملة للمؤسسات والمطورين، مع خدمات معيارية مثل تحليل المستندات، والتقسيم، والتضمين، وإعادة الصياغة متعددة الجولات لبناء حلول ذكاء اصطناعي مخصصة.",
|
||||
"togetherai.description": "توفر Together AI أداءً رائدًا من خلال نماذج مبتكرة، وتخصيص واسع، وتوسع سريع، ونشر بسيط لتلبية احتياجات المؤسسات.",
|
||||
|
||||
+1
-64
@@ -657,6 +657,7 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "إصدار إطار Electron",
|
||||
"settingSystemTools.appEnvironment.node.desc": "إصدار Node.js المدمج",
|
||||
"settingSystemTools.appEnvironment.title": "بيئة التطبيق",
|
||||
"settingSystemTools.autoSelectDesc": "سيتم اختيار أفضل أداة متاحة تلقائيًا",
|
||||
"settingSystemTools.category.browserAutomation": "أتمتة المتصفح",
|
||||
"settingSystemTools.category.browserAutomation.desc": "أدوات لأتمتة المتصفح بدون واجهة والتفاعل مع الويب",
|
||||
"settingSystemTools.category.contentSearch": "البحث في المحتوى",
|
||||
@@ -673,19 +674,14 @@
|
||||
"settingSystemTools.title": "أدوات النظام",
|
||||
"settingSystemTools.tools.ag.desc": "The Silver Searcher - أداة سريعة للبحث في الشيفرة البرمجية",
|
||||
"settingSystemTools.tools.agentBrowser.desc": "Agent-browser - واجهة سطر الأوامر لأتمتة المتصفح بدون واجهة لوكلاء الذكاء الاصطناعي",
|
||||
"settingSystemTools.tools.bun.desc": "Bun - بيئة تشغيل JavaScript ومدير حزم سريع",
|
||||
"settingSystemTools.tools.bunx.desc": "bunx - أداة تشغيل حزم Bun لتنفيذ حزم npm",
|
||||
"settingSystemTools.tools.fd.desc": "fd - بديل سريع وسهل الاستخدام لأداة find",
|
||||
"settingSystemTools.tools.find.desc": "أداة find في Unix - أمر قياسي للبحث عن الملفات",
|
||||
"settingSystemTools.tools.grep.desc": "GNU grep - أداة قياسية للبحث في النصوص",
|
||||
"settingSystemTools.tools.lobehub.desc": "LobeHub CLI - إدارة والاتصال بخدمات LobeHub",
|
||||
"settingSystemTools.tools.mdfind.desc": "بحث Spotlight في macOS (بحث مفهرس وسريع)",
|
||||
"settingSystemTools.tools.node.desc": "Node.js - بيئة تشغيل JavaScript لـ JS/TS",
|
||||
"settingSystemTools.tools.npm.desc": "npm - مدير حزم Node.js لتثبيت التبعيات",
|
||||
"settingSystemTools.tools.pnpm.desc": "pnpm - مدير حزم سريع وفعّال في استخدام مساحة القرص",
|
||||
"settingSystemTools.tools.python.desc": "Python - بيئة تشغيل لغة البرمجة",
|
||||
"settingSystemTools.tools.rg.desc": "ripgrep - أداة بحث نصي سريعة للغاية",
|
||||
"settingSystemTools.tools.uv.desc": "uv - مدير حزم Python فائق السرعة",
|
||||
"settingTTS.openai.sttModel": "نموذج OpenAI لتحويل الكلام إلى نص",
|
||||
"settingTTS.openai.title": "OpenAI",
|
||||
"settingTTS.openai.ttsModel": "نموذج OpenAI لتحويل النص إلى كلام",
|
||||
@@ -782,9 +778,6 @@
|
||||
"systemAgent.inputCompletion.label": "النموذج",
|
||||
"systemAgent.inputCompletion.modelDesc": "النموذج المستخدم لاقتراحات الإكمال التلقائي للإدخال (مثل نص الشبح في GitHub Copilot)",
|
||||
"systemAgent.inputCompletion.title": "وكيل الإكمال التلقائي للإدخال",
|
||||
"systemAgent.promptRewrite.label": "النموذج",
|
||||
"systemAgent.promptRewrite.modelDesc": "حدد النموذج المستخدم لإعادة صياغة المطالبات",
|
||||
"systemAgent.promptRewrite.title": "وكيل إعادة صياغة المطالبات",
|
||||
"systemAgent.queryRewrite.label": "النموذج",
|
||||
"systemAgent.queryRewrite.modelDesc": "تحديد النموذج المستخدم لتحسين استفسارات المستخدم",
|
||||
"systemAgent.queryRewrite.title": "وكيل إعادة صياغة استعلام المكتبة",
|
||||
@@ -851,83 +844,31 @@
|
||||
"tab.uploadZip.desc": "رفع ملف .zip أو .skill محلي",
|
||||
"tab.usage": "إحصائيات الاستخدام",
|
||||
"tools.add": "إضافة مهارة",
|
||||
"tools.builtins.find-skills.description": "يساعد المستخدمين في اكتشاف وتثبيت مهارات الوكلاء عند سؤالهم \"كيف أفعل كذا\" أو \"اعثر على مهارة لكذا\" أو عند رغبتهم في توسيع القدرات",
|
||||
"tools.builtins.find-skills.title": "العثور على المهارات",
|
||||
"tools.builtins.groupName": "المهارات المدمجة",
|
||||
"tools.builtins.install": "تثبيت",
|
||||
"tools.builtins.installed": "مثبّت",
|
||||
"tools.builtins.lobe-activator.description": "اكتشاف وتنشيط الأدوات والمهارات",
|
||||
"tools.builtins.lobe-activator.title": "منشّط الأدوات والمهارات",
|
||||
"tools.builtins.lobe-agent-browser.description": "واجهة سطر أوامر لأتمتة المتصفح للوكلاء الذكيين. تُستخدم للمهام التي تتضمن التفاعل مع المواقع أو تطبيقات Electron مثل التنقل، تعبئة النماذج، النقر، التقاط الصور، استخراج البيانات، تدفقات تسجيل الدخول، والاختبارات الشاملة.",
|
||||
"tools.builtins.lobe-agent-browser.title": "متصفح الوكيل",
|
||||
"tools.builtins.lobe-agent-builder.description": "إعداد بيانات الوكيل، إعدادات النموذج، الإضافات، والموجه النظامي",
|
||||
"tools.builtins.lobe-agent-builder.title": "منشئ الوكيل",
|
||||
"tools.builtins.lobe-agent-documents.description": "إدارة مستندات الوكيل (عرض، إنشاء، قراءة، تعديل، إزالة، إعادة تسمية) وقواعد التحميل",
|
||||
"tools.builtins.lobe-agent-documents.title": "المستندات",
|
||||
"tools.builtins.lobe-agent-management.description": "إنشاء الوكلاء وإدارتهم وتنظيم عملهم",
|
||||
"tools.builtins.lobe-agent-management.title": "إدارة الوكلاء",
|
||||
"tools.builtins.lobe-artifacts.description": "إنشاء ومعاينة مكونات واجهة المستخدم التفاعلية، وتصوير البيانات، والمخططات، والرسومات بصيغة SVG، وتطبيقات الويب بشكل مباشر. أنشئ محتوى بصريًا غنيًا يمكن للمستخدمين التفاعل معه مباشرة.",
|
||||
"tools.builtins.lobe-artifacts.readme": "أنشئ معاينات حية وتفاعلية لمكونات واجهة المستخدم، وتصوير البيانات، والمخططات، والرسومات بصيغة SVG، وتطبيقات الويب. أنشئ محتوى بصريًا غنيًا يمكن للمستخدمين التفاعل معه مباشرة.",
|
||||
"tools.builtins.lobe-artifacts.title": "القطع الفنية",
|
||||
"tools.builtins.lobe-brief.description": "الإبلاغ عن التقدم، تسليم النتائج، وطلب القرارات من المستخدم",
|
||||
"tools.builtins.lobe-brief.title": "أدوات المختصر",
|
||||
"tools.builtins.lobe-calculator.description": "إجراء العمليات الحسابية، حل المعادلات، والعمل مع التعبيرات الرمزية",
|
||||
"tools.builtins.lobe-calculator.readme": "آلة حاسبة رياضية متقدمة تدعم العمليات الحسابية الأساسية، المعادلات الجبرية، عمليات التفاضل والتكامل، والرياضيات الرمزية. تشمل تحويل القواعد، حل المعادلات، التفاضل، التكامل، وأكثر.",
|
||||
"tools.builtins.lobe-calculator.title": "آلة حاسبة",
|
||||
"tools.builtins.lobe-cloud-sandbox.description": "تنفيذ تعليمات برمجية بلغة بايثون، جافاسكريبت، وتايب سكريبت في بيئة سحابية معزولة. شغّل أوامر الصدفة، إدارة الملفات، البحث باستخدام تعبيرات regex، وتصدير النتائج بأمان.",
|
||||
"tools.builtins.lobe-cloud-sandbox.readme": "نفّذ تعليمات برمجية بلغة Python وJavaScript وTypeScript في بيئة سحابية معزولة. شغّل أوامر الصدفة، وأدر الملفات، وابحث في المحتوى باستخدام regex، وصدّر النتائج بأمان.",
|
||||
"tools.builtins.lobe-cloud-sandbox.title": "بيئة سحابية تجريبية",
|
||||
"tools.builtins.lobe-creds.description": "إدارة بيانات اعتماد المستخدم للمصادقة، وحقن متغيرات البيئة، والتحقق من واجهات API — التعامل مع مفاتيح API، رموز OAuth، والأسرار للتكامل مع الخدمات الخارجية.",
|
||||
"tools.builtins.lobe-creds.title": "بيانات الاعتماد",
|
||||
"tools.builtins.lobe-cron.description": "إدارة المهام المجدولة التي تعمل تلقائيًا في أوقات محددة. إنشاء، تحديث، تفعيل/تعطيل، ومراقبة المهام المتكررة لوكلائك.",
|
||||
"tools.builtins.lobe-cron.title": "المهام المجدولة",
|
||||
"tools.builtins.lobe-group-agent-builder.description": "إعداد بيانات المجموعات، الأعضاء، والمحتوى المشترك لمجموعات الوكلاء متعددة",
|
||||
"tools.builtins.lobe-group-agent-builder.title": "منشئ وكيل المجموعة",
|
||||
"tools.builtins.lobe-group-management.description": "تنظيم وإدارة المحادثات الجماعية لوكلاء متعددين",
|
||||
"tools.builtins.lobe-group-management.title": "إدارة المجموعات",
|
||||
"tools.builtins.lobe-gtd.description": "خطط للأهداف وتابع التقدم باستخدام منهجية GTD. أنشئ خططًا استراتيجية، وأدر قوائم المهام مع تتبع الحالة، ونفّذ مهام غير متزامنة طويلة الأمد.",
|
||||
"tools.builtins.lobe-gtd.readme": "خطط لأهدافك وتابع تقدمك باستخدام منهجية GTD. أنشئ خططًا استراتيجية، وأدر قوائم المهام مع تتبع الحالة، ونفّذ المهام غير المتزامنة طويلة الأمد.",
|
||||
"tools.builtins.lobe-gtd.title": "أدوات GTD",
|
||||
"tools.builtins.lobe-knowledge-base.description": "البحث في المستندات المرفوعة والمعرفة المتخصصة عبر البحث الدلالي — للرجوع الدائم والقابل لإعادة الاستخدام",
|
||||
"tools.builtins.lobe-knowledge-base.title": "قاعدة المعرفة",
|
||||
"tools.builtins.lobe-local-system.description": "الوصول إلى نظام الملفات المحلي على سطح المكتب. قراءة، وكتابة، والبحث، وتنظيم الملفات. تنفيذ أوامر الصدفة مع دعم المهام الخلفية والبحث في المحتوى باستخدام تعبيرات regex.",
|
||||
"tools.builtins.lobe-local-system.readme": "يمكنك الوصول إلى نظام الملفات المحلي على سطح المكتب. اقرأ، واكتب، وابحث، ونظّم الملفات. نفّذ أوامر الصدفة مع دعم المهام الخلفية وابحث في المحتوى باستخدام أنماط regex.",
|
||||
"tools.builtins.lobe-local-system.title": "النظام المحلي",
|
||||
"tools.builtins.lobe-message.description": "إرسال، قراءة، تحرير، وإدارة الرسائل عبر منصات مراسلة متعددة من خلال واجهة موحدة",
|
||||
"tools.builtins.lobe-message.readme": "أداة مراسلة متعددة المنصات تدعم Discord وTelegram وSlack وGoogle Chat وIRC. توفر واجهات موحدة لعمليات الرسائل، التفاعلات، التثبيت، المواضيع، إدارة القنوات، والميزات الخاصة بكل منصة مثل الاستفتاءات.",
|
||||
"tools.builtins.lobe-message.title": "الرسائل",
|
||||
"tools.builtins.lobe-notebook.description": "إنشاء وإدارة مستندات دائمة ضمن مواضيع المحادثة. احفظ الملاحظات، والتقارير، والمقالات، ومحتوى Markdown الذي يبقى متاحًا عبر الجلسات.",
|
||||
"tools.builtins.lobe-notebook.readme": "أنشئ وادِر مستندات دائمة ضمن مواضيع المحادثة. احفظ الملاحظات، والتقارير، والمقالات، ومحتوى Markdown ليبقى متاحًا عبر الجلسات.",
|
||||
"tools.builtins.lobe-notebook.title": "دفتر الملاحظات",
|
||||
"tools.builtins.lobe-page-agent.description": "إنشاء، قراءة، تحديث، وحذف العقد في المستندات ذات البنية XML",
|
||||
"tools.builtins.lobe-page-agent.readme": "إنشاء وتحرير مستندات منظمة مع تحكم دقيق على مستوى العقد. البدء من Markdown، إجراء عمليات إدراج/تعديل/حذف مجمّعة، والبحث والاستبدال عبر المستندات.",
|
||||
"tools.builtins.lobe-page-agent.title": "المستند",
|
||||
"tools.builtins.lobe-remote-device.description": "اكتشاف وإدارة اتصالات أجهزة سطح المكتب البعيدة",
|
||||
"tools.builtins.lobe-remote-device.readme": "إدارة الاتصالات مع أجهزة سطح المكتب الخاصة بك. عرض الأجهزة المتصلة، تفعيل جهاز للعمليات البعيدة، والتحقق من حالة الاتصال.",
|
||||
"tools.builtins.lobe-remote-device.title": "جهاز بعيد",
|
||||
"tools.builtins.lobe-skill-store.description": "تصفح وتثبيت مهارات الوكلاء من سوق LobeHub. استخدم هذا عند حاجتك لقدرات إضافية أو لتثبيت مهارة محددة.",
|
||||
"tools.builtins.lobe-skill-store.title": "متجر المهارات",
|
||||
"tools.builtins.lobe-skills.description": "تنشيط واستخدام حزم المهارات القابلة لإعادة الاستخدام",
|
||||
"tools.builtins.lobe-skills.title": "المهارات",
|
||||
"tools.builtins.lobe-task.description": "إنشاء، عرض، تحرير، وحذف المهام مع إدارة التبعيات وإعدادات المراجعة",
|
||||
"tools.builtins.lobe-task.title": "أدوات المهام",
|
||||
"tools.builtins.lobe-topic-reference.description": "استرجاع السياق من المحادثات المرجعية للمواضيع",
|
||||
"tools.builtins.lobe-topic-reference.title": "مرجع الموضوع",
|
||||
"tools.builtins.lobe-user-interaction.description": "طرح الأسئلة على المستخدمين عبر تفاعلات الواجهة ومتابعة نتائج دورة حياتهم",
|
||||
"tools.builtins.lobe-user-interaction.title": "تفاعل المستخدم",
|
||||
"tools.builtins.lobe-user-memory.description": "أنشئ قاعدة معرفة مخصصة عنك. تذكّر التفضيلات، وتتبع الأنشطة والتجارب، واحفظ معلومات الهوية، واسترجع السياق المناسب في المحادثات المستقبلية.",
|
||||
"tools.builtins.lobe-user-memory.readme": "أنشئ قاعدة معرفة مخصصة عنك. تذكّر التفضيلات، وتتبع الأنشطة والتجارب، واحتفظ بمعلومات الهوية، واسترجع السياق المناسب في المحادثات المستقبلية.",
|
||||
"tools.builtins.lobe-user-memory.title": "الذاكرة",
|
||||
"tools.builtins.lobe-web-browsing.description": "البحث في الويب للحصول على معلومات حديثة وزحف الصفحات لاستخراج المحتوى. يدعم عدة محركات بحث، فئات، ونطاقات زمنية.",
|
||||
"tools.builtins.lobe-web-browsing.readme": "البحث في الويب وجمع المعلومات الحديثة وزحف الصفحات لاستخراج المحتوى. يدعم محركات بحث متعددة، فئات، ونطاقات زمنية للبحث الشامل.",
|
||||
"tools.builtins.lobe-web-browsing.title": "تصفح الويب",
|
||||
"tools.builtins.lobe-web-onboarding.description": "قيادة عملية الإعداد على الويب ببيئة تشغيل وكيل مُتحكم بها",
|
||||
"tools.builtins.lobe-web-onboarding.title": "إعداد الويب",
|
||||
"tools.builtins.lobehub.description": "إدارة منصة LobeHub عبر CLI — قواعد المعرفة، الذاكرة، الوكلاء، الملفات، البحث، التوليد، والمزيد.",
|
||||
"tools.builtins.lobehub.title": "LobeHub",
|
||||
"tools.builtins.notInstalled": "غير مثبّت",
|
||||
"tools.builtins.task.description": "إدارة وتنفيذ المهام — إنشاء، تتبع، مراجعة، وإكمال المهام عبر CLI.",
|
||||
"tools.builtins.task.title": "المهام",
|
||||
"tools.builtins.uninstall": "إلغاء التثبيت",
|
||||
"tools.builtins.uninstallConfirm.desc": "هل أنت متأكد أنك تريد إلغاء تثبيت {{name}}؟ سيتم إزالة هذه المهارة من الوكيل الحالي.",
|
||||
"tools.builtins.uninstallConfirm.title": "إلغاء تثبيت {{name}}",
|
||||
@@ -1009,16 +950,12 @@
|
||||
"tools.lobehubSkill.disconnectConfirm.title": "هل تريد قطع الاتصال بـ {{name}}؟",
|
||||
"tools.lobehubSkill.disconnected": "غير متصل",
|
||||
"tools.lobehubSkill.error": "خطأ",
|
||||
"tools.lobehubSkill.providers.github.description": "GitHub هو منصة للتحكم بالإصدارات والتعاون، تتيح للمطورين استضافة، مراجعة، وإدارة مستودعات الأكواد.",
|
||||
"tools.lobehubSkill.providers.github.readme": "اتصل بـ GitHub للوصول إلى مستودعاتك، إنشاء وإدارة القضايا، مراجعة طلبات السحب، والتعاون في الأكواد — وكل ذلك عبر محادثة طبيعية مع مساعدك الذكي.",
|
||||
"tools.lobehubSkill.providers.linear.description": "Linear هي أداة حديثة لتتبع القضايا وإدارة المشاريع مصممة للفرق عالية الأداء لبناء برمجيات أفضل بشكل أسرع",
|
||||
"tools.lobehubSkill.providers.linear.readme": "اجلب قوة Linear مباشرة إلى مساعدك الذكي. أنشئ وحدث المشكلات، وأدر السبرينت، وتتبع تقدم المشاريع، وسهّل سير عمل التطوير — كل ذلك من خلال المحادثة الطبيعية.",
|
||||
"tools.lobehubSkill.providers.microsoft.description": "تقويم Outlook هو أداة جدولة مدمجة ضمن Microsoft Outlook تتيح للمستخدمين إنشاء المواعيد، تنظيم الاجتماعات، وإدارة الوقت والفعاليات بفعالية.",
|
||||
"tools.lobehubSkill.providers.microsoft.readme": "تكامل مع تقويم Outlook لعرض وإنشاء وإدارة فعالياتك بسلاسة. جدْوِل الاجتماعات، وتحقق من التوفر، واضبط التذكيرات، ونظّم وقتك — كل ذلك باستخدام أوامر اللغة الطبيعية.",
|
||||
"tools.lobehubSkill.providers.twitter.description": "X (تويتر سابقًا) هي منصة تواصل اجتماعي لمشاركة التحديثات الفورية، الأخبار، والتفاعل مع جمهورك من خلال المنشورات، الردود، والرسائل المباشرة.",
|
||||
"tools.lobehubSkill.providers.twitter.readme": "اتصل بـ X (تويتر) لنشر التغريدات، وإدارة الجدول الزمني، والتفاعل مع جمهورك. أنشئ المحتوى، وجدول المنشورات، وراقب الإشارات، وابنِ حضورك على وسائل التواصل الاجتماعي من خلال الذكاء الاصطناعي الحواري.",
|
||||
"tools.lobehubSkill.providers.vercel.description": "Vercel هي منصة سحابية للمطورين الأماميين، توفر الاستضافة والدوال الخادمة لنشر التطبيقات بسهولة.",
|
||||
"tools.lobehubSkill.providers.vercel.readme": "اتصل بـ Vercel لإدارة عمليات النشر، مراقبة حالة المشاريع، والتحكم في البنية التحتية. انشر التطبيقات، تحقق من سجلات البناء، أدر متغيرات البيئة، ووسع مشاريعك عبر محادثة ذكية.",
|
||||
"tools.notInstalled": "غير مثبت",
|
||||
"tools.notInstalledWarning": "هذه المهارة غير مثبتة حاليًا، مما قد يؤثر على وظائف الوكيل.",
|
||||
"tools.plugins.enabled": "مفعلة: {{num}}",
|
||||
|
||||
@@ -97,9 +97,6 @@
|
||||
"credits.topUp.upgradePrefix": "الترقية إلى",
|
||||
"credits.topUp.upgradeSuffix": "لتوفير ${{savings}}",
|
||||
"credits.topUp.validityInfo": "صالح لمدة {{months}} أشهر",
|
||||
"crossPlatform.desc": "تم شراء هذا الاشتراك من خلال تطبيق الهاتف المحمول ولا يمكن تعديله هنا. يرجى إدارة اشتراكك على جهازك المحمول.",
|
||||
"crossPlatform.manageOnMobile": "إدارة على الجهاز المحمول",
|
||||
"crossPlatform.title": "اشتراك عبر الأنظمة الأساسية",
|
||||
"currentPlan.cancelAlert": "سيتم إلغاء الاشتراك بعد {{canceledAt}}. لا يزال بإمكانك استعادته من \"إدارة الاشتراك\" قبل ذلك",
|
||||
"currentPlan.downgradeAlert": "سيتم تخفيض الخطة إلى {{plan}} بعد {{downgradedAt}}.",
|
||||
"currentPlan.management": "إدارة الاشتراك",
|
||||
|
||||
@@ -8,14 +8,11 @@
|
||||
"config.imageUrl.label": "الإطار الابتدائي",
|
||||
"config.prompt.placeholder": "صف الفيديو الذي ترغب في إنشائه",
|
||||
"config.prompt.placeholderWithRef": "وصف المشهد الذي تريد إنشاؤه مع الصورة",
|
||||
"config.promptExtend.label": "توسيع المطالبة",
|
||||
"config.referenceImage.label": "صورة مرجعية",
|
||||
"config.resolution.label": "الدقة",
|
||||
"config.seed.label": "البذرة",
|
||||
"config.seed.random": "عشوائي",
|
||||
"config.size.label": "الحجم",
|
||||
"config.watermark.label": "علامة مائية",
|
||||
"config.webSearch.label": "البحث في الويب",
|
||||
"generation.actions.copyError": "نسخ رسالة الخطأ",
|
||||
"generation.actions.errorCopied": "تم نسخ رسالة الخطأ إلى الحافظة",
|
||||
"generation.actions.errorCopyFailed": "فشل في نسخ رسالة الخطأ",
|
||||
|
||||
@@ -22,10 +22,6 @@
|
||||
"channel.connectSuccess": "Ботът е успешно свързан",
|
||||
"channel.connecting": "Свързване...",
|
||||
"channel.connectionConfig": "Конфигурация на връзката",
|
||||
"channel.connectionMode": "Режим на свързване",
|
||||
"channel.connectionModeHint": "WebSocket се препоръчва за нови ботове. Използвайте Webhook, ако вашият бот вече има конфигуриран callback URL в платформата QQ Open Platform.",
|
||||
"channel.connectionModeWebSocket": "WebSocket",
|
||||
"channel.connectionModeWebhook": "Webhook",
|
||||
"channel.copied": "Копирано в клипборда",
|
||||
"channel.copy": "Копирай",
|
||||
"channel.credentials": "Удостоверения",
|
||||
@@ -61,8 +57,6 @@
|
||||
"channel.endpointUrlHint": "Моля, копирайте този URL и го поставете в полето <bold>{{fieldName}}</bold> в {{name}} Developer Portal.",
|
||||
"channel.exportConfig": "Експортиране на конфигурация",
|
||||
"channel.feishu.description": "Свържете този асистент с Feishu за лични и групови чатове.",
|
||||
"channel.feishu.webhookMigrationDesc": "Режимът WebSocket осигурява доставяне на събития в реално време без необходимост от публичен callback URL. За миграция превключете режима на свързване към WebSocket в Разширени настройки. Не е необходима допълнителна конфигурация в Feishu/Lark Open Platform.",
|
||||
"channel.feishu.webhookMigrationTitle": "Обмислете миграция към режим WebSocket",
|
||||
"channel.historyLimit": "Лимит на съобщенията в историята",
|
||||
"channel.historyLimitHint": "По подразбиране брой съобщения за извличане при четене на историята на канала",
|
||||
"channel.importConfig": "Импортиране на конфигурация",
|
||||
@@ -77,8 +71,6 @@
|
||||
"channel.publicKeyPlaceholder": "Задължително за проверка на взаимодействия",
|
||||
"channel.qq.appIdHint": "Вашият QQ Bot App ID от QQ Open Platform",
|
||||
"channel.qq.description": "Свържете този асистент с QQ за групови чатове и директни съобщения.",
|
||||
"channel.qq.webhookMigrationDesc": "Режимът WebSocket осигурява доставяне на събития в реално време и автоматично повторно свързване без необходимост от callback URL. За миграция създайте нов бот в QQ Open Platform без да конфигурирате callback URL, след което превключете режима на свързване към WebSocket в Разширени настройки.",
|
||||
"channel.qq.webhookMigrationTitle": "Обмислете миграция към режим WebSocket",
|
||||
"channel.removeChannel": "Премахване на канал",
|
||||
"channel.removeFailed": "Неуспешно премахване на канала",
|
||||
"channel.removed": "Каналът е премахнат",
|
||||
@@ -101,11 +93,7 @@
|
||||
"channel.signingSecret": "Тайна за подписване",
|
||||
"channel.signingSecretHint": "Използва се за проверка на заявки към уебхук.",
|
||||
"channel.slack.appIdHint": "Вашият Slack App ID от таблото за управление на Slack API (започва с A).",
|
||||
"channel.slack.appToken": "Токен на ниво приложение",
|
||||
"channel.slack.appTokenHint": "Задължителен за Socket Mode (WebSocket). Генерирайте токен на ниво приложение (xapp-...) в секцията Basic Information в настройките на вашето Slack приложение.",
|
||||
"channel.slack.description": "Свържете този асистент със Slack за разговори в канали и директни съобщения.",
|
||||
"channel.slack.webhookMigrationDesc": "Socket Mode осигурява доставяне на събития в реално време чрез WebSocket без да изисква публичен HTTP endpoint. За миграция активирайте Socket Mode в настройките на вашето Slack приложение, генерирайте токен на ниво приложение, след което превключете режима на свързване към WebSocket в Разширени настройки.",
|
||||
"channel.slack.webhookMigrationTitle": "Обмислете миграция към Socket Mode (WebSocket)",
|
||||
"channel.telegram.description": "Свържете този асистент с Telegram за лични и групови чатове.",
|
||||
"channel.testConnection": "Тестване на връзката",
|
||||
"channel.testFailed": "Тестът на връзката неуспешен",
|
||||
|
||||
@@ -42,11 +42,6 @@
|
||||
"confirmRemoveGroupSuccess": "Групата е изтрита успешно",
|
||||
"confirmRemoveSessionItemAlert": "Ще изтриете този агент. След изтриване, той не може да бъде възстановен. Моля, потвърдете действието си.",
|
||||
"confirmRemoveSessionSuccess": "Агентът е премахнат успешно",
|
||||
"createModal.createBlank": "Създай празен",
|
||||
"createModal.groupPlaceholder": "Опишете какво трябва да прави тази група...",
|
||||
"createModal.groupTitle": "Какво трябва да прави вашата група?",
|
||||
"createModal.placeholder": "Опишете какво трябва да прави вашият агент...",
|
||||
"createModal.title": "Какво трябва да прави вашият агент?",
|
||||
"defaultAgent": "Агент по подразбиране",
|
||||
"defaultGroupChat": "Група",
|
||||
"defaultList": "Списък по подразбиране",
|
||||
@@ -234,7 +229,6 @@
|
||||
"operation.contextCompression": "Контекстът е твърде дълъг, компресиране на историята...",
|
||||
"operation.execAgentRuntime": "Подготвяне на отговор",
|
||||
"operation.execClientTask": "Изпълнение на задача",
|
||||
"operation.execServerAgentRuntime": "Работи… Можете да превключите задачи или да затворите страницата — задачата ще продължи.",
|
||||
"operation.sendMessage": "Изпращане на съобщение",
|
||||
"owner": "Собственик на групата",
|
||||
"pageCopilot.title": "Агент на страницата",
|
||||
@@ -388,7 +382,6 @@
|
||||
"task.status.fetchingDetails": "Извличане на подробности...",
|
||||
"task.status.initializing": "Инициализиране на задачата...",
|
||||
"task.subtask": "Подзадача",
|
||||
"task.title": "Задачи",
|
||||
"thread.divider": "Подтема",
|
||||
"thread.threadMessageCount": "{{messageCount}} съобщения",
|
||||
"thread.title": "Подтема",
|
||||
@@ -436,11 +429,9 @@
|
||||
"toolAuth.title": "Упълномощи уменията за този агент",
|
||||
"topic.checkOpenNewTopic": "Да започнем нова тема?",
|
||||
"topic.checkSaveCurrentMessages": "Искате ли да запазите текущия разговор като тема?",
|
||||
"topic.defaultTitle": "Неозаглавена тема",
|
||||
"topic.openNewTopic": "Отвори нова тема",
|
||||
"topic.recent": "Скорошни теми",
|
||||
"topic.saveCurrentMessages": "Запази текущата сесия като тема",
|
||||
"topic.viewAll": "Виж всички теми",
|
||||
"translate.action": "Преведи",
|
||||
"translate.clear": "Изчисти превода",
|
||||
"tts.action": "Текст към реч",
|
||||
|
||||
@@ -343,19 +343,10 @@
|
||||
"mail.support": "Имейл поддръжка",
|
||||
"more": "Още",
|
||||
"navPanel.agent": "Агент",
|
||||
"navPanel.customizeSidebar": "Персонализиране на страничната лента",
|
||||
"navPanel.displayItems": "Показвани елементи",
|
||||
"navPanel.hidden": "Скрито",
|
||||
"navPanel.hideSection": "Скриване на раздел",
|
||||
"navPanel.library": "Библиотека",
|
||||
"navPanel.moveDown": "Преместване надолу",
|
||||
"navPanel.moveUp": "Преместване нагоре",
|
||||
"navPanel.pinned": "Закачено",
|
||||
"navPanel.searchAgent": "Търсене на агент...",
|
||||
"navPanel.searchRecent": "Търсене в скорошни...",
|
||||
"navPanel.searchResultEmpty": "Няма намерени резултати",
|
||||
"navPanel.show": "Показване",
|
||||
"navPanel.visible": "Видимо",
|
||||
"new": "Нов",
|
||||
"noContent": "Няма съдържание",
|
||||
"oauth": "SSO вход",
|
||||
@@ -371,12 +362,6 @@
|
||||
"productHunt.actionLabel": "Подкрепете ни",
|
||||
"productHunt.description": "Подкрепете ни в Product Hunt. Вашата подкрепа означава много за нас!",
|
||||
"productHunt.title": "Ние сме в Product Hunt!",
|
||||
"promptTransform.action": "Усъвършенстване на идеята",
|
||||
"promptTransform.actions.rewrite": "Разширяване на подробностите",
|
||||
"promptTransform.actions.translate": "Превод",
|
||||
"promptTransform.status.rewrite": "Разширяване на подробностите...",
|
||||
"promptTransform.status.translate": "Превеждане...",
|
||||
"recents": "Скорошни",
|
||||
"regenerate": "Генерирай отново",
|
||||
"releaseNotes": "Детайли за версията",
|
||||
"rename": "Преименувай",
|
||||
@@ -415,7 +400,6 @@
|
||||
"tab.audio": "Аудио",
|
||||
"tab.chat": "Чат",
|
||||
"tab.community": "Общност",
|
||||
"tab.create": "Създаване",
|
||||
"tab.discover": "Открий",
|
||||
"tab.eval": "Оценителна лаборатория",
|
||||
"tab.files": "Файлове",
|
||||
|
||||
@@ -124,7 +124,6 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Аудио",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Изображение",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Текст",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Видео",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Вход ${{amount}}/М",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Изход ${{amount}}/М",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / изображение",
|
||||
@@ -140,7 +139,6 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Вход (кеширан)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Вход (запис в кеш)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Изход",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Генериране на видео",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Пуснат на {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "Няма активиран модел. Моля, отидете в настройките, за да активирате.",
|
||||
"ModelSwitchPanel.emptyProvider": "Няма активирани доставчици. Моля, отидете в настройките, за да активирате такъв.",
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
"config.model.label": "Модел",
|
||||
"config.prompt.placeholder": "Опишете какво искате да генерирате",
|
||||
"config.prompt.placeholderWithRef": "Опишете как искате да промените изображението",
|
||||
"config.promptExtend.label": "Разширяване на подсказката",
|
||||
"config.quality.label": "Качество на изображението",
|
||||
"config.quality.options.hd": "Висока резолюция",
|
||||
"config.quality.options.standard": "Стандартно",
|
||||
@@ -25,8 +24,6 @@
|
||||
"config.size.label": "Размер",
|
||||
"config.steps.label": "Стъпки",
|
||||
"config.title": "Конфигурация",
|
||||
"config.watermark.label": "Воден знак",
|
||||
"config.webSearch.label": "Уеб търсене",
|
||||
"config.width.label": "Ширина",
|
||||
"generation.actions.applySeed": "Приложи сийд",
|
||||
"generation.actions.copyError": "Копирай съобщението за грешка",
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
{
|
||||
"features.assistantMessageGroup.desc": "Групиране на съобщенията от агента и резултатите от извикванията на инструменти заедно за показване",
|
||||
"features.assistantMessageGroup.title": "Групиране на съобщения от агент",
|
||||
"features.gatewayMode.desc": "Изпълнявайте задачите на агента на сървъра чрез Gateway WebSocket вместо локално. Осигурява по-бързо изпълнение и намалява използването на ресурси от клиента.",
|
||||
"features.gatewayMode.title": "Изпълнение на агента от страна на сървъра (Gateway)",
|
||||
"features.groupChat.desc": "Активиране на координация в групов чат с множество агенти.",
|
||||
"features.groupChat.title": "Групов чат (многоагентен)",
|
||||
"features.inputMarkdown.desc": "Реално време визуализация на Markdown в полето за въвеждане (удебелен текст, кодови блокове, таблици и др.).",
|
||||
|
||||
+29
-29
@@ -20,7 +20,6 @@
|
||||
"Baichuan4-Turbo.description": "Водещ модел в Китай, надминаващ основни чуждестранни модели при китайски задачи като знания, дълги текстове и творческо генериране. Също така предлага водещи в индустрията мултимодални възможности с отлични резултати на авторитетни бенчмаркове.",
|
||||
"Baichuan4.description": "Водещо вътрешно представяне, надминаващо водещи чуждестранни модели при китайски задачи като енциклопедични знания, дълги текстове и творческо генериране. Също така предлага водещи в индустрията мултимодални възможности и силни резултати на бенчмаркове.",
|
||||
"ByteDance-Seed/Seed-OSS-36B-Instruct.description": "Seed-OSS е семейство от отворени LLM модели от ByteDance Seed, проектирани за силна обработка на дълъг контекст, логическо мислене, агентни и общи способности. Seed-OSS-36B-Instruct е 36B модел, настроен за инструкции, с вграден ултра-дълъг контекст за обработка на големи документи или кодови бази. Оптимизиран е за логическо мислене, генериране на код и агентни задачи (използване на инструменти), като същевременно запазва силни общи способности. Ключова характеристика е \"Бюджет за мислене\", позволяващ гъвкава дължина на разсъждение за подобрена ефективност.",
|
||||
"DeepSeek-OCR.description": "DeepSeek-OCR е мултимоделен модел на DeepSeek AI, фокусиран върху OCR и „контекстуална оптична компресия“. Той изследва техники за компресиране на контекст от изображения, обработва документи ефективно и ги преобразува в структуриран текст (например Markdown). Точно разпознава текст в изображения и е подходящ за дигитализация на документи, извличане на текст и структурирана обработка.",
|
||||
"DeepSeek-R1-Distill-Llama-70B.description": "DeepSeek R1, по-големият и по-интелигентен модел от серията DeepSeek, е дистилиран в архитектурата Llama 70B. Бенчмаркове и човешки оценки показват, че е по-умен от базовия Llama 70B, особено при задачи по математика и точност на фактите.",
|
||||
"DeepSeek-R1-Distill-Qwen-1.5B.description": "Дистилиран модел DeepSeek-R1, базиран на Qwen2.5-Math-1.5B. Подсилващо обучение и cold-start данни оптимизират логическата производителност, поставяйки нови мултизадачни бенчмаркове за отворени модели.",
|
||||
"DeepSeek-R1-Distill-Qwen-14B.description": "Моделите DeepSeek-R1-Distill са фино настроени от отворени модели с помощта на примерни данни, генерирани от DeepSeek-R1.",
|
||||
@@ -31,7 +30,6 @@
|
||||
"DeepSeek-V3-Fast.description": "Доставчик: sophnet. DeepSeek V3 Fast е високоскоростната версия на DeepSeek V3 0324, с пълна прецизност (без квантизация), по-силен при програмиране и математика и по-бързи отговори.",
|
||||
"DeepSeek-V3.1-Fast.description": "DeepSeek V3.1 Fast е високоскоростният вариант на DeepSeek V3.1. Хибриден режим на мислене: чрез шаблони за чат, един модел поддържа както мислещ, така и немислещ режим. По-умно използване на инструменти: оптимизации след обучение подобряват производителността при задачи с инструменти и агенти.",
|
||||
"DeepSeek-V3.1-Think.description": "Режим на мислене на DeepSeek-V3.1: нов хибриден модел за разсъждение с мислещ и немислещ режим, по-ефективен от DeepSeek-R1-0528. Оптимизациите след обучение значително подобряват използването на инструменти от агенти и производителността при агентни задачи.",
|
||||
"DeepSeek-V3.2.description": "deepseek-v3.2 въвежда механизъм за разредено внимание, който подобрява ефективността при обучение и инференция при обработка на дълги текстове, като е по-евтин от deepseek-v3.1.",
|
||||
"DeepSeek-V3.description": "DeepSeek-V3 е MoE модел, разработен от DeepSeek. Надминава други отворени модели като Qwen2.5-72B и Llama-3.1-405B в много бенчмаркове и е конкурентен с водещи затворени модели като GPT-4o и Claude 3.5 Sonnet.",
|
||||
"Doubao-lite-128k.description": "Doubao-lite предлага изключително бързи отговори и по-добра стойност, с гъвкави опции за различни сценарии. Поддържа 128K контекст за извеждане и фина настройка.",
|
||||
"Doubao-lite-32k.description": "Doubao-lite предлага изключително бързи отговори и по-добра стойност, с гъвкави опции за различни сценарии. Поддържа 32K контекст за извеждане и фина настройка.",
|
||||
@@ -59,9 +57,9 @@
|
||||
"GLM-4.5.description": "GLM-4.5: Високопроизводителен модел за разсъждения, програмиране и задачи с агенти.",
|
||||
"GLM-4.6.description": "GLM-4.6: Модел от предишно поколение.",
|
||||
"GLM-4.7.description": "GLM-4.7 е най-новият водещ модел на Zhipu, подобрен за сценарии на агентно програмиране с усъвършенствани възможности за кодиране, дългосрочно планиране на задачи и сътрудничество с инструменти.",
|
||||
"GLM-5-Turbo.description": "GLM-5-Turbo е базов модел, силно оптимизиран за агентни сценарии. Той е специално трениран за основните изисквания на агентните задачи, подобрявайки ключови способности като извикване на инструменти, следване на команди и изпълнение на дълги вериги от действия. Идеален е за изграждане на високопроизводителни агентни асистенти.",
|
||||
"GLM-5-Turbo.description": "GLM-5-Turbo: Оптимизирана версия на GLM-5 с по-бързо извеждане за задачи по програмиране.",
|
||||
"GLM-5.1.description": "GLM-5.1 е най-новият флагмански модел на Zhipu, подобрена версия на GLM-5 с усъвършенствани възможности за агентно инженерство за сложни системни инженерни задачи и задачи с дълъг хоризонт.",
|
||||
"GLM-5.description": "GLM-5 е следващото флагманско поколение базови модели на Zhipu, създадено за Agentic Engineering. Осигурява надеждна продуктивност при сложни системни разработки и дългосрочни агентни задачи. В кодирането и агентните способности GLM-5 постига водещи резултати сред отворените модели. В реални програмни сценарии потребителското му изживяване се доближава до това на Claude Opus 4.5. Отличава се при сложни системни инженерни задачи и дълги агентни процеси, което го прави идеална основа за универсални агентни асистенти.",
|
||||
"GLM-5.description": "GLM-5 е водещ модел от следващо поколение на Zhipu, създаден за агентно инженерство. Той осигурява надеждна продуктивност в сложни системни инженерни задачи и дългосрочни агентни задачи. В областта на програмирането и агентните способности GLM-5 постига най-добри резултати сред моделите с отворен код.",
|
||||
"Gryphe/MythoMax-L2-13b.description": "MythoMax-L2 (13B) е иновативен модел за разнообразни области и сложни задачи.",
|
||||
"HY-Image-V3.0.description": "Мощни възможности за извличане на характеристики от оригиналното изображение и запазване на детайлите, предоставящи по-богата визуална текстура и създаващи високоточни, добре композирани, продукционни визуализации.",
|
||||
"HelloMeme.description": "HelloMeme е AI инструмент, който генерира мемета, GIF-ове или кратки видеа от предоставени изображения или движения. Не изисква умения за рисуване или програмиране — само референтно изображение — за създаване на забавно, атрактивно и стилово консистентно съдържание.",
|
||||
@@ -74,11 +72,6 @@
|
||||
"InstantCharacter.description": "InstantCharacter е модел за персонализирано генериране на персонажи без нужда от настройка, пуснат от Tencent AI през 2025 г., насочен към висок реализъм и консистентност на персонажа в различни сценарии. Може да моделира персонаж от едно референтно изображение и гъвкаво да го прехвърля между стилове, действия и фонове.",
|
||||
"InternVL2-8B.description": "InternVL2-8B е мощен модел за визия и език, поддържащ мултимодална обработка на изображения и текст, с точно разпознаване на съдържание и генериране на съответни описания или отговори.",
|
||||
"InternVL2.5-26B.description": "InternVL2.5-26B е мощен модел за визия и език, поддържащ мултимодална обработка на изображения и текст, с точно разпознаване на съдържание и генериране на съответни описания или отговори.",
|
||||
"KAT-Coder-Air-V1.description": "Лек модел от серията KAT-Coder. Специално създаден за Agentic Coding, покрива широк спектър от програмни задачи и сценарии. Благодарение на мащабно обучение с подсилване върху агентни методи, развива интелигентно поведение и значително превъзхожда подобни модели в производителността при програмиране.",
|
||||
"KAT-Coder-Exp-72B-1010.description": "KAT-Coder-Exp-72B е експерименталната версия с RL иновации в серията KAT-Coder, постигайки забележителни 74.6% на бенчмарка SWE-Bench Verified — нов рекорд за отворени модели. Фокусира се върху Agentic Coding и към момента поддържа само SWE-Agent структурата, но може да се използва и за прости разговори.",
|
||||
"KAT-Coder-Pro-V1.description": "Създаден за Agentic Coding, покрива комплексно програмни задачи и сценарии, като постига интелигентно поведение чрез мащабно обучение с подсилване и значително превъзхожда сходни модели в производителността при писане на код.",
|
||||
"KAT-Coder-Pro-V2.description": "Най-новият високопроизводителен модел на екипа Kwaipilot на Kuaishou, създаден за сложни корпоративни проекти и SaaS интеграции. Отличава се в сценарии, свързани с код, и е съвместим с различни агентни рамки (Claude Code, OpenCode, KiloCode), поддържа OpenClaw нативно и е специално оптимизиран за естетика на фронт-енд страници.",
|
||||
"Kimi-K2.5.description": "Kimi K2.5 е най-способният модел от серията Kimi, постигащ водещи резултати при агентни задачи, програмиране и визуално разбиране. Поддържа мултимодални входове и режими с мислене и без мислене.",
|
||||
"Kolors.description": "Kolors е модел за преобразуване на текст в изображение, разработен от екипа на Kuaishou Kolors. Обучен с милиарди параметри, той има значителни предимства във визуалното качество, разбиране на китайски семантики и визуализиране на текст.",
|
||||
"Kwai-Kolors/Kolors.description": "Kolors е мащабен латентен дифузионен модел за преобразуване на текст в изображение от екипа на Kuaishou Kolors. Обучен върху милиарди двойки текст-изображение, той се отличава с високо визуално качество, точност при сложни семантики и визуализиране на китайски/английски текст, с отлично разбиране и генериране на китайско съдържание.",
|
||||
"Kwaipilot/KAT-Dev.description": "KAT-Dev (32B) е модел с отворен код за задачи в софтуерното инженерство. Постига 62.4% успеваемост в SWE-Bench Verified, класирайки се на 5-то място сред отворените модели. Оптимизиран чрез междинно обучение, SFT и RL за допълване на код, отстраняване на грешки и преглед на код.",
|
||||
@@ -97,18 +90,18 @@
|
||||
"Meta-Llama-3.2-3B-Instruct.description": "Модерен малък езиков модел с отлично езиково разбиране, логическо мислене и генериране на текст.",
|
||||
"Meta-Llama-3.3-70B-Instruct.description": "Llama 3.3 е най-усъвършенстваният многоезичен отворен модел от серията Llama, предлагащ производителност, близка до 405B, на много по-ниска цена. Базиран е на трансформерна архитектура и подобрен чрез SFT и RLHF за полезност и безопасност. Версията, обучена с инструкции, е оптимизирана за многоезичен чат и надминава много отворени и затворени модели на индустриални бенчмаркове. Граница на знанието: декември 2023 г.",
|
||||
"Meta-Llama-4-Maverick-17B-128E-Instruct-FP8.description": "Llama 4 Maverick е голям MoE модел с ефективна активация на експерти за силна логическа производителност.",
|
||||
"MiMo-V2-Pro.description": "MiMo-V2-Pro е специално създаден за високонатоварени агентни работни процеси в реални условия. Разполага с над 1 трилион параметъра (42B активирани), използва хибридна архитектура за внимание и поддържа ултра-дълъг контекст до 1 милион токена. Изграден върху мощен базов модел, той непрекъснато разширява изчислителните възможности за по-широк набор агентни сценарии, увеличава действията, които интелигентността може да изпълнява, и постига значима генерализация — от програмиране до изпълнение на реални задачи („claw“).",
|
||||
"MiniMax-Hailuo-02.description": "Моделът за видео генериране от следващо поколение, MiniMax Hailuo 02, е официално пуснат, поддържащ резолюция 1080P и генериране на видеа с продължителност 10 секунди.",
|
||||
"MiniMax-Hailuo-2.3-Fast.description": "Чисто нов модел за видео генериране с цялостни подобрения в движенията на тялото, физическата реалистичност и следването на инструкции.",
|
||||
"MiniMax-Hailuo-2.3.description": "Чисто нов модел за видео генериране с цялостни подобрения в движенията на тялото, физическата реалистичност и следването на инструкции.",
|
||||
"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-highspeed.description": "MiniMax M2.5 Highspeed: Същата производителност като M2.5, но с по-бързо извеждане.",
|
||||
"MiniMax-M2.5.description": "MiniMax-M2.5 е водещ модел с отворен код от MiniMax, фокусиран върху решаването на сложни реални задачи. Основните му предимства са мултиезиковите програмни възможности и способността да решава сложни задачи като агент.",
|
||||
"MiniMax-M2.7-highspeed.description": "MiniMax M2.7 Highspeed: Същата производителност като M2.7, но със значително по-бързо извеждане.",
|
||||
"MiniMax-M2.7.description": "Първият самоеволюиращ се модел с висок клас производителност при програмиране и агентни задачи (~60 tps).",
|
||||
"MiniMax-M2.7.description": "MiniMax M2.7: Начало на пътя към рекурсивно самоусъвършенстване, водещи инженерни способности в реалния свят.",
|
||||
"MiniMax-M2.description": "MiniMax M2: Модел от предишно поколение.",
|
||||
"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 е модел за хибридно внимание с отворени тегла, съдържащ 456 милиарда общи параметри и ~45.9 милиарда активни на токен. Той поддържа контекст от 1 милион токена и използва Flash Attention за намаляване на FLOPs с 75% при генериране на 100K токена спрямо DeepSeek R1. С архитектура MoE плюс CISPO и обучение с хибридно внимание RL, той постига водещи резултати в задачи за дългосрочно разсъждение и реално софтуерно инженерство.",
|
||||
@@ -136,7 +129,6 @@
|
||||
"Pro/moonshotai/Kimi-K2-Instruct-0905.description": "Kimi K2-Instruct-0905 е най-новият и най-мощен модел от серията Kimi K2. Това е MoE модел от най-висок клас с 1T общо и 32B активни параметъра. Основните му предимства включват по-силна агентна интелигентност при програмиране с значителни подобрения в бенчмаркове и реални задачи, както и подобрена естетика и използваемост на фронтенд кода.",
|
||||
"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-5.1.description": "GLM-5.1 е следващо поколение флагмански модел, създаден за агентно инженерство, използващ архитектура Mixture of Experts (MoE) с 754B параметъра. Значително подобрява програмните способности, постигайки водещи резултати на SWE-Bench Pro, и превъзхожда предшественика си на NL2Repo и Terminal-Bench 2.0. Създаден за дълги агентни процеси, обработва неясни въпроси с по-добра преценка, разбива сложни задачи, изпълнява експерименти, анализира резултати и оптимизира решенията чрез стотици итерации и хиляди извиквания на инструменти.",
|
||||
"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, фокусиран върху сложното системно инженерство и задачи на агенти с дълга продължителност. Параметрите на модела са разширени до 744 милиарда (40 милиарда активни) и интегрират DeepSeek Sparse Attention.",
|
||||
"QwQ-32B-Preview.description": "Qwen QwQ е експериментален изследователски модел, фокусиран върху подобряване на разсъждението.",
|
||||
@@ -197,7 +189,6 @@
|
||||
"Qwen3-235B-A22B-Instruct-2507-FP8.description": "Qwen3 235B A22B Instruct 2507 е оптимизиран за напреднало разсъждение и следване на инструкции, използвайки MoE за ефективно мащабиране на разсъждението.",
|
||||
"Qwen3-235B.description": "Qwen3-235B-A22B е MoE модел, който въвежда хибриден режим на разсъждение, позволяващ на потребителите да превключват безпроблемно между мислещ и немислещ режим. Поддържа разбиране и разсъждение на 119 езика и диалекта и има силни възможности за извикване на инструменти, конкурирайки се с водещи модели като DeepSeek R1, OpenAI o1, o3-mini, Grok 3 и Google Gemini 2.5 Pro в бенчмаркове за общи способности, програмиране и математика, многоезичност и логическо разсъждение.",
|
||||
"Qwen3-32B.description": "Qwen3-32B е плътен модел, който въвежда хибриден режим на разсъждение, позволяващ на потребителите да превключват между мислещ и немислещ режим. С архитектурни подобрения, повече данни и по-добро обучение, той се представя наравно с Qwen2.5-72B.",
|
||||
"Qwen3.5-Plus.description": "Qwen3.5 Plus поддържа текст, изображения и видео. Представянето му при чисто текстови задачи е сравнимо с Qwen3 Max, но е по-ефективно и по-евтино. Мултимодалните му способности са значително подобрени спрямо серията Qwen3 VL.",
|
||||
"S2V-01.description": "Основният модел за преобразуване на референция във видео от серията 01.",
|
||||
"SenseChat-128K.description": "Базов модел V4 с контекст от 128K, силен в разбиране и генериране на дълги текстове.",
|
||||
"SenseChat-32K.description": "Базов модел V4 с контекст от 32K, гъвкав за различни сценарии.",
|
||||
@@ -319,20 +310,20 @@
|
||||
"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-haiku-4-5-20251001.description": "Claude Haiku 4.5 е най-бързият и интелигентен модел Haiku на Anthropic, с мълниеносна скорост и разширено мислене.",
|
||||
"claude-haiku-4.5.description": "Claude Haiku 4.5 е най-бързият и най-умен Haiku модел на Anthropic, с мълниеносна скорост и разширено разсъждение.",
|
||||
"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-opus-4-6.description": "Claude Opus 4.6 е най-интелигентният модел на Anthropic за изграждане на агенти и програмиране.",
|
||||
"claude-opus-4.5.description": "Claude Opus 4.5 е водещият модел на Anthropic, съчетаващ първокласен интелект с мащабируемо представяне за сложни задачи с високо качество на разсъжденията.",
|
||||
"claude-opus-4.6-fast.description": "Claude Opus 4.6 е най-интелигентният модел на 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-6.description": "Claude Sonnet 4.6 предлага най-добрия баланс между скорост и интелигентност.",
|
||||
"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.5.description": "Claude Sonnet 4.5 е най-интелигентният модел на Anthropic до момента.",
|
||||
"claude-sonnet-4.6.description": "Claude Sonnet 4.6 е най-добрата комбинация от скорост и интелигентност на Anthropic.",
|
||||
"claude-sonnet-4.description": "Claude Sonnet 4 може да генерира почти мигновени отговори или разширено стъпка по стъпка разсъждение, което потребителите могат да видят. Потребителите на API могат фино да контролират колко дълго моделът разсъждава.",
|
||||
@@ -406,7 +397,7 @@
|
||||
"deepseek-ai/deepseek-v3.1-terminus.description": "DeepSeek V3.1 е модел за разсъждение от ново поколение с по-силни способности за сложни разсъждения и верига от мисли за задълбочени аналитични задачи.",
|
||||
"deepseek-ai/deepseek-v3.1.description": "DeepSeek V3.1 е модел за разсъждение от ново поколение с по-силни способности за сложни разсъждения и верига от мисли за задълбочени аналитични задачи.",
|
||||
"deepseek-ai/deepseek-v3.2.description": "DeepSeek V3.2 е модел за разсъждение от следващо поколение с по-силни способности за сложни разсъждения и верига на мисълта.",
|
||||
"deepseek-chat.description": "Нов модел с отворен код, комбиниращ общи и програмни способности. Запазва диалоговите възможности на чат моделите и силното програмиране на coder моделите, с по-добро съответствие на предпочитанията. 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.",
|
||||
@@ -429,7 +420,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 милиарда параметъра, с изключителни способности в програмиране, технически задачи, разбиране на контекст и обработка на дълги текстове.",
|
||||
@@ -532,7 +523,8 @@
|
||||
"ernie-x1-turbo-32k.description": "ERNIE X1 Turbo 32K е бърз мислещ модел с 32K контекст за сложни разсъждения и многозавойни разговори.",
|
||||
"ernie-x1.1-preview.description": "ERNIE X1.1 Preview е предварителен модел за мислене, предназначен за оценка и тестване.",
|
||||
"ernie-x1.1.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, създаден от 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] е модел за генериране на изображения с естетично предпочитание към по-реалистични и естествени изображения.",
|
||||
@@ -540,15 +532,17 @@
|
||||
"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-dev.description": "FLUX.1 [dev] е дестилиран модел с отворени тегла за нетърговска употреба. Запазва почти професионално качество на изображенията и следване на инструкции, като същевременно работи по-ефективно и използва ресурсите по-добре от стандартни модели със същия размер.",
|
||||
"flux-kontext-max.description": "Съвременно генериране и редактиране на изображения с контекст, комбиниращо текст и изображения за прецизни и последователни резултати.",
|
||||
"flux-kontext-pro.description": "Съвременно генериране и редактиране на изображения с контекст, комбиниращо текст и изображения за прецизни и последователни резултати.",
|
||||
"flux-merged.description": "FLUX.1 [обединен] комбинира дълбоките функции, изследвани в \"DEV\", с високоскоростните предимства на \"Schnell\", разширявайки границите на производителността и разширявайки приложенията.",
|
||||
"flux-pro-1.1-ultra.description": "Генериране на изображения с ултра висока резолюция и изход от 4MP, създаващ ясни изображения за 10 секунди.",
|
||||
"flux-pro-1.1.description": "Подобрен професионален модел за генериране на изображения с отлично качество и прецизно следване на подсказки.",
|
||||
"flux-pro.description": "Висококласен търговски модел за генериране на изображения с несравнимо качество и разнообразие на изхода.",
|
||||
"flux-schnell.description": "FLUX.1 [schnell] е най-усъвършенстваният отворен модел с малко стъпки, надминаващ подобни конкуренти и дори силни недестилирани модели като Midjourney v6.0 и DALL-E 3 (HD). Фино настроен е да запази разнообразието от предварително обучение, значително подобрявайки визуалното качество, следването на инструкции, вариациите в размер/съотношение, обработката на шрифтове и разнообразието на изхода.",
|
||||
"flux.1-schnell.description": "FLUX.1-schnell е високопроизводителен модел за генериране на изображения с бърз изход в различни стилове.",
|
||||
"gemini-1.0-pro-001.description": "Gemini 1.0 Pro 001 (Tuning) осигурява стабилна и настройваема производителност за комплексни задачи.",
|
||||
"gemini-1.0-pro-002.description": "Gemini 1.0 Pro 002 (Tuning) предлага силна мултимодална поддръжка за комплексни задачи.",
|
||||
@@ -581,10 +575,10 @@
|
||||
"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 Image (Nano 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-3.1-flash-image-preview.description": "Gemini 3.1 Flash Image (Nano Banana 2) е най-бързият модел на Google за генериране на изображения с поддръжка на мислене, разговорно генериране и редактиране на изображения.",
|
||||
"gemini-3.1-flash-image-preview:image.description": "Gemini 3.1 Flash Image (Nano Banana 2) е най-бързият нативен модел на Google за генериране на изображения, с поддръжка на мислене, разговорно генериране и редактиране на изображения.",
|
||||
"gemini-3.1-flash-image-preview:image.description": "Gemini 3.1 Flash Image (Nano Banana 2) предлага качество на изображения от професионално ниво с Flash скорост и поддръжка на мултимодален чат.",
|
||||
"gemini-3.1-flash-lite-preview.description": "Gemini 3.1 Flash-Lite Preview е най-икономичният мултимодален модел на Google, оптимизиран за задачи с голям обем, превод и обработка на данни.",
|
||||
"gemini-3.1-pro-preview.description": "Gemini 3.1 Pro Preview подобрява Gemini 3 Pro с усъвършенствани способности за разсъждение и добавя поддръжка за средно ниво на мислене.",
|
||||
"gemini-flash-latest.description": "Най-новата версия на Gemini Flash",
|
||||
@@ -812,6 +806,7 @@
|
||||
"jamba-large.description": "Нашият най-мощен и напреднал модел, създаден за комплексни корпоративни задачи с изключителна производителност.",
|
||||
"jamba-mini.description": "Най-ефективният модел в своя клас, балансиращ скорост и качество с малък отпечатък.",
|
||||
"jina-deepsearch-v1.description": "DeepSearch комбинира уеб търсене, четене и разсъждение за задълбочени изследвания. Представете си го като агент, който поема вашата изследователска задача, извършва широки търсения с множество итерации и едва след това предоставя отговор. Процесът включва непрекъснато проучване, разсъждение и многопластово решаване на проблеми, коренно различен от стандартните LLM, които отговарят въз основа на предварително обучение или традиционни RAG системи, разчитащи на еднократно повърхностно търсене.",
|
||||
"k2p5.description": "Kimi K2.5 е най-гъвкавият модел на Kimi досега, с вградена мултимодална архитектура, която поддържа както визуални, така и текстови входове, режими на 'мислене' и 'немислене', както и както разговорни, така и агентски задачи.",
|
||||
"kimi-k2-0711-preview.description": "kimi-k2 е MoE базов модел с мощни способности за програмиране и агентни задачи (1T общи параметри, 32B активни), надминаващ други водещи отворени модели в области като разсъждение, програмиране, математика и агентни бенчмаркове.",
|
||||
"kimi-k2-0905-preview.description": "kimi-k2-0905-preview предлага прозорец на контекста от 256k, по-силно агентно програмиране, по-добро качество на front-end код и подобрено разбиране на контекста.",
|
||||
"kimi-k2-instruct.description": "Kimi K2 Instruct е официалният модел за разсъждение на Kimi с дълъг контекст за код, въпроси и отговори и други.",
|
||||
@@ -1239,6 +1234,8 @@
|
||||
"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 поддържа преобразуване на текст във видео, изображение във видео (първи кадър, първи+последен кадър) и генериране на аудио, синхронизирано с визуализациите.",
|
||||
"seedream-5-0-260128.description": "ByteDance-Seedream-5.0-lite от BytePlus предлага генериране, обогатено с уеб извличане за реална информация, подобрена интерпретация на сложни подсказки и подобрена консистентност на референциите за професионално визуално създаване.",
|
||||
"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 с разширена езикова поддръжка и по-дълъг контекст.",
|
||||
@@ -1252,8 +1249,11 @@
|
||||
"sora-2.description": "Sora 2 е нашият нов мощен модел за генериране на медии, генериращ видеа със синхронизиран звук. Той може да създава богато детайлизирани, динамични клипове от естествен език или изображения.",
|
||||
"spark-x.description": "Преглед на възможностите на X2: 1. Въвежда динамично регулиране на режима на разсъждение, контролирано чрез полето `thinking`. 2. Разширена дължина на контекста: 64K входни токени и 128K изходни токени. 3. Поддържа функционалност за извикване на функции.",
|
||||
"stable-diffusion-3-medium.description": "Най-новият модел за преобразуване на текст в изображение от Stability AI. Тази версия значително подобрява качеството на изображенията, разбирането на текст и стиловото разнообразие, като по-точно интерпретира сложни естественоезикови заявки и генерира по-прецизни и разнообразни изображения.",
|
||||
"stable-diffusion-3.5-large-turbo.description": "Stable Diffusion 3.5 Large Turbo е фокусиран върху висококачествено генериране на изображения с отлична детайлност и вярност на сцените.",
|
||||
"stable-diffusion-3.5-large-turbo.description": "stable-diffusion-3.5-large-turbo използва adversarial diffusion distillation (ADD) върху stable-diffusion-3.5-large за по-висока скорост.",
|
||||
"stable-diffusion-3.5-large.description": "stable-diffusion-3.5-large е текст-към-изображение модел MMDiT с 800 милиона параметъра, предлагащ отлично качество и съответствие с подадените инструкции, поддържащ изображения с резолюция 1 мегапиксел и ефективна работа на потребителски хардуер.",
|
||||
"stable-diffusion-v1.5.description": "stable-diffusion-v1.5 е инициализиран от контролна точка v1.2 и фино настроен за 595 хиляди стъпки върху „laion-aesthetics v2 5+“ при резолюция 512x512, като намалява влиянието на текстовото условие с 10% за подобрено семплиране без класификатор.",
|
||||
"stable-diffusion-xl-base-1.0.description": "Модел с отворен код за генериране на изображения от текст от Stability AI, предлагащ водещо в индустрията творческо качество. Притежава силно разбиране на инструкции и поддържа обратни дефиниции на подканите за прецизно генериране.",
|
||||
"stable-diffusion-xl.description": "stable-diffusion-xl предлага значителни подобрения спрямо v1.5 и съответства на водещите отворени модели за генериране на изображения от текст. Подобренията включват 3 пъти по-голям UNet гръбнак, модул за прецизиране за по-добро качество на изображенията и по-ефективни техники на обучение.",
|
||||
"step-1-128k.description": "Баланс между производителност и разходи за общи сценарии.",
|
||||
"step-1-256k.description": "Обработка на изключително дълъг контекст, идеална за анализ на дълги документи.",
|
||||
"step-1-32k.description": "Поддържа разговори със средна дължина за широк спектър от приложения.",
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
{
|
||||
"agent.banner.label": "Въвеждане на агент",
|
||||
"agent.completion.sentence.readyWhenYouAre": "На разположение съм, когато сте готови :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} тук — готов/а!",
|
||||
"agent.completionSubtitle": "Всичко е на място — нека започнем, когато си готов.",
|
||||
"agent.completionTitle": "Почти сте готови",
|
||||
"agent.enterApp": "Готов съм",
|
||||
"agent.completionSubtitle": "Вашият асистент е конфигуриран и готов за работа.",
|
||||
"agent.completionTitle": "Всичко е готово!",
|
||||
"agent.enterApp": "Влезте в приложението",
|
||||
"agent.greeting.emojiLabel": "Емоджи",
|
||||
"agent.greeting.nameLabel": "Име",
|
||||
"agent.greeting.namePlaceholder": "напр. Луми, Атлас, Неко...",
|
||||
@@ -13,19 +11,13 @@
|
||||
"agent.greeting.vibePlaceholder": "напр. Топло и приятелско, Остро и директно...",
|
||||
"agent.history.current": "Текущо",
|
||||
"agent.history.title": "История на темите",
|
||||
"agent.layout.mode.agent": "Агентски режим",
|
||||
"agent.layout.mode.classic": "Класически режим",
|
||||
"agent.layout.skip": "Пропуснете тази стъпка",
|
||||
"agent.layout.skipConfirm.content": "Вече ли тръгвате? Мога за секунди да ви помогна да персонализирате нещата.",
|
||||
"agent.layout.skipConfirm.ok": "Пропуснете засега",
|
||||
"agent.layout.skipConfirm.title": "Да пропуснете въвеждането засега?",
|
||||
"agent.layout.switchMessage": "Не сте в настроение днес? Можете да преминете в <modeLink><modeText>{{mode}}</modeText></modeLink> или да <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Разговорен",
|
||||
"agent.modeSwitch.classic": "Класически",
|
||||
"agent.modeSwitch.debug": "Експорт за отстраняване на грешки",
|
||||
"agent.modeSwitch.label": "Изберете режим за въвеждане",
|
||||
"agent.modeSwitch.reset": "Нулиране на процеса",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Пропуснете въвеждането",
|
||||
"agent.stage.agentIdentity": "Идентичност на агента",
|
||||
"agent.stage.painPoints": "Трудности",
|
||||
"agent.stage.proSettings": "Разширени настройки",
|
||||
@@ -41,16 +33,6 @@
|
||||
"agent.telemetryHint": "Можете също да отговорите със свои думи.",
|
||||
"agent.title": "Разговорно въвеждане",
|
||||
"agent.welcome": "...хм? Току-що се събудих — умът ми е празен. Кой сте вие? И — какво име да ми дадете? Имам нужда и от име.",
|
||||
"agent.welcome.footer": "Настройте своя Lobe AI агент. Той работи на вашия сървър, учи се от всяко взаимодействие и става по-мощен, колкото по-дълго работи.",
|
||||
"agent.welcome.guide.growTogether.desc": "С всяка беседа ще те опознавам по-добре и с времето ще ставам все по-надежден партньор.",
|
||||
"agent.welcome.guide.growTogether.title": "Растем заедно",
|
||||
"agent.welcome.guide.knowYou.desc": "Какво имаш за вършене напоследък? Малко контекст ще ми помогне да те подкрепя по-добре.",
|
||||
"agent.welcome.guide.knowYou.title": "Да те опозная",
|
||||
"agent.welcome.guide.name.desc": "Дай ми име, за да звучи по-лично от самото начало.",
|
||||
"agent.welcome.guide.name.title": "Дай ми име",
|
||||
"agent.welcome.sentence.1": "Радвам се да се запознаем! Нека се опознаем по-добре.",
|
||||
"agent.welcome.sentence.2": "Какъв тип партньор искаш да бъда?",
|
||||
"agent.welcome.sentence.3": "Първо, дай ми име :)",
|
||||
"back": "Назад",
|
||||
"finish": "Да започнем",
|
||||
"interests.area.business": "Бизнес и стратегия",
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"arguments.moreParams": "{{count}} параметъра общо",
|
||||
"arguments.title": "Аргументи",
|
||||
"builtins.lobe-activator.apiName.activateTools": "Активиране на инструменти",
|
||||
"builtins.lobe-activator.inspector.activateTools.notFoundCount": "{{count}} не са намерени",
|
||||
"builtins.lobe-agent-builder.apiName.getAvailableModels": "Извличане на налични модели",
|
||||
"builtins.lobe-agent-builder.apiName.getAvailableTools": "Извличане на налични умения",
|
||||
"builtins.lobe-agent-builder.apiName.getConfig": "Извличане на конфигурация",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"jina.description": "Основана през 2020 г., Jina AI е водеща компания в областта на търсещия AI. Технологичният ѝ стек включва векторни модели, преоценители и малки езикови модели за създаване на надеждни генеративни и мултимодални търсещи приложения.",
|
||||
"kimicodingplan.description": "Kimi Code от Moonshot AI предоставя достъп до модели Kimi, включително K2.5, за задачи, свързани с програмиране.",
|
||||
"lmstudio.description": "LM Studio е десктоп приложение за разработка и експериментиране с LLM на вашия компютър.",
|
||||
"lobehub.description": "LobeHub Cloud използва официални API за достъп до AI модели и измерва използването с Кредити, свързани с токени на модела.",
|
||||
"longcat.description": "LongCat е серия от големи модели за генеративен AI, независимо разработени от Meituan. Той е създаден да подобри вътрешната продуктивност на предприятието и да позволи иновативни приложения чрез ефективна изчислителна архитектура и силни мултимодални възможности.",
|
||||
"minimax.description": "Основана през 2021 г., MiniMax създава универсален AI с мултимодални базови модели, включително текстови модели с трилиони параметри, речеви и визуални модели, както и приложения като Hailuo AI.",
|
||||
"minimaxcodingplan.description": "MiniMax Token Plan предоставя достъп до модели MiniMax, включително M2.7, за задачи, свързани с програмиране, чрез абонамент с фиксирана такса.",
|
||||
@@ -59,7 +60,6 @@
|
||||
"spark.description": "iFLYTEK Spark предоставя мощен многоезичен AI в различни области, позволявайки иновации в умния хардуер, здравеопазването, финансите и други вертикали.",
|
||||
"stepfun.description": "Моделите на Stepfun предлагат водещи мултимодални и сложни разсъждателни възможности, с разбиране на дълъг контекст и мощна автономна координация на търсене.",
|
||||
"straico.description": "Straico опростява интеграцията на изкуствения интелект, като предоставя унифицирано работно пространство, което обединява водещи модели за генериране на текст, изображения и аудио, давайки възможност на маркетолози, предприемачи и ентусиасти за лесен достъп до разнообразни AI инструменти.",
|
||||
"streamlake.description": "StreamLake е корпоративна платформа за модели и AI изчислителен облак, която обединява високопроизводителна инференция на модели, нискобюджетна персонализация на модели и напълно управлявани услуги, за да помогне на предприятията да се съсредоточат върху иновациите в AI приложенията, без да се притесняват за сложността и разходите на базовите изчислителни ресурси.",
|
||||
"taichu.description": "Модел от ново поколение от CASIA и Института по AI в Ухан, поддържащ многократни въпроси и отговори, писане, генериране на изображения, 3D разбиране и анализ на сигнали с по-силна когниция и креативност.",
|
||||
"tencentcloud.description": "LLM Knowledge Engine Atomic Power предоставя цялостни решения за въпроси и отговори за предприятия и разработчици, с модулни услуги като анализ на документи, сегментиране, вграждания и многократна пренаписка за изграждане на персонализирани AI решения.",
|
||||
"togetherai.description": "Together AI предлага водеща производителност с иновативни модели, широка персонализация, бързо мащабиране и лесно внедряване за нуждите на предприятията.",
|
||||
|
||||
@@ -657,6 +657,7 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Версия на рамката Electron",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Вградена версия на Node.js",
|
||||
"settingSystemTools.appEnvironment.title": "Среда на приложението",
|
||||
"settingSystemTools.autoSelectDesc": "Най-добрият наличен инструмент ще бъде избран автоматично",
|
||||
"settingSystemTools.category.browserAutomation": "Автоматизация на браузъра",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Инструменти за автоматизация на браузъра без графичен интерфейс и уеб взаимодействие",
|
||||
"settingSystemTools.category.contentSearch": "Търсене в съдържание",
|
||||
@@ -673,19 +674,14 @@
|
||||
"settingSystemTools.title": "Системни инструменти",
|
||||
"settingSystemTools.tools.ag.desc": "The Silver Searcher - бърз инструмент за търсене в код",
|
||||
"settingSystemTools.tools.agentBrowser.desc": "Agent-browser - CLI за автоматизация на браузъра без графичен интерфейс за AI агенти",
|
||||
"settingSystemTools.tools.bun.desc": "Bun – бърза JavaScript среда за изпълнение и мениджър на пакети",
|
||||
"settingSystemTools.tools.bunx.desc": "bunx – инструмент на Bun за изпълнение на npm пакети",
|
||||
"settingSystemTools.tools.fd.desc": "fd - бърза и удобна алтернатива на find",
|
||||
"settingSystemTools.tools.find.desc": "Unix find - стандартна команда за търсене на файлове",
|
||||
"settingSystemTools.tools.grep.desc": "GNU grep - стандартен инструмент за търсене в текст",
|
||||
"settingSystemTools.tools.lobehub.desc": "LobeHub CLI – управлявайте и свързвайте услуги на LobeHub",
|
||||
"settingSystemTools.tools.mdfind.desc": "macOS Spotlight търсене (бързо индексирано търсене)",
|
||||
"settingSystemTools.tools.node.desc": "Node.js - JavaScript среда за изпълнение за JS/TS",
|
||||
"settingSystemTools.tools.npm.desc": "npm - мениджър на пакети Node.js за инсталиране на зависимости",
|
||||
"settingSystemTools.tools.pnpm.desc": "pnpm – бърз и ефективен по отношение на дисковото пространство мениджър на пакети",
|
||||
"settingSystemTools.tools.python.desc": "Python - среда за изпълнение на езика за програмиране",
|
||||
"settingSystemTools.tools.rg.desc": "ripgrep - изключително бърз инструмент за търсене в текст",
|
||||
"settingSystemTools.tools.uv.desc": "uv – изключително бърз мениджър на Python пакети",
|
||||
"settingTTS.openai.sttModel": "OpenAI модел за разпознаване на реч",
|
||||
"settingTTS.openai.title": "OpenAI",
|
||||
"settingTTS.openai.ttsModel": "OpenAI модел за преобразуване на текст в реч",
|
||||
@@ -782,9 +778,6 @@
|
||||
"systemAgent.inputCompletion.label": "Модел",
|
||||
"systemAgent.inputCompletion.modelDesc": "Модел, използван за предложения за автоматично довършване на въвеждане (като призрачния текст на GitHub Copilot)",
|
||||
"systemAgent.inputCompletion.title": "Агент за автоматично довършване на въвеждане",
|
||||
"systemAgent.promptRewrite.label": "Модел",
|
||||
"systemAgent.promptRewrite.modelDesc": "Определете модела, използван за пренаписване на подсказки",
|
||||
"systemAgent.promptRewrite.title": "Агент за пренаписване на подсказки",
|
||||
"systemAgent.queryRewrite.label": "Модел",
|
||||
"systemAgent.queryRewrite.modelDesc": "Посочете модел за оптимизиране на потребителски заявки",
|
||||
"systemAgent.queryRewrite.title": "Агент за пренаписване на заявки в библиотеката",
|
||||
@@ -851,83 +844,31 @@
|
||||
"tab.uploadZip.desc": "Качване на локален .zip или .skill файл",
|
||||
"tab.usage": "Статистика на използване",
|
||||
"tools.add": "Добави умение",
|
||||
"tools.builtins.find-skills.description": "Помага на потребителите да откриват и инсталират умения за агенти, когато питат „как да направя X“, „намери умение за X“ или когато искат да разширят възможностите",
|
||||
"tools.builtins.find-skills.title": "Намиране на умения",
|
||||
"tools.builtins.groupName": "Вградени",
|
||||
"tools.builtins.install": "Инсталирай",
|
||||
"tools.builtins.installed": "Инсталирано",
|
||||
"tools.builtins.lobe-activator.description": "Откриване и активиране на инструменти и умения",
|
||||
"tools.builtins.lobe-activator.title": "Активатор на инструменти и умения",
|
||||
"tools.builtins.lobe-agent-browser.description": "CLI за автоматизация на браузър за AI агенти. Използва се при задачи, включващи уебсайтове или Electron – навигация, попълване на формуляри, кликване, заснемане на екрана, извличане на данни, логин процеси и end-to-end тестване.",
|
||||
"tools.builtins.lobe-agent-browser.title": "Браузър за агенти",
|
||||
"tools.builtins.lobe-agent-builder.description": "Конфигурирайте метаданни на агента, настройки на модела, плъгини и системната подсказка",
|
||||
"tools.builtins.lobe-agent-builder.title": "Създател на агенти",
|
||||
"tools.builtins.lobe-agent-documents.description": "Управление на документи в обхвата на агента (списък, създаване, четене, редактиране, премахване, преименуване) и правила за зареждане",
|
||||
"tools.builtins.lobe-agent-documents.title": "Документи",
|
||||
"tools.builtins.lobe-agent-management.description": "Създаване, управление и оркестриране на AI агенти",
|
||||
"tools.builtins.lobe-agent-management.title": "Управление на агенти",
|
||||
"tools.builtins.lobe-artifacts.description": "Генерирайте и визуализирайте интерактивни UI компоненти, визуализации на данни, диаграми, SVG графики и уеб приложения в реално време. Създавайте богато визуално съдържание, с което потребителите могат директно да взаимодействат.",
|
||||
"tools.builtins.lobe-artifacts.readme": "Генерирайте и визуализирайте интерактивни UI компоненти, визуализации на данни, диаграми, SVG графики и уеб приложения в реално време. Създавайте богато визуално съдържание, с което потребителите могат директно да взаимодействат.",
|
||||
"tools.builtins.lobe-artifacts.title": "Артефакти",
|
||||
"tools.builtins.lobe-brief.description": "Докладване на напредък, предоставяне на резултати и заявка за решения от потребителя",
|
||||
"tools.builtins.lobe-brief.title": "Инструменти за отчети",
|
||||
"tools.builtins.lobe-calculator.description": "Извършвайте математически изчисления, решавайте уравнения и работете със символни изрази",
|
||||
"tools.builtins.lobe-calculator.readme": "Разширен математически калкулатор, поддържащ основна аритметика, алгебрични уравнения, операции с калкулус и символна математика. Включва преобразуване на бази, решаване на уравнения, диференциране, интегриране и други.",
|
||||
"tools.builtins.lobe-calculator.title": "Калкулатор",
|
||||
"tools.builtins.lobe-cloud-sandbox.description": "Изпълнявайте код на Python, JavaScript и TypeScript в изолирана облачна среда. Стартирайте shell команди, управлявайте файлове, търсете съдържание с regex и експортирайте резултати сигурно.",
|
||||
"tools.builtins.lobe-cloud-sandbox.readme": "Изпълнявайте код на Python, JavaScript и TypeScript в изолирана облачна среда. Стартирайте shell команди, управлявайте файлове, търсете съдържание с regex и експортирайте резултати сигурно.",
|
||||
"tools.builtins.lobe-cloud-sandbox.title": "Облачна пясъчник среда",
|
||||
"tools.builtins.lobe-creds.description": "Управление на потребителски идентификационни данни за автентикация, задаване на променливи на средата и API проверка — управление на API ключове, OAuth токени и тайни за интеграции на трети страни.",
|
||||
"tools.builtins.lobe-creds.title": "Идентификационни данни",
|
||||
"tools.builtins.lobe-cron.description": "Управление на планирани задачи, които се изпълняват автоматично в определени моменти. Създаване, актуализиране, активиране/деактивиране и наблюдение на повтарящи се задачи.",
|
||||
"tools.builtins.lobe-cron.title": "Планирани задачи",
|
||||
"tools.builtins.lobe-group-agent-builder.description": "Конфигурирайте метаданни на групи, членове и споделено съдържание за групи с множество агенти",
|
||||
"tools.builtins.lobe-group-agent-builder.title": "Създател на групови агенти",
|
||||
"tools.builtins.lobe-group-management.description": "Оркестрирайте и управлявайте разговори в групи от агенти",
|
||||
"tools.builtins.lobe-group-management.title": "Групово управление",
|
||||
"tools.builtins.lobe-gtd.description": "Планирайте цели и следете напредъка с помощта на методологията GTD. Създавайте стратегически планове, управлявайте списъци със задачи със следене на статус и изпълнявайте дълготрайни асинхронни задачи.",
|
||||
"tools.builtins.lobe-gtd.readme": "Планирайте цели и следете напредъка си с помощта на методологията GTD. Създавайте стратегически планове, управлявайте списъци със задачи със следене на статус и изпълнявайте дълготрайни асинхронни задачи.",
|
||||
"tools.builtins.lobe-gtd.title": "GTD Инструменти",
|
||||
"tools.builtins.lobe-knowledge-base.description": "Търсене в качени документи и специализирани знания чрез семантично векторно търсене — за постоянно и многократно използване",
|
||||
"tools.builtins.lobe-knowledge-base.title": "База знания",
|
||||
"tools.builtins.lobe-local-system.description": "Достъп до локалната файлова система на настолния компютър. Четете, записвайте, търсете и организирайте файлове. Изпълнявайте shell команди с поддръжка на фонови задачи и търсете съдържание с regex шаблони.",
|
||||
"tools.builtins.lobe-local-system.readme": "Достъп до локалната файлова система на вашия компютър. Четете, записвайте, търсете и организирайте файлове. Изпълнявайте shell команди с поддръжка на фонови задачи и търсете съдържание с regex шаблони.",
|
||||
"tools.builtins.lobe-local-system.title": "Локална система",
|
||||
"tools.builtins.lobe-message.description": "Изпращане, четене, редактиране и управление на съобщения в множество платформи чрез обединен интерфейс",
|
||||
"tools.builtins.lobe-message.readme": "Инструмент за съобщения с поддръжка на Discord, Telegram, Slack, Google Chat и IRC. Осигурява унифицирани API за операции със съобщения, реакции, закачане, нишки, управление на канали и специфични функции като анкети.",
|
||||
"tools.builtins.lobe-message.title": "Съобщения",
|
||||
"tools.builtins.lobe-notebook.description": "Създавайте и управлявайте постоянни документи в рамките на разговорни теми. Запазвайте бележки, доклади, статии и markdown съдържание, достъпно през различни сесии.",
|
||||
"tools.builtins.lobe-notebook.readme": "Създавайте и управлявайте постоянни документи в рамките на разговорни теми. Запазвайте бележки, доклади, статии и markdown съдържание, достъпно през различни сесии.",
|
||||
"tools.builtins.lobe-notebook.title": "Бележник",
|
||||
"tools.builtins.lobe-page-agent.description": "Създаване, четене, актуализиране и изтриване на възли в XML-структурирани документи",
|
||||
"tools.builtins.lobe-page-agent.readme": "Създавайте и редактирайте структурирани документи с прецизен контрол на ниво възел. Инициализирайте от Markdown, извършвайте групово вмъкване/промяна/премахване и търсене и замяна на текст.",
|
||||
"tools.builtins.lobe-page-agent.title": "Документ",
|
||||
"tools.builtins.lobe-remote-device.description": "Откриване и управление на връзки към отдалечени настолни устройства",
|
||||
"tools.builtins.lobe-remote-device.readme": "Управлявайте връзки към настолните си устройства. Преглеждайте онлайн устройства, активирайте устройство за дистанционни операции и проверявайте състоянието на връзката.",
|
||||
"tools.builtins.lobe-remote-device.title": "Отдалечено устройство",
|
||||
"tools.builtins.lobe-skill-store.description": "Разглеждайте и инсталирайте умения за агенти от LobeHub Marketplace. Използвайте, когато имате нужда от разширени възможности или искате да инсталирате конкретно умение.",
|
||||
"tools.builtins.lobe-skill-store.title": "Магазин за умения",
|
||||
"tools.builtins.lobe-skills.description": "Активирайте и използвайте многократни пакети с умения",
|
||||
"tools.builtins.lobe-skills.title": "Умения",
|
||||
"tools.builtins.lobe-task.description": "Създаване, изброяване, редактиране и изтриване на задачи с зависимости и настройки за преглед",
|
||||
"tools.builtins.lobe-task.title": "Инструменти за задачи",
|
||||
"tools.builtins.lobe-topic-reference.description": "Извличане на контекст от свързани тематични разговори",
|
||||
"tools.builtins.lobe-topic-reference.title": "Тематична препратка",
|
||||
"tools.builtins.lobe-user-interaction.description": "Задаване на въпроси на потребителите чрез UI взаимодействия и проследяване на техните резултати",
|
||||
"tools.builtins.lobe-user-interaction.title": "Взаимодействие с потребителя",
|
||||
"tools.builtins.lobe-user-memory.description": "Изградете персонализирана база знания за вас. Запомняйте предпочитания, следете дейности и преживявания, съхранявайте информация за идентичност и извличайте релевантен контекст в бъдещи разговори.",
|
||||
"tools.builtins.lobe-user-memory.readme": "Изградете персонализирана база знания за себе си. Запомняйте предпочитания, следете дейности и преживявания, съхранявайте информация за идентичност и извличайте релевантен контекст в бъдещи разговори.",
|
||||
"tools.builtins.lobe-user-memory.title": "Памет",
|
||||
"tools.builtins.lobe-web-browsing.description": "Търсене в уеб пространството за актуална информация и обхождане на страници за извличане на съдържание. Поддържа множество търсачки, категории и времеви диапазони.",
|
||||
"tools.builtins.lobe-web-browsing.readme": "Търсете актуална информация в мрежата и обхождайте уеб страници за извличане на съдържание. Поддръжка на множество търсачки, категории и времеви диапазони за цялостно изследване.",
|
||||
"tools.builtins.lobe-web-browsing.title": "Уеб търсене",
|
||||
"tools.builtins.lobe-web-onboarding.description": "Управлявайте процеса на уеб onboarding с контролиран агентски runtime",
|
||||
"tools.builtins.lobe-web-onboarding.title": "Уеб въведение",
|
||||
"tools.builtins.lobehub.description": "Управление на платформата LobeHub чрез CLI — бази знания, памет, агенти, файлове, търсене, генериране и други.",
|
||||
"tools.builtins.lobehub.title": "LobeHub",
|
||||
"tools.builtins.notInstalled": "Не е инсталирано",
|
||||
"tools.builtins.task.description": "Управление и изпълнение на задачи — създаване, проследяване, преглед и завършване на задачи чрез CLI.",
|
||||
"tools.builtins.task.title": "Задача",
|
||||
"tools.builtins.uninstall": "Деинсталирай",
|
||||
"tools.builtins.uninstallConfirm.desc": "Сигурни ли сте, че искате да деинсталирате {{name}}? Това умение ще бъде премахнато от текущия агент.",
|
||||
"tools.builtins.uninstallConfirm.title": "Деинсталиране на {{name}}",
|
||||
@@ -1009,16 +950,12 @@
|
||||
"tools.lobehubSkill.disconnectConfirm.title": "Прекъсване на връзката с {{name}}?",
|
||||
"tools.lobehubSkill.disconnected": "Изключено",
|
||||
"tools.lobehubSkill.error": "Грешка",
|
||||
"tools.lobehubSkill.providers.github.description": "GitHub е платформа за контрол на версиите и сътрудничество, позволяваща на разработчиците да хостват, преглеждат и управляват кодови хранилища.",
|
||||
"tools.lobehubSkill.providers.github.readme": "Свържете се с GitHub, за да имате достъп до хранилищата си, да създавате и управлявате задачи (issues), да преглеждате pull заявки и да си сътрудничите по код — всичко това чрез естествен разговор с вашия AI асистент.",
|
||||
"tools.lobehubSkill.providers.linear.description": "Linear е модерен инструмент за проследяване на проблеми и управление на проекти, създаден за високоефективни екипи, които искат да създават по-добър софтуер по-бързо",
|
||||
"tools.lobehubSkill.providers.linear.readme": "Използвайте възможностите на Linear директно чрез вашия AI асистент. Създавайте и актуализирайте задачи, управлявайте спринтове, следете напредъка на проекти и оптимизирайте работния си процес чрез естествен разговор.",
|
||||
"tools.lobehubSkill.providers.microsoft.description": "Outlook Calendar е интегриран инструмент за планиране в Microsoft Outlook, който позволява на потребителите да създават срещи, организират събития и управляват времето си ефективно.",
|
||||
"tools.lobehubSkill.providers.microsoft.readme": "Интегрирайте се с Outlook Calendar за лесно преглеждане, създаване и управление на събития. Насрочвайте срещи, проверявайте наличност, задавайте напомняния и координирайте времето си чрез естествени езикови команди.",
|
||||
"tools.lobehubSkill.providers.twitter.description": "X (Twitter) е социална медийна платформа за споделяне на актуални новини, ангажиране с аудиторията чрез публикации, отговори и директни съобщения.",
|
||||
"tools.lobehubSkill.providers.twitter.readme": "Свържете се с X (Twitter), за да публикувате туитове, управлявате времевата си линия и взаимодействате с аудиторията си. Създавайте съдържание, планирайте публикации, следете споменавания и изграждайте присъствие в социалните мрежи чрез разговорен AI.",
|
||||
"tools.lobehubSkill.providers.vercel.description": "Vercel е облачна платформа за фронтенд разработчици, предоставяща хостинг и serverless функции за лесно разгръщане на уеб приложения.",
|
||||
"tools.lobehubSkill.providers.vercel.readme": "Свържете се с Vercel, за да управлявате разгръщанията си, да наблюдавате състоянието на проектите и да контролирате инфраструктурата си. Разгръщайте приложения, преглеждайте build логове, управлявайте променливи на средата и мащабирайте проекти чрез разговорен AI.",
|
||||
"tools.notInstalled": "Не е инсталирано",
|
||||
"tools.notInstalledWarning": "Това умение не е инсталирано в момента, което може да повлияе на функционалността на агента.",
|
||||
"tools.plugins.enabled": "Активирани: {{num}}",
|
||||
|
||||
@@ -97,9 +97,6 @@
|
||||
"credits.topUp.upgradePrefix": "Надстрой до",
|
||||
"credits.topUp.upgradeSuffix": "за да спестиш ${{savings}}",
|
||||
"credits.topUp.validityInfo": "Валидност: {{months}} месеца",
|
||||
"crossPlatform.desc": "Този абонамент е закупен чрез мобилното приложение и не може да бъде променен тук. Моля, управлявайте абонамента си на мобилното устройство.",
|
||||
"crossPlatform.manageOnMobile": "Управлявайте на мобилното устройство",
|
||||
"crossPlatform.title": "Абонамент за различни платформи",
|
||||
"currentPlan.cancelAlert": "Абонаментът ще бъде анулиран след {{canceledAt}}. Можете да го възстановите в \"Управление на абонамента\" преди това",
|
||||
"currentPlan.downgradeAlert": "Ще бъде понижен до {{plan}} след {{downgradedAt}}.",
|
||||
"currentPlan.management": "Управление на абонамента",
|
||||
|
||||
@@ -8,14 +8,11 @@
|
||||
"config.imageUrl.label": "Начална рамка",
|
||||
"config.prompt.placeholder": "Опишете видеото, което искате да генерирате",
|
||||
"config.prompt.placeholderWithRef": "Опишете сцената, която искате да създадете с изображението",
|
||||
"config.promptExtend.label": "Разширяване на подканата",
|
||||
"config.referenceImage.label": "Референтно изображение",
|
||||
"config.resolution.label": "Резолюция",
|
||||
"config.seed.label": "Сийд",
|
||||
"config.seed.random": "Случаен",
|
||||
"config.size.label": "Размер",
|
||||
"config.watermark.label": "Воден знак",
|
||||
"config.webSearch.label": "Уеб търсене",
|
||||
"generation.actions.copyError": "Копирай съобщението за грешка",
|
||||
"generation.actions.errorCopied": "Съобщението за грешка е копирано в клипборда",
|
||||
"generation.actions.errorCopyFailed": "Неуспешно копиране на съобщението за грешка",
|
||||
|
||||
@@ -22,10 +22,6 @@
|
||||
"channel.connectSuccess": "Bot erfolgreich verbunden",
|
||||
"channel.connecting": "Verbinden...",
|
||||
"channel.connectionConfig": "Verbindungskonfiguration",
|
||||
"channel.connectionMode": "Verbindungsmodus",
|
||||
"channel.connectionModeHint": "Für neue Bots wird WebSocket empfohlen. Verwenden Sie Webhook, wenn Ihr Bot bereits über eine konfigurierte Callback-URL auf der QQ Open Platform verfügt.",
|
||||
"channel.connectionModeWebSocket": "WebSocket",
|
||||
"channel.connectionModeWebhook": "Webhook",
|
||||
"channel.copied": "In die Zwischenablage kopiert",
|
||||
"channel.copy": "Kopieren",
|
||||
"channel.credentials": "Anmeldedaten",
|
||||
@@ -61,8 +57,6 @@
|
||||
"channel.endpointUrlHint": "Bitte kopieren Sie diese URL und fügen Sie sie in das Feld <bold>{{fieldName}}</bold> im {{name}} Entwicklerportal ein.",
|
||||
"channel.exportConfig": "Konfiguration exportieren",
|
||||
"channel.feishu.description": "Verbinden Sie diesen Assistenten mit Feishu für private und Gruppenchats.",
|
||||
"channel.feishu.webhookMigrationDesc": "Der WebSocket-Modus bietet die Zustellung von Ereignissen in Echtzeit, ohne dass eine öffentliche Callback-URL erforderlich ist. Um zu migrieren, wechseln Sie den Verbindungsmodus in den erweiterten Einstellungen zu WebSocket. Es ist keine zusätzliche Konfiguration auf der Feishu/Lark Open Platform erforderlich.",
|
||||
"channel.feishu.webhookMigrationTitle": "Erwägen Sie die Migration zum WebSocket-Modus",
|
||||
"channel.historyLimit": "Begrenzung der Nachrichtenhistorie",
|
||||
"channel.historyLimitHint": "Standardanzahl von Nachrichten, die beim Lesen der Kanäle-Historie abgerufen werden",
|
||||
"channel.importConfig": "Konfiguration importieren",
|
||||
@@ -77,8 +71,6 @@
|
||||
"channel.publicKeyPlaceholder": "Erforderlich für Interaktionsüberprüfung",
|
||||
"channel.qq.appIdHint": "Ihre QQ-Bot-App-ID von der QQ Open Platform",
|
||||
"channel.qq.description": "Verbinden Sie diesen Assistenten mit QQ für Gruppenchats und Direktnachrichten.",
|
||||
"channel.qq.webhookMigrationDesc": "Der WebSocket-Modus bietet die Zustellung von Ereignissen in Echtzeit und automatische Wiederverbindung, ohne dass eine Callback-URL benötigt wird. Um zu migrieren, erstellen Sie einen neuen Bot auf der QQ Open Platform, ohne eine Callback-URL zu konfigurieren, und wechseln Sie dann in den erweiterten Einstellungen den Verbindungsmodus zu WebSocket.",
|
||||
"channel.qq.webhookMigrationTitle": "Erwägen Sie die Migration zum WebSocket-Modus",
|
||||
"channel.removeChannel": "Kanal entfernen",
|
||||
"channel.removeFailed": "Kanal konnte nicht entfernt werden",
|
||||
"channel.removed": "Kanal entfernt",
|
||||
@@ -101,11 +93,7 @@
|
||||
"channel.signingSecret": "Signatur-Geheimnis",
|
||||
"channel.signingSecretHint": "Wird verwendet, um Webhook-Anfragen zu verifizieren.",
|
||||
"channel.slack.appIdHint": "Ihre Slack-App-ID aus dem Slack-API-Dashboard (beginnt mit A).",
|
||||
"channel.slack.appToken": "App-Level-Token",
|
||||
"channel.slack.appTokenHint": "Erforderlich für den Socket-Modus (WebSocket). Generieren Sie ein App-Level-Token (xapp-...) unter \"Basic Information\" in den Einstellungen Ihrer Slack-App.",
|
||||
"channel.slack.description": "Verbinden Sie diesen Assistenten mit Slack für Kanalgespräche und Direktnachrichten.",
|
||||
"channel.slack.webhookMigrationDesc": "Der Socket-Modus bietet die Zustellung von Ereignissen in Echtzeit über WebSocket, ohne dass ein öffentlicher HTTP-Endpunkt erforderlich ist. Um zu migrieren, aktivieren Sie den Socket-Modus in den Einstellungen Ihrer Slack-App, generieren Sie ein App-Level-Token und wechseln Sie anschließend den Verbindungsmodus in den erweiterten Einstellungen zu WebSocket.",
|
||||
"channel.slack.webhookMigrationTitle": "Erwägen Sie die Migration zum Socket-Modus (WebSocket)",
|
||||
"channel.telegram.description": "Verbinden Sie diesen Assistenten mit Telegram für private und Gruppenchats.",
|
||||
"channel.testConnection": "Verbindung testen",
|
||||
"channel.testFailed": "Verbindungstest fehlgeschlagen",
|
||||
|
||||
@@ -42,11 +42,6 @@
|
||||
"confirmRemoveGroupSuccess": "Gruppe erfolgreich gelöscht",
|
||||
"confirmRemoveSessionItemAlert": "Sie sind dabei, diesen Agenten zu löschen. Nach dem Löschen kann er nicht wiederhergestellt werden. Bitte bestätigen Sie Ihre Aktion.",
|
||||
"confirmRemoveSessionSuccess": "Agent erfolgreich entfernt",
|
||||
"createModal.createBlank": "Leere erstellen",
|
||||
"createModal.groupPlaceholder": "Beschreiben Sie, was diese Gruppe tun soll...",
|
||||
"createModal.groupTitle": "Was soll Ihre Gruppe tun?",
|
||||
"createModal.placeholder": "Beschreiben Sie, was Ihr Agent tun soll...",
|
||||
"createModal.title": "Was soll Ihr Agent tun?",
|
||||
"defaultAgent": "Standardagent",
|
||||
"defaultGroupChat": "Gruppe",
|
||||
"defaultList": "Standardliste",
|
||||
@@ -234,7 +229,6 @@
|
||||
"operation.contextCompression": "Kontext zu lang, komprimiere Verlauf...",
|
||||
"operation.execAgentRuntime": "Antwort wird vorbereitet",
|
||||
"operation.execClientTask": "Aufgabe wird ausgeführt",
|
||||
"operation.execServerAgentRuntime": "Wird ausgeführt… Sie können die Aufgabe wechseln oder die Seite schließen — die Aufgabe läuft weiter.",
|
||||
"operation.sendMessage": "Nachricht wird gesendet",
|
||||
"owner": "Gruppeninhaber",
|
||||
"pageCopilot.title": "Seitenagent",
|
||||
@@ -388,7 +382,6 @@
|
||||
"task.status.fetchingDetails": "Details werden abgerufen...",
|
||||
"task.status.initializing": "Aufgabe wird initialisiert...",
|
||||
"task.subtask": "Teilaufgabe",
|
||||
"task.title": "Aufgaben",
|
||||
"thread.divider": "Unterthema",
|
||||
"thread.threadMessageCount": "{{messageCount}} Nachrichten",
|
||||
"thread.title": "Unterthema",
|
||||
@@ -436,11 +429,9 @@
|
||||
"toolAuth.title": "Skills für diesen Agenten autorisieren",
|
||||
"topic.checkOpenNewTopic": "Neues Thema starten?",
|
||||
"topic.checkSaveCurrentMessages": "Möchtest du die aktuelle Unterhaltung als Thema speichern?",
|
||||
"topic.defaultTitle": "Unbenanntes Thema",
|
||||
"topic.openNewTopic": "Neues Thema öffnen",
|
||||
"topic.recent": "Letzte Themen",
|
||||
"topic.saveCurrentMessages": "Aktuelle Sitzung als Thema speichern",
|
||||
"topic.viewAll": "Alle Themen anzeigen",
|
||||
"translate.action": "Übersetzen",
|
||||
"translate.clear": "Übersetzung löschen",
|
||||
"tts.action": "Text-zu-Sprache",
|
||||
|
||||
@@ -343,19 +343,10 @@
|
||||
"mail.support": "E-Mail-Support",
|
||||
"more": "Mehr",
|
||||
"navPanel.agent": "Agent",
|
||||
"navPanel.customizeSidebar": "Seitenleiste anpassen",
|
||||
"navPanel.displayItems": "Anzuzeigende Elemente",
|
||||
"navPanel.hidden": "Ausgeblendet",
|
||||
"navPanel.hideSection": "Abschnitt ausblenden",
|
||||
"navPanel.library": "Bibliothek",
|
||||
"navPanel.moveDown": "Nach unten verschieben",
|
||||
"navPanel.moveUp": "Nach oben verschieben",
|
||||
"navPanel.pinned": "Angeheftet",
|
||||
"navPanel.searchAgent": "Agent suchen...",
|
||||
"navPanel.searchRecent": "Zuletzt gesucht...",
|
||||
"navPanel.searchResultEmpty": "Keine Suchergebnisse gefunden",
|
||||
"navPanel.show": "Anzeigen",
|
||||
"navPanel.visible": "Sichtbar",
|
||||
"new": "Neu",
|
||||
"noContent": "Kein Inhalt",
|
||||
"oauth": "SSO-Anmeldung",
|
||||
@@ -371,12 +362,6 @@
|
||||
"productHunt.actionLabel": "Unterstütze uns",
|
||||
"productHunt.description": "Unterstütze uns auf Product Hunt. Deine Unterstützung bedeutet uns viel!",
|
||||
"productHunt.title": "Wir sind auf Product Hunt!",
|
||||
"promptTransform.action": "Idee verfeinern",
|
||||
"promptTransform.actions.rewrite": "Details ausweiten",
|
||||
"promptTransform.actions.translate": "Übersetzen",
|
||||
"promptTransform.status.rewrite": "Details werden ausgeweitet...",
|
||||
"promptTransform.status.translate": "Wird übersetzt...",
|
||||
"recents": "Kürzlich",
|
||||
"regenerate": "Neu generieren",
|
||||
"releaseNotes": "Versionshinweise",
|
||||
"rename": "Umbenennen",
|
||||
@@ -415,7 +400,6 @@
|
||||
"tab.audio": "Audio",
|
||||
"tab.chat": "Chat",
|
||||
"tab.community": "Community",
|
||||
"tab.create": "Erstellen",
|
||||
"tab.discover": "Entdecken",
|
||||
"tab.eval": "Bewertungslabor",
|
||||
"tab.files": "Dateien",
|
||||
|
||||
@@ -124,7 +124,6 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Audio",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Bild",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Text",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Video",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Input ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Output ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / Bild",
|
||||
@@ -140,7 +139,6 @@
|
||||
"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.pricing.unit.videoGeneration": "Videoerstellung",
|
||||
"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.",
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
"config.model.label": "Modell",
|
||||
"config.prompt.placeholder": "Beschreiben Sie, was Sie generieren möchten",
|
||||
"config.prompt.placeholderWithRef": "Beschreiben Sie, wie Sie das Bild anpassen möchten",
|
||||
"config.promptExtend.label": "Prompt-Erweiterung",
|
||||
"config.quality.label": "Bildqualität",
|
||||
"config.quality.options.hd": "Hohe Auflösung",
|
||||
"config.quality.options.standard": "Standard",
|
||||
@@ -25,8 +24,6 @@
|
||||
"config.size.label": "Größe",
|
||||
"config.steps.label": "Schritte",
|
||||
"config.title": "Konfiguration",
|
||||
"config.watermark.label": "Wasserzeichen",
|
||||
"config.webSearch.label": "Websuche",
|
||||
"config.width.label": "Breite",
|
||||
"generation.actions.applySeed": "Seed anwenden",
|
||||
"generation.actions.copyError": "Fehlermeldung kopieren",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user