Add extraBody field to model configuration forms
This adds a new field allowing users to specify additional JSON fields to inject into the request body when configuring models.
This commit is contained in:
parent
8b6cbd9909
commit
47a796b08f
4 changed files with 47 additions and 4 deletions
|
|
@ -12,6 +12,7 @@ import {
|
||||||
} from "@/components/shared-form"
|
} from "@/components/shared-form"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
|
import { Textarea } from "@/components/ui/textarea"
|
||||||
import {
|
import {
|
||||||
Sheet,
|
Sheet,
|
||||||
SheetContent,
|
SheetContent,
|
||||||
|
|
@ -34,6 +35,7 @@ interface AddForm {
|
||||||
maxTokensField: string
|
maxTokensField: string
|
||||||
requestTimeout: string
|
requestTimeout: string
|
||||||
thinkingLevel: string
|
thinkingLevel: string
|
||||||
|
extraBody: string
|
||||||
}
|
}
|
||||||
|
|
||||||
const EMPTY_ADD_FORM: AddForm = {
|
const EMPTY_ADD_FORM: AddForm = {
|
||||||
|
|
@ -49,6 +51,7 @@ const EMPTY_ADD_FORM: AddForm = {
|
||||||
maxTokensField: "",
|
maxTokensField: "",
|
||||||
requestTimeout: "",
|
requestTimeout: "",
|
||||||
thinkingLevel: "",
|
thinkingLevel: "",
|
||||||
|
extraBody: "",
|
||||||
}
|
}
|
||||||
|
|
||||||
interface AddModelSheetProps {
|
interface AddModelSheetProps {
|
||||||
|
|
@ -100,7 +103,7 @@ export function AddModelSheet({
|
||||||
}
|
}
|
||||||
|
|
||||||
const setField =
|
const setField =
|
||||||
(key: keyof AddForm) => (e: React.ChangeEvent<HTMLInputElement>) => {
|
(key: keyof AddForm) => (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
||||||
setForm((f) => ({ ...f, [key]: e.target.value }))
|
setForm((f) => ({ ...f, [key]: e.target.value }))
|
||||||
if (fieldErrors[key]) {
|
if (fieldErrors[key]) {
|
||||||
setFieldErrors((prev) => ({ ...prev, [key]: undefined }))
|
setFieldErrors((prev) => ({ ...prev, [key]: undefined }))
|
||||||
|
|
@ -129,6 +132,9 @@ export function AddModelSheet({
|
||||||
? Number(form.requestTimeout)
|
? Number(form.requestTimeout)
|
||||||
: undefined,
|
: undefined,
|
||||||
thinking_level: form.thinkingLevel.trim() || undefined,
|
thinking_level: form.thinkingLevel.trim() || undefined,
|
||||||
|
extra_body: form.extraBody.trim()
|
||||||
|
? JSON.parse(form.extraBody.trim())
|
||||||
|
: undefined,
|
||||||
})
|
})
|
||||||
if (setAsDefault) {
|
if (setAsDefault) {
|
||||||
await setDefaultModel(modelName)
|
await setDefaultModel(modelName)
|
||||||
|
|
@ -305,6 +311,18 @@ export function AddModelSheet({
|
||||||
placeholder="max_completion_tokens"
|
placeholder="max_completion_tokens"
|
||||||
/>
|
/>
|
||||||
</Field>
|
</Field>
|
||||||
|
|
||||||
|
<Field
|
||||||
|
label={t("models.field.extraBody")}
|
||||||
|
hint={t("models.field.extraBodyHint")}
|
||||||
|
>
|
||||||
|
<Textarea
|
||||||
|
value={form.extraBody}
|
||||||
|
onChange={setField("extraBody")}
|
||||||
|
placeholder='{"key": "value"}'
|
||||||
|
rows={3}
|
||||||
|
/>
|
||||||
|
</Field>
|
||||||
</AdvancedSection>
|
</AdvancedSection>
|
||||||
|
|
||||||
{serverError && (
|
{serverError && (
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import {
|
||||||
} from "@/components/shared-form"
|
} from "@/components/shared-form"
|
||||||
import { Button } from "@/components/ui/button"
|
import { Button } from "@/components/ui/button"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
|
import { Textarea } from "@/components/ui/textarea"
|
||||||
import {
|
import {
|
||||||
Sheet,
|
Sheet,
|
||||||
SheetContent,
|
SheetContent,
|
||||||
|
|
@ -32,6 +33,7 @@ interface EditForm {
|
||||||
maxTokensField: string
|
maxTokensField: string
|
||||||
requestTimeout: string
|
requestTimeout: string
|
||||||
thinkingLevel: string
|
thinkingLevel: string
|
||||||
|
extraBody: string
|
||||||
}
|
}
|
||||||
|
|
||||||
interface EditModelSheetProps {
|
interface EditModelSheetProps {
|
||||||
|
|
@ -59,6 +61,7 @@ export function EditModelSheet({
|
||||||
maxTokensField: "",
|
maxTokensField: "",
|
||||||
requestTimeout: "",
|
requestTimeout: "",
|
||||||
thinkingLevel: "",
|
thinkingLevel: "",
|
||||||
|
extraBody: "",
|
||||||
})
|
})
|
||||||
const [saving, setSaving] = useState(false)
|
const [saving, setSaving] = useState(false)
|
||||||
const [setAsDefault, setSetAsDefault] = useState(false)
|
const [setAsDefault, setSetAsDefault] = useState(false)
|
||||||
|
|
@ -79,6 +82,9 @@ export function EditModelSheet({
|
||||||
? String(model.request_timeout)
|
? String(model.request_timeout)
|
||||||
: "",
|
: "",
|
||||||
thinkingLevel: model.thinking_level ?? "",
|
thinkingLevel: model.thinking_level ?? "",
|
||||||
|
extraBody: model.extra_body
|
||||||
|
? JSON.stringify(model.extra_body, null, 2)
|
||||||
|
: "",
|
||||||
})
|
})
|
||||||
setSetAsDefault(model.is_default)
|
setSetAsDefault(model.is_default)
|
||||||
setError("")
|
setError("")
|
||||||
|
|
@ -86,7 +92,7 @@ export function EditModelSheet({
|
||||||
}, [model])
|
}, [model])
|
||||||
|
|
||||||
const setField =
|
const setField =
|
||||||
(key: keyof EditForm) => (e: React.ChangeEvent<HTMLInputElement>) =>
|
(key: keyof EditForm) => (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>
|
||||||
setForm((f) => ({ ...f, [key]: e.target.value }))
|
setForm((f) => ({ ...f, [key]: e.target.value }))
|
||||||
|
|
||||||
const handleSave = async () => {
|
const handleSave = async () => {
|
||||||
|
|
@ -109,6 +115,9 @@ export function EditModelSheet({
|
||||||
? Number(form.requestTimeout)
|
? Number(form.requestTimeout)
|
||||||
: undefined,
|
: undefined,
|
||||||
thinking_level: form.thinkingLevel || undefined,
|
thinking_level: form.thinkingLevel || undefined,
|
||||||
|
extra_body: form.extraBody.trim()
|
||||||
|
? JSON.parse(form.extraBody.trim())
|
||||||
|
: undefined,
|
||||||
})
|
})
|
||||||
if (setAsDefault && !model.is_default) {
|
if (setAsDefault && !model.is_default) {
|
||||||
await setDefaultModel(model.model_name)
|
await setDefaultModel(model.model_name)
|
||||||
|
|
@ -273,6 +282,18 @@ export function EditModelSheet({
|
||||||
placeholder="max_completion_tokens"
|
placeholder="max_completion_tokens"
|
||||||
/>
|
/>
|
||||||
</Field>
|
</Field>
|
||||||
|
|
||||||
|
<Field
|
||||||
|
label={t("models.field.extraBody")}
|
||||||
|
hint={t("models.field.extraBodyHint")}
|
||||||
|
>
|
||||||
|
<Textarea
|
||||||
|
value={form.extraBody}
|
||||||
|
onChange={setField("extraBody")}
|
||||||
|
placeholder='{"key": "value"}'
|
||||||
|
rows={3}
|
||||||
|
/>
|
||||||
|
</Field>
|
||||||
</AdvancedSection>
|
</AdvancedSection>
|
||||||
|
|
||||||
{error && (
|
{error && (
|
||||||
|
|
|
||||||
|
|
@ -208,7 +208,9 @@
|
||||||
"thinkingLevel": "Thinking Level",
|
"thinkingLevel": "Thinking Level",
|
||||||
"thinkingLevelHint": "Extended thinking budget: off, low, medium, high, xhigh, adaptive.",
|
"thinkingLevelHint": "Extended thinking budget: off, low, medium, high, xhigh, adaptive.",
|
||||||
"maxTokensField": "Max Tokens Field",
|
"maxTokensField": "Max Tokens Field",
|
||||||
"maxTokensFieldHint": "Override the request field name for max tokens, e.g. max_completion_tokens."
|
"maxTokensFieldHint": "Override the request field name for max tokens, e.g. max_completion_tokens.",
|
||||||
|
"extraBody": "Extra Body",
|
||||||
|
"extraBodyHint": "Additional JSON fields to inject into the request body, e.g. {\"reasoning_split\": true}."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"title": "Configure {{name}}",
|
"title": "Configure {{name}}",
|
||||||
|
|
|
||||||
|
|
@ -208,7 +208,9 @@
|
||||||
"thinkingLevel": "思考级别",
|
"thinkingLevel": "思考级别",
|
||||||
"thinkingLevelHint": "扩展思考预算:off、low、medium、high、xhigh、adaptive。",
|
"thinkingLevelHint": "扩展思考预算:off、low、medium、high、xhigh、adaptive。",
|
||||||
"maxTokensField": "Max Tokens 字段名",
|
"maxTokensField": "Max Tokens 字段名",
|
||||||
"maxTokensFieldHint": "覆盖请求中 max_tokens 的字段名,例如 max_completion_tokens。"
|
"maxTokensFieldHint": "覆盖请求中 max_tokens 的字段名,例如 max_completion_tokens。",
|
||||||
|
"extraBody": "Extra Body",
|
||||||
|
"extraBodyHint": "要注入到请求体中的额外 JSON 字段,例如 {\"reasoning_split\": true}。"
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"title": "配置 {{name}}",
|
"title": "配置 {{name}}",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue