diff --git a/src/app/(dashboard)/dashboard/playground/components/StudioConfigPane.tsx b/src/app/(dashboard)/dashboard/playground/components/StudioConfigPane.tsx index decb51ed73..20440a705a 100644 --- a/src/app/(dashboard)/dashboard/playground/components/StudioConfigPane.tsx +++ b/src/app/(dashboard)/dashboard/playground/components/StudioConfigPane.tsx @@ -8,11 +8,14 @@ import type { PlaygroundEndpoint } from "@/lib/playground/codeExport"; import { endpointToPath } from "@/lib/playground/codeExport"; import PresetPicker from "./PresetPicker"; import ImprovePromptButton from "./ImprovePromptButton"; +import { useProviderOptions } from "@/app/(dashboard)/dashboard/translator/hooks/useProviderOptions"; +import { useAvailableModels } from "@/app/(dashboard)/dashboard/translator/hooks/useAvailableModels"; export interface ConfigState { endpoint: PlaygroundEndpoint; baseUrl: string; model: string; + provider?: string; systemPrompt: string; params: PlaygroundParams; } @@ -46,6 +49,10 @@ const ENDPOINT_OPTIONS: Array<{ value: PlaygroundEndpoint; label: string }> = [ */ export default function StudioConfigPane({ configState, setConfigState }: StudioConfigPaneProps) { const [collapsed, setCollapsed] = useState(false); + const { provider, setProvider, providerOptions, loading: loadingProviders } = useProviderOptions( + configState.provider ?? "" + ); + const { availableModels, loading: loadingModels } = useAvailableModels(); function update(key: K, value: ConfigState[K]) { setConfigState({ ...configState, [key]: value }); @@ -108,18 +115,56 @@ export default function StudioConfigPane({ configState, setConfigState }: Studio + {/* Provider */} +
+ + +
+ {/* Model */}
- update("model", e.target.value)} - placeholder="e.g. openai/gpt-4o" - className="w-full text-xs bg-surface border border-border rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-primary text-text-main" - /> + {availableModels.length > 0 ? ( + + ) : ( + update("model", e.target.value)} + placeholder="e.g. openai/gpt-4o" + className="w-full text-xs bg-surface border border-border rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-primary text-text-main" + /> + )}
{/* System prompt */} diff --git a/src/app/(dashboard)/dashboard/playground/components/tabs/BuildTab.tsx b/src/app/(dashboard)/dashboard/playground/components/tabs/BuildTab.tsx index 40bfb78c98..a3a5c521a1 100644 --- a/src/app/(dashboard)/dashboard/playground/components/tabs/BuildTab.tsx +++ b/src/app/(dashboard)/dashboard/playground/components/tabs/BuildTab.tsx @@ -6,9 +6,8 @@ import { useRef, useState } from "react"; import { useTranslations } from "next-intl"; import { useToolsBuilder } from "../../hooks/useToolsBuilder"; import { useStructuredOutput } from "../../hooks/useStructuredOutput"; -import ToolsBuilder from "../ToolsBuilder"; -import StructuredOutputEditor from "../StructuredOutputEditor"; import MarkdownMessage from "../MarkdownMessage"; +import BuildWizard from "./build/BuildWizard"; import type { ConfigState } from "../StudioConfigPane"; interface BuildTabProps { @@ -225,177 +224,104 @@ export default function BuildTab({ configState }: BuildTabProps) { await runRequest(newMessages); } - function clearConversation() { - setMessages([]); - setToolCalls([]); - setToolResultDrafts([]); - setValidationResult(null); - setPrompt(""); - } - - return ( -
- {/* Left panel: conversation + run */} -
- {/* Toolbar */} -
- - - {messages.length > 0 && ( - - )} - -
- {toolsBuilder.tools.length > 0 && ( - - {toolsBuilder.tools.length} tool{toolsBuilder.tools.length !== 1 ? "s" : ""} - - )} - {structuredOutput.enabled && ( - - JSON mode - + {msg.role === "user" ? ( + {msg.content} + ) : ( + )}
+ ))} - {/* Conversation history */} -
- {messages.map((msg, idx) => ( -
+ {/* Tool call UI */} + {toolCalls.length > 0 && ( +
+ {toolCalls.map((tc) => { + const draft = toolResultDrafts.find((d) => d.toolCallId === tc.id); + return (
- {msg.role === "user" ? ( - {msg.content} - ) : ( - - )} -
-
- ))} - - {/* Tool call UI */} - {toolCalls.length > 0 && ( -
- {toolCalls.map((tc) => { - const draft = toolResultDrafts.find((d) => d.toolCallId === tc.id); - return ( -
+ + function + + + {tc.function.name} + +
+
+                  {tc.function.arguments}
+                
+
+ +