diff --git a/agenta-web/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx b/agenta-web/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx index 30cc378d5..8de813dbe 100644 --- a/agenta-web/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx +++ b/agenta-web/src/components/pages/evaluations/autoEvaluation/AutoEvaluation.tsx @@ -540,7 +540,10 @@ const AutoEvaluation = () => { diff --git a/agenta-web/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/EvaluatorsModal.tsx b/agenta-web/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/EvaluatorsModal.tsx index afac6edf6..2d8a3c23a 100644 --- a/agenta-web/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/EvaluatorsModal.tsx +++ b/agenta-web/src/components/pages/evaluations/autoEvaluation/EvaluatorsModal/EvaluatorsModal.tsx @@ -79,14 +79,13 @@ const EvaluatorsModal = ({ .finally(() => setFetchingEvalConfigs(false)) } - const {data} = useVariants(currentApp)({ - appId, - onSuccess: (data) => { - if (data?.variants?.length) { - setSelectedVariant(data?.variants[0]) - } - }, - }) + const {data} = useVariants(currentApp)({appId}) + + useEffect(() => { + if (data?.variants?.length) { + setSelectedVariant(data?.variants[0].variant) + } + }, [data]) useEffect(() => { Promise.all([fetchAllEvaluators(), fetchAllEvaluatorConfigs(appId), fetchTestsets()]).then( diff --git a/agenta-web/src/lib/helpers/utils.ts b/agenta-web/src/lib/helpers/utils.ts index 40bf58140..c3dc2780c 100644 --- a/agenta-web/src/lib/helpers/utils.ts +++ b/agenta-web/src/lib/helpers/utils.ts @@ -130,6 +130,51 @@ export const safeParse = (str: string, fallback: any = "") => { } } +export const extractChatMessages = (testcase: any) => { + if (testcase.messages) + return formatMessages(normalizeMessages(parseStringToJson(testcase.messages))) + if (testcase.chat) return formatMessages(normalizeMessages(parseStringToJson(testcase.chat))) + + const filteredEntries = Object.entries(testcase).filter(([key]) => key !== "correct_answer") + + for (const [_, value] of filteredEntries) { + const parsedValue = parseStringToJson(value) + if (Array.isArray(parsedValue)) { + return formatMessages(parsedValue) + } + } + + return [] +} + +const parseStringToJson = (value: any) => { + if (typeof value === "string") { + try { + return JSON.parse(value) + } catch { + return value + } + } + return value +} + +const normalizeMessages = (messages: any) => { + if (!Array.isArray(messages) && typeof messages === "object") { + return [messages] + } + return messages +} + +const formatMessages = (messages: any) => { + if (typeof messages === "object" && !Array.isArray(messages)) { + messages = Object.values(messages) + } + + return Array.isArray(messages) + ? messages.map(({role, content, id}) => ({role, content, id})) + : [] +} + export const getAgentaApiUrl = () => { const apiUrl = process.env.NEXT_PUBLIC_AGENTA_API_URL diff --git a/agenta-web/src/services/api.ts b/agenta-web/src/services/api.ts index a3d6fa621..faa6b31ad 100644 --- a/agenta-web/src/services/api.ts +++ b/agenta-web/src/services/api.ts @@ -107,7 +107,7 @@ export async function callVariant( ): Promise { const isChatVariant = Array.isArray(chatMessages) && chatMessages.length > 0 // Separate input parameters into two dictionaries based on the 'input' property - const mainInputParams: Record = {} // Parameters with input = true + const mainInputParams: Record = {} // Parameters with input = true const secondaryInputParams: Record = {} // Parameters with input = false for (let key of Object.keys(inputParametersDict)) { @@ -118,6 +118,7 @@ export async function callVariant( if (paramDefinition && !paramDefinition.input) { secondaryInputParams[key] = inputParametersDict[key] } else { + // Parse the value if key is "messages" mainInputParams[key] = inputParametersDict[key] } }