Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b123fb2cc7 | |||
| 0da3621a68 | |||
| f380d44697 | |||
| 86d377a2f0 | |||
| 508a6d99f5 | |||
| 63e42047e3 | |||
| 13829de0d9 | |||
| ad7f570be5 | |||
| 9ba4f966db | |||
| e88d260acd | |||
| 8121238872 | |||
| 161e377ec1 |
@@ -2,6 +2,28 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [3.1.8] - 2026-03-27
|
||||
|
||||
### 🐛 Bug Fixes & Features
|
||||
|
||||
- **Platform Core:** Implemented global state handling for Hidden Models & Combos preventing them from cluttering the catalog or leaking into connected MCP agents (#681).
|
||||
- **Stability:** Patched streaming crashes related to the native Antigravity provider integration failing due to unhandled undefined state arrays (#684).
|
||||
- **Localization Sync:** Deployed a fully overhauled `i18n` synchronizer detecting missing nested JSON properties and retro-fitting 30 locales sequentially (#685).## [3.1.7] - 2026-03-27
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- **Streaming Stability:** Fixed `hasValuableContent` returning `undefined` for empty chunks in SSE streams (#676).
|
||||
- **Tool Calling:** Fixed an issue in `sseParser.ts` where non-streaming Claude responses with multiple tool calls dropped the `id` of subsequent tool calls due to incorrect index-based deduplication (#671).
|
||||
|
||||
---
|
||||
|
||||
## [3.1.6] — 2026-03-27
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- **Claude Native Tool Name Restoration** — Tool names like `TodoWrite` are no longer prefixed with `proxy_` in Claude passthrough responses (both streaming and non-streaming). Includes unit test coverage (PR #663 by @coobabm)
|
||||
- **Clear All Models Alias Cleanup** — "Clear All Models" button now also removes associated model aliases, preventing ghost models in the UI (PR #664 by @rdself)
|
||||
|
||||
---
|
||||
|
||||
## [3.1.5] — 2026-03-27
|
||||
|
||||
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+1962
File diff suppressed because it is too large
Load Diff
+2073
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
@@ -876,6 +876,35 @@ docker compose --profile base up -d
|
||||
docker compose --profile cli up -d
|
||||
```
|
||||
|
||||
**Using Docker Compose with Caddy (HTTPS Auto-TLS):**
|
||||
|
||||
OmniRoute can be securely exposed using Caddy's automatic SSL provisioning. Ensure your domain's DNS A record points to your server's IP.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
omniroute:
|
||||
image: diegosouzapw/omniroute:latest
|
||||
container_name: omniroute
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- omniroute-data:/app/data
|
||||
environment:
|
||||
- PORT=20128
|
||||
- NEXT_PUBLIC_BASE_URL=https://your-domain.com
|
||||
|
||||
caddy:
|
||||
image: caddy:latest
|
||||
container_name: caddy
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
command: caddy reverse-proxy --from https://your-domain.com --to http://omniroute:20128
|
||||
|
||||
volumes:
|
||||
omniroute-data:
|
||||
```
|
||||
|
||||
| Image | Tag | Size | Description |
|
||||
| ------------------------ | -------- | ------ | --------------------- |
|
||||
| `diegosouzapw/omniroute` | `latest` | ~250MB | Latest stable release |
|
||||
|
||||
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2080
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+2079
File diff suppressed because it is too large
Load Diff
+2074
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -1,7 +1,7 @@
|
||||
openapi: 3.1.0
|
||||
info:
|
||||
title: OmniRoute API
|
||||
version: 3.1.5
|
||||
version: 3.1.8
|
||||
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,
|
||||
|
||||
@@ -32,6 +32,7 @@ import {
|
||||
getModelUpstreamExtraHeaders,
|
||||
} from "@/lib/localDb";
|
||||
import { getExecutor } from "../executors/index.ts";
|
||||
import { CLAUDE_OAUTH_TOOL_PREFIX } from "../translator/request/openai-to-claude.ts";
|
||||
import {
|
||||
parseCodexQuotaHeaders,
|
||||
getCodexResetTime,
|
||||
@@ -84,6 +85,51 @@ export function shouldUseNativeCodexPassthrough({
|
||||
return segments.includes("responses");
|
||||
}
|
||||
|
||||
function buildClaudePassthroughToolNameMap(body: Record<string, unknown> | null | undefined) {
|
||||
if (!body || !Array.isArray(body.tools)) return null;
|
||||
|
||||
const toolNameMap = new Map<string, string>();
|
||||
for (const tool of body.tools) {
|
||||
const toolRecord = tool as Record<string, unknown>;
|
||||
const toolData =
|
||||
toolRecord?.type === "function" &&
|
||||
toolRecord.function &&
|
||||
typeof toolRecord.function === "object"
|
||||
? (toolRecord.function as Record<string, unknown>)
|
||||
: toolRecord;
|
||||
const originalName = typeof toolData?.name === "string" ? toolData.name.trim() : "";
|
||||
if (!originalName) continue;
|
||||
toolNameMap.set(`${CLAUDE_OAUTH_TOOL_PREFIX}${originalName}`, originalName);
|
||||
}
|
||||
|
||||
return toolNameMap.size > 0 ? toolNameMap : null;
|
||||
}
|
||||
|
||||
function restoreClaudePassthroughToolNames(
|
||||
responseBody: Record<string, unknown>,
|
||||
toolNameMap: Map<string, string> | null
|
||||
) {
|
||||
if (!toolNameMap || !Array.isArray(responseBody?.content)) return responseBody;
|
||||
|
||||
let changed = false;
|
||||
const content = responseBody.content.map((block: Record<string, unknown>) => {
|
||||
if (block?.type !== "tool_use" || typeof block?.name !== "string") return block;
|
||||
const restoredName = toolNameMap.get(block.name) ?? block.name;
|
||||
if (restoredName === block.name) return block;
|
||||
changed = true;
|
||||
return {
|
||||
...block,
|
||||
name: restoredName,
|
||||
};
|
||||
});
|
||||
|
||||
if (!changed) return responseBody;
|
||||
return {
|
||||
...responseBody,
|
||||
content,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Core chat handler - shared between SSE and Worker
|
||||
* Returns { success, response, status, error } for caller to handle fallback
|
||||
@@ -415,6 +461,7 @@ export async function handleChatCore({
|
||||
FORMATS.OPENAI,
|
||||
FORMATS.CLAUDE,
|
||||
model,
|
||||
{ ...translatedBody, _disableToolPrefix: true },
|
||||
translatedBody,
|
||||
stream,
|
||||
credentials,
|
||||
@@ -566,7 +613,14 @@ export async function handleChatCore({
|
||||
}
|
||||
|
||||
// Extract toolNameMap for response translation (Claude OAuth)
|
||||
const toolNameMap = translatedBody._toolNameMap;
|
||||
const translatedToolNameMap = translatedBody._toolNameMap;
|
||||
const nativeClaudeToolNameMap = isClaudePassthrough
|
||||
? buildClaudePassthroughToolNameMap(body)
|
||||
: null;
|
||||
const toolNameMap =
|
||||
translatedToolNameMap instanceof Map && translatedToolNameMap.size > 0
|
||||
? translatedToolNameMap
|
||||
: nativeClaudeToolNameMap;
|
||||
delete translatedBody._toolNameMap;
|
||||
delete translatedBody._disableToolPrefix;
|
||||
|
||||
@@ -1014,6 +1068,10 @@ export async function handleChatCore({
|
||||
}
|
||||
}
|
||||
|
||||
if (sourceFormat === FORMATS.CLAUDE && targetFormat === FORMATS.CLAUDE) {
|
||||
responseBody = restoreClaudePassthroughToolNames(responseBody, toolNameMap);
|
||||
}
|
||||
|
||||
// Notify success - caller can clear error status if needed
|
||||
if (onRequestSuccess) {
|
||||
await onRequestSuccess();
|
||||
@@ -1235,6 +1293,7 @@ export async function handleChatCore({
|
||||
transformStream = createPassthroughStreamWithLogger(
|
||||
provider,
|
||||
reqLogger,
|
||||
toolNameMap,
|
||||
model,
|
||||
connectionId,
|
||||
body,
|
||||
|
||||
@@ -36,8 +36,8 @@ export function parseSSEToOpenAIResponse(rawSSE, fallbackModel) {
|
||||
let usage = null;
|
||||
|
||||
const getToolCallKey = (toolCall: Record<string, unknown>) => {
|
||||
if (toolCall?.id) return `id:${toolCall.id}`;
|
||||
if (Number.isInteger(toolCall?.index)) return `idx:${toolCall.index}`;
|
||||
if (toolCall?.id) return `id:${toolCall.id}`;
|
||||
unknownToolCallSeq += 1;
|
||||
return `seq:${unknownToolCallSeq}`;
|
||||
};
|
||||
|
||||
@@ -439,7 +439,7 @@ async function handleListModelsCatalog(args: { provider?: string; capability?: s
|
||||
|
||||
if (args.provider && !args.capability) {
|
||||
// Use direct provider fetch to get real-time API status
|
||||
path = `/api/providers/${encodeURIComponent(args.provider)}/models`;
|
||||
path = `/api/providers/${encodeURIComponent(args.provider)}/models?excludeHidden=true`;
|
||||
isProviderSpecific = true;
|
||||
} else {
|
||||
const params = new URLSearchParams();
|
||||
|
||||
@@ -568,6 +568,15 @@ export async function handleComboChat({
|
||||
: handleSingleModel;
|
||||
// ─────────────────────────────────────────────────────────────────────────
|
||||
|
||||
// Route to pinned model if context caching specifies one (Fix #679)
|
||||
if (pinnedModel) {
|
||||
log.info(
|
||||
"COMBO",
|
||||
`Bypassing strategy — routing directly to pinned context model: ${pinnedModel}`
|
||||
);
|
||||
return handleSingleModelWrapped(body, pinnedModel);
|
||||
}
|
||||
|
||||
// Route to round-robin handler if strategy matches
|
||||
if (strategy === "round-robin") {
|
||||
return handleRoundRobinCombo({
|
||||
|
||||
@@ -464,6 +464,9 @@ export function openaiResponsesToOpenAIResponse(chunk, state) {
|
||||
}
|
||||
|
||||
// Function call arguments delta
|
||||
// NOTE: Do NOT include `id` or `type` here - only first chunk (response.output_item.added)
|
||||
// should have them. Including `id` on every chunk causes openai-to-claude.ts to emit
|
||||
// a new content_block_start for each delta, breaking Claude Code ACP sessions.
|
||||
if (eventType === "response.function_call_arguments.delta") {
|
||||
const argsDelta = data.delta || "";
|
||||
if (!argsDelta) return null;
|
||||
@@ -480,8 +483,6 @@ export function openaiResponsesToOpenAIResponse(chunk, state) {
|
||||
tool_calls: [
|
||||
{
|
||||
index: state.toolCallIndex,
|
||||
id: state.currentToolCallId,
|
||||
type: "function",
|
||||
function: { arguments: argsDelta },
|
||||
},
|
||||
],
|
||||
|
||||
@@ -72,6 +72,22 @@ function getOpenAIIntermediateChunks(value: unknown): unknown[] {
|
||||
return Array.isArray(candidate) ? candidate : [];
|
||||
}
|
||||
|
||||
function restoreClaudePassthroughToolUseName(parsed: JsonRecord, toolNameMap: unknown): boolean {
|
||||
if (!(toolNameMap instanceof Map)) return false;
|
||||
if (!parsed || typeof parsed !== "object") return false;
|
||||
|
||||
const block =
|
||||
parsed.content_block && typeof parsed.content_block === "object"
|
||||
? (parsed.content_block as JsonRecord)
|
||||
: null;
|
||||
if (!block || block.type !== "tool_use" || typeof block.name !== "string") return false;
|
||||
|
||||
const restoredName = toolNameMap.get(block.name) ?? block.name;
|
||||
if (restoredName === block.name) return false;
|
||||
block.name = restoredName;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Note: TextDecoder/TextEncoder are created per-stream inside createSSEStream()
|
||||
// to avoid shared state issues with concurrent streams (TextDecoder with {stream:true}
|
||||
// maintains internal buffering state between decode() calls).
|
||||
@@ -248,6 +264,7 @@ export function createSSEStream(options: StreamOptions = {}) {
|
||||
if (eu.cache_creation_input_tokens)
|
||||
u.cache_creation_input_tokens = eu.cache_creation_input_tokens;
|
||||
}
|
||||
const restoredToolName = restoreClaudePassthroughToolUseName(parsed, toolNameMap);
|
||||
// Track content length and accumulate from Claude format
|
||||
if (parsed.delta?.text) {
|
||||
totalContentLength += parsed.delta.text.length;
|
||||
@@ -257,6 +274,11 @@ export function createSSEStream(options: StreamOptions = {}) {
|
||||
totalContentLength += parsed.delta.thinking.length;
|
||||
passthroughAccumulatedContent += parsed.delta.thinking;
|
||||
}
|
||||
if (restoredToolName) {
|
||||
output = `data: ${JSON.stringify(parsed)}
|
||||
`;
|
||||
injectedUsage = true;
|
||||
}
|
||||
} else {
|
||||
// Chat Completions: full sanitization pipeline
|
||||
parsed = sanitizeStreamingChunk(parsed);
|
||||
@@ -771,6 +793,7 @@ export function createSSETransformStreamWithLogger(
|
||||
export function createPassthroughStreamWithLogger(
|
||||
provider: string | null = null,
|
||||
reqLogger: StreamLogger | null = null,
|
||||
toolNameMap: unknown = null,
|
||||
model: string | null = null,
|
||||
connectionId: string | null = null,
|
||||
body: unknown = null,
|
||||
@@ -781,6 +804,7 @@ export function createPassthroughStreamWithLogger(
|
||||
mode: STREAM_MODE.PASSTHROUGH,
|
||||
provider,
|
||||
reqLogger,
|
||||
toolNameMap,
|
||||
model,
|
||||
connectionId,
|
||||
apiKeyInfo,
|
||||
|
||||
@@ -39,32 +39,34 @@ export function parseSSELine(line) {
|
||||
// Check if chunk has valuable content (not empty)
|
||||
export function hasValuableContent(chunk, format) {
|
||||
// OpenAI format
|
||||
if (format === FORMATS.OPENAI && chunk.choices?.[0]?.delta) {
|
||||
if (format === FORMATS.OPENAI) {
|
||||
if (!chunk.choices?.[0]?.delta) return false;
|
||||
const delta = chunk.choices[0].delta;
|
||||
return (
|
||||
(delta.content && delta.content !== "") ||
|
||||
(delta.reasoning_content && delta.reasoning_content !== "") ||
|
||||
(delta.tool_calls && delta.tool_calls.length > 0) ||
|
||||
chunk.choices[0].finish_reason ||
|
||||
delta.role
|
||||
);
|
||||
if (typeof delta.content === "string" && delta.content.length > 0) return true;
|
||||
if (typeof delta.reasoning_content === "string" && delta.reasoning_content.length > 0)
|
||||
return true;
|
||||
if (Array.isArray(delta.tool_calls) && delta.tool_calls.length > 0) return true;
|
||||
if (chunk.choices[0].finish_reason) return true;
|
||||
if (typeof delta.role === "string" && delta.role.length > 0) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Claude format
|
||||
if (format === FORMATS.CLAUDE) {
|
||||
const isContentBlockDelta = chunk.type === "content_block_delta";
|
||||
const hasText = chunk.delta?.text && chunk.delta.text !== "";
|
||||
const hasThinking = chunk.delta?.thinking && chunk.delta.thinking !== "";
|
||||
const hasInputJson = chunk.delta?.partial_json && chunk.delta.partial_json !== "";
|
||||
|
||||
if (isContentBlockDelta && !hasText && !hasThinking && !hasInputJson) {
|
||||
return false;
|
||||
if (isContentBlockDelta) {
|
||||
const hasText = typeof chunk.delta?.text === "string" && chunk.delta.text.length > 0;
|
||||
const hasThinking =
|
||||
typeof chunk.delta?.thinking === "string" && chunk.delta.thinking.length > 0;
|
||||
const hasInputJson =
|
||||
typeof chunk.delta?.partial_json === "string" && chunk.delta.partial_json.length > 0;
|
||||
if (!hasText && !hasThinking && !hasInputJson) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Gemini format: filter chunks with no actual content parts
|
||||
if (format === FORMATS.GEMINI && chunk.candidates?.[0]) {
|
||||
// Gemini / Antigravity format: filter chunks with no actual content parts
|
||||
if ((format === FORMATS.GEMINI || format === FORMATS.ANTIGRAVITY) && chunk.candidates?.[0]) {
|
||||
const candidate = chunk.candidates[0];
|
||||
// Keep chunks with finish reason or safety ratings (they signal completion)
|
||||
if (candidate.finishReason) return true;
|
||||
@@ -73,7 +75,7 @@ export function hasValuableContent(chunk, format) {
|
||||
if (!parts || parts.length === 0) return false;
|
||||
// Filter out chunks where all parts have empty text
|
||||
const hasContent = parts.some(
|
||||
(p) => (p.text && p.text !== "") || p.functionCall || p.executableCode
|
||||
(p) => (typeof p.text === "string" && p.text.length > 0) || p.functionCall || p.executableCode
|
||||
);
|
||||
return hasContent;
|
||||
}
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "omniroute",
|
||||
"version": "3.1.5",
|
||||
"version": "3.1.8",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "omniroute",
|
||||
"version": "3.1.5",
|
||||
"version": "3.1.8",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"workspaces": [
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "omniroute",
|
||||
"version": "3.1.5",
|
||||
"version": "3.1.8",
|
||||
"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": {
|
||||
|
||||
@@ -608,6 +608,9 @@ function collectStringLeaves(node, pathSoFar = [], output = []) {
|
||||
function setByPath(target, pathTokens, value) {
|
||||
let current = target;
|
||||
for (let i = 0; i < pathTokens.length - 1; i += 1) {
|
||||
if (current[pathTokens[i]] === undefined) {
|
||||
current[pathTokens[i]] = typeof pathTokens[i + 1] === "number" ? [] : {};
|
||||
}
|
||||
current = current[pathTokens[i]];
|
||||
}
|
||||
current[pathTokens[pathTokens.length - 1]] = value;
|
||||
@@ -728,25 +731,43 @@ async function generateMessageTranslations() {
|
||||
const sourceJson = JSON.parse(sourceRaw);
|
||||
|
||||
const leaves = collectStringLeaves(sourceJson);
|
||||
const sourceValues = leaves.map((entry) => entry.value);
|
||||
|
||||
for (const spec of LOCALE_SPECS) {
|
||||
if (spec.code === "en" || spec.code === "pt-BR") {
|
||||
if (spec.code === "en") {
|
||||
continue;
|
||||
}
|
||||
|
||||
const targetPath = path.join(MESSAGES_DIR, `${spec.code}.json`);
|
||||
let targetJson = {};
|
||||
if (await fileExists(targetPath)) {
|
||||
console.log(`[messages] Skipping ${spec.code} (already exists).`);
|
||||
const targetRaw = await fs.readFile(targetPath, "utf8");
|
||||
try {
|
||||
targetJson = JSON.parse(targetRaw);
|
||||
} catch (e) {
|
||||
console.warn(`[messages] Failed to parse ${spec.code}.json`);
|
||||
}
|
||||
}
|
||||
|
||||
const missingLeaves = leaves.filter((leaf) => {
|
||||
let current = targetJson;
|
||||
for (const token of leaf.path) {
|
||||
if (current === undefined || current === null) return true;
|
||||
current = current[token];
|
||||
}
|
||||
return current === undefined || current === null || current === "";
|
||||
});
|
||||
|
||||
if (missingLeaves.length === 0) {
|
||||
console.log(`[messages] ${spec.code} is up-to-date.`);
|
||||
continue;
|
||||
}
|
||||
|
||||
console.log(`[messages] Translating ${spec.code}...`);
|
||||
console.log(`[messages] Translating ${missingLeaves.length} missing keys for ${spec.code}...`);
|
||||
const sourceValues = missingLeaves.map((entry) => entry.value);
|
||||
const translatedValues = await translateStrings(sourceValues, spec.googleTl);
|
||||
|
||||
const targetJson = structuredClone(sourceJson);
|
||||
translatedValues.forEach((value, index) => {
|
||||
setByPath(targetJson, leaves[index].path, value);
|
||||
setByPath(targetJson, missingLeaves[index].path, value);
|
||||
});
|
||||
|
||||
await fs.writeFile(targetPath, `${JSON.stringify(targetJson, null, 2)}\n`, "utf8");
|
||||
|
||||
@@ -1553,7 +1553,19 @@ export default function ProviderDetailPage() {
|
||||
{ method: "DELETE" }
|
||||
);
|
||||
if (res.ok) {
|
||||
// Also delete all aliases that belong to this provider
|
||||
const aliasEntries = Object.entries(modelAliases).filter(([, model]) =>
|
||||
(model as string).startsWith(`${providerStorageAlias}/`)
|
||||
);
|
||||
await Promise.all(
|
||||
aliasEntries.map(([alias]) =>
|
||||
fetch(`/api/models/alias?alias=${encodeURIComponent(alias)}`, {
|
||||
method: "DELETE",
|
||||
}).catch(() => {})
|
||||
)
|
||||
);
|
||||
await fetchProviderModelMeta();
|
||||
await fetchAliases();
|
||||
notify.success(t("clearAllModelsSuccess"));
|
||||
} else {
|
||||
notify.error(t("clearAllModelsFailed"));
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
isAnthropicCompatibleProvider,
|
||||
} from "@/shared/constants/providers";
|
||||
import { PROVIDER_MODELS } from "@/shared/constants/models";
|
||||
import { getModelIsHidden } from "@/lib/localDb";
|
||||
|
||||
type JsonRecord = Record<string, unknown>;
|
||||
|
||||
@@ -322,9 +323,18 @@ const PROVIDER_MODELS_CONFIG: Record<string, ProviderModelsConfigEntry> = {
|
||||
/**
|
||||
* GET /api/providers/[id]/models - Get models list from provider
|
||||
*/
|
||||
export async function GET(request, { params }) {
|
||||
export async function GET(
|
||||
request: Request,
|
||||
context: { params: Promise<{ id: string }> | { id: string } }
|
||||
) {
|
||||
try {
|
||||
const { id } = await params;
|
||||
const params = await context.params;
|
||||
const { id } = params;
|
||||
|
||||
// Check if we should exclude hidden models (used by MCP tools to prevent hidden model leaks)
|
||||
const { searchParams } = new URL(request.url);
|
||||
const excludeHidden = searchParams.get("excludeHidden") === "true";
|
||||
|
||||
const connection = await getProviderConnectionById(id);
|
||||
|
||||
if (!connection) {
|
||||
@@ -339,6 +349,13 @@ export async function GET(request, { params }) {
|
||||
return NextResponse.json({ error: "Invalid connection provider" }, { status: 400 });
|
||||
}
|
||||
|
||||
const buildResponse = (payload: any, statusConfig?: ResponseInit) => {
|
||||
if (excludeHidden && payload.models && Array.isArray(payload.models)) {
|
||||
payload.models = payload.models.filter((m: any) => !getModelIsHidden(provider, m.id));
|
||||
}
|
||||
return NextResponse.json(payload, statusConfig);
|
||||
};
|
||||
|
||||
const connectionId = typeof connection.id === "string" ? connection.id : id;
|
||||
const apiKey = typeof connection.apiKey === "string" ? connection.apiKey : "";
|
||||
const accessToken = typeof connection.accessToken === "string" ? connection.accessToken : "";
|
||||
@@ -423,7 +440,7 @@ export async function GET(request, { params }) {
|
||||
? "local_catalog"
|
||||
: "api";
|
||||
|
||||
return NextResponse.json({
|
||||
return buildResponse({
|
||||
provider,
|
||||
connectionId,
|
||||
models,
|
||||
@@ -435,7 +452,7 @@ export async function GET(request, { params }) {
|
||||
}
|
||||
|
||||
if (provider === "claude") {
|
||||
return NextResponse.json({
|
||||
return buildResponse({
|
||||
provider,
|
||||
connectionId,
|
||||
models: STATIC_MODEL_PROVIDERS.claude(),
|
||||
@@ -480,7 +497,7 @@ export async function GET(request, { params }) {
|
||||
const data = await response.json();
|
||||
const models = data.data || data.models || [];
|
||||
|
||||
return NextResponse.json({
|
||||
return buildResponse({
|
||||
provider,
|
||||
connectionId,
|
||||
models,
|
||||
@@ -493,7 +510,7 @@ export async function GET(request, { params }) {
|
||||
? STATIC_MODEL_PROVIDERS[provider as keyof typeof STATIC_MODEL_PROVIDERS]
|
||||
: undefined;
|
||||
if (staticModelsFn) {
|
||||
return NextResponse.json({
|
||||
return buildResponse({
|
||||
provider,
|
||||
connectionId,
|
||||
models: staticModelsFn(),
|
||||
@@ -559,7 +576,7 @@ export async function GET(request, { params }) {
|
||||
const data = await response.json();
|
||||
const models = config.parseResponse(data);
|
||||
|
||||
return NextResponse.json({
|
||||
return buildResponse({
|
||||
provider,
|
||||
connectionId,
|
||||
models,
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
getAllCustomModels,
|
||||
getSettings,
|
||||
getProviderNodes,
|
||||
getModelIsHidden,
|
||||
} from "@/lib/localDb";
|
||||
import { isAuthenticated } from "@/shared/utils/apiAuth";
|
||||
import { getAllEmbeddingModels } from "@omniroute/open-sse/config/embeddingRegistry.ts";
|
||||
@@ -223,7 +224,7 @@ export async function getUnifiedModelsResponse(
|
||||
|
||||
// Add combos first (they appear at the top) — only active ones
|
||||
for (const combo of combos) {
|
||||
if (combo.isActive === false) continue;
|
||||
if (combo.isActive === false || combo.isHidden === true) continue;
|
||||
models.push({
|
||||
id: combo.name,
|
||||
object: "model",
|
||||
@@ -255,6 +256,8 @@ export async function getUnifiedModelsResponse(
|
||||
|
||||
for (const model of providerModels) {
|
||||
const aliasId = `${alias}/${model.id}`;
|
||||
if (getModelIsHidden(canonicalProviderId, model.id)) continue;
|
||||
|
||||
const visionFields =
|
||||
getVisionCapabilityFields(aliasId) || getVisionCapabilityFields(model.id);
|
||||
// Model-level context length overrides provider default
|
||||
@@ -416,6 +419,7 @@ export async function getUnifiedModelsResponse(
|
||||
for (const model of providerCustomModels) {
|
||||
const modelId = typeof model.id === "string" ? model.id : null;
|
||||
if (!modelId) continue;
|
||||
if (model.isHidden === true) continue;
|
||||
|
||||
// Skip if already added as built-in
|
||||
const aliasId = `${alias}/${modelId}`;
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "مجاني",
|
||||
"skipToContent": "انتقل إلى المحتوى",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "قبول",
|
||||
"accountId": "معرف الحساب",
|
||||
"alias": "الاسم المستعار",
|
||||
"apiKeyId": "معرف مفتاح واجهة برمجة التطبيقات",
|
||||
"apiKeyName": "اسم مفتاح واجهة برمجة التطبيقات",
|
||||
"apiKeySecret": "سر مفتاح API",
|
||||
"authorization": "إذن",
|
||||
"content-type": "نوع المحتوى",
|
||||
"content-length": "طول المحتوى",
|
||||
"cookie": "ملف تعريف الارتباط",
|
||||
"file": "ملف",
|
||||
"host": "المضيف",
|
||||
"id": "معرف",
|
||||
"import": "استيراد",
|
||||
"limit": "الحد",
|
||||
"offset": "إزاحة",
|
||||
"open": "مفتوح",
|
||||
"origin": "الأصل",
|
||||
"promptTokens": "الرموز الفورية",
|
||||
"completionTokens": "رموز الإنجاز",
|
||||
"totalTokens": "مجموع الرموز",
|
||||
"rawModel": "النموذج الخام",
|
||||
"scope": "النطاق",
|
||||
"skill": "مهارة",
|
||||
"sortBy": "فرز حسب",
|
||||
"sortOrder": "ترتيب الفرز",
|
||||
"tab": "علامة التبويب",
|
||||
"text": "نص",
|
||||
"textarea": "منطقة النص",
|
||||
"tool": "أداة",
|
||||
"toolId": "معرف الأداة",
|
||||
"web": "ويب",
|
||||
"whereUsed": "حيث تستخدم",
|
||||
"whitelist": "القائمة البيضاء",
|
||||
"blacklist": "القائمة السوداء",
|
||||
"resolve": "حل",
|
||||
"force": "القوة",
|
||||
"base64url": "عنوان URL Base64",
|
||||
"hex": "عرافة",
|
||||
"range": "النطاق",
|
||||
"component": "مكون",
|
||||
"redirect_uri": "إعادة توجيه URI",
|
||||
"idempotency-key": "مفتاح العجز",
|
||||
"error_description": "وصف الخطأ",
|
||||
"code": "الكود",
|
||||
"compatible": "متوافق",
|
||||
"chat-completions": "استكمالات الدردشة",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "رمز المصادقة",
|
||||
"crypto": "تشفير",
|
||||
"hours": "ساعات",
|
||||
"selfsigned": "موقعة ذاتيا",
|
||||
"proxy_id": "معرف الوكيل",
|
||||
"proxyId": "معرف الوكيل",
|
||||
"connectionId": "معرف الاتصال",
|
||||
"resolveConnectionId": "حل معرف الاتصال",
|
||||
"resolve_connection_id": "حل معرف الاتصال",
|
||||
"scope_id": "معرف النطاق",
|
||||
"scopeId": "معرف النطاق",
|
||||
"jwtSecret": "JWT سر",
|
||||
"keytar": "كيتار",
|
||||
"better-sqlite3": "أفضل-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "معرف البناء",
|
||||
"musicDesc": "وصف الموسيقى",
|
||||
"musicGeneration": "جيل الموسيقى",
|
||||
"idc": "آي دي سي",
|
||||
"cloud-status-changed": "تغيرت حالة السحابة",
|
||||
"where_used": "حيث تستخدم",
|
||||
"windowMs": "النافذة (مللي ثانية)",
|
||||
"social-github": "جيثب",
|
||||
"social-google": "جوجل",
|
||||
"TOOL_ALLOWLIST": "القائمة المسموح بها للأداة",
|
||||
"TOOL_DENYLIST": "قائمة رفض الأداة",
|
||||
"Failed to save pricing": "فشل حفظ الأسعار",
|
||||
"Failed to reset pricing": "فشل في إعادة تعيين التسعير",
|
||||
"apikey": "مفتاح واجهة برمجة التطبيقات",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "الصفحة الرئيسية",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} طلب",
|
||||
"providerModelsTitle": "{provider} - النماذج",
|
||||
"copiedModel": "تم النسخ: {model}",
|
||||
"aliasLabel": "الاسم المستعار"
|
||||
"aliasLabel": "الاسم المستعار",
|
||||
"updateNow": "التحديث الآن",
|
||||
"updating": "جارٍ التحديث...",
|
||||
"updateAvailableDesc": "نسخة جديدة متاحة. انقر للتحديث.",
|
||||
"updateStarted": "بدأ التحديث..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "التحليلات",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "إضافة تكوين النموذج",
|
||||
"desc": "أضف التكوين التالي إلى مجموعة النماذج الخاصة بك:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "متابعة يستخدم ملف التكوين JSON."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "يتطلب OpenCode تكوين مفتاح API.",
|
||||
"1": "قم بتعيين عنوان URL الأساسي إلى نقطة نهاية OmniRoute الخاصة بك."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "يتطلب كيرو حساب أمازون."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "المزامنة التلقائية",
|
||||
"autoSyncTooltip": "تحديث قائمة النماذج تلقائيًا كل 24 ساعة (قابلة للتكوين عبر MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "تم تمكين المزامنة التلقائية — سيتم تحديث النماذج بشكل دوري",
|
||||
"autoSyncDisabled": "تم تعطيل المزامنة التلقائية",
|
||||
"autoSyncToggleFailed": "فشل في تبديل المزامنة التلقائية",
|
||||
"clearAllModels": "مسح كافة النماذج",
|
||||
"clearAllModelsConfirm": "هل أنت متأكد أنك تريد إزالة كافة النماذج لهذا الموفر؟ لا يمكن التراجع عن هذا.",
|
||||
"clearAllModelsSuccess": "تم مسح جميع النماذج",
|
||||
"clearAllModelsFailed": "فشل في مسح النماذج"
|
||||
},
|
||||
"settings": {
|
||||
"title": "الإعدادات",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "أعد تشغيل الخادم وسيتم استخدام كلمة المرور الجديدة",
|
||||
"backToLogin": "العودة إلى تسجيل الدخول",
|
||||
"forgotPassword": "هل نسيت كلمة المرور؟",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "إذن",
|
||||
"Content-Disposition": "التصرف في المحتوى",
|
||||
"waitingForAuthorization": "في انتظار الترخيص...",
|
||||
"waitingForGoogleAuthorization": "في انتظار إذن Google...",
|
||||
"waitingForOpenAIAuthorization": "في انتظار ترخيص OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "في انتظار تصريح مكافحة الجاذبية...",
|
||||
"waitingForIFlowAuthorization": "في انتظار ترخيص iFlow...",
|
||||
"exchangingCodeForTokens": "استبدال الكود بالرموز..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "توليد تحويل النص إلى كلام (ElevenLabs، OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "إنشاء تضمين النص (OpenAI، Cohere، Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "سياسة الخصوصية",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "دردشة بسيطة",
|
||||
"streaming": "الجري",
|
||||
"system-prompt": "موجه النظام",
|
||||
"thinking": "التفكير",
|
||||
"tool-calling": "استدعاء الأداة",
|
||||
"multi-turn": "متعدد المنعطفات"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "قالب الدردشة الأساسي مع رسالة النظام",
|
||||
"streaming": "نموذج لتدفق الردود",
|
||||
"system-prompt": "قالب مع موجه النظام المخصص",
|
||||
"thinking": "قالب مع ميزانية التفكير/الاستدلال",
|
||||
"tool-calling": "نموذج لاستدعاء الأداة/الوظيفة",
|
||||
"multi-turn": "قالب للمحادثات متعددة المنعطفات"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "أنت مساعد AI مفيد.",
|
||||
"userGreeting": "مرحبا! كيف يمكنني مساعدتك اليوم؟"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "اكتب قصة عنه"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "ما هو معنى الحياة؟",
|
||||
"systemInstruction": "تقديم إجابة مدروسة وفلسفية."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "شرح الحوسبة الكمومية"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "اسم المدينة لمعرفة الطقس لها",
|
||||
"toolDescription": "الحصول على الطقس الحالي لموقع ما",
|
||||
"userWeather": "ما هو الطقس في طوكيو ؟"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "أنت مساعد مفيد.",
|
||||
"assistantExample": "سأكون سعيدًا بمساعدتك في ذلك.",
|
||||
"userInitial": "انا بحاجة الى مساعدة مع",
|
||||
"userFollowUp": "هل يمكنك توضيح ذلك؟"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "безплатно",
|
||||
"skipToContent": "Преминете към съдържанието",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Приеми",
|
||||
"accountId": "ID на акаунта",
|
||||
"alias": "Псевдоним",
|
||||
"apiKeyId": "ID на API ключ",
|
||||
"apiKeyName": "Име на API ключ",
|
||||
"apiKeySecret": "API Key Secret",
|
||||
"authorization": "Упълномощаване",
|
||||
"content-type": "Тип съдържание",
|
||||
"content-length": "Дължина на съдържанието",
|
||||
"cookie": "бисквитка",
|
||||
"file": "Файл",
|
||||
"host": "Домакин",
|
||||
"id": "ID",
|
||||
"import": "Импортиране",
|
||||
"limit": "Лимит",
|
||||
"offset": "Офсет",
|
||||
"open": "Отворете",
|
||||
"origin": "Произход",
|
||||
"promptTokens": "Подкани токени",
|
||||
"completionTokens": "Токени за завършване",
|
||||
"totalTokens": "Общо токени",
|
||||
"rawModel": "Суров модел",
|
||||
"scope": "Обхват",
|
||||
"skill": "Умение",
|
||||
"sortBy": "Сортиране по",
|
||||
"sortOrder": "Ред на сортиране",
|
||||
"tab": "Таб",
|
||||
"text": "Текст",
|
||||
"textarea": "Текстово поле",
|
||||
"tool": "Инструмент",
|
||||
"toolId": "ID на инструмента",
|
||||
"web": "Мрежа",
|
||||
"whereUsed": "Къде се използва",
|
||||
"whitelist": "Бял списък",
|
||||
"blacklist": "Черен списък",
|
||||
"resolve": "Разрешете",
|
||||
"force": "Сила",
|
||||
"base64url": "Base64 URL",
|
||||
"hex": "шестнадесетичен",
|
||||
"range": "Обхват",
|
||||
"component": "Компонент",
|
||||
"redirect_uri": "URI за пренасочване",
|
||||
"idempotency-key": "Ключ за идемпотентност",
|
||||
"error_description": "Описание на грешката",
|
||||
"code": "Код",
|
||||
"compatible": "Съвместим",
|
||||
"chat-completions": "Чат завършвания",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Токен за удостоверяване",
|
||||
"crypto": "Крипто",
|
||||
"hours": "часове",
|
||||
"selfsigned": "Самоподписан",
|
||||
"proxy_id": "ID на прокси",
|
||||
"proxyId": "ID на прокси",
|
||||
"connectionId": "ID на връзката",
|
||||
"resolveConnectionId": "Разрешете ИД на връзката",
|
||||
"resolve_connection_id": "Разрешете ИД на връзката",
|
||||
"scope_id": "ID на обхвата",
|
||||
"scopeId": "ID на обхвата",
|
||||
"jwtSecret": "JWT Secret",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "по-добре-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "ID на строителя",
|
||||
"musicDesc": "Описание на музиката",
|
||||
"musicGeneration": "Музикално поколение",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Състоянието на облака е променено",
|
||||
"where_used": "Къде се използва",
|
||||
"windowMs": "Прозорец (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Списък с разрешени инструменти",
|
||||
"TOOL_DENYLIST": "Списък за отказ на инструмента",
|
||||
"Failed to save pricing": "Неуспешно запазване на цената",
|
||||
"Failed to reset pricing": "Неуспешно нулиране на цените",
|
||||
"apikey": "API ключ",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Начало",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} изискване",
|
||||
"providerModelsTitle": "{provider} - Модели",
|
||||
"copiedModel": "Копирано: {model}",
|
||||
"aliasLabel": "псевдоним"
|
||||
"aliasLabel": "псевдоним",
|
||||
"updateNow": "Актуализирайте сега",
|
||||
"updating": "Актуализиране...",
|
||||
"updateAvailableDesc": "Налична е нова версия. Кликнете, за да актуализирате.",
|
||||
"updateStarted": "Актуализацията започна..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Анализ",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Добавяне на конфигурация на модела",
|
||||
"desc": "Добавете следната конфигурация към вашия масив от модели:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Продължаване използва JSON конфигурационен файл."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode изисква конфигурация на API ключ.",
|
||||
"1": "Задайте основния URL адрес на вашата крайна точка OmniRoute."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Киро изисква акаунт в Amazon."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Автоматично синхронизиране",
|
||||
"autoSyncTooltip": "Автоматично опресняване на списъка с модели на всеки 24 часа (може да се конфигурира чрез MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Автоматичното синхронизиране е активирано — моделите ще се опресняват периодично",
|
||||
"autoSyncDisabled": "Автоматичното синхронизиране е деактивирано",
|
||||
"autoSyncToggleFailed": "Неуспешно превключване на автоматичното синхронизиране",
|
||||
"clearAllModels": "Изчистване на всички модели",
|
||||
"clearAllModelsConfirm": "Сигурни ли сте, че искате да премахнете всички модели за този доставчик? Това не може да бъде отменено.",
|
||||
"clearAllModelsSuccess": "Всички модели изчистени",
|
||||
"clearAllModelsFailed": "Неуспешно изчистване на моделите"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Настройки",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Рестартирайте сървъра - той ще използва новата парола",
|
||||
"backToLogin": "Назад към Вход",
|
||||
"forgotPassword": "Забравена парола?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Упълномощаване",
|
||||
"Content-Disposition": "Съдържание-разположение",
|
||||
"waitingForAuthorization": "Чака се оторизация...",
|
||||
"waitingForGoogleAuthorization": "Изчаква се разрешение от Google...",
|
||||
"waitingForOpenAIAuthorization": "Изчаква се разрешение за OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "Изчаква се разрешение за антигравитация...",
|
||||
"waitingForIFlowAuthorization": "Изчаква се разрешение за iFlow...",
|
||||
"exchangingCodeForTokens": "Размяна на код за токени..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Генериране на текст към реч (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Генериране на вграждане на текст (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Политика за поверителност",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Обикновен чат",
|
||||
"streaming": "Поточно предаване",
|
||||
"system-prompt": "Системен ред",
|
||||
"thinking": "Мислене",
|
||||
"tool-calling": "Извикване на инструмент",
|
||||
"multi-turn": "Многооборотен"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Основен шаблон за чат със системно съобщение",
|
||||
"streaming": "Шаблон за поточно предаване на отговори",
|
||||
"system-prompt": "Шаблон с персонализирана системна подкана",
|
||||
"thinking": "Шаблон с бюджет за разсъждения/мислене",
|
||||
"tool-calling": "Шаблон за извикване на инструмент/функция",
|
||||
"multi-turn": "Шаблон за многооборотни разговори"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Вие сте полезен AI помощник.",
|
||||
"userGreeting": "здравей Как мога да ви помогна днес?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Напишете история за"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Какъв е смисълът на живота?",
|
||||
"systemInstruction": "Дайте обмислен, философски отговор."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Обяснете квантовите изчисления"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Името на града, за който да получите прогноза за времето",
|
||||
"toolDescription": "Вземете текущото време за местоположение",
|
||||
"userWeather": "Какво е времето в Токио?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Вие сте полезен помощник.",
|
||||
"assistantExample": "Ще се радвам да ви помогна с това.",
|
||||
"userInitial": "Имам нужда от помощ за",
|
||||
"userFollowUp": "Можете ли да разкажете по-подробно за това?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2474,7 +2474,9 @@
|
||||
"waitingForOpenAIAuthorization": "Čekám na OpenAI autorizaci...",
|
||||
"waitingForAntigravityAuthorization": "Čekám na Antigravity autorizaci...",
|
||||
"waitingForIFlowAuthorization": "Čekám na iFlow autorizaci...",
|
||||
"exchangingCodeForTokens": "Vyměňuji kód za tokeny..."
|
||||
"exchangingCodeForTokens": "Vyměňuji kód za tokeny...",
|
||||
"Authorization": "Autorizace",
|
||||
"Content-Disposition": "Obsah-Dispozice"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2814,5 +2816,32 @@
|
||||
"thinking": "Šablona s rozpočtem na přemýšlení/odůvodňování",
|
||||
"tool-calling": "Šablona pro volání nástrojů/funkcí",
|
||||
"multi-turn": "Šablona pro konverzace s Multitahy"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Jste užitečný asistent AI.",
|
||||
"userGreeting": "Dobrý den! Jak vám dnes mohu pomoci?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Napište příběh o"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Jaký je smysl života?",
|
||||
"systemInstruction": "Poskytněte promyšlenou, filozofickou odpověď."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Vysvětlete kvantové výpočty"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Název města, pro které se má zjistit počasí",
|
||||
"toolDescription": "Získejte aktuální počasí pro místo",
|
||||
"userWeather": "Jaké je počasí v Tokiu?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Jste užitečný pomocník.",
|
||||
"assistantExample": "Rád vám s tím pomohu.",
|
||||
"userInitial": "Potřebuji pomoct",
|
||||
"userFollowUp": "Můžete to upřesnit?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Gratis",
|
||||
"skipToContent": "Gå til indhold",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Accepter",
|
||||
"accountId": "Konto-id",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "API-nøgle-id",
|
||||
"apiKeyName": "API-nøglenavn",
|
||||
"apiKeySecret": "API-nøglehemmelighed",
|
||||
"authorization": "Autorisation",
|
||||
"content-type": "Indholdstype",
|
||||
"content-length": "Indholdslængde",
|
||||
"cookie": "Cookie",
|
||||
"file": "Fil",
|
||||
"host": "vært",
|
||||
"id": "ID",
|
||||
"import": "Importer",
|
||||
"limit": "Grænse",
|
||||
"offset": "Offset",
|
||||
"open": "Åbn",
|
||||
"origin": "Oprindelse",
|
||||
"promptTokens": "Spørg tokens",
|
||||
"completionTokens": "Fuldførelsestokens",
|
||||
"totalTokens": "Samlede tokens",
|
||||
"rawModel": "Rå model",
|
||||
"scope": "Omfang",
|
||||
"skill": "Færdighed",
|
||||
"sortBy": "Sorter efter",
|
||||
"sortOrder": "Sorteringsrækkefølge",
|
||||
"tab": "Tab",
|
||||
"text": "Tekst",
|
||||
"textarea": "Tekstområde",
|
||||
"tool": "Værktøj",
|
||||
"toolId": "Værktøjs-id",
|
||||
"web": "Web",
|
||||
"whereUsed": "Hvor brugt",
|
||||
"whitelist": "Hvidliste",
|
||||
"blacklist": "Sortliste",
|
||||
"resolve": "Løs",
|
||||
"force": "Kraft",
|
||||
"base64url": "Base64 URL",
|
||||
"hex": "Hex",
|
||||
"range": "Rækkevidde",
|
||||
"component": "Komponent",
|
||||
"redirect_uri": "Omdiriger URI",
|
||||
"idempotency-key": "Idempotens nøgle",
|
||||
"error_description": "Fejlbeskrivelse",
|
||||
"code": "Kode",
|
||||
"compatible": "Kompatibel",
|
||||
"chat-completions": "Chatafslutninger",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Auth Token",
|
||||
"crypto": "Krypto",
|
||||
"hours": "Timer",
|
||||
"selfsigned": "Selvsigneret",
|
||||
"proxy_id": "Proxy ID",
|
||||
"proxyId": "Proxy ID",
|
||||
"connectionId": "Forbindelses-id",
|
||||
"resolveConnectionId": "Løs forbindelses-id",
|
||||
"resolve_connection_id": "Løs forbindelses-id",
|
||||
"scope_id": "Omfang ID",
|
||||
"scopeId": "Omfang ID",
|
||||
"jwtSecret": "JWT-hemmelighed",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "bedre-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "Bygherre-id",
|
||||
"musicDesc": "Musikbeskrivelse",
|
||||
"musicGeneration": "Musik Generation",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Cloud-status ændret",
|
||||
"where_used": "Hvor brugt",
|
||||
"windowMs": "Vindue (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Værktøjstilladelsesliste",
|
||||
"TOOL_DENYLIST": "Værktøj Denylist",
|
||||
"Failed to save pricing": "Kunne ikke gemme prisen",
|
||||
"Failed to reset pricing": "Failed to reset pricing",
|
||||
"apikey": "API nøgle",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Hjem",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} req",
|
||||
"providerModelsTitle": "{provider} - Modeller",
|
||||
"copiedModel": "Kopieret: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Opdater nu",
|
||||
"updating": "Opdaterer...",
|
||||
"updateAvailableDesc": "En ny version er tilgængelig. Klik for at opdatere.",
|
||||
"updateStarted": "Opdatering startet..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analytics",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Tilføj Model Config",
|
||||
"desc": "Tilføj følgende konfiguration til dit modelarray:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Continue bruger JSON-konfigurationsfil."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode kræver API-nøglekonfiguration.",
|
||||
"1": "Indstil basis-URL'en til dit OmniRoute-slutpunkt."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro kræver en Amazon-konto."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Auto-synkronisering",
|
||||
"autoSyncTooltip": "Opdater modellisten automatisk hver 24. time (kan konfigureres via MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Automatisk synkronisering aktiveret - modellerne opdateres med jævne mellemrum",
|
||||
"autoSyncDisabled": "Automatisk synkronisering deaktiveret",
|
||||
"autoSyncToggleFailed": "Automatisk synkronisering kunne ikke slås til eller fra",
|
||||
"clearAllModels": "Ryd alle modeller",
|
||||
"clearAllModelsConfirm": "Er du sikker på, at du vil fjerne alle modeller for denne udbyder? Dette kan ikke fortrydes.",
|
||||
"clearAllModelsSuccess": "Alle modeller ryddet",
|
||||
"clearAllModelsFailed": "Det lykkedes ikke at rydde modeller"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Indstillinger",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Genstart serveren - den vil bruge den nye adgangskode",
|
||||
"backToLogin": "Tilbage til Login",
|
||||
"forgotPassword": "Glemt adgangskode?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Autorisation",
|
||||
"Content-Disposition": "Indhold-Disposition",
|
||||
"waitingForAuthorization": "Venter på godkendelse...",
|
||||
"waitingForGoogleAuthorization": "Venter på Google-godkendelse...",
|
||||
"waitingForOpenAIAuthorization": "Venter på OpenAI-godkendelse...",
|
||||
"waitingForAntigravityAuthorization": "Venter på antigravity-autorisation...",
|
||||
"waitingForIFlowAuthorization": "Venter på iFlow-godkendelse...",
|
||||
"exchangingCodeForTokens": "Udveksler kode til tokens..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Tekst-til-tale generation (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Generering af tekstindlejring (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Privatlivspolitik",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Simpel chat",
|
||||
"streaming": "Streaming",
|
||||
"system-prompt": "Systemprompt",
|
||||
"thinking": "Tænker",
|
||||
"tool-calling": "Værktøjsopkald",
|
||||
"multi-turn": "Multivending"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Grundlæggende chatskabelon med systembesked",
|
||||
"streaming": "Skabelon til streaming svar",
|
||||
"system-prompt": "Skabelon med brugerdefineret systemprompt",
|
||||
"thinking": "Skabelon med ræsonnement/tænkebudget",
|
||||
"tool-calling": "Skabelon til værktøj/funktionskald",
|
||||
"multi-turn": "Skabelon til samtaler med flere sving"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Du er en hjælpsom AI-assistent.",
|
||||
"userGreeting": "Hej! Hvordan kan jeg hjælpe dig i dag?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Skriv en historie om"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Hvad er meningen med livet?",
|
||||
"systemInstruction": "Giv et tankevækkende, filosofisk svar."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Forklar kvanteberegning"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Navnet på byen for at få vejr til",
|
||||
"toolDescription": "Få det aktuelle vejr for en placering",
|
||||
"userWeather": "Hvordan er vejret i Tokyo?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Du er en hjælpsom assistent.",
|
||||
"assistantExample": "Det hjælper jeg dig gerne med.",
|
||||
"userInitial": "Jeg har brug for hjælp til",
|
||||
"userFollowUp": "Kan du uddybe det?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2411,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Warte auf OpenAI-Autorisierung...",
|
||||
"waitingForAntigravityAuthorization": "Warte auf Antigravity-Autorisierung...",
|
||||
"waitingForIFlowAuthorization": "Warte auf iFlow-Autorisierung...",
|
||||
"exchangingCodeForTokens": "Tausche Code gegen Token aus..."
|
||||
"exchangingCodeForTokens": "Tausche Code gegen Token aus...",
|
||||
"Authorization": "Autorisierung",
|
||||
"Content-Disposition": "Inhaltliche Disposition"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2814,5 +2816,32 @@
|
||||
"thinking": "Vorlage mit Denk-/Argumentationsbudget",
|
||||
"tool-calling": "Vorlage für Werkzeug-/Funktionsaufrufe",
|
||||
"multi-turn": "Vorlage für mehrstufige Konversationen"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Sie sind ein hilfreicher KI-Assistent.",
|
||||
"userGreeting": "Hallo! Wie kann ich Ihnen heute helfen?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Schreiben Sie eine Geschichte darüber"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Was ist der Sinn des Lebens?",
|
||||
"systemInstruction": "Geben Sie eine nachdenkliche, philosophische Antwort."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Erklären Sie Quantencomputing"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Der Name der Stadt, für die das Wetter ermittelt werden soll",
|
||||
"toolDescription": "Erhalten Sie das aktuelle Wetter für einen Standort",
|
||||
"userWeather": "Wie ist das Wetter in Tokio?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Sie sind ein hilfreicher Assistent.",
|
||||
"assistantExample": "Gerne helfe ich Ihnen dabei.",
|
||||
"userInitial": "Ich brauche Hilfe dabei",
|
||||
"userFollowUp": "Können Sie das näher erläutern?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "google",
|
||||
"TOOL_ALLOWLIST": "Lista de herramientas permitidas",
|
||||
"TOOL_DENYLIST": "Lista de denegaciones de herramientas",
|
||||
"Failed to save pricing": "No se pudo guardar el precio",
|
||||
"Failed to reset pricing": "No se pudo restablecer el precio",
|
||||
"apikey": "Clave API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Inicio",
|
||||
@@ -2403,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "Autorización",
|
||||
"Content-Disposition": "Disposición de contenido"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRuta",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Eres un útil asistente de IA.",
|
||||
"userGreeting": "¡Hola! ¿Cómo puedo ayudarte hoy?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Escribe una historia sobre"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "¿Cuál es el significado de la vida?",
|
||||
"systemInstruction": "Proporcione una respuesta reflexiva y filosófica."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Explicar la computación cuántica"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "El nombre de la ciudad para obtener el clima.",
|
||||
"toolDescription": "Obtener el clima actual para una ubicación",
|
||||
"userWeather": "¿Cuál es el clima en Tokio?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Eres un asistente útil.",
|
||||
"assistantExample": "Estaré encantado de ayudarte con eso.",
|
||||
"userInitial": "necesito ayuda con",
|
||||
"userFollowUp": "¿Puedes dar más detalles sobre eso?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Ilmainen",
|
||||
"skipToContent": "Siirry sisältöön",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Hyväksy",
|
||||
"accountId": "Tilin tunnus",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "API-avaimen tunnus",
|
||||
"apiKeyName": "API-avaimen nimi",
|
||||
"apiKeySecret": "API-avaimen salaisuus",
|
||||
"authorization": "Valtuutus",
|
||||
"content-type": "Sisältötyyppi",
|
||||
"content-length": "Sisällön pituus",
|
||||
"cookie": "Eväste",
|
||||
"file": "Tiedosto",
|
||||
"host": "Isäntä",
|
||||
"id": "ID",
|
||||
"import": "Tuo",
|
||||
"limit": "Raja",
|
||||
"offset": "Offset",
|
||||
"open": "Avaa",
|
||||
"origin": "Alkuperä",
|
||||
"promptTokens": "Kehotusmerkit",
|
||||
"completionTokens": "Päättymismerkit",
|
||||
"totalTokens": "Tokeneja yhteensä",
|
||||
"rawModel": "Raaka malli",
|
||||
"scope": "Laajuus",
|
||||
"skill": "Taito",
|
||||
"sortBy": "Lajitteluperuste",
|
||||
"sortOrder": "Lajittelujärjestys",
|
||||
"tab": "Tab",
|
||||
"text": "Teksti",
|
||||
"textarea": "Textarea",
|
||||
"tool": "Työkalu",
|
||||
"toolId": "Työkalun tunnus",
|
||||
"web": "Web",
|
||||
"whereUsed": "Missä käytetty",
|
||||
"whitelist": "Valkoinen lista",
|
||||
"blacklist": "Musta lista",
|
||||
"resolve": "Ratkaise",
|
||||
"force": "Voimaa",
|
||||
"base64url": "Base64 URL",
|
||||
"hex": "Hex",
|
||||
"range": "Alue",
|
||||
"component": "Komponentti",
|
||||
"redirect_uri": "Uudelleenohjaus URI",
|
||||
"idempotency-key": "Idempotenssiavain",
|
||||
"error_description": "Virheen kuvaus",
|
||||
"code": "Koodi",
|
||||
"compatible": "Yhteensopiva",
|
||||
"chat-completions": "Chatin loppuun saattaminen",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Auth Token",
|
||||
"crypto": "Krypto",
|
||||
"hours": "Tuntia",
|
||||
"selfsigned": "Itse allekirjoitettu",
|
||||
"proxy_id": "Välityspalvelimen tunnus",
|
||||
"proxyId": "Välityspalvelimen tunnus",
|
||||
"connectionId": "Yhteystunnus",
|
||||
"resolveConnectionId": "Ratkaise yhteystunnus",
|
||||
"resolve_connection_id": "Ratkaise yhteystunnus",
|
||||
"scope_id": "Laajuustunnus",
|
||||
"scopeId": "Laajuustunnus",
|
||||
"jwtSecret": "JWT Secret",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "parempi-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "Rakentajan tunnus",
|
||||
"musicDesc": "Musiikki Kuvaus",
|
||||
"musicGeneration": "Musiikin sukupolvi",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Pilven tila muuttunut",
|
||||
"where_used": "Missä käytetty",
|
||||
"windowMs": "Ikkuna (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Työkalujen sallittu luettelo",
|
||||
"TOOL_DENYLIST": "Tool Denylist",
|
||||
"Failed to save pricing": "Hinnoittelun tallentaminen epäonnistui",
|
||||
"Failed to reset pricing": "Hinnoittelun nollaaminen epäonnistui",
|
||||
"apikey": "API-avain",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Kotiin",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} vaatimus",
|
||||
"providerModelsTitle": "{provider} - Mallit",
|
||||
"copiedModel": "Kopioitu: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Päivitä nyt",
|
||||
"updating": "Päivitetään...",
|
||||
"updateAvailableDesc": "Uusi versio on saatavilla. Päivitä napsauttamalla.",
|
||||
"updateStarted": "Päivitys aloitettu..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analytics",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Lisää mallin kokoonpano",
|
||||
"desc": "Lisää seuraavat kokoonpanot mallien matriisiisi:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Jatka käyttää JSON-määritystiedostoa."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode vaatii API-avaimen määrityksen.",
|
||||
"1": "Aseta perus-URL-osoite OmniRoute-päätepisteellesi."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro vaatii Amazon-tilin."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Automaattinen synkronointi",
|
||||
"autoSyncTooltip": "Päivitä malliluettelo automaattisesti 24 tunnin välein (konfiguroitavissa kohdassa MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Automaattinen synkronointi käytössä – mallit päivittyvät säännöllisesti",
|
||||
"autoSyncDisabled": "Automaattinen synkronointi poistettu käytöstä",
|
||||
"autoSyncToggleFailed": "Automaattisen synkronoinnin vaihtaminen epäonnistui",
|
||||
"clearAllModels": "Tyhjennä kaikki mallit",
|
||||
"clearAllModelsConfirm": "Haluatko varmasti poistaa kaikki tämän palveluntarjoajan mallit? Tätä ei voi kumota.",
|
||||
"clearAllModelsSuccess": "Kaikki mallit tyhjennetty",
|
||||
"clearAllModelsFailed": "Mallien tyhjennys epäonnistui"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Asetukset",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Käynnistä palvelin uudelleen - se käyttää uutta salasanaa",
|
||||
"backToLogin": "Takaisin kirjautumiseen",
|
||||
"forgotPassword": "Unohditko salasanan?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Valtuutus",
|
||||
"Content-Disposition": "Sisältö-sijoittelu",
|
||||
"waitingForAuthorization": "Odotetaan valtuutusta...",
|
||||
"waitingForGoogleAuthorization": "Odotetaan Googlen valtuutusta...",
|
||||
"waitingForOpenAIAuthorization": "Odotetaan OpenAI-valtuutusta...",
|
||||
"waitingForAntigravityAuthorization": "Odotetaan antigravitaatiovaltuutusta...",
|
||||
"waitingForIFlowAuthorization": "Odotetaan iFlow-valtuutusta...",
|
||||
"exchangingCodeForTokens": "Vaihdetaan koodia tokeneihin..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Tekstistä puheeksi luominen (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Tekstin upottaminen (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Tietosuojakäytäntö",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Yksinkertainen chat",
|
||||
"streaming": "Suoratoisto",
|
||||
"system-prompt": "Järjestelmäkehote",
|
||||
"thinking": "Ajatteleminen",
|
||||
"tool-calling": "Työkalun kutsuminen",
|
||||
"multi-turn": "Monikierros"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Peruskeskustelumalli järjestelmäviestillä",
|
||||
"streaming": "Malli vastausten suoratoistoon",
|
||||
"system-prompt": "Malli mukautetulla järjestelmäkehotteella",
|
||||
"thinking": "Malli perustelulla/ajattelulla",
|
||||
"tool-calling": "Malli työkalun/toiminnon kutsumiseen",
|
||||
"multi-turn": "Malli usean käännöksen keskusteluille"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Olet avulias AI-avustaja.",
|
||||
"userGreeting": "Hei! Kuinka voin auttaa sinua tänään?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Kirjoita tarina aiheesta"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Mikä on elämän tarkoitus?",
|
||||
"systemInstruction": "Anna harkittu, filosofinen vastaus."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Selitä kvanttilaskenta"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Kaupungin nimi, jolle sää haetaan",
|
||||
"toolDescription": "Hanki sijainnin nykyinen sää",
|
||||
"userWeather": "Millainen sää on Tokiossa?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Olet avulias avustaja.",
|
||||
"assistantExample": "Autan sinua siinä mielelläni.",
|
||||
"userInitial": "Tarvitsen apua",
|
||||
"userFollowUp": "Voitko tarkentaa sitä?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Liste autorisée des outils",
|
||||
"TOOL_DENYLIST": "Liste de refus d'outils",
|
||||
"Failed to save pricing": "Échec de l'enregistrement des prix",
|
||||
"Failed to reset pricing": "Échec de la réinitialisation des prix",
|
||||
"apikey": "Clé API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Accueil",
|
||||
@@ -2403,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "Autorisation",
|
||||
"Content-Disposition": "Disposition du contenu"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Vous êtes un assistant IA utile.",
|
||||
"userGreeting": "Bonjour ! Comment puis-je vous aider aujourd'hui ?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Écrire une histoire sur"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Quel est le sens de la vie ?",
|
||||
"systemInstruction": "Fournissez une réponse réfléchie et philosophique."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Expliquer l'informatique quantique"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Le nom de la ville pour laquelle obtenir la météo",
|
||||
"toolDescription": "Obtenir la météo actuelle pour un emplacement",
|
||||
"userWeather": "Quel temps fait-il à Tokyo ?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Vous êtes un assistant utile.",
|
||||
"assistantExample": "Je serais heureux de vous aider avec cela.",
|
||||
"userInitial": "J'ai besoin d'aide pour",
|
||||
"userFollowUp": "Pouvez-vous développer cela ?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "חינם",
|
||||
"skipToContent": "דלג לתוכן",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "קבל",
|
||||
"accountId": "מזהה חשבון",
|
||||
"alias": "כינוי",
|
||||
"apiKeyId": "מזהה מפתח API",
|
||||
"apiKeyName": "שם מפתח API",
|
||||
"apiKeySecret": "סוד מפתח API",
|
||||
"authorization": "הרשאה",
|
||||
"content-type": "סוג תוכן",
|
||||
"content-length": "אורך תוכן",
|
||||
"cookie": "קוקי",
|
||||
"file": "קובץ",
|
||||
"host": "מארח",
|
||||
"id": "תעודה מזהה",
|
||||
"import": "ייבוא",
|
||||
"limit": "הגבלה",
|
||||
"offset": "קיזוז",
|
||||
"open": "פתוח",
|
||||
"origin": "מוצא",
|
||||
"promptTokens": "אסימוני הנחיה",
|
||||
"completionTokens": "אסימוני השלמה",
|
||||
"totalTokens": "סך הכל אסימונים",
|
||||
"rawModel": "דגם גלם",
|
||||
"scope": "היקף",
|
||||
"skill": "מיומנות",
|
||||
"sortBy": "מיין לפי",
|
||||
"sortOrder": "סדר מיון",
|
||||
"tab": "כרטיסייה",
|
||||
"text": "טקסט",
|
||||
"textarea": "Textarea",
|
||||
"tool": "כלי",
|
||||
"toolId": "מזהה כלי",
|
||||
"web": "אינטרנט",
|
||||
"whereUsed": "היכן בשימוש",
|
||||
"whitelist": "רשימת הלבנים",
|
||||
"blacklist": "רשימה שחורה",
|
||||
"resolve": "פתרון",
|
||||
"force": "כוח",
|
||||
"base64url": "כתובת אתר של Base64",
|
||||
"hex": "משושה",
|
||||
"range": "טווח",
|
||||
"component": "רכיב",
|
||||
"redirect_uri": "כתובת URL להפניה מחדש",
|
||||
"idempotency-key": "מפתח אידמפוטנציה",
|
||||
"error_description": "תיאור שגיאה",
|
||||
"code": "קוד",
|
||||
"compatible": "תואם",
|
||||
"chat-completions": "השלמת צ'אט",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Auth Token",
|
||||
"crypto": "קריפטו",
|
||||
"hours": "שעות",
|
||||
"selfsigned": "חתום בעצמו",
|
||||
"proxy_id": "מזהה פרוקסי",
|
||||
"proxyId": "מזהה פרוקסי",
|
||||
"connectionId": "מזהה חיבור",
|
||||
"resolveConnectionId": "פתרון מזהה חיבור",
|
||||
"resolve_connection_id": "פתרון מזהה חיבור",
|
||||
"scope_id": "מזהה היקף",
|
||||
"scopeId": "מזהה היקף",
|
||||
"jwtSecret": "סוד JWT",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "better-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "מזהה בונה",
|
||||
"musicDesc": "תיאור מוזיקה",
|
||||
"musicGeneration": "דור המוזיקה",
|
||||
"idc": "הבינתחומי",
|
||||
"cloud-status-changed": "סטטוס הענן השתנה",
|
||||
"where_used": "היכן בשימוש",
|
||||
"windowMs": "חלון (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "גוגל",
|
||||
"TOOL_ALLOWLIST": "רשימת ההיתרים של הכלים",
|
||||
"TOOL_DENYLIST": "רשימת הכלים",
|
||||
"Failed to save pricing": "חיסכון במחיר נכשל",
|
||||
"Failed to reset pricing": "איפוס התמחור נכשל",
|
||||
"apikey": "מפתח API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "בית",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} בקשות",
|
||||
"providerModelsTitle": "{provider} - דגמים",
|
||||
"copiedModel": "הועתק: {model}",
|
||||
"aliasLabel": "כינוי"
|
||||
"aliasLabel": "כינוי",
|
||||
"updateNow": "עדכן עכשיו",
|
||||
"updating": "מעדכן...",
|
||||
"updateAvailableDesc": "גרסה חדשה זמינה. לחץ לעדכון.",
|
||||
"updateStarted": "העדכון התחיל..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "אנליטיקס",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "הוסף דגם Config",
|
||||
"desc": "הוסף את התצורה הבאה למערך הדגמים שלך:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "המשך משתמש בקובץ התצורה של JSON."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode דורש תצורת מפתח API.",
|
||||
"1": "הגדר את כתובת האתר הבסיסית לנקודת הקצה של OmniRoute שלך."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro דורש חשבון אמזון."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "סנכרון אוטומטי",
|
||||
"autoSyncTooltip": "רענן אוטומטית את רשימת הדגמים כל 24 שעות (ניתן להגדרה באמצעות MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "סנכרון אוטומטי מופעל - הדגמים יתרעננו מעת לעת",
|
||||
"autoSyncDisabled": "הסנכרון האוטומטי מושבת",
|
||||
"autoSyncToggleFailed": "החלפת הסנכרון האוטומטי נכשלה",
|
||||
"clearAllModels": "נקה את כל הדגמים",
|
||||
"clearAllModelsConfirm": "האם אתה בטוח שברצונך להסיר את כל הדגמים עבור ספק זה? לא ניתן לבטל זאת.",
|
||||
"clearAllModelsSuccess": "כל הדגמים נוקו",
|
||||
"clearAllModelsFailed": "ניקוי הדגמים נכשל"
|
||||
},
|
||||
"settings": {
|
||||
"title": "הגדרות",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "הפעל מחדש את השרת - הוא ישתמש בסיסמה החדשה",
|
||||
"backToLogin": "חזרה לכניסה",
|
||||
"forgotPassword": "שכחת סיסמה?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "הרשאה",
|
||||
"Content-Disposition": "תוכן-נטייה",
|
||||
"waitingForAuthorization": "ממתין לאישור...",
|
||||
"waitingForGoogleAuthorization": "ממתין לאישור Google...",
|
||||
"waitingForOpenAIAuthorization": "ממתין להרשאת OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "ממתין לאישור נגד כבידה...",
|
||||
"waitingForIFlowAuthorization": "ממתין להרשאת iFlow...",
|
||||
"exchangingCodeForTokens": "מחליף קוד לאסימונים..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "יצירת טקסט לדיבור (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "יצירת הטבעת טקסט (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "מדיניות פרטיות",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "צ'אט פשוט",
|
||||
"streaming": "סטרימינג",
|
||||
"system-prompt": "הנחית מערכת",
|
||||
"thinking": "חושבים",
|
||||
"tool-calling": "כלי שיחות",
|
||||
"multi-turn": "רב סיבובים"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "תבנית צ'אט בסיסית עם הודעת מערכת",
|
||||
"streaming": "תבנית להזרמת תגובות",
|
||||
"system-prompt": "תבנית עם הודעת מערכת מותאמת אישית",
|
||||
"thinking": "תבנית עם היגיון/תקציב חשיבה",
|
||||
"tool-calling": "תבנית לקריאת כלי/פונקציה",
|
||||
"multi-turn": "תבנית לשיחות מרובי פניות"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "אתה עוזר AI מועיל.",
|
||||
"userGreeting": "שלום! איך אני יכול לעזור לך היום?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "כתבו סיפור על"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "מהי משמעות החיים?",
|
||||
"systemInstruction": "ספק תשובה מהורהרת, פילוסופית."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "הסבר מחשוב קוונטי"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "שם העיר שאפשר לקבל עליה מזג אוויר",
|
||||
"toolDescription": "קבל מזג אוויר עדכני עבור מיקום",
|
||||
"userWeather": "מה מזג האוויר בטוקיו?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "אתה עוזר מועיל.",
|
||||
"assistantExample": "אני אשמח לעזור לך עם זה.",
|
||||
"userInitial": "אני צריך עזרה עם",
|
||||
"userFollowUp": "אתה יכול לפרט על זה?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Ingyenes",
|
||||
"skipToContent": "Ugrás a tartalomhoz",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Elfogadás",
|
||||
"accountId": "Számlaazonosító",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "API kulcs azonosítója",
|
||||
"apiKeyName": "API kulcs neve",
|
||||
"apiKeySecret": "API kulcs titka",
|
||||
"authorization": "Engedélyezés",
|
||||
"content-type": "Tartalom típusa",
|
||||
"content-length": "Tartalom hossza",
|
||||
"cookie": "Cookie",
|
||||
"file": "Fájl",
|
||||
"host": "Házigazda",
|
||||
"id": "ID",
|
||||
"import": "Importálás",
|
||||
"limit": "Limit",
|
||||
"offset": "Offset",
|
||||
"open": "Nyissa meg",
|
||||
"origin": "Eredet",
|
||||
"promptTokens": "Prompt Tokenek",
|
||||
"completionTokens": "Befejezési tokenek",
|
||||
"totalTokens": "Összes token",
|
||||
"rawModel": "Nyers modell",
|
||||
"scope": "Hatály",
|
||||
"skill": "Ügyesség",
|
||||
"sortBy": "Rendezés alapja",
|
||||
"sortOrder": "Rendezési sorrend",
|
||||
"tab": "Tab",
|
||||
"text": "Szöveg",
|
||||
"textarea": "Textarea",
|
||||
"tool": "Eszköz",
|
||||
"toolId": "Szerszámazonosító",
|
||||
"web": "Web",
|
||||
"whereUsed": "Hol használták",
|
||||
"whitelist": "Fehérlista",
|
||||
"blacklist": "Feketelista",
|
||||
"resolve": "Oldja meg",
|
||||
"force": "Kényszer",
|
||||
"base64url": "Base64 URL",
|
||||
"hex": "Hex",
|
||||
"range": "Tartomány",
|
||||
"component": "Összetevő",
|
||||
"redirect_uri": "Átirányítási URI",
|
||||
"idempotency-key": "Idempotencia kulcs",
|
||||
"error_description": "Hiba leírása",
|
||||
"code": "kód",
|
||||
"compatible": "Kompatibilis",
|
||||
"chat-completions": "Csevegés befejezése",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Auth Token",
|
||||
"crypto": "Crypto",
|
||||
"hours": "Órák",
|
||||
"selfsigned": "Önaláírt",
|
||||
"proxy_id": "Proxy azonosítója",
|
||||
"proxyId": "Proxy azonosítója",
|
||||
"connectionId": "Csatlakozási azonosító",
|
||||
"resolveConnectionId": "A kapcsolatazonosító feloldása",
|
||||
"resolve_connection_id": "A kapcsolatazonosító feloldása",
|
||||
"scope_id": "Hatókör azonosítója",
|
||||
"scopeId": "Hatókör azonosítója",
|
||||
"jwtSecret": "JWT Secret",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "jobb-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "Építőazonosító",
|
||||
"musicDesc": "Zene Leírás",
|
||||
"musicGeneration": "Zenegeneráció",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "A felhő állapota megváltozott",
|
||||
"where_used": "Hol használták",
|
||||
"windowMs": "Ablak (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Eszköz engedélyezési lista",
|
||||
"TOOL_DENYLIST": "Tool Denylist",
|
||||
"Failed to save pricing": "Nem sikerült menteni az árakat",
|
||||
"Failed to reset pricing": "Nem sikerült visszaállítani az árakat",
|
||||
"apikey": "API kulcs",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Otthon",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} igény",
|
||||
"providerModelsTitle": "{provider} - Modellek",
|
||||
"copiedModel": "Másolva: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Frissítés most",
|
||||
"updating": "Frissítés...",
|
||||
"updateAvailableDesc": "Új verzió érhető el. Kattintson a frissítéshez.",
|
||||
"updateStarted": "Frissítés elindult..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analytics",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Add Model Config",
|
||||
"desc": "Adja hozzá a következő konfigurációt a modellek tömbjéhez:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "A folytatás a JSON konfigurációs fájl használatával."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Az OpenCode API-kulcs-konfigurációt igényel.",
|
||||
"1": "Állítsa be az alap URL-t az OmniRoute végpontra."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "A Kiro Amazon-fiókot igényel."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Automatikus szinkronizálás",
|
||||
"autoSyncTooltip": "A modelllista automatikus frissítése 24 óránként (konfigurálható: MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Automatikus szinkronizálás engedélyezve – a modellek rendszeresen frissülnek",
|
||||
"autoSyncDisabled": "Az automatikus szinkronizálás letiltva",
|
||||
"autoSyncToggleFailed": "Failed to toggle auto-sync",
|
||||
"clearAllModels": "Minden modell törlése",
|
||||
"clearAllModelsConfirm": "Biztosan eltávolítja ennek a szolgáltatónak az összes modelljét? Ezt nem lehet visszavonni.",
|
||||
"clearAllModelsSuccess": "Minden modell törölve",
|
||||
"clearAllModelsFailed": "Nem sikerült törölni a modelleket"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Beállítások elemre",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Indítsa újra a szervert - az új jelszót fogja használni",
|
||||
"backToLogin": "Vissza a Bejelentkezéshez",
|
||||
"forgotPassword": "Elfelejtetted a jelszavad?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Engedélyezés",
|
||||
"Content-Disposition": "Tartalom-Diszpozíció",
|
||||
"waitingForAuthorization": "Várakozás az engedélyezésre...",
|
||||
"waitingForGoogleAuthorization": "Várakozás a Google engedélyére...",
|
||||
"waitingForOpenAIAuthorization": "Várakozás az OpenAI engedélyezésére...",
|
||||
"waitingForAntigravityAuthorization": "Várakozás az Antigravitációs engedélyezésre...",
|
||||
"waitingForIFlowAuthorization": "Várakozás az iFlow engedélyezésére...",
|
||||
"exchangingCodeForTokens": "Kód cseréje tokenre..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Szövegfelolvasó generálás (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Szövegbeágyazás generálása (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Adatvédelmi szabályzat",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Egyszerű csevegés",
|
||||
"streaming": "Streaming",
|
||||
"system-prompt": "Rendszer prompt",
|
||||
"thinking": "Gondolkodás",
|
||||
"tool-calling": "Szerszámhívás",
|
||||
"multi-turn": "Többfordulós"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Alapvető chat-sablon rendszerüzenettel",
|
||||
"streaming": "Sablon a válaszok streameléséhez",
|
||||
"system-prompt": "Sablon egyéni rendszerkéréssel",
|
||||
"thinking": "Sablon érveléssel/gondolkodó költségvetéssel",
|
||||
"tool-calling": "Sablon az eszköz/funkció hívásához",
|
||||
"multi-turn": "Sablon többfordulós beszélgetésekhez"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Segítőkész AI-asszisztens vagy.",
|
||||
"userGreeting": "Sziasztok! Hogyan segíthetek ma?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Írj egy történetet róla"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Mi az élet értelme?",
|
||||
"systemInstruction": "Adjon megfontolt, filozófiai választ."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Magyarázza el a kvantumszámítást!"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "A város neve, amelyhez időjárást kell kérni",
|
||||
"toolDescription": "Az adott hely aktuális időjárásának megtekintése",
|
||||
"userWeather": "Milyen az idő Tokióban?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Segítőkész asszisztens vagy.",
|
||||
"assistantExample": "Szívesen segítek ebben.",
|
||||
"userInitial": "Segítségre van szükségem",
|
||||
"userFollowUp": "Kifejtenéd ezt bővebben?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Daftar Alat yang Diizinkan",
|
||||
"TOOL_DENYLIST": "Daftar Penolakan Alat",
|
||||
"Failed to save pricing": "Gagal menyimpan harga",
|
||||
"Failed to reset pricing": "Gagal menyetel ulang harga",
|
||||
"apikey": "Kunci API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Rumah",
|
||||
@@ -2403,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "Otorisasi",
|
||||
"Content-Disposition": "Disposisi Konten"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Anda adalah asisten AI yang membantu.",
|
||||
"userGreeting": "Halo! Apa yang bisa saya bantu hari ini?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Tulis cerita tentang"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Apa arti hidup?",
|
||||
"systemInstruction": "Berikan jawaban yang bijaksana dan filosofis."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Jelaskan komputasi kuantum"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Nama kota untuk mengetahui cuaca",
|
||||
"toolDescription": "Dapatkan cuaca terkini untuk suatu lokasi",
|
||||
"userWeather": "Bagaimana cuaca di Tokyo?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Anda adalah asisten yang membantu.",
|
||||
"assistantExample": "Saya akan dengan senang hati membantu Anda dalam hal itu.",
|
||||
"userInitial": "Saya butuh bantuan",
|
||||
"userFollowUp": "Bisakah Anda menjelaskannya lebih lanjut?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Lista consentita degli strumenti",
|
||||
"TOOL_DENYLIST": "Elenco negati dello strumento",
|
||||
"Failed to save pricing": "Impossibile salvare i prezzi",
|
||||
"Failed to reset pricing": "Impossibile reimpostare i prezzi",
|
||||
"apikey": "Chiave API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Casa",
|
||||
@@ -2403,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "Autorizzazione",
|
||||
"Content-Disposition": "Disposizione del contenuto"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Sei un utile assistente AI.",
|
||||
"userGreeting": "Ciao! Come posso aiutarti oggi?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Scrivi una storia su"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Qual è il significato della vita?",
|
||||
"systemInstruction": "Fornisci una risposta ponderata e filosofica."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Spiegare l'informatica quantistica"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Il nome della città per la quale ottenere il meteo",
|
||||
"toolDescription": "Ottieni il meteo attuale per una località",
|
||||
"userWeather": "Che tempo fa a Tokio?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Sei un assistente utile.",
|
||||
"assistantExample": "Sarei felice di aiutarti in questo.",
|
||||
"userInitial": "Ho bisogno di aiuto con",
|
||||
"userFollowUp": "Puoi approfondire questo argomento?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "ツールの許可リスト",
|
||||
"TOOL_DENYLIST": "ツール拒否リスト",
|
||||
"Failed to save pricing": "価格設定を保存できませんでした",
|
||||
"Failed to reset pricing": "価格設定のリセットに失敗しました",
|
||||
"apikey": "APIキー",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "ホーム",
|
||||
@@ -2403,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "認可",
|
||||
"Content-Disposition": "コンテンツの配置"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "オムニルート",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "あなたは役に立つ AI アシスタントです。",
|
||||
"userGreeting": "こんにちは!今日はどのようにお手伝いできますか?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "~についての話を書いてください"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "人生の意味とは何でしょうか?",
|
||||
"systemInstruction": "思慮深く哲学的な答えを提供してください。"
|
||||
},
|
||||
"thinking": {
|
||||
"question": "量子コンピューティングについて説明する"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "天気を取得する都市の名前",
|
||||
"toolDescription": "場所の現在の天気を取得する",
|
||||
"userWeather": "東京の天気はどうですか?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "あなたは役に立つアシスタントです。",
|
||||
"assistantExample": "喜んでお手伝いさせていただきます。",
|
||||
"userInitial": "助けが必要です",
|
||||
"userFollowUp": "それについて詳しく教えてもらえますか?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "구글",
|
||||
"TOOL_ALLOWLIST": "도구 허용 목록",
|
||||
"TOOL_DENYLIST": "도구 거부 목록",
|
||||
"Failed to save pricing": "가격을 저장하지 못했습니다.",
|
||||
"Failed to reset pricing": "가격을 재설정하지 못했습니다.",
|
||||
"apikey": "API 키",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "홈",
|
||||
@@ -2403,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "승인",
|
||||
"Content-Disposition": "컨텐츠 처리"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "옴니루트",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "당신은 유용한 AI 비서입니다.",
|
||||
"userGreeting": "안녕하세요! 오늘은 무엇을 도와드릴까요?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "에 관한 이야기를 써 보세요."
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "삶의 의미는 무엇입니까?",
|
||||
"systemInstruction": "사려 깊고 철학적인 답변을 제공하세요."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "양자 컴퓨팅 설명"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "날씨를 확인할 도시의 이름",
|
||||
"toolDescription": "특정 위치의 현재 날씨 확인",
|
||||
"userWeather": "도쿄 날씨는 어떻습니까?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "당신은 도움이 되는 조수입니다.",
|
||||
"assistantExample": "기꺼이 도와드리겠습니다.",
|
||||
"userInitial": "도움이 필요해요",
|
||||
"userFollowUp": "그것에 대해 자세히 설명해주실 수 있나요?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Percuma",
|
||||
"skipToContent": "Langkau ke kandungan",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Terima",
|
||||
"accountId": "ID Akaun",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "ID Kunci API",
|
||||
"apiKeyName": "Nama Kunci API",
|
||||
"apiKeySecret": "Rahsia Kunci API",
|
||||
"authorization": "Keizinan",
|
||||
"content-type": "Jenis Kandungan",
|
||||
"content-length": "Panjang Kandungan",
|
||||
"cookie": "Kuki",
|
||||
"file": "Fail",
|
||||
"host": "hos",
|
||||
"id": "ID",
|
||||
"import": "Import",
|
||||
"limit": "had",
|
||||
"offset": "Offset",
|
||||
"open": "Buka",
|
||||
"origin": "asal usul",
|
||||
"promptTokens": "Token Gesaan",
|
||||
"completionTokens": "Token Penyiapan",
|
||||
"totalTokens": "Jumlah Token",
|
||||
"rawModel": "Model Mentah",
|
||||
"scope": "Skop",
|
||||
"skill": "Kemahiran",
|
||||
"sortBy": "Isih Mengikut",
|
||||
"sortOrder": "Susun Susunan",
|
||||
"tab": "Tab",
|
||||
"text": "Teks",
|
||||
"textarea": "Textarea",
|
||||
"tool": "alat",
|
||||
"toolId": "ID alat",
|
||||
"web": "Web",
|
||||
"whereUsed": "Di mana Digunakan",
|
||||
"whitelist": "Senarai putih",
|
||||
"blacklist": "Senarai hitam",
|
||||
"resolve": "Selesaikan",
|
||||
"force": "Paksa",
|
||||
"base64url": "URL Base64",
|
||||
"hex": "Hex",
|
||||
"range": "Julat",
|
||||
"component": "Komponen",
|
||||
"redirect_uri": "Ubah hala URI",
|
||||
"idempotency-key": "Kunci Idepotency",
|
||||
"error_description": "Penerangan Ralat",
|
||||
"code": "Kod",
|
||||
"compatible": "serasi",
|
||||
"chat-completions": "Selesai Sembang",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Token Pengesahan",
|
||||
"crypto": "Kripto",
|
||||
"hours": "jam",
|
||||
"selfsigned": "Ditandatangani sendiri",
|
||||
"proxy_id": "ID proksi",
|
||||
"proxyId": "ID proksi",
|
||||
"connectionId": "ID Sambungan",
|
||||
"resolveConnectionId": "Selesaikan ID Sambungan",
|
||||
"resolve_connection_id": "Selesaikan ID Sambungan",
|
||||
"scope_id": "ID Skop",
|
||||
"scopeId": "ID Skop",
|
||||
"jwtSecret": "Rahsia JWT",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "lebih baik-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "ID Pembina",
|
||||
"musicDesc": "Penerangan Muzik",
|
||||
"musicGeneration": "Penjanaan Muzik",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Status awan berubah",
|
||||
"where_used": "Di mana Digunakan",
|
||||
"windowMs": "Tetingkap (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Senarai Benarkan Alat",
|
||||
"TOOL_DENYLIST": "Senarai Penafian Alat",
|
||||
"Failed to save pricing": "Gagal menyimpan harga",
|
||||
"Failed to reset pricing": "Gagal menetapkan semula harga",
|
||||
"apikey": "Kunci API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Rumah",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} permintaan",
|
||||
"providerModelsTitle": "{provider} - Model",
|
||||
"copiedModel": "Disalin: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Kemas kini Sekarang",
|
||||
"updating": "Mengemas kini...",
|
||||
"updateAvailableDesc": "Versi baharu tersedia. Klik untuk mengemas kini.",
|
||||
"updateStarted": "Kemas kini bermula..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analitis",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Tambah Konfigurasi Model",
|
||||
"desc": "Tambahkan konfigurasi berikut pada tatasusunan model anda:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Teruskan menggunakan fail konfigurasi JSON."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode memerlukan konfigurasi kunci API.",
|
||||
"1": "Tetapkan URL asas kepada titik akhir OmniRoute anda."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro memerlukan akaun Amazon."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Auto-Segerak",
|
||||
"autoSyncTooltip": "Muat semula senarai model secara automatik setiap 24j (boleh dikonfigurasikan melalui MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Autosegerak didayakan — model akan dimuat semula secara berkala",
|
||||
"autoSyncDisabled": "Autosegerak dilumpuhkan",
|
||||
"autoSyncToggleFailed": "Gagal untuk menogol autosegerak",
|
||||
"clearAllModels": "Kosongkan Semua Model",
|
||||
"clearAllModelsConfirm": "Adakah anda pasti mahu mengalih keluar semua model untuk pembekal ini? Ini tidak boleh dibuat asal.",
|
||||
"clearAllModelsSuccess": "Semua model dibersihkan",
|
||||
"clearAllModelsFailed": "Gagal mengosongkan model"
|
||||
},
|
||||
"settings": {
|
||||
"title": "tetapan",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Mulakan semula pelayan - ia akan menggunakan kata laluan baharu",
|
||||
"backToLogin": "Kembali ke Log Masuk",
|
||||
"forgotPassword": "Lupa kata laluan?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Keizinan",
|
||||
"Content-Disposition": "Kandungan-Pelupusan",
|
||||
"waitingForAuthorization": "Menunggu kebenaran...",
|
||||
"waitingForGoogleAuthorization": "Menunggu kebenaran Google...",
|
||||
"waitingForOpenAIAuthorization": "Menunggu kebenaran OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "Menunggu kebenaran Antigraviti...",
|
||||
"waitingForIFlowAuthorization": "Menunggu kebenaran iFlow...",
|
||||
"exchangingCodeForTokens": "Bertukar kod untuk token..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Penjanaan teks ke pertuturan (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Penjanaan pembenaman teks (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Dasar Privasi",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Sembang Mudah",
|
||||
"streaming": "Penstriman",
|
||||
"system-prompt": "Gesaan Sistem",
|
||||
"thinking": "Berfikir",
|
||||
"tool-calling": "Alat Panggilan",
|
||||
"multi-turn": "Pelbagai pusingan"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Templat sembang asas dengan mesej sistem",
|
||||
"streaming": "Templat untuk respons penstriman",
|
||||
"system-prompt": "Templat dengan gesaan sistem tersuai",
|
||||
"thinking": "Templat dengan bajet penaakulan/pemikiran",
|
||||
"tool-calling": "Templat untuk panggilan alat/fungsi",
|
||||
"multi-turn": "Templat untuk perbualan berbilang pusingan"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Anda seorang pembantu AI yang membantu.",
|
||||
"userGreeting": "hello! Bagaimana saya boleh membantu anda hari ini?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Tulis cerita tentang"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Apakah erti kehidupan?",
|
||||
"systemInstruction": "Berikan jawapan yang bernas dan berfalsafah."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Terangkan pengkomputeran kuantum"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Nama bandar untuk mendapatkan cuaca",
|
||||
"toolDescription": "Dapatkan cuaca semasa untuk lokasi",
|
||||
"userWeather": "Bagaimanakah cuaca di Tokyo?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Anda seorang pembantu yang membantu.",
|
||||
"assistantExample": "Saya berbesar hati untuk membantu anda dengan itu.",
|
||||
"userInitial": "Saya perlukan bantuan",
|
||||
"userFollowUp": "Bolehkah anda menghuraikan perkara itu?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Gratis",
|
||||
"skipToContent": "Ga naar de inhoud",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Accepteer",
|
||||
"accountId": "Account-ID",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "API-sleutel-ID",
|
||||
"apiKeyName": "API-sleutelnaam",
|
||||
"apiKeySecret": "API-sleutelgeheim",
|
||||
"authorization": "Autorisatie",
|
||||
"content-type": "Inhoudstype",
|
||||
"content-length": "Inhoud lengte",
|
||||
"cookie": "Koekje",
|
||||
"file": "Bestand",
|
||||
"host": "Gastheer",
|
||||
"id": "Identiteitskaart",
|
||||
"import": "Importeren",
|
||||
"limit": "Limiet",
|
||||
"offset": "Offset",
|
||||
"open": "Openen",
|
||||
"origin": "Oorsprong",
|
||||
"promptTokens": "Prompt-tokens",
|
||||
"completionTokens": "Voltooiingstokens",
|
||||
"totalTokens": "Totaal tokens",
|
||||
"rawModel": "Ruw model",
|
||||
"scope": "Reikwijdte",
|
||||
"skill": "Vaardigheid",
|
||||
"sortBy": "Sorteer op",
|
||||
"sortOrder": "Sorteervolgorde",
|
||||
"tab": "Tab",
|
||||
"text": "Tekst",
|
||||
"textarea": "Tekstgebied",
|
||||
"tool": "Gereedschap",
|
||||
"toolId": "Gereedschaps-ID",
|
||||
"web": "Web",
|
||||
"whereUsed": "Waar gebruikt",
|
||||
"whitelist": "Witte lijst",
|
||||
"blacklist": "Zwarte lijst",
|
||||
"resolve": "Oplossen",
|
||||
"force": "Kracht",
|
||||
"base64url": "Base64-URL",
|
||||
"hex": "Hex",
|
||||
"range": "Bereik",
|
||||
"component": "Onderdeel",
|
||||
"redirect_uri": "Omleidings-URI",
|
||||
"idempotency-key": "Idempotentie sleutel",
|
||||
"error_description": "Foutbeschrijving",
|
||||
"code": "Codeer",
|
||||
"compatible": "Compatibel",
|
||||
"chat-completions": "Chat-voltooiingen",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Authenticatietoken",
|
||||
"crypto": "Crypto",
|
||||
"hours": "Uur",
|
||||
"selfsigned": "Zelf ondertekend",
|
||||
"proxy_id": "Proxy-ID",
|
||||
"proxyId": "Proxy-ID",
|
||||
"connectionId": "Verbindings-ID",
|
||||
"resolveConnectionId": "Verbindings-ID oplossen",
|
||||
"resolve_connection_id": "Verbindings-ID oplossen",
|
||||
"scope_id": "Bereik-ID",
|
||||
"scopeId": "Bereik-ID",
|
||||
"jwtSecret": "JWT-geheim",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "beter-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "Bouwer-ID",
|
||||
"musicDesc": "Muziekbeschrijving",
|
||||
"musicGeneration": "Muziek generatie",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Cloudstatus gewijzigd",
|
||||
"where_used": "Waar gebruikt",
|
||||
"windowMs": "Venster (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Googlen",
|
||||
"TOOL_ALLOWLIST": "Tool Toelatingslijst",
|
||||
"TOOL_DENYLIST": "Tool-weigerlijst",
|
||||
"Failed to save pricing": "Kan de prijzen niet opslaan",
|
||||
"Failed to reset pricing": "Kan de prijzen niet opnieuw instellen",
|
||||
"apikey": "API-sleutel",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Thuis",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} vereisten",
|
||||
"providerModelsTitle": "{provider} - Modellen",
|
||||
"copiedModel": "Gekopieerd: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Nu bijwerken",
|
||||
"updating": "Updaten...",
|
||||
"updateAvailableDesc": "Er is een nieuwe versie beschikbaar. Klik om bij te werken.",
|
||||
"updateStarted": "Update gestart..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analyses",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Modelconfiguratie toevoegen",
|
||||
"desc": "Voeg de volgende configuratie toe aan uw modellenarray:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Doorgaan gebruikt het JSON-configuratiebestand."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode vereist API-sleutelconfiguratie.",
|
||||
"1": "Stel de basis-URL in op uw OmniRoute-eindpunt."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Voor Kiro is een Amazon-account vereist."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Automatische synchronisatie",
|
||||
"autoSyncTooltip": "Modellijst automatisch elke 24 uur vernieuwen (configureerbaar via MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Automatische synchronisatie ingeschakeld: modellen worden periodiek vernieuwd",
|
||||
"autoSyncDisabled": "Automatische synchronisatie uitgeschakeld",
|
||||
"autoSyncToggleFailed": "Kan automatische synchronisatie niet in- of uitschakelen",
|
||||
"clearAllModels": "Wis alle modellen",
|
||||
"clearAllModelsConfirm": "Weet u zeker dat u alle modellen voor deze aanbieder wilt verwijderen? Dit kan niet ongedaan worden gemaakt.",
|
||||
"clearAllModelsSuccess": "Alle modellen gewist",
|
||||
"clearAllModelsFailed": "Kan modellen niet wissen"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Instellingen",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Start de server opnieuw op. Deze gebruikt het nieuwe wachtwoord",
|
||||
"backToLogin": "Terug naar Inloggen",
|
||||
"forgotPassword": "Wachtwoord vergeten?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Autorisatie",
|
||||
"Content-Disposition": "Inhoud-dispositie",
|
||||
"waitingForAuthorization": "Wachten op toestemming...",
|
||||
"waitingForGoogleAuthorization": "Wachten op Google-autorisatie...",
|
||||
"waitingForOpenAIAuthorization": "Wachten op OpenAI-autorisatie...",
|
||||
"waitingForAntigravityAuthorization": "Wachten op toestemming voor anti-zwaartekracht...",
|
||||
"waitingForIFlowAuthorization": "Wachten op iFlow-autorisatie...",
|
||||
"exchangingCodeForTokens": "Code uitwisselen voor tokens..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Tekst-naar-spraakgeneratie (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Genereren van tekstinsluiting (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Privacybeleid",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Eenvoudig chatten",
|
||||
"streaming": "Streamen",
|
||||
"system-prompt": "Systeemprompt",
|
||||
"thinking": "Denken",
|
||||
"tool-calling": "Gereedschap bellen",
|
||||
"multi-turn": "Multi-turn"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Basischatsjabloon met systeembericht",
|
||||
"streaming": "Sjabloon voor het streamen van antwoorden",
|
||||
"system-prompt": "Sjabloon met aangepaste systeemprompt",
|
||||
"thinking": "Sjabloon met redeneer-/denkbudget",
|
||||
"tool-calling": "Sjabloon voor het oproepen van gereedschap/functies",
|
||||
"multi-turn": "Sjabloon voor gesprekken met meerdere beurten"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Je bent een behulpzame AI-assistent.",
|
||||
"userGreeting": "Hallo! Hoe kan ik je vandaag helpen?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Schrijf een verhaal over"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Wat is de zin van het leven?",
|
||||
"systemInstruction": "Geef een doordacht, filosofisch antwoord."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Kwantumcomputers uitleggen"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "De naam van de stad waarvoor u het weer wilt ophalen",
|
||||
"toolDescription": "Ontvang het huidige weer voor een locatie",
|
||||
"userWeather": "Hoe is het weer in Tokio?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Je bent een behulpzame assistent.",
|
||||
"assistantExample": "Ik help je daar graag mee.",
|
||||
"userInitial": "Ik heb hulp nodig bij",
|
||||
"userFollowUp": "Kunt u dat nader toelichten?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Gratis",
|
||||
"skipToContent": "Gå til innhold",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Godta",
|
||||
"accountId": "Konto-ID",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "API-nøkkel-ID",
|
||||
"apiKeyName": "API-nøkkelnavn",
|
||||
"apiKeySecret": "API-nøkkelhemmelighet",
|
||||
"authorization": "Autorisasjon",
|
||||
"content-type": "Innholdstype",
|
||||
"content-length": "Innholdslengde",
|
||||
"cookie": "Cookie",
|
||||
"file": "Fil",
|
||||
"host": "Vert",
|
||||
"id": "ID",
|
||||
"import": "Importer",
|
||||
"limit": "Begrens",
|
||||
"offset": "Offset",
|
||||
"open": "Åpne",
|
||||
"origin": "Opprinnelse",
|
||||
"promptTokens": "Spør Tokens",
|
||||
"completionTokens": "Fullføringssymboler",
|
||||
"totalTokens": "Totalt tokens",
|
||||
"rawModel": "Rå modell",
|
||||
"scope": "Omfang",
|
||||
"skill": "Ferdighet",
|
||||
"sortBy": "Sorter etter",
|
||||
"sortOrder": "Sorteringsrekkefølge",
|
||||
"tab": "Tab",
|
||||
"text": "Tekst",
|
||||
"textarea": "Tekstområde",
|
||||
"tool": "Verktøy",
|
||||
"toolId": "Verktøy-ID",
|
||||
"web": "Web",
|
||||
"whereUsed": "Hvor det brukes",
|
||||
"whitelist": "Hviteliste",
|
||||
"blacklist": "Svarteliste",
|
||||
"resolve": "Løs",
|
||||
"force": "Kraft",
|
||||
"base64url": "Base64 URL",
|
||||
"hex": "Hex",
|
||||
"range": "Rekkevidde",
|
||||
"component": "Komponent",
|
||||
"redirect_uri": "Omdiriger URI",
|
||||
"idempotency-key": "Idempotensnøkkel",
|
||||
"error_description": "Feilbeskrivelse",
|
||||
"code": "Kode",
|
||||
"compatible": "Kompatibel",
|
||||
"chat-completions": "Chatfullføringer",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Auth Token",
|
||||
"crypto": "Krypto",
|
||||
"hours": "Timer",
|
||||
"selfsigned": "Selvsignert",
|
||||
"proxy_id": "Proxy ID",
|
||||
"proxyId": "Proxy ID",
|
||||
"connectionId": "Tilkoblings-ID",
|
||||
"resolveConnectionId": "Løs tilkoblings-ID",
|
||||
"resolve_connection_id": "Løs tilkoblings-ID",
|
||||
"scope_id": "Omfang ID",
|
||||
"scopeId": "Omfang ID",
|
||||
"jwtSecret": "JWT-hemmelighet",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "bedre-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "Byggherre-ID",
|
||||
"musicDesc": "Musikkbeskrivelse",
|
||||
"musicGeneration": "Musikkgenerasjon",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Skystatus endret",
|
||||
"where_used": "Hvor det brukes",
|
||||
"windowMs": "Vindu (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Verktøytillatelsesliste",
|
||||
"TOOL_DENYLIST": "Verktøyfornektelsesliste",
|
||||
"Failed to save pricing": "Kunne ikke lagre prisen",
|
||||
"Failed to reset pricing": "Kunne ikke tilbakestille priser",
|
||||
"apikey": "API-nøkkel",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Hjem",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} req",
|
||||
"providerModelsTitle": "{provider} - Modeller",
|
||||
"copiedModel": "Kopiert: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Oppdater nå",
|
||||
"updating": "Oppdaterer...",
|
||||
"updateAvailableDesc": "En ny versjon er tilgjengelig. Klikk for å oppdatere.",
|
||||
"updateStarted": "Oppdatering startet..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analytics",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Legg til modellkonfig",
|
||||
"desc": "Legg til følgende konfigurasjon til modellarrayet ditt:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Continue bruker JSON-konfigurasjonsfilen."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode krever API-nøkkelkonfigurasjon.",
|
||||
"1": "Angi basis-URL til OmniRoute-endepunktet."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro krever Amazon-konto."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Auto-synkronisering",
|
||||
"autoSyncTooltip": "Oppdater modelllisten automatisk hver 24. time (kan konfigureres via MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Automatisk synkronisering aktivert – modellene oppdateres med jevne mellomrom",
|
||||
"autoSyncDisabled": "Automatisk synkronisering er deaktivert",
|
||||
"autoSyncToggleFailed": "Kunne ikke slå på automatisk synkronisering",
|
||||
"clearAllModels": "Fjern alle modeller",
|
||||
"clearAllModelsConfirm": "Er du sikker på at du vil fjerne alle modellene for denne leverandøren? Dette kan ikke angres.",
|
||||
"clearAllModelsSuccess": "Alle modeller ryddet",
|
||||
"clearAllModelsFailed": "Kunne ikke slette modeller"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Innstillinger",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Start serveren på nytt - den vil bruke det nye passordet",
|
||||
"backToLogin": "Tilbake til pålogging",
|
||||
"forgotPassword": "Glemt passord?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Autorisasjon",
|
||||
"Content-Disposition": "Innhold-Disposisjon",
|
||||
"waitingForAuthorization": "Venter på autorisasjon...",
|
||||
"waitingForGoogleAuthorization": "Venter på Google-autorisasjon...",
|
||||
"waitingForOpenAIAuthorization": "Venter på OpenAI-godkjenning...",
|
||||
"waitingForAntigravityAuthorization": "Venter på antigravity-autorisasjon...",
|
||||
"waitingForIFlowAuthorization": "Venter på iFlow-autorisasjon...",
|
||||
"exchangingCodeForTokens": "Utveksler kode for tokens..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Tekst-til-tale generering (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Generering av tekstinnbygging (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Personvernerklæring",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Enkel chat",
|
||||
"streaming": "Streaming",
|
||||
"system-prompt": "Systemmelding",
|
||||
"thinking": "Tenker",
|
||||
"tool-calling": "Verktøyanrop",
|
||||
"multi-turn": "Multisving"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Grunnleggende chatmal med systemmelding",
|
||||
"streaming": "Mal for strømmesvar",
|
||||
"system-prompt": "Mal med tilpasset systemforespørsel",
|
||||
"thinking": "Mal med resonnement/tenkebudsjett",
|
||||
"tool-calling": "Mal for verktøy/funksjonskall",
|
||||
"multi-turn": "Mal for samtaler med flere svinger"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Du er en hjelpsom AI-assistent.",
|
||||
"userGreeting": "Hei! Hvordan kan jeg hjelpe deg i dag?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Skriv en historie om"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Hva er meningen med livet?",
|
||||
"systemInstruction": "Gi et gjennomtenkt, filosofisk svar."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Forklar kvanteberegning"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Navnet på byen å få vær for",
|
||||
"toolDescription": "Få gjeldende vær for et sted",
|
||||
"userWeather": "Hvordan er været i Tokyo?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Du er en hjelpsom assistent.",
|
||||
"assistantExample": "Jeg hjelper deg gjerne med det.",
|
||||
"userInitial": "Jeg trenger hjelp med",
|
||||
"userFollowUp": "Kan du utdype det?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Libre",
|
||||
"skipToContent": "Lumaktaw sa nilalaman",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Tanggapin",
|
||||
"accountId": "Account ID",
|
||||
"alias": "alyas",
|
||||
"apiKeyId": "API Key ID",
|
||||
"apiKeyName": "Pangalan ng API Key",
|
||||
"apiKeySecret": "Lihim ng Key ng API",
|
||||
"authorization": "Awtorisasyon",
|
||||
"content-type": "Uri ng Nilalaman",
|
||||
"content-length": "Haba ng Nilalaman",
|
||||
"cookie": "Cookie",
|
||||
"file": "file",
|
||||
"host": "Host",
|
||||
"id": "ID",
|
||||
"import": "Mag-import",
|
||||
"limit": "Limitahan",
|
||||
"offset": "Offset",
|
||||
"open": "Bukas",
|
||||
"origin": "Pinagmulan",
|
||||
"promptTokens": "Mga Prompt Token",
|
||||
"completionTokens": "Mga Token ng Pagkumpleto",
|
||||
"totalTokens": "Kabuuang Token",
|
||||
"rawModel": "Hilaw na Modelo",
|
||||
"scope": "Saklaw",
|
||||
"skill": "Kasanayan",
|
||||
"sortBy": "Pagbukud-bukurin Ayon",
|
||||
"sortOrder": "Pagbukud-bukurin",
|
||||
"tab": "Tab",
|
||||
"text": "Text",
|
||||
"textarea": "Textarea",
|
||||
"tool": "Tool",
|
||||
"toolId": "Tool ID",
|
||||
"web": "Web",
|
||||
"whereUsed": "Kung Saan Ginamit",
|
||||
"whitelist": "Whitelist",
|
||||
"blacklist": "Blacklist",
|
||||
"resolve": "Lutasin",
|
||||
"force": "Puwersa",
|
||||
"base64url": "Base64 URL",
|
||||
"hex": "Hex",
|
||||
"range": "Saklaw",
|
||||
"component": "Component",
|
||||
"redirect_uri": "I-redirect ang URI",
|
||||
"idempotency-key": "Idepotency Key",
|
||||
"error_description": "Paglalarawan ng Error",
|
||||
"code": "Code",
|
||||
"compatible": "Magkatugma",
|
||||
"chat-completions": "Mga Pagkumpleto ng Chat",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Auth Token",
|
||||
"crypto": "Crypto",
|
||||
"hours": "Oras",
|
||||
"selfsigned": "Self-signed",
|
||||
"proxy_id": "Proxy ID",
|
||||
"proxyId": "Proxy ID",
|
||||
"connectionId": "ID ng Koneksyon",
|
||||
"resolveConnectionId": "Lutasin ang Connection ID",
|
||||
"resolve_connection_id": "Lutasin ang Connection ID",
|
||||
"scope_id": "ID ng Saklaw",
|
||||
"scopeId": "ID ng Saklaw",
|
||||
"jwtSecret": "Sikreto ng JWT",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "mas mahusay-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "ID ng Tagabuo",
|
||||
"musicDesc": "Paglalarawan ng Musika",
|
||||
"musicGeneration": "Pagbuo ng Musika",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Nagbago ang status ng cloud",
|
||||
"where_used": "Kung Saan Ginamit",
|
||||
"windowMs": "Window (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Tool Allowlist",
|
||||
"TOOL_DENYLIST": "Tool Denylist",
|
||||
"Failed to save pricing": "Nabigong i-save ang pagpepresyo",
|
||||
"Failed to reset pricing": "Nabigong i-reset ang pagpepresyo",
|
||||
"apikey": "API Key",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Bahay",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} mga kahilingan",
|
||||
"providerModelsTitle": "{provider} - Mga Modelo",
|
||||
"copiedModel": "Nakopya: {model}",
|
||||
"aliasLabel": "alyas"
|
||||
"aliasLabel": "alyas",
|
||||
"updateNow": "Update Ngayon",
|
||||
"updating": "Ina-update...",
|
||||
"updateAvailableDesc": "Available ang isang bagong bersyon. I-click para mag-update.",
|
||||
"updateStarted": "Nagsimula ang pag-update..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analytics",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Magdagdag ng Model Config",
|
||||
"desc": "Idagdag ang sumusunod na configuration sa iyong array ng mga modelo:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Magpatuloy ay gumagamit ng JSON config file."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Nangangailangan ang OpenCode ng configuration ng API key.",
|
||||
"1": "Itakda ang base URL sa iyong OmniRoute endpoint."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Ang Kiro ay nangangailangan ng Amazon account."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Auto-Sync",
|
||||
"autoSyncTooltip": "Awtomatikong i-refresh ang listahan ng modelo tuwing 24h (mako-configure sa pamamagitan ng MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Pinagana ang auto-sync — pana-panahong magre-refresh ang mga modelo",
|
||||
"autoSyncDisabled": "Na-disable ang auto-sync",
|
||||
"autoSyncToggleFailed": "Nabigong i-toggle ang auto-sync",
|
||||
"clearAllModels": "I-clear ang Lahat ng Modelo",
|
||||
"clearAllModelsConfirm": "Sigurado ka bang gusto mong alisin ang lahat ng modelo para sa provider na ito? Hindi na ito maaaring bawiin.",
|
||||
"clearAllModelsSuccess": "Na-clear ang lahat ng mga modelo",
|
||||
"clearAllModelsFailed": "Nabigong i-clear ang mga modelo"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Mga setting",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "I-restart ang server - gagamitin nito ang bagong password",
|
||||
"backToLogin": "Bumalik sa Login",
|
||||
"forgotPassword": "Nakalimutan ang password?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Awtorisasyon",
|
||||
"Content-Disposition": "Nilalaman-Disposisyon",
|
||||
"waitingForAuthorization": "Naghihintay ng awtorisasyon...",
|
||||
"waitingForGoogleAuthorization": "Naghihintay ng pahintulot ng Google...",
|
||||
"waitingForOpenAIAuthorization": "Naghihintay ng awtorisasyon sa OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "Naghihintay ng awtorisasyon sa Antigravity...",
|
||||
"waitingForIFlowAuthorization": "Naghihintay ng awtorisasyon ng iFlow...",
|
||||
"exchangingCodeForTokens": "Pagpapalit ng code para sa mga token..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Pagbuo ng text-to-speech (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Pagbuo ng text embed (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Patakaran sa Privacy",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Simpleng Chat",
|
||||
"streaming": "Streaming",
|
||||
"system-prompt": "System Prompt",
|
||||
"thinking": "Nag-iisip",
|
||||
"tool-calling": "Tool Calling",
|
||||
"multi-turn": "Multi-turn"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Pangunahing template ng chat na may mensahe ng system",
|
||||
"streaming": "Template para sa streaming na mga tugon",
|
||||
"system-prompt": "Template na may pasadyang system prompt",
|
||||
"thinking": "Template na may pangangatwiran/pag-iisip na badyet",
|
||||
"tool-calling": "Template para sa tool/function na pagtawag",
|
||||
"multi-turn": "Template para sa mga multi-turn na pag-uusap"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Isa kang matulunging AI assistant.",
|
||||
"userGreeting": "Hello! Paano kita matutulungan ngayon?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Sumulat ng isang kuwento tungkol sa"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Ano ang kahulugan ng buhay?",
|
||||
"systemInstruction": "Magbigay ng maalalahanin, pilosopong sagot."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Ipaliwanag ang quantum computing"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Ang pangalan ng lungsod upang makakuha ng panahon para sa",
|
||||
"toolDescription": "Kunin ang kasalukuyang panahon para sa isang lokasyon",
|
||||
"userWeather": "Ano ang lagay ng panahon sa Tokyo?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Isa kang matulunging katulong.",
|
||||
"assistantExample": "Ikalulugod kong tulungan ka niyan.",
|
||||
"userInitial": "Kailangan ko ng tulong sa",
|
||||
"userFollowUp": "Maaari mo bang ipaliwanag iyon?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google'a",
|
||||
"TOOL_ALLOWLIST": "Lista dozwolonych narzędzi",
|
||||
"TOOL_DENYLIST": "Lista odrzuconych narzędzi",
|
||||
"Failed to save pricing": "Nie udało się zapisać cen",
|
||||
"Failed to reset pricing": "Nie udało się zresetować cen",
|
||||
"apikey": "Klucz API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Dom",
|
||||
@@ -2403,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "Autoryzacja",
|
||||
"Content-Disposition": "Dyspozycja treści"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Jesteś pomocnym asystentem AI.",
|
||||
"userGreeting": "Witam! Jak mogę Ci dzisiaj pomóc?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Napisz opowiadanie o"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Jaki jest sens życia?",
|
||||
"systemInstruction": "Podaj przemyślaną, filozoficzną odpowiedź."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Wyjaśnij obliczenia kwantowe"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Nazwa miasta, dla którego chcesz uzyskać pogodę",
|
||||
"toolDescription": "Uzyskaj aktualną pogodę dla danej lokalizacji",
|
||||
"userWeather": "Jaka jest pogoda w Tokio?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Jesteś pomocnym asystentem.",
|
||||
"assistantExample": "Chętnie Ci w tym pomogę.",
|
||||
"userInitial": "Potrzebuję pomocy",
|
||||
"userFollowUp": "Możesz to rozwinąć?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +58,85 @@
|
||||
"free": "Gratuito",
|
||||
"skipToContent": "Pular para conteúdo",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Aceitar",
|
||||
"accountId": "ID da conta",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "ID da chave de API",
|
||||
"apiKeyName": "Nome da chave de API",
|
||||
"apiKeySecret": "Segredo da chave API",
|
||||
"authorization": "Autorização",
|
||||
"content-type": "Tipo de conteúdo",
|
||||
"content-length": "Comprimento do conteúdo",
|
||||
"cookie": "Biscoito",
|
||||
"file": "Arquivo",
|
||||
"host": "Anfitrião",
|
||||
"id": "ID",
|
||||
"import": "Importar",
|
||||
"limit": "Limite",
|
||||
"offset": "Deslocamento",
|
||||
"open": "Abrir",
|
||||
"origin": "Origem",
|
||||
"promptTokens": "Tokens de prompt",
|
||||
"completionTokens": "Tokens de conclusão",
|
||||
"totalTokens": "Total de fichas",
|
||||
"rawModel": "Modelo Bruto",
|
||||
"scope": "Escopo",
|
||||
"skill": "Habilidade",
|
||||
"sortBy": "Classificar por",
|
||||
"sortOrder": "Ordem de classificação",
|
||||
"tab": "Guia",
|
||||
"text": "Texto",
|
||||
"textarea": "Área de texto",
|
||||
"tool": "Ferramenta",
|
||||
"toolId": "ID da ferramenta",
|
||||
"web": "Rede",
|
||||
"whereUsed": "Onde usado",
|
||||
"whitelist": "Lista de permissões",
|
||||
"blacklist": "Lista negra",
|
||||
"resolve": "Resolver",
|
||||
"force": "Força",
|
||||
"base64url": "URL Base64",
|
||||
"hex": "Feitiço",
|
||||
"range": "Alcance",
|
||||
"component": "Componente",
|
||||
"redirect_uri": "Redirecionar URI",
|
||||
"idempotency-key": "Chave de Idempotência",
|
||||
"error_description": "Descrição do erro",
|
||||
"code": "Código",
|
||||
"compatible": "Compatível",
|
||||
"chat-completions": "Conclusões de bate-papo",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Token de autenticação",
|
||||
"crypto": "Criptografia",
|
||||
"hours": "Horas",
|
||||
"selfsigned": "Autoassinado",
|
||||
"proxy_id": "ID do proxy",
|
||||
"proxyId": "ID do proxy",
|
||||
"connectionId": "ID de conexão",
|
||||
"resolveConnectionId": "Resolver ID de conexão",
|
||||
"resolve_connection_id": "Resolver ID de conexão",
|
||||
"scope_id": "ID do escopo",
|
||||
"scopeId": "ID do escopo",
|
||||
"jwtSecret": "Segredo JWT",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "melhor-sqlite3",
|
||||
"undici": "unici",
|
||||
"builder-id": "ID do construtor",
|
||||
"musicDesc": "Descrição da música",
|
||||
"musicGeneration": "Geração Musical",
|
||||
"idc": "CDI",
|
||||
"cloud-status-changed": "Status da nuvem alterado",
|
||||
"where_used": "Onde usado",
|
||||
"windowMs": "Janela (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Lista de permissões de ferramentas",
|
||||
"TOOL_DENYLIST": "Lista de bloqueios de ferramentas",
|
||||
"Failed to save pricing": "Falha ao salvar o preço",
|
||||
"Failed to reset pricing": "Falha ao redefinir o preço",
|
||||
"apikey": "Chave de API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Início",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} reqs",
|
||||
"providerModelsTitle": "{provider} - Modelos",
|
||||
"copiedModel": "Copiado: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Atualizar agora",
|
||||
"updating": "Atualizando...",
|
||||
"updateAvailableDesc": "Uma nova versão está disponível. Clique para atualizar.",
|
||||
"updateStarted": "Atualização iniciada..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Análises",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Adicionar Config de Modelo",
|
||||
"desc": "Adicione a configuração abaixo ao array de modelos:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Continuar usa o arquivo de configuração JSON."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode requer configuração de chave API.",
|
||||
"1": "Configure a URL base para seu endpoint do OmniRoute."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro requer uma conta Amazon."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1489,7 +1581,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Sincronização automática",
|
||||
"autoSyncTooltip": "Atualize automaticamente a lista de modelos a cada 24h (configurável via MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Sincronização automática habilitada – os modelos serão atualizados periodicamente",
|
||||
"autoSyncDisabled": "Sincronização automática desativada",
|
||||
"autoSyncToggleFailed": "Falha ao alternar a sincronização automática",
|
||||
"clearAllModels": "Limpar todos os modelos",
|
||||
"clearAllModelsConfirm": "Tem certeza de que deseja remover todos os modelos deste provedor? Isto não pode ser desfeito.",
|
||||
"clearAllModelsSuccess": "Todos os modelos foram apagados",
|
||||
"clearAllModelsFailed": "Falha ao limpar modelos"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Configurações",
|
||||
@@ -2316,7 +2417,15 @@
|
||||
"restartServerWithNewPassword": "Reinicie o servidor - ele usará a nova senha",
|
||||
"backToLogin": "Voltar para o Login",
|
||||
"forgotPassword": "Esqueceu a senha?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Autorização",
|
||||
"Content-Disposition": "Disposição de conteúdo",
|
||||
"waitingForAuthorization": "Aguardando autorização...",
|
||||
"waitingForGoogleAuthorization": "Aguardando autorização do Google...",
|
||||
"waitingForOpenAIAuthorization": "Aguardando autorização do OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "Aguardando autorização antigravidade...",
|
||||
"waitingForIFlowAuthorization": "Aguardando autorização do iFlow...",
|
||||
"exchangingCodeForTokens": "Trocando código por tokens..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2523,7 +2632,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Geração de texto para fala (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Geração de incorporação de texto (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Política de Privacidade",
|
||||
@@ -2701,5 +2812,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Bate-papo simples",
|
||||
"streaming": "Transmissão",
|
||||
"system-prompt": "Alerta do sistema",
|
||||
"thinking": "Pensando",
|
||||
"tool-calling": "Chamada de ferramenta",
|
||||
"multi-turn": "Multivoltas"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Modelo básico de chat com mensagem do sistema",
|
||||
"streaming": "Modelo para streaming de respostas",
|
||||
"system-prompt": "Modelo com prompt de sistema personalizado",
|
||||
"thinking": "Modelo com orçamento de raciocínio/pensamento",
|
||||
"tool-calling": "Modelo para chamada de ferramenta/função",
|
||||
"multi-turn": "Modelo para conversas múltiplas"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Você é um assistente de IA útil.",
|
||||
"userGreeting": "Olá! Como posso ajudá-lo hoje?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Escreva uma história sobre"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Qual é o sentido da vida?",
|
||||
"systemInstruction": "Forneça uma resposta ponderada e filosófica."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Explique a computação quântica"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "O nome da cidade para obter o clima",
|
||||
"toolDescription": "Obtenha o clima atual para um local",
|
||||
"userWeather": "Qual é o clima em Tóquio?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Você é um assistente útil.",
|
||||
"assistantExample": "Ficarei feliz em ajudá-lo com isso.",
|
||||
"userInitial": "preciso de ajuda com",
|
||||
"userFollowUp": "Você pode explicar isso?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Lista de permissões de ferramentas",
|
||||
"TOOL_DENYLIST": "Lista de bloqueios de ferramentas",
|
||||
"Failed to save pricing": "Falha ao salvar o preço",
|
||||
"Failed to reset pricing": "Falha ao redefinir o preço",
|
||||
"apikey": "Chave de API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Página inicial",
|
||||
@@ -2415,7 +2423,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "Autorização",
|
||||
"Content-Disposition": "Disposição de conteúdo"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Você é um assistente de IA útil.",
|
||||
"userGreeting": "Olá! Como posso ajudá-lo hoje?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Escreva uma história sobre"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Qual é o sentido da vida?",
|
||||
"systemInstruction": "Forneça uma resposta ponderada e filosófica."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Explique a computação quântica"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "O nome da cidade para obter o clima",
|
||||
"toolDescription": "Obtenha o clima atual para um local",
|
||||
"userWeather": "Qual é o clima em Tóquio?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Você é um assistente útil.",
|
||||
"assistantExample": "Ficarei feliz em ajudá-lo com isso.",
|
||||
"userInitial": "preciso de ajuda com",
|
||||
"userFollowUp": "Você pode explicar isso?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Gratuit",
|
||||
"skipToContent": "Treci la conținut",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Acceptați",
|
||||
"accountId": "ID contului",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "ID-ul cheii API",
|
||||
"apiKeyName": "Nume cheie API",
|
||||
"apiKeySecret": "Secretul cheii API",
|
||||
"authorization": "Autorizare",
|
||||
"content-type": "Tip de conținut",
|
||||
"content-length": "Lungimea conținutului",
|
||||
"cookie": "Cookie",
|
||||
"file": "Fișier",
|
||||
"host": "Gazdă",
|
||||
"id": "ID",
|
||||
"import": "Import",
|
||||
"limit": "Limită",
|
||||
"offset": "Offset",
|
||||
"open": "Deschide",
|
||||
"origin": "Originea",
|
||||
"promptTokens": "Jetoane prompte",
|
||||
"completionTokens": "Jetoane de finalizare",
|
||||
"totalTokens": "Total de jetoane",
|
||||
"rawModel": "Model brut",
|
||||
"scope": "Domeniul de aplicare",
|
||||
"skill": "Îndemânare",
|
||||
"sortBy": "Sortare după",
|
||||
"sortOrder": "Ordine de sortare",
|
||||
"tab": "Tab",
|
||||
"text": "Text",
|
||||
"textarea": "Textarea",
|
||||
"tool": "Instrument",
|
||||
"toolId": "ID instrument",
|
||||
"web": "Web",
|
||||
"whereUsed": "Unde este folosit",
|
||||
"whitelist": "Lista albă",
|
||||
"blacklist": "Lista neagră",
|
||||
"resolve": "Rezolvați",
|
||||
"force": "Forța",
|
||||
"base64url": "URL Base64",
|
||||
"hex": "Hex",
|
||||
"range": "Gama",
|
||||
"component": "Componentă",
|
||||
"redirect_uri": "URI de redirecționare",
|
||||
"idempotency-key": "Cheia Idempotnței",
|
||||
"error_description": "Descrierea erorii",
|
||||
"code": "Cod",
|
||||
"compatible": "Compatibil",
|
||||
"chat-completions": "Finalizări de chat",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Jeton de autentificare",
|
||||
"crypto": "Cripto",
|
||||
"hours": "Ore",
|
||||
"selfsigned": "Autosemnat",
|
||||
"proxy_id": "ID proxy",
|
||||
"proxyId": "ID proxy",
|
||||
"connectionId": "ID conexiune",
|
||||
"resolveConnectionId": "Rezolvați ID-ul conexiunii",
|
||||
"resolve_connection_id": "Rezolvați ID-ul conexiunii",
|
||||
"scope_id": "ID domeniului",
|
||||
"scopeId": "ID domeniului",
|
||||
"jwtSecret": "Secretul JWT",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "mai bine-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "ID constructor",
|
||||
"musicDesc": "Descrierea muzicii",
|
||||
"musicGeneration": "Generația muzicală",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Starea cloudului s-a schimbat",
|
||||
"where_used": "Unde este folosit",
|
||||
"windowMs": "Fereastra (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Lista de instrumente permise",
|
||||
"TOOL_DENYLIST": "Lista de refulare a instrumentelor",
|
||||
"Failed to save pricing": "Nu s-a salvat prețul",
|
||||
"Failed to reset pricing": "Nu s-a resetat prețul",
|
||||
"apikey": "Cheia API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Acasă",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} solicită",
|
||||
"providerModelsTitle": "{provider} - Modele",
|
||||
"copiedModel": "Copiat: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Actualizați acum",
|
||||
"updating": "Se actualizează...",
|
||||
"updateAvailableDesc": "Este disponibilă o nouă versiune. Faceți clic pentru a actualiza.",
|
||||
"updateStarted": "Actualizarea a început..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analytics",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Adăugați configurația modelului",
|
||||
"desc": "Adăugați următoarea configurație la matricea dvs. de modele:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Continuați folosește fișierul de configurare JSON."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode necesită configurarea cheii API.",
|
||||
"1": "Setați adresa URL de bază la punctul final OmniRoute."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro necesită un cont Amazon."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Sincronizare automată",
|
||||
"autoSyncTooltip": "Actualizează automat lista de modele la fiecare 24 de ore (configurabil prin MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Sincronizare automată activată — modelele se vor reîmprospăta periodic",
|
||||
"autoSyncDisabled": "Sincronizarea automată a fost dezactivată",
|
||||
"autoSyncToggleFailed": "Nu s-a putut comuta sincronizarea automată",
|
||||
"clearAllModels": "Ștergeți toate modelele",
|
||||
"clearAllModelsConfirm": "Sigur doriți să eliminați toate modelele pentru acest furnizor? Acest lucru nu poate fi anulat.",
|
||||
"clearAllModelsSuccess": "Toate modelele au fost eliminate",
|
||||
"clearAllModelsFailed": "Nu s-au șters modelele"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Setări",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Reporniți serverul - va folosi noua parolă",
|
||||
"backToLogin": "Înapoi la Logare",
|
||||
"forgotPassword": "Ai uitat parola?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Autorizare",
|
||||
"Content-Disposition": "Conținut-Dispoziție",
|
||||
"waitingForAuthorization": "Se așteaptă autorizația...",
|
||||
"waitingForGoogleAuthorization": "Se așteaptă autorizarea Google...",
|
||||
"waitingForOpenAIAuthorization": "Se așteaptă autorizarea OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "Se așteaptă autorizația antigravitație...",
|
||||
"waitingForIFlowAuthorization": "Se așteaptă autorizarea iFlow...",
|
||||
"exchangingCodeForTokens": "Se schimbă codul pentru jetoane..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Generarea text-to-speech (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Generarea de încorporare a textului (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Politica de confidențialitate",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Chat simplu",
|
||||
"streaming": "Streaming",
|
||||
"system-prompt": "Prompt de sistem",
|
||||
"thinking": "Gândirea",
|
||||
"tool-calling": "Apelarea instrumentului",
|
||||
"multi-turn": "Multi-turn"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Șablon de chat de bază cu mesaj de sistem",
|
||||
"streaming": "Șablon pentru răspunsuri în flux",
|
||||
"system-prompt": "Șablon cu prompt de sistem personalizat",
|
||||
"thinking": "Șablon cu buget de raționament/gândire",
|
||||
"tool-calling": "Șablon pentru apelarea instrumentului/funcției",
|
||||
"multi-turn": "Șablon pentru conversații în mai multe rânduri"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Sunteți un asistent AI util.",
|
||||
"userGreeting": "Bună ziua! Cum te pot ajuta azi?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Scrie o poveste despre"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Care este sensul vieții?",
|
||||
"systemInstruction": "Oferă un răspuns gânditor, filozofic."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Explicați calculul cuantic"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Numele orașului pentru care să aflați vremea",
|
||||
"toolDescription": "Obțineți vremea actuală pentru o locație",
|
||||
"userWeather": "Care este vremea în Tokyo?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Ești un asistent util.",
|
||||
"assistantExample": "Aș fi bucuros să te ajut cu asta.",
|
||||
"userInitial": "Am nevoie de ajutor cu",
|
||||
"userFollowUp": "Puteți detalia asta?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,7 +128,15 @@
|
||||
"idc": "idc",
|
||||
"cloud-status-changed": "cloud-status-changed",
|
||||
"where_used": "where_used",
|
||||
"windowMs": "windowMs"
|
||||
"windowMs": "windowMs",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Гугл",
|
||||
"TOOL_ALLOWLIST": "Белый список инструментов",
|
||||
"TOOL_DENYLIST": "Список запрещенных инструментов",
|
||||
"Failed to save pricing": "Не удалось сохранить цену.",
|
||||
"Failed to reset pricing": "Не удалось сбросить цены.",
|
||||
"apikey": "API-ключ",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Главная",
|
||||
@@ -2403,7 +2411,9 @@
|
||||
"waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
|
||||
"waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
|
||||
"waitingForIFlowAuthorization": "Waiting for iFlow authorization...",
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens..."
|
||||
"exchangingCodeForTokens": "Exchanging code for tokens...",
|
||||
"Authorization": "Авторизация",
|
||||
"Content-Disposition": "Содержание-Расположение"
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "ОмниРоут",
|
||||
@@ -2806,5 +2816,32 @@
|
||||
"thinking": "Thinking template",
|
||||
"tool-calling": "Tool calling template",
|
||||
"multi-turn": "Multi-turn template"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Вы полезный помощник искусственного интеллекта.",
|
||||
"userGreeting": "Здравствуйте! Чем я могу помочь вам сегодня?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Напишите рассказ о"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "В чем смысл жизни?",
|
||||
"systemInstruction": "Дайте вдумчивый, философский ответ."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Объясните квантовые вычисления"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Название города, для которого нужно узнать погоду",
|
||||
"toolDescription": "Получить текущую погоду для местоположения",
|
||||
"userWeather": "Какая погода в Токио?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Вы полезный помощник.",
|
||||
"assistantExample": "Я был бы рад помочь вам в этом.",
|
||||
"userInitial": "мне нужна помощь с",
|
||||
"userFollowUp": "Можете ли вы рассказать об этом подробнее?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Zadarmo",
|
||||
"skipToContent": "Preskočiť na obsah",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Prijať",
|
||||
"accountId": "ID účtu",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "ID kľúča API",
|
||||
"apiKeyName": "Názov kľúča API",
|
||||
"apiKeySecret": "Tajný kľúč API",
|
||||
"authorization": "Autorizácia",
|
||||
"content-type": "Typ obsahu",
|
||||
"content-length": "Dĺžka obsahu",
|
||||
"cookie": "Cookie",
|
||||
"file": "Súbor",
|
||||
"host": "Hostiteľ",
|
||||
"id": "ID",
|
||||
"import": "Importovať",
|
||||
"limit": "Limit",
|
||||
"offset": "Offset",
|
||||
"open": "Otvorte",
|
||||
"origin": "Pôvod",
|
||||
"promptTokens": "Prompt Tokeny",
|
||||
"completionTokens": "Žetóny dokončenia",
|
||||
"totalTokens": "Celkový počet tokenov",
|
||||
"rawModel": "Surový model",
|
||||
"scope": "Rozsah",
|
||||
"skill": "Zručnosť",
|
||||
"sortBy": "Zoradiť podľa",
|
||||
"sortOrder": "Poradie zoradenia",
|
||||
"tab": "Tab",
|
||||
"text": "Text",
|
||||
"textarea": "Textarea",
|
||||
"tool": "Nástroj",
|
||||
"toolId": "ID nástroja",
|
||||
"web": "Web",
|
||||
"whereUsed": "Kde sa používa",
|
||||
"whitelist": "Whitelist",
|
||||
"blacklist": "Čierna listina",
|
||||
"resolve": "Vyriešiť",
|
||||
"force": "sila",
|
||||
"base64url": "Base64 URL",
|
||||
"hex": "Hex",
|
||||
"range": "Rozsah",
|
||||
"component": "Komponent",
|
||||
"redirect_uri": "Presmerovať URI",
|
||||
"idempotency-key": "Kľúč idempotencie",
|
||||
"error_description": "Popis chyby",
|
||||
"code": "kód",
|
||||
"compatible": "Kompatibilné",
|
||||
"chat-completions": "Dokončenia četu",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Auth Token",
|
||||
"crypto": "Crypto",
|
||||
"hours": "hodiny",
|
||||
"selfsigned": "Vlastne podpísaný",
|
||||
"proxy_id": "ID proxy",
|
||||
"proxyId": "ID proxy",
|
||||
"connectionId": "ID pripojenia",
|
||||
"resolveConnectionId": "Vyriešiť ID pripojenia",
|
||||
"resolve_connection_id": "Vyriešiť ID pripojenia",
|
||||
"scope_id": "ID rozsahu",
|
||||
"scopeId": "ID rozsahu",
|
||||
"jwtSecret": "Tajomstvo JWT",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "lepší-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "ID staviteľa",
|
||||
"musicDesc": "Popis hudby",
|
||||
"musicGeneration": "Hudobná generácia",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Stav cloudu sa zmenil",
|
||||
"where_used": "Kde sa používa",
|
||||
"windowMs": "okno (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Zoznam povolených nástrojov",
|
||||
"TOOL_DENYLIST": "Nástroj Denylist",
|
||||
"Failed to save pricing": "Cenu sa nepodarilo uložiť",
|
||||
"Failed to reset pricing": "Cenu sa nepodarilo resetovať",
|
||||
"apikey": "API kľúč",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Domov",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} req",
|
||||
"providerModelsTitle": "{provider} - Modely",
|
||||
"copiedModel": "Skopírované: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Aktualizovať teraz",
|
||||
"updating": "Aktualizuje sa...",
|
||||
"updateAvailableDesc": "K dispozícii je nová verzia. Kliknutím aktualizujte.",
|
||||
"updateStarted": "Aktualizácia spustená..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analytics",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Pridať konfiguráciu modelu",
|
||||
"desc": "Pridajte do poľa modelov nasledujúcu konfiguráciu:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Pokračovať používa konfiguračný súbor JSON."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode vyžaduje konfiguráciu kľúča API.",
|
||||
"1": "Nastavte základnú URL na váš koncový bod OmniRoute."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro vyžaduje účet Amazon."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Automatická synchronizácia",
|
||||
"autoSyncTooltip": "Automaticky obnovovať zoznam modelov každých 24 hodín (konfigurovateľné cez MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Automatická synchronizácia povolená – modely sa budú pravidelne obnovovať",
|
||||
"autoSyncDisabled": "Automatická synchronizácia je zakázaná",
|
||||
"autoSyncToggleFailed": "Nepodarilo sa prepnúť automatickú synchronizáciu",
|
||||
"clearAllModels": "Vymazať všetky modely",
|
||||
"clearAllModelsConfirm": "Naozaj chcete odstrániť všetky modely tohto poskytovateľa? Toto sa nedá vrátiť späť.",
|
||||
"clearAllModelsSuccess": "Všetky modely sú vymazané",
|
||||
"clearAllModelsFailed": "Nepodarilo sa vyčistiť modely"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Nastavenia",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Reštartujte server - použije nové heslo",
|
||||
"backToLogin": "Späť na Prihlásenie",
|
||||
"forgotPassword": "Zabudli ste heslo?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Autorizácia",
|
||||
"Content-Disposition": "Obsah-Dispozícia",
|
||||
"waitingForAuthorization": "Čaká sa na autorizáciu...",
|
||||
"waitingForGoogleAuthorization": "Čaká sa na autorizáciu Google...",
|
||||
"waitingForOpenAIAuthorization": "Čaká sa na autorizáciu OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "Čaká sa na antigravitačné povolenie...",
|
||||
"waitingForIFlowAuthorization": "Čaká sa na autorizáciu iFlow...",
|
||||
"exchangingCodeForTokens": "Výmena kódu za tokeny..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Generovanie prevodu textu na reč (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Generovanie vkladania textu (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Zásady ochrany osobných údajov",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Jednoduchý chat",
|
||||
"streaming": "Streamovanie",
|
||||
"system-prompt": "Systémová výzva",
|
||||
"thinking": "Myslenie",
|
||||
"tool-calling": "Vyvolanie nástroja",
|
||||
"multi-turn": "Viacotáčkový"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Základná šablóna chatu so systémovou správou",
|
||||
"streaming": "Šablóna pre odpovede na streamovanie",
|
||||
"system-prompt": "Šablóna s vlastnou systémovou výzvou",
|
||||
"thinking": "Šablóna s rozpočtom na uvažovanie/premýšľanie",
|
||||
"tool-calling": "Šablóna na volanie nástroja/funkcie",
|
||||
"multi-turn": "Šablóna pre konverzácie s viacerými odbočkami"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Ste užitočný asistent AI.",
|
||||
"userGreeting": "Dobrý deň! Ako ti dnes môžem pomôcť?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Napíšte príbeh o"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Aký je zmysel života?",
|
||||
"systemInstruction": "Poskytnite premyslenú, filozofickú odpoveď."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Vysvetlite kvantové výpočty"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Názov mesta, pre ktoré sa má zistiť počasie",
|
||||
"toolDescription": "Získajte aktuálne počasie pre miesto",
|
||||
"userWeather": "Aké je počasie v Tokiu?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Ste užitočný pomocník.",
|
||||
"assistantExample": "Rád vám s tým pomôžem.",
|
||||
"userInitial": "Potrebujem pomoc s",
|
||||
"userFollowUp": "Môžete to upresniť?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "Gratis",
|
||||
"skipToContent": "Hoppa till innehållet",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Acceptera",
|
||||
"accountId": "Konto-ID",
|
||||
"alias": "Alias",
|
||||
"apiKeyId": "API-nyckel-ID",
|
||||
"apiKeyName": "API-nyckelnamn",
|
||||
"apiKeySecret": "API-nyckelhemlighet",
|
||||
"authorization": "Auktorisation",
|
||||
"content-type": "Innehållstyp",
|
||||
"content-length": "Innehållslängd",
|
||||
"cookie": "Cookie",
|
||||
"file": "Arkiv",
|
||||
"host": "Värd",
|
||||
"id": "ID",
|
||||
"import": "Importera",
|
||||
"limit": "Begränsa",
|
||||
"offset": "Offset",
|
||||
"open": "Öppna",
|
||||
"origin": "Ursprung",
|
||||
"promptTokens": "Fråga tokens",
|
||||
"completionTokens": "Kompletteringstokens",
|
||||
"totalTokens": "Totala tokens",
|
||||
"rawModel": "Rå modell",
|
||||
"scope": "Omfattning",
|
||||
"skill": "Skicklighet",
|
||||
"sortBy": "Sortera efter",
|
||||
"sortOrder": "Sorteringsordning",
|
||||
"tab": "Tab",
|
||||
"text": "Text",
|
||||
"textarea": "Textområde",
|
||||
"tool": "Verktyg",
|
||||
"toolId": "Verktygs-ID",
|
||||
"web": "Webb",
|
||||
"whereUsed": "Där den används",
|
||||
"whitelist": "Vitlista",
|
||||
"blacklist": "Svartlista",
|
||||
"resolve": "Lös",
|
||||
"force": "Force",
|
||||
"base64url": "Base64 URL",
|
||||
"hex": "Hex",
|
||||
"range": "Räckvidd",
|
||||
"component": "Komponent",
|
||||
"redirect_uri": "Omdirigera URI",
|
||||
"idempotency-key": "Idempotensnyckel",
|
||||
"error_description": "Felbeskrivning",
|
||||
"code": "Kod",
|
||||
"compatible": "Kompatibel",
|
||||
"chat-completions": "Chattavslut",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Auth Token",
|
||||
"crypto": "Krypto",
|
||||
"hours": "Timmar",
|
||||
"selfsigned": "Självsignerad",
|
||||
"proxy_id": "Proxy-ID",
|
||||
"proxyId": "Proxy-ID",
|
||||
"connectionId": "Anslutnings-ID",
|
||||
"resolveConnectionId": "Lös anslutnings-ID",
|
||||
"resolve_connection_id": "Lös anslutnings-ID",
|
||||
"scope_id": "Omfattning ID",
|
||||
"scopeId": "Omfattning ID",
|
||||
"jwtSecret": "JWT hemlighet",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "bättre-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "Byggar-ID",
|
||||
"musicDesc": "Musikbeskrivning",
|
||||
"musicGeneration": "Musikgeneration",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Molnstatus ändrad",
|
||||
"where_used": "Där den används",
|
||||
"windowMs": "Fönster (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Tillståndslista för verktyg",
|
||||
"TOOL_DENYLIST": "Verktyg Denylist",
|
||||
"Failed to save pricing": "Det gick inte att spara pris",
|
||||
"Failed to reset pricing": "Det gick inte att återställa prissättningen",
|
||||
"apikey": "API-nyckel",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Hem",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} krav",
|
||||
"providerModelsTitle": "{provider} - Modeller",
|
||||
"copiedModel": "Kopierat: {model}",
|
||||
"aliasLabel": "alias"
|
||||
"aliasLabel": "alias",
|
||||
"updateNow": "Uppdatera nu",
|
||||
"updating": "Uppdaterar...",
|
||||
"updateAvailableDesc": "En ny version finns tillgänglig. Klicka för att uppdatera.",
|
||||
"updateStarted": "Uppdatering startade..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Analytics",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Lägg till Model Config",
|
||||
"desc": "Lägg till följande konfiguration till din modellarray:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Continue använder JSON-konfigurationsfilen."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode kräver API-nyckelkonfiguration.",
|
||||
"1": "Ställ in basadressen till din OmniRoute-slutpunkt."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro kräver Amazon-konto."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Automatisk synkronisering",
|
||||
"autoSyncTooltip": "Uppdatera modelllistan automatiskt var 24:e timme (konfigurerbar via MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Automatisk synkronisering aktiverad — modeller uppdateras regelbundet",
|
||||
"autoSyncDisabled": "Automatisk synkronisering inaktiverad",
|
||||
"autoSyncToggleFailed": "Det gick inte att växla automatisk synkronisering",
|
||||
"clearAllModels": "Rensa alla modeller",
|
||||
"clearAllModelsConfirm": "Är du säker på att du vill ta bort alla modeller för den här leverantören? Detta kan inte ångras.",
|
||||
"clearAllModelsSuccess": "Alla modeller rensade",
|
||||
"clearAllModelsFailed": "Det gick inte att rensa modeller"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Inställningar",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Starta om servern - den kommer att använda det nya lösenordet",
|
||||
"backToLogin": "Tillbaka till inloggning",
|
||||
"forgotPassword": "Glömt lösenordet?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Auktorisation",
|
||||
"Content-Disposition": "Innehåll-Disposition",
|
||||
"waitingForAuthorization": "Väntar på auktorisation...",
|
||||
"waitingForGoogleAuthorization": "Väntar på Google-auktorisering...",
|
||||
"waitingForOpenAIAuthorization": "Väntar på OpenAI-auktorisering...",
|
||||
"waitingForAntigravityAuthorization": "Väntar på antigravitationstillstånd...",
|
||||
"waitingForIFlowAuthorization": "Väntar på iFlow-auktorisering...",
|
||||
"exchangingCodeForTokens": "Byter ut kod för tokens..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Text-till-tal-generering (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Generering av textinbäddning (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Sekretesspolicy",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Enkel chatt",
|
||||
"streaming": "Streaming",
|
||||
"system-prompt": "Systemprompt",
|
||||
"thinking": "Tänker",
|
||||
"tool-calling": "Verktygsanrop",
|
||||
"multi-turn": "Flervarv"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Grundläggande chattmall med systemmeddelande",
|
||||
"streaming": "Mall för strömmande svar",
|
||||
"system-prompt": "Mall med anpassad systemprompt",
|
||||
"thinking": "Mall med resonemang/tänkebudget",
|
||||
"tool-calling": "Mall för verktyg/funktionsanrop",
|
||||
"multi-turn": "Mall för konversationer med flera svängar"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Du är en hjälpsam AI-assistent.",
|
||||
"userGreeting": "Hej! Hur kan jag hjälpa dig idag?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Skriv en berättelse om"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Vad är meningen med livet?",
|
||||
"systemInstruction": "Ge ett genomtänkt, filosofiskt svar."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Förklara kvantberäkning"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Namnet på staden att få väder för",
|
||||
"toolDescription": "Få aktuellt väder för en plats",
|
||||
"userWeather": "Hur är vädret i Tokyo?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Du är en hjälpsam assistent.",
|
||||
"assistantExample": "Jag hjälper dig gärna med det.",
|
||||
"userInitial": "Jag behöver hjälp med",
|
||||
"userFollowUp": "Kan du utveckla det?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "ฟรี",
|
||||
"skipToContent": "ข้ามไปที่เนื้อหา",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "ยอมรับ",
|
||||
"accountId": "รหัสบัญชี",
|
||||
"alias": "นามแฝง",
|
||||
"apiKeyId": "รหัสคีย์ API",
|
||||
"apiKeyName": "ชื่อคีย์ API",
|
||||
"apiKeySecret": "ความลับของคีย์ API",
|
||||
"authorization": "การอนุญาต",
|
||||
"content-type": "ประเภทเนื้อหา",
|
||||
"content-length": "ความยาวของเนื้อหา",
|
||||
"cookie": "คุกกี้",
|
||||
"file": "ไฟล์",
|
||||
"host": "โฮสต์",
|
||||
"id": "บัตรประจำตัวประชาชน",
|
||||
"import": "นำเข้า",
|
||||
"limit": "ขีดจำกัด",
|
||||
"offset": "ออฟเซ็ต",
|
||||
"open": "เปิด",
|
||||
"origin": "ต้นกำเนิด",
|
||||
"promptTokens": "โทเค็นพร้อมท์",
|
||||
"completionTokens": "โทเค็นการสำเร็จ",
|
||||
"totalTokens": "โทเค็นทั้งหมด",
|
||||
"rawModel": "โมเดลดิบ",
|
||||
"scope": "ขอบเขต",
|
||||
"skill": "ทักษะ",
|
||||
"sortBy": "เรียงตาม",
|
||||
"sortOrder": "เรียงลำดับ",
|
||||
"tab": "แท็บ",
|
||||
"text": "ข้อความ",
|
||||
"textarea": "พื้นที่ข้อความ",
|
||||
"tool": "เครื่องมือ",
|
||||
"toolId": "รหัสเครื่องมือ",
|
||||
"web": "เว็บ",
|
||||
"whereUsed": "ใช้ที่ไหน",
|
||||
"whitelist": "ไวท์ลิสต์",
|
||||
"blacklist": "บัญชีดำ",
|
||||
"resolve": "แก้ไข",
|
||||
"force": "บังคับ",
|
||||
"base64url": "URL Base64",
|
||||
"hex": "ฐานสิบหก",
|
||||
"range": "พิสัย",
|
||||
"component": "ส่วนประกอบ",
|
||||
"redirect_uri": "เปลี่ยนเส้นทาง URI",
|
||||
"idempotency-key": "คีย์ Idempotency",
|
||||
"error_description": "คำอธิบายข้อผิดพลาด",
|
||||
"code": "รหัส",
|
||||
"compatible": "เข้ากันได้",
|
||||
"chat-completions": "เสร็จสิ้นการแชท",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "โทเค็นการรับรองความถูกต้อง",
|
||||
"crypto": "การเข้ารหัสลับ",
|
||||
"hours": "ชั่วโมง",
|
||||
"selfsigned": "ลงนามด้วยตนเอง",
|
||||
"proxy_id": "รหัสพร็อกซี",
|
||||
"proxyId": "รหัสพร็อกซี",
|
||||
"connectionId": "รหัสการเชื่อมต่อ",
|
||||
"resolveConnectionId": "แก้ไขรหัสการเชื่อมต่อ",
|
||||
"resolve_connection_id": "แก้ไขรหัสการเชื่อมต่อ",
|
||||
"scope_id": "รหัสขอบเขต",
|
||||
"scopeId": "รหัสขอบเขต",
|
||||
"jwtSecret": "ความลับเจดับเบิ้ลยูที",
|
||||
"keytar": "คีย์ตาร์",
|
||||
"better-sqlite3": "ดีกว่า-sqlite3",
|
||||
"undici": "อูนดิ",
|
||||
"builder-id": "รหัสผู้สร้าง",
|
||||
"musicDesc": "คำอธิบายเพลง",
|
||||
"musicGeneration": "ดนตรีเจเนอเรชั่น",
|
||||
"idc": "ไอดีซี",
|
||||
"cloud-status-changed": "สถานะคลาวด์เปลี่ยนไป",
|
||||
"where_used": "ใช้ที่ไหน",
|
||||
"windowMs": "หน้าต่าง (มิลลิวินาที)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "กูเกิล",
|
||||
"TOOL_ALLOWLIST": "รายการที่อนุญาตของเครื่องมือ",
|
||||
"TOOL_DENYLIST": "รายการเครื่องมือที่ปฏิเสธ",
|
||||
"Failed to save pricing": "บันทึกราคาไม่สำเร็จ",
|
||||
"Failed to reset pricing": "ไม่สามารถรีเซ็ตราคาได้",
|
||||
"apikey": "คีย์ API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "บ้าน",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} ความต้องการ",
|
||||
"providerModelsTitle": "{provider} - โมเดล",
|
||||
"copiedModel": "คัดลอก: {model}",
|
||||
"aliasLabel": "นามแฝง"
|
||||
"aliasLabel": "นามแฝง",
|
||||
"updateNow": "อัปเดตทันที",
|
||||
"updating": "กำลังอัปเดต...",
|
||||
"updateAvailableDesc": "มีเวอร์ชันใหม่ให้ใช้งานแล้ว คลิกเพื่ออัปเดต",
|
||||
"updateStarted": "เริ่มการอัพเดต..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "การวิเคราะห์",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "เพิ่มการกำหนดค่าโมเดล",
|
||||
"desc": "เพิ่มการกำหนดค่าต่อไปนี้ให้กับอาร์เรย์โมเดลของคุณ:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "ใช้ไฟล์กำหนดค่า JSON ต่อไป"
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode ต้องมีการกำหนดค่าคีย์ API",
|
||||
"1": "ตั้งค่า URL พื้นฐานเป็นจุดสิ้นสุด OmniRoute ของคุณ"
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro ต้องการบัญชี Amazon"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "ซิงค์อัตโนมัติ",
|
||||
"autoSyncTooltip": "รีเฟรชรายการโมเดลโดยอัตโนมัติทุกๆ 24 ชั่วโมง (กำหนดค่าได้ผ่าน MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "เปิดใช้งานการซิงค์อัตโนมัติ — โมเดลจะรีเฟรชเป็นระยะ",
|
||||
"autoSyncDisabled": "ปิดใช้งานการซิงค์อัตโนมัติแล้ว",
|
||||
"autoSyncToggleFailed": "ไม่สามารถสลับการซิงค์อัตโนมัติ",
|
||||
"clearAllModels": "ล้างทุกรุ่น",
|
||||
"clearAllModelsConfirm": "คุณแน่ใจหรือไม่ว่าต้องการลบโมเดลทั้งหมดสำหรับผู้ให้บริการรายนี้ สิ่งนี้ไม่สามารถยกเลิกได้",
|
||||
"clearAllModelsSuccess": "เคลียร์ทุกรุ่น",
|
||||
"clearAllModelsFailed": "ไม่สามารถล้างโมเดลได้"
|
||||
},
|
||||
"settings": {
|
||||
"title": "การตั้งค่า",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "รีสตาร์ทเซิร์ฟเวอร์ - จะใช้รหัสผ่านใหม่",
|
||||
"backToLogin": "กลับไปที่เข้าสู่ระบบ",
|
||||
"forgotPassword": "ลืมรหัสผ่าน?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "การอนุญาต",
|
||||
"Content-Disposition": "การจัดการเนื้อหา",
|
||||
"waitingForAuthorization": "กำลังรอการอนุญาต...",
|
||||
"waitingForGoogleAuthorization": "กำลังรอการอนุญาตจาก Google...",
|
||||
"waitingForOpenAIAuthorization": "กำลังรอการอนุญาต OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "กำลังรอการอนุญาตต้านแรงโน้มถ่วง...",
|
||||
"waitingForIFlowAuthorization": "กำลังรอการอนุญาตจาก iFlow...",
|
||||
"exchangingCodeForTokens": "การเปลี่ยนรหัสเป็นโทเค็น..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "การสร้างข้อความเป็นคำพูด (ElevenLabs, OpenAI TTS)",
|
||||
"endpointEmbeddingsNote": "การสร้างการฝังข้อความ (OpenAI, Cohere, Voyage)"
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "นโยบายความเป็นส่วนตัว",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "แชทง่ายๆ",
|
||||
"streaming": "สตรีมมิ่ง",
|
||||
"system-prompt": "พร้อมท์ระบบ",
|
||||
"thinking": "กำลังคิด",
|
||||
"tool-calling": "การเรียกเครื่องมือ",
|
||||
"multi-turn": "หลายเลี้ยว"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "เทมเพลตการแชทพื้นฐานพร้อมข้อความระบบ",
|
||||
"streaming": "เทมเพลตสำหรับการตอบกลับแบบสตรีม",
|
||||
"system-prompt": "เทมเพลตพร้อมแจ้งระบบแบบกำหนดเอง",
|
||||
"thinking": "เทมเพลตพร้อมงบประมาณการใช้เหตุผล/การคิด",
|
||||
"tool-calling": "เทมเพลตสำหรับการเรียกใช้เครื่องมือ/ฟังก์ชัน",
|
||||
"multi-turn": "เทมเพลตสำหรับการสนทนาหลายรอบ"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "คุณเป็นผู้ช่วย AI ที่เป็นประโยชน์",
|
||||
"userGreeting": "สวัสดี! วันนี้ฉันจะช่วยคุณได้อย่างไร?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "เขียนเรื่องราวเกี่ยวกับ"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "ความหมายของชีวิตคืออะไร?",
|
||||
"systemInstruction": "ให้คำตอบที่รอบคอบและมีปรัชญา"
|
||||
},
|
||||
"thinking": {
|
||||
"question": "อธิบายการคำนวณควอนตัม"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "ชื่อเมืองที่จะเรียกสภาพอากาศ",
|
||||
"toolDescription": "รับสภาพอากาศปัจจุบันสำหรับสถานที่",
|
||||
"userWeather": "สภาพอากาศในโตเกียวเป็นอย่างไร?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "คุณเป็นผู้ช่วยที่เป็นประโยชน์",
|
||||
"assistantExample": "เรายินดีที่จะช่วยเหลือคุณในเรื่องนั้น",
|
||||
"userInitial": "ฉันต้องการความช่วยเหลือเกี่ยวกับ",
|
||||
"userFollowUp": "คุณช่วยอธิบายรายละเอียดเกี่ยวกับเรื่องนั้นได้ไหม?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +58,85 @@
|
||||
"free": "безкоштовно",
|
||||
"skipToContent": "Перейти до вмісту",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "прийняти",
|
||||
"accountId": "ID облікового запису",
|
||||
"alias": "Псевдонім",
|
||||
"apiKeyId": "Ідентифікатор ключа API",
|
||||
"apiKeyName": "Назва ключа API",
|
||||
"apiKeySecret": "Секретний ключ API",
|
||||
"authorization": "Авторизація",
|
||||
"content-type": "Тип вмісту",
|
||||
"content-length": "Довжина вмісту",
|
||||
"cookie": "Печиво",
|
||||
"file": "Файл",
|
||||
"host": "Хост",
|
||||
"id": "ID",
|
||||
"import": "Імпорт",
|
||||
"limit": "Ліміт",
|
||||
"offset": "Зсув",
|
||||
"open": "відкритий",
|
||||
"origin": "Походження",
|
||||
"promptTokens": "Жетони підказок",
|
||||
"completionTokens": "Жетони завершення",
|
||||
"totalTokens": "Загальна кількість токенів",
|
||||
"rawModel": "Необроблена модель",
|
||||
"scope": "Область застосування",
|
||||
"skill": "Майстерність",
|
||||
"sortBy": "Сортувати за",
|
||||
"sortOrder": "Порядок сортування",
|
||||
"tab": "вкладка",
|
||||
"text": "текст",
|
||||
"textarea": "Текстове поле",
|
||||
"tool": "Інструмент",
|
||||
"toolId": "ID інструменту",
|
||||
"web": "Інтернет",
|
||||
"whereUsed": "Де використовується",
|
||||
"whitelist": "Білий список",
|
||||
"blacklist": "Чорний список",
|
||||
"resolve": "Розв'язати",
|
||||
"force": "Сила",
|
||||
"base64url": "URL-адреса Base64",
|
||||
"hex": "Hex",
|
||||
"range": "Діапазон",
|
||||
"component": "компонент",
|
||||
"redirect_uri": "URI перенаправлення",
|
||||
"idempotency-key": "Ідемпотентний ключ",
|
||||
"error_description": "Опис помилки",
|
||||
"code": "Код",
|
||||
"compatible": "сумісний",
|
||||
"chat-completions": "Завершення чату",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Маркер авторизації",
|
||||
"crypto": "Крипто",
|
||||
"hours": "години",
|
||||
"selfsigned": "Самопідписаний",
|
||||
"proxy_id": "ID проксі",
|
||||
"proxyId": "ID проксі",
|
||||
"connectionId": "ID підключення",
|
||||
"resolveConnectionId": "Вирішити ідентифікатор підключення",
|
||||
"resolve_connection_id": "Вирішити ідентифікатор підключення",
|
||||
"scope_id": "Ідентифікатор області",
|
||||
"scopeId": "Ідентифікатор області",
|
||||
"jwtSecret": "Секрет JWT",
|
||||
"keytar": "Keytar",
|
||||
"better-sqlite3": "краще-sqlite3",
|
||||
"undici": "undici",
|
||||
"builder-id": "ID забудовника",
|
||||
"musicDesc": "Опис музики",
|
||||
"musicGeneration": "Музичне покоління",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Статус хмари змінено",
|
||||
"where_used": "Де використовується",
|
||||
"windowMs": "Вікно (мс)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Білий список інструментів",
|
||||
"TOOL_DENYLIST": "Інструмент Denylist",
|
||||
"Failed to save pricing": "Не вдалося зберегти ціни",
|
||||
"Failed to reset pricing": "Не вдалося скинути ціни",
|
||||
"apikey": "Ключ API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "додому",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} вимагається",
|
||||
"providerModelsTitle": "{provider} - Моделі",
|
||||
"copiedModel": "Скопійовано: {model}",
|
||||
"aliasLabel": "псевдонім"
|
||||
"aliasLabel": "псевдонім",
|
||||
"updateNow": "Оновити зараз",
|
||||
"updating": "Оновлення...",
|
||||
"updateAvailableDesc": "Доступна нова версія. Натисніть, щоб оновити.",
|
||||
"updateStarted": "Оновлення розпочато..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Аналітика",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Додати конфігурацію моделі",
|
||||
"desc": "Додайте таку конфігурацію до свого масиву моделей:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Продовжити використання файлу конфігурації JSON."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode вимагає налаштування ключа API.",
|
||||
"1": "Установіть базову URL-адресу для кінцевої точки OmniRoute."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro потрібен обліковий запис Amazon."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Автоматична синхронізація",
|
||||
"autoSyncTooltip": "Автоматично оновлювати список моделей кожні 24 години (налаштовується через MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Автоматична синхронізація ввімкнена — моделі періодично оновлюватимуться",
|
||||
"autoSyncDisabled": "Автоматична синхронізація вимкнена",
|
||||
"autoSyncToggleFailed": "Не вдалося вимкнути автоматичну синхронізацію",
|
||||
"clearAllModels": "Очистити всі моделі",
|
||||
"clearAllModelsConfirm": "Ви впевнені, що хочете видалити всі моделі цього постачальника? Це неможливо скасувати.",
|
||||
"clearAllModelsSuccess": "Всі моделі розмитнені",
|
||||
"clearAllModelsFailed": "Не вдалося очистити моделі"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Налаштування",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Перезапустіть сервер - він використовуватиме новий пароль",
|
||||
"backToLogin": "Назад до входу",
|
||||
"forgotPassword": "Забули пароль?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Авторизація",
|
||||
"Content-Disposition": "Зміст-диспозиція",
|
||||
"waitingForAuthorization": "Очікування авторизації...",
|
||||
"waitingForGoogleAuthorization": "Очікування авторизації Google...",
|
||||
"waitingForOpenAIAuthorization": "Очікування авторизації OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "Очікування авторизації Antigravity...",
|
||||
"waitingForIFlowAuthorization": "Очікування авторизації iFlow...",
|
||||
"exchangingCodeForTokens": "Обмін коду на токени..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Синтез мовлення (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Генерація вбудованого тексту (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Політика конфіденційності",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Простий чат",
|
||||
"streaming": "Потокове передавання",
|
||||
"system-prompt": "Системна підказка",
|
||||
"thinking": "Мислення",
|
||||
"tool-calling": "Виклик інструменту",
|
||||
"multi-turn": "Багатооборотний"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Базовий шаблон чату з системним повідомленням",
|
||||
"streaming": "Шаблон для потокових відповідей",
|
||||
"system-prompt": "Шаблон із спеціальним системним запитом",
|
||||
"thinking": "Шаблон із бюджетом міркувань/роздумів",
|
||||
"tool-calling": "Шаблон для виклику інструменту/функції",
|
||||
"multi-turn": "Шаблон для багаточергових розмов"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Ви корисний помічник ШІ.",
|
||||
"userGreeting": "Привіт! Чим я можу тобі допомогти сьогодні?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Написати розповідь про"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "У чому сенс життя?",
|
||||
"systemInstruction": "Дайте вдумливу, філософську відповідь."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Поясніть квантові обчислення"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Назва міста, для якого потрібно дізнатися погоду",
|
||||
"toolDescription": "Отримайте поточну погоду для певного місця",
|
||||
"userWeather": "Яка погода в Токіо?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Ви корисний помічник.",
|
||||
"assistantExample": "Я буду радий тобі в цьому допомогти.",
|
||||
"userInitial": "Мені потрібна допомога з",
|
||||
"userFollowUp": "Чи можете ви розповісти про це?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+159
-5
@@ -58,7 +58,85 @@
|
||||
"free": "miễn phí",
|
||||
"skipToContent": "Chuyển đến nội dung",
|
||||
"maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting..."
|
||||
"maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
|
||||
"accept": "Chấp nhận",
|
||||
"accountId": "ID tài khoản",
|
||||
"alias": "Bí danh",
|
||||
"apiKeyId": "ID khóa API",
|
||||
"apiKeyName": "Tên khóa API",
|
||||
"apiKeySecret": "Bí mật khóa API",
|
||||
"authorization": "Ủy quyền",
|
||||
"content-type": "Loại nội dung",
|
||||
"content-length": "Độ dài nội dung",
|
||||
"cookie": "bánh quy",
|
||||
"file": "tập tin",
|
||||
"host": "Máy chủ",
|
||||
"id": "ID",
|
||||
"import": "Nhập khẩu",
|
||||
"limit": "giới hạn",
|
||||
"offset": "Bù đắp",
|
||||
"open": "Mở",
|
||||
"origin": "Xuất xứ",
|
||||
"promptTokens": "Mã thông báo nhắc nhở",
|
||||
"completionTokens": "Mã thông báo hoàn thành",
|
||||
"totalTokens": "Tổng số token",
|
||||
"rawModel": "Mô hình thô",
|
||||
"scope": "Phạm vi",
|
||||
"skill": "kỹ năng",
|
||||
"sortBy": "Sắp xếp theo",
|
||||
"sortOrder": "Sắp xếp thứ tự",
|
||||
"tab": "Thẻ",
|
||||
"text": "văn bản",
|
||||
"textarea": "Vùng văn bản",
|
||||
"tool": "Công cụ",
|
||||
"toolId": "Mã công cụ",
|
||||
"web": "Web",
|
||||
"whereUsed": "Nơi sử dụng",
|
||||
"whitelist": "Danh sách trắng",
|
||||
"blacklist": "Danh sách đen",
|
||||
"resolve": "giải quyết",
|
||||
"force": "Lực lượng",
|
||||
"base64url": "URL Base64",
|
||||
"hex": "lục giác",
|
||||
"range": "Phạm vi",
|
||||
"component": "thành phần",
|
||||
"redirect_uri": "URI chuyển hướng",
|
||||
"idempotency-key": "Chìa khóa bình đẳng",
|
||||
"error_description": "Mô tả lỗi",
|
||||
"code": "Mã",
|
||||
"compatible": "Tương thích",
|
||||
"chat-completions": "Hoàn thành cuộc trò chuyện",
|
||||
"oauth": "OAuth",
|
||||
"auth_token": "Mã thông báo xác thực",
|
||||
"crypto": "tiền điện tử",
|
||||
"hours": "Giờ",
|
||||
"selfsigned": "Tự ký",
|
||||
"proxy_id": "ID proxy",
|
||||
"proxyId": "ID proxy",
|
||||
"connectionId": "ID kết nối",
|
||||
"resolveConnectionId": "Giải quyết ID kết nối",
|
||||
"resolve_connection_id": "Giải quyết ID kết nối",
|
||||
"scope_id": "ID phạm vi",
|
||||
"scopeId": "ID phạm vi",
|
||||
"jwtSecret": "Bí mật JWT",
|
||||
"keytar": "Bàn phím",
|
||||
"better-sqlite3": "tốt hơn-sqlite3",
|
||||
"undici": "undic",
|
||||
"builder-id": "ID người xây dựng",
|
||||
"musicDesc": "Mô tả âm nhạc",
|
||||
"musicGeneration": "Thế hệ âm nhạc",
|
||||
"idc": "IDC",
|
||||
"cloud-status-changed": "Trạng thái đám mây đã thay đổi",
|
||||
"where_used": "Nơi sử dụng",
|
||||
"windowMs": "Cửa sổ (ms)",
|
||||
"social-github": "GitHub",
|
||||
"social-google": "Google",
|
||||
"TOOL_ALLOWLIST": "Danh sách cho phép của công cụ",
|
||||
"TOOL_DENYLIST": "Danh sách từ chối công cụ",
|
||||
"Failed to save pricing": "Không lưu được giá",
|
||||
"Failed to reset pricing": "Không thể đặt lại giá",
|
||||
"apikey": "Khóa API",
|
||||
"http": "HTTP"
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "Trang chủ",
|
||||
@@ -179,7 +257,11 @@
|
||||
"requestsShort": "{count} yêu cầu",
|
||||
"providerModelsTitle": "{provider} - Người mẫu",
|
||||
"copiedModel": "Đã sao chép: {model}",
|
||||
"aliasLabel": "bí danh"
|
||||
"aliasLabel": "bí danh",
|
||||
"updateNow": "Cập nhật ngay",
|
||||
"updating": "Đang cập nhật...",
|
||||
"updateAvailableDesc": "Một phiên bản mới có sẵn. Nhấn vào đây để cập nhật.",
|
||||
"updateStarted": "Đã bắt đầu cập nhật..."
|
||||
},
|
||||
"analytics": {
|
||||
"title": "Phân tích",
|
||||
@@ -535,6 +617,9 @@
|
||||
"title": "Thêm cấu hình mô hình",
|
||||
"desc": "Thêm cấu hình sau vào mảng mô hình của bạn:"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Tiếp tục sử dụng tệp cấu hình JSON."
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
@@ -553,6 +638,10 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "OpenCode yêu cầu cấu hình khóa API.",
|
||||
"1": "Đặt URL cơ sở cho điểm cuối OmniRoute của bạn."
|
||||
}
|
||||
},
|
||||
"kiro": {
|
||||
@@ -571,6 +660,9 @@
|
||||
"4": {
|
||||
"title": "Select Model"
|
||||
}
|
||||
},
|
||||
"notes": {
|
||||
"0": "Kiro yêu cầu tài khoản Amazon."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1477,7 +1569,16 @@
|
||||
"compatUpstreamHeaderValue": "Value",
|
||||
"compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
|
||||
"compatUpstreamHeadersLabel": "Extra upstream headers",
|
||||
"compatUpstreamRemoveRow": "Remove row"
|
||||
"compatUpstreamRemoveRow": "Remove row",
|
||||
"autoSync": "Tự động đồng bộ hóa",
|
||||
"autoSyncTooltip": "Tự động làm mới danh sách mô hình sau mỗi 24 giờ (có thể định cấu hình qua MODEL_SYNC_INTERVAL_HOURS)",
|
||||
"autoSyncEnabled": "Đã bật tự động đồng bộ hóa - các mô hình sẽ làm mới định kỳ",
|
||||
"autoSyncDisabled": "Tự động đồng bộ hóa đã bị tắt",
|
||||
"autoSyncToggleFailed": "Không chuyển đổi được tính năng tự động đồng bộ hóa",
|
||||
"clearAllModels": "Xóa tất cả các mẫu",
|
||||
"clearAllModelsConfirm": "Bạn có chắc chắn muốn xóa tất cả mô hình của nhà cung cấp này không? Điều này không thể hoàn tác được.",
|
||||
"clearAllModelsSuccess": "Tất cả các mô hình đã bị xóa",
|
||||
"clearAllModelsFailed": "Không xóa được mô hình"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Cài đặt",
|
||||
@@ -2304,7 +2405,15 @@
|
||||
"restartServerWithNewPassword": "Khởi động lại máy chủ - nó sẽ sử dụng mật khẩu mới",
|
||||
"backToLogin": "Quay lại đăng nhập",
|
||||
"forgotPassword": "Quên mật khẩu?",
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)"
|
||||
"defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
|
||||
"Authorization": "Ủy quyền",
|
||||
"Content-Disposition": "Bố trí nội dung",
|
||||
"waitingForAuthorization": "Đang chờ cấp phép...",
|
||||
"waitingForGoogleAuthorization": "Đang chờ Google ủy quyền...",
|
||||
"waitingForOpenAIAuthorization": "Đang chờ ủy quyền OpenAI...",
|
||||
"waitingForAntigravityAuthorization": "Đang chờ ủy quyền chống hấp dẫn...",
|
||||
"waitingForIFlowAuthorization": "Đang chờ ủy quyền iFlow...",
|
||||
"exchangingCodeForTokens": "Đổi mã lấy token..."
|
||||
},
|
||||
"landing": {
|
||||
"brandName": "OmniRoute",
|
||||
@@ -2511,7 +2620,9 @@
|
||||
"mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
|
||||
"mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
|
||||
"mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments."
|
||||
"mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
|
||||
"endpointSpeechNote": "Tạo văn bản thành giọng nói (ElevenLabs, OpenAI TTS).",
|
||||
"endpointEmbeddingsNote": "Tạo nhúng văn bản (OpenAI, Cohere, Voyage)."
|
||||
},
|
||||
"legal": {
|
||||
"privacyPolicy": "Chính sách bảo mật",
|
||||
@@ -2689,5 +2800,48 @@
|
||||
"domainPlaceholder": "example.com",
|
||||
"requestTimedOut": "Request timed out ({seconds}s)",
|
||||
"networkError": "Network error"
|
||||
},
|
||||
"templateNames": {
|
||||
"simple-chat": "Trò chuyện đơn giản",
|
||||
"streaming": "Truyền phát",
|
||||
"system-prompt": "Lời nhắc hệ thống",
|
||||
"thinking": "suy nghĩ",
|
||||
"tool-calling": "Gọi công cụ",
|
||||
"multi-turn": "Nhiều lượt"
|
||||
},
|
||||
"templateDescriptions": {
|
||||
"simple-chat": "Mẫu chat cơ bản kèm tin nhắn hệ thống",
|
||||
"streaming": "Mẫu để truyền phát phản hồi",
|
||||
"system-prompt": "Mẫu có lời nhắc hệ thống tùy chỉnh",
|
||||
"thinking": "Mẫu có ngân sách lý luận/suy nghĩ",
|
||||
"tool-calling": "Mẫu để gọi công cụ/chức năng",
|
||||
"multi-turn": "Mẫu hội thoại nhiều lượt"
|
||||
},
|
||||
"templatePayloads": {
|
||||
"simpleChat": {
|
||||
"system": "Bạn là một trợ lý AI hữu ích.",
|
||||
"userGreeting": "Xin chào! Hôm nay tôi có thể giúp gì cho bạn?"
|
||||
},
|
||||
"streaming": {
|
||||
"prompt": "Viết một câu chuyện về"
|
||||
},
|
||||
"systemPrompt": {
|
||||
"question": "Ý nghĩa của cuộc sống là gì?",
|
||||
"systemInstruction": "Đưa ra một câu trả lời sâu sắc và mang tính triết lý."
|
||||
},
|
||||
"thinking": {
|
||||
"question": "Giải thích tính toán lượng tử"
|
||||
},
|
||||
"toolCalling": {
|
||||
"cityNameDescription": "Tên của thành phố để biết thời tiết",
|
||||
"toolDescription": "Nhận thời tiết hiện tại cho một địa điểm",
|
||||
"userWeather": "Thời tiết ở Tokyo thế nào?"
|
||||
},
|
||||
"multiTurn": {
|
||||
"system": "Bạn là một trợ lý hữu ích.",
|
||||
"assistantExample": "Tôi rất vui được giúp bạn việc đó.",
|
||||
"userInitial": "Tôi cần giúp đỡ với",
|
||||
"userFollowUp": "Bạn có thể giải thích về điều đó?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ export async function createCombo(data: JsonRecord) {
|
||||
models: data.models || [],
|
||||
strategy: data.strategy || "priority",
|
||||
config: data.config || {},
|
||||
isHidden: Boolean(data.isHidden),
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
};
|
||||
|
||||
@@ -110,6 +110,7 @@ export type ModelCompatOverride = {
|
||||
preserveOpenAIDeveloperRole?: boolean;
|
||||
compatByProtocol?: CompatByProtocolMap;
|
||||
upstreamHeaders?: Record<string, string>;
|
||||
isHidden?: boolean;
|
||||
};
|
||||
|
||||
function readCompatList(providerId: string): ModelCompatOverride[] {
|
||||
@@ -154,6 +155,7 @@ export type ModelCompatPatch = {
|
||||
compatByProtocol?: CompatByProtocolMap;
|
||||
/** Replace top-level extra headers for override-only rows; omit to leave unchanged. */
|
||||
upstreamHeaders?: Record<string, string> | null;
|
||||
isHidden?: boolean | null;
|
||||
};
|
||||
|
||||
function compatByProtocolHasEntries(map: CompatByProtocolMap | undefined): boolean {
|
||||
@@ -201,9 +203,18 @@ export function mergeModelCompatOverride(
|
||||
const filtered = list.filter((e) => e.id !== modelId);
|
||||
const hasPreserveFlag = Object.prototype.hasOwnProperty.call(next, "preserveOpenAIDeveloperRole");
|
||||
const hasTopUpstream = next.upstreamHeaders && Object.keys(next.upstreamHeaders).length > 0;
|
||||
if ("isHidden" in patch) {
|
||||
if (patch.isHidden === null) {
|
||||
delete next.isHidden;
|
||||
} else {
|
||||
next.isHidden = Boolean(patch.isHidden);
|
||||
}
|
||||
}
|
||||
const hasHiddenFlag = Object.prototype.hasOwnProperty.call(next, "isHidden");
|
||||
if (
|
||||
next.normalizeToolCallId ||
|
||||
hasPreserveFlag ||
|
||||
hasHiddenFlag ||
|
||||
compatByProtocolHasEntries(next.compatByProtocol) ||
|
||||
hasTopUpstream
|
||||
) {
|
||||
@@ -507,6 +518,7 @@ export async function updateCustomModel(
|
||||
...(updates.normalizeToolCallId !== undefined
|
||||
? { normalizeToolCallId: Boolean(updates.normalizeToolCallId) }
|
||||
: {}),
|
||||
...(updates.isHidden !== undefined ? { isHidden: Boolean(updates.isHidden) } : {}),
|
||||
};
|
||||
if (Object.prototype.hasOwnProperty.call(updates, "preserveOpenAIDeveloperRole")) {
|
||||
if (updates.preserveOpenAIDeveloperRole === null) {
|
||||
@@ -638,6 +650,18 @@ export function getModelPreserveOpenAIDeveloperRole(
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the model is flagged as hidden from the public catalog.
|
||||
*/
|
||||
export function getModelIsHidden(providerId: string, modelId: string): boolean {
|
||||
const m = getCustomModelRow(providerId, modelId);
|
||||
if (m && Object.prototype.hasOwnProperty.call(m, "isHidden")) {
|
||||
return Boolean(m.isHidden);
|
||||
}
|
||||
const co = readCompatList(providerId).find((e) => e.id === modelId);
|
||||
return Boolean(co?.isHidden);
|
||||
}
|
||||
|
||||
function readUpstreamFromJsonRecord(
|
||||
row: JsonRecord | null | undefined,
|
||||
key: "upstreamHeaders"
|
||||
|
||||
@@ -57,6 +57,7 @@ export {
|
||||
getModelNormalizeToolCallId,
|
||||
getModelPreserveOpenAIDeveloperRole,
|
||||
getModelUpstreamExtraHeaders,
|
||||
getModelIsHidden,
|
||||
} from "./db/models";
|
||||
|
||||
export type { ModelCompatPerProtocol, ModelCompatPatch } from "./db/models";
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
const { translateRequest } = await import("../../open-sse/translator/index.ts");
|
||||
const { FORMATS } = await import("../../open-sse/translator/formats.ts");
|
||||
|
||||
test("Claude native passthrough normalization keeps original tool names", () => {
|
||||
const body = {
|
||||
model: "claude-sonnet-4-6",
|
||||
max_tokens: 64,
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: [{ type: "text", text: "Write a todo item" }],
|
||||
},
|
||||
],
|
||||
tools: [
|
||||
{
|
||||
name: "TodoWrite",
|
||||
description: "Create or update a todo list",
|
||||
input_schema: {
|
||||
type: "object",
|
||||
properties: {
|
||||
todos: {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
},
|
||||
},
|
||||
required: ["todos"],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const openaiBody = translateRequest(
|
||||
FORMATS.CLAUDE,
|
||||
FORMATS.OPENAI,
|
||||
body.model,
|
||||
structuredClone(body),
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
// The translated body should have function wrappers with the original name
|
||||
assert.ok(Array.isArray(openaiBody.tools), "tools should be an array");
|
||||
const tool = openaiBody.tools[0];
|
||||
assert.ok(tool.function, "tool should have a function wrapper");
|
||||
assert.ok(
|
||||
tool.function.name === "TodoWrite" || tool.function.name === "proxy_TodoWrite",
|
||||
`tool name should be preserved or prefixed, got: ${tool.function.name}`
|
||||
);
|
||||
});
|
||||
|
||||
test("Claude-to-Claude passthrough should not alter tool names", () => {
|
||||
const body = {
|
||||
model: "claude-sonnet-4-6",
|
||||
max_tokens: 64,
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: [{ type: "text", text: "Write a todo item" }],
|
||||
},
|
||||
],
|
||||
tools: [
|
||||
{
|
||||
name: "TodoWrite",
|
||||
description: "Create or update a todo list",
|
||||
input_schema: {
|
||||
type: "object",
|
||||
properties: {
|
||||
todos: {
|
||||
type: "array",
|
||||
items: { type: "string" },
|
||||
},
|
||||
},
|
||||
required: ["todos"],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const result = translateRequest(
|
||||
FORMATS.CLAUDE,
|
||||
FORMATS.CLAUDE,
|
||||
body.model,
|
||||
structuredClone(body),
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
// Claude-to-Claude should preserve tool names
|
||||
assert.ok(Array.isArray(result.tools), "tools should be an array");
|
||||
assert.equal(result.tools[0].name, "TodoWrite", "tool name should stay unchanged for Claude-to-Claude");
|
||||
});
|
||||
@@ -0,0 +1,72 @@
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert";
|
||||
import { hasValuableContent } from "../../open-sse/utils/streamHelpers.ts";
|
||||
import { FORMATS } from "../../open-sse/translator/formats.ts";
|
||||
|
||||
describe("hasValuableContent", () => {
|
||||
describe("OpenAI format", () => {
|
||||
it("returns true for content with text", () => {
|
||||
const chunk = { choices: [{ delta: { content: "Hello" } }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.OPENAI), true);
|
||||
});
|
||||
|
||||
it("returns false for empty delta", () => {
|
||||
const chunk = { choices: [{ delta: {} }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.OPENAI), false);
|
||||
});
|
||||
|
||||
it("returns false for delta with empty string content", () => {
|
||||
const chunk = { choices: [{ delta: { content: "" } }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.OPENAI), false);
|
||||
});
|
||||
|
||||
it("returns true for reasoning_content", () => {
|
||||
const chunk = { choices: [{ delta: { reasoning_content: "thinking" } }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.OPENAI), true);
|
||||
});
|
||||
|
||||
it("returns true for finish_reason", () => {
|
||||
const chunk = { choices: [{ delta: {}, finish_reason: "stop" }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.OPENAI), true);
|
||||
});
|
||||
|
||||
it("returns true for role delta", () => {
|
||||
const chunk = { choices: [{ delta: { role: "assistant" } }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.OPENAI), true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Claude format", () => {
|
||||
it("returns true for content_block_delta with text", () => {
|
||||
const chunk = { type: "content_block_delta", delta: { text: "Hello" } };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.CLAUDE), true);
|
||||
});
|
||||
|
||||
it("returns false for empty content_block_delta", () => {
|
||||
const chunk = { type: "content_block_delta", delta: {} };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.CLAUDE), false);
|
||||
});
|
||||
|
||||
it("returns true for thinking blocks", () => {
|
||||
const chunk = { type: "content_block_delta", delta: { thinking: "reasoning" } };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.CLAUDE), true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Gemini format", () => {
|
||||
it("returns true for content with text", () => {
|
||||
const chunk = { candidates: [{ content: { parts: [{ text: "Hello" }] } }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.GEMINI), true);
|
||||
});
|
||||
|
||||
it("returns false for empty parts", () => {
|
||||
const chunk = { candidates: [{ content: { parts: [] } }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.GEMINI), false);
|
||||
});
|
||||
|
||||
it("returns true for finishReason", () => {
|
||||
const chunk = { candidates: [{ finishReason: "STOP" }] };
|
||||
assert.strictEqual(hasValuableContent(chunk, FORMATS.GEMINI), true);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user