diff --git a/src/components/openclaw/AgentsDefaultsPanel.tsx b/src/components/openclaw/AgentsDefaultsPanel.tsx index 03d5af3f9..c4a9abf18 100644 --- a/src/components/openclaw/AgentsDefaultsPanel.tsx +++ b/src/components/openclaw/AgentsDefaultsPanel.tsx @@ -17,7 +17,6 @@ const AgentsDefaultsPanel: React.FC = () => { const { data: agentsData, isLoading } = useOpenClawAgentsDefaults(); const saveAgentsMutation = useSaveOpenClawAgentsDefaults(); const [defaults, setDefaults] = useState(null); - const [primaryModel, setPrimaryModel] = useState(""); const [fallbacks, setFallbacks] = useState(""); // Extra known fields from agents.defaults @@ -26,13 +25,15 @@ const AgentsDefaultsPanel: React.FC = () => { const [contextTokens, setContextTokens] = useState(""); const [maxConcurrent, setMaxConcurrent] = useState(""); + // Primary model is read-only — set via the "Set as default model" button on provider cards + const primaryModel = agentsData?.model?.primary ?? ""; + useEffect(() => { // agentsData is undefined while loading, null when config section is absent if (agentsData === undefined) return; setDefaults(agentsData); if (agentsData) { - setPrimaryModel(agentsData.model?.primary ?? ""); setFallbacks((agentsData.model?.fallbacks ?? []).join(", ")); // Extract known extra fields @@ -48,17 +49,21 @@ const AgentsDefaultsPanel: React.FC = () => { // Preserve all unknown fields from original data const updated: OpenClawAgentsDefaults = { ...defaults }; - // Model configuration + // Model configuration — primary is read-only, preserve original value const fallbackList = fallbacks .split(",") .map((s) => s.trim()) .filter(Boolean); - if (primaryModel.trim()) { + const origPrimary = defaults?.model?.primary; + if (origPrimary) { updated.model = { - primary: primaryModel.trim(), + primary: origPrimary, ...(fallbackList.length > 0 ? { fallbacks: fallbackList } : {}), }; + } else if (fallbackList.length > 0) { + // No primary set but user provided fallbacks — keep fallbacks only + updated.model = { primary: "", fallbacks: fallbackList }; } // Optional fields @@ -122,12 +127,9 @@ const AgentsDefaultsPanel: React.FC = () => { - setPrimaryModel(e.target.value)} - placeholder="provider/model-id" - className="font-mono text-xs" - /> +
+ {primaryModel || t("openclaw.agents.notSet")} +

{t("openclaw.agents.primaryModelHint")}

diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index bba813d43..9e5a393fc 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -1218,7 +1218,8 @@ "description": "Manage agents.defaults in openclaw.json (default model, runtime parameters, etc.)", "modelSection": "Model Configuration", "primaryModel": "Primary Model", - "primaryModelHint": "Format: provider/model-id", + "primaryModelHint": "Set via the \"Set as Default Model\" button in the provider list", + "notSet": "Not set", "fallbackModels": "Fallback Models", "fallbackModelsHint": "Comma-separated, ordered by priority", "runtimeSection": "Runtime Parameters", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index d417863f1..4d1bedcb7 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -1218,7 +1218,8 @@ "description": "openclaw.json の agents.defaults 設定を管理(デフォルトモデル、ランタイムパラメータなど)", "modelSection": "モデル設定", "primaryModel": "プライマリモデル", - "primaryModelHint": "形式: provider/model-id", + "primaryModelHint": "プロバイダ一覧の「デフォルトモデルに設定」ボタンで設定します", + "notSet": "未設定", "fallbackModels": "フォールバックモデル", "fallbackModelsHint": "カンマ区切り、優先度順", "runtimeSection": "ランタイムパラメータ", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index 5c64357d9..df93dcb85 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -1218,7 +1218,8 @@ "description": "管理 openclaw.json 中的 agents.defaults 配置(默认模型、运行参数等)", "modelSection": "模型配置", "primaryModel": "主模型", - "primaryModelHint": "格式:provider/model-id", + "primaryModelHint": "在供应商列表中通过「设为默认模型」按钮设置", + "notSet": "未设置", "fallbackModels": "回退模型", "fallbackModelsHint": "逗号分隔,按优先级排列", "runtimeSection": "运行参数",