Merge branch 'main' into fix/gateway-negative-prices

This commit is contained in:
Christiaan Arnoldus
2026-08-10 13:45:34 +02:00
committed by GitHub
41 changed files with 433 additions and 1222 deletions
@@ -0,0 +1,6 @@
---
"@kilocode/cli": patch
"kilo-code": patch
---
Automatically expose broad reasoning effort options for custom provider models and link saved providers to advanced JSON configuration.
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": minor
---
Support browsing an instance's model catalog before a session starts.
@@ -12,14 +12,7 @@ export const EnvSchema = z
.trim()
.regex(/^[A-Z_][A-Z0-9_]*$/, INVALID_ENV)
const VariantConfigSchema = z.object({
enable_thinking: z.boolean().optional(),
thinking: z.object({ type: z.enum(["enabled", "disabled", "adaptive"]) }).optional(),
reasoning_split: z.boolean().optional(),
reasoningEffort: z.enum(["none", "minimal", "low", "medium", "high", "xhigh"]).optional(),
effort: z.enum(["low", "medium", "high", "xhigh", "max"]).optional(),
chat_template_args: z.object({ enable_thinking: z.boolean() }).optional(),
})
const VariantConfigSchema = z.record(z.string(), z.unknown())
export type VariantConfig = z.infer<typeof VariantConfigSchema>
@@ -93,7 +93,7 @@ describe("validateCustomProvider variant name validation", () => {
]
const out = validateCustomProvider(args(form))
expect(out.result).toBeUndefined()
expect(out.errors.models[0].variants?.[0]?.name).toBe("provider.custom.error.required")
expect(out.errors.models[0].variants?.[0]?.name).toBe('variants[""]: provider.custom.error.required')
})
it("blocks submit and reports error when reasoning is enabled with a whitespace-only variant name", () => {
@@ -112,7 +112,7 @@ describe("validateCustomProvider variant name validation", () => {
]
const out = validateCustomProvider(args(form))
expect(out.result).toBeUndefined()
expect(out.errors.models[0].variants?.[0]?.name).toBe("provider.custom.error.required")
expect(out.errors.models[0].variants?.[0]?.name).toBe('variants[" "]: provider.custom.error.required')
})
it("blocks submit and reports duplicate error for two variants with the same name", () => {
@@ -140,7 +140,7 @@ describe("validateCustomProvider variant name validation", () => {
]
const out = validateCustomProvider(args(form))
expect(out.result).toBeUndefined()
expect(out.errors.models[0].variants?.[1]?.name).toBe("provider.custom.error.duplicate")
expect(out.errors.models[0].variants?.[1]?.name).toBe('variants["fast"]: provider.custom.error.duplicate')
})
it("ignores variants entirely when reasoning is disabled, even if they have empty names", () => {
@@ -206,6 +206,34 @@ describe("validateCustomProvider variant name validation", () => {
})
})
it("preserves opaque variant options after the editor controls are removed", () => {
const form = base()
const raw = {
thinking: { type: "adaptive", display: "summarized" },
reasoningSummary: "auto",
include: ["reasoning.encrypted_content"],
customOption: { enabled: true },
}
form.models[0].reasoning = true
form.models[0].variants = [
{
name: "high",
raw,
enableThinking: undefined,
thinking: "adaptive",
splitReasoning: undefined,
outputEffort: undefined,
reasoningEffort: undefined,
chatTemplateArgs: undefined,
},
]
const out = validateCustomProvider(args(form))
expect(out.result).toBeDefined()
const saved = out.result!.config.models["model-1"] as Record<string, unknown>
expect(saved.variants).toEqual({ high: raw })
})
it("serializes image modality when supportsImages is set", () => {
const form = base()
form.models[0].supportsImages = true
@@ -162,6 +162,35 @@ describe("sanitizeCustomProviderConfig", () => {
})
})
it("preserves opaque options on existing variants", () => {
const variant = {
thinking: { type: "adaptive", display: "summarized" },
reasoningEffort: "max",
reasoningSummary: "auto",
include: ["reasoning.encrypted_content"],
customOption: { enabled: true },
}
const result = sanitizeCustomProviderConfig({
name: "Thinking Provider",
options: { baseURL: "https://example.com/v1" },
models: {
"model-1": {
name: "Model One",
variants: { high: variant },
},
},
})
expect(result).toEqual({
value: {
npm: "@ai-sdk/openai-compatible",
name: "Thinking Provider",
options: { baseURL: "https://example.com/v1" },
models: { "model-1": { name: "Model One", variants: { high: variant } } },
},
})
})
it("preserves core custom model modalities", () => {
const result = sanitizeCustomProviderConfig({
name: "Media Provider",
@@ -0,0 +1,14 @@
import { describe, expect, it } from "bun:test"
import { configMessage } from "../../webview-ui/src/utils/open-config"
describe("configMessage", () => {
it("builds a global config request with localized labels", () => {
const message = configMessage("global", (key, params) => `${key}:${params?.scope ?? ""}`)
expect(message.type).toBe("openConfigFile")
expect(message.scope).toBe("global")
expect(message.labels.scope).toBe("settings.config.scope.global:")
expect(message.labels.title).toBe("settings.config.title:settings.config.scope.global:")
expect(message.labels.openFailed).toBe("settings.config.openFailed:settings.config.scope.global:")
})
})
@@ -206,6 +206,27 @@ describe("saveCustomProvider", () => {
expect(calls.set).toEqual([{ providerID: "myprovider", auth: { type: "api", key: "sk-test" } }])
})
it("preserves opaque existing variant options through the save boundary", async () => {
const variant = {
thinking: { type: "adaptive", display: "summarized" },
reasoningEffort: "custom",
reasoningSummary: "auto",
include: ["reasoning.encrypted_content"],
customOption: { enabled: true },
}
const saved = {
...createSavedProvider(),
models: { "model-1": { name: "Model One", reasoning: true, variants: { high: variant } } },
}
const existing = { disabled_providers: [], provider: { myprovider: saved } }
const { ctx, calls, setCachedConfig } = createCtx(existing)
await saveCustomProvider(ctx, "req", "myprovider", saved, undefined, false, null, setCachedConfig)
const provider = (calls.config[0]?.config.provider as Record<string, typeof saved>).myprovider
expect(provider.models["model-1"].variants.high).toEqual(variant)
})
// Regression tests for https://github.com/Kilo-Org/kilocode/issues/9186
//
// The CLI's config.update endpoint deep-merges its payload with the existing
@@ -15,6 +15,7 @@ import { useProvider } from "../../context/provider"
import { useVSCode } from "../../context/vscode"
import type { ExtensionMessage, ProviderAuthState, ProviderConfig } from "../../types/messages"
import { createProviderAction } from "../../utils/provider-action"
import { configMessage } from "../../utils/open-config"
import { MASKED_CUSTOM_PROVIDER_KEY, resolveCustomProviderKey } from "../../../../src/shared/custom-provider"
import {
CUSTOM_PROVIDER_PACKAGE,
@@ -89,6 +90,7 @@ function modes(raw: unknown): Modalities {
function parseVariant([name, cfg]: [string, Record<string, unknown>]): VariantEntry {
return {
name,
raw: cfg,
enableThinking: typeof cfg.enable_thinking === "boolean" ? cfg.enable_thinking : undefined,
thinking:
typeof cfg.thinking === "object" && cfg.thinking !== null
@@ -460,25 +462,6 @@ const CustomProviderDialog = (props: CustomProviderDialogProps) => {
setErrors("headers", (v) => v.filter((_, i) => i !== index))
}
function addVariant(mi: number) {
const blank: VariantEntry = {
name: "",
enableThinking: undefined,
thinking: undefined,
splitReasoning: undefined,
reasoningEffort: undefined,
outputEffort: undefined,
chatTemplateArgs: undefined,
}
setForm("models", mi, "variants", (v) => [...v, blank])
setErrors("models", mi, "variants", (v) => [...(v ?? []), {}])
}
function removeVariant(mi: number, vi: number) {
setForm("models", mi, "variants", (v) => v.filter((_, i) => i !== vi))
setErrors("models", mi, "variants", (v) => (v ?? []).filter((_, i) => i !== vi))
}
function validate() {
const output = validateCustomProvider({
form,
@@ -581,6 +564,19 @@ const CustomProviderDialog = (props: CustomProviderDialogProps) => {
{language.t("provider.custom.description.link")}
</a>
{language.t("provider.custom.description.suffix")}
<Show when={editing()}>
<div style={{ "margin-top": "8px" }}>
<a
href="#"
onClick={(e) => {
e.preventDefault()
vscode.postMessage(configMessage("global", language.t))
}}
>
{language.t("provider.custom.edit.advanced")}
</a>
</div>
</Show>
</div>
<div style={{ display: "flex", "flex-direction": "column", gap: "16px" }}>
@@ -673,7 +669,6 @@ const CustomProviderDialog = (props: CustomProviderDialogProps) => {
{(m, i) => (
<ModelCard
m={m}
i={i}
errors={errors.models[i()] ?? {}}
t={language.t}
canRemove={form.models.length > 1}
@@ -682,23 +677,6 @@ const CustomProviderDialog = (props: CustomProviderDialogProps) => {
onChangeReasoning={(v) => setForm("models", i(), "reasoning", v)}
onChangeSupportsImages={(v) => setForm("models", i(), "supportsImages", v)}
onRemove={() => removeModel(i())}
onAddVariant={() => addVariant(i())}
onRemoveVariant={(vi) => removeVariant(i(), vi)}
onChangeVariantName={(vi, val) => setForm("models", i(), "variants", vi, "name", val)}
onChangeVariantEnableThinking={(vi, val) =>
setForm("models", i(), "variants", vi, "enableThinking", val)
}
onChangeVariantThinking={(vi, val) => setForm("models", i(), "variants", vi, "thinking", val)}
onChangeVariantSplitReasoning={(vi, val) =>
setForm("models", i(), "variants", vi, "splitReasoning", val)
}
onChangeVariantReasoningEffort={(vi, val) =>
setForm("models", i(), "variants", vi, "reasoningEffort", val)
}
onChangeVariantOutputEffort={(vi, val) => setForm("models", i(), "variants", vi, "outputEffort", val)}
onChangeVariantChatTemplateArgs={(vi, val) =>
setForm("models", i(), "variants", vi, "chatTemplateArgs", val)
}
/>
)}
</For>
@@ -1,8 +1,6 @@
import { Button } from "@kilocode/kilo-ui/button"
import { IconButton } from "@kilocode/kilo-ui/icon-button"
import { Select } from "@kilocode/kilo-ui/select"
import { TextField } from "@kilocode/kilo-ui/text-field"
import { For, Show } from "solid-js"
import { Show } from "solid-js"
import { useLanguage } from "../../context/language"
export type Translator = ReturnType<typeof useLanguage>["t"]
@@ -23,6 +21,7 @@ export type Modalities = {
export type VariantEntry = {
name: string
raw?: Record<string, unknown>
enableThinking: EnableThinkingValue
thinking: ThinkingTypeValue
splitReasoning: SplitReasoningValue
@@ -40,264 +39,8 @@ export type ModelEntry = {
variants: VariantEntry[]
}
type SelectOption<T> = { value: T; labelKey: string }
const ENABLE_THINKING_OPTIONS: SelectOption<EnableThinkingValue>[] = [
{ value: undefined, labelKey: "provider.custom.models.variants.option.unset" },
{ value: true, labelKey: "provider.custom.models.variants.enableThinking.true" },
{ value: false, labelKey: "provider.custom.models.variants.enableThinking.false" },
]
const THINKING_OPTIONS: SelectOption<ThinkingTypeValue>[] = [
{ value: undefined, labelKey: "provider.custom.models.variants.option.unset" },
{ value: "enabled", labelKey: "provider.custom.models.variants.thinking.enabled" },
{ value: "disabled", labelKey: "provider.custom.models.variants.thinking.disabled" },
{ value: "adaptive", labelKey: "provider.custom.models.variants.thinking.adaptive" },
]
const SPLIT_REASONING_OPTIONS: SelectOption<SplitReasoningValue>[] = [
{ value: undefined, labelKey: "provider.custom.models.variants.option.unset" },
{ value: true, labelKey: "provider.custom.models.variants.splitReasoning.true" },
{ value: false, labelKey: "provider.custom.models.variants.splitReasoning.false" },
]
const CHAT_TEMPLATE_ARGS_OPTIONS: SelectOption<ChatTemplateArgsValue>[] = [
{ value: undefined, labelKey: "provider.custom.models.variants.option.unset" },
{ value: true, labelKey: "provider.custom.models.variants.chatTemplateArgs.true" },
{ value: false, labelKey: "provider.custom.models.variants.chatTemplateArgs.false" },
]
const REASONING_EFFORT_OPTIONS: SelectOption<ReasoningEffortValue>[] = [
{ value: undefined, labelKey: "provider.custom.models.variants.option.unset" },
{ value: "none", labelKey: "provider.custom.models.variants.reasoningEffort.none" },
{ value: "minimal", labelKey: "provider.custom.models.variants.reasoningEffort.minimal" },
{ value: "low", labelKey: "provider.custom.models.variants.reasoningEffort.low" },
{ value: "medium", labelKey: "provider.custom.models.variants.reasoningEffort.medium" },
{ value: "high", labelKey: "provider.custom.models.variants.reasoningEffort.high" },
{ value: "xhigh", labelKey: "provider.custom.models.variants.reasoningEffort.xhigh" },
]
const OUTPUT_EFFORT_OPTIONS: SelectOption<OutputEffortValue>[] = [
{ value: undefined, labelKey: "provider.custom.models.variants.option.unset" },
{ value: "low", labelKey: "provider.custom.models.variants.outputEffort.low" },
{ value: "medium", labelKey: "provider.custom.models.variants.outputEffort.medium" },
{ value: "high", labelKey: "provider.custom.models.variants.outputEffort.high" },
{ value: "xhigh", labelKey: "provider.custom.models.variants.outputEffort.xhigh" },
{ value: "max", labelKey: "provider.custom.models.variants.outputEffort.max" },
]
type VariantRowProps = {
v: VariantEntry
vi: () => number
isFirst: () => boolean
error: { name?: string } | undefined
t: Translator
onChangeName: (val: string) => void
onChangeEnableThinking: (val: EnableThinkingValue) => void
onChangeThinking: (val: ThinkingTypeValue) => void
onChangeSplitReasoning: (val: SplitReasoningValue) => void
onChangeReasoningEffort: (val: ReasoningEffortValue) => void
onChangeOutputEffort: (val: OutputEffortValue) => void
onChangeChatTemplateArgs: (val: ChatTemplateArgsValue) => void
onRemove: () => void
}
function VariantRow(props: VariantRowProps) {
return (
<div>
<Show when={!props.isFirst()}>
<div
style={{
"border-top": "1px solid var(--border-weak-base, var(--vscode-panel-border))",
margin: "4px 0",
}}
/>
</Show>
<div
style={{
display: "flex",
gap: "8px",
"align-items": "stretch",
"flex-direction": "column",
"padding-top": "4px",
}}
>
<div style={{ "min-width": "100px", flex: "1 1 80px" }}>
<TextField
label={props.t("provider.custom.models.variants.name.label")}
placeholder={props.t("provider.custom.models.variants.name.placeholder")}
value={props.v.name}
onChange={props.onChangeName}
validationState={props.error?.name ? "invalid" : undefined}
error={props.error?.name}
/>
</div>
<div
style={{
display: "flex",
"flex-direction": "column",
gap: "4px",
flex: "0 0 auto",
}}
>
<label
style={{ "font-size": "var(--kilo-font-size-12)", "font-weight": "500", color: "var(--text-weak-base)" }}
>
{props.t("provider.custom.models.variants.enableThinking.label")}
</label>
<Select
options={ENABLE_THINKING_OPTIONS}
current={ENABLE_THINKING_OPTIONS.find((o) => o.value === props.v.enableThinking)}
value={(o) => String(o.value)}
label={(o) => props.t(o.labelKey)}
onSelect={(o) => props.onChangeEnableThinking(o?.value)}
placeholder={props.t("provider.custom.models.variants.enableThinking.placeholder")}
variant="secondary"
size="small"
triggerVariant="settings"
/>
</div>
<div
style={{
display: "flex",
"flex-direction": "column",
gap: "4px",
flex: "0 0 auto",
}}
>
<label
style={{ "font-size": "var(--kilo-font-size-12)", "font-weight": "500", color: "var(--text-weak-base)" }}
>
{props.t("provider.custom.models.variants.thinking.label")}
</label>
<Select
options={THINKING_OPTIONS}
current={THINKING_OPTIONS.find((o) => o.value === props.v.thinking)}
value={(o) => String(o.value)}
label={(o) => props.t(o.labelKey)}
onSelect={(o) => props.onChangeThinking(o?.value)}
placeholder={props.t("provider.custom.models.variants.thinking.placeholder")}
variant="secondary"
size="small"
triggerVariant="settings"
/>
</div>
<div
style={{
display: "flex",
"flex-direction": "column",
gap: "4px",
flex: "0 0 auto",
}}
>
<label
style={{ "font-size": "var(--kilo-font-size-12)", "font-weight": "500", color: "var(--text-weak-base)" }}
>
{props.t("provider.custom.models.variants.splitReasoning.label")}
</label>
<Select
options={SPLIT_REASONING_OPTIONS}
current={SPLIT_REASONING_OPTIONS.find((o) => o.value === props.v.splitReasoning)}
value={(o) => String(o.value)}
label={(o) => props.t(o.labelKey)}
onSelect={(o) => props.onChangeSplitReasoning(o?.value)}
placeholder={props.t("provider.custom.models.variants.splitReasoning.placeholder")}
variant="secondary"
size="small"
triggerVariant="settings"
/>
</div>
<div
style={{
display: "flex",
"flex-direction": "column",
gap: "4px",
flex: "0 0 auto",
}}
>
<label
style={{ "font-size": "var(--kilo-font-size-12)", "font-weight": "500", color: "var(--text-weak-base)" }}
>
{props.t("provider.custom.models.variants.reasoningEffort.label")}
</label>
<Select
options={REASONING_EFFORT_OPTIONS}
current={REASONING_EFFORT_OPTIONS.find((o) => o.value === props.v.reasoningEffort)}
value={(o) => String(o.value)}
label={(o) => props.t(o.labelKey)}
onSelect={(o) => props.onChangeReasoningEffort(o?.value)}
placeholder={props.t("provider.custom.models.variants.reasoningEffort.placeholder")}
variant="secondary"
size="small"
triggerVariant="settings"
/>
</div>
<div
style={{
display: "flex",
"flex-direction": "column",
gap: "4px",
flex: "0 0 auto",
}}
>
<label
style={{ "font-size": "var(--kilo-font-size-12)", "font-weight": "500", color: "var(--text-weak-base)" }}
>
{props.t("provider.custom.models.variants.outputEffort.label")}
</label>
<Select
options={OUTPUT_EFFORT_OPTIONS}
current={OUTPUT_EFFORT_OPTIONS.find((o) => o.value === props.v.outputEffort)}
value={(o) => String(o.value)}
label={(o) => props.t(o.labelKey)}
onSelect={(o) => props.onChangeOutputEffort(o?.value)}
placeholder={props.t("provider.custom.models.variants.outputEffort.placeholder")}
variant="secondary"
size="small"
triggerVariant="settings"
/>
</div>
<div
style={{
display: "flex",
"flex-direction": "column",
gap: "4px",
flex: "0 0 auto",
}}
>
<label
style={{ "font-size": "var(--kilo-font-size-12)", "font-weight": "500", color: "var(--text-weak-base)" }}
>
{props.t("provider.custom.models.variants.chatTemplateArgs.label")}
</label>
<Select
options={CHAT_TEMPLATE_ARGS_OPTIONS}
current={CHAT_TEMPLATE_ARGS_OPTIONS.find((o) => o.value === props.v.chatTemplateArgs)}
value={(o) => String(o.value)}
label={(o) => props.t(o.labelKey)}
onSelect={(o) => props.onChangeChatTemplateArgs(o?.value)}
placeholder={props.t("provider.custom.models.variants.chatTemplateArgs.placeholder")}
variant="secondary"
size="small"
triggerVariant="settings"
/>
</div>
<IconButton
type="button"
icon="trash"
variant="ghost"
onClick={props.onRemove}
aria-label={props.t("provider.custom.models.variants.remove")}
style={{ "margin-bottom": "4px" }}
/>
</div>
</div>
)
}
type ModelCardProps = {
m: ModelEntry
i: () => number
errors: { id?: string; name?: string; variants?: Array<{ name?: string }> }
t: Translator
canRemove: boolean
@@ -306,18 +49,11 @@ type ModelCardProps = {
onChangeReasoning: (val: boolean) => void
onChangeSupportsImages: (val: boolean) => void
onRemove: () => void
onAddVariant: () => void
onRemoveVariant: (vi: number) => void
onChangeVariantName: (vi: number, val: string) => void
onChangeVariantEnableThinking: (vi: number, val: EnableThinkingValue) => void
onChangeVariantThinking: (vi: number, val: ThinkingTypeValue) => void
onChangeVariantSplitReasoning: (vi: number, val: SplitReasoningValue) => void
onChangeVariantReasoningEffort: (vi: number, val: ReasoningEffortValue) => void
onChangeVariantOutputEffort: (vi: number, val: OutputEffortValue) => void
onChangeVariantChatTemplateArgs: (vi: number, val: ChatTemplateArgsValue) => void
}
export function ModelCard(props: ModelCardProps) {
const issue = () => props.errors.variants?.find((error) => error.name)?.name
return (
<div
style={{
@@ -399,39 +135,15 @@ export function ModelCard(props: ModelCardProps) {
{props.t("provider.custom.models.modalities.image")}
</label>
{/* Variants — only available when reasoning is enabled */}
<Show when={props.m.reasoning}>
<Show when={props.m.variants.length > 0}>
<div style={{ display: "flex", "flex-direction": "column", gap: "0" }}>
<label
style={{ "font-size": "var(--kilo-font-size-11)", "font-weight": "500", color: "var(--text-weak-base)" }}
>
{props.t("provider.custom.models.variants.label")}
</label>
<For each={props.m.variants}>
{(v, vi) => (
<VariantRow
v={v}
vi={vi}
isFirst={() => vi() === 0}
error={props.errors.variants?.[vi()]}
t={props.t}
onChangeName={(val) => props.onChangeVariantName(vi(), val)}
onChangeEnableThinking={(val) => props.onChangeVariantEnableThinking(vi(), val)}
onChangeThinking={(val) => props.onChangeVariantThinking(vi(), val)}
onChangeSplitReasoning={(val) => props.onChangeVariantSplitReasoning(vi(), val)}
onChangeReasoningEffort={(val) => props.onChangeVariantReasoningEffort(vi(), val)}
onChangeOutputEffort={(val) => props.onChangeVariantOutputEffort(vi(), val)}
onChangeChatTemplateArgs={(val) => props.onChangeVariantChatTemplateArgs(vi(), val)}
onRemove={() => props.onRemoveVariant(vi())}
/>
)}
</For>
</div>
</Show>
<Button type="button" size="small" variant="ghost" icon="plus-small" onClick={props.onAddVariant}>
{props.t("provider.custom.models.variants.add")}
</Button>
<Show when={issue()}>
{(error) => (
<span
role="alert"
style={{ "font-size": "var(--kilo-font-size-12)", color: "var(--vscode-errorForeground)" }}
>
{error()}
</span>
)}
</Show>
</div>
)
@@ -57,8 +57,9 @@ const PROVIDER_ID = /^[a-z0-9][a-z0-9-_]*$/
function checkVariant(v: VariantEntry, seen: Set<string>, t: Translator) {
const n = v.name.trim()
if (!n) return { name: t("provider.custom.error.required") }
if (seen.has(n)) return { name: t("provider.custom.error.duplicate") }
const path = `variants[${JSON.stringify(v.name)}]`
if (!n) return { name: `${path}: ${t("provider.custom.error.required")}` }
if (seen.has(n)) return { name: `${path}: ${t("provider.custom.error.duplicate")}` }
seen.add(n)
return { name: undefined }
}
@@ -105,6 +106,7 @@ function checkProviderID(id: string, editing: boolean, disabled: string[], exist
}
function serializeVariant(v: VariantEntry): [string, Record<string, unknown>] {
if (v.raw) return [v.name.trim(), v.raw]
const cfg: Record<string, unknown> = {}
if (v.enableThinking !== undefined) cfg.enable_thinking = v.enableThinking
if (v.thinking !== undefined) cfg.thinking = { type: v.thinking }
@@ -28,6 +28,7 @@ import SandboxingTab from "./SandboxingTab"
import * as Sandboxing from "./sandboxing"
import { useServer } from "../../context/server"
import type { MigrationSource } from "../../types/messages"
import { configMessage } from "../../utils/open-config"
export interface SettingsProps {
tab?: string
@@ -66,34 +67,7 @@ const Settings: Component<SettingsProps> = (props) => {
}
const open = (scope: "local" | "global") => {
const label =
scope === "global" ? language.t("settings.config.scope.global") : language.t("settings.config.scope.local")
vscode.postMessage({
type: "openConfigFile",
scope,
labels: {
scope: label,
statusLoaded: language.t("settings.config.status.loaded"),
statusLoadedLegacy: language.t("settings.config.status.loadedLegacy"),
statusNotLoaded: language.t("settings.config.status.notLoaded"),
statusCreate: language.t("settings.config.status.create"),
title: language.t("settings.config.title", { scope: label }),
placeholder: language.t("settings.config.placeholder"),
noWorkspace: language.t("settings.config.noWorkspace"),
openFailed: language.t("settings.config.openFailed", { scope: label, message: "{{message}}" }),
sourceXdg: language.t("settings.config.source.xdg"),
sourceHomeKilo: language.t("settings.config.source.homeKilo"),
sourceHomeKilocode: language.t("settings.config.source.homeKilocode"),
sourceHomeOpencode: language.t("settings.config.source.homeOpencode"),
sourceEnvFile: language.t("settings.config.source.envFile"),
sourceEnvDir: language.t("settings.config.source.envDir"),
sourceEnvContent: language.t("settings.config.source.envContent"),
sourceProjectKilo: language.t("settings.config.source.projectKilo"),
sourceProjectRoot: language.t("settings.config.source.projectRoot"),
sourceProjectKilocode: language.t("settings.config.source.projectKilocode"),
sourceProjectOpencode: language.t("settings.config.source.projectOpencode"),
},
})
vscode.postMessage(configMessage(scope, language.t))
}
// Sync when the parent changes the tab prop (e.g. via navigate message)
+1 -38
View File
@@ -443,44 +443,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "الاسم المعروض",
"provider.custom.models.reasoning.label": "الاستدلال",
"provider.custom.models.modalities.image": "صورة",
"provider.custom.models.variants.label": "المتغيرات",
"provider.custom.models.variants.add": "إضافة متغير",
"provider.custom.models.variants.remove": "إزالة المتغير",
"provider.custom.models.variants.name.label": "الاسم",
"provider.custom.models.variants.name.placeholder": "على سبيل المثال: thinking",
"provider.custom.models.variants.option.unset": "(غير محدد)",
"provider.custom.models.variants.enableThinking.label": "تمكين التفكير (مثل Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "نوع التفكير (مثل Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label": "تفعيل التفكير عبر وسائط قالب الدردشة (مثل Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "جهد الاستدلال",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "إزالة النموذج",
"provider.custom.models.add": "إضافة نموذج",
"provider.custom.models.fetch.authError": "فشلت المصادقة. تحقق من مفتاح API أعلاه وحاول مرة أخرى.",
@@ -494,6 +456,7 @@ export const dict = {
"provider.custom.models.fetch.search": "البحث في النماذج\u2026",
"provider.custom.models.fetch.add": "إضافة {{count}} نموذج(نماذج)",
"provider.custom.edit.title": "تعديل المزود",
"provider.custom.edit.advanced": "تحرير الإعدادات المتقدمة في ملف إعداد JSON",
"provider.custom.headers.label": "الرؤوس (اختياري)",
"provider.custom.headers.key.label": "الرأس",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -454,45 +454,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Nome de Exibição",
"provider.custom.models.reasoning.label": "Raciocínio",
"provider.custom.models.modalities.image": "Imagem",
"provider.custom.models.variants.label": "Variantes",
"provider.custom.models.variants.add": "Adicionar variante",
"provider.custom.models.variants.remove": "Remover variante",
"provider.custom.models.variants.name.label": "Nome",
"provider.custom.models.variants.name.placeholder": "ex. thinking",
"provider.custom.models.variants.option.unset": "(não definido)",
"provider.custom.models.variants.enableThinking.label": "Ativar pensamento (ex. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Tipo de pensamento (ex. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Ativar pensamento via args do template de chat (ex. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Esforço de raciocínio",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Remover modelo",
"provider.custom.models.add": "Adicionar modelo",
"provider.custom.models.fetch.authError": "Falha na autenticação. Verifique a chave de API acima e tente novamente.",
@@ -506,6 +467,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Pesquisar modelos\u2026",
"provider.custom.models.fetch.add": "Adicionar {{count}} modelo(s)",
"provider.custom.edit.title": "Editar provedor",
"provider.custom.edit.advanced": "Editar configurações avançadas no arquivo de configuração JSON",
"provider.custom.headers.label": "Headers (opcional)",
"provider.custom.headers.key.label": "Cabeçalho",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -496,45 +496,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Naziv za prikaz",
"provider.custom.models.reasoning.label": "Zaključivanje",
"provider.custom.models.modalities.image": "Slika",
"provider.custom.models.variants.label": "Varijante",
"provider.custom.models.variants.add": "Dodaj varijantu",
"provider.custom.models.variants.remove": "Ukloni varijantu",
"provider.custom.models.variants.name.label": "Ime",
"provider.custom.models.variants.name.placeholder": "npr. thinking",
"provider.custom.models.variants.option.unset": "(nije postavljeno)",
"provider.custom.models.variants.enableThinking.label": "Omogući razmišljanje (npr. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Vrsta razmišljanja (npr. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Omogući razmišljanje preko argumenata chat predloška (npr. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Napor zaključivanja",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Ukloni model",
"provider.custom.models.add": "Dodaj model",
"provider.custom.models.fetch.authError":
@@ -549,6 +510,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Pretraži modele\u2026",
"provider.custom.models.fetch.add": "Dodaj {{count}} model(a)",
"provider.custom.edit.title": "Uredi provajdera",
"provider.custom.edit.advanced": "Uredite napredne postavke u JSON konfiguracijskoj datoteci",
"provider.custom.headers.label": "Zaglavlja (opcionalno)",
"provider.custom.headers.key.label": "Zaglavlje",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -494,45 +494,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Visningsnavn",
"provider.custom.models.reasoning.label": "Ræsonnement",
"provider.custom.models.modalities.image": "Billede",
"provider.custom.models.variants.label": "Varianter",
"provider.custom.models.variants.add": "Tilføj variant",
"provider.custom.models.variants.remove": "Fjern variant",
"provider.custom.models.variants.name.label": "Navn",
"provider.custom.models.variants.name.placeholder": "f.eks. thinking",
"provider.custom.models.variants.option.unset": "(ikke angivet)",
"provider.custom.models.variants.enableThinking.label": "Aktivér tænkning (f.eks. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Tænkningstype (f.eks. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Aktivér tænkning via chat-skabelonargs (f.eks. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Ræsonnementsindsats",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Fjern model",
"provider.custom.models.add": "Tilføj model",
"provider.custom.models.fetch.authError": "Godkendelse mislykkedes. Kontrollér API-nøglen ovenfor, og prøv igen.",
@@ -546,6 +507,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Søg modeller\u2026",
"provider.custom.models.fetch.add": "Tilføj {{count}} model(ler)",
"provider.custom.edit.title": "Rediger udbyder",
"provider.custom.edit.advanced": "Rediger avancerede indstillinger i JSON-konfigurationsfilen",
"provider.custom.headers.label": "Headers (valgfrit)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -504,45 +504,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Anzeigename",
"provider.custom.models.reasoning.label": "Schlussfolgerung",
"provider.custom.models.modalities.image": "Bild",
"provider.custom.models.variants.label": "Varianten",
"provider.custom.models.variants.add": "Variante hinzufügen",
"provider.custom.models.variants.remove": "Variante entfernen",
"provider.custom.models.variants.name.label": "Name",
"provider.custom.models.variants.name.placeholder": "z.B. thinking",
"provider.custom.models.variants.option.unset": "(nicht festgelegt)",
"provider.custom.models.variants.enableThinking.label": "Nachdenken aktivieren (z.B. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Art des Nachdenkens (z.B. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Nachdenken über Chat-Vorlagenargumente aktivieren (z.B. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Reasoning-Aufwand",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Modell entfernen",
"provider.custom.models.add": "Modell hinzufügen",
"provider.custom.models.fetch.authError":
@@ -557,6 +518,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Modelle suchen\u2026",
"provider.custom.models.fetch.add": "{{count}} Modell(e) hinzufügen",
"provider.custom.edit.title": "Anbieter bearbeiten",
"provider.custom.edit.advanced": "Erweiterte Einstellungen in der JSON-Konfigurationsdatei bearbeiten",
"provider.custom.headers.label": "Header (optional)",
"provider.custom.headers.key.label": "Kopfzeile",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -408,45 +408,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Display Name",
"provider.custom.models.reasoning.label": "Reasoning",
"provider.custom.models.modalities.image": "Image",
"provider.custom.models.variants.label": "Variants",
"provider.custom.models.variants.add": "Add variant",
"provider.custom.models.variants.remove": "Remove variant",
"provider.custom.models.variants.name.label": "Name",
"provider.custom.models.variants.name.placeholder": "e.g. thinking",
"provider.custom.models.variants.option.unset": "(not set)",
"provider.custom.models.variants.enableThinking.label": "Enable thinking (e.g. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Thinking type (e.g. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Enable thinking via chat template args (e.g. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Reasoning effort",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Remove model",
"provider.custom.models.add": "Add model",
"provider.custom.models.fetch.authError": "Authentication failed. Check the API key above and try again.",
@@ -460,6 +421,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Search models\u2026",
"provider.custom.models.fetch.add": "Add {{count}} model(s)",
"provider.custom.edit.title": "Edit provider",
"provider.custom.edit.advanced": "Edit advanced settings in the JSON config file",
"provider.custom.headers.label": "Headers (optional)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -497,45 +497,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Nombre para mostrar",
"provider.custom.models.reasoning.label": "Razonamiento",
"provider.custom.models.modalities.image": "Imagen",
"provider.custom.models.variants.label": "Variantes",
"provider.custom.models.variants.add": "Añadir variante",
"provider.custom.models.variants.remove": "Eliminar variante",
"provider.custom.models.variants.name.label": "Nombre",
"provider.custom.models.variants.name.placeholder": "p. ej. thinking",
"provider.custom.models.variants.option.unset": "(no establecido)",
"provider.custom.models.variants.enableThinking.label": "Habilitar pensamiento (p. ej. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Tipo de pensamiento (p. ej. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Activar pensamiento mediante args de plantilla de chat (ej. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Esfuerzo de razonamiento",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Eliminar modelo",
"provider.custom.models.add": "Añadir modelo",
"provider.custom.models.fetch.authError":
@@ -550,6 +511,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Buscar modelos\u2026",
"provider.custom.models.fetch.add": "Añadir {{count}} modelo(s)",
"provider.custom.edit.title": "Editar proveedor",
"provider.custom.edit.advanced": "Editar la configuración avanzada en el archivo de configuración JSON",
"provider.custom.headers.label": "Headers (opcional)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -409,45 +409,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "نام نمایشی",
"provider.custom.models.reasoning.label": "استدلال",
"provider.custom.models.modalities.image": "تصویر",
"provider.custom.models.variants.label": "نسخه‌های متغیر",
"provider.custom.models.variants.add": "افزودن نسخه متغیر",
"provider.custom.models.variants.remove": "حذف نسخه متغیر",
"provider.custom.models.variants.name.label": "نام",
"provider.custom.models.variants.name.placeholder": "مثلاً thinking",
"provider.custom.models.variants.option.unset": "(تنظیم نشده)",
"provider.custom.models.variants.enableThinking.label": "فعال‌سازی تفکر (مثلاً Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "نوع تفکر (مثلاً Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "فعال",
"provider.custom.models.variants.thinking.disabled": "غیرفعال",
"provider.custom.models.variants.thinking.adaptive": "تطبیقی",
"provider.custom.models.variants.splitReasoning.label": "تقسیم استدلال (لازم برای مثلاً MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"فعال‌سازی تفکر از طریق آرگومان‌های قالب چت (مثلاً Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "سطح استدلال",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "هیچ",
"provider.custom.models.variants.reasoningEffort.minimal": "حداقل",
"provider.custom.models.variants.reasoningEffort.low": "کم",
"provider.custom.models.variants.reasoningEffort.medium": "متوسط",
"provider.custom.models.variants.reasoningEffort.high": "زیاد",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "تلاش خروجی (مثلاً Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "تلاش",
"provider.custom.models.variants.outputEffort.low": "کم",
"provider.custom.models.variants.outputEffort.medium": "متوسط",
"provider.custom.models.variants.outputEffort.high": "زیاد",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "حداکثر",
"provider.custom.models.remove": "حذف مدل",
"provider.custom.models.add": "افزودن مدل",
"provider.custom.models.fetch.authError": "احراز هویت ناموفق بود. کلید API بالا را بررسی کرده و دوباره امتحان کنید.",
@@ -461,6 +422,7 @@ export const dict = {
"provider.custom.models.fetch.search": "جستجوی مدل‌ها…",
"provider.custom.models.fetch.add": "افزودن {{count}} مدل",
"provider.custom.edit.title": "ویرایش ارائه‌دهنده",
"provider.custom.edit.advanced": "ویرایش تنظیمات پیشرفته در فایل پیکربندی JSON",
"provider.custom.headers.label": "هدرها (اختیاری)",
"provider.custom.headers.key.label": "هدر",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -498,45 +498,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Nom d'affichage",
"provider.custom.models.reasoning.label": "Raisonnement",
"provider.custom.models.modalities.image": "Image",
"provider.custom.models.variants.label": "Variantes",
"provider.custom.models.variants.add": "Ajouter une variante",
"provider.custom.models.variants.remove": "Supprimer la variante",
"provider.custom.models.variants.name.label": "Nom",
"provider.custom.models.variants.name.placeholder": "ex. thinking",
"provider.custom.models.variants.option.unset": "(non défini)",
"provider.custom.models.variants.enableThinking.label": "Activer la réflexion (ex. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Type de réflexion (ex. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Activer la réflexion via les args du modèle de chat (ex. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Effort de raisonnement",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Supprimer le modèle",
"provider.custom.models.add": "Ajouter un modèle",
"provider.custom.models.fetch.authError": "Échec de l'authentification. Vérifiez la clé API ci-dessus et réessayez.",
@@ -550,6 +511,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Rechercher des modèles\u2026",
"provider.custom.models.fetch.add": "Ajouter {{count}} modèle(s)",
"provider.custom.edit.title": "Modifier le fournisseur",
"provider.custom.edit.advanced": "Modifier les paramètres avancés dans le fichier de configuration JSON",
"provider.custom.headers.label": "En-têtes (optionnel)",
"provider.custom.headers.key.label": "En-tête",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -318,45 +318,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Nome visualizzato",
"provider.custom.models.reasoning.label": "Reasoning",
"provider.custom.models.modalities.image": "Immagine",
"provider.custom.models.variants.label": "Variants",
"provider.custom.models.variants.add": "Aggiungi variante",
"provider.custom.models.variants.remove": "Rimuovi variante",
"provider.custom.models.variants.name.label": "Nome",
"provider.custom.models.variants.name.placeholder": "es. thinking",
"provider.custom.models.variants.option.unset": "(non impostato)",
"provider.custom.models.variants.enableThinking.label": "Abilita thinking (es. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Tipo thinking (es. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Enable thinking via chat template args (e.g. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Sforzo di ragionamento",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Rimuovi modello",
"provider.custom.models.add": "Aggiungi modello",
"provider.custom.models.fetch.authError": "Autenticazione non riuscita. Controlla l'API key sopra e riprova.",
@@ -370,6 +331,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Cerca modelli...",
"provider.custom.models.fetch.add": "Aggiungi {{count}} modelli",
"provider.custom.edit.title": "Modifica provider",
"provider.custom.edit.advanced": "Modifica le impostazioni avanzate nel file di configurazione JSON",
"provider.custom.headers.label": "Header (opzionali)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Nome-Header",
+1 -38
View File
@@ -490,44 +490,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "表示名",
"provider.custom.models.reasoning.label": "推論",
"provider.custom.models.modalities.image": "画像",
"provider.custom.models.variants.label": "バリアント",
"provider.custom.models.variants.add": "バリアントを追加",
"provider.custom.models.variants.remove": "バリアントを削除",
"provider.custom.models.variants.name.label": "名前",
"provider.custom.models.variants.name.placeholder": "例: thinking",
"provider.custom.models.variants.option.unset": "(未設定)",
"provider.custom.models.variants.enableThinking.label": "思考を有効にする (例: Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "思考タイプ (例: Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label": "チャットテンプレート引数で思考を有効化 (例: Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "推論エフォート",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "モデルを削除",
"provider.custom.models.add": "モデルを追加",
"provider.custom.models.fetch.authError": "認証に失敗しました。上記のAPIキーを確認して再試行してください。",
@@ -541,6 +503,7 @@ export const dict = {
"provider.custom.models.fetch.search": "モデルを検索\u2026",
"provider.custom.models.fetch.add": "{{count}}個のモデルを追加",
"provider.custom.edit.title": "プロバイダーを編集",
"provider.custom.edit.advanced": "JSON 設定ファイルで詳細設定を編集",
"provider.custom.headers.label": "ヘッダー(任意)",
"provider.custom.headers.key.label": "ヘッダー",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -38
View File
@@ -451,44 +451,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "표시 이름",
"provider.custom.models.reasoning.label": "추론",
"provider.custom.models.modalities.image": "이미지",
"provider.custom.models.variants.label": "변형",
"provider.custom.models.variants.add": "변형 추가",
"provider.custom.models.variants.remove": "변형 제거",
"provider.custom.models.variants.name.label": "이름",
"provider.custom.models.variants.name.placeholder": "예: thinking",
"provider.custom.models.variants.option.unset": "(설정되지 않음)",
"provider.custom.models.variants.enableThinking.label": "사고 활성화 (예: Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "사고 유형 (예: Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label": "채팅 템플릿 인수로 사고 활성화 (예: Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "추론 노력",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "모델 제거",
"provider.custom.models.add": "모델 추가",
"provider.custom.models.fetch.authError": "인증에 실패했습니다. 위의 API 키를 확인하고 다시 시도하세요.",
@@ -502,6 +464,7 @@ export const dict = {
"provider.custom.models.fetch.search": "모델 검색\u2026",
"provider.custom.models.fetch.add": "{{count}}개 모델 추가",
"provider.custom.edit.title": "공급자 편집",
"provider.custom.edit.advanced": "JSON 구성 파일에서 고급 설정 편집",
"provider.custom.headers.label": "헤더 (선택사항)",
"provider.custom.headers.key.label": "헤더",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -447,45 +447,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Weergavenaam",
"provider.custom.models.reasoning.label": "Redeneren",
"provider.custom.models.modalities.image": "Afbeelding",
"provider.custom.models.variants.label": "Varianten",
"provider.custom.models.variants.add": "Variant toevoegen",
"provider.custom.models.variants.remove": "Variant verwijderen",
"provider.custom.models.variants.name.label": "Naam",
"provider.custom.models.variants.name.placeholder": "bijv. thinking",
"provider.custom.models.variants.option.unset": "(niet ingesteld)",
"provider.custom.models.variants.enableThinking.label": "Denken inschakelen (bijv. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Denktype (bijv. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Nadenken inschakelen via chat template args (bijv. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Redeneerinspanning",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Model verwijderen",
"provider.custom.models.add": "Model toevoegen",
"provider.custom.models.fetch.authError":
@@ -500,6 +461,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Modellen zoeken\u2026",
"provider.custom.models.fetch.add": "{{count}} model(len) toevoegen",
"provider.custom.edit.title": "Provider bewerken",
"provider.custom.edit.advanced": "Geavanceerde instellingen bewerken in het JSON-configuratiebestand",
"provider.custom.headers.label": "Headers (optioneel)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Naam",
+1 -39
View File
@@ -457,45 +457,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Visningsnavn",
"provider.custom.models.reasoning.label": "Resonnering",
"provider.custom.models.modalities.image": "Bilde",
"provider.custom.models.variants.label": "Varianter",
"provider.custom.models.variants.add": "Legg til variant",
"provider.custom.models.variants.remove": "Fjern variant",
"provider.custom.models.variants.name.label": "Navn",
"provider.custom.models.variants.name.placeholder": "f.eks. thinking",
"provider.custom.models.variants.option.unset": "(ikke angitt)",
"provider.custom.models.variants.enableThinking.label": "Aktiver tenkning (f.eks. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Tenkningstype (f.eks. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Aktiver tenkning via chat-malargumenter (f.eks. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Resonneringsinnsats",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Fjern modell",
"provider.custom.models.add": "Legg til modell",
"provider.custom.models.fetch.authError": "Autentisering mislyktes. Sjekk API-nøkkelen ovenfor og prøv igjen.",
@@ -509,6 +470,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Søk etter modeller\u2026",
"provider.custom.models.fetch.add": "Legg til {{count}} modell(er)",
"provider.custom.edit.title": "Rediger leverandør",
"provider.custom.edit.advanced": "Rediger avanserte innstillinger i JSON-konfigurasjonsfilen",
"provider.custom.headers.label": "Headere (valgfritt)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -452,45 +452,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Nazwa wyświetlana",
"provider.custom.models.reasoning.label": "Rozumowanie",
"provider.custom.models.modalities.image": "Obraz",
"provider.custom.models.variants.label": "Warianty",
"provider.custom.models.variants.add": "Dodaj wariant",
"provider.custom.models.variants.remove": "Usuń wariant",
"provider.custom.models.variants.name.label": "Nazwa",
"provider.custom.models.variants.name.placeholder": "np. thinking",
"provider.custom.models.variants.option.unset": "(nie ustawiono)",
"provider.custom.models.variants.enableThinking.label": "Włącz myślenie (np. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Typ myślenia (np. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Włącz myślenie przez argumenty szablonu czatu (np. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Wysiłek rozumowania",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Usuń model",
"provider.custom.models.add": "Dodaj model",
"provider.custom.models.fetch.authError":
@@ -505,6 +466,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Szukaj modeli\u2026",
"provider.custom.models.fetch.add": "Dodaj {{count}} model(i)",
"provider.custom.edit.title": "Edytuj dostawcę",
"provider.custom.edit.advanced": "Edytuj ustawienia zaawansowane w pliku konfiguracji JSON",
"provider.custom.headers.label": "Nagłówki (opcjonalnie)",
"provider.custom.headers.key.label": "Nagłówek",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -491,45 +491,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Отображаемое имя",
"provider.custom.models.reasoning.label": "Рассуждение",
"provider.custom.models.modalities.image": "Изображение",
"provider.custom.models.variants.label": "Варианты",
"provider.custom.models.variants.add": "Добавить вариант",
"provider.custom.models.variants.remove": "Удалить вариант",
"provider.custom.models.variants.name.label": "Имя",
"provider.custom.models.variants.name.placeholder": "напр. thinking",
"provider.custom.models.variants.option.unset": "(не задано)",
"provider.custom.models.variants.enableThinking.label": "Включить мышление (напр. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Тип мышления (напр. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Включить размышление через аргументы шаблона чата (напр. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Усилие рассуждения",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Удалить модель",
"provider.custom.models.add": "Добавить модель",
"provider.custom.models.fetch.authError": "Ошибка аутентификации. Проверьте API-ключ выше и попробуйте снова.",
@@ -543,6 +504,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Поиск моделей\u2026",
"provider.custom.models.fetch.add": "Добавить {{count}} модель(ей)",
"provider.custom.edit.title": "Редактировать провайдера",
"provider.custom.edit.advanced": "Изменить расширенные настройки в файле конфигурации JSON",
"provider.custom.headers.label": "Заголовки (необязательно)",
"provider.custom.headers.key.label": "Заголовок",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -488,45 +488,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "ชื่อที่แสดง",
"provider.custom.models.reasoning.label": "การใช้เหตุผล",
"provider.custom.models.modalities.image": "รูปภาพ",
"provider.custom.models.variants.label": "รูปแบบ",
"provider.custom.models.variants.add": "เพิ่มรูปแบบ",
"provider.custom.models.variants.remove": "ลบรูปแบบ",
"provider.custom.models.variants.name.label": "ชื่อ",
"provider.custom.models.variants.name.placeholder": "เช่น thinking",
"provider.custom.models.variants.option.unset": "(ไม่ได้ตั้งค่า)",
"provider.custom.models.variants.enableThinking.label": "เปิดใช้งานการคิด (เช่น Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "ประเภทการคิด (เช่น Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"เปิดใช้งานการคิดผ่านอาร์กิวเมนต์เทมเพลตแชท (เช่น Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "ระดับการใช้เหตุผล",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "ลบโมเดล",
"provider.custom.models.add": "เพิ่มโมเดล",
"provider.custom.models.fetch.authError": "การยืนยันตัวตนล้มเหลว ตรวจสอบคีย์ API ด้านบนแล้วลองอีกครั้ง",
@@ -540,6 +501,7 @@ export const dict = {
"provider.custom.models.fetch.search": "ค้นหาโมเดล\u2026",
"provider.custom.models.fetch.add": "เพิ่ม {{count}} โมเดล",
"provider.custom.edit.title": "แก้ไขผู้ให้บริการ",
"provider.custom.edit.advanced": "แก้ไขการตั้งค่าขั้นสูงในไฟล์การกำหนดค่า JSON",
"provider.custom.headers.label": "ส่วนหัว (ไม่จำเป็น)",
"provider.custom.headers.key.label": "ส่วนหัว",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -39
View File
@@ -442,45 +442,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Görünen Ad",
"provider.custom.models.reasoning.label": "Akıl Yürütme",
"provider.custom.models.modalities.image": "Görüntü",
"provider.custom.models.variants.label": "Varyantlar",
"provider.custom.models.variants.add": "Varyant ekle",
"provider.custom.models.variants.remove": "Varyantı kaldır",
"provider.custom.models.variants.name.label": "Ad",
"provider.custom.models.variants.name.placeholder": "örn. thinking",
"provider.custom.models.variants.option.unset": "(ayarlanmadı)",
"provider.custom.models.variants.enableThinking.label": "Düşünmeyi etkinleştir (örn. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Düşünme türü (örn. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Sohbet şablonu argümanları ile düşünmeyi etkinleştir (ör. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Akıl yürütme çabası",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Modeli kaldır",
"provider.custom.models.add": "Model ekle",
"provider.custom.models.fetch.authError":
@@ -495,6 +456,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Model ara\u2026",
"provider.custom.models.fetch.add": "{{count}} model ekle",
"provider.custom.edit.title": "Sağlayıcıyı düzenle",
"provider.custom.edit.advanced": "JSON yapılandırma dosyasında gelişmiş ayarları düzenle",
"provider.custom.headers.label": "Başlıklar (isteğe bağlı)",
"provider.custom.headers.key.label": "Başlık",
"provider.custom.headers.key.placeholder": "Başlık-Adı",
+1 -39
View File
@@ -446,45 +446,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "Відображувана назва",
"provider.custom.models.reasoning.label": "Міркування",
"provider.custom.models.modalities.image": "Зображення",
"provider.custom.models.variants.label": "Варіанти",
"provider.custom.models.variants.add": "Додати варіант",
"provider.custom.models.variants.remove": "Видалити варіант",
"provider.custom.models.variants.name.label": "Ім'я",
"provider.custom.models.variants.name.placeholder": "напр. thinking",
"provider.custom.models.variants.option.unset": "(не встановлено)",
"provider.custom.models.variants.enableThinking.label": "Увімкнути мислення (напр. Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "Тип мислення (напр. Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label":
"Увімкнути мислення через аргументи шаблону чату (напр. Hugging Face)",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "Зусилля міркування",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "Видалити модель",
"provider.custom.models.add": "Додати модель",
"provider.custom.models.fetch.authError": "Автентифікація не вдалася. Перевірте API-ключ вище і спробуйте ще раз.",
@@ -498,6 +459,7 @@ export const dict = {
"provider.custom.models.fetch.search": "Пошук моделей\u2026",
"provider.custom.models.fetch.add": "Додати {{count}} моделей",
"provider.custom.edit.title": "Редагувати провайдера",
"provider.custom.edit.advanced": "Редагувати розширені налаштування у файлі конфігурації JSON",
"provider.custom.headers.label": "Заголовки (необов'язково)",
"provider.custom.headers.key.label": "Заголовок",
"provider.custom.headers.key.placeholder": "Назва-заголовка",
+1 -38
View File
@@ -473,44 +473,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "显示名称",
"provider.custom.models.reasoning.label": "推理",
"provider.custom.models.modalities.image": "图片",
"provider.custom.models.variants.label": "变体",
"provider.custom.models.variants.add": "添加变体",
"provider.custom.models.variants.remove": "移除变体",
"provider.custom.models.variants.name.label": "名称",
"provider.custom.models.variants.name.placeholder": "例如 thinking",
"provider.custom.models.variants.option.unset": "(未设置)",
"provider.custom.models.variants.enableThinking.label": "启用思考 (例如 Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "思考类型 (例如 Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label": "通过聊天模板参数启用思考(如 Hugging Face",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "推理强度",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "移除模型",
"provider.custom.models.add": "添加模型",
"provider.custom.models.fetch.authError": "认证失败。请检查上方的 API 密钥后重试。",
@@ -524,6 +486,7 @@ export const dict = {
"provider.custom.models.fetch.search": "搜索模型\u2026",
"provider.custom.models.fetch.add": "添加 {{count}} 个模型",
"provider.custom.edit.title": "编辑提供商",
"provider.custom.edit.advanced": "在 JSON 配置文件中编辑高级设置",
"provider.custom.headers.label": "请求头(可选)",
"provider.custom.headers.key.label": "请求头",
"provider.custom.headers.key.placeholder": "Header-Name",
+1 -38
View File
@@ -433,44 +433,6 @@ export const dict = {
"provider.custom.models.name.placeholder": "顯示名稱",
"provider.custom.models.reasoning.label": "推理",
"provider.custom.models.modalities.image": "圖片",
"provider.custom.models.variants.label": "變體",
"provider.custom.models.variants.add": "新增變體",
"provider.custom.models.variants.remove": "移除變體",
"provider.custom.models.variants.name.label": "名稱",
"provider.custom.models.variants.name.placeholder": "例如 thinking",
"provider.custom.models.variants.option.unset": "(未設定)",
"provider.custom.models.variants.enableThinking.label": "啟用思考 (例如 Alibaba)",
"provider.custom.models.variants.enableThinking.placeholder": "enable_thinking",
"provider.custom.models.variants.enableThinking.true": "true",
"provider.custom.models.variants.enableThinking.false": "false",
"provider.custom.models.variants.thinking.label": "思考類型 (例如 Z.ai)",
"provider.custom.models.variants.thinking.placeholder": "thinking",
"provider.custom.models.variants.thinking.enabled": "enabled",
"provider.custom.models.variants.thinking.disabled": "disabled",
"provider.custom.models.variants.thinking.adaptive": "adaptive",
"provider.custom.models.variants.splitReasoning.label": "Split reasoning (required for e.g. MiniMax)",
"provider.custom.models.variants.splitReasoning.placeholder": "reasoning_split",
"provider.custom.models.variants.splitReasoning.true": "true",
"provider.custom.models.variants.splitReasoning.false": "false",
"provider.custom.models.variants.chatTemplateArgs.label": "透過聊天範本參數啟用思考(如 Hugging Face",
"provider.custom.models.variants.chatTemplateArgs.placeholder": "chat_template_args",
"provider.custom.models.variants.chatTemplateArgs.true": "true",
"provider.custom.models.variants.chatTemplateArgs.false": "false",
"provider.custom.models.variants.reasoningEffort.label": "推理強度",
"provider.custom.models.variants.reasoningEffort.placeholder": "reasoningEffort",
"provider.custom.models.variants.reasoningEffort.none": "none",
"provider.custom.models.variants.reasoningEffort.minimal": "minimal",
"provider.custom.models.variants.reasoningEffort.low": "low",
"provider.custom.models.variants.reasoningEffort.medium": "medium",
"provider.custom.models.variants.reasoningEffort.high": "high",
"provider.custom.models.variants.reasoningEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.label": "Output effort (e.g. Anthropic)",
"provider.custom.models.variants.outputEffort.placeholder": "effort",
"provider.custom.models.variants.outputEffort.low": "low",
"provider.custom.models.variants.outputEffort.medium": "medium",
"provider.custom.models.variants.outputEffort.high": "high",
"provider.custom.models.variants.outputEffort.xhigh": "xhigh",
"provider.custom.models.variants.outputEffort.max": "max",
"provider.custom.models.remove": "移除模型",
"provider.custom.models.add": "新增模型",
"provider.custom.models.fetch.authError": "驗證失敗。請檢查上方的 API 金鑰後重試。",
@@ -484,6 +446,7 @@ export const dict = {
"provider.custom.models.fetch.search": "搜尋模型\u2026",
"provider.custom.models.fetch.add": "新增 {{count}} 個模型",
"provider.custom.edit.title": "編輯供應商",
"provider.custom.edit.advanced": "在 JSON 設定檔中編輯進階設定",
"provider.custom.headers.label": "標頭(選填)",
"provider.custom.headers.key.label": "標頭",
"provider.custom.headers.key.placeholder": "Header-Name",
@@ -0,0 +1,32 @@
import type { LanguageContextValue } from "../context/language"
import type { OpenConfigFileRequest } from "../types/messages"
export function configMessage(scope: "local" | "global", t: LanguageContextValue["t"]): OpenConfigFileRequest {
const label = t(scope === "global" ? "settings.config.scope.global" : "settings.config.scope.local")
return {
type: "openConfigFile",
scope,
labels: {
scope: label,
statusLoaded: t("settings.config.status.loaded"),
statusLoadedLegacy: t("settings.config.status.loadedLegacy"),
statusNotLoaded: t("settings.config.status.notLoaded"),
statusCreate: t("settings.config.status.create"),
title: t("settings.config.title", { scope: label }),
placeholder: t("settings.config.placeholder"),
noWorkspace: t("settings.config.noWorkspace"),
openFailed: t("settings.config.openFailed", { scope: label, message: "{{message}}" }),
sourceXdg: t("settings.config.source.xdg"),
sourceHomeKilo: t("settings.config.source.homeKilo"),
sourceHomeKilocode: t("settings.config.source.homeKilocode"),
sourceHomeOpencode: t("settings.config.source.homeOpencode"),
sourceEnvFile: t("settings.config.source.envFile"),
sourceEnvDir: t("settings.config.source.envDir"),
sourceEnvContent: t("settings.config.source.envContent"),
sourceProjectKilo: t("settings.config.source.projectKilo"),
sourceProjectRoot: t("settings.config.source.projectRoot"),
sourceProjectKilocode: t("settings.config.source.projectKilocode"),
sourceProjectOpencode: t("settings.config.source.projectOpencode"),
},
}
}
@@ -345,9 +345,7 @@ export namespace RemoteSender {
// bus listener count from inflating for senders that never handle
// attachments (the count would otherwise show up in unrelated tests
// that assert it stays at 0).
const attachments =
options.attachments ??
((sessionID: SessionID) => RemoteAttachments.create({ sessionID }))
const attachments = options.attachments ?? ((sessionID: SessionID) => RemoteAttachments.create({ sessionID }))
const attachmentCache = new Map<SessionID, RemoteAttachments.Result>()
const pending = new Map<SessionID, number>()
const retired = new Map<SessionID, RemoteAttachments.Result>()
@@ -886,27 +884,27 @@ export namespace RemoteSender {
return
}
// kilocode_change end
// kilocode_change start - sessionless list_models for the pre-session instance picker
if (msg.command === "list_models") {
const parsed = RemoteModelCatalog.Request.safeParse(msg.data)
const session = msg.sessionId ? decodeSessionID(msg.sessionId) : Option.none<SessionID>()
if (!parsed.success || Option.isNone(session)) {
options.conn.send({
type: "response",
id: msg.id,
error: "invalid list_models command",
})
// Accept an absent sessionId (the mobile instance-picker path asks for the
// instance's catalog before a session exists). A present but undecodable
// sessionId is still invalid.
const target = msg.sessionId ? decodeSessionID(msg.sessionId) : Option.none<SessionID>()
if (!parsed.success || (msg.sessionId && Option.isNone(target))) {
options.conn.send({ type: "response", id: msg.id, error: "invalid list_models command" })
return
}
const run = options.provide ?? provide
void (async () => {
try {
const info = await catalog.get(session.value)
const info = Option.isSome(target) ? await catalog.get(target.value) : undefined
const result = await run({
directory: info.directory,
directory: info?.directory ?? options.directory,
fn: async () => {
const [providers, messages, fallback] = await Promise.all([
catalog.providers(),
catalog.messages(info.id),
info ? catalog.messages(info.id) : Promise.resolve([]),
catalog.default().catch((err) => {
options.log.warn("default model lookup failed", { error: String(err) })
return undefined
@@ -914,7 +912,7 @@ export namespace RemoteSender {
])
return RemoteModelCatalog.build({
providers,
session: info,
session: info ?? {},
messages,
defaultModel: fallback,
})
@@ -928,6 +926,7 @@ export namespace RemoteSender {
})()
return
}
// kilocode_change end
if (msg.command === "send_message") {
const parsed = getRemotePromptInput().safeParse(msg.data)
if (!parsed.success) {
@@ -15,6 +15,8 @@ import { ProviderError } from "@/provider/error"
import { Effect, Schema } from "effect"
import type { LanguageModelV3 } from "@ai-sdk/provider"
import { mapValues, omit, pickBy } from "remeda"
import { reasoningSummary } from "./reasoning-summary"
import type { Provider } from "@/provider/provider"
/** Default timeout (ms) for provider HTTP requests (connection phase). */
export const REQUEST_TIMEOUT_MS = 300_000 // 5 minutes
@@ -95,6 +97,39 @@ export function patchConfigModel(cfg: any, existing: any) {
}
}
const CUSTOM_PROVIDER_PACKAGES = new Set(["@ai-sdk/openai-compatible", "@ai-sdk/openai", "@ai-sdk/anthropic"])
const FALLBACK_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"]
type Variants = NonNullable<Provider.Model["variants"]>
type Generate = (model: Provider.Model) => Variants
export function customProviderVariants(model: Provider.Model, npm: unknown, generate: Generate): Variants {
if (model.variants && Object.keys(model.variants).length > 0) return model.variants
const supported = typeof npm === "string" && CUSTOM_PROVIDER_PACKAGES.has(npm) && model.api.npm === npm
const variants = generate(model)
if (Object.keys(variants).length > 0) return variants
if (!model.capabilities.reasoning || !supported) return variants
return Object.fromEntries(
FALLBACK_EFFORTS.map((effort) => {
if (npm === "@ai-sdk/anthropic") {
return [effort, effort === "none" ? { thinking: { type: "disabled" } } : { effort }]
}
if (npm === "@ai-sdk/openai") {
return [
effort,
{
reasoningEffort: effort,
reasoningSummary: reasoningSummary(model),
include: ["reasoning.encrypted_content"],
},
]
}
return [effort, { reasoningEffort: effort }]
}),
)
}
// ---------------------------------------------------------------------------
// Custom loaders (new or fully-replaced loaders)
// ---------------------------------------------------------------------------
+7 -1
View File
@@ -37,6 +37,7 @@ import {
KILO_MODEL_SCHEMA_EXTENSIONS,
patchModelsDevModel as patchKiloModel,
patchConfigModel as patchKiloConfigModel,
customProviderVariants,
patchCustomLoaderResult,
patchKiloProviderPrivacy,
kiloSmallModelPriority,
@@ -1526,7 +1527,12 @@ const layer = Layer.effect(
// variants: {}, // kilocode_change, moved into patchKiloConfigModel
...patchKiloConfigModel(model, existingModel), // kilocode_change
}
const merged = mergeDeep(ProviderTransform.variants(parsedModel), model.variants ?? {})
// kilocode_change start
const generated = Object.keys(model.variants ?? {}).length
? {}
: customProviderVariants(parsedModel, model.provider?.npm ?? provider.npm, ProviderTransform.variants)
const merged = mergeDeep(generated, model.variants ?? {})
// kilocode_change end
parsedModel.variants = mapValues(
pickBy(merged, (v): v is NonNullable<typeof v> => !!v && !v.disabled), // kilocode_change - drop null delete sentinels
(v) => omit(v, ["disabled"]),
@@ -0,0 +1,45 @@
import { expect } from "bun:test"
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
import { ProviderV2 } from "@opencode-ai/core/provider"
import { Effect } from "effect"
import { Env } from "@/env"
import { Plugin } from "@/plugin"
import { Provider } from "@/provider/provider"
import { testEffect } from "../lib/effect"
const it = testEffect(LayerNode.compile(LayerNode.group([Provider.node, Env.node, Plugin.node])))
it.instance(
"uses configured variants instead of inferred reasoning efforts",
() =>
Effect.gen(function* () {
const providers = yield* Provider.use.list()
const model = providers[ProviderV2.ID.make("custom")]?.models["qwen-custom"]
expect(Object.keys(model?.variants ?? {})).toEqual(["custom"])
expect(model?.variants?.high).toBeUndefined()
expect(model?.variants?.custom).toEqual({ reasoningEffort: "custom" })
}),
{
config: {
provider: {
custom: {
name: "Custom",
npm: "@ai-sdk/openai-compatible",
options: { apiKey: "test" },
models: {
"qwen-custom": {
name: "Qwen Custom",
reasoning: true,
limit: { context: 128_000, output: 16_000 },
variants: {
high: { disabled: true },
custom: { reasoningEffort: "custom" },
},
},
},
},
},
},
},
)
@@ -1,6 +1,7 @@
import { describe, expect, test } from "bun:test"
import { ProviderTransform } from "../../src/provider/transform"
import { Provider } from "../../src/provider/provider"
import { customProviderVariants } from "../../src/kilocode/provider/provider"
import type * as ModelsDev from "@opencode-ai/core/models-dev"
function mockModel(overrides: Partial<any> = {}): any {
@@ -138,3 +139,67 @@ describe("ProviderTransform.reasoningVariants - models.dev reasoning_options", (
expect(Object.keys(gpt5.variants ?? {})).toEqual(["minimal", "low", "medium", "high"])
})
})
describe("custom provider fallback reasoning efforts", () => {
const efforts = ["none", "low", "medium", "high", "xhigh", "max"]
for (const npm of ["@ai-sdk/openai-compatible", "@ai-sdk/openai", "@ai-sdk/anthropic"]) {
test(`${npm} exposes broad efforts after heuristics fail`, () => {
const model = mockModel({ id: "qwen-custom", api: { id: "qwen-custom", url: "https://api.test.com", npm } })
const generated = ProviderTransform.variants({ ...model, variants: {} })
expect(generated).toEqual({})
const result = customProviderVariants(model, npm, ProviderTransform.variants)
expect(Object.keys(result)).toEqual(efforts)
if (npm === "@ai-sdk/anthropic") {
expect(result.none).toEqual({ thinking: { type: "disabled" } })
expect(result.max).toEqual({ effort: "max" })
return
}
expect(result.none?.reasoningEffort).toBe("none")
expect(result.max?.reasoningEffort).toBe("max")
})
}
test("preserves successful heuristics", () => {
const model = mockModel({ api: { id: "custom", url: "https://api.test.com", npm: "@ai-sdk/openai-compatible" } })
const generated = { low: { reasoningEffort: "low" }, high: { reasoningEffort: "high" } }
expect(customProviderVariants(model, model.api.npm, () => generated)).toBe(generated)
})
test("prefers configured variants to inference", () => {
const variants = { custom: { reasoningEffort: "custom" } }
for (const npm of ["@ai-sdk/openai-compatible", "@ai-sdk/openai", "@ai-sdk/anthropic"]) {
const model = mockModel({ api: { id: "custom", url: "https://api.test.com", npm }, variants })
expect(
customProviderVariants(model, npm, () => {
throw new Error("inference should not run")
}),
).toBe(variants)
}
})
test("requires a reasoning model with an explicitly configured supported package", () => {
const npm = "@ai-sdk/openai-compatible"
const plain = mockModel({
api: { id: "custom", url: "https://api.test.com", npm },
capabilities: { ...mockModel().capabilities, reasoning: false },
})
expect(customProviderVariants(plain, npm, () => ({}))).toEqual({})
expect(
customProviderVariants(
mockModel({ api: { id: "custom", url: "https://api.test.com", npm } }),
undefined,
() => ({}),
),
).toEqual({})
expect(
customProviderVariants(
mockModel({ api: { id: "custom", url: "https://api.test.com", npm: "unrelated-provider" } }),
"unrelated-provider",
() => ({}),
),
).toEqual({})
})
})
@@ -911,7 +911,9 @@ describe("config overlay routes", () => {
Permission.evaluate("edit", "*", after.find((item) => item.name === "code")?.permission ?? []).action,
).toBe("allow")
},
30_000,
// Cold Windows CI runs take ~32s (observed timeout at 30s); give the two
// instance create/dispose cycles of each iteration real headroom.
90_000,
)
}
})
@@ -1084,7 +1084,7 @@ describe("RemoteSender", () => {
expect(JSON.stringify(sent)).not.toContain("api-key")
})
test("list_models rejects unsupported versions and missing session IDs", () => {
test("list_models rejects unsupported versions and undecodable session IDs", () => {
const { conn, sent } = fakeConn()
const sender = RemoteSender.create({
conn,
@@ -1100,12 +1100,6 @@ describe("RemoteSender", () => {
sessionId: "ses_models",
data: { protocolVersion: 2 },
})
sender.handle({
type: "command",
id: "req_models_missing_session",
command: "list_models",
data: { protocolVersion: 1 },
})
sender.handle({
type: "command",
id: "req_models_invalid_session",
@@ -1116,11 +1110,72 @@ describe("RemoteSender", () => {
expect(sent).toEqual([
{ type: "response", id: "req_models_v2", error: "invalid list_models command" },
{ type: "response", id: "req_models_missing_session", error: "invalid list_models command" },
{ type: "response", id: "req_models_invalid_session", error: "invalid list_models command" },
])
})
test("list_models without a sessionId returns the instance catalog", async () => {
const { conn, sent } = fakeConn()
const dirs: string[] = []
const sender = RemoteSender.create({
conn,
directory: "/tmp/process-default",
log: nolog,
subscribe: fakeBus().subscribe,
provide: async <R>(input: { directory: string; init?: Effect.Effect<void>; fn: () => R }) => {
dirs.push(input.directory)
return input.fn()
},
catalog: {
get: async () => {
throw new Error("catalog.get must not be called without a sessionId")
},
messages: async () => {
throw new Error("catalog.messages must not be called without a sessionId")
},
providers: async () =>
({
custom: {
id: ProviderV2.ID.make("custom"),
name: "Custom Provider",
source: "config",
env: ["PRIVATE_API_KEY"],
key: "must-not-leak",
options: { apiKey: "must-not-leak" },
models: {
"deployment/model": catalogModel("custom", "deployment/model", "Deployment Model", true),
},
},
}) as any,
default: async () => ({
providerID: ProviderV2.ID.make("custom"),
modelID: ModelV2.ID.make("deployment/model"),
}),
},
})
sender.handle({
type: "command",
id: "req_models_sessionless",
command: "list_models",
data: { protocolVersion: 1 },
})
await new Promise((resolve) => setTimeout(resolve, 0))
expect(dirs).toEqual(["/tmp/process-default"])
expect(sent).toHaveLength(1)
expect(sent[0]?.type).toBe("response")
expect(sent[0]?.id).toBe("req_models_sessionless")
const result = sent[0]?.result as RemoteModelCatalog.Response
expect(result.protocolVersion).toBe(1)
expect(result.all).toHaveLength(1)
expect(result.all[0]?.id).toBe("custom")
expect(result.defaultModel).toEqual({ providerID: "custom", modelID: "deployment/model" })
expect(result).not.toHaveProperty("currentModel")
expect(JSON.stringify(result)).not.toContain("must-not-leak")
})
test("send_message with agent is accepted", async () => {
const { conn, sent } = fakeConn()
let resolveProvide: () => void
@@ -3066,7 +3121,9 @@ describe("RemoteSender slash commands", () => {
removeCalls.push(id)
},
},
attachSession: async () => { throw new Error("attach failed") },
attachSession: async () => {
throw new Error("attach failed")
},
})
const response = expectResponse(conn, sent, "req_spawn_failed")
@@ -3107,7 +3164,9 @@ describe("RemoteSender slash commands", () => {
throw new Error("cleanup secondary failure")
},
},
attachSession: async () => { throw new Error("attach failed") },
attachSession: async () => {
throw new Error("attach failed")
},
})
const response = expectResponse(conn, sent, "req_spawn_then_cleanup_fail")
@@ -1536,14 +1536,13 @@ it.instance(
)
it.instance(
"variant config merges with generated variants",
"configured variants remain authoritative", // kilocode_change
Effect.gen(function* () {
yield* set("ANTHROPIC_API_KEY", "test-api-key")
const providers = yield* list
const model = providers[ProviderV2.ID.anthropic].models["claude-sonnet-4-20250514"]
expect(model.variants!["high"]).toBeDefined()
// Should have both the generated thinking config and the custom option
expect(model.variants!["high"].thinking).toBeDefined()
expect(model.variants!["high"].thinking).toBeUndefined() // kilocode_change
expect(model.variants!["high"].extraOption).toBe("custom-value")
}),
{