Compare commits

...

15 Commits

Author SHA1 Message Date
diegosouzapw 1d7bc5fed7 feat: add /v1/completions legacy endpoint + show all 3 OpenAI endpoints in dashboard
Build Electron Desktop App / Validate version (push) Failing after 38s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
- New route /v1/completions: accepts prompt string (legacy) + messages array
  Normalizes prompt format to chat/completions format automatically
- EndpointPageClient: Added 3rd card (Completions Legacy) in Core APIs section
  Dashboard now shows: /v1/chat/completions, /v1/responses, /v1/completions
- i18n: completionsLegacy/completionsLegacyDesc synced to 30 languages
2026-03-12 12:57:31 -03:00
diegosouzapw 763fdf3135 chore: release v2.3.8 — OAuthModal [object Object] fix
Build Electron Desktop App / Validate version (push) Failing after 39s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-12 12:42:40 -03:00
diegosouzapw 82314562e7 fix: OAuthModal [object Object] - extract message from error objects
All 3 throw new Error(data.error) replaced with proper extraction:
  typeof error === object ? error.message : error
Fixes Cline and other OAuth providers showing [object Object] on connection failure
2026-03-12 12:39:42 -03:00
diegosouzapw 69e9bd81e9 chore: release v2.3.7
Build Electron Desktop App / Validate version (push) Failing after 33s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
- Cline OAuth base64 decodeURIComponent fix
- OAuth account name normalization (name=email fallback)
- Remove sequential Account N naming
2026-03-12 12:25:17 -03:00
diegosouzapw 26f927f798 fix: replace sequential Account N with stable ID-based fallback for OAuth accounts
Remove Account cntValue+1 sequential naming (confusing when accounts deleted)
Leave name=null when no email → getAccountDisplayName returns Account ID-based label
2026-03-12 12:23:51 -03:00
diegosouzapw 2042dcf991 fix: Cline OAuth base64 parsing + name=email fallback for all OAuth accounts
- cline.ts: add decodeURIComponent before base64 decode to handle URL-encoded codes
- cline.ts: populate name = firstName+lastName || email in mapTokens
- oauth/exchange route: normalize name=email for all providers on exchange/poll/poll-callback
- Fixes: accounts showing Account #ID instead of email in providers dashboard
2026-03-12 12:22:20 -03:00
diegosouzapw 87ffe41d8c fix: i18n sync 29 langs + provider test [object Object] fix
Build Electron Desktop App / Validate version (push) Failing after 32s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
- Add cliTools.toolDescriptions.opencode, .kiro, guides.opencode, guides.kiro to en.json
- Sync 1111 missing keys across 29 language files (English fallbacks)
- Fix [object Object] in provider batch test modal:
  normalize data.error object to string before setTestResults()
  and in ProviderTestResultsView rendering
- Bump version to 2.3.6
2026-03-12 11:11:15 -03:00
diegosouzapw 943a9374b4 fix: permanent @swc/helpers MODULE_NOT_FOUND fix (#crash)
Build Electron Desktop App / Validate version (push) Failing after 28s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
prepublish.mjs: explicitly copy @swc/helpers into standalone app/node_modules
before packaging. npm tarball will always include it.

postinstall.mjs: fallback copy of @swc/helpers from root node_modules into
app/node_modules/@swc/ when missing after npm install -g.

Fixes server crash after npm install -g omniroute.
2026-03-12 10:42:59 -03:00
diegosouzapw 8956ffef73 chore: release v2.3.4
Build Electron Desktop App / Validate version (push) Failing after 32s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
2026-03-12 10:27:45 -03:00
diegosouzapw 4383e7d807 feat(ui): endpoint page music section, fixed action buttons, provider logos
Endpoints page:
- Add Music Generation section (/v1/music/generations) in Media & Multi-Modal category
- Include music models (type=music) in endpointData and total model count
- Transcription section already shows Deepgram/AssemblyAI via allModels filter

Provider action buttons:
- Remove hover-only behavior from connection action buttons (edit/delete/reauth/proxy)
- Remove hover-only behavior from combo action buttons (test/duplicate/proxy/edit/delete)
- Buttons now always visible for better UX

Provider logos (SVG fallback):
- ProviderCard now tries .svg before showing text initials when .png not found
- Add SVG logos: ElevenLabs, Hyperbolic, AssemblyAI, PlayHT, Inworld, NanoBanana
- Add ollama-cloud.png (official Ollama icon)
2026-03-12 10:21:05 -03:00
diegosouzapw 863055768e fix(docker): copy native-binary-compat.mjs into build image
postinstall.mjs imports native-binary-compat.mjs but the Dockerfile
only copied postinstall.mjs, causing ERR_MODULE_NOT_FOUND during npm ci:

  Cannot find module '/app/scripts/native-binary-compat.mjs'
  imported from /app/scripts/postinstall.mjs
2026-03-12 10:11:50 -03:00
diegosouzapw 2c1da9e146 fix(ci): resolve 3 GitHub Actions workflow failures
- docs/openapi.yaml: bump version 2.3.1 → 2.3.3 (fixes check:docs-sync CI step)
- tests/unit/model-parse.test.mjs: add missing 'import {test}' from node:test (fixes ReferenceError in unit tests)
- electron/package.json: convert author to object with email (fixes fpm .deb build: 'Please specify author email')
2026-03-12 10:10:45 -03:00
diegosouzapw 845787ab7f chore(release): v2.3.3
Build Electron Desktop App / Validate version (push) Failing after 37s
Build Electron Desktop App / Build Electron (macos-arm64) (push) Has been skipped
Build Electron Desktop App / Build Electron (linux) (push) Has been skipped
Build Electron Desktop App / Build Electron (macos-intel) (push) Has been skipped
Build Electron Desktop App / Build Electron (windows) (push) Has been skipped
Build Electron Desktop App / Create Release (push) Has been skipped
fix(providers): prevent error boundary crash when Test All fails or times out (PR #330)
2026-03-12 09:56:51 -03:00
Diego Rodrigues de Sa e Souza 1db948e9bb Merge pull request #330 from diegosouzapw/fix/providers-test-all-crash
fix(providers): prevent error boundary crash when Test All fails or times out
2026-03-12 09:56:25 -03:00
diegosouzapw f0d00bcee5 fix(providers): prevent error boundary when 'Test All' times out or returns bad JSON
- Add AbortController (90s timeout) to handleBatchTest fetch
- Add inner try/catch for res.json() — handles truncated/non-JSON responses
- Guard ProviderTestResultsView against null/undefined results (was crashing → error boundary)
- Improve error check: error path now also guards results.results.length === 0
- Add 'providerTestTimeout' i18n key for friendly timeout message
2026-03-12 09:38:40 -03:00
55 changed files with 2912 additions and 2206 deletions
+27 -2011
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -3,6 +3,7 @@ WORKDIR /app
COPY package*.json ./
COPY scripts/postinstall.mjs ./scripts/postinstall.mjs
COPY scripts/native-binary-compat.mjs ./scripts/native-binary-compat.mjs
RUN if [ -f package-lock.json ]; then npm ci --no-audit --no-fund; else npm install --no-audit --no-fund; fi
COPY . ./
+1 -1
View File
@@ -1,7 +1,7 @@
openapi: 3.1.0
info:
title: OmniRoute API
version: 2.3.1
version: 2.3.6
description: |
OmniRoute is a local-first AI API proxy router. It provides an OpenAI-compatible
endpoint that routes requests to multiple AI providers with load balancing,
+4 -1
View File
@@ -3,7 +3,10 @@
"version": "2.0.13",
"description": "OmniRoute Desktop Application",
"main": "main.js",
"author": "OmniRoute Team",
"author": {
"name": "OmniRoute Team",
"email": "support@omniroute.online"
},
"license": "MIT",
"homepage": "https://omniroute.online",
"scripts": {
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "omniroute",
"version": "2.3.2",
"version": "2.3.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "omniroute",
"version": "2.3.2",
"version": "2.3.3",
"hasInstallScript": true,
"license": "MIT",
"workspaces": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "omniroute",
"version": "2.3.2",
"version": "2.3.9",
"description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
"type": "module",
"bin": {
+12
View File
@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect width="100" height="100" rx="18" fill="#0062FF"/>
<!-- AssemblyAI — waveform/microphone mark -->
<rect x="47" y="18" width="6" height="30" rx="3" fill="white"/>
<rect x="35" y="26" width="6" height="22" rx="3" fill="white" opacity="0.8"/>
<rect x="59" y="26" width="6" height="22" rx="3" fill="white" opacity="0.8"/>
<rect x="23" y="34" width="6" height="14" rx="3" fill="white" opacity="0.5"/>
<rect x="71" y="34" width="6" height="14" rx="3" fill="white" opacity="0.5"/>
<!-- Bottom line -->
<rect x="30" y="62" width="40" height="4" rx="2" fill="white" opacity="0.7"/>
<rect x="45" y="66" width="10" height="14" rx="2" fill="white" opacity="0.7"/>
</svg>

After

Width:  |  Height:  |  Size: 749 B

+6
View File
@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect width="100" height="100" rx="18" fill="#6C47FF"/>
<!-- ElevenLabs "11" logo mark — two vertical bars -->
<rect x="24" y="20" width="20" height="60" rx="4" fill="white"/>
<rect x="56" y="20" width="20" height="60" rx="4" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 321 B

+13
View File
@@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect width="100" height="100" rx="18" fill="#141414"/>
<!-- Hyperbolic — stylized "H" with gradient accent -->
<defs>
<linearGradient id="hg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#00D4FF"/>
<stop offset="100%" stop-color="#7B2FFF"/>
</linearGradient>
</defs>
<rect x="22" y="20" width="14" height="60" rx="3" fill="url(#hg)"/>
<rect x="22" y="41" width="56" height="14" rx="3" fill="url(#hg)"/>
<rect x="64" y="20" width="14" height="60" rx="3" fill="url(#hg)"/>
</svg>

After

Width:  |  Height:  |  Size: 600 B

+12
View File
@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect width="100" height="100" rx="18" fill="#0A0A1A"/>
<defs>
<linearGradient id="ig" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#5B4FFF"/>
<stop offset="100%" stop-color="#00E5FF"/>
</linearGradient>
</defs>
<!-- Inworld "i" with dot - futuristic -->
<circle cx="50" cy="28" r="8" fill="url(#ig)"/>
<rect x="42" y="42" width="16" height="38" rx="5" fill="url(#ig)"/>
</svg>

After

Width:  |  Height:  |  Size: 495 B

+12
View File
@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect width="100" height="100" rx="18" fill="#1C1A00"/>
<!-- NanoBanana - banana icon stylized -->
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#FFE000"/>
<stop offset="100%" stop-color="#FF9500"/>
</linearGradient>
</defs>
<path d="M 35 75 Q 20 40 40 20 Q 55 10 70 18 Q 60 22 52 30 Q 38 45 42 65 Z" fill="url(#bg)"/>
<path d="M 42 65 Q 38 45 52 30 Q 60 22 70 18 Q 75 28 72 38 Q 68 55 55 65 Z" fill="#FFD700"/>
</svg>

After

Width:  |  Height:  |  Size: 566 B

+375
View File
@@ -0,0 +1,375 @@
<!doctype html>
<html class="h-full overflow-y-scroll">
<head>
<title>Ollama</title>
<meta charset="utf-8" />
<meta name="description" content="Get up and running with large language models."/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta property="og:title" content="Ollama" />
<meta property="og:description" content="Get up and running with large language models." />
<meta property="og:url" content="https://ollama.com" />
<meta property="og:image" content="https://ollama.com/public/og.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="628" />
<meta property="og:type" content="website" />
<meta name="robots" content="index, follow" />
<meta property="twitter:card" content="summary" />
<meta property="twitter:title" content="Ollama" />
<meta property="twitter:description" content="Get up and running with large language models." />
<meta property="twitter:site" content="ollama" />
<meta property="twitter:image:src" content="https://ollama.com/public/og-twitter.png" />
<meta property="twitter:image:width" content="1200" />
<meta property="twitter:image:height" content="628" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="icon" type="image/png" sizes="16x16" href="/public/icon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/public/icon-32x32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="/public/icon-48x48.png" />
<link rel="icon" type="image/png" sizes="64x64" href="/public/icon-64x64.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/public/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/public/android-chrome-icon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/public/android-chrome-icon-512x512.png" />
<link href="/public/tailwind.css?v=9f0babb28a8cef23daf033b8840da7f9" rel="stylesheet" />
<link href="/public/vendor/prism/prism.css?v=9f0babb28a8cef23daf033b8840da7f9" rel="stylesheet" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Ollama",
"url": "https://ollama.com"
}
</script>
<script type="text/javascript">
function copyToClipboard(element) {
let commandElement = null;
const preElement = element.closest('pre');
const languageNoneElement = element.closest('.language-none');
if (preElement) {
commandElement = preElement.querySelector('code');
} else if (languageNoneElement) {
commandElement = languageNoneElement.querySelector('.command');
} else {
const parent = element.parentElement;
if (parent) {
commandElement = parent.querySelector('.command');
}
}
if (!commandElement) {
console.error('No code or command element found');
return;
}
const code = commandElement.textContent ? commandElement.textContent.trim() : commandElement.value;
navigator.clipboard
.writeText(code)
.then(() => {
const copyIcon = element.querySelector('.copy-icon')
const checkIcon = element.querySelector('.check-icon')
copyIcon.classList.add('hidden')
checkIcon.classList.remove('hidden')
setTimeout(() => {
copyIcon.classList.remove('hidden')
checkIcon.classList.add('hidden')
}, 2000)
})
}
</script>
<script>
function getIcon(url) {
url = url.toLowerCase();
if (url.includes('x.com') || url.includes('twitter.com')) return 'x';
if (url.includes('github.com')) return 'github';
if (url.includes('linkedin.com')) return 'linkedin';
if (url.includes('youtube.com')) return 'youtube';
if (url.includes('hf.co') || url.includes('huggingface.co') || url.includes('huggingface.com')) return 'hugging-face';
return 'default';
}
function setInputIcon(input) {
const icon = getIcon(input.value);
const img = input.previousElementSibling.querySelector('img');
img.src = `/public/social/${icon}.svg`;
img.alt = `${icon} icon`;
}
function setDisplayIcon(imgElement, url) {
const icon = getIcon(url);
imgElement.src = `/public/social/${icon}.svg`;
imgElement.alt = `${icon} icon`;
}
</script>
<script src="/public/vendor/htmx/bundle.js"></script>
</head>
<body
class="
antialiased
min-h-screen
w-full
m-0
flex
flex-col
"
hx-on:keydown="
if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {
// Ignore key events in input fields.
return;
}
if ((event.metaKey && event.key === 'k') || event.key === '/') {
event.preventDefault();
const sp = htmx.find('#search') || htmx.find('#navbar-input');
sp.focus();
}
"
>
<header class="sticky top-0 z-40 bg-white underline-offset-4 lg:static">
<nav class="flex w-full items-center justify-between px-6 py-[9px]">
<a href="/" class="z-50">
<img src="/public/ollama.png" class="w-8" alt="Ollama" />
</a>
<div class="hidden lg:flex xl:flex-1 items-center space-x-6 ml-6 mr-6 xl:mr-0 text-lg">
<a class="hover:underline focus:underline focus:outline-none focus:ring-0" href="/search">Models</a>
<a class="hover:underline focus:underline focus:outline-none focus:ring-0" href="/docs">Docs</a>
<a class="hover:underline focus:underline focus:outline-none focus:ring-0" href="/pricing">Pricing</a>
</div>
<div class="flex-grow justify-center items-center hidden lg:flex">
<div class="relative w-full xl:max-w-[28rem]">
<form action="/search" autocomplete="off">
<div
class="relative flex w-full appearance-none bg-black/5 border border-neutral-100 items-center rounded-full"
hx-on:focusout="
if (!this.contains(event.relatedTarget)) {
const searchPreview = document.querySelector('#searchpreview');
if (searchPreview) {
htmx.addClass('#searchpreview', 'hidden');
}
}
"
>
<span id="searchIcon" class="pl-2 text-2xl text-neutral-500">
<svg class="mt-0.25 ml-1.5 h-5 w-5 fill-current" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="m8.5 3c3.0375661 0 5.5 2.46243388 5.5 5.5 0 1.24832096-.4158777 2.3995085-1.1166416 3.3225711l4.1469717 4.1470988c.2928932.2928932.2928932.767767 0 1.0606602-.2662666.2662665-.6829303.2904726-.9765418.0726181l-.0841184-.0726181-4.1470988-4.1469717c-.9230626.7007639-2.07425014 1.1166416-3.3225711 1.1166416-3.03756612 0-5.5-2.4624339-5.5-5.5 0-3.03756612 2.46243388-5.5 5.5-5.5zm0 1.5c-2.209139 0-4 1.790861-4 4s1.790861 4 4 4 4-1.790861 4-4-1.790861-4-4-4z" />
</svg>
</span>
<input
id="search"
hx-get="/search"
hx-trigger="keyup changed delay:100ms, focus"
hx-target="#searchpreview"
hx-swap="innerHTML"
name="q"
class="resize-none rounded-full border-0 py-2.5 bg-transparent text-sm w-full placeholder:text-neutral-500 focus:outline-none focus:ring-0"
placeholder="Search models"
autocomplete="off"
hx-on:keydown="
if (event.key === 'Enter') {
event.preventDefault();
window.location.href = '/search?q=' + encodeURIComponent(this.value);
return;
}
if (event.key === 'Escape') {
event.preventDefault();
this.value = '';
this.blur();
htmx.addClass('#searchpreview', 'hidden');
return;
}
if (event.key === 'Tab') {
htmx.addClass('#searchpreview', 'hidden');
return;
}
if (event.key === 'ArrowDown') {
let first = document.querySelector('#search-preview-list a:first-of-type');
first?.focus();
event.preventDefault();
}
if (event.key === 'ArrowUp') {
let last = document.querySelector('#view-all-link');
last?.focus();
event.preventDefault();
}
htmx.removeClass('#searchpreview', 'hidden');
"
hx-on:focus="
htmx.removeClass('#searchpreview', 'hidden')
"
/>
</form>
<div id="searchpreview" class="hidden absolute left-0 right-0 top-12 z-50" style="width: calc(100% + 2px); margin-left: -1px;"></div>
</div>
</div>
</div>
<div class="hidden lg:flex xl:flex-1 items-center space-x-2 justify-end ml-6 xl:ml-0">
<a class="flex cursor-pointer items-center rounded-full bg-black/5 hover:bg-black/10 text-lg px-4 py-1.5 text-black whitespace-nowrap" href="/signin">Sign in</a>
<a class="flex cursor-pointer items-center rounded-full bg-neutral-800 text-lg px-4 py-1.5 text-white hover:bg-black whitespace-nowrap focus:bg-black" href="/download">Download</a>
</div>
<div class="lg:hidden flex items-center">
<input type="checkbox" id="menu" class="peer hidden" />
<label for="menu" class="z-50 cursor-pointer peer-checked:hidden block">
<svg
class="h-8 w-8"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"
/>
</svg>
</label>
<label for="menu" class="z-50 cursor-pointer hidden peer-checked:block fixed top-4 right-6">
<svg
class="h-8 w-8"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</label>
<div class="fixed inset-0 bg-white z-40 hidden peer-checked:block overflow-y-auto">
<div class="flex flex-col space-y-5 pt-[5.5rem] text-3xl">
<a class="px-6" href="/search">Models</a>
<a class="px-6" href="/download">Download</a>
<a class="px-6" href="/docs">Docs</a>
<a class="px-6" href="/pricing">Pricing</a>
<a href="/signin" class="block px-6">Sign in</a>
</div>
</div>
</div>
</nav>
</header>
<main class="mx-auto flex max-w-4xl flex-1 flex-col-reverse items-center justify-center p-32 md:flex-row md:items-start md:justify-between">
<div class="space-y-2 text-center md:pt-6 md:text-left">
<h2 class="text-3xl font-normal tracking-tight md:text-4xl">
404.
<span class="text-neutral-400"> That's an error. </span>
</h2>
<p class="text-center text-lg md:text-left md:text-xl">
The page was not found.
</p>
</div>
<div class="pb-4 md:pb-0">
<img src="/public/400s.svg" class="w-40 md:w-48" alt="400s ollama" />
</div>
</main>
<footer class="mt-auto">
<div class="underline-offset-4 hidden md:block">
<div class="flex items-center justify-between px-6 py-3.5">
<div class="text-xs text-neutral-500">© 2026 Ollama</div>
<div class="flex space-x-6 text-xs text-neutral-500">
<a href="/download" class="hover:underline">Download</a>
<a href="/blog" class="hover:underline">Blog</a>
<a href="https://docs.ollama.com" class="hover:underline">Docs</a>
<a href="https://github.com/ollama/ollama" class="hover:underline">GitHub</a>
<a href="https://discord.com/invite/ollama" class="hover:underline">Discord</a>
<a href="https://twitter.com/ollama" class="hover:underline">X (Twitter)</a>
<a href="mailto:hello@ollama.com" class="hover:underline">Contact</a>
</div>
</div>
</div>
<div class="py-4 md:hidden">
<div class="flex flex-col items-center justify-center">
<ul class="flex flex-wrap items-center justify-center text-sm text-neutral-500">
<li class="mx-2 my-1">
<a href="/blog" class="hover:underline">Blog</a>
</li>
<li class="mx-2 my-1">
<a href="/download" class="hover:underline">Download</a>
</li>
<li class="mx-2 my-1">
<a href="https://docs.ollama.com" class="hover:underline">Docs</a>
</li>
</ul>
<ul class="flex flex-wrap items-center justify-center text-sm text-neutral-500">
<li class="mx-2 my-1">
<a href="https://github.com/ollama/ollama" class="hover:underline">GitHub</a>
</li>
<li class="mx-2 my-1">
<a href="https://discord.com/invite/ollama" class="hover:underline">Discord</a>
</li>
<li class="mx-2 my-1">
<a href="https://twitter.com/ollama" class="hover:underline">X (Twitter)</a>
</li>
<li class="mx-2 my-1">
<a href="https://lu.ma/ollama" class="hover:underline">Meetups</a>
</li>
</ul>
<div class="mt-2 flex items-center justify-center text-sm text-neutral-500">
© 2026 Ollama Inc.
</div>
</div>
</div>
</footer>
<span class="hidden" id="end_of_template"></span>
</body>
</html>
+11
View File
@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<rect width="100" height="100" rx="18" fill="#1A1A2E"/>
<defs>
<linearGradient id="pg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#7B2FFF"/>
<stop offset="100%" stop-color="#FF6B6B"/>
</linearGradient>
</defs>
<!-- Play triangle -->
<polygon points="28,22 28,78 78,50" fill="url(#pg)" rx="4"/>
</svg>

After

Width:  |  Height:  |  Size: 418 B

+25
View File
@@ -113,3 +113,28 @@ if (process.platform === "darwin") {
console.warn(" If build tools are missing: xcode-select --install");
}
console.warn("");
// ── @swc/helpers fix ────────────────────────────────────────────────────────
// Next.js standalone tracer doesn't always include @swc/helpers in app/node_modules/,
// causing a MODULE_NOT_FOUND crash at runtime. Copy it from root node_modules if needed.
const swcHelpersApp = join(ROOT, "app", "node_modules", "@swc", "helpers");
const swcHelpersRoot = join(ROOT, "node_modules", "@swc", "helpers");
if (!existsSync(swcHelpersApp)) {
if (existsSync(swcHelpersRoot)) {
try {
const { cpSync } = await import("node:fs");
mkdirSync(join(ROOT, "app", "node_modules", "@swc"), { recursive: true });
cpSync(swcHelpersRoot, swcHelpersApp, { recursive: true });
console.log(" ✅ @swc/helpers copied to standalone app/node_modules.\n");
} catch (err) {
console.warn(` ⚠️ Could not copy @swc/helpers: ${err.message}`);
console.warn(
" Try manually: cp -r node_modules/@swc/helpers app/node_modules/@swc/helpers\n"
);
}
} else {
console.warn(" ⚠️ @swc/helpers not found in root node_modules either.");
console.warn(" Try: npm install --save-exact @swc/helpers@0.5.19\n");
}
}
+12
View File
@@ -122,6 +122,18 @@ if (existsSync(sharedApiKey)) {
// ── Step 10: Ensure data/ directory exists ──────────────────
mkdirSync(join(APP_DIR, "data"), { recursive: true });
// ── Step 10.5: Copy @swc/helpers into standalone ───────────
// Next.js standalone tracer sometimes omits @swc/helpers from app/node_modules/,
// causing MODULE_NOT_FOUND at runtime. Always copy it explicitly.
const swcHelpersSrc = join(ROOT, "node_modules", "@swc", "helpers");
const swcHelpersDst = join(APP_DIR, "node_modules", "@swc", "helpers");
if (existsSync(swcHelpersSrc) && !existsSync(swcHelpersDst)) {
console.log(" 📋 Copying @swc/helpers to standalone app/node_modules...");
mkdirSync(join(APP_DIR, "node_modules", "@swc"), { recursive: true });
cpSync(swcHelpersSrc, swcHelpersDst, { recursive: true });
console.log(" ✅ @swc/helpers included in standalone build.");
}
// ── Done ───────────────────────────────────────────────────
const appPkg = join(APP_DIR, "package.json");
if (existsSync(appPkg)) {
@@ -976,7 +976,7 @@ function ComboCard({
onChange={onToggle}
title={isDisabled ? t("enableCombo") : t("disableCombo")}
/>
<div className="flex items-center gap-1 opacity-100 md:opacity-0 md:group-hover:opacity-100 transition-opacity">
<div className="flex items-center gap-1 transition-opacity">
<button
onClick={onTest}
disabled={testing}
@@ -86,7 +86,8 @@ export default function APIPageClient({ machineId }) {
(m) => m.type === "audio" && m.subtype === "speech" && !m.parent
);
const moderation = allModels.filter((m) => m.type === "moderation" && !m.parent);
return { chat, embeddings, images, rerank, audioTranscription, audioSpeech, moderation };
const music = allModels.filter((m) => m.type === "music" && !m.parent);
return { chat, embeddings, images, rerank, audioTranscription, audioSpeech, moderation, music };
}, [allModels]);
const postCloudAction = async (action, timeoutMs = CLOUD_ACTION_TIMEOUT_MS) => {
@@ -392,6 +393,7 @@ export default function APIPageClient({ machineId }) {
endpointData.audioTranscription,
endpointData.audioSpeech,
endpointData.moderation,
endpointData.music,
].filter((a) => a.length > 0).length + 2,
})}
</p>
@@ -444,6 +446,27 @@ export default function APIPageClient({ machineId }) {
copied={copied}
baseUrl={currentEndpoint}
/>
{/* Legacy Completions */}
<EndpointSection
icon="text_fields"
iconColor="text-orange-500"
iconBg="bg-orange-500/10"
title={t("completionsLegacy") || "Completions (Legacy)"}
path="/v1/completions"
description={
t("completionsLegacyDesc") ||
"Legacy OpenAI text completions — accepts both prompt and messages format"
}
models={endpointData.chat}
expanded={expandedEndpoint === "completions"}
onToggle={() =>
setExpandedEndpoint(expandedEndpoint === "completions" ? null : "completions")
}
copy={copy}
copied={copied}
baseUrl={currentEndpoint}
/>
</div>
</div>
@@ -530,6 +553,25 @@ export default function APIPageClient({ machineId }) {
copied={copied}
baseUrl={currentEndpoint}
/>
{/* Music Generation */}
<EndpointSection
icon="music_note"
iconColor="text-fuchsia-500"
iconBg="bg-fuchsia-500/10"
title={t("musicGeneration") || "Music Generation"}
path="/v1/music/generations"
description={
t("musicDesc") ||
"Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)"
}
models={endpointData.music}
expanded={expandedEndpoint === "music"}
onToggle={() => setExpandedEndpoint(expandedEndpoint === "music" ? null : "music")}
copy={copy}
copied={copied}
baseUrl={currentEndpoint}
/>
</div>
</div>
@@ -1631,16 +1631,23 @@ function CustomModelsSection({ providerId, providerAlias, copied, onCopy }) {
</div>
<div className="flex-1 min-w-[240px]">
<span className="text-xs text-text-muted mb-1 block">Supported Endpoints</span>
<span className="text-xs text-text-muted mb-1 block">
Supported Endpoints
</span>
<div className="flex items-center gap-3 flex-wrap">
{["chat", "embeddings", "images", "audio"].map((ep) => (
<label key={ep} className="flex items-center gap-1.5 text-xs text-text-main cursor-pointer">
<label
key={ep}
className="flex items-center gap-1.5 text-xs text-text-main cursor-pointer"
>
<input
type="checkbox"
checked={editingEndpoints.includes(ep)}
onChange={(e) => {
if (e.target.checked) {
setEditingEndpoints((prev) => (prev.includes(ep) ? prev : [...prev, ep]));
setEditingEndpoints((prev) =>
prev.includes(ep) ? prev : [...prev, ep]
);
} else {
setEditingEndpoints((prev) => prev.filter((x) => x !== ep));
}
@@ -2312,7 +2319,7 @@ function ConnectionRow({
onChange={onToggleActive}
title={(connection.isActive ?? true) ? t("disableConnection") : t("enableConnection")}
/>
<div className="flex gap-1 ml-1 opacity-0 group-hover:opacity-100 transition-opacity">
<div className="flex gap-1 ml-1 transition-opacity">
{onReauth && (
<button
onClick={onReauth}
@@ -189,23 +189,43 @@ export default function ProvidersPage() {
if (testingMode) return;
setTestingMode(mode === "provider" ? providerId : mode);
setTestResults(null);
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 90_000); // 90s max
try {
const res = await fetch("/api/providers/test-batch", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ mode, providerId }),
signal: controller.signal,
});
const data = await res.json();
setTestResults(data);
if (data.summary) {
let data: any;
try {
data = await res.json();
} catch {
// Response body is not valid JSON (e.g. truncated due to timeout)
data = { error: t("providerTestFailed"), results: [], summary: null };
}
setTestResults({
...data,
// Normalize error: if API returns an error object { message, details }, extract the string
error: data.error
? typeof data.error === "object"
? data.error.message || data.error.error || JSON.stringify(data.error)
: String(data.error)
: null,
});
if (data?.summary) {
const { passed, failed, total } = data.summary;
if (failed === 0) notify.success(t("allTestsPassed", { total }));
else notify.warning(t("testSummary", { passed, failed, total }));
}
} catch (error) {
setTestResults({ error: t("providerTestFailed") });
notify.error(t("providerTestFailed"));
} catch (error: any) {
const isAbort = error?.name === "AbortError";
const msg = isAbort ? t("providerTestTimeout") : t("providerTestFailed");
setTestResults({ error: msg, results: [], summary: null });
notify.error(msg);
} finally {
clearTimeout(timeoutId);
setTestingMode(null);
}
};
@@ -470,8 +490,17 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
const t = useTranslations("providers");
const tc = useTranslations("common");
const { connected, error, errorCode, errorTime, allDisabled } = stats;
const [imgSrc, setImgSrc] = useState(`/providers/${provider.id}.png`);
const [imgError, setImgError] = useState(false);
const handleImgError = () => {
if (imgSrc.endsWith(".png")) {
setImgSrc(`/providers/${provider.id}.svg`);
} else {
setImgError(true);
}
};
const dotColors = {
free: "bg-green-500",
oauth: "bg-blue-500",
@@ -503,13 +532,13 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
</span>
) : (
<Image
src={`/providers/${provider.id}.png`}
src={imgSrc}
alt={provider.name}
width={30}
height={30}
className="object-contain rounded-lg max-w-[32px] max-h-[32px]"
sizes="32px"
onError={() => setImgError(true)}
onError={handleImgError}
/>
)}
</div>
@@ -590,7 +619,6 @@ function ApiKeyProviderCard({ providerId, provider, stats, authType, onToggle })
const { connected, error, errorCode, errorTime, allDisabled } = stats;
const isCompatible = providerId.startsWith(OPENAI_COMPATIBLE_PREFIX);
const isAnthropicCompatible = providerId.startsWith(ANTHROPIC_COMPATIBLE_PREFIX);
const [imgError, setImgError] = useState(false);
const dotColors = {
free: "bg-green-500",
@@ -616,6 +644,18 @@ function ApiKeyProviderCard({ providerId, provider, stats, authType, onToggle })
return `/providers/${provider.id}.png`;
};
const [imgSrc, setImgSrc] = useState<string>(() => getIconPath());
const [imgError, setImgError] = useState(false);
const handleImgError = () => {
const basePath = getIconPath();
if (imgSrc.endsWith(".png") && !isCompatible && !isAnthropicCompatible) {
setImgSrc(`/providers/${provider.id}.svg`);
} else {
setImgError(true);
}
};
return (
<Link href={`/dashboard/providers/${providerId}`} className="group">
<Card
@@ -634,13 +674,13 @@ function ApiKeyProviderCard({ providerId, provider, stats, authType, onToggle })
</span>
) : (
<Image
src={getIconPath()}
src={imgSrc || getIconPath()}
alt={provider.name}
width={30}
height={30}
className="object-contain rounded-lg max-w-[30px] max-h-[30px]"
sizes="30px"
onError={() => setImgError(true)}
onError={handleImgError}
/>
)}
</div>
@@ -1041,17 +1081,27 @@ function ProviderTestResultsView({ results }) {
const t = useTranslations("providers");
const tc = useTranslations("common");
if (results.error && !results.results) {
// Guard: never crash on malformed/null results (would trigger error boundary)
if (!results || typeof results !== "object") {
return null;
}
if (results.error && (!results.results || results.results.length === 0)) {
return (
<div className="text-center py-6">
<span className="material-symbols-outlined text-red-500 text-[32px] mb-2 block">error</span>
<p className="text-sm text-red-400">{results.error}</p>
<p className="text-sm text-red-400">
{typeof results.error === "object"
? results.error?.message || JSON.stringify(results.error)
: String(results.error)}
</p>
</div>
);
}
const { summary, mode } = results;
const items = results.results || [];
const summary = results.summary ?? null;
const mode = results.mode ?? "";
const items = Array.isArray(results.results) ? results.results : [];
const modeLabel =
{
@@ -226,6 +226,12 @@ export async function POST(
exchangeTokens(provider, code, redirectUri, codeVerifier, state)
);
// Normalize: if name is missing, use email or displayName as fallback so accounts
// always show a real label (e.g. user@gmail.com) instead of "Account #abc123"
if (!tokenData.name && (tokenData.email || tokenData.displayName)) {
tokenData.name = tokenData.email || tokenData.displayName;
}
// Upsert: update existing connection if same provider+email, else create new
const expiresAt = tokenData.expiresIn
? new Date(Date.now() + tokenData.expiresIn * 1000).toISOString()
@@ -297,6 +303,11 @@ export async function POST(
}
if (result.success) {
// Normalize: if name is missing, use email as fallback display label
if (!result.tokens.name && (result.tokens.email || result.tokens.displayName)) {
result.tokens.name = result.tokens.email || result.tokens.displayName;
}
// Upsert: update existing connection if same provider+email, else create new
const expiresAt = result.tokens.expiresIn
? new Date(Date.now() + result.tokens.expiresIn * 1000).toISOString()
@@ -418,6 +429,11 @@ export async function POST(
exchangeTokens(provider, params.code, redirectUri, codeVerifier, params.state)
);
// Normalize: if name is missing, use email as fallback display label
if (!tokenData.name && (tokenData.email || tokenData.displayName)) {
tokenData.name = tokenData.email || tokenData.displayName;
}
// Upsert: update existing connection if same provider+email, else create new
const expiresAt = tokenData.expiresIn
? new Date(Date.now() + tokenData.expiresIn * 1000).toISOString()
+97
View File
@@ -0,0 +1,97 @@
import { CORS_ORIGIN, CORS_HEADERS } from "@/shared/utils/cors";
import { handleChat } from "@/sse/handlers/chat";
import { initTranslators } from "@omniroute/open-sse/translator/index.ts";
import { createInjectionGuard } from "@/middleware/promptInjectionGuard";
let initPromise = null;
const injectionGuard = createInjectionGuard();
function ensureInitialized() {
if (!initPromise) {
initPromise = Promise.resolve(initTranslators()).then(() => {
console.log("[SSE] Translators initialized");
});
}
return initPromise;
}
/**
* Handle CORS preflight
*/
export async function OPTIONS() {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": CORS_ORIGIN,
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "*",
},
});
}
/**
* POST /v1/completions Legacy OpenAI Completions API
*
* Accepts both the modern chat format (messages[]) and the legacy
* text-completions format (prompt string). Legacy requests are
* automatically normalized to chat/completions format before routing.
*
* @see https://platform.openai.com/docs/api-reference/completions
*/
export async function POST(request: Request) {
await ensureInitialized();
// Prompt injection guard
try {
const cloned = request.clone();
const body = await cloned.json().catch(() => null);
if (body) {
const { blocked, result } = injectionGuard(body);
if (blocked) {
return new Response(
JSON.stringify({
error: {
message: "Request blocked: potential prompt injection detected",
type: "injection_detected",
code: "SECURITY_001",
detections: result.detections.length,
},
}),
{ status: 400, headers: { ...CORS_HEADERS, "Content-Type": "application/json" } }
);
}
// Normalize legacy completions format: { prompt, model } → { messages, model }
// If the body has `prompt` but no `messages`, convert to chat format.
if (body.prompt !== undefined && !body.messages) {
const prompt = Array.isArray(body.prompt) ? body.prompt.join("\n") : String(body.prompt);
const normalized = {
...body,
messages: [{ role: "user", content: prompt }],
};
delete normalized.prompt;
const newRequest = new Request(request.url, {
method: request.method,
headers: request.headers,
body: JSON.stringify(normalized),
});
return await handleChat(newRequest);
}
}
} catch (error) {
console.error("[SECURITY] Prompt injection guard failed:", error);
return new Response(
JSON.stringify({
error: {
message: "Security validation temporarily unavailable",
type: "security_guard_unavailable",
code: "SECURITY_002",
},
}),
{ status: 503, headers: { ...CORS_HEADERS, "Content-Type": "application/json" } }
);
}
// Standard path: body already has messages[] (chat format)
return await handleChat(request);
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "الإعلام",
"mediaDescription": "إنشاء الصور ومقاطع الفيديو والموسيقى",
"themes": "المواضيع",
"themesDescription": "اختر سمة لون للوحة المعلومات بأكملها"
"themesDescription": "اختر سمة لون للوحة المعلومات بأكملها",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "بداية سريعة",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "كيلو كود AI مساعد CLI",
"cursor": "محرر كود المؤشر AI",
"continue": "تابع مساعد الذكاء الاصطناعي"
"continue": "تابع مساعد الذكاء الاصطناعي",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "أضف التكوين التالي إلى مجموعة النماذج الخاصة بك:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "البدء السريع",
"a2aQuickStartStep1": "اكتشف بطاقة الوكيل على `/.well-known/agent.json`.",
"a2aQuickStartStep2": "إرسال طلبات JSON - RPC إلى@@ PH0 @@ باستخدام @@PH1 @@ أو `message/stream`.",
"a2aQuickStartStep3": "تتبع المهام والتحكم فيها باستخدام `tasks/get` و `tasks/cancel`."
"a2aQuickStartStep3": "تتبع المهام والتحكم فيها باستخدام `tasks/get` و `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "جارٍ تحميل لوحة تحكم MCP...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "تحرير {type} متوافق",
"compatibleBaseUrlHint": "استخدم عنوان URL الأساسي (الذي ينتهي بـ /v1) لواجهة برمجة التطبيقات المتوافقة مع {type}.",
"apiKeyForCheck": "مفتاح API (للفحص)",
"compatibleProdPlaceholder": "{type} متوافق (المنتج)"
"compatibleProdPlaceholder": "{type} متوافق (المنتج)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "الإعدادات",
@@ -1734,7 +1779,12 @@
"customPricingNote": "يمكنك تجاوز التسعير الافتراضي لنماذج محددة. تحظى التجاوزات المخصصة بالأولوية على الأسعار التي يتم اكتشافها تلقائيًا.",
"editPricing": "تحرير التسعير",
"viewFullDetails": "عرض التفاصيل الكاملة",
"themeCoral": "مرجاني"
"themeCoral": "مرجاني",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "مترجم",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "تكوين Webhooks واشتراكات الأحداث",
"featureSwagger": "إنشاء مواصفات OpenAPI / Swagger تلقائياً",
"featureAuth": "إدارة مفاتيح API ونطاقات OAuth لكل نقطة نهاية"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Медия",
"mediaDescription": "Генериране на изображения, видеоклипове и музика",
"themes": "Теми",
"themesDescription": "Изберете цветова тема за целия панел на таблото"
"themesDescription": "Изберете цветова тема за целия панел на таблото",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Бърз старт",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Cursor AI Code Editor",
"continue": "Продължете AI Assistant"
"continue": "Продължете AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Добавете следната конфигурация към вашия масив от модели:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "Button text: start playing a game",
"a2aQuickStartStep1": "Открийте картата на агента на @@PH0 @@.",
"a2aQuickStartStep2": "Изпратете JSON - RPC заявки до@@ PH0 @@, като използвате @@ PH1 @@ или @@ PH2 @@.",
"a2aQuickStartStep3": "Проследяване и контрол на задачите с помощта на @@ PH0 @@ и @@ PH1 @@."
"a2aQuickStartStep3": "Проследяване и контрол на задачите с помощта на @@ PH0 @@ и @@ PH1 @@.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Зареждане на таблото за управление на MCP...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Редактиране {type} Съвместим",
"compatibleBaseUrlHint": "Използвайте основния URL (завършващ на /v1) за вашия {type}-съвместим API.",
"apiKeyForCheck": "API ключ (за проверка)",
"compatibleProdPlaceholder": "{type} Съвместим (Prod)"
"compatibleProdPlaceholder": "{type} Съвместим (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Настройки",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Можете да замените цените по подразбиране за конкретни модели. Персонализираните замени имат приоритет пред автоматично разпознатото ценообразуване.",
"editPricing": "Редактиране на цените",
"viewFullDetails": "Вижте пълните подробности",
"themeCoral": "Корал"
"themeCoral": "Корал",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Преводач",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Medie",
"mediaDescription": "Generer billeder, videoer og musik",
"themes": "Temaer",
"themesDescription": "Vælg et farvetema til hele dashboardpanelet"
"themesDescription": "Vælg et farvetema til hele dashboardpanelet",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Hurtig start",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilokode AI Assistant CLI",
"cursor": "Cursor AI Code Editor",
"continue": "Fortsæt AI Assistant"
"continue": "Fortsæt AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Tilføj følgende konfiguration til dit modelarray:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "Hurtig start",
"a2aQuickStartStep1": "Find agentkortet på`/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC-anmodninger til`POST /a2a`vedhjælp af `message/send` eller `message/stream`.",
"a2aQuickStartStep3": "Spor og kontroller opgaver ved hjælp af `tasks/get` og `tasks/cancel`."
"a2aQuickStartStep3": "Spor og kontroller opgaver ved hjælp af `tasks/get` og `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Indlæser MCP-dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Rediger {type} Kompatibel",
"compatibleBaseUrlHint": "Brug basis-URL'en (der slutter på /v1) til din {type}-kompatible API.",
"apiKeyForCheck": "API-nøgle (til check)",
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)"
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Indstillinger",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Du kan tilsidesætte standardpriser for specifikke modeller. Tilpassede tilsidesættelser har prioritet frem for automatisk registrerede priser.",
"editPricing": "Rediger prissætning",
"viewFullDetails": "Se alle detaljer",
"themeCoral": "Koral"
"themeCoral": "Koral",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Oversætter",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Medien",
"mediaDescription": "Generieren Sie Bilder, Videos und Musik",
"themes": "Themen",
"themesDescription": "Wählen Sie ein Farbthema für das gesamte Dashboard-Panel"
"themesDescription": "Wählen Sie ein Farbthema für das gesamte Dashboard-Panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Schnellstart",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Cursor-KI-Code-Editor",
"continue": "Weiter AI Assistant"
"continue": "Weiter AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Fügen Sie Ihrem Modellarray die folgende Konfiguration hinzu:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A-Schnellstart",
"a2aQuickStartStep1": "Entdecken Sie die Agentenkarte unter `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Senden Sie JSON-RPC-Anfragen an `POST /a2a` mit `message/send` oder `message/stream`.",
"a2aQuickStartStep3": "Verfolgen und steuern Sie Aufgaben mit `tasks/get` und `tasks/cancel`."
"a2aQuickStartStep3": "Verfolgen und steuern Sie Aufgaben mit `tasks/get` und `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "MCP-Dashboard wird geladen...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Bearbeiten Sie {type} kompatibel",
"compatibleBaseUrlHint": "Verwenden Sie die Basis-URL (die auf /v1 endet) für Ihre {type}-kompatible API.",
"apiKeyForCheck": "API-Schlüssel (zur Überprüfung)",
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)"
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Einstellungen",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Sie können die Standardpreise für bestimmte Modelle überschreiben. Benutzerdefinierte Überschreibungen haben Vorrang vor automatisch erkannten Preisen.",
"editPricing": "Preise bearbeiten",
"viewFullDetails": "Vollständige Details anzeigen",
"themeCoral": "Koralle"
"themeCoral": "Koralle",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Übersetzer",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook-Konfiguration und Event-Abonnements",
"featureSwagger": "Automatische OpenAPI / Swagger-Spezifikation",
"featureAuth": "API-Schlüssel- und OAuth-Scope-Verwaltung pro Endpunkt"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+43 -2
View File
@@ -460,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Cursor AI Code Editor",
"continue": "Continue AI Assistant"
"continue": "Continue AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -509,6 +511,42 @@
"desc": "Add the following configuration to your models array:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -820,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"endpoints": {
"tabProxy": "Endpoint Proxy",
@@ -1184,6 +1224,7 @@
"clearing": "Clearing...",
"until": "Until {time}",
"providerTestFailed": "Provider test failed",
"providerTestTimeout": "Provider test timed out — too many connections to test at once",
"modeTest": "{mode} Test",
"passedCount": "{count} passed",
"failedCount": "{count} failed",
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Medios de comunicación",
"mediaDescription": "Genera imágenes, vídeos y música.",
"themes": "Temas",
"themesDescription": "Elija un tema de color para todo el panel del tablero"
"themesDescription": "Elija un tema de color para todo el panel del tablero",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Inicio rápido",
@@ -456,7 +460,9 @@
"cline": "CLI del asistente de codificación AI de Cline",
"kilo": "CLI del Asistente de Inteligencia Artificial de Kilo Code",
"cursor": "Editor de código AI del cursor",
"continue": "Continuar Asistente de IA"
"continue": "Continuar Asistente de IA",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Agregue la siguiente configuración a su matriz de modelos:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "Inicio rápido de A2A",
"a2aQuickStartStep1": "Descubra la tarjeta de agente en `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Envíe solicitudes JSON-RPC a `POST /a2a` usando `message/send` o `message/stream`.",
"a2aQuickStartStep3": "Realice un seguimiento y controle las tareas utilizando `tasks/get` y `tasks/cancel`."
"a2aQuickStartStep3": "Realice un seguimiento y controle las tareas utilizando `tasks/get` y `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Cargando el panel de MCP...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Editar {type} Compatible",
"compatibleBaseUrlHint": "Utilice la URL base (que termina en /v1) para su API compatible con {type}.",
"apiKeyForCheck": "Clave API (para verificación)",
"compatibleProdPlaceholder": "{type} Compatible (Prod.)"
"compatibleProdPlaceholder": "{type} Compatible (Prod.)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Configuración",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Puede anular los precios predeterminados para modelos específicos. Las anulaciones personalizadas tienen prioridad sobre los precios detectados automáticamente.",
"editPricing": "Editar precios",
"viewFullDetails": "Ver todos los detalles",
"themeCoral": "Coral"
"themeCoral": "Coral",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Traductor",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Configuración de webhooks y suscripciones de eventos",
"featureSwagger": "Generación automática de especificaciones OpenAPI / Swagger",
"featureAuth": "Gestión de claves API y alcances OAuth por endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Luo kuvia, videoita ja musiikkia",
"themes": "Teemat",
"themesDescription": "Valitse väriteema koko kojelautapaneelille"
"themesDescription": "Valitse väriteema koko kojelautapaneelille",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Pika-aloitus",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Cursor AI Code Editor",
"continue": "Jatka AI Assistantia"
"continue": "Jatka AI Assistantia",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Lisää seuraavat kokoonpanot mallien matriisiisi:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Pikaopas",
"a2aQuickStartStep1": "Tutustu agenttikorttiin osoitteessa `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Lähetä JSON-RPC-pyynnöt osoitteeseen `POST /a2a` käyttämällä `message/send` tai `message/stream`.",
"a2aQuickStartStep3": "Seuraa ja ohjaa tehtäviä käyttämällä `tasks/get` ja `tasks/cancel`."
"a2aQuickStartStep3": "Seuraa ja ohjaa tehtäviä käyttämällä `tasks/get` ja `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Ladataan MCP-hallintapaneelia...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Muokkaa {type} Yhteensopiva",
"compatibleBaseUrlHint": "Käytä perus-URL-osoitetta (päättyy /v1) {type}-yhteensopivalle API:lle.",
"apiKeyForCheck": "API-avain (tarkistusta varten)",
"compatibleProdPlaceholder": "{type} Yhteensopiva (tuote)"
"compatibleProdPlaceholder": "{type} Yhteensopiva (tuote)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Asetukset",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Voit ohittaa tiettyjen mallien oletushinnoittelun. Mukautetut ohitukset ovat etusijalla automaattisesti tunnistettuihin hinnoitteluun nähden.",
"editPricing": "Muokkaa hinnoittelua",
"viewFullDetails": "Näytä täydelliset tiedot",
"themeCoral": "Koralli"
"themeCoral": "Koralli",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Kääntäjä",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Médias",
"mediaDescription": "Générez des images, des vidéos et de la musique",
"themes": "Thèmes",
"themesDescription": "Choisissez un thème de couleur pour l'ensemble du panneau du tableau de bord"
"themesDescription": "Choisissez un thème de couleur pour l'ensemble du panneau du tableau de bord",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Démarrage rapide",
@@ -456,7 +460,9 @@
"cline": "CLI de l'assistant de codage Cline AI",
"kilo": "CLI de l'assistant IA Kilo Code",
"cursor": "Éditeur de code AI du curseur",
"continue": "Continuer l'Assistant IA"
"continue": "Continuer l'Assistant IA",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Ajoutez la configuration suivante à votre tableau models :"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "Démarrage rapide A2A",
"a2aQuickStartStep1": "Découvrez la carte d'agent sur `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Envoyez des requêtes JSON-RPC à `POST /a2a` en utilisant `message/send` ou `message/stream`.",
"a2aQuickStartStep3": "Suivez et contrôlez les tâches à laide de `tasks/get` et `tasks/cancel`."
"a2aQuickStartStep3": "Suivez et contrôlez les tâches à laide de `tasks/get` et `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Chargement du tableau de bord MCP...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Modifier {type} Compatible",
"compatibleBaseUrlHint": "Utilisez l'URL de base (se terminant par /v1) pour votre API compatible {type}.",
"apiKeyForCheck": "Clé API (pour vérification)",
"compatibleProdPlaceholder": "{type} Compatible (Prod)"
"compatibleProdPlaceholder": "{type} Compatible (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Paramètres",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Vous pouvez remplacer le prix par défaut pour des modèles spécifiques. Les remplacements personnalisés ont la priorité sur les prix détectés automatiquement.",
"editPricing": "Modifier le prix",
"viewFullDetails": "Afficher tous les détails",
"themeCoral": "Corail"
"themeCoral": "Corail",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Traducteur",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Configuration de webhooks et abonnements aux événements",
"featureSwagger": "Génération automatique de spécifications OpenAPI / Swagger",
"featureAuth": "Gestion des clés API et des portées OAuth par point d'accès"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "התחלה מהירה",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "קילו קוד AI עוזר CLI",
"cursor": "עורך קוד AI של הסמן",
"continue": "המשך עוזר AI"
"continue": "המשך עוזר AI",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "הוסף את התצורה הבאה למערך הדגמים שלך:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "ערוך {type} תואם",
"compatibleBaseUrlHint": "השתמש בכתובת ה-URL הבסיסית (המסתיימת ב-/v1) עבור ה-API התואם {type} שלך.",
"apiKeyForCheck": "מפתח API (לבדיקה)",
"compatibleProdPlaceholder": "{type} תואם (פרוד)"
"compatibleProdPlaceholder": "{type} תואם (פרוד)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "הגדרות",
@@ -1734,7 +1779,12 @@
"customPricingNote": "אתה יכול לעקוף את תמחור ברירת המחדל עבור דגמים ספציפיים. עקיפות מותאמות אישית מקבלות עדיפות על פני תמחור שזוהה אוטומטית.",
"editPricing": "ערוך תמחור",
"viewFullDetails": "צפה בפרטים המלאים",
"themeCoral": "אלמוג"
"themeCoral": "אלמוג",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "מתרגם",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Média",
"mediaDescription": "Készítsen képeket, videókat és zenét",
"themes": "Témák",
"themesDescription": "Válasszon színtémát az egész irányítópult panelhez"
"themesDescription": "Válasszon színtémát az egész irányítópult panelhez",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Gyors kezdés",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Kurzor AI kódszerkesztő",
"continue": "Az AI-asszisztens folytatása"
"continue": "Az AI-asszisztens folytatása",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Adja hozzá a következő konfigurációt a modellek tömbjéhez:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Kövesse nyomon és vezérelje a feladatokat a `tasks/get` és `tasks/cancel` használatával."
"a2aQuickStartStep3": "Kövesse nyomon és vezérelje a feladatokat a `tasks/get` és `tasks/cancel` használatával.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Szerkesztés {type} Kompatibilis",
"compatibleBaseUrlHint": "Használja a {type}-kompatibilis API alap URL-jét (a /v1 végződésű).",
"apiKeyForCheck": "API-kulcs (ellenőrzéshez)",
"compatibleProdPlaceholder": "{type} Kompatibilis (termék)"
"compatibleProdPlaceholder": "{type} Kompatibilis (termék)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Beállítások elemre",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Egyes modelleknél felülbírálhatja az alapértelmezett árazást. Az egyéni felülbírálások elsőbbséget élveznek az automatikusan észlelt árképzéssel szemben.",
"editPricing": "Árak szerkesztése",
"viewFullDetails": "Teljes részletek megtekintése",
"themeCoral": "Korall"
"themeCoral": "Korall",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Fordító",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Mulai Cepat",
@@ -456,7 +460,9 @@
"cline": "CLI Asisten Pengkodean AI Cline",
"kilo": "CLI Asisten AI Kode Kilo",
"cursor": "Editor Kode AI Kursor",
"continue": "Lanjutkan Asisten AI"
"continue": "Lanjutkan Asisten AI",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Tambahkan konfigurasi berikut ke array model Anda:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Sunting {type} Kompatibel",
"compatibleBaseUrlHint": "Gunakan URL dasar (berakhiran /v1) untuk API Anda yang kompatibel dengan {type}.",
"apiKeyForCheck": "Kunci API (untuk Pemeriksaan)",
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)"
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Pengaturan",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Anda dapat mengganti harga default untuk model tertentu. Penggantian khusus lebih diprioritaskan dibandingkan harga yang terdeteksi otomatis.",
"editPricing": "Sunting Harga",
"viewFullDetails": "Lihat Detail Lengkap",
"themeCoral": "Koral"
"themeCoral": "Koral",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Penerjemah",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "त्वरित शुरुआत",
@@ -456,7 +460,9 @@
"cline": "क्लाइन एआई कोडिंग सहायक सीएलआई",
"kilo": "किलो कोड एआई असिस्टेंट सीएलआई",
"cursor": "कर्सर एआई कोड संपादक",
"continue": "एआई असिस्टेंट जारी रखें"
"continue": "एआई असिस्टेंट जारी रखें",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "अपने मॉडल सरणी में निम्नलिखित कॉन्फ़िगरेशन जोड़ें:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "संपादित करें {type} संगत",
"compatibleBaseUrlHint": "अपने {type}-संगत API के लिए आधार URL (/v1 पर समाप्त) का उपयोग करें।",
"apiKeyForCheck": "एपीआई कुंजी (चेक के लिए)",
"compatibleProdPlaceholder": "{type} संगत (उत्पाद)"
"compatibleProdPlaceholder": "{type} संगत (उत्पाद)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "सेटिंग्स",
@@ -1734,7 +1779,12 @@
"customPricingNote": "आप विशिष्ट मॉडलों के लिए डिफ़ॉल्ट मूल्य निर्धारण को ओवरराइड कर सकते हैं। कस्टम ओवरराइड्स को स्वतः-पता लगाए गए मूल्य-निर्धारण पर प्राथमिकता दी जाती है।",
"editPricing": "मूल्य निर्धारण संपादित करें",
"viewFullDetails": "पूर्ण विवरण देखें",
"themeCoral": "कोरल"
"themeCoral": "कोरल",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "अनुवादक",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Avvio rapido",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "CLI dell'Assistente AI Kilo Code",
"cursor": "Editor del codice AI del cursore",
"continue": "Continua Assistente AI"
"continue": "Continua Assistente AI",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Aggiungi la seguente configurazione all'array dei modelli:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Modifica {type} Compatibile",
"compatibleBaseUrlHint": "Utilizza l'URL di base (che termina con /v1) per la tua API compatibile con {type}.",
"apiKeyForCheck": "Chiave API (per controllo)",
"compatibleProdPlaceholder": "{type} Compatibile (prodotto)"
"compatibleProdPlaceholder": "{type} Compatibile (prodotto)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Impostazioni",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Puoi sostituire i prezzi predefiniti per modelli specifici. Le sostituzioni personalizzate hanno la priorità sui prezzi rilevati automaticamente.",
"editPricing": "Modifica prezzi",
"viewFullDetails": "Visualizza i dettagli completi",
"themeCoral": "Corallo"
"themeCoral": "Corallo",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Traduttore",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Configurazione webhook e sottoscrizioni eventi",
"featureSwagger": "Generazione automatica specifiche OpenAPI / Swagger",
"featureAuth": "Gestione chiavi API e ambiti OAuth per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "クイックスタート",
@@ -456,7 +460,9 @@
"cline": "Cline AI コーディング アシスタント CLI",
"kilo": "Kilo Code AI アシスタント CLI",
"cursor": "カーソルAIコードエディター",
"continue": "AIアシスタントを続ける"
"continue": "AIアシスタントを続ける",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "次の構成をモデル配列に追加します。"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "編集 {type} 互換",
"compatibleBaseUrlHint": "{type} 互換 API のベース URL (/v1 で終わる) を使用します。",
"apiKeyForCheck": "APIキー(チェック用)",
"compatibleProdPlaceholder": "{type} 互換性あり (製品)"
"compatibleProdPlaceholder": "{type} 互換性あり (製品)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "設定",
@@ -1734,7 +1779,12 @@
"customPricingNote": "特定のモデルのデフォルトの価格をオーバーライドできます。カスタム オーバーライドは、自動検出された価格設定よりも優先されます。",
"editPricing": "価格の編集",
"viewFullDetails": "詳細を表示",
"themeCoral": "コーラル"
"themeCoral": "コーラル",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "翻訳者",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook設定とイベントサブスクリプション",
"featureSwagger": "OpenAPI / Swagger仕様の自動生成",
"featureAuth": "エンドポイントごとのAPIキーとOAuthスコープ管理"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "빠른 시작",
@@ -456,7 +460,9 @@
"cline": "Cline AI 코딩 어시스턴트 CLI",
"kilo": "킬로코드 AI 어시스턴트 CLI",
"cursor": "커서 AI 코드 편집기",
"continue": "AI 어시스턴트 계속하기"
"continue": "AI 어시스턴트 계속하기",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "모델 배열에 다음 구성을 추가합니다."
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "{type} 호환 가능 편집",
"compatibleBaseUrlHint": "{type} 호환 API에는 기본 URL(/v1로 끝남)을 사용하세요.",
"apiKeyForCheck": "API Key(확인용)",
"compatibleProdPlaceholder": "{type} 호환 가능(프로덕션)"
"compatibleProdPlaceholder": "{type} 호환 가능(프로덕션)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "설정",
@@ -1734,7 +1779,12 @@
"customPricingNote": "특정 모델의 기본 가격을 재정의할 수 있습니다. 맞춤 재정의는 자동 감지된 가격보다 우선 적용됩니다.",
"editPricing": "가격 편집",
"viewFullDetails": "전체 세부정보 보기",
"themeCoral": "코랄"
"themeCoral": "코랄",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "번역기",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "웹훅 구성 및 이벤트 구독",
"featureSwagger": "OpenAPI / Swagger 사양 자동 생성",
"featureAuth": "엔드포인트별 API 키 및 OAuth 범위 관리"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Mula Pantas",
@@ -456,7 +460,9 @@
"cline": "Pembantu Pengekodan AI Cline CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Editor Kod AI Kursor",
"continue": "Teruskan AI Assistant"
"continue": "Teruskan AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Tambahkan konfigurasi berikut pada tatasusunan model anda:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Mula Pantas",
"a2aQuickStartStep1": "Temui kad ejen di `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Hantar permintaan JSON-RPC ke `POST /a2a` menggunakan `message/send` atau `message/stream`.",
"a2aQuickStartStep3": "Jejak dan kawal tugas menggunakan `tasks/get` dan `tasks/cancel`."
"a2aQuickStartStep3": "Jejak dan kawal tugas menggunakan `tasks/get` dan `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Edit {type} Serasi",
"compatibleBaseUrlHint": "Gunakan URL asas (berakhir dengan /v1) untuk API serasi {type} anda.",
"apiKeyForCheck": "Kunci API (untuk Semakan)",
"compatibleProdPlaceholder": "{type} Serasi (Prod)"
"compatibleProdPlaceholder": "{type} Serasi (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "tetapan",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Anda boleh mengatasi harga lalai untuk model tertentu. Penggantian tersuai diutamakan berbanding harga yang dikesan secara automatik.",
"editPricing": "Edit Harga",
"viewFullDetails": "Lihat Butiran Penuh",
"themeCoral": "Koral"
"themeCoral": "Koral",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Penterjemah",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Genereer afbeeldingen, video's en muziek",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Snel beginnen",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coderingsassistent CLI",
"kilo": "Kilocode AI Assistent CLI",
"cursor": "Cursor AI-code-editor",
"continue": "Ga door met AI-assistent"
"continue": "Ga door met AI-assistent",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Voeg de volgende configuratie toe aan uw modellenarray:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Bewerk {type} Compatibel",
"compatibleBaseUrlHint": "Gebruik de basis-URL (eindigend op /v1) voor uw {type}-compatibele API.",
"apiKeyForCheck": "API-sleutel (ter controle)",
"compatibleProdPlaceholder": "{type} Compatibel (product)"
"compatibleProdPlaceholder": "{type} Compatibel (product)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Instellingen",
@@ -1734,7 +1779,12 @@
"customPricingNote": "U kunt de standaardprijzen voor specifieke modellen overschrijven. Aangepaste overschrijvingen hebben voorrang op automatisch gedetecteerde prijzen.",
"editPricing": "Prijzen bewerken",
"viewFullDetails": "Bekijk volledige details",
"themeCoral": "Koraal"
"themeCoral": "Koraal",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Vertaler",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Rask start",
@@ -456,7 +460,9 @@
"cline": "Cline AI-kodingsassistent CLI",
"kilo": "Kilokode AI Assistant CLI",
"cursor": "Cursor AI Code Editor",
"continue": "Fortsett AI Assistant"
"continue": "Fortsett AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Legg til følgende konfigurasjon til modellarrayet ditt:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A hurtigstart",
"a2aQuickStartStep1": "Oppdag agentkortet på `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC-forespørsler til `POST /a2a` ved å bruke `message/send` eller `message/stream`.",
"a2aQuickStartStep3": "Spor og kontroller oppgaver ved å bruke `tasks/get` og `tasks/cancel`."
"a2aQuickStartStep3": "Spor og kontroller oppgaver ved å bruke `tasks/get` og `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Laster inn MCP-dashbordet ...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Rediger {type} Kompatibel",
"compatibleBaseUrlHint": "Bruk basis-URLen (som slutter på /v1) for din {type}-kompatible API.",
"apiKeyForCheck": "API-nøkkel (for sjekk)",
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)"
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Innstillinger",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Du kan overstyre standardpriser for spesifikke modeller. Egendefinerte overstyringer prioriteres fremfor automatisk oppdagede priser.",
"editPricing": "Rediger priser",
"viewFullDetails": "Se alle detaljer",
"themeCoral": "Korall"
"themeCoral": "Korall",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Oversetter",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Mabilis na Pagsisimula",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Cursor AI Code Editor",
"continue": "Ipagpatuloy ang AI Assistant"
"continue": "Ipagpatuloy ang AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Idagdag ang sumusunod na configuration sa iyong array ng mga modelo:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Subaybayan at kontrolin ang mga gawain gamit ang `tasks/get` at `tasks/cancel`."
"a2aQuickStartStep3": "Subaybayan at kontrolin ang mga gawain gamit ang `tasks/get` at `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Nilo-load ang MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "I-edit ang {type} Compatible",
"compatibleBaseUrlHint": "Gamitin ang base URL (nagtatapos sa /v1) para sa iyong {type}-compatible na API.",
"apiKeyForCheck": "API Key (para sa Pagsusuri)",
"compatibleProdPlaceholder": "{type} Compatible (Prod)"
"compatibleProdPlaceholder": "{type} Compatible (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Mga setting",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Maaari mong i-override ang default na pagpepresyo para sa mga partikular na modelo. Mas inuuna ang mga custom na override kaysa sa awtomatikong natukoy na pagpepresyo.",
"editPricing": "I-edit ang Pagpepresyo",
"viewFullDetails": "Tingnan ang Buong Detalye",
"themeCoral": "Coral"
"themeCoral": "Coral",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Tagasalin",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Szybki start",
@@ -456,7 +460,9 @@
"cline": "Cline AI Asystent kodowania CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Edytor kodu AI kursora",
"continue": "Kontynuuj Asystenta AI"
"continue": "Kontynuuj Asystenta AI",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Dodaj następującą konfigurację do tablicy modeli:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Edytuj {type} Kompatybilny",
"compatibleBaseUrlHint": "Użyj podstawowego adresu URL (kończącego się na /v1) dla interfejsu API zgodnego z {type}.",
"apiKeyForCheck": "Klucz API (do sprawdzenia)",
"compatibleProdPlaceholder": "{type} Kompatybilny (Prod)"
"compatibleProdPlaceholder": "{type} Kompatybilny (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Ustawienia",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Możesz zastąpić domyślne ceny dla określonych modeli. Zastąpienia niestandardowe mają pierwszeństwo przed automatycznie wykrytymi cenami.",
"editPricing": "Edytuj ceny",
"viewFullDetails": "Zobacz pełne szczegóły",
"themeCoral": "Koral"
"themeCoral": "Koral",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Tłumacz",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+49 -4
View File
@@ -138,7 +138,11 @@
"media": "Mídia",
"mediaDescription": "Gerar imagens, vídeos e músicas",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Início Rápido",
@@ -456,7 +460,9 @@
"cline": "CLI assistente de codificação Cline",
"kilo": "CLI assistente de IA Kilo Code",
"cursor": "Editor de código com IA Cursor",
"continue": "Assistente de IA Continue"
"continue": "Assistente de IA Continue",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Adicione a configuração abaixo ao array de modelos:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Início rápido",
"a2aQuickStartStep1": "Descubra o agent card em `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Envie requisições JSON-RPC para `POST /a2a` usando `message/send` ou `message/stream`.",
"a2aQuickStartStep3": "Acompanhe e controle tarefas com `tasks/get` e `tasks/cancel`."
"a2aQuickStartStep3": "Acompanhe e controle tarefas com `tasks/get` e `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Carregando painel MCP...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Editar Compatível {type}",
"compatibleBaseUrlHint": "Use a URL base (terminando em /v1) para sua API compatível com {type}.",
"apiKeyForCheck": "Chave de API (para verificação)",
"compatibleProdPlaceholder": "{type} Compatível (Prod)"
"compatibleProdPlaceholder": "{type} Compatível (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Configurações",
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Início rápido",
@@ -456,7 +460,9 @@
"cline": "CLI do assistente de codificação Cline AI",
"kilo": "CLI do assistente de IA do Kilo Code",
"cursor": "Editor de código do cursor AI",
"continue": "Continuar Assistente de IA"
"continue": "Continuar Assistente de IA",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Adicione a seguinte configuração ao seu array de modelos:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"endpoints": {
"tabProxy": "Endpoint Proxy",
@@ -1350,7 +1394,8 @@
"editCompatibleTitle": "Editar {type} Compatível",
"compatibleBaseUrlHint": "Use o URL base (terminando em /v1) para sua API compatível com {type}.",
"apiKeyForCheck": "Chave API (para verificação)",
"compatibleProdPlaceholder": "{type} Compatível (Produção)"
"compatibleProdPlaceholder": "{type} Compatível (Produção)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Configurações",
@@ -1746,7 +1791,12 @@
"customPricingNote": "Você pode substituir o preço padrão de modelos específicos. As substituições personalizadas têm prioridade sobre os preços detectados automaticamente.",
"editPricing": "Editar preços",
"viewFullDetails": "Ver detalhes completos",
"themeCoral": "Coral"
"themeCoral": "Coral",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Tradutor",
@@ -2419,5 +2469,22 @@
"termsSection5Text": "OmniRoute é fornecido \"como está\" sem qualquer tipo de garantia. Não somos responsáveis por quaisquer custos incorridos através do uso da API, interrupções de serviço ou perda de dados. Sempre mantenha backups de sua configuração.",
"termsSection6Title": "6. Código aberto",
"termsSection6Text": "OmniRoute é um software de código aberto. Você é livre para inspecioná-lo, modificá-lo e distribuí-lo sob os termos de sua licença."
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Pornire rapidă",
@@ -456,7 +460,9 @@
"cline": "CLI Cline AI Coding Assistant",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Cursor AI Code Editor",
"continue": "Continuați Asistentul AI"
"continue": "Continuați Asistentul AI",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Adăugați următoarea configurație la matricea dvs. de modele:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Editați {type} Compatibil",
"compatibleBaseUrlHint": "Utilizați adresa URL de bază (se termină în /v1) pentru API-ul dvs. compatibil {type}.",
"apiKeyForCheck": "Cheie API (pentru verificare)",
"compatibleProdPlaceholder": "{type} Compatibil (Prod)"
"compatibleProdPlaceholder": "{type} Compatibil (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Setări",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Puteți suprascrie prețurile implicite pentru anumite modele. Anulările personalizate au prioritate față de prețurile detectate automat.",
"editPricing": "Editați prețul",
"viewFullDetails": "Vezi detalii complete",
"themeCoral": "Coral"
"themeCoral": "Coral",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Traducător",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Темы",
"themesDescription": "Выберите цветовую тему для всей панели"
"themesDescription": "Выберите цветовую тему для всей панели",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Быстрый старт",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Интерфейс командной строки Kilo Code AI Assistant",
"cursor": "Редактор кода курсора AI",
"continue": "Продолжить AI-помощник"
"continue": "Продолжить AI-помощник",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Добавьте следующую конфигурацию в массив моделей:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Изменить совместимость {type}",
"compatibleBaseUrlHint": "Используйте базовый URL-адрес (оканчивающийся на /v1) для вашего {type}-совместимого API.",
"apiKeyForCheck": "API-ключ (для проверки)",
"compatibleProdPlaceholder": "{type} Совместимость (Прод.)"
"compatibleProdPlaceholder": "{type} Совместимость (Прод.)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Настройки",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Вы можете переопределить цены по умолчанию для определенных моделей. Пользовательские переопределения имеют приоритет над ценами, определяемыми автоматически.",
"editPricing": "Изменить цену",
"viewFullDetails": "Посмотреть полную информацию",
"themeCoral": "Коралл"
"themeCoral": "Коралл",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Переводчик",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Настройка вебхуков и подписки на события",
"featureSwagger": "Автоматическая генерация спецификаций OpenAPI / Swagger",
"featureAuth": "Управление API-ключами и OAuth-областями для каждого эндпоинта"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Rýchly štart",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilo Code AI Assistant CLI",
"cursor": "Editor kódu AI kurzora",
"continue": "Pokračovať v Asistentovi AI"
"continue": "Pokračovať v Asistentovi AI",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Pridajte do poľa modelov nasledujúcu konfiguráciu:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Upraviť {type} kompatibilné",
"compatibleBaseUrlHint": "Pre svoje {type}-kompatibilné API použite základnú webovú adresu (končiacu na /v1).",
"apiKeyForCheck": "API kľúč (na kontrolu)",
"compatibleProdPlaceholder": "{type} Kompatibilné (produkt)"
"compatibleProdPlaceholder": "{type} Kompatibilné (produkt)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Nastavenia",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Predvolené ceny pre konkrétne modely môžete prepísať. Vlastné prepísania majú prednosť pred automaticky zistenými cenami.",
"editPricing": "Upraviť ceny",
"viewFullDetails": "Zobraziť úplné podrobnosti",
"themeCoral": "Korál"
"themeCoral": "Korál",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Prekladateľ",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Snabbstart",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Kilokod AI Assistant CLI",
"cursor": "Cursor AI Code Editor",
"continue": "Fortsätt AI Assistant"
"continue": "Fortsätt AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Lägg till följande konfiguration till din modellarray:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Redigera {type} Kompatibel",
"compatibleBaseUrlHint": "Använd basadressen (som slutar på /v1) för ditt {type}-kompatibla API.",
"apiKeyForCheck": "API-nyckel (för kontroll)",
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)"
"compatibleProdPlaceholder": "{type} Kompatibel (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Inställningar",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Du kan åsidosätta standardpriser för specifika modeller. Anpassade åsidosättningar har prioritet framför automatiskt identifierade priser.",
"editPricing": "Redigera prissättning",
"viewFullDetails": "Visa fullständiga detaljer",
"themeCoral": "Korall"
"themeCoral": "Korall",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Översättare",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "ธีมส์",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "เริ่มต้นอย่างรวดเร็ว",
@@ -456,7 +460,9 @@
"cline": "Cline AI ผู้ช่วยเข้ารหัส CLI",
"kilo": "กิโลโค้ด AI Assistant CLI",
"cursor": "ตัวแก้ไขรหัสเคอร์เซอร์ AI",
"continue": "ดำเนินการต่อผู้ช่วย AI"
"continue": "ดำเนินการต่อผู้ช่วย AI",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "เพิ่มการกำหนดค่าต่อไปนี้ให้กับอาร์เรย์โมเดลของคุณ:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "แก้ไข {type} เข้ากันได้",
"compatibleBaseUrlHint": "ใช้ URL พื้นฐาน (ลงท้ายด้วย /v1) สำหรับ {type}- API ที่เข้ากันได้กับของคุณ",
"apiKeyForCheck": "คีย์ API (สำหรับการตรวจสอบ)",
"compatibleProdPlaceholder": "{type} เข้ากันได้ (ผลิตภัณฑ์)"
"compatibleProdPlaceholder": "{type} เข้ากันได้ (ผลิตภัณฑ์)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "การตั้งค่า",
@@ -1734,7 +1779,12 @@
"customPricingNote": "คุณสามารถแทนที่ราคาเริ่มต้นสำหรับรุ่นเฉพาะได้ การแทนที่แบบกำหนดเองจะมีลำดับความสำคัญมากกว่าการกำหนดราคาที่ตรวจพบอัตโนมัติ",
"editPricing": "แก้ไขราคา",
"viewFullDetails": "ดูรายละเอียดทั้งหมด",
"themeCoral": "คอรัล"
"themeCoral": "คอรัล",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "นักแปล",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Швидкий старт",
@@ -456,7 +460,9 @@
"cline": "Cline AI Coding Assistant CLI",
"kilo": "Кіло Код AI Assistant CLI",
"cursor": "Редактор коду Cursor AI",
"continue": "Продовжити AI Assistant"
"continue": "Продовжити AI Assistant",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Додайте таку конфігурацію до свого масиву моделей:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Редагувати {type} Сумісний",
"compatibleBaseUrlHint": "Використовуйте базову URL-адресу (закінчується на /v1) для свого {type}-сумісного API.",
"apiKeyForCheck": "Ключ API (для перевірки)",
"compatibleProdPlaceholder": "{type} Сумісність (Prod)"
"compatibleProdPlaceholder": "{type} Сумісність (Prod)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Налаштування",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Ви можете змінити ціни за умовчанням для певних моделей. Спеціальні зміни мають пріоритет над автоматично визначеними цінами.",
"editPricing": "Редагувати ціни",
"viewFullDetails": "Переглянути повну інформацію",
"themeCoral": "Корал"
"themeCoral": "Корал",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Перекладач",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "Bắt đầu nhanh",
@@ -456,7 +460,9 @@
"cline": "Trợ lý mã hóa Cline AI CLI",
"kilo": "Trợ lý AI Kilo Code CLI",
"cursor": "Trình chỉnh sửa mã AI con trỏ",
"continue": "Tiếp tục Trợ lý AI"
"continue": "Tiếp tục Trợ lý AI",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "Thêm cấu hình sau vào mảng mô hình của bạn:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "Chỉnh sửa {type} Tương thích",
"compatibleBaseUrlHint": "Sử dụng URL cơ sở (kết thúc bằng /v1) cho API tương thích {type} của bạn.",
"apiKeyForCheck": "Khóa API (để kiểm tra)",
"compatibleProdPlaceholder": "{type} Tương thích (Sản phẩm)"
"compatibleProdPlaceholder": "{type} Tương thích (Sản phẩm)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "Cài đặt",
@@ -1734,7 +1779,12 @@
"customPricingNote": "Bạn có thể ghi đè giá mặc định cho các kiểu máy cụ thể. Ghi đè tùy chỉnh được ưu tiên hơn giá được tự động phát hiện.",
"editPricing": "Chỉnh sửa giá",
"viewFullDetails": "Xem chi tiết đầy đủ",
"themeCoral": "San hô"
"themeCoral": "San hô",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "Người phiên dịch",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook configuration and event subscriptions",
"featureSwagger": "OpenAPI / Swagger spec auto-generation",
"featureAuth": "API key and OAuth scope management per endpoint"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+72 -5
View File
@@ -138,7 +138,11 @@
"media": "Media",
"mediaDescription": "Generate images, videos, and music",
"themes": "Themes",
"themesDescription": "Choose a color theme for the whole dashboard panel"
"themesDescription": "Choose a color theme for the whole dashboard panel",
"mcp": "MCP",
"mcpDescription": "Model Context Protocol server management and tools",
"a2a": "A2A",
"a2aDescription": "Agent-to-Agent protocol tasks and observability"
},
"home": {
"quickStart": "快速入门",
@@ -456,7 +460,9 @@
"cline": "Cline AI 编码助手 CLI",
"kilo": "Kilo Code AI 助手 CLI",
"cursor": "光标AI代码编辑器",
"continue": "继续AI助手"
"continue": "继续AI助手",
"opencode": "OpenCode AI coding agent (Terminal)",
"kiro": "Amazon Kiro — AI-powered IDE"
},
"guides": {
"cursor": {
@@ -505,6 +511,42 @@
"desc": "将以下配置添加到您的模型数组中:"
}
}
},
"opencode": {
"steps": {
"1": {
"title": "Install OpenCode",
"desc": "Install via npm: npm install -g opencode-ai"
},
"2": {
"title": "API Key"
},
"3": {
"title": "Set Base URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
"title": "Select Model"
}
}
},
"kiro": {
"steps": {
"1": {
"title": "Open Kiro Settings",
"desc": "Go to Settings → AI Provider"
},
"2": {
"title": "Base URL",
"desc": "Paste your OmniRoute endpoint URL"
},
"3": {
"title": "API Key"
},
"4": {
"title": "Select Model"
}
}
}
}
},
@@ -816,7 +858,9 @@
"a2aQuickStartTitle": "A2A Quick Start",
"a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
"a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`."
"a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
"completionsLegacy": "Completions (Legacy)",
"completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
},
"mcpDashboard": {
"loading": "Loading MCP dashboard...",
@@ -1338,7 +1382,8 @@
"editCompatibleTitle": "编辑 {type} 兼容",
"compatibleBaseUrlHint": "使用 {type} 兼容 API 的基本 URL(以 /v1 结尾)。",
"apiKeyForCheck": "API 密钥(用于检查)",
"compatibleProdPlaceholder": "{type} 兼容(产品)"
"compatibleProdPlaceholder": "{type} 兼容(产品)",
"providerTestTimeout": "Provider test timed out — too many connections to test at once"
},
"settings": {
"title": "设置",
@@ -1734,7 +1779,12 @@
"customPricingNote": "您可以覆盖特定型号的默认定价。自定义覆盖优先于自动检测的定价。",
"editPricing": "编辑定价",
"viewFullDetails": "查看完整详情",
"themeCoral": "珊瑚色"
"themeCoral": "珊瑚色",
"cliFingerprint": "CLI Fingerprint Matching",
"cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
"cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
"enableFingerprintTitle": "Enable fingerprint for {provider}",
"disableFingerprintTitle": "Disable fingerprint for {provider}"
},
"translator": {
"title": "翻译者",
@@ -2419,5 +2469,22 @@
"featureWebhooks": "Webhook配置和事件订阅",
"featureSwagger": "OpenAPI / Swagger规范自动生成",
"featureAuth": "每个端点的API密钥和OAuth范围管理"
},
"agents": {
"title": "CLI Agents",
"description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
"refresh": "Refresh",
"installed": "Installed",
"notFound": "Not Found",
"builtIn": "Built-in",
"custom": "Custom",
"remove": "Remove",
"addCustomAgent": "Add Custom Agent",
"addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
"agentName": "Agent Name",
"binaryName": "Binary Name",
"versionCommand": "Version Command",
"spawnArgs": "Spawn Args",
"addAgent": "Add Agent"
}
}
+6 -8
View File
@@ -126,18 +126,16 @@ export async function createProviderConnection(data: JsonRecord) {
return cleanNulls(merged);
}
// Generate name
// Generate name: prefer explicit name, then email, then a stable short-ID label.
// Avoid sequential "Account N" — it reassigns when accounts are deleted/reordered.
let connectionName = data.name || null;
if (!connectionName && data.authType === "oauth") {
if (data.email) {
connectionName = data.email;
} else {
const count = db
.prepare("SELECT COUNT(*) as cnt FROM provider_connections WHERE provider = ?")
.get(data.provider) as JsonRecord | undefined;
const cntValue = toNumberOrZero(toRecord(count).cnt);
connectionName = `Account ${cntValue + 1}`;
connectionName = data.email as string;
} else if (data.displayName) {
connectionName = data.displayName as string;
}
// Otherwise leave null — UI will fall back to getAccountDisplayName() → "Account #<id>"
}
// Auto-increment priority
+26 -12
View File
@@ -13,7 +13,14 @@ export const cline = {
},
exchangeToken: async (config, code, redirectUri) => {
try {
// Cline embeds tokens as base64-encoded JSON in the auth code.
// The code may be URL-encoded when pasted from the callback URL.
let base64 = code;
try {
base64 = decodeURIComponent(base64);
} catch {
/* already decoded */
}
const padding = 4 - (base64.length % 4);
if (padding !== 4) {
base64 += "=".repeat(padding);
@@ -62,16 +69,23 @@ export const cline = {
};
}
},
mapTokens: (tokens) => ({
accessToken: tokens.access_token,
refreshToken: tokens.refresh_token,
expiresIn: tokens.expires_at
? Math.floor((new Date(tokens.expires_at).getTime() - Date.now()) / 1000)
: 3600,
email: tokens.email,
providerSpecificData: {
firstName: tokens.firstName,
lastName: tokens.lastName,
},
}),
mapTokens: (tokens) => {
const firstName = tokens.firstName || "";
const lastName = tokens.lastName || "";
const fullName = [firstName, lastName].filter(Boolean).join(" ").trim();
return {
accessToken: tokens.access_token,
refreshToken: tokens.refresh_token,
expiresIn: tokens.expires_at
? Math.floor((new Date(tokens.expires_at).getTime() - Date.now()) / 1000)
: 3600,
// Use full name if available, fallback to email so UI shows a real label
name: fullName || tokens.email || null,
email: tokens.email,
providerSpecificData: {
firstName: tokens.firstName,
lastName: tokens.lastName,
},
};
},
};
+21 -3
View File
@@ -87,7 +87,13 @@ export default function OAuthModal({
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);
if (!res.ok) {
const errMsg =
typeof data.error === "object" && data.error !== null
? (data.error as any).message || JSON.stringify(data.error)
: data.error || "Exchange failed";
throw new Error(errMsg);
}
setStep("success");
onSuccess?.();
@@ -180,7 +186,13 @@ export default function OAuthModal({
const res = await fetch(`/api/oauth/${provider}/device-code`);
const data = await res.json();
if (!res.ok) throw new Error(data.error);
if (!res.ok) {
const errMsg =
typeof data.error === "object" && data.error !== null
? (data.error as any).message || JSON.stringify(data.error)
: data.error || "Request failed";
throw new Error(errMsg);
}
setDeviceData(data);
@@ -281,7 +293,13 @@ export default function OAuthModal({
`/api/oauth/${provider}/authorize?redirect_uri=${encodeURIComponent(redirectUri)}`
);
const data = await res.json();
if (!res.ok) throw new Error(data.error);
if (!res.ok) {
const errMsg =
typeof data.error === "object" && data.error !== null
? (data.error as any).message || JSON.stringify(data.error)
: data.error || "Authorization failed";
throw new Error(errMsg);
}
setAuthData({ ...data, redirectUri });
+4
View File
@@ -1,3 +1,7 @@
import { test } from "node:test";
import assert from "node:assert/strict";
import { parseModel } from "../../open-sse/services/model.ts";
// [1m] extended context suffix — PR #311 (DavyMassoneto)
test("[1m] suffix: strips suffix and sets extendedContext=true", () => {
const result = parseModel("claude-sonnet-4-6[1m]");