Skip to content

Commit ccec599

Browse files
committed
OPIK-1386 move guardrails logic to a new resource failing test green
1 parent 1deea5a commit ccec599

File tree

2 files changed

+63
-27
lines changed

2 files changed

+63
-27
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.comet.opik.api.resources.v1.priv;
2+
3+
import com.codahale.metrics.annotation.Timed;
4+
import com.comet.opik.api.GuardrailBatch;
5+
import com.comet.opik.domain.GuardrailsService;
6+
import com.comet.opik.infrastructure.auth.RequestContext;
7+
import com.comet.opik.infrastructure.ratelimit.RateLimited;
8+
import com.comet.opik.utils.AsyncUtils;
9+
import io.swagger.v3.oas.annotations.Operation;
10+
import io.swagger.v3.oas.annotations.media.Content;
11+
import io.swagger.v3.oas.annotations.media.Schema;
12+
import io.swagger.v3.oas.annotations.parameters.RequestBody;
13+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
14+
import io.swagger.v3.oas.annotations.tags.Tag;
15+
import jakarta.inject.Provider;
16+
import jakarta.validation.Valid;
17+
import jakarta.validation.constraints.NotNull;
18+
import jakarta.ws.rs.Consumes;
19+
import jakarta.ws.rs.POST;
20+
import jakarta.ws.rs.Path;
21+
import jakarta.ws.rs.Produces;
22+
import jakarta.ws.rs.core.MediaType;
23+
import jakarta.ws.rs.core.Response;
24+
import lombok.NonNull;
25+
import lombok.RequiredArgsConstructor;
26+
import lombok.extern.slf4j.Slf4j;
27+
28+
import static com.comet.opik.utils.AsyncUtils.setRequestContext;
29+
30+
@Path("/v1/private/guardrails")
31+
@Produces(MediaType.APPLICATION_JSON)
32+
@Consumes(MediaType.APPLICATION_JSON)
33+
@Timed
34+
@Slf4j
35+
@RequiredArgsConstructor(onConstructor_ = @jakarta.inject.Inject)
36+
@Tag(name = "Guardrails", description = "Guardrails related resources")
37+
public class GuardrailsResource {
38+
private final @NonNull GuardrailsService guardrailsService;
39+
private final @NonNull Provider<RequestContext> requestContext;
40+
41+
@POST
42+
@Operation(operationId = "addGuardrailsBatch", summary = "Batch guardrails for traces", description = "Batch guardrails for traces", responses = {
43+
@ApiResponse(responseCode = "204", description = "No Content")})
44+
@RateLimited
45+
public Response addGuardrailsBatch(
46+
@RequestBody(content = @Content(schema = @Schema(implementation = GuardrailBatch.class))) @NotNull @Valid GuardrailBatch batch) {
47+
48+
String workspaceId = requestContext.get().getWorkspaceId();
49+
50+
log.info("Add guardrails batch, size {} on workspaceId '{}'", batch.guardrails().size(),
51+
workspaceId);
52+
53+
guardrailsService.addTraceGuardrails(batch.guardrails())
54+
.contextWrite(ctx -> setRequestContext(ctx, requestContext))
55+
.retryWhen(AsyncUtils.handleConnectionError())
56+
.block();
57+
58+
log.info("Done adding guardrails batch, size {} on workspaceId '{}'", batch.guardrails().size(),
59+
workspaceId);
60+
61+
return Response.noContent().build();
62+
}
63+
}

Diff for: apps/opik-backend/src/main/java/com/comet/opik/api/resources/v1/priv/TracesResource.java

-27
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import com.comet.opik.api.FeedbackScore;
1010
import com.comet.opik.api.FeedbackScoreBatch;
1111
import com.comet.opik.api.FeedbackScoreNames;
12-
import com.comet.opik.api.GuardrailBatch;
1312
import com.comet.opik.api.ProjectStats;
1413
import com.comet.opik.api.Trace;
1514
import com.comet.opik.api.Trace.TracePage;
@@ -26,7 +25,6 @@
2625
import com.comet.opik.domain.CommentDAO;
2726
import com.comet.opik.domain.CommentService;
2827
import com.comet.opik.domain.FeedbackScoreService;
29-
import com.comet.opik.domain.GuardrailsService;
3028
import com.comet.opik.domain.Streamer;
3129
import com.comet.opik.domain.TraceService;
3230
import com.comet.opik.domain.workspaces.WorkspaceMetadata;
@@ -92,7 +90,6 @@ public class TracesResource {
9290

9391
private final @NonNull TraceService service;
9492
private final @NonNull FeedbackScoreService feedbackScoreService;
95-
private final @NonNull GuardrailsService guardrailsService;
9693
private final @NonNull CommentService commentService;
9794
private final @NonNull FiltersFactory filtersFactory;
9895
private final @NonNull WorkspaceMetadataService workspaceMetadataService;
@@ -429,30 +426,6 @@ public Response scoreBatchOfTraces(
429426
return Response.noContent().build();
430427
}
431428

432-
@PUT
433-
@Path("/guardrails")
434-
@Operation(operationId = "addGuardrailsBatch", summary = "Batch guardrails for traces", description = "Batch guardrails for traces", responses = {
435-
@ApiResponse(responseCode = "204", description = "No Content")})
436-
@RateLimited
437-
public Response addGuardrailsBatch(
438-
@RequestBody(content = @Content(schema = @Schema(implementation = GuardrailBatch.class))) @NotNull @Valid GuardrailBatch batch) {
439-
440-
String workspaceId = requestContext.get().getWorkspaceId();
441-
442-
log.info("Add guardrails batch for traces, size {} on workspaceId '{}'", batch.guardrails().size(),
443-
workspaceId);
444-
445-
guardrailsService.addTraceGuardrails(batch.guardrails())
446-
.contextWrite(ctx -> setRequestContext(ctx, requestContext))
447-
.retryWhen(AsyncUtils.handleConnectionError())
448-
.block();
449-
450-
log.info("Done adding guardrails batch for traces, size {} on workspaceId '{}'", batch.guardrails().size(),
451-
workspaceId);
452-
453-
return Response.noContent().build();
454-
}
455-
456429
@GET
457430
@Path("/stats")
458431
@Operation(operationId = "getTraceStats", summary = "Get trace stats", description = "Get trace stats", responses = {

0 commit comments

Comments
 (0)