mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-20 06:15:58 +00:00
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d47f4fec76 | |||
| 9088a074e2 | |||
| b95720d210 | |||
| 560ec57f75 | |||
| dbca232e35 | |||
| c879629439 | |||
| 1ecf7d2be8 | |||
| 8b5aaeebdf | |||
| 4787bed380 | |||
| 5f25efd54c | |||
| c85be1265f | |||
| 4f1d2d494f | |||
| 3b81a94d76 | |||
| a4d9967e60 | |||
| 6a40eb8a3b | |||
| a23e159ef3 | |||
| 1eb1fca7f2 | |||
| 4100f2f700 | |||
| 23f91d044c | |||
| 06ac87dc45 | |||
| 6d731dd116 | |||
| f804d0fc7c | |||
| b268f44f06 | |||
| 475622a4b9 | |||
| 7b40538486 | |||
| 5531ff7907 | |||
| 4f56868545 | |||
| dc1b43d86c | |||
| 4d7cbfea8e | |||
| e65e2c3628 | |||
| eebf9cb056 | |||
| 3e7ee1fbfc | |||
| 84eff30be1 | |||
| 50a1cc1ec2 | |||
| d49aba748e | |||
| 8a0c3cb36a | |||
| 26d1d6bbfb | |||
| c5ec0ef2a1 | |||
| 6d0c8d710a | |||
| e10265fadd | |||
| c68dfa00df | |||
| 7d599a980f |
@@ -0,0 +1,298 @@
|
||||
---
|
||||
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,621 +379,30 @@ 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. This works with any app that supports macOS Accessibility, without needing CDP or Chromium.
|
||||
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.
|
||||
|
||||
## Core osascript Patterns
|
||||
The pattern is the same for every platform:
|
||||
|
||||
### Activate an App
|
||||
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)
|
||||
|
||||
```bash
|
||||
osascript -e 'tell application "Discord" to activate'
|
||||
```
|
||||
## Per-Platform References
|
||||
|
||||
### Type Text
|
||||
Pick the file for your target platform — each contains activation, navigation, send-message, and verification snippets specific to that app:
|
||||
|
||||
```bash
|
||||
# Type character by character (reliable, but slow for long text)
|
||||
osascript -e 'tell application "System Events" to keystroke "Hello world"'
|
||||
| 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` |
|
||||
|
||||
# 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
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
@@ -1006,6 +415,7 @@ 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 |
|
||||
@@ -1068,25 +478,16 @@ Each script: activates the app, navigates to the channel/contact, pastes the mes
|
||||
|
||||
# Screen Recording
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
```bash
|
||||
# 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
|
||||
./.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
|
||||
```
|
||||
|
||||
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
|
||||
Outputs to `.records/` directory (gitignored): `<name>.mp4` (video) + `<name>/` (screenshots every 3s).
|
||||
|
||||
---
|
||||
|
||||
@@ -1112,14 +513,4 @@ The script automatically:
|
||||
|
||||
### osascript
|
||||
|
||||
- **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
|
||||
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.).
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
# 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
|
||||
```
|
||||
@@ -0,0 +1,61 @@
|
||||
# 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
|
||||
```
|
||||
@@ -0,0 +1,217 @@
|
||||
# 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
|
||||
@@ -0,0 +1,62 @@
|
||||
# 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
|
||||
```
|
||||
@@ -0,0 +1,73 @@
|
||||
# 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
|
||||
```
|
||||
@@ -0,0 +1,80 @@
|
||||
# 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
|
||||
```
|
||||
@@ -0,0 +1,81 @@
|
||||
# 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
|
||||
```
|
||||
@@ -0,0 +1,142 @@
|
||||
# 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 |
|
||||
+189
@@ -0,0 +1,189 @@
|
||||
#!/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
|
||||
@@ -71,15 +71,18 @@ internal_createTopic: async (params) => {
|
||||
**Actions:**
|
||||
|
||||
- Public: `createTopic`, `sendMessage`
|
||||
|
||||
- Internal: `internal_createTopic`, `internal_updateMessageContent`
|
||||
|
||||
- Dispatch: `internal_dispatchTopic`
|
||||
- Toggle: `internal_toggleMessageLoading`
|
||||
**State:**
|
||||
|
||||
**State:**
|
||||
- ID arrays: `topicEditingIds`
|
||||
|
||||
- ID arrays: `messageLoadingIds`, `topicEditingIds`
|
||||
- Maps: `topicMaps`, `messagesMap`
|
||||
|
||||
- Active: `activeTopicId`
|
||||
|
||||
- Init flags: `topicsInit`
|
||||
|
||||
## Detailed Guides
|
||||
|
||||
@@ -30,16 +30,13 @@ 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',
|
||||
|
||||
+9
-1
@@ -25,6 +25,9 @@ Desktop.ini
|
||||
*.code-workspace
|
||||
.vscode/sessions.json
|
||||
prd
|
||||
# Recordings
|
||||
.records/
|
||||
|
||||
# Temporary files
|
||||
.temp/
|
||||
temp/
|
||||
@@ -137,5 +140,10 @@ 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('fs');
|
||||
const path = require('path');
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
|
||||
module.exports = defineConfig({
|
||||
entry: 'locales/en-US',
|
||||
@@ -27,14 +27,14 @@ module.exports = defineConfig({
|
||||
],
|
||||
temperature: 0,
|
||||
saveImmediately: true,
|
||||
modelName: 'chatgpt-4o-latest',
|
||||
modelName: 'gpt-5.1-chat-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'), 'utf-8'),
|
||||
fs.readFileSync(path.join(__dirname, 'docs/glossary.md'), 'utf8'),
|
||||
entry: ['./README.md', './docs/**/*.md', './docs/**/*.mdx'],
|
||||
entryLocale: 'en-US',
|
||||
outputLocales: ['zh-CN'],
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
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);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -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, LOBEHUB_DAEMON: '1' },
|
||||
env: { ...process.env, ELECTRON_RUN_AS_NODE: '1', LOBEHUB_DAEMON: '1' },
|
||||
stdio: ['ignore', logFd, logFd],
|
||||
});
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
import { createProgram } from './program';
|
||||
|
||||
createProgram().parse();
|
||||
createProgram().parse(process.argv, { from: 'node' });
|
||||
|
||||
@@ -22,6 +22,7 @@ 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';
|
||||
@@ -68,6 +69,7 @@ export function createProgram() {
|
||||
registerTopicCommand(program);
|
||||
registerMessageCommand(program);
|
||||
registerModelCommand(program);
|
||||
registerNotifyCommand(program);
|
||||
registerProviderCommand(program);
|
||||
registerPluginCommand(program);
|
||||
registerUserCommand(program);
|
||||
|
||||
@@ -9,6 +9,10 @@ export default defineConfig({
|
||||
entry: ['src/index.ts'],
|
||||
fixedExtension: false,
|
||||
format: ['esm'],
|
||||
minify: true,
|
||||
outputOptions: {
|
||||
codeSplitting: false,
|
||||
},
|
||||
platform: 'node',
|
||||
target: 'node18',
|
||||
});
|
||||
|
||||
@@ -109,6 +109,26 @@ 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:
|
||||
@@ -296,7 +316,10 @@ const config = {
|
||||
releaseNotes: process.env.RELEASE_NOTES || undefined,
|
||||
},
|
||||
|
||||
extraResources: [{ from: 'resources/bin', to: 'bin' }],
|
||||
extraResources: [
|
||||
{ from: 'resources/bin', to: 'bin' },
|
||||
{ from: 'resources/cli-package.json', to: 'package.json' },
|
||||
],
|
||||
|
||||
win: {
|
||||
executableName: 'LobeHub',
|
||||
|
||||
@@ -90,7 +90,6 @@ export default defineConfig({
|
||||
outDir: 'dist/preload',
|
||||
sourcemap: isDev ? 'inline' : false,
|
||||
},
|
||||
|
||||
resolve: {
|
||||
alias: {
|
||||
'@': path.resolve(__dirname, 'src/main'),
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
"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",
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
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),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,17 +10,38 @@ 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 });
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ 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(() => ({
|
||||
@@ -32,7 +33,17 @@ vi.mock('node:crypto', () => ({
|
||||
randomUUID: vi.fn(() => 'test-uuid-123'),
|
||||
}));
|
||||
|
||||
const mockApp = {} as unknown as App;
|
||||
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;
|
||||
|
||||
describe('ShellCommandCtr (thin wrapper)', () => {
|
||||
let ctr: ShellCommandCtr;
|
||||
@@ -118,6 +129,28 @@ 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,6 +2,7 @@ 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';
|
||||
@@ -23,6 +24,7 @@ import UploadFileCtr from './UploadFileCtr';
|
||||
export const controllerIpcConstructors = [
|
||||
AuthCtr,
|
||||
BrowserWindowsCtr,
|
||||
CliCtr,
|
||||
DevtoolsCtr,
|
||||
GatewayConnectionCtr,
|
||||
LocalFileCtr,
|
||||
|
||||
@@ -13,6 +13,7 @@ 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,
|
||||
@@ -89,9 +90,9 @@ export class App {
|
||||
logger.info('----------------------------------------------');
|
||||
logger.info('Starting LobeHub...');
|
||||
|
||||
// Append bundled binaries directory to PATH for fallback tool resolution
|
||||
// Append bundled binaries and CLI wrapper directories to PATH for tool resolution
|
||||
const pathSep = process.platform === 'win32' ? ';' : ':';
|
||||
process.env.PATH = `${process.env.PATH}${pathSep}${binDir}`;
|
||||
process.env.PATH = `${process.env.PATH}${pathSep}${binDir}${pathSep}${getCliWrapperDir()}`;
|
||||
|
||||
logger.debug('Initializing App');
|
||||
// Initialize store manager
|
||||
@@ -226,6 +227,11 @@ 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();
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
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);
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
export { generateCliWrapper, getCliWrapperDir } from './generateCliWrapper';
|
||||
@@ -63,11 +63,82 @@ 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,
|
||||
];
|
||||
|
||||
@@ -465,5 +465,6 @@
|
||||
"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://github.com/user-attachments/assets/fd60ab55-ead2-4930-ad00-fdf77662f5a0": "/blog/assets276a4e8748e9bd300b30dcd9d0e24980.webp",
|
||||
"https://file.rene.wang/clipboard-1775701725582-123f8f8cf73f8.png": "/blog/assets7ea204859aeb5aa9be5810a20ba1669a.webp"
|
||||
}
|
||||
@@ -1,9 +1,8 @@
|
||||
---
|
||||
title: Agent Task System & Bot Management
|
||||
title: Bot Management
|
||||
description: >-
|
||||
Introduced agent task system, in-app notifications, bot management, and improved onboarding experience.
|
||||
|
||||
|
||||
Introduced in-app notifications, bot management, and improved onboarding
|
||||
experience.
|
||||
tags:
|
||||
- Agent Tasks
|
||||
- Bot Management
|
||||
@@ -11,9 +10,7 @@ tags:
|
||||
- Onboarding
|
||||
---
|
||||
|
||||
# Agent Task System & Bot Management
|
||||
|
||||
This week LobeHub introduced powerful new agent capabilities and a smoother getting-started experience.
|
||||
# Bot Management & Notification
|
||||
|
||||
## Key Updates
|
||||
|
||||
|
||||
+139
-35
@@ -3,211 +3,315 @@
|
||||
"cloud": [],
|
||||
"community": [
|
||||
{
|
||||
"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,6 +337,7 @@ 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,6 +334,7 @@ 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',
|
||||
|
||||
+34
-12
@@ -20,6 +20,15 @@ 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>
|
||||
@@ -42,9 +51,11 @@ By connecting a QQ channel to your LobeHub agent, users can interact with the AI
|
||||
|
||||

|
||||
|
||||
### Configure Webhook URL
|
||||
### Configure Event Delivery (Webhook Only)
|
||||
|
||||
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.
|
||||
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.
|
||||
</Steps>
|
||||
|
||||
## Step 2: Configure QQ in LobeHub
|
||||
@@ -61,16 +72,26 @@ By connecting a QQ channel to your LobeHub agent, users can interact with the AI
|
||||
- **Application ID** — The App ID from the QQ Open Platform
|
||||
- **App Secret** — The App Secret from the QQ Open Platform
|
||||
|
||||
### Save and Copy the Callback URL
|
||||
### Select Connection Mode
|
||||
|
||||
Click **Save Configuration**. After saving, a **Callback URL** will be displayed. Copy this URL.
|
||||
In **Advanced Settings**, choose the **Connection Mode**:
|
||||
|
||||
Your credentials will be encrypted and stored securely.
|
||||
- **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.
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
## Step 3: Configure Callback in QQ Open Platform
|
||||
## Step 3: Configure Callback in QQ Open Platform (Webhook Only)
|
||||
|
||||
> Skip this step if you are using WebSocket mode.
|
||||
|
||||
<Steps>
|
||||
### Paste the Callback URL
|
||||
@@ -121,11 +142,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 |
|
||||
| **Callback URL** | — | Auto-generated after saving; paste into QQ Open Platform |
|
||||
| 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 |
|
||||
|
||||
## Limitations
|
||||
|
||||
@@ -136,7 +157,8 @@ To use the bot in QQ groups:
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- **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 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.
|
||||
- **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,6 +17,15 @@ tags:
|
||||
- 一个拥有有效订阅的 LobeHub 账户
|
||||
- 一个 QQ 账户
|
||||
|
||||
## 连接模式
|
||||
|
||||
LobeHub ��持两种 QQ 机器人连接模式:
|
||||
|
||||
- **WebSocket(推荐)** — 持久连接。事件通过 WebSocket 实时推送,无需配置回调地址。这是新机器人的默认模式。
|
||||
- **Webhook** — 无状态 HTTP ��调。如果您的机器人已在 QQ 开放平台配置了回调地址且无法切换,请使用此模式。
|
||||
|
||||
> **注意:** 在 QQ 开放平台上,一旦机器人配置了 Webhook 回调地址,就无法切换到 WebSocket 模式。尚未配置回调地址的新机器人应使用 WebSocket 模式。
|
||||
|
||||
## 第一步:创建 QQ 机器人
|
||||
|
||||
<Steps>
|
||||
@@ -39,9 +48,11 @@ tags:
|
||||
|
||||

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

|
||||
</Steps>
|
||||
|
||||
## 第三步:在 QQ 开放平台配置回调
|
||||
## 第三步:在 QQ 开放平台配置回调(仅 Webhook 模式)
|
||||
|
||||
> 如果您使用的是 WebSocket 模式,请跳过此步骤。
|
||||
|
||||
<Steps>
|
||||
### 粘贴回调地址
|
||||
@@ -118,11 +139,11 @@ tags:
|
||||
|
||||
## 配置参考
|
||||
|
||||
| 字段 | 是否必需 | 描述 |
|
||||
| -------------- | ---- | ---------------------- |
|
||||
| **应用 ID** | 是 | 来自 QQ 开放平台的 App ID |
|
||||
| **App Secret** | 是 | 来自 QQ 开放平台的 App Secret |
|
||||
| **回调地址** | — | 保存后自动生成;粘贴到 QQ 开放平台 |
|
||||
| 字段 | 是否必需 | 描述 |
|
||||
| -------------- | ---- | ----------------------------------------- |
|
||||
| **应用 ID** | 是 | 来自 QQ 开放平台的 App ID |
|
||||
| **App Secret** | 是 | 来自 QQ 开放平台的 App Secret |
|
||||
| **连接模式** | 否 | `websocket`(默认)或 `webhook`,根据 QQ 开放平台配置选择 |
|
||||
|
||||
## 功能限制
|
||||
|
||||
@@ -133,7 +154,8 @@ tags:
|
||||
|
||||
## 故障排除
|
||||
|
||||
- **回调地址验证失败:** 确保您已在 LobeHub 中保存配置,并正确复制了 URL。LobeHub 会自动处理 Ed25519 验证。
|
||||
- **机器人无法连接(WebSocket 模式):** 验证 App ID 和 App Secret 是否正确。确保机��人在 QQ 开放平台上未配置回调地址 — 一旦设置了回调地址,WebSocket 模式将不可用。
|
||||
- **回调地址验证失败(Webhook 模式):** 确保您已在 LobeHub 中保存配置,并正确复制了 URL。LobeHub 会自动处理 Ed25519 验证。
|
||||
- **机器人未响应:** 验证 App ID 和 App Secret 是否正确,机器人是否已发布(或您是沙盒测试用户),以及是否订阅了所需的消息事件。
|
||||
- **群聊问题:** 确保机器人已被添加到群聊中。@提及机器人以触发响应。
|
||||
- **测试连接失败:** 仔细检查 LobeHub 渠道设置中的 App ID 和 App Secret。
|
||||
|
||||
+125
-71
@@ -20,129 +20,183 @@ 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
|
||||
|
||||
## Step 1: Create a Slack App
|
||||
## 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
|
||||
|
||||
<Steps>
|
||||
### Go to the Slack API Dashboard
|
||||
### Open the Slack API Dashboard
|
||||
|
||||
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**.
|
||||
Visit [api.slack.com/apps](https://api.slack.com/apps) and click **Create New App** → **From an app manifest**.
|
||||
|
||||
### Copy the App ID and Signing Secret
|
||||
### Select Your Workspace
|
||||
|
||||
On the **Basic Information** page, copy and save:
|
||||
Choose the Slack workspace where you want to install the app.
|
||||
|
||||
- **App ID** — displayed at the top of the page
|
||||
- **Signing Secret** — under the **App Credentials** section
|
||||
### 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
|
||||
oauth_config:
|
||||
scopes:
|
||||
bot:
|
||||
- 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
|
||||
- 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
|
||||
org_deploy_enabled: false
|
||||
socket_mode_enabled: true
|
||||
token_rotation_enabled: false
|
||||
```
|
||||
|
||||
> **Note:** `socket_mode_enabled: true` means no Request URL is needed. Events are delivered via WebSocket.
|
||||
|
||||
### Create the App
|
||||
|
||||
Review the summary and click **Create**.
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
### Add Bot Token Scopes
|
||||
### Step 2: Collect Credentials
|
||||
|
||||
In the left sidebar, go to **OAuth & Permissions**. Scroll down to **Scopes** → **Bot Token Scopes** and add the following:
|
||||
<Steps>
|
||||
### Copy the App ID and Signing Secret
|
||||
|
||||
- `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
|
||||
On the **Basic Information** page, copy:
|
||||
|
||||
**Optional scopes** (for Slack Assistants API support):
|
||||
- **App ID** — displayed at the top
|
||||
- **Signing Secret** — under **App Credentials**
|
||||
|
||||
- `assistant:write` — Enable the Slack Assistants API features
|
||||
### 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**.
|
||||
|
||||
Copy the token (starts with `xapp-`).
|
||||
|
||||
> **Important:** This token is only shown once. Store it securely.
|
||||
|
||||
### Install the App to Your Workspace
|
||||
|
||||
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.
|
||||
Go to **OAuth & Permissions** in the sidebar, click **Install to Workspace**, and authorize. Copy the **Bot User OAuth Token** (starts with `xoxb-`).
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
## Step 2: Configure Slack in LobeHub
|
||||
### Step 3: Configure Slack in LobeHub
|
||||
|
||||
<Steps>
|
||||
### Open Channel Settings
|
||||
|
||||
In LobeHub, navigate to your agent's settings, then select the **Channels** tab. Click **Slack** from the platform list.
|
||||
In LobeHub, navigate to your agent's settings → **Channels** tab → click **Slack**.
|
||||
|
||||
### Fill in the Credentials
|
||||
### Enter Credentials
|
||||
|
||||
Enter the following fields:
|
||||
Fill in:
|
||||
|
||||
- **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
|
||||
- **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-...`)
|
||||
|
||||
Your token will be encrypted and stored securely.
|
||||
### Select Connection Mode
|
||||
|
||||
In **Advanced Settings**, set **Connection Mode** to **WebSocket**.
|
||||
|
||||
### Save Configuration
|
||||
|
||||
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.
|
||||
Click **Save Configuration**. The bot will automatically connect via Socket Mode. No webhook URL configuration is needed.
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
## Step 3: Configure Event Subscriptions
|
||||
### 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.
|
||||
|
||||
---
|
||||
|
||||
## 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.
|
||||
|
||||
<Steps>
|
||||
### Enable Events
|
||||
### Create a Slack App
|
||||
|
||||
Back in the [Slack API Dashboard](https://api.slack.com/apps), go to **Event Subscriptions** and toggle **Enable Events** to **On**.
|
||||
Visit [api.slack.com/apps](https://api.slack.com/apps), click **Create New App** → **From scratch**. Name your app and select the workspace.
|
||||
|
||||
### Set the Request URL
|
||||
### Add Bot Token Scopes
|
||||
|
||||
Paste the **Webhook URL** you copied from LobeHub into the **Request URL** field. Slack will send a verification challenge — LobeHub will respond automatically.
|
||||
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`.
|
||||
|
||||
### Subscribe to Bot Events
|
||||
### Install to Workspace
|
||||
|
||||
Under **Subscribe to bot events**, add:
|
||||
Click **Install to Workspace** and copy the **Bot User OAuth Token** (`xoxb-...`).
|
||||
|
||||
- `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
|
||||
### Configure in LobeHub
|
||||
|
||||
**Optional events** (for Slack Assistants API support):
|
||||
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**.
|
||||
|
||||
- `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
|
||||
### Configure Event Subscriptions
|
||||
|
||||
### Save Changes
|
||||
|
||||
Click **Save Changes** at the bottom of the page.
|
||||
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`.
|
||||
|
||||

|
||||
</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 webhook requests from Slack |
|
||||
| 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`) |
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- **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.
|
||||
- **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**.
|
||||
|
||||
@@ -17,129 +17,183 @@ tags:
|
||||
- 一个拥有有效订阅的 LobeHub 账户
|
||||
- 一个拥有安装应用权限的 Slack 工作区
|
||||
|
||||
## 第一步:创建 Slack 应用
|
||||
## 连接模式
|
||||
|
||||
LobeHub 支持两种 Slack 连接模式:
|
||||
|
||||
- **Socket Mode / WebSocket(推荐)** — 通过 WebSocket 实时接收事件。无需公网 URL。适合开发环境和私有部署。
|
||||
- **Webhook** — 通过 Events API 的无状态 HTTP 回调。需要公网可访问的 URL。如果您的 Slack 应用已配置了事件订阅,请使用此模式。
|
||||
|
||||
## Socket Mode 设置(推荐)
|
||||
|
||||
### 第一步:通过 Manifest 创建 Slack 应用
|
||||
|
||||
<Steps>
|
||||
### 访问 Slack API 控制台
|
||||
### 打开 Slack API 控制台
|
||||
|
||||
访问 [Slack API Apps](https://api.slack.com/apps),点击 **Create New App**。选择 **From scratch**,为您的应用命名(例如 "LobeHub 助手"),选择要安装到的工作区,然后点击 **Create App**。
|
||||
访问 [api.slack.com/apps](https://api.slack.com/apps),点击 **Create New App** → **From an app manifest**。
|
||||
|
||||
### 复制 App ID 和 Signing Secret
|
||||
### 选择工作区
|
||||
|
||||
在 **Basic Information** 页面,复制并保存:
|
||||
选择您要安装应用的 Slack 工作区。
|
||||
|
||||
- **App ID** — 显示在页面顶部
|
||||
- **Signing Secret** — 在 **App Credentials** 部分下
|
||||
### 粘贴 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
|
||||
oauth_config:
|
||||
scopes:
|
||||
bot:
|
||||
- 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
|
||||
- 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
|
||||
org_deploy_enabled: false
|
||||
socket_mode_enabled: true
|
||||
token_rotation_enabled: false
|
||||
```
|
||||
|
||||
> **注意:** `socket_mode_enabled: true` 表示无需配置 Request URL。事件通过 WebSocket 推送。
|
||||
|
||||
### 创建应用
|
||||
|
||||
确认配置摘要后,点击 **Create**。
|
||||
|
||||

|
||||
</Steps>
|
||||
|
||||
### 添加 Bot Token 权限范围
|
||||
### 第二步:获取凭证
|
||||
|
||||
在左侧菜单中,进入 **OAuth & Permissions**。向下滚动到 **Scopes** → **Bot Token Scopes**,添加以下权限:
|
||||
<Steps>
|
||||
### 复制 App ID 和 Signing Secret
|
||||
|
||||
- `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` — 查询用户信息
|
||||
在 **Basic Information** 页面,复制:
|
||||
|
||||
**可选权限**(用于 Slack Assistants API):
|
||||
- **App ID** — 显示在页面顶部
|
||||
- **Signing Secret** — 在 **App Credentials** 部分
|
||||
|
||||
- `assistant:write` — 启用 Slack Assistants API 功能
|
||||
### 生成应用级别 Token
|
||||
|
||||
向下滚动到 **App-Level Tokens**,点击 **Generate Token and Scopes**。命名(如 "socket-mode"),添加 `connections:write` 权限,点击 **Generate**。
|
||||
|
||||
复制生成的 Token(以 `xapp-` 开头)。
|
||||
|
||||
> **重要:** 此 Token 仅显示一次,请妥善保管。
|
||||
|
||||
### 安装应用到工作区
|
||||
|
||||
仍然在 **OAuth & Permissions** 页面,点击 **Install to Workspace** 并授权应用。安装完成后,复制 **Bot User OAuth Token**(以 `xoxb-` 开头)。
|
||||
|
||||
> **重要提示:** 请将您的 Bot Token 视为密码。切勿公开分享或提交到版本控制系统。
|
||||
进入侧边栏的 **OAuth & Permissions**,点击 **Install to Workspace** 并授权。复制 **Bot User OAuth Token**(以 `xoxb-` 开头)。
|
||||
|
||||

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

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

|
||||
</Steps>
|
||||
|
||||
## 第四步:测试连接
|
||||
|
||||
返回 LobeHub 的 Slack 渠道设置,点击 **测试连接** 以验证集成是否正确。然后进入您的 Slack 工作区,将机器人邀请到一个频道,通过 `@你的机器人名称` 提及它,确认其是否响应。
|
||||
|
||||
## 配置参考
|
||||
|
||||
| 字段 | 是否必需 | 描述 |
|
||||
| ------------- | ---- | ------------------------------ |
|
||||
| **应用 ID** | 是 | 您的 Slack 应用的 ID |
|
||||
| **Bot Token** | 是 | Bot User OAuth Token(xoxb-...) |
|
||||
| **签名密钥** | 是 | 用于验证来自 Slack 的 Webhook 请求 |
|
||||
| 字段 | 是否必需 | 描述 |
|
||||
| -------------- | ------------- | -------------------------------------- |
|
||||
| **应用 ID** | 是 | 您的 Slack 应用 ID |
|
||||
| **Bot Token** | 是 | Bot User OAuth Token(`xoxb-...`) |
|
||||
| **签名密钥** | 是 | 用于验证来自 Slack 的请求 |
|
||||
| **应用级别 Token** | 仅 Socket Mode | 应用级别 Token(`xapp-...`),用于 WebSocket 连接 |
|
||||
| **连接模式** | 否 | `websocket` 或 `webhook`(默认:`webhook`) |
|
||||
|
||||
## 故障排除
|
||||
|
||||
- **机器人未响应:** 确认机器人已被邀请到频道,且事件订阅已正确配置了正确的 Webhook URL。
|
||||
- **机器人未响应:** 确认机器人已被邀请到频道。Socket Mode 下请确保应用级别 Token 正确且 Socket Mode 已在 Slack 应用设置中启用。
|
||||
- **测试连接失败:** 仔细检查应用 ID 和 Bot Token 是否正确。确保应用已安装到工作区。
|
||||
- **Webhook 验证失败:** 确保签名密钥与 Slack 应用 Basic Information 页面中的一致。
|
||||
- **Webhook 验证失败(Webhook 模式):** 确保签名密钥匹配且 Webhook URL 正确。
|
||||
- **Socket Mode 无法连接:** 验证应用级别 Token 具有 `connections:write` 权限。检查 Slack 应用设置中的 **Socket Mode** 是否已启用。
|
||||
|
||||
@@ -40,6 +40,7 @@ export default eslint(
|
||||
// AI coding tools directories
|
||||
'.claude',
|
||||
'.serena',
|
||||
'.i18nrc.js',
|
||||
],
|
||||
next: true,
|
||||
react: 'next',
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"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}} / صورة",
|
||||
@@ -139,6 +140,7 @@
|
||||
"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": "لا يوجد مزود مفعل. يرجى الذهاب إلى الإعدادات لتفعيل أحدهم.",
|
||||
|
||||
@@ -816,8 +816,13 @@
|
||||
"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 هو نموذج عالي الكفاءة لتوليد النصوص بسرعة، مثالي للتطبيقات واسعة النطاق وذات التكلفة المنخفضة.",
|
||||
@@ -841,6 +846,7 @@
|
||||
"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 ألف رمز لقراءة المستندات الطويلة والإجابة على الأسئلة المعتمدة على المعرفة الخاصة.",
|
||||
@@ -929,15 +935,25 @@
|
||||
"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، مناسب لمهام لغوية متنوعة.",
|
||||
@@ -983,6 +999,11 @@
|
||||
"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.",
|
||||
@@ -1052,6 +1073,13 @@
|
||||
"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": "نموذج خدمة مخصص للمؤسسات مع تزامن مدمج.",
|
||||
@@ -1206,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 هو نموذج لغة مدمج يتفوق على GPT-3.5، يتميز بقدرات متعددة اللغات قوية تدعم الإنجليزية والكورية، ويقدم حلاً فعالاً بصمة صغيرة.",
|
||||
"solar-pro.description": "Solar Pro هو نموذج لغة عالي الذكاء من Upstage، يركز على اتباع التعليمات باستخدام وحدة معالجة رسومات واحدة، مع درجات IFEval تتجاوز 80. حالياً يدعم اللغة الإنجليزية؛ وكان من المقرر إصدار النسخة الكاملة في نوفمبر 2024 مع دعم لغات موسع وسياق أطول.",
|
||||
@@ -1215,6 +1245,8 @@
|
||||
"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 يستخدم تقنيات تقطير الانتشار العدائي (ADD) لتسريع stable-diffusion-3.5-large.",
|
||||
@@ -1269,23 +1301,68 @@
|
||||
"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,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "تسجيل وكيل",
|
||||
"agent.completionSubtitle": "تم إعداد مساعدك وهو جاهز للعمل.",
|
||||
"agent.completionTitle": "تم الإعداد بالكامل!",
|
||||
"agent.enterApp": "دخول التطبيق",
|
||||
"agent.completion.sentence.readyWhenYouAre": "جاهز متى شئت :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} هنا - أنا جاهز!",
|
||||
"agent.completionSubtitle": "كل شيء جاهز - لنبدأ عندما تكون مستعدًا.",
|
||||
"agent.completionTitle": "أنت على وشك الانتهاء",
|
||||
"agent.enterApp": "أنا جاهز",
|
||||
"agent.greeting.emojiLabel": "رمز تعبيري",
|
||||
"agent.greeting.nameLabel": "الاسم",
|
||||
"agent.greeting.namePlaceholder": "مثلًا: لومي، أطلس، نيكو...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"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": "الإعدادات المتقدمة",
|
||||
@@ -33,6 +41,16 @@
|
||||
"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": "الأعمال والاستراتيجية",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"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": "البحث في المحتوى",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"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}} / изображение",
|
||||
@@ -139,6 +140,7 @@
|
||||
"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": "Няма активирани доставчици. Моля, отидете в настройките, за да активирате такъв.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Въвеждане на агент",
|
||||
"agent.completionSubtitle": "Вашият асистент е конфигуриран и готов за работа.",
|
||||
"agent.completionTitle": "Всичко е готово!",
|
||||
"agent.enterApp": "Влезте в приложението",
|
||||
"agent.completion.sentence.readyWhenYouAre": "На разположение съм, когато сте готови :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} тук — готов/а!",
|
||||
"agent.completionSubtitle": "Всичко е на място — нека започнем, когато си готов.",
|
||||
"agent.completionTitle": "Почти сте готови",
|
||||
"agent.enterApp": "Готов съм",
|
||||
"agent.greeting.emojiLabel": "Емоджи",
|
||||
"agent.greeting.nameLabel": "Име",
|
||||
"agent.greeting.namePlaceholder": "напр. Луми, Атлас, Неко...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"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": "Разширени настройки",
|
||||
@@ -33,6 +41,16 @@
|
||||
"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": "Бизнес и стратегия",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"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": "Търсене в съдържание",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"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",
|
||||
@@ -139,6 +140,7 @@
|
||||
"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.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Agent-Einführung",
|
||||
"agent.completionSubtitle": "Ihr Assistent ist konfiguriert und einsatzbereit.",
|
||||
"agent.completionTitle": "Alles erledigt!",
|
||||
"agent.enterApp": "App betreten",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Bereit, wenn du es bist :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} hier – ich bin bereit!",
|
||||
"agent.completionSubtitle": "Alles ist vorbereitet – wir können loslegen, sobald du soweit bist.",
|
||||
"agent.completionTitle": "Du bist fast am Ziel",
|
||||
"agent.enterApp": "Ich bin bereit",
|
||||
"agent.greeting.emojiLabel": "Emoji",
|
||||
"agent.greeting.nameLabel": "Name",
|
||||
"agent.greeting.namePlaceholder": "z. B. Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "z. B. Warm & freundlich, Scharf & direkt...",
|
||||
"agent.history.current": "Aktuell",
|
||||
"agent.history.title": "Verlaufsthemen",
|
||||
"agent.layout.mode.agent": "Agentenmodus",
|
||||
"agent.layout.mode.classic": "Klassischer Modus",
|
||||
"agent.layout.skip": "Diesen Schritt überspringen",
|
||||
"agent.layout.skipConfirm.content": "Gehst du schon? Ich könnte dir in wenigen Sekunden helfen, alles zu personalisieren.",
|
||||
"agent.layout.skipConfirm.ok": "Für jetzt überspringen",
|
||||
"agent.layout.skipConfirm.title": "Onboarding jetzt überspringen?",
|
||||
"agent.layout.switchMessage": "Heute nicht so in Stimmung? Du kannst zum <modeLink><modeText>{{mode}}</modeText></modeLink> wechseln oder <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Konversation",
|
||||
"agent.modeSwitch.classic": "Klassisch",
|
||||
"agent.modeSwitch.debug": "Debug-Export",
|
||||
"agent.modeSwitch.label": "Wählen Sie Ihren Einführungsmodus",
|
||||
"agent.modeSwitch.reset": "Flow zurücksetzen",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Einführung überspringen",
|
||||
"agent.stage.agentIdentity": "Agentenidentität",
|
||||
"agent.stage.painPoints": "Schmerzpunkte",
|
||||
"agent.stage.proSettings": "Erweiterte Einstellungen",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "Sie können auch in Ihren eigenen Worten antworten.",
|
||||
"agent.title": "Konversations-Einführung",
|
||||
"agent.welcome": "...hm? Ich bin gerade aufgewacht – mein Kopf ist leer. Wer sind Sie? Und – wie soll ich heißen? Ich brauche auch einen Namen.",
|
||||
"agent.welcome.footer": "Konfiguriere deinen Lobe AI Agent. Er läuft auf deinem Server, lernt aus jeder Interaktion und wird mit der Zeit immer leistungsfähiger.",
|
||||
"agent.welcome.guide.growTogether.desc": "Mit jedem Gespräch verstehe ich dich besser und werde nach und nach ein stärkerer Teamplayer.",
|
||||
"agent.welcome.guide.growTogether.title": "Gemeinsam wachsen",
|
||||
"agent.welcome.guide.knowYou.desc": "Woran arbeitest du zurzeit? Ein wenig Kontext hilft mir, dich besser zu unterstützen.",
|
||||
"agent.welcome.guide.knowYou.title": "Dich kennenlernen",
|
||||
"agent.welcome.guide.name.desc": "Gib mir einen Namen, damit sich alles von Anfang an persönlicher anfühlt.",
|
||||
"agent.welcome.guide.name.title": "Gib mir einen Namen",
|
||||
"agent.welcome.sentence.1": "Sehr schön, dich kennenzulernen! Lass uns einander besser kennenlernen.",
|
||||
"agent.welcome.sentence.2": "Welche Art von Partner soll ich für dich sein?",
|
||||
"agent.welcome.sentence.3": "Gib mir zuerst einen Namen :)",
|
||||
"back": "Zurück",
|
||||
"finish": "Los geht’s",
|
||||
"interests.area.business": "Geschäft & Strategie",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Electron-Framework-Version",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Eingebettete Node.js-Version",
|
||||
"settingSystemTools.appEnvironment.title": "App-Umgebung",
|
||||
"settingSystemTools.autoSelectDesc": "Das beste verfügbare Tool wird automatisch ausgewählt",
|
||||
"settingSystemTools.category.browserAutomation": "Browser-Automatisierung",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Werkzeuge für headless Browser-Automatisierung und Web-Interaktion",
|
||||
"settingSystemTools.category.contentSearch": "Inhaltssuche",
|
||||
|
||||
@@ -22,6 +22,10 @@
|
||||
"channel.connectSuccess": "Bot connected successfully",
|
||||
"channel.connecting": "Connecting...",
|
||||
"channel.connectionConfig": "Connection Configuration",
|
||||
"channel.connectionMode": "Connection Mode",
|
||||
"channel.connectionModeHint": "WebSocket is recommended for new bots. Use Webhook if your bot already has a callback URL configured on QQ Open Platform.",
|
||||
"channel.connectionModeWebSocket": "WebSocket",
|
||||
"channel.connectionModeWebhook": "Webhook",
|
||||
"channel.copied": "Copied to clipboard",
|
||||
"channel.copy": "Copy",
|
||||
"channel.credentials": "Credentials",
|
||||
@@ -57,6 +61,8 @@
|
||||
"channel.endpointUrlHint": "Please copy this URL and paste it into the <bold>{{fieldName}}</bold> field in the {{name}} Developer Portal.",
|
||||
"channel.exportConfig": "Export Configuration",
|
||||
"channel.feishu.description": "Connect this assistant to Feishu for private and group chats.",
|
||||
"channel.feishu.webhookMigrationDesc": "WebSocket mode provides real-time event delivery without needing a public callback URL. To migrate, switch the Connection Mode to WebSocket in Advanced Settings. No additional configuration is needed on the Feishu/Lark Open Platform.",
|
||||
"channel.feishu.webhookMigrationTitle": "Consider migrating to WebSocket mode",
|
||||
"channel.historyLimit": "History Message Limit",
|
||||
"channel.historyLimitHint": "Default number of messages to fetch when reading channel history",
|
||||
"channel.importConfig": "Import Configuration",
|
||||
@@ -93,7 +99,11 @@
|
||||
"channel.signingSecret": "Signing Secret",
|
||||
"channel.signingSecretHint": "Used to verify webhook requests.",
|
||||
"channel.slack.appIdHint": "Your Slack App ID from the Slack API dashboard (starts with A).",
|
||||
"channel.slack.appToken": "App-Level Token",
|
||||
"channel.slack.appTokenHint": "Required for Socket Mode (WebSocket). Generate an app-level token (xapp-...) under Basic Information in your Slack app settings.",
|
||||
"channel.slack.description": "Connect this assistant to Slack for channel conversations and direct messages.",
|
||||
"channel.slack.webhookMigrationDesc": "Socket Mode provides real-time event delivery via WebSocket without exposing a public HTTP endpoint. To migrate, enable Socket Mode in your Slack app settings, generate an App-Level Token, then switch the Connection Mode to WebSocket in Advanced Settings.",
|
||||
"channel.slack.webhookMigrationTitle": "Consider migrating to Socket Mode (WebSocket)",
|
||||
"channel.telegram.description": "Connect this assistant to Telegram for private and group chats.",
|
||||
"channel.testConnection": "Test Connection",
|
||||
"channel.testFailed": "Connection test failed",
|
||||
|
||||
@@ -229,6 +229,7 @@
|
||||
"operation.contextCompression": "Context too long, compressing history...",
|
||||
"operation.execAgentRuntime": "Preparing response",
|
||||
"operation.execClientTask": "Executing task",
|
||||
"operation.execServerAgentRuntime": "Preparing response (switching tasks or closing the page won't stop)",
|
||||
"operation.sendMessage": "Sending message",
|
||||
"owner": "Group owner",
|
||||
"pageCopilot.title": "Page Agent",
|
||||
|
||||
@@ -362,6 +362,11 @@
|
||||
"productHunt.actionLabel": "Support us",
|
||||
"productHunt.description": "Support us on Product Hunt. Your support means a lot to us!",
|
||||
"productHunt.title": "We're on Product Hunt!",
|
||||
"promptTransform.action": "Refine Idea",
|
||||
"promptTransform.actions.rewrite": "Expand Details",
|
||||
"promptTransform.actions.translate": "Translate",
|
||||
"promptTransform.status.rewrite": "Expanding details...",
|
||||
"promptTransform.status.translate": "Translating...",
|
||||
"regenerate": "Regenerate",
|
||||
"releaseNotes": "Version Details",
|
||||
"rename": "Rename",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Audio",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Image",
|
||||
"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}} / image",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Input (Cached)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Input (Cache Write)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Output",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Video Generation",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Released {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "No enabled model. Please go to settings to enable.",
|
||||
"ModelSwitchPanel.emptyProvider": "No enabled providers. Please go to settings to enable one.",
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"config.model.label": "Model",
|
||||
"config.prompt.placeholder": "Describe what you want to generate",
|
||||
"config.prompt.placeholderWithRef": "Describe how you want to adjust the image",
|
||||
"config.promptExtend.label": "Extended Prompt",
|
||||
"config.quality.label": "Image Quality",
|
||||
"config.quality.options.hd": "High Definition",
|
||||
"config.quality.options.standard": "Standard",
|
||||
@@ -24,6 +25,8 @@
|
||||
"config.size.label": "Size",
|
||||
"config.steps.label": "Steps",
|
||||
"config.title": "Configuration",
|
||||
"config.watermark.label": "Watermark",
|
||||
"config.webSearch.label": "Web Search",
|
||||
"config.width.label": "Width",
|
||||
"generation.actions.applySeed": "Apply Seed",
|
||||
"generation.actions.copyError": "Copy Error Message",
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
{
|
||||
"features.assistantMessageGroup.desc": "Group agent messages and their tool call results together for display",
|
||||
"features.assistantMessageGroup.title": "Agent Message Grouping",
|
||||
"features.gatewayMode.desc": "Execute agent tasks on the server via Gateway WebSocket instead of running locally. Enables faster execution and reduces client resource usage.",
|
||||
"features.gatewayMode.title": "Server-Side Agent Execution (Gateway)",
|
||||
"features.groupChat.desc": "Enable multi-agent group chat coordination.",
|
||||
"features.groupChat.title": "Group Chat (Multi-Agent)",
|
||||
"features.inputMarkdown.desc": "Render Markdown in the input area in real time (bold text, code blocks, tables, etc.).",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Agent Onboarding",
|
||||
"agent.completionSubtitle": "Your assistant is configured and ready to go.",
|
||||
"agent.completionTitle": "You're All Set!",
|
||||
"agent.enterApp": "Enter App",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Ready when you are :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} here - I'm ready!",
|
||||
"agent.completionSubtitle": "Everything's in place - let's get started when you're ready.",
|
||||
"agent.completionTitle": "You are almost there",
|
||||
"agent.enterApp": "I'm ready",
|
||||
"agent.greeting.emojiLabel": "Emoji",
|
||||
"agent.greeting.nameLabel": "Name",
|
||||
"agent.greeting.namePlaceholder": "e.g. Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "e.g. Warm & friendly, Sharp & direct...",
|
||||
"agent.history.current": "Current",
|
||||
"agent.history.title": "History Topics",
|
||||
"agent.layout.mode.agent": "agent mode",
|
||||
"agent.layout.mode.classic": "classic mode",
|
||||
"agent.layout.skip": "skip this step",
|
||||
"agent.layout.skipConfirm.content": "Leaving already? I could help personalize things for you in seconds.",
|
||||
"agent.layout.skipConfirm.ok": "Skip for now",
|
||||
"agent.layout.skipConfirm.title": "Skip onboarding for now?",
|
||||
"agent.layout.switchMessage": "Not feeling it today? You can switch to <modeLink><modeText>{{mode}}</modeText></modeLink> or <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Conversational",
|
||||
"agent.modeSwitch.classic": "Classic",
|
||||
"agent.modeSwitch.debug": "Debug Export",
|
||||
"agent.modeSwitch.label": "Choose your onboarding mode",
|
||||
"agent.modeSwitch.reset": "Reset Flow",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Skip onboarding",
|
||||
"agent.stage.agentIdentity": "Agent Identity",
|
||||
"agent.stage.painPoints": "Pain Points",
|
||||
"agent.stage.proSettings": "Advanced Setup",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "You can also answer in your own words.",
|
||||
"agent.title": "Conversation Onboarding",
|
||||
"agent.welcome": "...hm? I just woke up — my mind's a blank. Who are you? And — what should I be called? I need a name too.",
|
||||
"agent.welcome.footer": "Configure your Lobe AI Agent. It lives on your server, learns from every interaction, and becomes more powerful the longer it runs.",
|
||||
"agent.welcome.guide.growTogether.desc": "With each chat, I'll understand you better and become a stronger teammate over time.",
|
||||
"agent.welcome.guide.growTogether.title": "Grow with You",
|
||||
"agent.welcome.guide.knowYou.desc": "What's on your plate these days? A little context helps me support you better.",
|
||||
"agent.welcome.guide.knowYou.title": "Get to Know You",
|
||||
"agent.welcome.guide.name.desc": "Give me a name so this feels more personal from the start.",
|
||||
"agent.welcome.guide.name.title": "Name Me",
|
||||
"agent.welcome.sentence.1": "So nice to meet you! Let’s get to know each other.",
|
||||
"agent.welcome.sentence.2": "What kind of partner do you want me to be?",
|
||||
"agent.welcome.sentence.3": "First, give me a name :)",
|
||||
"back": "Back",
|
||||
"finish": "Get Started",
|
||||
"interests.area.business": "Business & Strategy",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"arguments.moreParams": "{{count}} params in total",
|
||||
"arguments.title": "Arguments",
|
||||
"builtins.lobe-activator.apiName.activateTools": "Activate Tools",
|
||||
"builtins.lobe-activator.inspector.activateTools.notFoundCount": "{{count}} not found",
|
||||
"builtins.lobe-agent-builder.apiName.getAvailableModels": "Get available models",
|
||||
"builtins.lobe-agent-builder.apiName.getAvailableTools": "Get available Skills",
|
||||
"builtins.lobe-agent-builder.apiName.getConfig": "Get config",
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
"spark.description": "iFLYTEK Spark provides powerful multilingual AI across domains, enabling innovations in smart hardware, healthcare, finance, and other verticals.",
|
||||
"stepfun.description": "Stepfun models offer leading multimodal and complex reasoning capabilities, with long-context understanding and powerful autonomous search orchestration.",
|
||||
"straico.description": "Straico simplifies AI integration by providing a unified workspace that brings together top text, image, and audio generative AI models, empowering marketers, entrepreneurs, and enthusiasts with seamless access to diverse AI tools.",
|
||||
"streamlake.description": "StreamLake is an enterprise-level model service and AI computing cloud platform, integrating high-performance model inference, low-cost model customization, and fully-managed services to help enterprises focus on AI application innovation without worrying about the complexity and cost of underlying computing resources.",
|
||||
"taichu.description": "A next-generation multimodal model from CASIA and the Wuhan Institute of AI, supporting multi-turn QA, writing, image generation, 3D understanding, and signal analysis with stronger cognition and creativity.",
|
||||
"tencentcloud.description": "LLM Knowledge Engine Atomic Power provides end-to-end knowledge QA for enterprises and developers, with modular services like document parsing, chunking, embeddings, and multi-turn rewriting to assemble custom AI solutions.",
|
||||
"togetherai.description": "Together AI delivers leading performance with innovative models, broad customization, rapid scaling, and straightforward deployment for enterprise needs.",
|
||||
|
||||
@@ -656,8 +656,7 @@
|
||||
"settingSystemTools.appEnvironment.desc": "Built-in runtime versions in the desktop app",
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Electron framework version",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Embedded Node.js version",
|
||||
"settingSystemTools.appEnvironment.title": "App Environment",
|
||||
"settingSystemTools.autoSelectDesc": "The best available tool will be automatically selected",
|
||||
"settingSystemTools.appEnvironment.title": "Built-in App Tools",
|
||||
"settingSystemTools.category.browserAutomation": "Browser Automation",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Tools for headless browser automation and web interaction",
|
||||
"settingSystemTools.category.contentSearch": "Content Search",
|
||||
@@ -674,14 +673,19 @@
|
||||
"settingSystemTools.title": "System Tools",
|
||||
"settingSystemTools.tools.ag.desc": "The Silver Searcher - fast code searching tool",
|
||||
"settingSystemTools.tools.agentBrowser.desc": "Agent-browser - headless browser automation CLI for AI agents",
|
||||
"settingSystemTools.tools.bun.desc": "Bun - fast JavaScript runtime and package manager",
|
||||
"settingSystemTools.tools.bunx.desc": "bunx - Bun package runner for executing npm packages",
|
||||
"settingSystemTools.tools.fd.desc": "fd - fast and user-friendly alternative to find",
|
||||
"settingSystemTools.tools.find.desc": "Unix find - standard file search command",
|
||||
"settingSystemTools.tools.grep.desc": "GNU grep - standard text search tool",
|
||||
"settingSystemTools.tools.lobehub.desc": "LobeHub CLI - manage and connect to LobeHub services",
|
||||
"settingSystemTools.tools.mdfind.desc": "macOS Spotlight search (fast indexed search)",
|
||||
"settingSystemTools.tools.node.desc": "Node.js - JavaScript runtime for executing JS/TS",
|
||||
"settingSystemTools.tools.npm.desc": "npm - Node.js package manager for installing dependencies",
|
||||
"settingSystemTools.tools.pnpm.desc": "pnpm - fast, disk space efficient package manager",
|
||||
"settingSystemTools.tools.python.desc": "Python - programming language runtime",
|
||||
"settingSystemTools.tools.rg.desc": "ripgrep - extremely fast text search tool",
|
||||
"settingSystemTools.tools.uv.desc": "uv - extremely fast Python package manager",
|
||||
"settingTTS.openai.sttModel": "OpenAI Speech-to-Text Model",
|
||||
"settingTTS.openai.title": "OpenAI",
|
||||
"settingTTS.openai.ttsModel": "OpenAI Text-to-Speech Model",
|
||||
@@ -778,6 +782,9 @@
|
||||
"systemAgent.inputCompletion.label": "Model",
|
||||
"systemAgent.inputCompletion.modelDesc": "Model used for input auto-completion suggestions (like GitHub Copilot ghost text)",
|
||||
"systemAgent.inputCompletion.title": "Input Auto-Completion Agent",
|
||||
"systemAgent.promptRewrite.label": "Model",
|
||||
"systemAgent.promptRewrite.modelDesc": "Specify the model used to rewrite prompts",
|
||||
"systemAgent.promptRewrite.title": "Prompt Rewrite Agent",
|
||||
"systemAgent.queryRewrite.label": "Model",
|
||||
"systemAgent.queryRewrite.modelDesc": "Specify the model used to optimize user inquiries",
|
||||
"systemAgent.queryRewrite.title": "Library query rewrite Agent",
|
||||
@@ -844,31 +851,83 @@
|
||||
"tab.uploadZip.desc": "Upload a local .zip or .skill file",
|
||||
"tab.usage": "Usage",
|
||||
"tools.add": "Add Skill",
|
||||
"tools.builtins.find-skills.description": "Helps users discover and install agent skills when they ask \"how do I do X\", \"find a skill for X\", or want to extend capabilities",
|
||||
"tools.builtins.find-skills.title": "Find Skills",
|
||||
"tools.builtins.groupName": "Built-ins",
|
||||
"tools.builtins.install": "Install",
|
||||
"tools.builtins.installed": "Installed",
|
||||
"tools.builtins.lobe-activator.description": "Discover and activate tools and skills",
|
||||
"tools.builtins.lobe-activator.title": "Tools & Skills Activator",
|
||||
"tools.builtins.lobe-agent-browser.description": "Browser automation CLI for AI agents. Use when tasks involve website or Electron interaction such as navigation, form filling, clicking, screenshot capture, scraping data, login flows, and end-to-end app testing.",
|
||||
"tools.builtins.lobe-agent-browser.title": "Agent Browser",
|
||||
"tools.builtins.lobe-agent-builder.description": "Configure agent metadata, model settings, plugins, and the system prompt",
|
||||
"tools.builtins.lobe-agent-builder.title": "Agent Builder",
|
||||
"tools.builtins.lobe-agent-documents.description": "Manage agent-scoped documents (list, create, read, edit, remove, rename) and load rules",
|
||||
"tools.builtins.lobe-agent-documents.title": "Documents",
|
||||
"tools.builtins.lobe-agent-management.description": "Create, manage, and orchestrate AI agents",
|
||||
"tools.builtins.lobe-agent-management.title": "Agent Management",
|
||||
"tools.builtins.lobe-artifacts.description": "Generate and preview interactive UI components and visualizations",
|
||||
"tools.builtins.lobe-artifacts.readme": "Generate and live-preview interactive UI components, data visualizations, charts, SVG graphics, and web applications. Create rich visual content that users can interact with directly.",
|
||||
"tools.builtins.lobe-artifacts.title": "Artifacts",
|
||||
"tools.builtins.lobe-brief.description": "Report progress, deliver results, and request user decisions",
|
||||
"tools.builtins.lobe-brief.title": "Brief Tools",
|
||||
"tools.builtins.lobe-calculator.description": "Perform mathematical calculations, solve equations, and work with symbolic expressions",
|
||||
"tools.builtins.lobe-calculator.readme": "Advanced mathematical calculator supporting basic arithmetic, algebraic equations, calculus operations, and symbolic math. Includes base conversion, equation solving, differentiation, integration, and more.",
|
||||
"tools.builtins.lobe-calculator.title": "Calculator",
|
||||
"tools.builtins.lobe-cloud-sandbox.description": "Execute code, run commands, and manage files in a secure cloud environment",
|
||||
"tools.builtins.lobe-cloud-sandbox.readme": "Execute Python, JavaScript, and TypeScript code in an isolated cloud environment. Run shell commands, manage files, search content with regex, and export results securely.",
|
||||
"tools.builtins.lobe-cloud-sandbox.title": "Cloud Sandbox",
|
||||
"tools.builtins.lobe-creds.description": "Manage user credentials for authentication, environment variable injection, and API verification — handle API keys, OAuth tokens, and secrets for third-party integrations.",
|
||||
"tools.builtins.lobe-creds.title": "Credentials",
|
||||
"tools.builtins.lobe-cron.description": "Manage scheduled tasks that run automatically at specified times. Create, update, enable/disable, and monitor recurring tasks for your agents.",
|
||||
"tools.builtins.lobe-cron.title": "Scheduled Tasks",
|
||||
"tools.builtins.lobe-group-agent-builder.description": "Configure group metadata, members, and shared content for multi-agent groups",
|
||||
"tools.builtins.lobe-group-agent-builder.title": "Group Agent Builder",
|
||||
"tools.builtins.lobe-group-management.description": "Orchestrate and manage multi-agent group conversations",
|
||||
"tools.builtins.lobe-group-management.title": "Group Management",
|
||||
"tools.builtins.lobe-gtd.description": "Plan goals and track progress with GTD methodology",
|
||||
"tools.builtins.lobe-gtd.readme": "Plan goals and track progress using GTD methodology. Create strategic plans, manage todo lists with status tracking, and execute long-running async tasks.",
|
||||
"tools.builtins.lobe-gtd.title": "GTD Tools",
|
||||
"tools.builtins.lobe-knowledge-base.description": "Search uploaded documents and domain knowledge via semantic vector search — for persistent, reusable reference",
|
||||
"tools.builtins.lobe-knowledge-base.title": "Knowledge Base",
|
||||
"tools.builtins.lobe-local-system.description": "Access and manage local files, run shell commands on your desktop",
|
||||
"tools.builtins.lobe-local-system.readme": "Access your local filesystem on desktop. Read, write, search, and organize files. Execute shell commands with background task support and grep content with regex patterns.",
|
||||
"tools.builtins.lobe-local-system.title": "Local System",
|
||||
"tools.builtins.lobe-message.description": "Send, read, edit, and manage messages across multiple messaging platforms with a unified interface",
|
||||
"tools.builtins.lobe-message.readme": "Cross-platform messaging tool supporting Discord, Telegram, Slack, Google Chat, and IRC. Provides unified APIs for message operations, reactions, pins, threads, channel management, and platform-specific features like polls.",
|
||||
"tools.builtins.lobe-message.title": "Message",
|
||||
"tools.builtins.lobe-notebook.description": "Create and manage documents in the topic notebook",
|
||||
"tools.builtins.lobe-notebook.readme": "Create and manage persistent documents within conversation topics. Save notes, reports, articles, and markdown content that stays accessible across sessions.",
|
||||
"tools.builtins.lobe-notebook.title": "Notebook",
|
||||
"tools.builtins.lobe-page-agent.description": "Create, read, update, and delete nodes in XML-structured documents",
|
||||
"tools.builtins.lobe-page-agent.readme": "Create and edit structured documents with precise node-level control. Initialize from Markdown, perform batch insert/modify/remove operations, and find-and-replace text across documents.",
|
||||
"tools.builtins.lobe-page-agent.title": "Document",
|
||||
"tools.builtins.lobe-remote-device.description": "Discover and manage remote desktop device connections",
|
||||
"tools.builtins.lobe-remote-device.readme": "Manage connections to your desktop devices. List online devices, activate a device for remote operations, and check connection status.",
|
||||
"tools.builtins.lobe-remote-device.title": "Remote Device",
|
||||
"tools.builtins.lobe-skill-store.description": "Browse and install agent skills from the LobeHub marketplace. Use this when you need extended capabilities or want to install a specific skill.",
|
||||
"tools.builtins.lobe-skill-store.title": "Skill Store",
|
||||
"tools.builtins.lobe-skills.description": "Activate and use reusable skill packages",
|
||||
"tools.builtins.lobe-skills.title": "Skills",
|
||||
"tools.builtins.lobe-task.description": "Create, list, edit, and delete tasks with dependencies and review configuration",
|
||||
"tools.builtins.lobe-task.title": "Task Tools",
|
||||
"tools.builtins.lobe-topic-reference.description": "Retrieve context from referenced topic conversations",
|
||||
"tools.builtins.lobe-topic-reference.title": "Topic Reference",
|
||||
"tools.builtins.lobe-user-interaction.description": "Ask users questions through UI interactions and observe their lifecycle outcomes",
|
||||
"tools.builtins.lobe-user-interaction.title": "User Interaction",
|
||||
"tools.builtins.lobe-user-memory.description": "Remember user preferences, activities, and experiences across conversations",
|
||||
"tools.builtins.lobe-user-memory.readme": "Build a personalized knowledge base about you. Remember preferences, track activities and experiences, store identity information, and recall relevant context in future conversations.",
|
||||
"tools.builtins.lobe-user-memory.title": "Memory",
|
||||
"tools.builtins.lobe-web-browsing.description": "Search the web for current information and crawl web pages to extract content. Supports multiple search engines, categories, and time ranges.",
|
||||
"tools.builtins.lobe-web-browsing.readme": "Search the web for current information and crawl web pages to extract content. Supports multiple search engines, categories, and time ranges for comprehensive research.",
|
||||
"tools.builtins.lobe-web-browsing.title": "Web Browsing",
|
||||
"tools.builtins.lobe-web-onboarding.description": "Drive the web onboarding flow with a controlled agent runtime",
|
||||
"tools.builtins.lobe-web-onboarding.title": "Web Onboarding",
|
||||
"tools.builtins.lobehub.description": "Manage the LobeHub platform via CLI — knowledge bases, memory, agents, files, search, generation, and more.",
|
||||
"tools.builtins.lobehub.title": "LobeHub",
|
||||
"tools.builtins.notInstalled": "Not Installed",
|
||||
"tools.builtins.task.description": "Task management and execution — create, track, review, and complete tasks via CLI.",
|
||||
"tools.builtins.task.title": "Task",
|
||||
"tools.builtins.uninstall": "Uninstall",
|
||||
"tools.builtins.uninstallConfirm.desc": "Are you sure you want to uninstall {{name}}? This skill will be removed from the current agent.",
|
||||
"tools.builtins.uninstallConfirm.title": "Uninstall {{name}}",
|
||||
@@ -950,12 +1009,16 @@
|
||||
"tools.lobehubSkill.disconnectConfirm.title": "Disconnect {{name}}?",
|
||||
"tools.lobehubSkill.disconnected": "Disconnected",
|
||||
"tools.lobehubSkill.error": "Error",
|
||||
"tools.lobehubSkill.providers.github.description": "GitHub is a platform for version control and collaboration, enabling developers to host, review, and manage code repositories.",
|
||||
"tools.lobehubSkill.providers.github.readme": "Connect to GitHub to access your repositories, create and manage issues, review pull requests, and collaborate on code—all through natural conversation with your AI assistant.",
|
||||
"tools.lobehubSkill.providers.linear.description": "Linear is a modern issue tracking and project management tool designed for high-performance teams to build better software faster",
|
||||
"tools.lobehubSkill.providers.linear.readme": "Bring the power of Linear directly into your AI assistant. Create and update issues, manage sprints, track project progress, and streamline your development workflow—all through natural conversation.",
|
||||
"tools.lobehubSkill.providers.microsoft.description": "Outlook Calendar is an integrated scheduling tool within Microsoft Outlook that enables users to create appointments, organize meetings with others, and manage their time and events effectively.",
|
||||
"tools.lobehubSkill.providers.microsoft.readme": "Integrate with Outlook Calendar to view, create, and manage your events seamlessly. Schedule meetings, check availability, set reminders, and coordinate your time—all through natural language commands.",
|
||||
"tools.lobehubSkill.providers.twitter.description": "X (Twitter) is a social media platform for sharing real-time updates, news, and engaging with your audience through posts, replies, and direct messages.",
|
||||
"tools.lobehubSkill.providers.twitter.readme": "Connect to X (Twitter) to post tweets, manage your timeline, and engage with your audience. Create content, schedule posts, monitor mentions, and build your social media presence through conversational AI.",
|
||||
"tools.lobehubSkill.providers.vercel.description": "Vercel is a cloud platform for frontend developers, providing hosting and serverless functions to deploy web applications with ease.",
|
||||
"tools.lobehubSkill.providers.vercel.readme": "Connect to Vercel to manage your deployments, monitor project status, and control your infrastructure. Deploy applications, check build logs, manage environment variables, and scale your projects through conversational AI.",
|
||||
"tools.notInstalled": "Not Installed",
|
||||
"tools.notInstalledWarning": "This skill is not currently installed, which may affect agent functionality.",
|
||||
"tools.plugins.enabled": "Enabled: {{num}}",
|
||||
|
||||
@@ -8,11 +8,14 @@
|
||||
"config.imageUrl.label": "Start Frame",
|
||||
"config.prompt.placeholder": "Describe the video you want to generate",
|
||||
"config.prompt.placeholderWithRef": "Describe the scene you want to generate with the image",
|
||||
"config.promptExtend.label": "Prompt Extend",
|
||||
"config.referenceImage.label": "Reference Image",
|
||||
"config.resolution.label": "Resolution",
|
||||
"config.seed.label": "Seed",
|
||||
"config.seed.random": "Random",
|
||||
"config.size.label": "Size",
|
||||
"config.watermark.label": "Watermark",
|
||||
"config.webSearch.label": "Web Search",
|
||||
"generation.actions.copyError": "Copy Error Message",
|
||||
"generation.actions.errorCopied": "Error Message Copied to Clipboard",
|
||||
"generation.actions.errorCopyFailed": "Failed to Copy Error Message",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Audio",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Imagen",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Texto",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Vídeo",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Entrada ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Salida ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / imagen",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Entrada (en caché)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Entrada (escritura en caché)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Salida",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Generación de vídeo",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Lanzado el {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "No hay modelos habilitados. Ve a configuración para habilitar uno.",
|
||||
"ModelSwitchPanel.emptyProvider": "No hay proveedores habilitados. Ve a configuración para habilitar uno.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Incorporación del Agente",
|
||||
"agent.completionSubtitle": "Tu asistente está configurado y listo para comenzar.",
|
||||
"agent.completionTitle": "¡Todo Listo!",
|
||||
"agent.enterApp": "Entrar a la Aplicación",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Cuando tú digas :)",
|
||||
"agent.completion.sentence.readyWithName": "Aquí {{name}} — ¡listo cuando tú quieras!",
|
||||
"agent.completionSubtitle": "Todo está listo. Empecemos cuando te venga bien.",
|
||||
"agent.completionTitle": "Ya casi lo tienes",
|
||||
"agent.enterApp": "Estoy listo",
|
||||
"agent.greeting.emojiLabel": "Emoji",
|
||||
"agent.greeting.nameLabel": "Nombre",
|
||||
"agent.greeting.namePlaceholder": "p. ej. Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "p. ej. Cálido y amigable, Directo y preciso...",
|
||||
"agent.history.current": "Actual",
|
||||
"agent.history.title": "Temas del Historial",
|
||||
"agent.layout.mode.agent": "modo agente",
|
||||
"agent.layout.mode.classic": "modo clásico",
|
||||
"agent.layout.skip": "omitir este paso",
|
||||
"agent.layout.skipConfirm.content": "¿Ya te vas? Puedo ayudarte a personalizar todo en solo unos segundos.",
|
||||
"agent.layout.skipConfirm.ok": "Omitir por ahora",
|
||||
"agent.layout.skipConfirm.title": "¿Omitir la configuración inicial por ahora?",
|
||||
"agent.layout.switchMessage": "¿No te convence hoy? Puedes cambiar a <modeLink><modeText>{{mode}}</modeText></modeLink> o <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Conversacional",
|
||||
"agent.modeSwitch.classic": "Clásico",
|
||||
"agent.modeSwitch.debug": "Exportar Depuración",
|
||||
"agent.modeSwitch.label": "Elige tu modo de incorporación",
|
||||
"agent.modeSwitch.reset": "Reiniciar Flujo",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Omitir incorporación",
|
||||
"agent.stage.agentIdentity": "Identidad del Agente",
|
||||
"agent.stage.painPoints": "Puntos Problemáticos",
|
||||
"agent.stage.proSettings": "Configuración Avanzada",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "También puedes responder con tus propias palabras.",
|
||||
"agent.title": "Incorporación Conversacional",
|
||||
"agent.welcome": "...¿hm? Acabo de despertar — mi mente está en blanco. ¿Quién eres? Y — ¿cómo debería llamarme? También necesito un nombre.",
|
||||
"agent.welcome.footer": "Configura tu Lobe AI Agent. Vive en tu servidor, aprende de cada interacción y se vuelve más potente cuanto más tiempo funciona.",
|
||||
"agent.welcome.guide.growTogether.desc": "Con cada conversación, te comprenderé mejor y me convertiré en un compañero más sólido con el tiempo.",
|
||||
"agent.welcome.guide.growTogether.title": "Crecer contigo",
|
||||
"agent.welcome.guide.knowYou.desc": "¿Qué tienes entre manos estos días? Un poco de contexto me ayuda a apoyarte mejor.",
|
||||
"agent.welcome.guide.knowYou.title": "Conocerte",
|
||||
"agent.welcome.guide.name.desc": "Dame un nombre para que todo se sienta más personal desde el principio.",
|
||||
"agent.welcome.guide.name.title": "Ponme un nombre",
|
||||
"agent.welcome.sentence.1": "¡Qué gusto conocerte! Vamos a conocernos mejor.",
|
||||
"agent.welcome.sentence.2": "¿Qué tipo de compañero quieres que sea?",
|
||||
"agent.welcome.sentence.3": "Primero, dame un nombre :)",
|
||||
"back": "Volver",
|
||||
"finish": "Comenzar",
|
||||
"interests.area.business": "Negocios y Estrategia",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Versión del framework Electron",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Versión de Node.js integrada",
|
||||
"settingSystemTools.appEnvironment.title": "Entorno de la aplicación",
|
||||
"settingSystemTools.autoSelectDesc": "La mejor herramienta disponible se seleccionará automáticamente",
|
||||
"settingSystemTools.category.browserAutomation": "Automatización del Navegador",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Herramientas para la automatización de navegadores sin cabeza e interacción web",
|
||||
"settingSystemTools.category.contentSearch": "Búsqueda de contenido",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"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}} / تصویر",
|
||||
@@ -139,6 +140,7 @@
|
||||
"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": "ارائهدهندهای فعال نیست. لطفاً به تنظیمات بروید و یکی را فعال کنید.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "آموزش نماینده",
|
||||
"agent.completionSubtitle": "دستیار شما تنظیم شده و آماده استفاده است.",
|
||||
"agent.completionTitle": "همه چیز آماده است!",
|
||||
"agent.enterApp": "ورود به برنامه",
|
||||
"agent.completion.sentence.readyWhenYouAre": "هر وقت آماده بودی :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} اینجاست - من آمادهام!",
|
||||
"agent.completionSubtitle": "همهچیز مهیاست - هر وقت آماده بودی شروع میکنیم.",
|
||||
"agent.completionTitle": "تقریباً تمام شد",
|
||||
"agent.enterApp": "آمادهام",
|
||||
"agent.greeting.emojiLabel": "ایموجی",
|
||||
"agent.greeting.nameLabel": "نام",
|
||||
"agent.greeting.namePlaceholder": "مثلاً لومی، اطلس، نکو...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"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": "تنظیمات پیشرفته",
|
||||
@@ -33,6 +41,16 @@
|
||||
"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": "کسبوکار و استراتژی",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"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": "جستجوی محتوا",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Audio",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Image",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Texte",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Vidéo",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Entrée ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Sortie ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / image",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Entrée (en cache)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Entrée (écriture en cache)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Sortie",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Génération de vidéo",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Publié le {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "Aucun modèle activé. Veuillez aller dans les paramètres pour en activer un.",
|
||||
"ModelSwitchPanel.emptyProvider": "Aucun fournisseur activé. Veuillez aller dans les paramètres pour en activer un.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Intégration de l'agent",
|
||||
"agent.completionSubtitle": "Votre assistant est configuré et prêt à l'emploi.",
|
||||
"agent.completionTitle": "Tout est prêt !",
|
||||
"agent.enterApp": "Entrer dans l'application",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Prêt quand vous l'êtes :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} ici — je suis prêt !",
|
||||
"agent.completionSubtitle": "Tout est en place — commençons quand vous le souhaitez.",
|
||||
"agent.completionTitle": "Vous y êtes presque",
|
||||
"agent.enterApp": "Je suis prêt",
|
||||
"agent.greeting.emojiLabel": "Émoji",
|
||||
"agent.greeting.nameLabel": "Nom",
|
||||
"agent.greeting.namePlaceholder": "par ex. Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "par ex. Chaleureux et amical, Franc et direct...",
|
||||
"agent.history.current": "Actuel",
|
||||
"agent.history.title": "Sujets historiques",
|
||||
"agent.layout.mode.agent": "mode agent",
|
||||
"agent.layout.mode.classic": "mode classique",
|
||||
"agent.layout.skip": "passer cette étape",
|
||||
"agent.layout.skipConfirm.content": "Vous partez déjà ? Je peux personnaliser les choses pour vous en quelques secondes.",
|
||||
"agent.layout.skipConfirm.ok": "Passer pour le moment",
|
||||
"agent.layout.skipConfirm.title": "Passer l'initialisation pour l'instant ?",
|
||||
"agent.layout.switchMessage": "Pas d'humeur aujourd'hui ? Vous pouvez passer en <modeLink><modeText>{{mode}}</modeText></modeLink> ou <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Conversationnel",
|
||||
"agent.modeSwitch.classic": "Classique",
|
||||
"agent.modeSwitch.debug": "Exportation de débogage",
|
||||
"agent.modeSwitch.label": "Choisissez votre mode d'intégration",
|
||||
"agent.modeSwitch.reset": "Réinitialiser le processus",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Passer l'intégration",
|
||||
"agent.stage.agentIdentity": "Identité de l'agent",
|
||||
"agent.stage.painPoints": "Points sensibles",
|
||||
"agent.stage.proSettings": "Configuration avancée",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "Vous pouvez également répondre avec vos propres mots.",
|
||||
"agent.title": "Intégration par conversation",
|
||||
"agent.welcome": "...hm ? Je viens de me réveiller — mon esprit est vide. Qui êtes-vous ? Et — comment devrais-je m'appeler ? J'ai besoin d'un nom aussi.",
|
||||
"agent.welcome.footer": "Configurez votre agent Lobe AI. Il fonctionne sur votre serveur, apprend à chaque interaction et devient plus performant au fil du temps.",
|
||||
"agent.welcome.guide.growTogether.desc": "À chaque discussion, je vous comprendrai mieux et, avec le temps, je deviendrai un coéquipier plus efficace.",
|
||||
"agent.welcome.guide.growTogether.title": "Évoluer avec vous",
|
||||
"agent.welcome.guide.knowYou.desc": "Qu'avez-vous au programme ces temps-ci ? Un peu de contexte m'aidera à mieux vous assister.",
|
||||
"agent.welcome.guide.knowYou.title": "Mieux vous connaître",
|
||||
"agent.welcome.guide.name.desc": "Donnez-moi un nom pour que cela paraisse plus personnalisé dès le départ.",
|
||||
"agent.welcome.guide.name.title": "Donnez-moi un nom",
|
||||
"agent.welcome.sentence.1": "Ravi de vous rencontrer ! Faisons connaissance.",
|
||||
"agent.welcome.sentence.2": "Quel type de partenaire voulez-vous que je sois ?",
|
||||
"agent.welcome.sentence.3": "D'abord, donnez-moi un nom :)",
|
||||
"back": "Retour",
|
||||
"finish": "Commencer",
|
||||
"interests.area.business": "Affaires & Stratégie",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Version du framework Electron",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Version de Node.js intégrée",
|
||||
"settingSystemTools.appEnvironment.title": "Environnement de l'application",
|
||||
"settingSystemTools.autoSelectDesc": "L'outil le plus performant sera sélectionné automatiquement",
|
||||
"settingSystemTools.category.browserAutomation": "Automatisation du navigateur",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Outils pour l'automatisation de navigateur sans interface et l'interaction web",
|
||||
"settingSystemTools.category.contentSearch": "Recherche de contenu",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Audio",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Immagine",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Testo",
|
||||
"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}} / immagine",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Input (Memorizzato)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Input (Scrittura Cache)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Output",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Generazione Video",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Rilasciato il {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "Nessun modello abilitato. Vai alle impostazioni per abilitarne uno.",
|
||||
"ModelSwitchPanel.emptyProvider": "Nessun provider abilitato. Vai alle impostazioni per abilitarne uno.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Introduzione Agente",
|
||||
"agent.completionSubtitle": "Il tuo assistente è configurato e pronto all'uso.",
|
||||
"agent.completionTitle": "Tutto Pronto!",
|
||||
"agent.enterApp": "Accedi all'App",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Quando sei pronto :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} qui - sono pronto!",
|
||||
"agent.completionSubtitle": "È tutto pronto: iniziamo quando vuoi.",
|
||||
"agent.completionTitle": "Ci sei quasi",
|
||||
"agent.enterApp": "Sono pronto",
|
||||
"agent.greeting.emojiLabel": "Emoji",
|
||||
"agent.greeting.nameLabel": "Nome",
|
||||
"agent.greeting.namePlaceholder": "es. Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "es. Caldo e amichevole, Tagliente e diretto...",
|
||||
"agent.history.current": "Corrente",
|
||||
"agent.history.title": "Argomenti della Cronologia",
|
||||
"agent.layout.mode.agent": "modalità agente",
|
||||
"agent.layout.mode.classic": "modalità classica",
|
||||
"agent.layout.skip": "salta questo passaggio",
|
||||
"agent.layout.skipConfirm.content": "Vai già via? Posso aiutarti a personalizzare tutto in pochi secondi.",
|
||||
"agent.layout.skipConfirm.ok": "Salta per ora",
|
||||
"agent.layout.skipConfirm.title": "Saltare l’onboarding per ora?",
|
||||
"agent.layout.switchMessage": "Non è giornata? Puoi passare a <modeLink><modeText>{{mode}}</modeText></modeLink> oppure a <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Conversazionale",
|
||||
"agent.modeSwitch.classic": "Classico",
|
||||
"agent.modeSwitch.debug": "Esportazione Debug",
|
||||
"agent.modeSwitch.label": "Scegli la modalità di introduzione",
|
||||
"agent.modeSwitch.reset": "Reimposta Flusso",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Salta introduzione",
|
||||
"agent.stage.agentIdentity": "Identità dell'Agente",
|
||||
"agent.stage.painPoints": "Punti Critici",
|
||||
"agent.stage.proSettings": "Configurazione Avanzata",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "Puoi anche rispondere con le tue parole.",
|
||||
"agent.title": "Introduzione Conversazionale",
|
||||
"agent.welcome": "...ehm? Mi sono appena svegliato — la mia mente è vuota. Chi sei? E — come dovrei chiamarmi? Ho bisogno di un nome anch'io.",
|
||||
"agent.welcome.footer": "Configura il tuo Lobe AI Agent. Vive sul tuo server, impara da ogni interazione e diventa più potente con il tempo.",
|
||||
"agent.welcome.guide.growTogether.desc": "Con ogni conversazione ti capirò meglio e diventerò un alleato sempre più forte.",
|
||||
"agent.welcome.guide.growTogether.title": "Crescere Insieme",
|
||||
"agent.welcome.guide.knowYou.desc": "Di cosa ti occupi ultimamente? Un po’ di contesto mi aiuta a supportarti meglio.",
|
||||
"agent.welcome.guide.knowYou.title": "Conoscerti",
|
||||
"agent.welcome.guide.name.desc": "Dammi un nome così tutto sembrerà più personale fin dall’inizio.",
|
||||
"agent.welcome.guide.name.title": "Dammi un Nome",
|
||||
"agent.welcome.sentence.1": "Che bello conoscerti! Cominciamo a conoscerci meglio.",
|
||||
"agent.welcome.sentence.2": "Che tipo di partner vuoi che io sia?",
|
||||
"agent.welcome.sentence.3": "Per iniziare, dammi un nome :)",
|
||||
"back": "Indietro",
|
||||
"finish": "Inizia",
|
||||
"interests.area.business": "Business e Strategia",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Versione del framework Electron",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Versione di Node.js integrata",
|
||||
"settingSystemTools.appEnvironment.title": "Ambiente app",
|
||||
"settingSystemTools.autoSelectDesc": "Lo strumento migliore disponibile verrà selezionato automaticamente",
|
||||
"settingSystemTools.category.browserAutomation": "Automazione del browser",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Strumenti per l'automazione del browser senza interfaccia grafica e l'interazione web",
|
||||
"settingSystemTools.category.contentSearch": "Ricerca Contenuti",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"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}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "出力 ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "〜 {{amount}} / 画像",
|
||||
@@ -139,6 +140,7 @@
|
||||
"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": "有効なサービスプロバイダーがありません。設定に移動して有効にしてください。",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "エージェントオンボーディング",
|
||||
"agent.completionSubtitle": "アシスタントの設定が完了し、準備が整いました。",
|
||||
"agent.completionTitle": "準備完了!",
|
||||
"agent.enterApp": "アプリに入る",
|
||||
"agent.completion.sentence.readyWhenYouAre": "準備ができたらいつでもどうぞ :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}}です。準備できています!",
|
||||
"agent.completionSubtitle": "準備は整っています。ご都合の良いときに始めましょう。",
|
||||
"agent.completionTitle": "もう少しで完了です",
|
||||
"agent.enterApp": "準備できました",
|
||||
"agent.greeting.emojiLabel": "絵文字",
|
||||
"agent.greeting.nameLabel": "名前",
|
||||
"agent.greeting.namePlaceholder": "例: ルミ、アトラス、ネコ...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"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": "高度な設定",
|
||||
@@ -33,6 +41,16 @@
|
||||
"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": "ビジネスと戦略",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"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": "コンテンツ検索",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"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}} / 이미지",
|
||||
@@ -139,6 +140,7 @@
|
||||
"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": "활성화된 서비스 제공자가 없습니다. 설정에서 활성화하세요.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "에이전트 온보딩",
|
||||
"agent.completionSubtitle": "당신의 어시스턴트가 설정되어 준비되었습니다.",
|
||||
"agent.completionTitle": "모든 준비가 완료되었습니다!",
|
||||
"agent.enterApp": "앱으로 들어가기",
|
||||
"agent.completion.sentence.readyWhenYouAre": "준비되시면 말씀하세요 :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}}입니다 — 준비됐어요!",
|
||||
"agent.completionSubtitle": "모든 준비가 완료되었습니다 — 준비되시면 시작해요.",
|
||||
"agent.completionTitle": "거의 다 왔어요",
|
||||
"agent.enterApp": "준비됐어요",
|
||||
"agent.greeting.emojiLabel": "이모지",
|
||||
"agent.greeting.nameLabel": "이름",
|
||||
"agent.greeting.namePlaceholder": "예: 루미, 아틀라스, 네코...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"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": "고급 설정",
|
||||
@@ -33,6 +41,16 @@
|
||||
"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": "비즈니스 및 전략",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"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": "콘텐츠 검색",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Audio",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Afbeelding",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Tekst",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Video",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Invoer ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Uitvoer ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / afbeelding",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Invoer (cache)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Invoer (cache schrijven)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Uitvoer",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Videogeneratie",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Uitgebracht op {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "Geen ingeschakeld model. Ga naar instellingen om er een in te schakelen.",
|
||||
"ModelSwitchPanel.emptyProvider": "Geen ingeschakelde providers. Ga naar instellingen om er een in te schakelen.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Agent Onboarding",
|
||||
"agent.completionSubtitle": "Je assistent is geconfigureerd en klaar om te starten.",
|
||||
"agent.completionTitle": "Alles is gereed!",
|
||||
"agent.enterApp": "App Betreden",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Zeg het maar wanneer je klaar bent :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} hier – ik ben er klaar voor!",
|
||||
"agent.completionSubtitle": "Alles staat klaar — we kunnen beginnen zodra jij zover bent.",
|
||||
"agent.completionTitle": "Je bent er bijna",
|
||||
"agent.enterApp": "Ik ben er klaar voor",
|
||||
"agent.greeting.emojiLabel": "Emoji",
|
||||
"agent.greeting.nameLabel": "Naam",
|
||||
"agent.greeting.namePlaceholder": "bijv. Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "bijv. Warm & vriendelijk, Scherp & direct...",
|
||||
"agent.history.current": "Huidig",
|
||||
"agent.history.title": "Historische Onderwerpen",
|
||||
"agent.layout.mode.agent": "agentmodus",
|
||||
"agent.layout.mode.classic": "klassieke modus",
|
||||
"agent.layout.skip": "deze stap overslaan",
|
||||
"agent.layout.skipConfirm.content": "Ga je nu al weg? Ik kan binnen enkele seconden helpen om alles voor je te personaliseren.",
|
||||
"agent.layout.skipConfirm.ok": "Voor nu overslaan",
|
||||
"agent.layout.skipConfirm.title": "Onboarding nu overslaan?",
|
||||
"agent.layout.switchMessage": "Even geen zin vandaag? Je kunt schakelen naar <modeLink><modeText>{{mode}}</modeText></modeLink> of <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Conversatie",
|
||||
"agent.modeSwitch.classic": "Klassiek",
|
||||
"agent.modeSwitch.debug": "Debug Export",
|
||||
"agent.modeSwitch.label": "Kies je onboarding modus",
|
||||
"agent.modeSwitch.reset": "Flow Resetten",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Onboarding overslaan",
|
||||
"agent.stage.agentIdentity": "Agent Identiteit",
|
||||
"agent.stage.painPoints": "Pijnpunten",
|
||||
"agent.stage.proSettings": "Geavanceerde Instellingen",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "Je kunt ook antwoorden in je eigen woorden.",
|
||||
"agent.title": "Conversatie Onboarding",
|
||||
"agent.welcome": "...hm? Ik ben net wakker — mijn gedachten zijn leeg. Wie ben jij? En — hoe moet ik genoemd worden? Ik heb ook een naam nodig.",
|
||||
"agent.welcome.footer": "Configureer je Lobe AI Agent. Hij draait op je eigen server, leert van elke interactie en wordt krachtiger naarmate hij langer actief is.",
|
||||
"agent.welcome.guide.growTogether.desc": "Met ieder gesprek leer ik je beter kennen en word ik op termijn een sterkere teammate.",
|
||||
"agent.welcome.guide.growTogether.title": "Met je meegroeien",
|
||||
"agent.welcome.guide.knowYou.desc": "Waar ben je de laatste tijd mee bezig? Een beetje context helpt me om je beter te ondersteunen.",
|
||||
"agent.welcome.guide.knowYou.title": "Jou leren kennen",
|
||||
"agent.welcome.guide.name.desc": "Geef me een naam zodat het vanaf het begin persoonlijker voelt.",
|
||||
"agent.welcome.guide.name.title": "Geef me een naam",
|
||||
"agent.welcome.sentence.1": "Leuk om je te ontmoeten! Laten we elkaar beter leren kennen.",
|
||||
"agent.welcome.sentence.2": "Wat voor partner wil je dat ik voor je ben?",
|
||||
"agent.welcome.sentence.3": "Geef me eerst een naam :)",
|
||||
"back": "Terug",
|
||||
"finish": "Aan de slag",
|
||||
"interests.area.business": "Zakelijk & Strategie",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Electron-frameworkversie",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Ingesloten Node.js-versie",
|
||||
"settingSystemTools.appEnvironment.title": "App-omgeving",
|
||||
"settingSystemTools.autoSelectDesc": "Het best beschikbare hulpmiddel wordt automatisch geselecteerd",
|
||||
"settingSystemTools.category.browserAutomation": "Browserautomatisering",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Tools voor headless browserautomatisering en webinteractie",
|
||||
"settingSystemTools.category.contentSearch": "Zoeken in Inhoud",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Audio",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Obraz",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Tekst",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Wideo",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Dane wejściowe ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Dane wyjściowe ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / obraz",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Wejście (z bufora)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Wejście (zapis do bufora)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Wyjście",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Generowanie wideo",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Wydano {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "Brak włączonych modeli. Przejdź do ustawień, aby je włączyć.",
|
||||
"ModelSwitchPanel.emptyProvider": "Brak włączonych dostawców. Przejdź do ustawień, aby włączyć jednego.",
|
||||
|
||||
@@ -846,6 +846,7 @@
|
||||
"llava.description": "LLaVA to model multimodalny łączący enkoder obrazu i Vicunę, zapewniający silne zrozumienie języka i obrazu.",
|
||||
"llava:13b.description": "LLaVA to model multimodalny łączący enkoder obrazu i Vicunę, zapewniający silne zrozumienie języka i obrazu.",
|
||||
"llava:34b.description": "LLaVA to model multimodalny łączący enkoder obrazu i Vicunę, zapewniający silne zrozumienie języka i obrazu.",
|
||||
"magistral-medium-2509.description": "Magistral Medium 1.2 to model rozumowania nowej generacji od Mistral AI (wrzesień 2025) z obsługą wizji.",
|
||||
"magistral-small-2509.description": "Magistral Small 1.2 to otwartoźródłowy, mały model wnioskowania od Mistral AI (wrzesień 2025) z obsługą wizji.",
|
||||
"mathstral.description": "MathΣtral został stworzony do badań naukowych i matematycznego wnioskowania, oferując silne możliwości obliczeniowe i wyjaśniające.",
|
||||
"max-32k.description": "Spark Max 32K obsługuje przetwarzanie dużego kontekstu z lepszym rozumieniem i wnioskowaniem, wspierając wejścia do 32K tokenów dla długich dokumentów i prywatnych zapytań wiedzy.",
|
||||
@@ -934,15 +935,25 @@
|
||||
"minimax/minimax-m2.1.description": "MiniMax-M2.1 to lekki, nowoczesny duży model językowy zoptymalizowany do programowania, przepływów proxy i nowoczesnego rozwoju aplikacji, oferujący czystsze, bardziej zwięzłe wyniki i szybszy czas reakcji.",
|
||||
"minimax/minimax-m2.description": "MiniMax-M2 to model o wysokiej wartości, który doskonale sprawdza się w zadaniach programistycznych i agentowych w wielu scenariuszach inżynieryjnych.",
|
||||
"minimaxai/minimax-m2.5.description": "MiniMax-M2.5 to najnowszy duży model językowy od MiniMax, charakteryzujący się architekturą Mixture-of-Experts (MoE) z 229 miliardami całkowitych parametrów. Osiąga wiodącą w branży wydajność w programowaniu, wywoływaniu narzędzi agenta, zadaniach wyszukiwania i scenariuszach biurowych.",
|
||||
"ministral-3:14b.description": "Ministral 3 14B to największy model z serii Ministral 3, oferujący najnowocześniejszą wydajność porównywalną z większym modelem Mistral Small 3.2 24B. Optymalizowany do lokalnego wdrożenia, zapewnia wysoką wydajność na różnych urządzeniach, w tym w lokalnych konfiguracjach.",
|
||||
"ministral-3:3b.description": "Ministral 3 3B to najmniejszy i najbardziej efektywny model z serii Ministral 3, oferujący zaawansowane możliwości językowe i wizualne w kompaktowej formie. Zaprojektowany do wdrożeń na krawędzi, zapewnia wysoką wydajność na różnych urządzeniach, w tym w lokalnych konfiguracjach.",
|
||||
"ministral-3:8b.description": "Ministral 3 8B to potężny i wydajny model z serii Ministral 3, oferujący najwyższej klasy możliwości tekstowe i wizualne. Stworzony do wdrożeń na krawędzi, zapewnia wysoką wydajność na różnych urządzeniach, w tym w lokalnych konfiguracjach.",
|
||||
"ministral-3b-latest.description": "Ministral 3B to flagowy model edge firmy Mistral.",
|
||||
"ministral-8b-latest.description": "Ministral 8B to bardzo opłacalny model edge od Mistral.",
|
||||
"mistral-ai/Mistral-Large-2411.description": "Flagowy model Mistral do złożonych zadań wymagających rozumowania na dużą skalę lub specjalizacji (generowanie tekstu syntetycznego, kodu, RAG lub agentów).",
|
||||
"mistral-ai/Mistral-Nemo.description": "Mistral Nemo to nowoczesny LLM z zaawansowanym rozumowaniem, wiedzą ogólną i umiejętnościami programistycznymi w swojej klasie.",
|
||||
"mistral-ai/mistral-small-2503.description": "Mistral Small nadaje się do każdego zadania językowego wymagającego wysokiej wydajności i niskiego opóźnienia.",
|
||||
"mistral-large-2411.description": "Mistral Large to flagowy model, doskonały w zadaniach wielojęzycznych, złożonym rozumowaniu i generowaniu kodu—idealny do zaawansowanych zastosowań.",
|
||||
"mistral-large-2512.description": "Mistral Large 3 to najnowocześniejszy, otwarto-wagowy, ogólnego przeznaczenia model multimodalny z granularną architekturą Mixture-of-Experts. Posiada 41 miliardów aktywnych parametrów i 675 miliardów parametrów ogółem.",
|
||||
"mistral-large-3:675b.description": "Mistral Large 3 to najnowocześniejszy otwarto-wagowy model ogólnego przeznaczenia multimodalny z udoskonaloną architekturą Mixture of Experts. Posiada 41 miliardów aktywnych parametrów i 675 miliardów parametrów ogółem.",
|
||||
"mistral-large-instruct.description": "Mistral-Large-Instruct-2407 to zaawansowany gęsty LLM z 123 miliardami parametrów, oferujący najnowocześniejsze rozumowanie, wiedzę i programowanie.",
|
||||
"mistral-large-latest.description": "Mistral Large to flagowy model, wyróżniający się w zadaniach wielojęzycznych, złożonym rozumowaniu i generowaniu kodu dla zaawansowanych zastosowań.",
|
||||
"mistral-large.description": "Mixtral Large to flagowy model Mistral, łączący generowanie kodu, matematykę i rozumowanie z oknem kontekstu 128K.",
|
||||
"mistral-medium-2508.description": "Mistral Medium 3.1 oferuje najnowocześniejszą wydajność przy 8-krotnie niższych kosztach i upraszcza wdrożenia w przedsiębiorstwach.",
|
||||
"mistral-nemo-instruct.description": "Mistral-Nemo-Instruct-2407 to wersja dostrojona do instrukcji modelu Mistral-Nemo-Base-2407.",
|
||||
"mistral-nemo.description": "Mistral Nemo to wydajny model 12B od Mistral AI i NVIDIA.",
|
||||
"mistral-small-2506.description": "Mistral Small to ekonomiczna, szybka i niezawodna opcja do tłumaczeń, streszczeń i analizy sentymentu.",
|
||||
"mistral-small-2603.description": "Potężny hybrydowy model Mistral łączący możliwości instrukcji, rozumowania i kodowania w jednym modelu. 119 miliardów parametrów z 6,5 miliarda aktywnych.",
|
||||
"mistral-small-latest.description": "Mistral Small to opłacalna, szybka i niezawodna opcja do tłumaczeń, streszczeń i analizy sentymentu.",
|
||||
"mistral-small.description": "Mistral Small nadaje się do każdego zadania językowego wymagającego wysokiej wydajności i niskiego opóźnienia.",
|
||||
"mistral.description": "Mistral to model 7B od Mistral AI, odpowiedni do różnorodnych zadań językowych.",
|
||||
@@ -988,6 +999,11 @@
|
||||
"moonshotai/kimi-k2.description": "Kimi K2 to duży model MoE od Moonshot AI z 1T łącznych parametrów i 32B aktywnych na przebieg, zoptymalizowany pod kątem możliwości agentowych, w tym zaawansowanego użycia narzędzi, rozumowania i syntezy kodu.",
|
||||
"morph/morph-v3-fast.description": "Morph to wyspecjalizowany model do stosowania zmian w kodzie sugerowanych przez czołowe modele (np. Claude lub GPT-4o) w istniejących plikach z prędkością 4500+ tokenów/sek. To końcowy etap w przepływie pracy AI w kodowaniu i obsługuje 16k tokenów wejścia/wyjścia.",
|
||||
"morph/morph-v3-large.description": "Morph to wyspecjalizowany model do stosowania zmian w kodzie sugerowanych przez czołowe modele (np. Claude lub GPT-4o) w istniejących plikach z prędkością 2500+ tokenów/sek. To końcowy etap w przepływie pracy AI w kodowaniu i obsługuje 16k tokenów wejścia/wyjścia.",
|
||||
"musesteamer-2.0-lite-i2v.description": "W porównaniu do Turbo oferuje lepszą wydajność przy doskonałej efektywności kosztowej.",
|
||||
"musesteamer-2.0-pro-i2v.description": "Opierając się na Turbo, obsługuje generowanie dynamicznego wideo w 1080P, oferując wyższą jakość wizualną i lepszą ekspresję wideo.",
|
||||
"musesteamer-2.0-turbo-i2v-audio.description": "Obsługuje generowanie dynamicznego wideo 720P na 5 i 10 sekund z dźwiękiem. Umożliwia wieloosobowe tworzenie audiowizualne z synchronizacją dźwięku i obrazu, obrazami o jakości kinowej i mistrzowskimi ruchami kamery.",
|
||||
"musesteamer-2.0-turbo-i2v.description": "Obsługuje generowanie dynamicznego wideo 720P na 5 sekund bez dźwięku, oferując obrazy o jakości kinowej, złożone ruchy kamery oraz realistyczne emocje i działania postaci.",
|
||||
"musesteamer-air-i2v.description": "Model generowania wideo Baidu MuseSteamer Air wyróżnia się spójnością tematyczną, realizmem fizycznym, efektami ruchu kamery i szybkością generowania. Obsługuje generowanie dynamicznego wideo 720P na 5 sekund bez dźwięku, oferując obrazy o jakości kinowej, szybkie generowanie i doskonałą efektywność kosztową.",
|
||||
"musesteamer-air-image.description": "musesteamer-air-image to model generowania obrazów opracowany przez zespół wyszukiwania Baidu, oferujący wyjątkowy stosunek kosztów do wydajności. Szybko generuje wyraźne, spójne obrazy na podstawie wskazówek użytkownika, łatwo przekształcając opisy użytkownika w wizualizacje.",
|
||||
"nousresearch/hermes-2-pro-llama-3-8b.description": "Hermes 2 Pro Llama 3 8B to zaktualizowana wersja Nous Hermes 2 z najnowszymi wewnętrznie opracowanymi zbiorami danych.",
|
||||
"nvidia/Llama-3.1-Nemotron-70B-Instruct-HF.description": "Llama 3.1 Nemotron 70B to dostosowany przez NVIDIA model LLM poprawiający pomocność. Osiąga najwyższe wyniki w Arena Hard, AlpacaEval 2 LC i GPT-4-Turbo MT-Bench, zajmując 1. miejsce we wszystkich trzech testach auto-alignment na dzień 1 października 2024. Trening oparty na Llama-3.1-70B-Instruct z użyciem RLHF (REINFORCE), Llama-3.1-Nemotron-70B-Reward i HelpSteer2-Preference prompts.",
|
||||
@@ -1057,6 +1073,11 @@
|
||||
"phi3:14b.description": "Phi-3 to lekki, otwarty model Microsoftu przeznaczony do efektywnej integracji i rozumowania na dużą skalę.",
|
||||
"pixtral-12b-2409.description": "Pixtral doskonale radzi sobie z analizą wykresów i obrazów, odpowiadaniem na pytania dotyczące dokumentów, rozumowaniem multimodalnym oraz wykonywaniem poleceń. Obsługuje obrazy w natywnej rozdzielczości i proporcjach oraz dowolną liczbę obrazów w kontekście do 128K.",
|
||||
"pixtral-large-latest.description": "Pixtral Large to otwarty model multimodalny z 124 miliardami parametrów, oparty na Mistral Large 2 – drugiej generacji naszej rodziny modeli multimodalnych, oferujący zaawansowane rozumienie obrazów.",
|
||||
"pixverse/pixverse-v5.6-it2v.description": "Prześlij dowolny obraz, aby swobodnie dostosować historię, tempo i styl, generując żywe i spójne filmy. PixVerse V5.6 to samodzielnie opracowany model generowania wideo przez Aishi Technology, oferujący kompleksowe ulepszenia zarówno w zakresie tekstu na wideo, jak i obrazu na wideo. Model znacząco poprawia klarowność obrazu, stabilność w złożonych ruchach oraz synchronizację audiowizualną. Dokładność synchronizacji ruchu warg i naturalna ekspresja emocji są ulepszone w scenach dialogowych z wieloma postaciami. Kompozycja, oświetlenie i spójność tekstur również zostały zoptymalizowane, podnosząc ogólną jakość generowania. PixVerse V5.6 plasuje się w czołówce globalnej na liście liderów Artificial Analysis w zakresie tekstu na wideo i obrazu na wideo.",
|
||||
"pixverse/pixverse-v5.6-kf2v.description": "Osiągnij płynne przejścia między dowolnymi dwoma obrazami, tworząc bardziej naturalne zmiany scen z efektownymi wizualizacjami. PixVerse V5.6 to samodzielnie opracowany model generowania wideo przez Aishi Technology, oferujący kompleksowe ulepszenia zarówno w zakresie tekstu na wideo, jak i obrazu na wideo. Model znacząco poprawia klarowność obrazu, stabilność w złożonych ruchach oraz synchronizację audiowizualną. Dokładność synchronizacji ruchu warg i naturalna ekspresja emocji są ulepszone w scenach dialogowych z wieloma postaciami. Kompozycja, oświetlenie i spójność tekstur również zostały zoptymalizowane, podnosząc ogólną jakość generowania. PixVerse V5.6 plasuje się w czołówce globalnej na liście liderów Artificial Analysis w zakresie tekstu na wideo i obrazu na wideo.",
|
||||
"pixverse/pixverse-v5.6-r2v.description": "Wprowadź 2–7 obrazów, aby inteligentnie połączyć różne tematy, zachowując jednolity styl i skoordynowany ruch, łatwo budując bogate sceny narracyjne i zwiększając kontrolę nad treścią oraz swobodę twórczą. PixVerse V5.6 to samodzielnie opracowany model generowania wideo przez Aishi Technology, oferujący kompleksowe ulepszenia zarówno w zakresie tekstu na wideo, jak i obrazu na wideo. Model znacząco poprawia klarowność obrazu, stabilność w złożonych ruchach oraz synchronizację audiowizualną. Dokładność synchronizacji ruchu warg i naturalna ekspresja emocji są ulepszone w scenach dialogowych z wieloma postaciami. Kompozycja, oświetlenie i spójność tekstur również zostały zoptymalizowane, podnosząc ogólną jakość generowania. PixVerse V5.6 plasuje się w czołówce globalnej na liście liderów Artificial Analysis w zakresie tekstu na wideo i obrazu na wideo.",
|
||||
"pixverse/pixverse-v5.6-t2v.description": "Wprowadź opis tekstowy, aby generować wysokiej jakości filmy z szybkością na poziomie sekund i precyzyjnym dopasowaniem semantycznym, obsługując różne style. PixVerse V5.6 to samodzielnie opracowany model generowania wideo przez Aishi Technology, oferujący kompleksowe ulepszenia zarówno w zakresie tekstu na wideo, jak i obrazu na wideo. Model znacząco poprawia klarowność obrazu, stabilność w złożonych ruchach oraz synchronizację audiowizualną. Dokładność synchronizacji ruchu warg i naturalna ekspresja emocji są ulepszone w scenach dialogowych z wieloma postaciami. Kompozycja, oświetlenie i spójność tekstur również zostały zoptymalizowane, podnosząc ogólną jakość generowania. PixVerse V5.6 plasuje się w czołówce globalnej na liście liderów Artificial Analysis w zakresie tekstu na wideo i obrazu na wideo.",
|
||||
"pixverse/pixverse-v6-it2v.description": "V6 to nowy model PixVerse wprowadzony pod koniec marca 2026 roku. Jego model it2v (obraz na wideo) zajmuje drugie miejsce na świecie. Oprócz możliwości sterowania za pomocą podpowiedzi w t2v (tekst na wideo), it2v może dokładnie odtwarzać kolory, nasycenie, sceny i cechy postaci z obrazów referencyjnych, oferując silniejsze emocje postaci i wydajność w szybkich ruchach. Obsługuje filmy do 15 sekund, bezpośrednie wyjście muzyki i wideo oraz wiele języków. Idealny do scenariuszy takich jak zbliżenia produktów e-commerce, promocje reklamowe i symulowane modelowanie C4D do prezentacji struktur produktów, z możliwością jednego kliknięcia do bezpośredniego wyjścia.",
|
||||
"pro-128k.description": "Spark Pro 128K oferuje bardzo dużą pojemność kontekstu – do 128K, idealną do analizy długich dokumentów wymagających pełnej analizy tekstu i spójności logicznej, z płynnym rozumowaniem i wsparciem dla różnorodnych cytowań w złożonych dyskusjach.",
|
||||
"pro-deepseek-r1.description": "Dedykowany model usługowy dla przedsiębiorstw z wbudowaną obsługą współbieżności.",
|
||||
"pro-deepseek-v3.description": "Dedykowany model usługowy dla przedsiębiorstw z wbudowaną obsługą współbieżności.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Wprowadzenie Agenta",
|
||||
"agent.completionSubtitle": "Twój asystent jest skonfigurowany i gotowy do działania.",
|
||||
"agent.completionTitle": "Wszystko gotowe!",
|
||||
"agent.enterApp": "Wejdź do aplikacji",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Jestem gotów, kiedy Ty będziesz :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} w gotowości – możemy zaczynać!",
|
||||
"agent.completionSubtitle": "Wszystko przygotowane – zaczniemy, gdy tylko dasz znak.",
|
||||
"agent.completionTitle": "Jesteś już prawie na miejscu",
|
||||
"agent.enterApp": "Jestem gotów",
|
||||
"agent.greeting.emojiLabel": "Emoji",
|
||||
"agent.greeting.nameLabel": "Imię",
|
||||
"agent.greeting.namePlaceholder": "np. Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "np. Ciepły i przyjazny, Ostry i bezpośredni...",
|
||||
"agent.history.current": "Bieżące",
|
||||
"agent.history.title": "Tematy historii",
|
||||
"agent.layout.mode.agent": "tryb agenta",
|
||||
"agent.layout.mode.classic": "tryb klasyczny",
|
||||
"agent.layout.skip": "pomiń ten krok",
|
||||
"agent.layout.skipConfirm.content": "Już wychodzisz? Mogę pomóc spersonalizować wszystko w kilka sekund.",
|
||||
"agent.layout.skipConfirm.ok": "Pomiń na razie",
|
||||
"agent.layout.skipConfirm.title": "Pominąć konfigurację wstępną?",
|
||||
"agent.layout.switchMessage": "Nie masz dziś ochoty? Możesz przełączyć na <modeLink><modeText>{{mode}}</modeText></modeLink> lub <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Konwersacyjny",
|
||||
"agent.modeSwitch.classic": "Klasyczny",
|
||||
"agent.modeSwitch.debug": "Eksport debugowania",
|
||||
"agent.modeSwitch.label": "Wybierz tryb wprowadzenia",
|
||||
"agent.modeSwitch.reset": "Zresetuj proces",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Pomiń wprowadzenie",
|
||||
"agent.stage.agentIdentity": "Tożsamość Agenta",
|
||||
"agent.stage.painPoints": "Problemy",
|
||||
"agent.stage.proSettings": "Zaawansowana konfiguracja",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "Możesz również odpowiedzieć własnymi słowami.",
|
||||
"agent.title": "Wprowadzenie do rozmowy",
|
||||
"agent.welcome": "...hm? Właśnie się obudziłem — moja głowa jest pusta. Kim jesteś? I — jak mam się nazywać? Potrzebuję też imienia.",
|
||||
"agent.welcome.footer": "Skonfiguruj swojego agenta Lobe AI. Działa na Twoim serwerze, uczy się z każdej interakcji i staje się potężniejszy z czasem.",
|
||||
"agent.welcome.guide.growTogether.desc": "Z każdą rozmową będę lepiej Cię rozumieć i z biegiem czasu stanę się jeszcze lepszym wsparciem.",
|
||||
"agent.welcome.guide.growTogether.title": "Rozwijajmy się razem",
|
||||
"agent.welcome.guide.knowYou.desc": "Nad czym ostatnio pracujesz? Trochę kontekstu pomoże mi lepiej Cię wspierać.",
|
||||
"agent.welcome.guide.knowYou.title": "Poznajmy się",
|
||||
"agent.welcome.guide.name.desc": "Nadaj mi imię, aby od początku było bardziej osobiste.",
|
||||
"agent.welcome.guide.name.title": "Nazwij mnie",
|
||||
"agent.welcome.sentence.1": "Miło Cię poznać! Poznajmy się lepiej.",
|
||||
"agent.welcome.sentence.2": "Jakim partnerem mam dla Ciebie być?",
|
||||
"agent.welcome.sentence.3": "Najpierw nadaj mi imię :)",
|
||||
"back": "Wstecz",
|
||||
"finish": "Zaczynamy",
|
||||
"interests.area.business": "Biznes i strategia",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Wersja frameworka Electron",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Wersja wbudowanego Node.js",
|
||||
"settingSystemTools.appEnvironment.title": "Środowisko aplikacji",
|
||||
"settingSystemTools.autoSelectDesc": "Najlepsze dostępne narzędzie zostanie wybrane automatycznie",
|
||||
"settingSystemTools.category.browserAutomation": "Automatyzacja przeglądarki",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Narzędzia do automatyzacji przeglądarki bez interfejsu graficznego i interakcji z siecią",
|
||||
"settingSystemTools.category.contentSearch": "Wyszukiwanie treści",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Áudio",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Imagem",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Texto",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Vídeo",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Entrada ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Saída ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / imagem",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Entrada (em Cache)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Entrada (Gravação em Cache)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Saída",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Geração de Vídeo",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Lançado em {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "Nenhum modelo ativado. Vá para as configurações para ativar.",
|
||||
"ModelSwitchPanel.emptyProvider": "Nenhum provedor ativado. Vá para as configurações para ativar um.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Integração do Agente",
|
||||
"agent.completionSubtitle": "Seu assistente está configurado e pronto para uso.",
|
||||
"agent.completionTitle": "Tudo Pronto!",
|
||||
"agent.enterApp": "Entrar no Aplicativo",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Pronto quando você estiver :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} aqui — pronto para começar!",
|
||||
"agent.completionSubtitle": "Tudo preparado — é só começar quando quiser.",
|
||||
"agent.completionTitle": "Você está quase lá",
|
||||
"agent.enterApp": "Estou pronto",
|
||||
"agent.greeting.emojiLabel": "Emoji",
|
||||
"agent.greeting.nameLabel": "Nome",
|
||||
"agent.greeting.namePlaceholder": "ex.: Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "ex.: Caloroso e amigável, Direto e objetivo...",
|
||||
"agent.history.current": "Atual",
|
||||
"agent.history.title": "Tópicos do Histórico",
|
||||
"agent.layout.mode.agent": "modo agente",
|
||||
"agent.layout.mode.classic": "modo clássico",
|
||||
"agent.layout.skip": "pular esta etapa",
|
||||
"agent.layout.skipConfirm.content": "Indo embora já? Posso ajudar a personalizar tudo para você em poucos segundos.",
|
||||
"agent.layout.skipConfirm.ok": "Pular por enquanto",
|
||||
"agent.layout.skipConfirm.title": "Pular a configuração inicial agora?",
|
||||
"agent.layout.switchMessage": "Não está no clima hoje? Você pode mudar para <modeLink><modeText>{{mode}}</modeText></modeLink> ou <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Conversacional",
|
||||
"agent.modeSwitch.classic": "Clássico",
|
||||
"agent.modeSwitch.debug": "Exportar Depuração",
|
||||
"agent.modeSwitch.label": "Escolha seu modo de integração",
|
||||
"agent.modeSwitch.reset": "Reiniciar Fluxo",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Pular integração",
|
||||
"agent.stage.agentIdentity": "Identidade do Agente",
|
||||
"agent.stage.painPoints": "Pontos de Dor",
|
||||
"agent.stage.proSettings": "Configuração Avançada",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "Você também pode responder com suas próprias palavras.",
|
||||
"agent.title": "Integração por Conversa",
|
||||
"agent.welcome": "...hm? Acabei de acordar — minha mente está vazia. Quem é você? E — como devo ser chamado? Preciso de um nome também.",
|
||||
"agent.welcome.footer": "Configure seu Lobe AI Agent. Ele vive no seu servidor, aprende com cada interação e se torna mais poderoso quanto mais tempo estiver em uso.",
|
||||
"agent.welcome.guide.growTogether.desc": "A cada conversa, vou entender você melhor e me tornar um parceiro mais forte ao longo do tempo.",
|
||||
"agent.welcome.guide.growTogether.title": "Crescer com Você",
|
||||
"agent.welcome.guide.knowYou.desc": "O que anda ocupando seu tempo hoje em dia? Um pouco de contexto me ajuda a apoiar você melhor.",
|
||||
"agent.welcome.guide.knowYou.title": "Conhecer Você",
|
||||
"agent.welcome.guide.name.desc": "Dê-me um nome para deixar tudo mais pessoal desde o começo.",
|
||||
"agent.welcome.guide.name.title": "Dar um Nome",
|
||||
"agent.welcome.sentence.1": "Muito prazer! Vamos nos conhecer melhor.",
|
||||
"agent.welcome.sentence.2": "Que tipo de parceiro você quer que eu seja?",
|
||||
"agent.welcome.sentence.3": "Primeiro, me dê um nome :)",
|
||||
"back": "Voltar",
|
||||
"finish": "Começar",
|
||||
"interests.area.business": "Negócios e Estratégia",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Versão do framework Electron",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Versão do Node.js integrada",
|
||||
"settingSystemTools.appEnvironment.title": "Ambiente do aplicativo",
|
||||
"settingSystemTools.autoSelectDesc": "A melhor ferramenta disponível será selecionada automaticamente",
|
||||
"settingSystemTools.category.browserAutomation": "Automação de Navegador",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Ferramentas para automação de navegador sem interface gráfica e interação com a web",
|
||||
"settingSystemTools.category.contentSearch": "Busca de Conteúdo",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"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}} / изображение",
|
||||
@@ -139,6 +140,7 @@
|
||||
"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": "Нет включённых провайдеров. Перейдите в настройки, чтобы включить одного из них.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Настройка агента",
|
||||
"agent.completionSubtitle": "Ваш помощник настроен и готов к работе.",
|
||||
"agent.completionTitle": "Все готово!",
|
||||
"agent.enterApp": "Войти в приложение",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Готов, как только вы будете готовы :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} на связи — готов приступить!",
|
||||
"agent.completionSubtitle": "Всё готово — начнём, когда вы будете готовы.",
|
||||
"agent.completionTitle": "Почти всё готово",
|
||||
"agent.enterApp": "Я готов",
|
||||
"agent.greeting.emojiLabel": "Эмодзи",
|
||||
"agent.greeting.nameLabel": "Имя",
|
||||
"agent.greeting.namePlaceholder": "например, Луми, Атлас, Неко...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"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": "Расширенные настройки",
|
||||
@@ -33,6 +41,16 @@
|
||||
"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": "Бизнес и стратегия",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"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": "Поиск по содержимому",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Ses",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Görsel",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Metin",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Video",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Girdi ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Çıktı ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / resim",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Girdi (Önbellekten)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Girdi (Önbelleğe Yazma)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Çıktı",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Video Oluşturma",
|
||||
"ModelSwitchPanel.detail.releasedAt": "{{date}} tarihinde yayınlandı",
|
||||
"ModelSwitchPanel.emptyModel": "Etkinleştirilmiş model yok. Lütfen ayarlardan etkinleştirin.",
|
||||
"ModelSwitchPanel.emptyProvider": "Etkinleştirilmiş sağlayıcı yok. Lütfen ayarlardan birini etkinleştirin.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Temsilci Başlatma",
|
||||
"agent.completionSubtitle": "Asistanınız yapılandırıldı ve kullanıma hazır.",
|
||||
"agent.completionTitle": "Her Şey Hazır!",
|
||||
"agent.enterApp": "Uygulamaya Gir",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Hazır olduğunda ben de hazırım :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} burada - hazırım!",
|
||||
"agent.completionSubtitle": "Her şey hazır - ne zaman istersen başlayabiliriz.",
|
||||
"agent.completionTitle": "Neredeyse hazırsın",
|
||||
"agent.enterApp": "Hazırım",
|
||||
"agent.greeting.emojiLabel": "Emoji",
|
||||
"agent.greeting.nameLabel": "Ad",
|
||||
"agent.greeting.namePlaceholder": "ör. Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "ör. Sıcak & samimi, Keskin & direkt...",
|
||||
"agent.history.current": "Mevcut",
|
||||
"agent.history.title": "Geçmiş Konular",
|
||||
"agent.layout.mode.agent": "ajan modu",
|
||||
"agent.layout.mode.classic": "klasik mod",
|
||||
"agent.layout.skip": "bu adımı atla",
|
||||
"agent.layout.skipConfirm.content": "Şimdiden gidiyor musun? Saniyeler içinde her şeyi kişiselleştirmene yardımcı olabilirim.",
|
||||
"agent.layout.skipConfirm.ok": "Şimdilik atla",
|
||||
"agent.layout.skipConfirm.title": "Şimdilik başlangıcı atlamak istiyor musun?",
|
||||
"agent.layout.switchMessage": "Bugün modunda değil misin? <modeLink><modeText>{{mode}}</modeText></modeLink> ya da <skipLink><skipText>{{skip}}</skipText></skipLink> seçebilirsin.",
|
||||
"agent.modeSwitch.agent": "Sohbet Odaklı",
|
||||
"agent.modeSwitch.classic": "Klasik",
|
||||
"agent.modeSwitch.debug": "Hata Ayıklama Dışa Aktarımı",
|
||||
"agent.modeSwitch.label": "Başlatma modunuzu seçin",
|
||||
"agent.modeSwitch.reset": "Akışı Sıfırla",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Başlatmayı Atla",
|
||||
"agent.stage.agentIdentity": "Temsilci Kimliği",
|
||||
"agent.stage.painPoints": "Sorun Noktaları",
|
||||
"agent.stage.proSettings": "Gelişmiş Ayarlar",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "Kendi kelimelerinizle de cevap verebilirsiniz.",
|
||||
"agent.title": "Sohbet Başlatma",
|
||||
"agent.welcome": "...hm? Yeni uyandım — zihnim bomboş. Siz kimsiniz? Ve — bana ne ad vermeliyim? Bir adıma da ihtiyacım var.",
|
||||
"agent.welcome.footer": "Lobe AI Ajanını yapılandır. Sunucunda yaşar, her etkileşimden öğrenir ve çalıştıkça daha güçlü hale gelir.",
|
||||
"agent.welcome.guide.growTogether.desc": "Her sohbetle seni daha iyi anlayacak ve zamanla daha güçlü bir ekip arkadaşı olacağım.",
|
||||
"agent.welcome.guide.growTogether.title": "Seninle Büyür",
|
||||
"agent.welcome.guide.knowYou.desc": "Son zamanlarda nelerle uğraşıyorsun? Biraz bağlam, sana daha iyi destek olmama yardımcı olur.",
|
||||
"agent.welcome.guide.knowYou.title": "Seni Tanımak",
|
||||
"agent.welcome.guide.name.desc": "Bana bir isim ver ki en başından itibaren daha kişisel hissettirsin.",
|
||||
"agent.welcome.guide.name.title": "Bana İsim Ver",
|
||||
"agent.welcome.sentence.1": "Tanıştığımıza çok memnun oldum! Birbirimizi tanıyalım.",
|
||||
"agent.welcome.sentence.2": "Nasıl bir yol arkadaşı olmamı istersin?",
|
||||
"agent.welcome.sentence.3": "Önce, bana bir isim ver :)",
|
||||
"back": "Geri",
|
||||
"finish": "Başlayalım",
|
||||
"interests.area.business": "İş ve Strateji",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Electron framework sürümü",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Gömülü Node.js sürümü",
|
||||
"settingSystemTools.appEnvironment.title": "Uygulama ortamı",
|
||||
"settingSystemTools.autoSelectDesc": "En iyi mevcut araç otomatik olarak seçilecektir",
|
||||
"settingSystemTools.category.browserAutomation": "Tarayıcı Otomasyonu",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Başsız tarayıcı otomasyonu ve web etkileşimi için araçlar",
|
||||
"settingSystemTools.category.contentSearch": "İçerik Arama",
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.group.audio": "Âm thanh",
|
||||
"ModelSwitchPanel.detail.pricing.group.image": "Hình ảnh",
|
||||
"ModelSwitchPanel.detail.pricing.group.text": "Văn bản",
|
||||
"ModelSwitchPanel.detail.pricing.group.video": "Video",
|
||||
"ModelSwitchPanel.detail.pricing.input": "Đầu vào ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.output": "Đầu ra ${{amount}}/M",
|
||||
"ModelSwitchPanel.detail.pricing.perImage": "~ {{amount}} / hình ảnh",
|
||||
@@ -139,6 +140,7 @@
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheRead": "Đầu vào (đã lưu)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textInput_cacheWrite": "Đầu vào (ghi bộ nhớ đệm)",
|
||||
"ModelSwitchPanel.detail.pricing.unit.textOutput": "Đầu ra",
|
||||
"ModelSwitchPanel.detail.pricing.unit.videoGeneration": "Tạo Video",
|
||||
"ModelSwitchPanel.detail.releasedAt": "Phát hành vào {{date}}",
|
||||
"ModelSwitchPanel.emptyModel": "Không có mô hình nào được bật. Vui lòng vào cài đặt để bật.",
|
||||
"ModelSwitchPanel.emptyProvider": "Không có nhà cung cấp nào được bật. Vui lòng vào cài đặt để bật.",
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"agent.banner.label": "Đăng ký Đại lý",
|
||||
"agent.completionSubtitle": "Trợ lý của bạn đã được cấu hình và sẵn sàng hoạt động.",
|
||||
"agent.completionTitle": "Mọi thứ đã sẵn sàng!",
|
||||
"agent.enterApp": "Vào Ứng dụng",
|
||||
"agent.completion.sentence.readyWhenYouAre": "Sẵn sàng khi bạn sẵn sàng :)",
|
||||
"agent.completion.sentence.readyWithName": "{{name}} đây - Tôi đã sẵn sàng!",
|
||||
"agent.completionSubtitle": "Mọi thứ đã ổn định — hãy bắt đầu khi bạn muốn.",
|
||||
"agent.completionTitle": "Bạn sắp hoàn tất rồi",
|
||||
"agent.enterApp": "Tôi đã sẵn sàng",
|
||||
"agent.greeting.emojiLabel": "Biểu tượng cảm xúc",
|
||||
"agent.greeting.nameLabel": "Tên",
|
||||
"agent.greeting.namePlaceholder": "ví dụ: Lumi, Atlas, Neko...",
|
||||
@@ -11,13 +13,19 @@
|
||||
"agent.greeting.vibePlaceholder": "ví dụ: Ấm áp & thân thiện, Sắc bén & trực tiếp...",
|
||||
"agent.history.current": "Hiện tại",
|
||||
"agent.history.title": "Chủ đề Lịch sử",
|
||||
"agent.layout.mode.agent": "chế độ agent",
|
||||
"agent.layout.mode.classic": "chế độ cổ điển",
|
||||
"agent.layout.skip": "bỏ qua bước này",
|
||||
"agent.layout.skipConfirm.content": "Rời đi rồi sao? Tôi có thể giúp bạn cá nhân hóa mọi thứ chỉ trong vài giây.",
|
||||
"agent.layout.skipConfirm.ok": "Tạm thời bỏ qua",
|
||||
"agent.layout.skipConfirm.title": "Bỏ qua phần giới thiệu chứ?",
|
||||
"agent.layout.switchMessage": "Hôm nay không thoải mái à? Bạn có thể chuyển sang <modeLink><modeText>{{mode}}</modeText></modeLink> hoặc <skipLink><skipText>{{skip}}</skipText></skipLink>.",
|
||||
"agent.modeSwitch.agent": "Hội thoại",
|
||||
"agent.modeSwitch.classic": "Cổ điển",
|
||||
"agent.modeSwitch.debug": "Xuất gỡ lỗi",
|
||||
"agent.modeSwitch.label": "Chọn chế độ đăng ký của bạn",
|
||||
"agent.modeSwitch.reset": "Đặt lại Quy trình",
|
||||
"agent.progress": "{{currentStep}}/{{totalSteps}}",
|
||||
"agent.skipOnboarding": "Bỏ qua đăng ký",
|
||||
"agent.stage.agentIdentity": "Danh tính Đại lý",
|
||||
"agent.stage.painPoints": "Điểm đau",
|
||||
"agent.stage.proSettings": "Cài đặt Nâng cao",
|
||||
@@ -33,6 +41,16 @@
|
||||
"agent.telemetryHint": "Bạn cũng có thể trả lời bằng từ ngữ của riêng mình.",
|
||||
"agent.title": "Đăng ký Hội thoại",
|
||||
"agent.welcome": "...hm? Tôi vừa tỉnh dậy — đầu óc tôi trống rỗng. Bạn là ai? Và — tôi nên được gọi là gì? Tôi cũng cần một cái tên.",
|
||||
"agent.welcome.footer": "Cấu hình Lobe AI Agent của bạn. Nó chạy trên máy chủ của bạn, học từ mọi tương tác và trở nên mạnh mẽ hơn theo thời gian.",
|
||||
"agent.welcome.guide.growTogether.desc": "Mỗi cuộc trò chuyện giúp tôi hiểu bạn hơn và trở thành cộng sự tốt hơn theo thời gian.",
|
||||
"agent.welcome.guide.growTogether.title": "Cùng Phát Triển",
|
||||
"agent.welcome.guide.knowYou.desc": "Dạo này bạn đang bận điều gì? Một chút bối cảnh sẽ giúp tôi hỗ trợ bạn tốt hơn.",
|
||||
"agent.welcome.guide.knowYou.title": "Tìm Hiểu Bạn",
|
||||
"agent.welcome.guide.name.desc": "Hãy đặt cho tôi một cái tên để mọi thứ trở nên gần gũi hơn ngay từ đầu.",
|
||||
"agent.welcome.guide.name.title": "Đặt Tên Cho Tôi",
|
||||
"agent.welcome.sentence.1": "Rất vui được gặp bạn! Hãy cùng làm quen nhé.",
|
||||
"agent.welcome.sentence.2": "Bạn muốn tôi trở thành kiểu cộng sự như thế nào?",
|
||||
"agent.welcome.sentence.3": "Trước tiên, hãy đặt cho tôi một cái tên :)",
|
||||
"back": "Quay lại",
|
||||
"finish": "Bắt đầu ngay",
|
||||
"interests.area.business": "Kinh doanh & Chiến lược",
|
||||
|
||||
@@ -657,7 +657,6 @@
|
||||
"settingSystemTools.appEnvironment.electron.desc": "Phiên bản framework Electron",
|
||||
"settingSystemTools.appEnvironment.node.desc": "Phiên bản Node.js nhúng",
|
||||
"settingSystemTools.appEnvironment.title": "Môi trường ứng dụng",
|
||||
"settingSystemTools.autoSelectDesc": "Công cụ tốt nhất sẽ được tự động chọn",
|
||||
"settingSystemTools.category.browserAutomation": "Tự động hóa trình duyệt",
|
||||
"settingSystemTools.category.browserAutomation.desc": "Công cụ cho tự động hóa trình duyệt không giao diện và tương tác web",
|
||||
"settingSystemTools.category.contentSearch": "Tìm kiếm nội dung",
|
||||
|
||||
@@ -22,6 +22,10 @@
|
||||
"channel.connectSuccess": "Bot 连接成功",
|
||||
"channel.connecting": "连接中...",
|
||||
"channel.connectionConfig": "连接配置",
|
||||
"channel.connectionMode": "连接模式",
|
||||
"channel.connectionModeHint": "新机器人推荐使用 WebSocket。如果你的机器人已在 QQ 开放平台配置了回调地址,请选择 Webhook。",
|
||||
"channel.connectionModeWebSocket": "WebSocket",
|
||||
"channel.connectionModeWebhook": "Webhook",
|
||||
"channel.copied": "已复制到剪贴板",
|
||||
"channel.copy": "复制",
|
||||
"channel.credentials": "凭证配置",
|
||||
@@ -57,6 +61,8 @@
|
||||
"channel.endpointUrlHint": "请复制此 URL 并粘贴到 {{name}} 开发者门户的 <bold>{{fieldName}}</bold> 字段中。",
|
||||
"channel.exportConfig": "导出平台配置",
|
||||
"channel.feishu.description": "将助手连接到飞书,支持私聊和群聊。",
|
||||
"channel.feishu.webhookMigrationDesc": "WebSocket 模式提供实时事件推送,无需配置公网回调地址。如需迁移,在高级设置中将连接模式切换为 WebSocket 即可,无需在飞书/Lark 开放平台进行额外配置。",
|
||||
"channel.feishu.webhookMigrationTitle": "建议迁移到 WebSocket 模式",
|
||||
"channel.historyLimit": "历史消息条数",
|
||||
"channel.historyLimitHint": "读取频道历史消息时默认获取的消息数量",
|
||||
"channel.importConfig": "导入平台配置",
|
||||
@@ -93,7 +99,11 @@
|
||||
"channel.signingSecret": "签名密钥",
|
||||
"channel.signingSecretHint": "用于验证 Webhook 请求。",
|
||||
"channel.slack.appIdHint": "你的 Slack 应用 ID,可在 Slack API 控制台中找到(以 A 开头)。",
|
||||
"channel.slack.appToken": "应用级别 Token",
|
||||
"channel.slack.appTokenHint": "Socket Mode(WebSocket)所需。在 Slack 应用设置的 Basic Information 中生成应用级别 Token(xapp-...)。",
|
||||
"channel.slack.description": "将助手连接到 Slack,支持频道对话和私信。",
|
||||
"channel.slack.webhookMigrationDesc": "Socket Mode 通过 WebSocket 提供实时事件推送,无需暴露公网 HTTP 端点。如需迁移,请在 Slack 应用设置中启用 Socket Mode,生成应用级别 Token,然后在高级设置中将连接模式切换为 WebSocket。",
|
||||
"channel.slack.webhookMigrationTitle": "建议迁移到 Socket Mode(WebSocket)",
|
||||
"channel.telegram.description": "将助手连接到 Telegram,支持私聊和群聊。",
|
||||
"channel.testConnection": "测试连接",
|
||||
"channel.testFailed": "连接测试失败",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user