Files
lobehub__lobehub/locales/ru-RU/modelProvider.json
Rdmclin2 8fbb091050 ✨ feat(task): record assignment, status, priority and automation changes in the activity feed (#19258)
* ✨ feat(task): record assignment changes in the task activity feed

Assigning a task to a member or an agent only rewrote a column on `tasks`,
so the detail page's activity feed had no way to show who moved it or when
— a reader saw "created the task" and nothing else, however many times the
task had changed hands.

Every write path already funnels through the `task.update` procedure (the
member/agent pickers, the `editTask` builtin, the CLI), so the diff between
the pre- and post-update assignee columns is taken there and appended to
`task_activities`. Only a slot that actually moved is written, so re-saving
the same assignee stays silent. Unlike the assignment notification beside
it, the write is awaited rather than deferred: the client refetches the
detail as soon as the mutation resolves, and a row written after the
response would miss that refetch.

`updateSchema` gains an `actorAgentId` used solely for attribution, so an
agent reassigning through its tool is recorded as the agent rather than the
human whose session it borrowed.

On the render side `ActivityAuthor` is extracted so the actor and the
assignment target share one avatar/name/tag treatment, and `AssignmentRow`
reads as "<actor> assigned the task to <target>" / "<actor> removed the
agent". A target whose account no longer resolves keeps a stub author and
renders as deleted, because collapsing it to null would turn a reassignment
into a removal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 🌐 chore(i18n): sync generated locales

Runs `bun run i18n` so the 16 generated locales pick up the task assignment
activity strings instead of falling back to English until the daily workflow
catches up.

The run also flushes locale drift that had accumulated for other namespaces
(auth / device / modelProvider / models / providers) and realigns two
hand-edited en-US / zh-CN values with their source in
`packages/locales/src/default/chat.ts`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 🔒 fix(task): make assignment attribution unforgeable and atomic

Addresses three findings from review on the assignment activity log.

**Attribution came from the request payload.** `updateSchema.actorAgentId` was
public input, so any authorized client could name an arbitrary agent and have
the durable feed claim that agent made the reassignment — while suppressing the
real user. The field is gone; the agent now rides `AuthContext.actingAgentId`,
set only by a server-side `createCaller` from an already-authorized run
context, following the contract `spendOrigin` already established.

**The diff was read outside the write.** The previous assignee was read by the
router before the update and recorded after it, so concurrent reassignments of
one task could both observe the same origin: a racing A→B and A→C persist A→B
then B→C while the log claims A→B and A→C, losing the middle state, and the
rows could be ordered differently from the writes. `updateWithAssignmentLog`
now derives the previous value from a `FOR UPDATE` read and appends the events
in the same transaction as the update.

**One writer bypassed the recorder.** `TaskRunnerService` persists the inbox
agent when an unassigned task first runs, straight through `taskModel.update`.
The assignee chip visibly changed with nothing in the feed to explain it; that
write now goes through the same path, with neither actor column set since
nobody requested it — the feed renders those as the system.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 🌐 fix(task): make assignment attribution reach the router, and let locales order the sentence

Round-2 review follow-ups on the assignment activity log.

**The attribution fix was inert.** The caller built with `actingAgentId` in the
runtime factory is replaced by `ensureModels()` before any exported method
runs, and the replacement omitted it — so every agent-driven reassignment was
still recorded as the session user. The previous test missed it by building
`createTaskRuntime` directly with a ready-made caller, never exercising the
registration lifecycle; the new test drives `taskRuntime.factory` and asserts
on the caller the wrapped method actually uses.

**The row could not be translated.** Actor, verb and target were three DOM
nodes in a fixed order, so a verb-final language could not put the target
before the verb — Japanese rendered as a complete sentence with the target
stranded after it. The four verb strings are now full sentence templates with
`<actor/>` / `<target/>` placeholders rendered through `<Trans>`, so each
locale decides where the participants go. The generated locales had to be
dropped and retranslated: the keys kept their old fragment values otherwise,
since the script only fills in missing ones.

**The agent prompt claimed false provenance.** An actorless row is the runner's
system fallback, which the feed labels "System" but the prompt rendered as
"someone".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 🐛 fix(task): tell absent, invisible and unnamed participants apart

Round-3 review follow-ups. All three findings come from the same mistake:
collapsing distinct identity states onto one fallback.

**An invisible agent was credited to the system.** `getAgentAvatarsByIds`
filters by `ownership()`, so another member's private agent does not resolve
for the current viewer. The actor lookup returned `undefined`, and both the row
and the prompt reserve an absent author for the system — so an agent's
reassignment was durably shown as a system action. The actor now keeps a stub
carrying `unresolved: true`, as the assignment target already did.

**A live participant could borrow a deletion label.** `users.full_name` and
`agents.title` are both nullable, so a resolved row with an empty name fell
through `||` onto "System" or "a deleted agent". Display names now fall back to
the other column each query already returns (`title || name`,
`fullName || username`), and a resolved-but-nameless participant renders as
"Unnamed" rather than as gone.

**Two formatters dropped the event.** The `viewTask` tool prompt and the CLI
task detail have their own activity branches and neither knew about
assignments, so the event vanished on those surfaces. Both render it now,
through a shared `assignmentParticipantLabel` on the prompt side; the CLI keeps
a three-line local copy rather than take a dependency on `@lobechat/prompts`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* ⚡️ perf(task): show the assignment activity row in the same beat as the chip

Picking a new assignee flipped the chip instantly (that dispatch was already
optimistic) but the activity row explaining it only appeared after two
serial round-trips: the mutation, then the full task-detail refetch — a
fifteen-step aggregation that alone runs one to three seconds against a
remote database. The chip said "done" while the feed stayed silent.

The row is now synthesized in the same optimistic dispatch. The picker hands
over the chosen item's display metadata, since it is the one place that
already holds it — the store deliberately does not resolve members itself,
that source being a business-layer hook. The actor is the signed-in user;
with no known identity no row is invented.

Only a slot that actually changes produces a row, mirroring the server's own
rule, and the refetch that follows the mutation replaces the whole activity
array, which retires the synthetic rows with no reconciliation. A failed
mutation is rolled back by that same refetch. Comments share the identical
two-round-trip lag and are left as they were.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* ⚡️ perf(task): show a sent comment in the feed before the round-trip returns

Comments had the same two-round-trip lag the assignment row just lost: the
post, then the full task-detail refetch, before anything appeared. Sending
now synthesizes the row in the same dispatch, authored as the signed-in user
and carrying the topic it replies to, so it lands in the feed the moment the
button is pressed.

Attachments are deliberately left to the refetch — their metadata only exists
once the server has resolved the file ids. A comment posted on an agent's
behalf through the client-first runtime is also left to the refetch, since
the store has no agent identity to attribute it to.

While the synthesized row is on screen its edit / delete menu is withheld —
the server has never seen that id, so either action would only surface an
error. A failed post is rolled back by the same server-truth refetch the
assignment path uses, and the failure still reaches the caller.

The two builders now share one module and one id prefix, so a renderer has a
single predicate for "not yet persisted".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* ✨ feat(task): log status, priority and automation changes made by a person

The activity feed now explains every property a person can change from the
task's property bar, not only the assignee. A status pick, a priority pick and
turning automation on or off each leave a row: "<actor> changed the status to
<tag>", "set the priority to <tag>", "set automation to <summary>".

Only person-made changes are recorded — those made from the pickers or by an
agent acting through its tool. The runner, lifecycle and watchdog transitions
(backlog → running → completed) are deliberately not: the run row already
carries them, and a duplicate line per run would be noise. The policy is not a
flag; it is which writer a caller uses. Person-made edits go through the new
`TaskModel.updateWithLog`, the system transitions keep the plain writers.

`updateWithLog` replaces the per-property methods with one transactional
diff over a tracked column set (assignees, status, priority and the four
automation columns), so adding a tracked field is one list entry. The four
automation columns fold into a single event carrying before / after
snapshots: switching a schedule on rewrites mode, pattern and timezone in one
save, and that is one decision, not three.

All three task-detail formatters (page prompt, `viewTask` tool prompt, CLI)
render the new event, through a shared `formatPropertyValue` on the prompt
side.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* ✨ feat(task): fold a burst of edits to one property into a single feed entry

Fiddling with a property — priority High → Low → High inside a minute —
produced one line per hop, where an issue tracker shows "moved from A to C"
and shows nothing when the value ended up back where it started.

Collapsing happens at read time, in the detail assembly, so the rows in
`task_activities` stay append-only: the hop-by-hop history is still there for
audit or a "show all" view, and every consumer of the detail (page, `viewTask`
prompt, CLI) gets the same folded view. A run is one property by one person
with no gap over the window; it keeps the newest row's time (when it settled),
the first row's starting value and the last row's ending value. Two people
never merge — A moving it and B moving it back are two decisions, not a
cancelled one.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 💄 style(task): say where a property moved from, not only where it landed

"changed the status to In Review" hides the half of the story a reader
actually wants once a burst of edits has been folded into one entry: an
entry can now span several hops, and the starting value is what says how far
the property moved. Status, priority and automation rows read "from A to B";
automation keeps its one-sided forms for turning on ("set automation to")
and off, since there is no other side to name.

The two reworded keys had to be deleted from the generated locales and
retranslated — the script only fills in missing keys.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 🐛 fix(task): surface every person-made property change in the feed at once

Three findings from driving the real UI:

**Automation changes never reached the feed.** `setAutomationMode` deliberately
does no post-save refetch — an async SWR write could land after the user's
next toggle and clobber it — so the row the server appended only showed up on
the next unrelated refresh. The row now rides the same optimistic patch as the
automation fields, inside the same engine transaction, so a failed save rolls
it back with them.

**Status and priority rows arrived a round-trip late.** Only assignment and
comment rows were synthesized; the other two waited for the detail refetch,
which against a remote database is the same lag the assignee row was fixed
for. Both now ride the optimistic dispatch that flips their chip.

**Priority read as "from ··· to !".** The priority tag alone is an icon; in a
sentence it is noise. The level's name now rides along.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 🐛 fix(task): attribute client-runtime edits, tighten activity collapse and rollback

- update/updateStatus accept an ownership-checked actorAgentId for the
  client-first runtime; the server-side actingAgentId still wins
- collapse only extends a run when each hop starts where the last ended
- optimistic property rows fold client-side; schedule edits get a row
- addComment drops its synthesized row locally when the send fails
- payload.actorKind keeps a deleted actor from reading as the system
- task detail reads a bounded window of recent activity rows

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 🐛 fix(task): log cascades and rolled-back starts, quieter activity rows

- collapse: any edit by someone else ends other actors' open runs
- updateStatusCascade logs one status row per family member the
  confirming person cascaded; the router passes the actor
- a person-made start rolled back after the heartbeat tick fails logs
  the undo too, so no orphan row survives the restore
- activity rows read like an issue tracker's: 16px mark, plain names,
  values as words instead of chips, agent chip dropped

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 🐛 fix(task): lock cascade origins, batch their rows, widen the schedule value

- cascade reads each task's leaving status under the row lock and writes
  the family's activity rows in one INSERT
- the automation value includes the execution cap and its labels show
  timezone and cap, so a cap-only or timezone-only edit is visible
- a failed status transition drops its synthesized row locally before
  the best-effort refetch

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 💄 style(task): lay the activity feed out as a timeline

Compact rows lead with a type mark on a shared rail instead of the
actor's avatar, read as one sentence in one tone, and sit tight together;
cards still break the rail.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 💄 style(task): faces for people rows, property icons for property rows

The rail mark is the actor's avatar on created / assignment lines and the
property's icon (three-bar priority, status dot, timer) on change lines.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 💄 style(task): priority rows use the app's solid priority bars

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

* 💄 style(task): centre the activity rail under the cards' avatar column

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015wKZMihFpqsChKSb5YR23P

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 17:53:00 +08:00

369 lines
44 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"azure.azureApiVersion.desc": "Версия Azure API в формате ГГГГ-ММ-ДД. Ознакомьтесь с [последней версией](https://learn.microsoft.com/ru-ru/azure/ai-services/openai/reference#chat-completions)",
"azure.azureApiVersion.fetch": "Получить список",
"azure.azureApiVersion.title": "Версия Azure API",
"azure.empty": "Пожалуйста, введите ID модели, чтобы добавить первую модель",
"azure.endpoint.desc": "При просмотре ресурсов в портале Azure это значение можно найти в разделе «Ключи и конечные точки»",
"azure.endpoint.placeholder": "https://docs-test-001.openai.azure.com",
"azure.endpoint.title": "Адрес Azure API",
"azure.modelListPlaceholder": "Выберите или добавьте развернутую модель OpenAI",
"azure.title": "Azure OpenAI",
"azure.token.desc": "При просмотре ресурсов в портале Azure это значение можно найти в разделе «Ключи и конечные точки». Можно использовать KEY1 или KEY2",
"azure.token.placeholder": "Ключ Azure API",
"azure.token.title": "API-ключ",
"azureai.azureApiVersion.desc": "Версия API для Azure в формате ГГГГ-ММ-ДД. См. [последнюю версию](https://learn.microsoft.com/ru-ru/azure/ai-services/openai/reference#chat-completions)",
"azureai.azureApiVersion.fetch": "Получить список",
"azureai.azureApiVersion.title": "Версия Azure API",
"azureai.endpoint.desc": "Найдите конечную точку вывода модели Azure AI в обзоре проекта Azure AI",
"azureai.endpoint.placeholder": "https://ai-userxxxxxxxxxx.services.ai.azure.com/models",
"azureai.endpoint.title": "Конечная точка Azure AI",
"azureai.title": "Azure OpenAI",
"azureai.token.desc": "Найдите API-ключ в обзоре проекта Azure AI",
"azureai.token.placeholder": "Ключ Azure",
"azureai.token.title": "Ключ",
"bedrock.accessKeyId.desc": "Введите идентификатор ключа доступа AWS",
"bedrock.accessKeyId.placeholder": "Идентификатор ключа доступа AWS",
"bedrock.accessKeyId.title": "Идентификатор ключа доступа AWS",
"bedrock.apiKey.desc": "Введите ваш API-ключ Amazon Bedrock. Для рабочих нагрузок в производственной среде рекомендуется использовать краткосрочные API-ключи.",
"bedrock.apiKey.placeholder": "API-ключ Amazon Bedrock",
"bedrock.apiKey.title": "API-ключ",
"bedrock.authMode.desc": "Выберите способ аутентификации запросов с Amazon Bedrock",
"bedrock.authMode.options.apiKey": "API-ключ",
"bedrock.authMode.options.awsCredentials": "Учетные данные AWS",
"bedrock.authMode.title": "Аутентификация",
"bedrock.checker.desc": "Проверьте, правильно ли введены AccessKeyId / SecretAccessKey",
"bedrock.region.desc": "Введите регион AWS",
"bedrock.region.placeholder": "Регион AWS",
"bedrock.region.title": "Регион AWS",
"bedrock.secretAccessKey.desc": "Введите секретный ключ доступа AWS",
"bedrock.secretAccessKey.placeholder": "Секретный ключ доступа AWS",
"bedrock.secretAccessKey.title": "Секретный ключ доступа AWS",
"bedrock.sessionToken.desc": "Если вы используете AWS SSO/STS, введите токен сеанса AWS",
"bedrock.sessionToken.placeholder": "Токен сеанса AWS",
"bedrock.sessionToken.title": "Токен сеанса AWS (необязательно)",
"bedrock.title": "Bedrock",
"bedrock.unlock.customRegion": "Пользовательский регион сервиса",
"bedrock.unlock.customSessionToken": "Пользовательский токен сеанса",
"bedrock.unlock.description": "Введите AccessKeyId / SecretAccessKey AWS, чтобы начать сеанс. Приложение не сохраняет ваши данные аутентификации",
"bedrock.unlock.imageGenerationDescription": "Введите AccessKeyId / SecretAccessKey AWS, чтобы начать генерацию. Приложение не сохраняет ваши учетные данные.",
"bedrock.unlock.title": "Использовать пользовательскую аутентификацию Bedrock",
"cloudflare.apiKey.desc": "Пожалуйста, введите API-ключ Cloudflare",
"cloudflare.apiKey.placeholder": "API-ключ Cloudflare",
"cloudflare.apiKey.title": "API-ключ Cloudflare",
"cloudflare.baseURLOrAccountID.desc": "Введите идентификатор учетной записи Cloudflare или пользовательский адрес API",
"cloudflare.baseURLOrAccountID.placeholder": "ID учетной записи Cloudflare / пользовательский URL API",
"cloudflare.baseURLOrAccountID.title": "ID учетной записи Cloudflare / адрес API",
"comfyui.apiKey.desc": "API-ключ для аутентификации с использованием Bearer Token",
"comfyui.apiKey.placeholder": "Введите API-ключ",
"comfyui.apiKey.required": "Пожалуйста, введите API-ключ",
"comfyui.apiKey.title": "API-ключ",
"comfyui.authType.desc": "Выберите метод аутентификации для подключения к серверу ComfyUI",
"comfyui.authType.options.basic": "Базовая аутентификация",
"comfyui.authType.options.bearer": "Bearer Token",
"comfyui.authType.options.custom": "Пользовательская аутентификация",
"comfyui.authType.options.none": "Без аутентификации",
"comfyui.authType.placeholder": "Пожалуйста, выберите тип аутентификации",
"comfyui.authType.title": "Тип аутентификации",
"comfyui.baseURL.desc": "Адрес доступа к серверу ComfyUI, например http://localhost:8000",
"comfyui.baseURL.placeholder": "http://127.0.0.1:8000",
"comfyui.baseURL.required": "Пожалуйста, введите URL сервиса ComfyUI",
"comfyui.baseURL.title": "URL сервиса ComfyUI",
"comfyui.checker.desc": "Проверьте, правильно ли настроено подключение",
"comfyui.checker.title": "Проверка подключения",
"comfyui.customHeaders.addButton": "Добавить заголовок",
"comfyui.customHeaders.deleteTooltip": "Удалить этот заголовок",
"comfyui.customHeaders.desc": "Заголовки запроса, необходимые для пользовательской аутентификации, в формате ключ-значение",
"comfyui.customHeaders.duplicateKeyError": "Имена заголовков не должны повторяться",
"comfyui.customHeaders.keyPlaceholder": "Ключ",
"comfyui.customHeaders.required": "Пожалуйста, введите пользовательские заголовки запроса",
"comfyui.customHeaders.title": "Пользовательские заголовки",
"comfyui.customHeaders.valuePlaceholder": "Значение",
"comfyui.password.desc": "Пароль для базовой аутентификации",
"comfyui.password.placeholder": "Введите пароль",
"comfyui.password.required": "Пожалуйста, введите пароль",
"comfyui.password.title": "Пароль",
"comfyui.title": "ComfyUI",
"comfyui.username.desc": "Имя пользователя для базовой аутентификации",
"comfyui.username.placeholder": "Введите имя пользователя",
"comfyui.username.required": "Пожалуйста, введите имя пользователя",
"comfyui.username.title": "Имя пользователя",
"createNewAiProvider.apiKey.placeholder": "Пожалуйста, введите ваш API-ключ",
"createNewAiProvider.apiKey.title": "API-ключ",
"createNewAiProvider.basicTitle": "Основная информация",
"createNewAiProvider.configTitle": "Информация о конфигурации",
"createNewAiProvider.confirm": "Создать",
"createNewAiProvider.createSuccess": "Успешно создано",
"createNewAiProvider.description.placeholder": "Описание провайдера (необязательно)",
"createNewAiProvider.description.title": "Описание провайдера",
"createNewAiProvider.id.desc": "Уникальный идентификатор провайдера, не может быть изменен после создания",
"createNewAiProvider.id.duplicate": "ID провайдера уже существует",
"createNewAiProvider.id.format": "Может содержать только цифры, строчные буквы, дефисы (-) и подчеркивания (_)",
"createNewAiProvider.id.placeholder": "Рекомендуется использовать строчные буквы, например openai. Не может быть изменен после создания",
"createNewAiProvider.id.required": "Пожалуйста, введите ID провайдера",
"createNewAiProvider.id.title": "ID провайдера",
"createNewAiProvider.logo.placeholder": "https://example.com/logo.png",
"createNewAiProvider.logo.required": "Пожалуйста, загрузите действительный логотип провайдера",
"createNewAiProvider.logo.title": "Логотип провайдера",
"createNewAiProvider.name.placeholder": "Пожалуйста, введите отображаемое имя провайдера",
"createNewAiProvider.name.required": "Пожалуйста, введите имя провайдера",
"createNewAiProvider.name.title": "Имя провайдера",
"createNewAiProvider.proxyUrl.placeholder": "https://your-proxy-url.com/v1",
"createNewAiProvider.proxyUrl.required": "Пожалуйста, введите адрес прокси",
"createNewAiProvider.proxyUrl.title": "URL прокси",
"createNewAiProvider.sdkType.placeholder": "openai/anthropic/azureai/ollama/...",
"createNewAiProvider.sdkType.required": "Пожалуйста, выберите тип SDK",
"createNewAiProvider.sdkType.title": "Формат запроса",
"createNewAiProvider.title": "Создать пользовательского AI-провайдера",
"github.personalAccessToken.desc": "Введите ваш персональный токен GitHub. Нажмите [здесь](https://github.com/settings/tokens), чтобы создать его.",
"github.personalAccessToken.placeholder": "ghp_xxxxxx",
"github.personalAccessToken.title": "Персональный токен GitHub",
"huggingface.accessToken.desc": "Введите ваш токен HuggingFace. Нажмите [здесь](https://huggingface.co/settings/tokens), чтобы создать его",
"huggingface.accessToken.placeholder": "hf_xxxxxxxxx",
"huggingface.accessToken.title": "Токен HuggingFace",
"list.title.custom": "Пользовательский провайдер не включен",
"list.title.disabled": "Отключено",
"list.title.enabled": "Включено",
"menu.addCustomProvider": "Добавить пользовательского провайдера",
"menu.all": "Все",
"menu.list.custom": "Пользовательские не включены",
"menu.list.disabled": "Отключено",
"menu.list.disabledActions.sort": "Сортировать по",
"menu.list.disabledActions.sortAlphabetical": "Сортировать по алфавиту",
"menu.list.disabledActions.sortAlphabeticalDesc": "Сортировать в обратном алфавитном порядке",
"menu.list.disabledActions.sortDefault": "Сортировка по умолчанию",
"menu.list.enabled": "Включено",
"menu.notFound": "Результаты не найдены",
"menu.searchProviders": "Поиск провайдеров...",
"menu.sort": "Пользовательская сортировка",
"newapi.apiKey.desc": "Ключ API, предоставленный платформой New API",
"newapi.apiKey.placeholder": "Ключ API New API",
"newapi.apiKey.required": "Требуется ключ API",
"newapi.apiKey.title": "Ключ API",
"newapi.apiUrl.desc": "Конечная точка API для сервиса New API, обычно включает /v1",
"newapi.apiUrl.title": "URL API",
"newapi.enabled.title": "Включить New API",
"newapi.models.batchSelect": "Выбрать модели оптом ({{count}} элементов)",
"newapi.models.fetch": "Получить список моделей",
"newapi.models.selected": "Выбранные модели",
"newapi.models.title": "Доступные модели",
"newapi.title": "New API",
"ollama.checker.desc": "Проверьте, правильно ли указан адрес прокси",
"ollama.checker.title": "Проверка подключения",
"ollama.customModelName.desc": "Добавьте пользовательские модели, разделяя их запятыми",
"ollama.customModelName.placeholder": "vicuna, llava, codellama, llama2:13b-text",
"ollama.customModelName.title": "Имя пользовательской модели",
"ollama.download.desc": "Ollama загружает модель. Пожалуйста, не закрывайте эту страницу. Загрузка продолжится с места остановки в случае прерывания.",
"ollama.download.failed": "Не удалось загрузить модель. Проверьте подключение к сети или настройки Ollama и попробуйте снова.",
"ollama.download.remainingTime": "Оставшееся время",
"ollama.download.speed": "Скорость",
"ollama.download.title": "Загрузка модели {{model}}",
"ollama.endpoint.desc": "Должен включать http(s)://; можно оставить пустым, если не указано локально.",
"ollama.endpoint.title": "Адрес прокси-интерфейса",
"ollama.title": "Ollama",
"ollama.unlock.cancel": "Отменить загрузку",
"ollama.unlock.confirm": "Загрузить",
"ollama.unlock.description": "Введите тег модели Ollama для продолжения сессии",
"ollama.unlock.downloaded": "{{completed}} / {{total}}",
"ollama.unlock.starting": "Начало загрузки...",
"ollama.unlock.title": "Загрузить указанную модель Ollama",
"providerModels.batchSelect.selected": "Выбрано моделей: {{count}}",
"providerModels.batchSelect.title": "Множественный выбор",
"providerModels.config.aesGcm": "Ваш ключ и URL прокси будут зашифрованы с использованием алгоритма <1>AES-GCM</1>",
"providerModels.config.apiKey.desc": "Пожалуйста, введите ваш ключ API {{name}}",
"providerModels.config.apiKey.descWithUrl": "Пожалуйста, введите ваш ключ API {{name}}. <3>Нажмите здесь, чтобы получить его</3>",
"providerModels.config.apiKey.placeholder": "Ключ API {{name}}",
"providerModels.config.apiKey.title": "Ключ API",
"providerModels.config.baseURL.desc": "Должен включать http(s)://",
"providerModels.config.baseURL.invalid": "Пожалуйста, введите корректный URL",
"providerModels.config.baseURL.placeholder": "https://your-proxy-url.com/v1",
"providerModels.config.baseURL.title": "URL прокси API",
"providerModels.config.builtinNotice": "Встроенные провайдеры нельзя удалить из списка. Если вы не используете этого провайдера, просто отключите его.",
"providerModels.config.checker.button": "Проверить",
"providerModels.config.checker.desc": "Проверьте, правильно ли указаны ключ API и URL прокси",
"providerModels.config.checker.pass": "Проверка пройдена",
"providerModels.config.checker.title": "Проверка подключения",
"providerModels.config.fetchOnClient.desc": "Режим клиентского запроса инициирует сессии напрямую из браузера, что может повысить скорость отклика",
"providerModels.config.fetchOnClient.title": "Использовать режим клиентского запроса",
"providerModels.config.helpDoc": "Руководство по настройке",
"providerModels.config.oauth.authError": "Ошибка авторизации. Пожалуйста, попробуйте снова.",
"providerModels.config.oauth.authorized": "Авторизовано",
"providerModels.config.oauth.authorizedDesc": "Вы подключены к {{name}}. Нажмите, чтобы отключиться.",
"providerModels.config.oauth.cancel": "Отмена",
"providerModels.config.oauth.codeExpired": "Срок действия кода авторизации истёк. Пожалуйста, попробуйте снова.",
"providerModels.config.oauth.connect": "Подключиться через {{name}}",
"providerModels.config.oauth.connectDesc": "Нажмите, чтобы авторизоваться через браузер. API-ключ не требуется.",
"providerModels.config.oauth.connected": "Подключено",
"providerModels.config.oauth.connecting": "Подключение...",
"providerModels.config.oauth.copyCode": "Скопировать код",
"providerModels.config.oauth.denied": "Авторизация отклонена. Пожалуйста, попробуйте снова.",
"providerModels.config.oauth.desc": "Авторизуйтесь через аккаунт {{name}}, чтобы получить доступ к моделям по вашей подписке.",
"providerModels.config.oauth.disconnect": "Отключить",
"providerModels.config.oauth.disconnectConfirm": "Вы уверены, что хотите отключиться? Для использования этого провайдера потребуется повторная авторизация.",
"providerModels.config.oauth.enterCode": "Введите код на открывшейся странице:",
"providerModels.config.oauth.polling": "Ожидание авторизации...",
"providerModels.config.oauth.retry": "Повторить",
"providerModels.config.oauth.title": "OAuth-авторизация",
"providerModels.config.responsesApi.desc": "Использует формат запроса следующего поколения от OpenAI для активации расширенных функций, таких как цепочка рассуждений (поддерживается только моделями OpenAI)",
"providerModels.config.responsesApi.title": "Использовать спецификацию Responses API",
"providerModels.config.waitingForMore": "В настоящее время <1>планируется интеграция</1> дополнительных моделей, следите за обновлениями",
"providerModels.createNew.title": "Создать пользовательскую AI-модель",
"providerModels.item.config": "Настроить модель",
"providerModels.item.customModelCards.addNew": "Создать и добавить модель {{id}}",
"providerModels.item.customModelCards.confirmDelete": "Вы собираетесь удалить эту пользовательскую модель. После удаления восстановление будет невозможно. Пожалуйста, действуйте осторожно.",
"providerModels.item.delete.confirm": "Вы уверены, что хотите удалить модель {{displayName}}?",
"providerModels.item.delete.success": "Удаление прошло успешно",
"providerModels.item.delete.title": "Удалить модель",
"providerModels.item.modelConfig.azureDeployName.extra": "Поле, используемое для реальных запросов в Azure OpenAI",
"providerModels.item.modelConfig.azureDeployName.placeholder": "Введите имя развертывания модели в Azure",
"providerModels.item.modelConfig.azureDeployName.title": "Имя развертывания модели",
"providerModels.item.modelConfig.deployName.extra": "Это поле будет использоваться как ID модели при отправке запросов",
"providerModels.item.modelConfig.deployName.placeholder": "Введите фактическое имя или ID развертывания модели",
"providerModels.item.modelConfig.deployName.title": "Имя развертывания модели",
"providerModels.item.modelConfig.displayName.placeholder": "Введите отображаемое имя модели, например, ChatGPT, GPT-4 и т.д.",
"providerModels.item.modelConfig.displayName.title": "Отображаемое имя модели",
"providerModels.item.modelConfig.extendParams.extra": "Выберите расширенные параметры, поддерживаемые моделью. Наведите курсор на опцию, чтобы просмотреть элементы управления. Неверные настройки могут привести к сбоям запроса.",
"providerModels.item.modelConfig.extendParams.options.codexMaxReasoningEffort.hint": "Для моделей Codex; регулирует интенсивность рассуждений.",
"providerModels.item.modelConfig.extendParams.options.deepseekV4GAReasoningEffort.hint": "Для режима мышления DeepSeek V4 GA; управляет интенсивностью рассуждений. Добавляет уровень `низкий` поверх оригинальных уровней V4. `высокий` является значением по умолчанию, `максимальный` разблокирует самый глубокий уровень рассуждений, используемый сложными рабочими процессами агентов.",
"providerModels.item.modelConfig.extendParams.options.deepseekV4ReasoningEffort.hint": "Для режима мышления DeepSeek V4; регулирует интенсивность рассуждения. Значение `high` используется по умолчанию, `max` включает максимально глубокий уровень рассуждений, применяемый в сложных агентных рабочих процессах.",
"providerModels.item.modelConfig.extendParams.options.disableContextCaching.hint": "Для моделей Claude; может снизить стоимость и ускорить ответы.",
"providerModels.item.modelConfig.extendParams.options.effort.hint": "Для Claude Opus 4.6; управляет уровнем усилий (низкий/средний/высокий/максимальный).",
"providerModels.item.modelConfig.extendParams.options.enableAdaptiveThinking.hint": "Для Claude Opus 4.6; включает или отключает адаптивное мышление.",
"providerModels.item.modelConfig.extendParams.options.enableReasoning.hint": "Для моделей Claude, DeepSeek и других с поддержкой рассуждений; активирует более глубокое мышление.",
"providerModels.item.modelConfig.extendParams.options.glm5_2ReasoningEffort.hint": "Для GLM-5.2; управляет усилиями рассуждения на уровнях Высокий и Максимальный.",
"providerModels.item.modelConfig.extendParams.options.glm5_3ReasoningEffort.hint": "Для GLM-5.3; управляет усилиями рассуждения с уровнями Низкий, Высокий и Максимальный. Мышление нельзя отключить.",
"providerModels.item.modelConfig.extendParams.options.gpt5ReasoningEffort.hint": "Для серии GPT-5; управляет интенсивностью рассуждений.",
"providerModels.item.modelConfig.extendParams.options.gpt5_1ReasoningEffort.hint": "Для серии GPT-5.1; управляет интенсивностью рассуждений.",
"providerModels.item.modelConfig.extendParams.options.gpt5_2ProReasoningEffort.hint": "Для серии GPT-5.2 Pro; управляет интенсивностью рассуждений.",
"providerModels.item.modelConfig.extendParams.options.gpt5_2ReasoningEffort.hint": "Для серии GPT-5.2; управляет интенсивностью рассуждений.",
"providerModels.item.modelConfig.extendParams.options.gpt5_6ReasoningEffort.hint": "Для серии GPT-5.6; регулирует интенсивность рассуждений от Нет до Максимум.",
"providerModels.item.modelConfig.extendParams.options.gpt6ReasoningEffort.hint": "Для серии GPT-6; регулирует интенсивность рассуждений от Низкой до Максимальной. Рассуждения не могут быть отключены.",
"providerModels.item.modelConfig.extendParams.options.grok4_20ReasoningEffort.hint": "Для серии Grok 4.20; регулирует интенсивность рассуждений. Низкий/Средний использует 4 агента, Высокий/Очень высокий использует 16 агентов.",
"providerModels.item.modelConfig.extendParams.options.grok4_3ReasoningEffort.hint": "Для серии Grok 4.3; регулирует интенсивность рассуждений.",
"providerModels.item.modelConfig.extendParams.options.grok4_5ReasoningEffort.hint": "Для серии Grok 4.5; регулирует интенсивность рассуждений (низкая/средняя/высокая, по умолчанию высокая).",
"providerModels.item.modelConfig.extendParams.options.grok4_6ReasoningEffort.hint": "Для серии Grok 4.6; регулирует интенсивность рассуждений (низкая/средняя/высокая/очень высокая, по умолчанию высокая). Рассуждения нельзя отключить.",
"providerModels.item.modelConfig.extendParams.options.hy3ReasoningEffort.hint": "Для моделей Hy3; регулирует интенсивность рассуждения. no_think (ультрабыстрый ответ), low (быстрое рассуждение) и high (глубокое рассуждение) — параметры для разных требований по задержке и глубине, от высокочастотных взаимодействий до сложных инженерных задач.",
"providerModels.item.modelConfig.extendParams.options.imageAspectRatio.hint": "Для моделей генерации изображений Gemini; управляет соотношением сторон создаваемых изображений.",
"providerModels.item.modelConfig.extendParams.options.imageAspectRatio2.hint": "Для Nano Banana 2; управляет соотношением сторон создаваемых изображений (поддерживает сверхширокие 1:4, 4:1, 1:8, 8:1).",
"providerModels.item.modelConfig.extendParams.options.imageResolution.hint": "Для моделей генерации изображений Gemini 3; управляет разрешением создаваемых изображений.",
"providerModels.item.modelConfig.extendParams.options.imageResolution2.hint": "Для моделей Gemini 3.1 Flash Image; управляет разрешением создаваемых изображений (поддерживает 512px).",
"providerModels.item.modelConfig.extendParams.options.opus47Effort.hint": "Для Claude Opus 4.7 и более поздних версий; управляет уровнем усилий (низкий/средний/высокий/очень высокий/максимальный).",
"providerModels.item.modelConfig.extendParams.options.preserveThinking.hint": "Для Qwen3.6 Plus, GLM-5 и GLM-4.7; отправляет исторические рассуждения ассистента обратно в контекст модели (preserve_thinking / clear_thinking=false).",
"providerModels.item.modelConfig.extendParams.options.qwen38ReasoningEffort.hint": "Для Qwen3.8 Max гибридного мышления; регулирует интенсивность рассуждений. `none` отключает мышление; `low`/`medium` обменивают глубину на скорость и стоимость; `xhigh` является значением API по умолчанию для сложного анализа.",
"providerModels.item.modelConfig.extendParams.options.reasoningBudgetToken.hint": "Для моделей Claude, Qwen3 и аналогичных; управляет бюджетом токенов для рассуждений.",
"providerModels.item.modelConfig.extendParams.options.reasoningBudgetToken32k.hint": "Для GLM-5 и GLM-4.7; управляет бюджетом токенов для рассуждений (максимум 32k).",
"providerModels.item.modelConfig.extendParams.options.reasoningBudgetToken80k.hint": "Для серии Qwen3; управляет бюджетом токенов для рассуждений (максимум 80k).",
"providerModels.item.modelConfig.extendParams.options.reasoningEffort.hint": "Для моделей OpenAI и других с поддержкой рассуждений; управляет усилиями на рассуждение.",
"providerModels.item.modelConfig.extendParams.options.reasoningMode.hint": "Для API ответов GPT-5.6; переключает между стандартным и профессиональным режимами рассуждений.",
"providerModels.item.modelConfig.extendParams.options.ring2_6ReasoningEffort.hint": "Для серии Ring 2.6; регулирует интенсивность рассуждений.",
"providerModels.item.modelConfig.extendParams.options.step3_5ReasoningEffort.hint": "Для серии Step 3.5; регулирует интенсивность рассуждений.",
"providerModels.item.modelConfig.extendParams.options.textVerbosity.hint": "Для серии GPT-5+; управляет подробностью вывода.",
"providerModels.item.modelConfig.extendParams.options.thinking.hint": "Для некоторых моделей Doubao; позволяет модели решать, нужно ли углублённое мышление.",
"providerModels.item.modelConfig.extendParams.options.thinkingBudget.hint": "Для серии Gemini; управляет бюджетом на размышления.",
"providerModels.item.modelConfig.extendParams.options.thinkingLevel.hint": "Для моделей Gemini 3 Flash Preview; управляет глубиной размышлений.",
"providerModels.item.modelConfig.extendParams.options.thinkingLevel2.hint": "Для моделей Gemini 3 Pro Preview; управляет глубиной размышлений.",
"providerModels.item.modelConfig.extendParams.options.thinkingLevel3.hint": "Для моделей Gemini 3.1 Pro Preview; управляет глубиной размышлений с уровнями низкий/средний/высокий.",
"providerModels.item.modelConfig.extendParams.options.thinkingLevel4.hint": "Для моделей Gemini 3.1 Flash Image; переключает размышления вкл/выкл.",
"providerModels.item.modelConfig.extendParams.options.urlContext.hint": "Для серии Gemini; поддерживает предоставление контекста по URL.",
"providerModels.item.modelConfig.extendParams.placeholder": "Выберите параметры для активации",
"providerModels.item.modelConfig.extendParams.previewFallback": "Предпросмотр недоступен",
"providerModels.item.modelConfig.extendParams.title": "Расширенные параметры",
"providerModels.item.modelConfig.files.extra": "Текущая реализация загрузки файлов является временным решением, предназначенным только для экспериментов. Полноценная поддержка загрузки будет добавлена позже.",
"providerModels.item.modelConfig.files.title": "Поддержка загрузки файлов",
"providerModels.item.modelConfig.functionCall.extra": "Эта настройка активирует возможность модели использовать инструменты. Однако фактическая поддержка зависит от самой модели. Пожалуйста, протестируйте самостоятельно.",
"providerModels.item.modelConfig.functionCall.title": "Поддержка использования инструментов",
"providerModels.item.modelConfig.id.duplicate": "Модель с этим идентификатором уже существует. Используйте другой идентификатор модели.",
"providerModels.item.modelConfig.id.extra": "Не может быть изменено после создания и будет использоваться как ID модели при вызове AI",
"providerModels.item.modelConfig.id.placeholder": "Введите ID модели, например, gpt-4o или claude-3.5-sonnet",
"providerModels.item.modelConfig.id.title": "ID модели",
"providerModels.item.modelConfig.imageOutput.extra": "Эта настройка активирует только возможность генерации изображений. Фактическая поддержка зависит от модели. Пожалуйста, протестируйте.",
"providerModels.item.modelConfig.imageOutput.title": "Поддержка генерации изображений",
"providerModels.item.modelConfig.modalTitle": "Настройка пользовательской модели",
"providerModels.item.modelConfig.reasoning.extra": "Эта настройка активирует способность модели к глубокому мышлению. Эффективность зависит от самой модели. Пожалуйста, протестируйте.",
"providerModels.item.modelConfig.reasoning.title": "Поддержка глубокого мышления",
"providerModels.item.modelConfig.search.extra": "Эта настройка активирует встроенный веб-поиск. Поддержка зависит от модели. Пожалуйста, протестируйте.",
"providerModels.item.modelConfig.search.title": "Поддержка веб-поиска",
"providerModels.item.modelConfig.tokens.extra": "Установите максимальное количество токенов, поддерживаемое моделью",
"providerModels.item.modelConfig.tokens.title": "Максимальное окно контекста",
"providerModels.item.modelConfig.tokens.unlimited": "Без ограничений",
"providerModels.item.modelConfig.type.extra": "Разные типы моделей имеют различные возможности и сценарии использования",
"providerModels.item.modelConfig.type.options.asr": "Речь в текст",
"providerModels.item.modelConfig.type.options.chat": "Чат",
"providerModels.item.modelConfig.type.options.embedding": "Встраивание",
"providerModels.item.modelConfig.type.options.image": "Генерация изображений",
"providerModels.item.modelConfig.type.options.realtime": "Чат в реальном времени",
"providerModels.item.modelConfig.type.options.text2music": "Текст в музыку",
"providerModels.item.modelConfig.type.options.tts": "Текст в речь",
"providerModels.item.modelConfig.type.options.video": "Генерация видео",
"providerModels.item.modelConfig.type.placeholder": "Выберите тип модели",
"providerModels.item.modelConfig.type.title": "Тип модели",
"providerModels.item.modelConfig.video.extra": "Эта настройка активирует распознавание видео. Поддержка зависит от модели. Пожалуйста, протестируйте.",
"providerModels.item.modelConfig.video.title": "Поддержка распознавания видео",
"providerModels.item.modelConfig.vision.extra": "Эта настройка активирует возможность загрузки изображений. Поддержка распознавания зависит от модели. Пожалуйста, протестируйте.",
"providerModels.item.modelConfig.vision.title": "Поддержка визуального распознавания",
"providerModels.item.pricing.image": "${{amount}}/изображение",
"providerModels.item.pricing.inputCharts": "${{amount}}/М символов",
"providerModels.item.pricing.inputMinutes": "${{amount}}/минута",
"providerModels.item.pricing.inputTokens": "Вход ${{amount}}/М",
"providerModels.item.pricing.outputTokens": "Выход ${{amount}}/М",
"providerModels.item.releasedAt": "Дата выпуска: {{releasedAt}}",
"providerModels.list.addNew": "Добавить модель",
"providerModels.list.disabled": "Отключено",
"providerModels.list.disabledActions.showMore": "Показать все",
"providerModels.list.disabledActions.sort": "Сортировать по",
"providerModels.list.disabledActions.sortAlphabetical": "Сортировать по алфавиту",
"providerModels.list.disabledActions.sortAlphabeticalDesc": "Сортировать в обратном алфавитном порядке",
"providerModels.list.disabledActions.sortDefault": "Сортировка по умолчанию",
"providerModels.list.disabledActions.sortReleasedAt": "Сортировать по дате выпуска (сначала старые)",
"providerModels.list.disabledActions.sortReleasedAtDesc": "Сортировать по дате выпуска (сначала новые)",
"providerModels.list.empty.desc": "Создайте пользовательскую модель или загрузите модель для начала работы.",
"providerModels.list.empty.title": "Нет доступных моделей",
"providerModels.list.enabled": "Включено",
"providerModels.list.enabledActions.disableAll": "Отключить все",
"providerModels.list.enabledActions.enableAll": "Включить все",
"providerModels.list.enabledActions.sort": "Пользовательская сортировка моделей",
"providerModels.list.enabledEmpty": "Нет включенных моделей. Пожалуйста, включите нужные модели из списка ниже~",
"providerModels.list.fetcher.clear": "Очистить загруженные модели",
"providerModels.list.fetcher.duplicatesRemoved": "Удаленные дублирующиеся записи ({{count}}): {{ids}}",
"providerModels.list.fetcher.duplicatesRemovedWithMore": "Удаленные дублирующиеся записи ({{count}}): {{ids}} (+{{remainingCount}} еще ID)",
"providerModels.list.fetcher.error": "Не удалось получить модели: {{message}}",
"providerModels.list.fetcher.errorFallback": "Неизвестная ошибка",
"providerModels.list.fetcher.fetch": "Загрузить модели",
"providerModels.list.fetcher.fetching": "Загрузка списка моделей...",
"providerModels.list.fetcher.latestTime": "Последнее обновление: {{time}}",
"providerModels.list.fetcher.noLatestTime": "Список моделей еще не загружен",
"providerModels.list.noModelsInCategory": "Нет включенных моделей в этой категории",
"providerModels.list.resetAll.conform": "Вы уверены, что хотите сбросить все изменения текущей модели? После сброса список моделей вернется к состоянию по умолчанию.",
"providerModels.list.resetAll.success": "Сброс выполнен успешно",
"providerModels.list.resetAll.title": "Сбросить все изменения",
"providerModels.list.search": "Поиск моделей...",
"providerModels.list.searchResult": "Найдено моделей: {{count}}",
"providerModels.list.title": "Список моделей",
"providerModels.searchNotFound": "Результаты поиска не найдены",
"providerModels.tabs.all": "Все",
"providerModels.tabs.asr": "ASR",
"providerModels.tabs.chat": "Чат",
"providerModels.tabs.embedding": "Встраивание",
"providerModels.tabs.image": "Изображения",
"providerModels.tabs.tts": "TTS",
"providerModels.tabs.video": "Видео",
"sortModal.success": "Сортировка успешно обновлена",
"sortModal.title": "Пользовательский порядок",
"sortModal.update": "Обновить",
"unsloth.checker.guidance": "Для сетевых ошибок браузера убедитесь, что Studio разрешает этой странице доступ через CORS. Для ошибок аутентификации введите действительный API-ключ Studio; доступ к терминалу без ключа не предоставляет доступ через браузер.",
"unsloth.checker.setupGuide": "Руководство по настройке подключения Unsloth",
"updateAiProvider.confirmDelete": "Удалить этого AI-провайдера?",
"updateAiProvider.confirmDeleteDescription": "После удаления этого AI-провайдера восстановление невозможно.",
"updateAiProvider.deleteSuccess": "Удаление прошло успешно",
"updateAiProvider.tooltip": "Обновить базовую конфигурацию провайдера",
"updateAiProvider.updateSuccess": "Обновление прошло успешно",
"updateCustomAiProvider.title": "Обновить конфигурацию пользовательского AI-провайдера",
"vertexai.apiKey.desc": "Введите ключи Vertex AI",
"vertexai.apiKey.placeholder": "{ \"type\": \"service_account\", \"project_id\": \"xxx\", \"private_key_id\": ... }",
"vertexai.apiKey.title": "Ключи Vertex AI",
"vertexai.region.desc": "Выберите регион для сервиса Vertex AI. Некоторые модели, такие как Gemini 2.5, доступны только в определенных регионах (например, global)",
"vertexai.region.placeholder": "Выберите регион",
"vertexai.region.title": "Регион Vertex AI",
"zeroone.title": "01.AI Zero One Everything",
"zhipu.title": "Zhipu"
}