(
diff --git a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/deployments/index.tsx b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/deployments/index.tsx
index a7c75bc458..46265127dc 100644
--- a/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/deployments/index.tsx
+++ b/web/oss/src/pages/w/[workspace_id]/p/[project_id]/apps/[app_id]/deployments/index.tsx
@@ -78,7 +78,7 @@ const DeploymentsPage = () => {
return (
- Deployment
+ Deployment
({
container: {
@@ -66,7 +66,7 @@ const AppDetailsSection = memo(() => {
return (
<>
- {currentApp?.app_name || ""}
+ {currentApp?.app_name || ""}
,
+) => {
+ const {projectId} = getProjectValues()
+
+ try {
+ const data = await axios.put(
+ `${getAgentaApiUrl()}/preview/simple/evaluators/${evaluatorId}?project_id=${projectId}`,
+ evaluatorPayload,
+ )
+
+ return data
+ } catch (error) {
+ throw error
+ }
+}
+
const evaluatorIconsMap = {
auto_exact_match: exactMatchImg,
auto_similarity_match: similarityImg,
@@ -117,3 +135,11 @@ export const deleteEvaluatorConfig = async (configId: string) => {
return axios.delete(`/evaluators/configs/${configId}?project_id=${projectId}`)
}
+
+export const deleteHumanEvaluator = async (evaluatorId: string) => {
+ const {projectId} = getProjectValues()
+
+ return axios.post(
+ `${getAgentaApiUrl()}/preview/simple/evaluators/${evaluatorId}/archive?project_id=${projectId}`,
+ )
+}
diff --git a/web/oss/src/state/evaluators/atoms.ts b/web/oss/src/state/evaluators/atoms.ts
new file mode 100644
index 0000000000..1874aa5eb7
--- /dev/null
+++ b/web/oss/src/state/evaluators/atoms.ts
@@ -0,0 +1,103 @@
+import {atomFamily} from "jotai/utils"
+import {atomWithQuery} from "jotai-tanstack-query"
+
+import axios from "@/oss/lib/api/assets/axiosConfig"
+import {getMetricsFromEvaluator} from "@/oss/components/pages/observability/drawer/AnnotateDrawer/assets/transforms"
+import {Evaluator, EvaluatorConfig} from "@/oss/lib/Types"
+import {transformApiData} from "@/oss/lib/hooks/useAnnotations/assets/transformer"
+import {
+ EvaluatorDto,
+ EvaluatorPreviewDto,
+ EvaluatorsResponseDto,
+} from "@/oss/lib/hooks/useEvaluators/types"
+import {fetchAllEvaluators, fetchAllEvaluatorConfigs} from "@/oss/services/evaluators"
+import {selectedAppIdAtom} from "@/oss/state/app"
+import {selectedOrgAtom} from "@/oss/state/org"
+import {projectIdAtom} from "@/oss/state/project"
+import {userAtom} from "@/oss/state/profile"
+import {EvaluatorConfigsParams, EvaluatorsParams} from "./types"
+import {NO_APP_KEY, NO_PROJECT_KEY} from "./constant"
+import {parseQueries} from "./parse"
+
+export const evaluatorConfigsQueryAtomFamily = atomFamily(
+ ({projectId: overrideProjectId, appId: overrideAppId, preview}: EvaluatorConfigsParams = {}) =>
+ atomWithQuery((get) => {
+ const projectId = overrideProjectId ?? get(projectIdAtom)
+ const appId = overrideAppId ?? get(selectedAppIdAtom)
+ const user = get(userAtom) as {id?: string} | null
+
+ const enabled = !preview && Boolean(projectId && user?.id)
+ const projectKey = projectId ?? NO_PROJECT_KEY
+ const appKey = appId ?? NO_APP_KEY
+
+ return {
+ queryKey: [
+ "evaluator-configs",
+ preview ? "preview" : "regular",
+ projectKey,
+ appKey,
+ ] as const,
+ queryFn: async () => fetchAllEvaluatorConfigs(appId, projectId),
+ staleTime: 60_000,
+ refetchOnWindowFocus: false,
+ refetchOnReconnect: false,
+ refetchOnMount: false,
+ retry: false,
+ enabled,
+ }
+ }),
+)
+
+export const evaluatorsQueryAtomFamily = atomFamily(
+ ({projectId: overrideProjectId, preview, queriesKey}: EvaluatorsParams) =>
+ atomWithQuery((get) => {
+ const projectId = overrideProjectId ?? get(projectIdAtom)
+ const user = get(userAtom) as {id?: string} | null
+ const selectedOrg = get(selectedOrgAtom)
+ const members = selectedOrg?.default_workspace?.members ?? []
+ const projectKey = projectId ?? NO_PROJECT_KEY
+
+ const enabled = Boolean(projectId && user?.id)
+ const queryKey = preview
+ ? (["evaluators", "preview", projectKey, queriesKey] as const)
+ : (["evaluators", projectKey] as const)
+
+ return {
+ queryKey,
+ queryFn: async () => {
+ if (preview) {
+ if (!projectId) return []
+ const flags = parseQueries(queriesKey)
+ const response = await axios.post(
+ `/preview/simple/evaluators/query?project_id=${projectId}`,
+ flags
+ ? {
+ evaluator: {flags},
+ }
+ : {},
+ )
+ const evaluators =
+ response?.data?.evaluators?.map((item) =>
+ transformApiData({
+ data: item,
+ members,
+ }),
+ ) ?? []
+ return evaluators.map((evaluator) => ({
+ ...evaluator,
+ metrics: getMetricsFromEvaluator(evaluator as EvaluatorDto),
+ })) as EvaluatorPreviewDto[]
+ }
+
+ const data = await fetchAllEvaluators()
+ return data
+ },
+ staleTime: 60_000,
+ refetchOnWindowFocus: false,
+ refetchOnReconnect: false,
+ refetchOnMount: false,
+ retry: false,
+ enabled,
+ }
+ }),
+)
diff --git a/web/oss/src/state/evaluators/constant.ts b/web/oss/src/state/evaluators/constant.ts
new file mode 100644
index 0000000000..ae583bb3cd
--- /dev/null
+++ b/web/oss/src/state/evaluators/constant.ts
@@ -0,0 +1,2 @@
+export const NO_PROJECT_KEY = "__no-project__"
+export const NO_APP_KEY = "__no-app__"
diff --git a/web/oss/src/state/evaluators/index.ts b/web/oss/src/state/evaluators/index.ts
new file mode 100644
index 0000000000..89eeef800a
--- /dev/null
+++ b/web/oss/src/state/evaluators/index.ts
@@ -0,0 +1 @@
+export * from "./atoms"
diff --git a/web/oss/src/state/evaluators/parse.ts b/web/oss/src/state/evaluators/parse.ts
new file mode 100644
index 0000000000..4bb367bc66
--- /dev/null
+++ b/web/oss/src/state/evaluators/parse.ts
@@ -0,0 +1,8 @@
+export const parseQueries = (serialized: string) => {
+ if (!serialized || serialized === "null") return undefined
+ try {
+ return JSON.parse(serialized) as {is_human?: boolean}
+ } catch {
+ return undefined
+ }
+}
diff --git a/web/oss/src/state/evaluators/types.ts b/web/oss/src/state/evaluators/types.ts
new file mode 100644
index 0000000000..1fa1bd7460
--- /dev/null
+++ b/web/oss/src/state/evaluators/types.ts
@@ -0,0 +1,11 @@
+export type EvaluatorConfigsParams = {
+ projectId?: string | null
+ appId?: string | null
+ preview?: boolean
+}
+
+export type EvaluatorsParams = {
+ projectId?: string | null
+ preview: boolean
+ queriesKey: string
+}
diff --git a/web/package.json b/web/package.json
index 641cbc9e9f..f8db4efb44 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,6 +1,6 @@
{
"name": "agenta-web",
- "version": "0.58.0",
+ "version": "0.59.0",
"workspaces": [
"ee",
"oss",