+
+ Stop sequences
+
+
+ Strings that halt generation as soon as the model
+ emits them. Enter a value and press Enter or comma
+ to commit a chip. Backend translates to
+ `stop_sequences` on Anthropic and `stop` on OpenAI
+ Chat (capped at 4 entries).
+
+
+
+
+ ) : null}
+ {showServiceTier ? (
+
+
+
+ Service tier
+
+
+ Provider routing tier. `auto` (default) lets the
+ provider choose. `flex` / `priority` / `scale` route
+ to higher-latency-tolerant or premium queues on
+ OpenAI; `standard_only` opts out of Anthropic's
+ priority tier.
+
+
+
+
+ ) : null}
+ {showParallelToolCalls ? (
+
+
+
+ Parallel tool calls
+
+
+ When on, the model may dispatch multiple tool calls
+ in a single turn (default). Turn off to force one
+ tool call at a time. Anthropic implements this as
+ `disable_parallel_tool_use`; OpenAI as
+ `parallel_tool_calls`.
+
+
+
+
+ ) : null}
{!isExternalModel && !isGguf && (
= {
@@ -302,6 +368,8 @@ const PROVIDER_CAPABILITIES: Record = {
// models served via /v1/responses, which rejects temperature, top_p, and
// presence/frequency penalty. See backend
// external_provider._stream_openai_responses for the proxy.
+ // service_tier and parallel_tool_calls are accepted on /v1/responses;
+ // seed / stop / frequency_penalty are 400'd alongside temperature/top_p.
openai: {
temperature: false,
topP: false,
@@ -309,14 +377,22 @@ const PROVIDER_CAPABILITIES: Record = {
minP: false,
repetitionPenalty: false,
presencePenalty: false,
+ frequencyPenalty: false,
+ seed: false,
+ stop: false,
+ serviceTier: true,
+ parallelToolCalls: true,
},
// Anthropic's Messages API accepts top_k on 3.x and 4.5/4.6, but Claude
// 4.7 (Opus/Sonnet/Haiku) deprecated it and returns 400 if it is set.
// We surface top_k in the panel for all Anthropic providers and let the
// backend strip it per-model — see _stream_anthropic in
// studio/backend/core/inference/external_provider.py.
- // Presence/frequency penalty is not part of the Messages API on any
- // Claude generation.
+ // Presence/frequency penalty / seed / logprobs are not part of the
+ // Messages API on any Claude generation. stop_sequences (Anthropic name
+ // for `stop`), service_tier (auto|standard_only), and
+ // disable_parallel_tool_use (inverse of parallel_tool_calls) ARE
+ // supported.
anthropic: {
temperature: true,
topP: true,
@@ -324,6 +400,11 @@ const PROVIDER_CAPABILITIES: Record = {
minP: false,
repetitionPenalty: false,
presencePenalty: false,
+ frequencyPenalty: false,
+ seed: false,
+ stop: true,
+ serviceTier: true,
+ parallelToolCalls: true,
},
mistral: OPENAI_COMPAT_BASE,
gemini: OPENAI_COMPAT_BASE,
@@ -340,6 +421,11 @@ const PROVIDER_CAPABILITIES: Record = {
minP: false,
repetitionPenalty: false,
presencePenalty: true,
+ frequencyPenalty: true,
+ seed: true,
+ stop: true,
+ serviceTier: false,
+ parallelToolCalls: true,
},
// DeepSeek deprecated presence/frequency penalty in their current docs.
deepseek: {
@@ -349,6 +435,11 @@ const PROVIDER_CAPABILITIES: Record = {
minP: false,
repetitionPenalty: false,
presencePenalty: false,
+ frequencyPenalty: false,
+ seed: true,
+ stop: true,
+ serviceTier: false,
+ parallelToolCalls: true,
},
qwen: OPENAI_COMPAT_BASE,
huggingface: OPENAI_COMPAT_BASE,
diff --git a/studio/frontend/src/features/chat/stores/chat-runtime-store.ts b/studio/frontend/src/features/chat/stores/chat-runtime-store.ts
index a00b53a44c..dd26006228 100644
--- a/studio/frontend/src/features/chat/stores/chat-runtime-store.ts
+++ b/studio/frontend/src/features/chat/stores/chat-runtime-store.ts
@@ -373,6 +373,11 @@ const PERSISTED_INFERENCE_PARAM_KEYS = [
"minP",
"repetitionPenalty",
"presencePenalty",
+ "frequencyPenalty",
+ "seed",
+ "stop",
+ "serviceTier",
+ "parallelToolCalls",
"maxSeqLength",
"maxTokens",
"systemPrompt",
diff --git a/studio/frontend/src/features/chat/types/api.ts b/studio/frontend/src/features/chat/types/api.ts
index 1e6bcf8b87..764e571bfa 100644
--- a/studio/frontend/src/features/chat/types/api.ts
+++ b/studio/frontend/src/features/chat/types/api.ts
@@ -262,6 +262,41 @@ export interface OpenAIChatCompletionsRequest {
* the Anthropic provider with `code_execution` in `enabled_tools`.
*/
anthropic_code_exec_container_id?: string | null;
+ /**
+ * OpenAI Chat Completions only; rejected by the Responses family and
+ * silently dropped by Anthropic. Range -2.0 .. 2.0.
+ */
+ frequency_penalty?: number;
+ /**
+ * Best-effort determinism seed. OpenAI Chat / OpenAI-compat backends
+ * forward it; Responses + Anthropic drop it server-side.
+ */
+ seed?: number;
+ /**
+ * Custom stop sequences. Backend translates to `stop_sequences` for
+ * Anthropic; OpenAI Chat caps at 4 entries (server-side truncates
+ * with a warning). Empty arrays are omitted.
+ */
+ stop?: string[];
+ /**
+ * Provider service tier. Anthropic accepts `auto|standard_only`;
+ * OpenAI Chat accepts `auto|default|flex|priority|scale`; OpenAI
+ * Responses accepts `auto|default|flex|priority`.
+ */
+ service_tier?:
+ | "auto"
+ | "default"
+ | "flex"
+ | "priority"
+ | "scale"
+ | "standard_only";
+ /**
+ * Whether the provider may dispatch tool calls in parallel.
+ * OpenAI: forwarded as `parallel_tool_calls`. Anthropic: inverted
+ * into `disable_parallel_tool_use` server-side. Default `undefined`
+ * keeps each provider's upstream default.
+ */
+ parallel_tool_calls?: boolean;
}
export interface OpenAIChatDelta {
diff --git a/studio/frontend/src/features/chat/types/runtime.ts b/studio/frontend/src/features/chat/types/runtime.ts
index 2967584653..49c7c291e7 100644
--- a/studio/frontend/src/features/chat/types/runtime.ts
+++ b/studio/frontend/src/features/chat/types/runtime.ts
@@ -1,6 +1,14 @@
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0
+export type ServiceTier =
+ | "auto"
+ | "default"
+ | "flex"
+ | "priority"
+ | "scale"
+ | "standard_only";
+
export interface InferenceParams {
temperature: number;
topP: number;
@@ -8,6 +16,34 @@ export interface InferenceParams {
minP: number;
repetitionPenalty: number;
presencePenalty: number;
+ /** OpenAI Chat Completions only; rejected by Responses + Anthropic. */
+ frequencyPenalty: number;
+ /**
+ * Best-effort determinism seed. OpenAI Chat Completions only; the
+ * Responses family and Anthropic reject it (silently dropped server-side).
+ * `null` = unset (no `seed` field on the wire).
+ */
+ seed: number | null;
+ /**
+ * Custom stop sequences. Maps to `stop` on OpenAI Chat Completions and
+ * `stop_sequences` on Anthropic Messages. OpenAI caps the array at 4
+ * entries; backend truncates with a warning. Empty array = unset.
+ */
+ stop: string[];
+ /**
+ * Provider service tier. Each provider accepts a different enum set;
+ * `getServiceTierOptions(providerType)` resolves the legal values. `null`
+ * means "let the provider pick its default" and is the safe choice on
+ * provider switch.
+ */
+ serviceTier: ServiceTier | null;
+ /**
+ * Whether the provider may dispatch tool calls in parallel. Maps to
+ * `parallel_tool_calls` on both OpenAI APIs and is inverted into
+ * `disable_parallel_tool_use` for Anthropic. Default true matches the
+ * upstream defaults across all three.
+ */
+ parallelToolCalls: boolean;
maxSeqLength: number;
maxTokens: number;
systemPrompt: string;
@@ -23,6 +59,11 @@ export const DEFAULT_INFERENCE_PARAMS: InferenceParams = {
minP: 0.01,
repetitionPenalty: 1.0,
presencePenalty: 0.0,
+ frequencyPenalty: 0.0,
+ seed: null,
+ stop: [],
+ serviceTier: null,
+ parallelToolCalls: true,
maxSeqLength: 4096,
maxTokens: 8192,
systemPrompt: "",