diff --git a/apps/ai-game-creator-shell/src/App.tsx b/apps/ai-game-creator-shell/src/App.tsx index 4eff7552c..f771466d9 100644 --- a/apps/ai-game-creator-shell/src/App.tsx +++ b/apps/ai-game-creator-shell/src/App.tsx @@ -3095,6 +3095,58 @@ function formatLlmAgentStatusLine(agent: GameCreatorAgentLlmConfigStatus) { return parts.join(','); } +function llmStatusForAgentCard( + status: GameCreatorLlmConfigStatus | null, + agent: AgentStatusCard, +) { + return ( + status?.agents?.find( + (candidate) => + candidate.agentId === agent.taskId || candidate.agentId === agent.id, + ) ?? null + ); +} + +function formatAgentCardLlmStatus( + status: GameCreatorLlmConfigStatus | null, + agent: AgentStatusCard, +) { + const agentStatus = llmStatusForAgentCard(status, agent); + if (!agentStatus) { + return null; + } + return [ + `LLM:${agentStatus.configured ? '已配置' : '未就绪'}`, + agentStatus.model ?? '未命名模型', + agentStatus.apiKind, + `流式${agentStatus.stream ? '开' : '关'}`, + `Key${agentStatus.apiKeyPresent ? '已读' : '未读'}`, + ].join(' · '); +} + +function formatAgentDialogLlmStatus( + status: GameCreatorLlmConfigStatus | null, + agent: AgentStatusCard, +) { + const agentStatus = llmStatusForAgentCard(status, agent); + if (!agentStatus) { + return null; + } + const parts = [ + `LLM:${agentStatus.configured ? '已配置' : '未就绪'}`, + `${agentStatus.model ?? '未命名模型'} @ ${ + agentStatus.baseUrl ?? '未设置 base_url' + }`, + agentStatus.apiKind, + `流式 ${agentStatus.stream ? '开启' : '关闭'}`, + `API Key ${agentStatus.apiKeyPresent ? '已读取' : '未读取'}`, + ]; + if (!agentStatus.configured && agentStatus.error) { + parts.push(`错误:${agentStatus.error}`); + } + return parts.join(','); +} + function formatTraceTaskId(taskId: string, tasks: GameCreationAppTaskState[]) { const task = tasks.find((candidate) => candidate.id === taskId); if (!task) { @@ -3546,6 +3598,8 @@ export function App() { useState(false); const [agentRunStatus, setAgentRunStatus] = useState('未运行'); const [runtimeConfigOpen, setRuntimeConfigOpen] = useState(false); + const [llmConfigStatus, setLlmConfigStatus] = + useState(null); const [workspaceStatus, setWorkspaceStatus] = useState('请选择工作区'); const [selectedAgent, setSelectedAgent] = useState( null, @@ -5547,6 +5601,7 @@ export function App() { async function executeLlmConfigStatus() { const invoke = resolveTauriInvoke(); if (!invoke) { + setLlmConfigStatus(null); setMessages((current) => [ ...current, { role: 'assistant', text: '需要在 Tauri App 内运行。' }, @@ -5558,6 +5613,7 @@ export function App() { const status = await invoke( 'check_game_creator_llm_config', ); + setLlmConfigStatus(status); setCommandLog((current) => [...current, 'llm.config_check']); const agentLines = (status.agents ?? []).map(formatLlmAgentStatusLine); const summary = status.configured @@ -5579,6 +5635,7 @@ export function App() { }, ]); } catch (error) { + setLlmConfigStatus(null); setMessages((current) => [ ...current, { @@ -9333,6 +9390,9 @@ export function App() { 0, agentConversationMessages.length - visibleAgentConversationMessages.length, ); + const selectedAgentLlmStatus = selectedAgent + ? formatAgentDialogLlmStatus(llmConfigStatus, selectedAgent) + : null; function showEarlierConversationMessages() { setConversationVisibleCount((current) => @@ -10017,32 +10077,39 @@ export function App() {
- {agentStatusCards.map((agent) => ( - - ))} + {agentStatusCards.map((agent) => { + const agentLlmStatus = formatAgentCardLlmStatus( + llmConfigStatus, + agent, + ); + return ( + + ); + })}
@@ -10098,9 +10165,18 @@ export function App() { }`}

) : null} + {selectedAgentLlmStatus ? ( +

{selectedAgentLlmStatus}

+ ) : null}

{selectedAgent.summary}

+