mirror of
https://github.com/Kilo-Org/kilocode.git
synced 2026-09-01 15:32:11 +08:00
Merge branch 'main' into fix/gateway-negative-prices
This commit is contained in:
@@ -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.
|
||||
@@ -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>
|
||||
|
||||
+13
-301
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -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")
|
||||
}),
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user