Skip to content

Commit 94d0c74

Browse files
authored
Evaluations V2 CRUD (#932)
1 parent da55c2a commit 94d0c74

File tree

45 files changed

+1817
-482
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1817
-482
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use server'
2+
3+
import {
4+
EvaluationOptionsSchema,
5+
EvaluationSettingsSchema,
6+
} from '@latitude-data/core/browser'
7+
import { createEvaluationV2 } from '@latitude-data/core/services/evaluationsV2/create'
8+
import { z } from 'zod'
9+
import { withDocument } from '../procedures'
10+
11+
export const createEvaluationV2Action = withDocument
12+
.createServerAction()
13+
.input(
14+
z.object({
15+
settings: EvaluationSettingsSchema,
16+
options: EvaluationOptionsSchema.partial().optional(),
17+
}),
18+
)
19+
.handler(async ({ ctx, input }) => {
20+
const result = await createEvaluationV2({
21+
document: ctx.document,
22+
commit: ctx.commit,
23+
settings: input.settings,
24+
options: input.options,
25+
workspace: ctx.workspace,
26+
}).then((r) => r.unwrap())
27+
28+
return result
29+
})
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use server'
2+
3+
import { deleteEvaluationV2 } from '@latitude-data/core/services/evaluationsV2/delete'
4+
import { z } from 'zod'
5+
import { withEvaluation } from '../procedures'
6+
7+
export const deleteEvaluationV2Action = withEvaluation
8+
.createServerAction()
9+
.input(z.object({}))
10+
.handler(async ({ ctx }) => {
11+
const result = await deleteEvaluationV2({
12+
evaluation: ctx.evaluation,
13+
commit: ctx.commit,
14+
workspace: ctx.workspace,
15+
}).then((r) => r.unwrap())
16+
17+
return result
18+
})
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './create'
2+
export * from './delete'
3+
export * from './update'
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'use server'
2+
3+
import {
4+
EvaluationOptionsSchema,
5+
EvaluationSettingsSchema,
6+
} from '@latitude-data/core/browser'
7+
import { updateEvaluationV2 } from '@latitude-data/core/services/evaluationsV2/update'
8+
import { z } from 'zod'
9+
import { withEvaluation } from '../procedures'
10+
11+
export const updateEvaluationV2Action = withEvaluation
12+
.createServerAction()
13+
.input(
14+
z.object({
15+
settings: EvaluationSettingsSchema.omit({ type: true, metric: true })
16+
.partial()
17+
.optional(),
18+
options: EvaluationOptionsSchema.partial().optional(),
19+
}),
20+
)
21+
.handler(async ({ ctx, input }) => {
22+
const result = await updateEvaluationV2({
23+
evaluation: ctx.evaluation,
24+
commit: ctx.commit,
25+
settings: input.settings,
26+
options: input.options,
27+
workspace: ctx.workspace,
28+
}).then((r) => r.unwrap())
29+
30+
return result
31+
})

apps/web/src/actions/procedures/index.ts

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import {
66
UnauthorizedError,
77
} from '@latitude-data/core/lib/errors'
88
import {
9+
CommitsRepository,
910
DocumentVersionsRepository,
11+
EvaluationsV2Repository,
1012
ProjectsRepository,
1113
} from '@latitude-data/core/repositories'
1214
import * as Sentry from '@sentry/nextjs'
@@ -81,21 +83,51 @@ export const withProject = createServerActionProcedure(authProcedure)
8183
return { ...ctx, project }
8284
})
8385

84-
export const withDocument = createServerActionProcedure(withProject)
85-
.input(z.object({ commitUuid: z.string(), documentUuid: z.string() }))
86+
export const withCommit = createServerActionProcedure(withProject)
87+
.input(z.object({ commitUuid: z.string() }))
88+
.handler(async ({ input, ctx }) => {
89+
const repository = new CommitsRepository(ctx.workspace.id)
90+
const commit = await repository
91+
.getCommitByUuid({
92+
projectId: ctx.project.id,
93+
uuid: input.commitUuid,
94+
})
95+
.then((r) => r.unwrap())
96+
97+
return { ...ctx, commit }
98+
})
99+
100+
export const withDocument = createServerActionProcedure(withCommit)
101+
.input(z.object({ documentUuid: z.string() }))
86102
.handler(async ({ input, ctx }) => {
87103
const repo = new DocumentVersionsRepository(ctx.workspace.id)
88104
const document = await repo
89105
.getDocumentAtCommit({
90106
projectId: ctx.project.id,
91-
commitUuid: input.commitUuid,
107+
commitUuid: ctx.commit.uuid,
92108
documentUuid: input.documentUuid,
93109
})
94110
.then((r) => r.unwrap())
95111

96112
return { ...ctx, document, currentCommitUuid: input.commitUuid }
97113
})
98114

115+
export const withEvaluation = createServerActionProcedure(withDocument)
116+
.input(z.object({ evaluationUuid: z.string() }))
117+
.handler(async ({ input, ctx }) => {
118+
const repository = new EvaluationsV2Repository(ctx.workspace.id)
119+
const evaluation = await repository
120+
.getAtCommitByDocument({
121+
projectId: ctx.project.id,
122+
commitUuid: ctx.commit.uuid,
123+
documentUuid: ctx.document.documentUuid,
124+
evaluationUuid: input.evaluationUuid,
125+
})
126+
.then((r) => r.unwrap())
127+
128+
return { ...ctx, evaluation }
129+
})
130+
99131
export const withAdmin = createServerActionProcedure(authProcedure).handler(
100132
async ({ ctx }) => {
101133
if (!ctx.user.admin) throw new UnauthorizedError('Unauthorized')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { authHandler } from '$/middlewares/authHandler'
2+
import { errorHandler } from '$/middlewares/errorHandler'
3+
import { Workspace } from '@latitude-data/core/browser'
4+
import {
5+
CommitsRepository,
6+
DocumentVersionsRepository,
7+
EvaluationsV2Repository,
8+
} from '@latitude-data/core/repositories'
9+
import { NextRequest, NextResponse } from 'next/server'
10+
11+
export const GET = errorHandler(
12+
authHandler(
13+
async (
14+
_: NextRequest,
15+
{
16+
params,
17+
workspace,
18+
}: {
19+
params: {
20+
projectId: number
21+
commitUuid: string
22+
documentUuid: string
23+
}
24+
workspace: Workspace
25+
},
26+
) => {
27+
const { projectId, commitUuid, documentUuid } = params
28+
29+
const commitsRepository = new CommitsRepository(workspace.id)
30+
const commit = await commitsRepository
31+
.getCommitByUuid({
32+
projectId: projectId,
33+
uuid: commitUuid,
34+
})
35+
.then((r) => r.unwrap())
36+
37+
const documentsRepository = new DocumentVersionsRepository(workspace.id)
38+
const document = await documentsRepository
39+
.getDocumentAtCommit({
40+
projectId: projectId,
41+
commitUuid: commit.uuid,
42+
documentUuid: documentUuid,
43+
})
44+
.then((r) => r.unwrap())
45+
46+
const evaluationsRepository = new EvaluationsV2Repository(workspace.id)
47+
const evaluations = await evaluationsRepository
48+
.listAtCommitByDocument({
49+
projectId: projectId,
50+
commitUuid: commit.uuid,
51+
documentUuid: document.documentUuid,
52+
})
53+
.then((r) => r.unwrap())
54+
55+
return NextResponse.json(evaluations, { status: 200 })
56+
},
57+
),
58+
)

apps/web/src/lib/evaluations.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import {
2+
EvaluationConfiguration,
3+
EvaluationMetric,
4+
EvaluationMetricSpecification,
5+
EvaluationResultMetadata,
6+
EvaluationType,
7+
HumanEvaluationMetric,
8+
LlmEvaluationMetric,
9+
RuleEvaluationExactMatchSpecification,
10+
RuleEvaluationMetric,
11+
RuleEvaluationRegularExpressionSpecification,
12+
} from '@latitude-data/constants'
13+
import { IconName } from '@latitude-data/web-ui'
14+
15+
export type EvaluationMetricFrontendSpecification<
16+
T extends EvaluationType = EvaluationType,
17+
M extends EvaluationMetric<T> = EvaluationMetric<T>,
18+
C extends EvaluationConfiguration<M> = EvaluationConfiguration<M>,
19+
R extends EvaluationResultMetadata<M> = EvaluationResultMetadata<M>,
20+
> = EvaluationMetricSpecification<T, M, C, R> & {
21+
icon: IconName
22+
}
23+
24+
// prettier-ignore
25+
export type EvaluationMetricSpecifications = {
26+
[T in EvaluationType]: { [M in EvaluationMetric<T>]: EvaluationMetricFrontendSpecification<T, M> }
27+
}
28+
29+
export const EVALUATION_METRIC_SPECIFICATIONS: EvaluationMetricSpecifications =
30+
{
31+
[EvaluationType.Rule]: {
32+
[RuleEvaluationMetric.ExactMatch]: {
33+
...RuleEvaluationExactMatchSpecification,
34+
icon: 'equal',
35+
},
36+
[RuleEvaluationMetric.RegularExpression]: {
37+
...RuleEvaluationRegularExpressionSpecification,
38+
icon: 'regex',
39+
},
40+
[RuleEvaluationMetric.LengthCount]: undefined as any, // TODO: Implement
41+
[RuleEvaluationMetric.LexicalOverlap]: undefined as any, // TODO: Implement
42+
[RuleEvaluationMetric.SemanticSimilarity]: undefined as any, // TODO: Implement
43+
},
44+
[EvaluationType.Llm]: {
45+
[LlmEvaluationMetric.Binary]: undefined as any, // TODO: Implement
46+
[LlmEvaluationMetric.Rating]: undefined as any, // TODO: Implement
47+
[LlmEvaluationMetric.Comparison]: undefined as any, // TODO: Implement
48+
},
49+
[EvaluationType.Human]: {
50+
[HumanEvaluationMetric.Binary]: undefined as any, // TODO: Implement
51+
[HumanEvaluationMetric.Rating]: undefined as any, // TODO: Implement
52+
[HumanEvaluationMetric.Comparison]: undefined as any, // TODO: Implement
53+
},
54+
}
55+
56+
// prettier-ignore
57+
// eslint-disable-next-line no-redeclare
58+
export function getEvaluationMetricSpecification<
59+
T extends EvaluationType,
60+
M extends EvaluationMetric<T>,
61+
C extends EvaluationConfiguration<M> = EvaluationConfiguration<M>,
62+
R extends EvaluationResultMetadata<M> = EvaluationResultMetadata<M>,
63+
>(type: T, metric: M): EvaluationMetricFrontendSpecification<T, M, C, R> | undefined
64+
65+
// prettier-ignore
66+
// eslint-disable-next-line no-redeclare
67+
export function getEvaluationMetricSpecification<
68+
T extends EvaluationType,
69+
M extends EvaluationMetric<T>,
70+
R extends EvaluationResultMetadata<M> = EvaluationResultMetadata<M>,
71+
C extends EvaluationConfiguration<M> = EvaluationConfiguration<M>,
72+
>(type: T, metric: M): EvaluationMetricFrontendSpecification<T, M, C, R> | undefined
73+
74+
// prettier-ignore
75+
// eslint-disable-next-line no-redeclare
76+
export function getEvaluationMetricSpecification<
77+
T extends EvaluationType,
78+
M extends EvaluationMetric<T>,
79+
C extends EvaluationConfiguration<M>,
80+
R extends EvaluationResultMetadata<M>,
81+
>(type: T, metric: M): EvaluationMetricFrontendSpecification<T, M, C, R> | undefined {
82+
return EVALUATION_METRIC_SPECIFICATIONS[type]?.[metric] as any
83+
}

apps/web/src/services/routes/api.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ export const API_ROUTES = {
125125
suggestions: {
126126
root: `${documentRoot}/suggestions`,
127127
},
128+
evaluationsV2: {
129+
root: `${documentRoot}/evaluations-v2`,
130+
},
128131
}
129132
},
130133
},

0 commit comments

Comments
 (0)