import { useState } from "react"; import Dropdown from "./Dropdown"; import NumberInput from "./NumberInput"; import InferencePopup from "./InferencePopup"; import { setModelLayers } from "../utils/modelCookies"; import { useAPI } from "../hooks/useAPI"; import { devLog, devError } from "../utils/devLogger"; const Options = ({ models, selectedModel1, selectedModel2, setSelectedModel1, setSelectedModel2, numLayers, setNumLayers, layerRecipe, embeddingLambdas, linearLambdas, setModels, mergedName, setMergedName, isSpaceLoading, }) => { const [isLoading, setIsLoading] = useState(false); const [mergeStatus, setMergeStatus] = useState(""); const [isInferenceOpen, setIsInferenceOpen] = useState(false); const { mergeModels, checkTaskStatus } = useAPI(); const handleMerge = async () => { if ( !selectedModel1 || !selectedModel2 || layerRecipe.length === 0 || !mergedName.trim() ) { setMergeStatus( "Error: Please select models, configure recipe, and provide a merged model name" ); return; } setIsLoading(true); setMergeStatus("Merging models..."); try { // Convert layer indices from 1-based (frontend) to 0-based (backend) const backendLayerRecipe = layerRecipe.map((layer) => layer.map((block) => [ block[0] - 1, // Convert sourceLayer from 1-based to 0-based block[1], // modelIndex stays the same block[2], // percentage stays the same ]) ); const mergeData = { model1_name: selectedModel1, model2_name: selectedModel2, layer_recipe: backendLayerRecipe, embedding_lambdas: embeddingLambdas, linear_lambdas: linearLambdas, merged_name: mergedName, }; devLog("Starting merge with data:", mergeData); const taskId = await mergeModels(mergeData); devLog("Got merge task ID:", taskId); if (taskId) { checkTaskStatus( taskId, (taskResult) => { devLog("Merge result:", taskResult); if (taskResult.response) { setMergeStatus("Merge successful!"); const newModelName = taskResult.response || mergedName; setModels((prev) => [...prev, newModelName]); setModelLayers(newModelName, numLayers); } else { setMergeStatus( `Merge failed: ${taskResult.error || "Unknown error"}` ); } setIsLoading(false); }, (error) => { devError("Merge task failed:", error); setMergeStatus(`Merge failed: ${error}`); setIsLoading(false); } ); } } catch (error) { devError("Merge error:", error); setMergeStatus(`Error: ${error.message}`); setIsLoading(false); } }; return (