import React, { useState } from "react"; import { Button } from "@/src/components/ui/button"; import { FormField, FormItem, FormLabel, FormMessage, } from "@/src/components/ui/form"; import { ModelParameters } from "@/src/components/ModelParameters"; import { InputCommandEmpty, InputCommandGroup, InputCommandInput, InputCommandList, InputCommand, InputCommandItem, } from "@/src/components/ui/input-command"; import { Popover, PopoverContent, PopoverTrigger, } from "@/src/components/ui/popover"; import { ChevronDown, CheckIcon, PlusIcon, EyeIcon } from "lucide-react"; import { CreateOrEditLLMSchemaDialog } from "@/src/features/playground/page/components/CreateOrEditLLMSchemaDialog"; import { type LlmSchema } from "@langfuse/shared"; import { Switch } from "@/src/components/ui/switch"; import { api } from "@/src/utils/api"; import { CardDescription } from "@/src/components/ui/card"; import { cn } from "@/src/utils/tailwind"; import { type PromptModelStepProps } from "@/src/features/experiments/types/stepProps"; import { StepHeader } from "@/src/features/experiments/components/shared/StepHeader"; import { TruncatedLabels } from "@/src/components/TruncatedLabels"; export const PromptModelStep: React.FC = ({ projectId, formState, promptModelState, modelState, structuredOutputState, }) => { const { form } = formState; const { promptsByName, selectedPromptName, setSelectedPromptName, selectedPromptVersion, setSelectedPromptVersion, } = promptModelState; const { modelParams, updateModelParamValue, setModelParamEnabled, availableModels, providerModelCombinations, availableProviders, } = modelState; const { structuredOutputEnabled, setStructuredOutputEnabled, setSelectedSchemaName, } = structuredOutputState; const [open, setOpen] = useState(false); const [selectedSchema, setSelectedSchema] = useState(null); const [schemaPopoverOpen, setSchemaPopoverOpen] = useState(false); const savedSchemas = api.llmSchemas.getAll.useQuery( { projectId }, { enabled: Boolean(projectId), staleTime: 1000 * 60 * 5, // 5 minutes }, ); const handleToggleStructuredOutput = (checked: boolean) => { setStructuredOutputEnabled(checked); if (checked) { // If turning on and schemas exist, auto-select first one if ( savedSchemas.data && savedSchemas.data.length > 0 && !selectedSchema ) { const firstSchema = savedSchemas.data[0]; setSelectedSchema(firstSchema); setSelectedSchemaName(firstSchema.name); form.setValue( "structuredOutputSchema", firstSchema.schema as Record, ); } } else { // If turning off, clear the form field setSelectedSchemaName(null); form.setValue("structuredOutputSchema", undefined); } }; return (
( Prompt
No prompt found. {promptsByName && Object.entries(promptsByName).map( ([name, promptData]) => ( { setSelectedPromptName(name); const latestVersion = promptData[0]; setSelectedPromptVersion( latestVersion.version, ); form.setValue("promptId", latestVersion.id); form.clearErrors("promptId"); }} > {name} ), )} No version found. {promptsByName && selectedPromptName && promptsByName[selectedPromptName] ? ( promptsByName[selectedPromptName].map((prompt) => ( { setSelectedPromptVersion(prompt.version); form.setValue("promptId", prompt.id); form.clearErrors("promptId"); }} >
Version {prompt.version} {prompt.labels.length > 0 && ( )}
)) ) : ( No versions available )}
)} /> ( Model {form.formState.errors.modelConfig && (

{[ form.formState.errors.modelConfig?.model?.message, form.formState.errors.modelConfig?.provider?.message, ].join(", ")}

)}
)} /> (
Structured output (optional)
{structuredOutputEnabled && ( <> {savedSchemas.data && savedSchemas.data.length > 0 ? (
No schema found. {savedSchemas.data.map((schema) => ( { setSelectedSchema(schema); setSelectedSchemaName(schema.name); field.onChange( schema.schema as Record, ); setSchemaPopoverOpen(false); }} > {schema.name} ))} {selectedSchema && ( { setSelectedSchema(updatedSchema); setSelectedSchemaName(updatedSchema.name); field.onChange( updatedSchema.schema as Record, ); }} onDelete={() => { setSelectedSchema(null); setSelectedSchemaName(null); field.onChange(undefined); }} > )}
) : ( { setSelectedSchema(newSchema); setSelectedSchemaName(newSchema.name); field.onChange( newSchema.schema as Record, ); // Toggle is already ON if we're seeing this button // No need to set it again }} > )} )} {structuredOutputEnabled ? "Configure the schema for structured LLM outputs" : "Enable to enforce a specific output format"}
)} />
); };