diff --git a/.gitignore b/.gitignore index f67d300..5c4e412 100644 --- a/.gitignore +++ b/.gitignore @@ -162,4 +162,6 @@ $RECYCLE.BIN/ .env* -.idea \ No newline at end of file +.idea + +.metals \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 6c6c247..ee30f24 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,8 @@ "java.configuration.updateBuildConfiguration": "automatic", "java.import.maven.enabled": true, "java.compile.nullAnalysis.mode": "automatic", - "java.format.settings.url": ".vscode/java-formatter.xml" + "java.format.settings.url": ".vscode/java-formatter.xml", + "files.watcherExclude": { + "**/target": true + } } diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..566c7ff --- /dev/null +++ b/bun.lock @@ -0,0 +1,33 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "judgeval-java", + "devDependencies": { + "dotenv-cli": "^7.4.2", + }, + }, + }, + "packages": { + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], + + "dotenv-cli": ["dotenv-cli@7.4.4", "", { "dependencies": { "cross-spawn": "^7.0.6", "dotenv": "^16.3.0", "dotenv-expand": "^10.0.0", "minimist": "^1.2.6" }, "bin": { "dotenv": "cli.js" } }, "sha512-XkBYCG0tPIes+YZr4SpfFv76SQrV/LeCE8CI7JSEMi3VR9MvTihCGTOtbIexD6i2mXF+6px7trb1imVCXSNMDw=="], + + "dotenv-expand": ["dotenv-expand@10.0.0", "", {}, "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + } +} diff --git a/examples/pom.xml b/examples/pom.xml index 6a21799..fdc9574 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -26,7 +26,7 @@ com.judgmentlabs judgeval-java - 0.4.2 + 0.5.0 io.opentelemetry diff --git a/examples/src/main/java/examples/simple_chat/SimpleChat.java b/examples/src/main/java/examples/simple_chat/SimpleChat.java index 3198025..83118aa 100644 --- a/examples/src/main/java/examples/simple_chat/SimpleChat.java +++ b/examples/src/main/java/examples/simple_chat/SimpleChat.java @@ -12,10 +12,11 @@ public class SimpleChat { public static void main(String[] args) { var client = Judgeval.builder() + .projectName("SimpleChat-Java") .apiKey(System.getenv("JUDGMENT_API_KEY")) .organizationId(System.getenv("JUDGMENT_ORG_ID")) .build(); - var tracer = client.tracer().create().projectName("SimpleChat-Java").build(); + var tracer = client.tracer().create().build(); OpenAIClient otelClient = OpenAIOkHttpClient.fromEnv(); @@ -36,7 +37,8 @@ public static void main(String[] args) { .property("expected_output", "4") .build()); - tracer.asyncTraceEvaluate(client.scorers().tracePromptScorer().get("ExampleTraceScorer")); + tracer.asyncTraceEvaluate( + client.scorers().tracePromptScorer().get("ExampleTraceScorer")); }); @@ -45,4 +47,4 @@ public static void main(String[] args) { } catch (InterruptedException ignored) { } } -} \ No newline at end of file +} diff --git a/judgeval-java/pom.xml b/judgeval-java/pom.xml index e4f86c2..ccc981c 100644 --- a/judgeval-java/pom.xml +++ b/judgeval-java/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.judgmentlabs judgeval-java - 0.4.2 + 0.5.0 jar Judgeval Java Java SDK for Judgeval diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/Judgeval.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/Judgeval.java index 5f9a7d0..bb6aba3 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/Judgeval.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/Judgeval.java @@ -1,11 +1,15 @@ package com.judgmentlabs.judgeval; import java.util.Objects; +import java.util.Optional; import com.judgmentlabs.judgeval.evaluation.EvaluationFactory; import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; +import com.judgmentlabs.judgeval.internal.api.models.ResolveProjectRequest; +import com.judgmentlabs.judgeval.internal.api.models.ResolveProjectResponse; import com.judgmentlabs.judgeval.scorers.ScorersFactory; import com.judgmentlabs.judgeval.tracer.TracerFactory; +import com.judgmentlabs.judgeval.utils.Logger; /** * Main entry point for the Judgment SDK. Provides access to tracer, scorer, and @@ -15,13 +19,22 @@ public class Judgeval { private final String apiKey; private final String organizationId; private final String apiUrl; + private final String projectName; + private final Optional projectId; private final JudgmentSyncClient internalClient; protected Judgeval(Builder builder) { this.apiKey = Objects.requireNonNull(builder.apiKey, "apiKey required"); this.organizationId = Objects.requireNonNull(builder.organizationId, "organizationId required"); - this.apiUrl = builder.apiUrl != null ? builder.apiUrl : Env.JUDGMENT_API_URL; + this.projectName = Objects.requireNonNull(builder.projectName, "projectName required"); + this.apiUrl = Optional.ofNullable(builder.apiUrl).orElse(Env.JUDGMENT_API_URL); this.internalClient = new JudgmentSyncClient(apiUrl, apiKey, organizationId); + this.projectId = resolveProjectId(projectName); + + if (projectId.isEmpty()) { + Logger.warning("Project '" + projectName + "' not found. " + + "Some operations requiring project_id will be skipped."); + } } /** @@ -30,7 +43,7 @@ protected Judgeval(Builder builder) { * @return the tracer factory */ public TracerFactory tracer() { - return new TracerFactory(internalClient); + return new TracerFactory(internalClient, projectName, projectId); } /** @@ -39,7 +52,7 @@ public TracerFactory tracer() { * @return the scorer factory */ public ScorersFactory scorers() { - return new ScorersFactory(internalClient); + return new ScorersFactory(internalClient, projectId); } /** @@ -48,7 +61,15 @@ public ScorersFactory scorers() { * @return the evaluation factory */ public EvaluationFactory evaluation() { - return new EvaluationFactory(internalClient); + return new EvaluationFactory(internalClient, projectId, projectName); + } + + public Optional getProjectId() { + return projectId; + } + + public String getProjectName() { + return projectName; } /** @@ -60,6 +81,17 @@ public static Builder builder() { return new Builder(); } + private Optional resolveProjectId(String name) { + try { + ResolveProjectRequest request = new ResolveProjectRequest(); + request.setProjectName(name); + ResolveProjectResponse response = internalClient.postProjectsResolve(request); + return Optional.ofNullable(response.getProjectId()).map(Object::toString); + } catch (Exception e) { + return Optional.empty(); + } + } + /** * Builder for configuring and creating Judgeval instances. */ @@ -67,6 +99,19 @@ public static class Builder { private String apiKey = Env.JUDGMENT_API_KEY; private String organizationId = Env.JUDGMENT_ORG_ID; private String apiUrl = Env.JUDGMENT_API_URL; + private String projectName; + + /** + * Sets the project name used for project-scoped operations. + * + * @param projectName + * the project name + * @return this builder + */ + public Builder projectName(String projectName) { + this.projectName = projectName; + return this; + } /** * Sets the API key for authentication. diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/data/ScorerData.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/data/ScorerData.java index e51c78b..529573d 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/data/ScorerData.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/data/ScorerData.java @@ -1,24 +1,120 @@ package com.judgmentlabs.judgeval.data; +import java.util.HashMap; import java.util.Map; -/** - * Represents the result of a single scorer evaluation. - */ -public class ScorerData extends com.judgmentlabs.judgeval.internal.api.models.ScorerData { +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ScorerData { + @JsonProperty("name") + private String name; + @JsonProperty("score") + private Double score; + @JsonProperty("success") + private Boolean success; + @JsonProperty("reason") + private String reason; + @JsonProperty("threshold") + private Double threshold; + @JsonProperty("strict_mode") + private Boolean strictMode; + @JsonProperty("evaluation_model") + private String evaluationModel; + @JsonProperty("error") + private String error; + @JsonProperty("additional_metadata") + private Object additionalMetadata; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String key, Object value) { + additionalProperties.put(key, value); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Double getScore() { + return score; + } + + public void setScore(Double score) { + this.score = score; + } + + public Boolean getSuccess() { + return success; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Double getThreshold() { + return threshold; + } + + public void setThreshold(Double threshold) { + this.threshold = threshold; + } + + public Boolean getStrictMode() { + return strictMode; + } + + public void setStrictMode(Boolean strictMode) { + this.strictMode = strictMode; + } + + public String getEvaluationModel() { + return evaluationModel; + } + + public void setEvaluationModel(String evaluationModel) { + this.evaluationModel = evaluationModel; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public Object getAdditionalMetadata() { + return additionalMetadata; + } + + public void setAdditionalMetadata(Object additionalMetadata) { + this.additionalMetadata = additionalMetadata; + } - /** - * Creates a new builder for configuring ScorerData. - * - * @return a new builder instance - */ public static Builder builder() { return new Builder(); } - /** - * Builder for configuring and creating ScorerData instances. - */ public static final class Builder { private final ScorerData scorerData; @@ -26,138 +122,61 @@ private Builder() { this.scorerData = new ScorerData(); } - /** - * Sets the scorer name. - * - * @param name - * the scorer name - * @return this builder - */ public Builder name(String name) { scorerData.setName(name); return this; } - /** - * Sets the evaluation score. - * - * @param score - * the score value - * @return this builder - */ public Builder score(Double score) { scorerData.setScore(score); return this; } - /** - * Sets whether the evaluation succeeded. - * - * @param success - * true if evaluation succeeded - * @return this builder - */ public Builder success(Boolean success) { scorerData.setSuccess(success); return this; } - /** - * Sets the reason for the evaluation result. - * - * @param reason - * the evaluation reason - * @return this builder - */ public Builder reason(String reason) { scorerData.setReason(reason); return this; } - /** - * Sets the evaluation threshold. - * - * @param threshold - * the threshold value - * @return this builder - */ public Builder threshold(Double threshold) { scorerData.setThreshold(threshold); return this; } - /** - * Sets strict mode for evaluation. - * - * @param strictMode - * true for strict mode - * @return this builder - */ public Builder strictMode(Boolean strictMode) { scorerData.setStrictMode(strictMode); return this; } - /** - * Sets the model used for evaluation. - * - * @param evaluationModel - * the model name - * @return this builder - */ public Builder evaluationModel(String evaluationModel) { scorerData.setEvaluationModel(evaluationModel); return this; } - /** - * Sets an error message if evaluation failed. - * - * @param error - * the error message - * @return this builder - */ public Builder error(String error) { scorerData.setError(error); return this; } - /** - * Sets additional metadata for the evaluation. - * - * @param additionalMetadata - * the metadata map - * @return this builder - */ public Builder additionalMetadata(Map additionalMetadata) { scorerData.setAdditionalMetadata(additionalMetadata); return this; } - /** - * Adds a single metadata entry. - * - * @param key - * the metadata key - * @param value - * the metadata value - * @return this builder - */ + @SuppressWarnings("unchecked") public Builder metadata(String key, Object value) { if (scorerData.getAdditionalMetadata() == null) { scorerData.setAdditionalMetadata(new java.util.HashMap<>()); } - @SuppressWarnings("unchecked") Map metadata = (Map) scorerData.getAdditionalMetadata(); metadata.put(key, value); return this; } - /** - * Builds and returns the configured ScorerData. - * - * @return the configured ScorerData - */ public ScorerData build() { return scorerData; } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/data/ScoringResult.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/data/ScoringResult.java index 1d00220..a98bac5 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/data/ScoringResult.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/data/ScoringResult.java @@ -1,24 +1,52 @@ package com.judgmentlabs.judgeval.data; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; -/** - * Represents a collection of scorer evaluation results. - */ -public class ScoringResult extends com.judgmentlabs.judgeval.internal.api.models.ScoringResult { +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ScoringResult { + @JsonProperty("success") + private Boolean success; + @JsonProperty("scorers_data") + private List scorersData; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String key, Object value) { + additionalProperties.put(key, value); + } + + public Boolean getSuccess() { + return success; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public List getScorersData() { + return scorersData; + } + + public void setScorersData(List scorersData) { + this.scorersData = scorersData; + } - /** - * Creates a new builder for configuring a ScoringResult. - * - * @return a new builder instance - */ public static Builder builder() { return new Builder(); } - /** - * Builder for configuring and creating ScoringResult instances. - */ public static final class Builder { private final ScoringResult result; @@ -26,55 +54,24 @@ private Builder() { this.result = new ScoringResult(); } - /** - * Sets whether the overall evaluation succeeded. - * - * @param success - * true if evaluation succeeded - * @return this builder - */ public Builder success(Boolean success) { result.setSuccess(success); return this; } - /** - * Sets the list of scorer results. - * - * @param scorersData - * the list of scorer data - * @return this builder - */ public Builder scorersData(List scorersData) { - @SuppressWarnings("unchecked") - List internalList = (List) (List) scorersData; - result.setScorersData(internalList); + result.setScorersData(scorersData); return this; } - /** - * Adds a single scorer result. - * - * @param scorerData - * the scorer data to add - * @return this builder - */ public Builder scorerData(ScorerData scorerData) { if (result.getScorersData() == null) { - result.setScorersData(new java.util.ArrayList<>()); + result.setScorersData(new ArrayList<>()); } - result.getScorersData() - .add(scorerData); + result.getScorersData().add(scorerData); return this; } - /** - * Sets the data object for the evaluation. - * - * @param dataObject - * the example data - * @return this builder - */ public Builder dataObject(Example dataObject) { if (dataObject != null) { result.setAdditionalProperty("example", dataObject); @@ -82,11 +79,6 @@ public Builder dataObject(Example dataObject) { return this; } - /** - * Builds and returns the configured ScoringResult. - * - * @return the configured ScoringResult - */ public ScoringResult build() { return result; } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/evaluation/Evaluation.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/evaluation/Evaluation.java index 42eea0c..ee83405 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/evaluation/Evaluation.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/evaluation/Evaluation.java @@ -1,6 +1,7 @@ package com.judgmentlabs.judgeval.evaluation; import java.util.Objects; +import java.util.Optional; import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; @@ -8,11 +9,22 @@ * Evaluation configuration for running evaluations against traces and spans. */ public final class Evaluation { - @SuppressWarnings("unused") // TODO: will add run_evaluation here private final JudgmentSyncClient client; + private final Optional projectId; + private final String projectName; private Evaluation(Builder builder) { this.client = Objects.requireNonNull(builder.client, "client required"); + this.projectId = Optional.ofNullable(builder.projectId).orElse(Optional.empty()); + this.projectName = builder.projectName; + } + + public Optional getProjectId() { + return projectId; + } + + public String getProjectName() { + return projectName; } /** @@ -29,12 +41,24 @@ public static Builder builder() { */ public static final class Builder { private JudgmentSyncClient client; + private Optional projectId; + private String projectName; Builder client(JudgmentSyncClient client) { this.client = client; return this; } + Builder projectId(Optional projectId) { + this.projectId = projectId; + return this; + } + + Builder projectName(String projectName) { + this.projectName = projectName; + return this; + } + /** * Builds and returns a new Evaluation instance. * diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/evaluation/EvaluationFactory.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/evaluation/EvaluationFactory.java index 1c3c3e8..4ba6d59 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/evaluation/EvaluationFactory.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/evaluation/EvaluationFactory.java @@ -1,5 +1,7 @@ package com.judgmentlabs.judgeval.evaluation; +import java.util.Optional; + import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; /** @@ -7,9 +9,13 @@ */ public final class EvaluationFactory { private final JudgmentSyncClient client; + private final Optional projectId; + private final String projectName; - public EvaluationFactory(JudgmentSyncClient client) { + public EvaluationFactory(JudgmentSyncClient client, Optional projectId, String projectName) { this.client = client; + this.projectId = projectId; + this.projectName = projectName; } /** @@ -18,6 +24,9 @@ public EvaluationFactory(JudgmentSyncClient client) { * @return a new evaluation builder */ public Evaluation.Builder create() { - return Evaluation.builder().client(client); + return Evaluation.builder() + .client(client) + .projectId(projectId) + .projectName(projectName); } } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/JudgmentAsyncClient.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/JudgmentAsyncClient.java index c6b5e3b..7d907e9 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/JudgmentAsyncClient.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/JudgmentAsyncClient.java @@ -5,13 +5,17 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.CompletableFuture; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.judgmentlabs.judgeval.internal.api.models.*; +import com.judgmentlabs.judgeval.utils.Logger; public class JudgmentAsyncClient { private final HttpClient client; @@ -27,7 +31,7 @@ public JudgmentAsyncClient(String baseUrl, String apiKey, String organizationId) this.client = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .build(); - this.mapper = new ObjectMapper(); + this.mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); } public String getApiUrl() { @@ -81,8 +85,30 @@ private T handleResponse(HttpResponse response) { } } - public CompletableFuture addToRunEvalQueue(ExampleEvaluationRun payload) { - String url = buildUrl("/add_to_run_eval_queue/"); + public CompletableFuture postOtelV1Traces() { + String url = buildUrl("/otel/v1/traces"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(new Object()); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postOtelTriggerRootSpanRules( + TriggerRootSpanRulesRequest payload) { + String url = buildUrl("/otel/trigger_root_span_rules"); String jsonPayload; try { jsonPayload = mapper.writeValueAsString(payload); @@ -94,12 +120,16 @@ public CompletableFuture addToRunEvalQueue(ExampleEvaluationRun payload) .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) - .thenApply(this::handleResponse); + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); } - public CompletableFuture logEvalResults(EvalResults payload) { - String url = buildUrl("/log_eval_results/"); + public CompletableFuture postProjectsResolve(ResolveProjectRequest payload) { + String url = buildUrl("/v1/projects/resolve/"); String jsonPayload; try { jsonPayload = mapper.writeValueAsString(payload); @@ -111,12 +141,16 @@ public CompletableFuture logEvalResults(EvalResults payload) { .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) - .thenApply(this::handleResponse); + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); } - public CompletableFuture fetchExperimentRun(EvalResultsFetch payload) { - String url = buildUrl("/fetch_experiment_run/"); + public CompletableFuture postProjects(AddProjectRequest payload) { + String url = buildUrl("/v1/projects"); String jsonPayload; try { jsonPayload = mapper.writeValueAsString(payload); @@ -128,12 +162,32 @@ public CompletableFuture fetchExperimentRun(EvalResultsFetch payload) { .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) - .thenApply(this::handleResponse); + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); } - public CompletableFuture scorerExists(ScorerExistsRequest payload) { - String url = buildUrl("/scorer_exists/"); + public CompletableFuture deleteProjects(String projectId) { + String url = buildUrl("/v1/projects/" + projectId); + HttpRequest request = HttpRequest.newBuilder() + .DELETE() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP DELETE " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsDatasets(String projectId, + CreateDatasetRequest payload) { + String url = buildUrl("/v1/projects/" + projectId + "/datasets"); String jsonPayload; try { jsonPayload = mapper.writeValueAsString(payload); @@ -145,12 +199,359 @@ public CompletableFuture scorerExists(ScorerExistsRequest .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture> getProjectsDatasets(String projectId) { + String url = buildUrl("/v1/projects/" + projectId + "/datasets"); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsDatasetsByDatasetNameExamples(String projectId, + String datasetName, InsertExamplesRequest payload) { + String url = buildUrl("/v1/projects/" + projectId + "/datasets/" + datasetName + "/examples"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture getProjectsDatasetsByDatasetName(String projectId, + String datasetName) { + String url = buildUrl("/v1/projects/" + projectId + "/datasets/" + datasetName); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsEvaluateExamples(String projectId, ExampleEvaluationRun payload) { + String url = buildUrl("/v1/projects/" + projectId + "/evaluate/examples"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsEvaluateTraces(String projectId, TraceEvaluationRun payload) { + String url = buildUrl("/v1/projects/" + projectId + "/evaluate/traces"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsEvalResults(String projectId, + LogEvalResultsRequest payload) { + String url = buildUrl("/v1/projects/" + projectId + "/eval-results"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture getProjectsExperimentsByRunId(String projectId, String runId) { + String url = buildUrl("/v1/projects/" + projectId + "/experiments/" + runId); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsEvalQueueExamples(String projectId, + ExampleEvaluationRun payload) { + String url = buildUrl("/v1/projects/" + projectId + "/eval-queue/examples"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsEvalQueueTraces(String projectId, + TraceEvaluationRun payload) { + String url = buildUrl("/v1/projects/" + projectId + "/eval-queue/traces"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture getProjectsPromptsByName(String projectId, String name, + String commit_id, String tag) { + Map queryParams = new HashMap<>(); + Optional.ofNullable(commit_id).ifPresent(v -> queryParams.put("commit_id", v)); + Optional.ofNullable(tag).ifPresent(v -> queryParams.put("tag", v)); + String url = buildUrl("/v1/projects/" + projectId + "/prompts/" + name, queryParams); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsPrompts(String projectId, InsertPromptRequest payload) { + String url = buildUrl("/v1/projects/" + projectId + "/prompts"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsPromptsByNameTags(String projectId, String name, + TagPromptRequest payload) { + String url = buildUrl("/v1/projects/" + projectId + "/prompts/" + name + "/tags"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture deleteProjectsPromptsByNameTags(String projectId, String name, + UntagPromptRequest payload) { + String url = buildUrl("/v1/projects/" + projectId + "/prompts/" + name + "/tags"); + HttpRequest request = HttpRequest.newBuilder() + .DELETE() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP DELETE " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture getProjectsPromptsByNameVersions(String projectId, + String name) { + String url = buildUrl("/v1/projects/" + projectId + "/prompts/" + name + "/versions"); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture getProjectsScorers(String projectId, String names, + String is_trace) { + Map queryParams = new HashMap<>(); + Optional.ofNullable(names).ifPresent(v -> queryParams.put("names", v)); + Optional.ofNullable(is_trace).ifPresent(v -> queryParams.put("is_trace", v)); + String url = buildUrl("/v1/projects/" + projectId + "/scorers", queryParams); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture getProjectsScorersByNameExists(String projectId, String name) { + String url = buildUrl("/v1/projects/" + projectId + "/scorers/" + name + "/exists"); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture postProjectsScorersCustom(String projectId, + UploadCustomScorerRequest payload) { + String url = buildUrl("/v1/projects/" + projectId + "/scorers/custom"); + String jsonPayload; + try { + jsonPayload = mapper.writeValueAsString(payload); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize payload", e); + } + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); + } + + public CompletableFuture getProjectsScorersCustomByNameExists(String projectId, + String name) { + String url = buildUrl("/v1/projects/" + projectId + "/scorers/custom/" + name + "/exists"); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) - .thenApply(this::handleResponse); + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); } - public CompletableFuture saveScorer(SavePromptScorerRequest payload) { - String url = buildUrl("/save_scorer/"); + public CompletableFuture postProjectsTracesByTraceIdTags(String projectId, String traceId, + AddTraceTagsRequest payload) { + String url = buildUrl("/v1/projects/" + projectId + "/traces/" + traceId + "/tags"); String jsonPayload; try { jsonPayload = mapper.writeValueAsString(payload); @@ -162,12 +563,16 @@ public CompletableFuture saveScorer(SavePromptScorerRe .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) - .thenApply(this::handleResponse); + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); } - public CompletableFuture fetchScorers(FetchPromptScorersRequest payload) { - String url = buildUrl("/fetch_scorers/"); + public CompletableFuture> postE2eFetchTrace(E2EFetchTraceRequest payload) { + String url = buildUrl("/v1/e2e_fetch_trace/"); String jsonPayload; try { jsonPayload = mapper.writeValueAsString(payload); @@ -179,12 +584,16 @@ public CompletableFuture fetchScorers(FetchPromptSco .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) - .thenApply(this::handleResponse); + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); } - public CompletableFuture projectsResolve(ResolveProjectNameRequest payload) { - String url = buildUrl("/projects/resolve/"); + public CompletableFuture> postE2eFetchSpanScore(E2EFetchSpanScoreRequest payload) { + String url = buildUrl("/v1/e2e_fetch_span_score/"); String jsonPayload; try { jsonPayload = mapper.writeValueAsString(payload); @@ -196,8 +605,12 @@ public CompletableFuture projectsResolve(ResolveProj .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) - .thenApply(this::handleResponse); + .thenApply(r -> { + Logger.debug("HTTP " + r.statusCode() + " " + url); + return handleResponse(r); + }); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/JudgmentSyncClient.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/JudgmentSyncClient.java index 2e6851d..bb8f356 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/JudgmentSyncClient.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/JudgmentSyncClient.java @@ -6,12 +6,16 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.judgmentlabs.judgeval.internal.api.models.*; +import com.judgmentlabs.judgeval.utils.Logger; public class JudgmentSyncClient { private final HttpClient client; @@ -27,7 +31,7 @@ public JudgmentSyncClient(String baseUrl, String apiKey, String organizationId) this.client = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .build(); - this.mapper = new ObjectMapper(); + this.mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); } public String getApiUrl() { @@ -81,91 +85,400 @@ private T handleResponse(HttpResponse response) throws IOException { } } - public Object addToRunEvalQueue(ExampleEvaluationRun payload) throws IOException, InterruptedException { - String url = buildUrl("/add_to_run_eval_queue/"); + public Object postOtelV1Traces() throws IOException, InterruptedException { + String url = buildUrl("/otel/v1/traces"); + String jsonPayload = mapper.writeValueAsString(new Object()); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return handleResponse(response); + } + + public TriggerRootSpanRulesResponse postOtelTriggerRootSpanRules(TriggerRootSpanRulesRequest payload) + throws IOException, InterruptedException { + String url = buildUrl("/otel/trigger_root_span_rules"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), TriggerRootSpanRulesResponse.class); + } + + public ResolveProjectResponse postProjectsResolve(ResolveProjectRequest payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/resolve/"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), ResolveProjectResponse.class); + } + + public AddProjectResponse postProjects(AddProjectRequest payload) throws IOException, InterruptedException { + String url = buildUrl("/v1/projects"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), AddProjectResponse.class); + } + + public DeleteProjectResponse deleteProjects(String projectId) throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId); + HttpRequest request = HttpRequest.newBuilder() + .DELETE() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP DELETE " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), DeleteProjectResponse.class); + } + + public CreateDatasetResponse postProjectsDatasets(String projectId, CreateDatasetRequest payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/datasets"); String jsonPayload = mapper.writeValueAsString(payload); HttpRequest request = HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), CreateDatasetResponse.class); + } + + public List getProjectsDatasets(String projectId) throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/datasets"); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); return handleResponse(response); } - public Object logEvalResults(EvalResults payload) throws IOException, InterruptedException { - String url = buildUrl("/log_eval_results/"); + public InsertExamplesResponse postProjectsDatasetsByDatasetNameExamples(String projectId, String datasetName, + InsertExamplesRequest payload) throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/datasets/" + datasetName + "/examples"); String jsonPayload = mapper.writeValueAsString(payload); HttpRequest request = HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), InsertExamplesResponse.class); + } + + public PullDatasetResponse getProjectsDatasetsByDatasetName(String projectId, String datasetName) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/datasets/" + datasetName); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), PullDatasetResponse.class); + } + + public Object postProjectsEvaluateExamples(String projectId, ExampleEvaluationRun payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/evaluate/examples"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); return handleResponse(response); } - public Object fetchExperimentRun(EvalResultsFetch payload) throws IOException, InterruptedException { - String url = buildUrl("/fetch_experiment_run/"); + public Object postProjectsEvaluateTraces(String projectId, TraceEvaluationRun payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/evaluate/traces"); String jsonPayload = mapper.writeValueAsString(payload); HttpRequest request = HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); return handleResponse(response); } - public ScorerExistsResponse scorerExists(ScorerExistsRequest payload) throws IOException, InterruptedException { - String url = buildUrl("/scorer_exists/"); + public LogEvalResultsResponse postProjectsEvalResults(String projectId, LogEvalResultsRequest payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/eval-results"); String jsonPayload = mapper.writeValueAsString(payload); HttpRequest request = HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - return mapper.readValue(response.body(), ScorerExistsResponse.class); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), LogEvalResultsResponse.class); } - public SavePromptScorerResponse saveScorer(SavePromptScorerRequest payload) + public FetchExperimentRunResponse getProjectsExperimentsByRunId(String projectId, String runId) throws IOException, InterruptedException { - String url = buildUrl("/save_scorer/"); + String url = buildUrl("/v1/projects/" + projectId + "/experiments/" + runId); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), FetchExperimentRunResponse.class); + } + + public AddToRunEvalQueueExamplesResponse postProjectsEvalQueueExamples(String projectId, + ExampleEvaluationRun payload) throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/eval-queue/examples"); String jsonPayload = mapper.writeValueAsString(payload); HttpRequest request = HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - return mapper.readValue(response.body(), SavePromptScorerResponse.class); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), AddToRunEvalQueueExamplesResponse.class); } - public FetchPromptScorersResponse fetchScorers(FetchPromptScorersRequest payload) + public AddToRunEvalQueueTracesResponse postProjectsEvalQueueTraces(String projectId, TraceEvaluationRun payload) throws IOException, InterruptedException { - String url = buildUrl("/fetch_scorers/"); + String url = buildUrl("/v1/projects/" + projectId + "/eval-queue/traces"); String jsonPayload = mapper.writeValueAsString(payload); HttpRequest request = HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), AddToRunEvalQueueTracesResponse.class); + } + + public FetchPromptResponse getProjectsPromptsByName(String projectId, String name, String commit_id, String tag) + throws IOException, InterruptedException { + Map queryParams = new HashMap<>(); + Optional.ofNullable(commit_id).ifPresent(v -> queryParams.put("commit_id", v)); + Optional.ofNullable(tag).ifPresent(v -> queryParams.put("tag", v)); + String url = buildUrl("/v1/projects/" + projectId + "/prompts/" + name, queryParams); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), FetchPromptResponse.class); + } + + public InsertPromptResponse postProjectsPrompts(String projectId, InsertPromptRequest payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/prompts"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), InsertPromptResponse.class); + } + + public TagPromptResponse postProjectsPromptsByNameTags(String projectId, String name, TagPromptRequest payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/prompts/" + name + "/tags"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), TagPromptResponse.class); + } + + public UntagPromptResponse deleteProjectsPromptsByNameTags(String projectId, String name, + UntagPromptRequest payload) throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/prompts/" + name + "/tags"); + HttpRequest request = HttpRequest.newBuilder() + .DELETE() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP DELETE " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), UntagPromptResponse.class); + } + + public GetPromptVersionsResponse getProjectsPromptsByNameVersions(String projectId, String name) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/prompts/" + name + "/versions"); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), GetPromptVersionsResponse.class); + } + + public FetchPromptScorersResponse getProjectsScorers(String projectId, String names, String is_trace) + throws IOException, InterruptedException { + Map queryParams = new HashMap<>(); + Optional.ofNullable(names).ifPresent(v -> queryParams.put("names", v)); + Optional.ofNullable(is_trace).ifPresent(v -> queryParams.put("is_trace", v)); + String url = buildUrl("/v1/projects/" + projectId + "/scorers", queryParams); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); return mapper.readValue(response.body(), FetchPromptScorersResponse.class); } - public ResolveProjectNameResponse projectsResolve(ResolveProjectNameRequest payload) + public ScorerExistsResponse getProjectsScorersByNameExists(String projectId, String name) throws IOException, InterruptedException { - String url = buildUrl("/projects/resolve/"); + String url = buildUrl("/v1/projects/" + projectId + "/scorers/" + name + "/exists"); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), ScorerExistsResponse.class); + } + + public UploadCustomScorerResponse postProjectsScorersCustom(String projectId, UploadCustomScorerRequest payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/scorers/custom"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), UploadCustomScorerResponse.class); + } + + public CustomScorerExistsResponse getProjectsScorersCustomByNameExists(String projectId, String name) + throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/scorers/custom/" + name + "/exists"); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP GET " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), CustomScorerExistsResponse.class); + } + + public AddTraceTagsResponse postProjectsTracesByTraceIdTags(String projectId, String traceId, + AddTraceTagsRequest payload) throws IOException, InterruptedException { + String url = buildUrl("/v1/projects/" + projectId + "/traces/" + traceId + "/tags"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return mapper.readValue(response.body(), AddTraceTagsResponse.class); + } + + public List postE2eFetchTrace(E2EFetchTraceRequest payload) throws IOException, InterruptedException { + String url = buildUrl("/v1/e2e_fetch_trace/"); + String jsonPayload = mapper.writeValueAsString(payload); + HttpRequest request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .uri(URI.create(url)) + .headers(buildHeaders()) + .build(); + Logger.debug("HTTP POST " + url); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return handleResponse(response); + } + + public List postE2eFetchSpanScore(E2EFetchSpanScoreRequest payload) + throws IOException, InterruptedException { + String url = buildUrl("/v1/e2e_fetch_span_score/"); String jsonPayload = mapper.writeValueAsString(payload); HttpRequest request = HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) .uri(URI.create(url)) .headers(buildHeaders()) .build(); + Logger.debug("HTTP POST " + url); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - return mapper.readValue(response.body(), ResolveProjectNameResponse.class); + Logger.debug("HTTP " + response.statusCode() + " " + url); + return handleResponse(response); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectNameRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddProjectRequest.java similarity index 92% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectNameRequest.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddProjectRequest.java index d3a2d33..c9ae332 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectNameRequest.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddProjectRequest.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class ResolveProjectNameRequest { +public class AddProjectRequest { @JsonProperty("project_name") private String projectName; @@ -38,7 +38,7 @@ public boolean equals(Object obj) { return true; if (obj == null || getClass() != obj.getClass()) return false; - ResolveProjectNameRequest other = (ResolveProjectNameRequest) obj; + AddProjectRequest other = (AddProjectRequest) obj; return Objects.equals(projectName, other.projectName) && Objects.equals(additionalProperties, other.additionalProperties); } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectNameResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddProjectResponse.java similarity index 91% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectNameResponse.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddProjectResponse.java index 9e587ee..6943a75 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectNameResponse.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddProjectResponse.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class ResolveProjectNameResponse { +public class AddProjectResponse { @JsonProperty("project_id") private String projectId; @@ -38,7 +38,7 @@ public boolean equals(Object obj) { return true; if (obj == null || getClass() != obj.getClass()) return false; - ResolveProjectNameResponse other = (ResolveProjectNameResponse) obj; + AddProjectResponse other = (AddProjectResponse) obj; return Objects.equals(projectId, other.projectId) && Objects.equals(additionalProperties, other.additionalProperties); } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddToRunEvalQueueExamplesResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddToRunEvalQueueExamplesResponse.java new file mode 100644 index 0000000..9d7fe56 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddToRunEvalQueueExamplesResponse.java @@ -0,0 +1,71 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AddToRunEvalQueueExamplesResponse { + @JsonProperty("success") + private Boolean success; + @JsonProperty("status") + private String status; + @JsonProperty("message") + private String message; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public Boolean getSuccess() { + return success; + } + + public String getStatus() { + return status; + } + + public String getMessage() { + return message; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public void setStatus(String status) { + this.status = status; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + AddToRunEvalQueueExamplesResponse other = (AddToRunEvalQueueExamplesResponse) obj; + return Objects.equals(success, other.success) && Objects.equals(status, other.status) + && Objects.equals(message, other.message) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(success, status, message, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddToRunEvalQueueTracesResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddToRunEvalQueueTracesResponse.java new file mode 100644 index 0000000..07fd917 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddToRunEvalQueueTracesResponse.java @@ -0,0 +1,71 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AddToRunEvalQueueTracesResponse { + @JsonProperty("success") + private Boolean success; + @JsonProperty("status") + private String status; + @JsonProperty("message") + private String message; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public Boolean getSuccess() { + return success; + } + + public String getStatus() { + return status; + } + + public String getMessage() { + return message; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public void setStatus(String status) { + this.status = status; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + AddToRunEvalQueueTracesResponse other = (AddToRunEvalQueueTracesResponse) obj; + return Objects.equals(success, other.success) && Objects.equals(status, other.status) + && Objects.equals(message, other.message) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(success, status, message, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddTraceTagsRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddTraceTagsRequest.java new file mode 100644 index 0000000..0dcb211 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddTraceTagsRequest.java @@ -0,0 +1,50 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AddTraceTagsRequest { + @JsonProperty("tags") + private List tags; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + AddTraceTagsRequest other = (AddTraceTagsRequest) obj; + return Objects.equals(tags, other.tags) && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(tags, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/SavePromptScorerResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddTraceTagsResponse.java similarity index 64% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/SavePromptScorerResponse.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddTraceTagsResponse.java index bb1f0b4..e741a62 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/SavePromptScorerResponse.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/AddTraceTagsResponse.java @@ -8,9 +8,9 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class SavePromptScorerResponse { - @JsonProperty("scorer_response") - private PromptScorer scorerResponse; +public class AddTraceTagsResponse { + @JsonProperty("success") + private Boolean success; private Map additionalProperties = new HashMap<>(); @@ -24,12 +24,12 @@ public void setAdditionalProperty(String name, Object value) { additionalProperties.put(name, value); } - public PromptScorer getScorerResponse() { - return scorerResponse; + public Boolean getSuccess() { + return success; } - public void setScorerResponse(PromptScorer scorerResponse) { - this.scorerResponse = scorerResponse; + public void setSuccess(Boolean success) { + this.success = success; } @Override @@ -38,13 +38,13 @@ public boolean equals(Object obj) { return true; if (obj == null || getClass() != obj.getClass()) return false; - SavePromptScorerResponse other = (SavePromptScorerResponse) obj; - return Objects.equals(scorerResponse, other.scorerResponse) + AddTraceTagsResponse other = (AddTraceTagsResponse) obj; + return Objects.equals(success, other.success) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(scorerResponse, Objects.hashCode(additionalProperties)); + return Objects.hash(success, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/BaseScorer.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/BaseScorer.java index 235a640..9a60cb3 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/BaseScorer.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/BaseScorer.java @@ -1,6 +1,7 @@ package com.judgmentlabs.judgeval.internal.api.models; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -11,28 +12,24 @@ public class BaseScorer { @JsonProperty("score_type") private String scoreType; - @JsonProperty("threshold") - private Double threshold; @JsonProperty("name") private String name; @JsonProperty("class_name") private String className; @JsonProperty("score") private Double score; + @JsonProperty("minimum_score_range") + private Double minimumScoreRange; + @JsonProperty("maximum_score_range") + private Double maximumScoreRange; @JsonProperty("score_breakdown") private Object scoreBreakdown; @JsonProperty("reason") - private String reason; - @JsonProperty("using_native_model") - private Boolean usingNativeModel; + private Object reason; @JsonProperty("success") private Boolean success; @JsonProperty("model") private String model; - @JsonProperty("model_client") - private Object modelClient; - @JsonProperty("strict_mode") - private Boolean strictMode; @JsonProperty("error") private String error; @JsonProperty("additional_metadata") @@ -41,6 +38,12 @@ public class BaseScorer { private String user; @JsonProperty("server_hosted") private Boolean serverHosted; + @JsonProperty("using_native_model") + private Boolean usingNativeModel; + @JsonProperty("required_params") + private List requiredParams; + @JsonProperty("strict_mode") + private Boolean strictMode; private Map additionalProperties = new HashMap<>(); @@ -58,10 +61,6 @@ public String getScoreType() { return scoreType; } - public Double getThreshold() { - return threshold; - } - public String getName() { return name; } @@ -74,18 +73,22 @@ public Double getScore() { return score; } + public Double getMinimumScoreRange() { + return minimumScoreRange; + } + + public Double getMaximumScoreRange() { + return maximumScoreRange; + } + public Object getScoreBreakdown() { return scoreBreakdown; } - public String getReason() { + public Object getReason() { return reason; } - public Boolean getUsingNativeModel() { - return usingNativeModel; - } - public Boolean getSuccess() { return success; } @@ -94,14 +97,6 @@ public String getModel() { return model; } - public Object getModelClient() { - return modelClient; - } - - public Boolean getStrictMode() { - return strictMode; - } - public String getError() { return error; } @@ -118,12 +113,20 @@ public Boolean getServerHosted() { return serverHosted; } - public void setScoreType(String scoreType) { - this.scoreType = scoreType; + public Boolean getUsingNativeModel() { + return usingNativeModel; + } + + public List getRequiredParams() { + return requiredParams; } - public void setThreshold(Double threshold) { - this.threshold = threshold; + public Boolean getStrictMode() { + return strictMode; + } + + public void setScoreType(String scoreType) { + this.scoreType = scoreType; } public void setName(String name) { @@ -138,18 +141,22 @@ public void setScore(Double score) { this.score = score; } + public void setMinimumScoreRange(Double minimumScoreRange) { + this.minimumScoreRange = minimumScoreRange; + } + + public void setMaximumScoreRange(Double maximumScoreRange) { + this.maximumScoreRange = maximumScoreRange; + } + public void setScoreBreakdown(Object scoreBreakdown) { this.scoreBreakdown = scoreBreakdown; } - public void setReason(String reason) { + public void setReason(Object reason) { this.reason = reason; } - public void setUsingNativeModel(Boolean usingNativeModel) { - this.usingNativeModel = usingNativeModel; - } - public void setSuccess(Boolean success) { this.success = success; } @@ -158,14 +165,6 @@ public void setModel(String model) { this.model = model; } - public void setModelClient(Object modelClient) { - this.modelClient = modelClient; - } - - public void setStrictMode(Boolean strictMode) { - this.strictMode = strictMode; - } - public void setError(String error) { this.error = error; } @@ -182,6 +181,18 @@ public void setServerHosted(Boolean serverHosted) { this.serverHosted = serverHosted; } + public void setUsingNativeModel(Boolean usingNativeModel) { + this.usingNativeModel = usingNativeModel; + } + + public void setRequiredParams(List requiredParams) { + this.requiredParams = requiredParams; + } + + public void setStrictMode(Boolean strictMode) { + this.strictMode = strictMode; + } + @Override public boolean equals(Object obj) { if (this == obj) @@ -189,21 +200,23 @@ public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) return false; BaseScorer other = (BaseScorer) obj; - return Objects.equals(scoreType, other.scoreType) && Objects.equals(threshold, other.threshold) - && Objects.equals(name, other.name) && Objects.equals(className, other.className) - && Objects.equals(score, other.score) && Objects.equals(scoreBreakdown, other.scoreBreakdown) - && Objects.equals(reason, other.reason) && Objects.equals(usingNativeModel, other.usingNativeModel) + return Objects.equals(scoreType, other.scoreType) && Objects.equals(name, other.name) + && Objects.equals(className, other.className) && Objects.equals(score, other.score) + && Objects.equals(minimumScoreRange, other.minimumScoreRange) + && Objects.equals(maximumScoreRange, other.maximumScoreRange) + && Objects.equals(scoreBreakdown, other.scoreBreakdown) && Objects.equals(reason, other.reason) && Objects.equals(success, other.success) && Objects.equals(model, other.model) - && Objects.equals(modelClient, other.modelClient) && Objects.equals(strictMode, other.strictMode) && Objects.equals(error, other.error) && Objects.equals(additionalMetadata, other.additionalMetadata) && Objects.equals(user, other.user) && Objects.equals(serverHosted, other.serverHosted) + && Objects.equals(usingNativeModel, other.usingNativeModel) + && Objects.equals(requiredParams, other.requiredParams) && Objects.equals(strictMode, other.strictMode) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(scoreType, threshold, name, className, score, scoreBreakdown, reason, usingNativeModel, - success, model, modelClient, strictMode, error, additionalMetadata, user, serverHosted, - Objects.hashCode(additionalProperties)); + return Objects.hash(scoreType, name, className, score, minimumScoreRange, maximumScoreRange, scoreBreakdown, + reason, success, model, error, additionalMetadata, user, serverHosted, usingNativeModel, requiredParams, + strictMode, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CreateDatasetRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CreateDatasetRequest.java new file mode 100644 index 0000000..9561b80 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CreateDatasetRequest.java @@ -0,0 +1,82 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CreateDatasetRequest { + @JsonProperty("name") + private String name; + @JsonProperty("dataset_kind") + private String datasetKind; + @JsonProperty("examples") + private List examples; + @JsonProperty("overwrite") + private Boolean overwrite; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getName() { + return name; + } + + public String getDatasetKind() { + return datasetKind; + } + + public List getExamples() { + return examples; + } + + public Boolean getOverwrite() { + return overwrite; + } + + public void setName(String name) { + this.name = name; + } + + public void setDatasetKind(String datasetKind) { + this.datasetKind = datasetKind; + } + + public void setExamples(List examples) { + this.examples = examples; + } + + public void setOverwrite(Boolean overwrite) { + this.overwrite = overwrite; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + CreateDatasetRequest other = (CreateDatasetRequest) obj; + return Objects.equals(name, other.name) && Objects.equals(datasetKind, other.datasetKind) + && Objects.equals(examples, other.examples) && Objects.equals(overwrite, other.overwrite) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(name, datasetKind, examples, overwrite, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CreateDatasetResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CreateDatasetResponse.java new file mode 100644 index 0000000..4cbc3f6 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CreateDatasetResponse.java @@ -0,0 +1,49 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CreateDatasetResponse { + @JsonProperty("detail") + private String detail; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + CreateDatasetResponse other = (CreateDatasetResponse) obj; + return Objects.equals(detail, other.detail) && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(detail, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CustomScorerExistsResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CustomScorerExistsResponse.java new file mode 100644 index 0000000..8b2f588 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/CustomScorerExistsResponse.java @@ -0,0 +1,49 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CustomScorerExistsResponse { + @JsonProperty("exists") + private Boolean exists; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public Boolean getExists() { + return exists; + } + + public void setExists(Boolean exists) { + this.exists = exists; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + CustomScorerExistsResponse other = (CustomScorerExistsResponse) obj; + return Objects.equals(exists, other.exists) && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(exists, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/DatasetInfo.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/DatasetInfo.java new file mode 100644 index 0000000..4b25654 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/DatasetInfo.java @@ -0,0 +1,102 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DatasetInfo { + @JsonProperty("dataset_id") + private String datasetId; + @JsonProperty("name") + private String name; + @JsonProperty("created_at") + private String createdAt; + @JsonProperty("kind") + private String kind; + @JsonProperty("entries") + private Double entries; + @JsonProperty("creator") + private String creator; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getDatasetId() { + return datasetId; + } + + public String getName() { + return name; + } + + public String getCreatedAt() { + return createdAt; + } + + public String getKind() { + return kind; + } + + public Double getEntries() { + return entries; + } + + public String getCreator() { + return creator; + } + + public void setDatasetId(String datasetId) { + this.datasetId = datasetId; + } + + public void setName(String name) { + this.name = name; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public void setKind(String kind) { + this.kind = kind; + } + + public void setEntries(Double entries) { + this.entries = entries; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + DatasetInfo other = (DatasetInfo) obj; + return Objects.equals(datasetId, other.datasetId) && Objects.equals(name, other.name) + && Objects.equals(createdAt, other.createdAt) && Objects.equals(kind, other.kind) + && Objects.equals(entries, other.entries) && Objects.equals(creator, other.creator) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(datasetId, name, createdAt, kind, entries, creator, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/DeleteProjectResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/DeleteProjectResponse.java new file mode 100644 index 0000000..4a90602 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/DeleteProjectResponse.java @@ -0,0 +1,60 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DeleteProjectResponse { + @JsonProperty("status") + private String status; + @JsonProperty("message") + private String message; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getStatus() { + return status; + } + + public String getMessage() { + return message; + } + + public void setStatus(String status) { + this.status = status; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + DeleteProjectResponse other = (DeleteProjectResponse) obj; + return Objects.equals(status, other.status) && Objects.equals(message, other.message) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(status, message, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/E2EFetchSpanScoreRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/E2EFetchSpanScoreRequest.java new file mode 100644 index 0000000..879aedd --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/E2EFetchSpanScoreRequest.java @@ -0,0 +1,71 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class E2EFetchSpanScoreRequest { + @JsonProperty("project_name") + private String projectName; + @JsonProperty("trace_id") + private String traceId; + @JsonProperty("span_id") + private String spanId; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getProjectName() { + return projectName; + } + + public String getTraceId() { + return traceId; + } + + public String getSpanId() { + return spanId; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public void setSpanId(String spanId) { + this.spanId = spanId; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + E2EFetchSpanScoreRequest other = (E2EFetchSpanScoreRequest) obj; + return Objects.equals(projectName, other.projectName) && Objects.equals(traceId, other.traceId) + && Objects.equals(spanId, other.spanId) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(projectName, traceId, spanId, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/EvalResultsFetch.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/E2EFetchTraceRequest.java similarity index 67% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/EvalResultsFetch.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/E2EFetchTraceRequest.java index 9e77977..73e8b69 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/EvalResultsFetch.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/E2EFetchTraceRequest.java @@ -8,11 +8,11 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class EvalResultsFetch { - @JsonProperty("experiment_run_id") - private String experimentRunId; +public class E2EFetchTraceRequest { @JsonProperty("project_name") private String projectName; + @JsonProperty("trace_id") + private String traceId; private Map additionalProperties = new HashMap<>(); @@ -26,35 +26,35 @@ public void setAdditionalProperty(String name, Object value) { additionalProperties.put(name, value); } - public String getExperimentRunId() { - return experimentRunId; - } - public String getProjectName() { return projectName; } - public void setExperimentRunId(String experimentRunId) { - this.experimentRunId = experimentRunId; + public String getTraceId() { + return traceId; } public void setProjectName(String projectName) { this.projectName = projectName; } + public void setTraceId(String traceId) { + this.traceId = traceId; + } + @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; - EvalResultsFetch other = (EvalResultsFetch) obj; - return Objects.equals(experimentRunId, other.experimentRunId) && Objects.equals(projectName, other.projectName) + E2EFetchTraceRequest other = (E2EFetchTraceRequest) obj; + return Objects.equals(projectName, other.projectName) && Objects.equals(traceId, other.traceId) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(experimentRunId, projectName, Objects.hashCode(additionalProperties)); + return Objects.hash(projectName, traceId, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ErrorResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ErrorResponse.java new file mode 100644 index 0000000..400a57e --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ErrorResponse.java @@ -0,0 +1,60 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ErrorResponse { + @JsonProperty("error") + private String error; + @JsonProperty("message") + private String message; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getError() { + return error; + } + + public String getMessage() { + return message; + } + + public void setError(String error) { + this.error = error; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + ErrorResponse other = (ErrorResponse) obj; + return Objects.equals(error, other.error) && Objects.equals(message, other.message) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(error, message, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExampleEvaluationRun.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExampleEvaluationRun.java index 847e4f2..1508081 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExampleEvaluationRun.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExampleEvaluationRun.java @@ -12,18 +12,22 @@ public class ExampleEvaluationRun { @JsonProperty("id") private String id; - @JsonProperty("project_name") - private String projectName; + @JsonProperty("project_id") + private String projectId; @JsonProperty("eval_name") private String evalName; - @JsonProperty("custom_scorers") - private List customScorers; - @JsonProperty("judgment_scorers") - private List judgmentScorers; @JsonProperty("model") private String model; @JsonProperty("created_at") private String createdAt; + @JsonProperty("user_id") + private String userId; + @JsonProperty("scorers") + private List scorers; + @JsonProperty("custom_scorers") + private List customScorers; + @JsonProperty("judgment_scorers") + private List judgmentScorers; @JsonProperty("examples") private List examples; @JsonProperty("trace_span_id") @@ -47,22 +51,14 @@ public String getId() { return id; } - public String getProjectName() { - return projectName; + public String getProjectId() { + return projectId; } public String getEvalName() { return evalName; } - public List getCustomScorers() { - return customScorers; - } - - public List getJudgmentScorers() { - return judgmentScorers; - } - public String getModel() { return model; } @@ -71,6 +67,22 @@ public String getCreatedAt() { return createdAt; } + public String getUserId() { + return userId; + } + + public List getScorers() { + return scorers; + } + + public List getCustomScorers() { + return customScorers; + } + + public List getJudgmentScorers() { + return judgmentScorers; + } + public List getExamples() { return examples; } @@ -87,22 +99,14 @@ public void setId(String id) { this.id = id; } - public void setProjectName(String projectName) { - this.projectName = projectName; + public void setProjectId(String projectId) { + this.projectId = projectId; } public void setEvalName(String evalName) { this.evalName = evalName; } - public void setCustomScorers(List customScorers) { - this.customScorers = customScorers; - } - - public void setJudgmentScorers(List judgmentScorers) { - this.judgmentScorers = judgmentScorers; - } - public void setModel(String model) { this.model = model; } @@ -111,6 +115,22 @@ public void setCreatedAt(String createdAt) { this.createdAt = createdAt; } + public void setUserId(String userId) { + this.userId = userId; + } + + public void setScorers(List scorers) { + this.scorers = scorers; + } + + public void setCustomScorers(List customScorers) { + this.customScorers = customScorers; + } + + public void setJudgmentScorers(List judgmentScorers) { + this.judgmentScorers = judgmentScorers; + } + public void setExamples(List examples) { this.examples = examples; } @@ -130,17 +150,18 @@ public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) return false; ExampleEvaluationRun other = (ExampleEvaluationRun) obj; - return Objects.equals(id, other.id) && Objects.equals(projectName, other.projectName) - && Objects.equals(evalName, other.evalName) && Objects.equals(customScorers, other.customScorers) - && Objects.equals(judgmentScorers, other.judgmentScorers) && Objects.equals(model, other.model) - && Objects.equals(createdAt, other.createdAt) && Objects.equals(examples, other.examples) + return Objects.equals(id, other.id) && Objects.equals(projectId, other.projectId) + && Objects.equals(evalName, other.evalName) && Objects.equals(model, other.model) + && Objects.equals(createdAt, other.createdAt) && Objects.equals(userId, other.userId) + && Objects.equals(scorers, other.scorers) && Objects.equals(customScorers, other.customScorers) + && Objects.equals(judgmentScorers, other.judgmentScorers) && Objects.equals(examples, other.examples) && Objects.equals(traceSpanId, other.traceSpanId) && Objects.equals(traceId, other.traceId) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(id, projectName, evalName, customScorers, judgmentScorers, model, createdAt, examples, - traceSpanId, traceId, Objects.hashCode(additionalProperties)); + return Objects.hash(id, projectId, evalName, model, createdAt, userId, scorers, customScorers, judgmentScorers, + examples, traceSpanId, traceId, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExampleScoringResult.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExampleScoringResult.java new file mode 100644 index 0000000..851b907 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExampleScoringResult.java @@ -0,0 +1,105 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ExampleScoringResult { + @JsonProperty("scorers_data") + private List scorersData; + @JsonProperty("name") + private String name; + @JsonProperty("data_object") + private Example dataObject; + @JsonProperty("trace_id") + private String traceId; + @JsonProperty("run_duration") + private Double runDuration; + @JsonProperty("evaluation_cost") + private Double evaluationCost; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public List getScorersData() { + return scorersData; + } + + public String getName() { + return name; + } + + public Example getDataObject() { + return dataObject; + } + + public String getTraceId() { + return traceId; + } + + public Double getRunDuration() { + return runDuration; + } + + public Double getEvaluationCost() { + return evaluationCost; + } + + public void setScorersData(List scorersData) { + this.scorersData = scorersData; + } + + public void setName(String name) { + this.name = name; + } + + public void setDataObject(Example dataObject) { + this.dataObject = dataObject; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public void setRunDuration(Double runDuration) { + this.runDuration = runDuration; + } + + public void setEvaluationCost(Double evaluationCost) { + this.evaluationCost = evaluationCost; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + ExampleScoringResult other = (ExampleScoringResult) obj; + return Objects.equals(scorersData, other.scorersData) && Objects.equals(name, other.name) + && Objects.equals(dataObject, other.dataObject) && Objects.equals(traceId, other.traceId) + && Objects.equals(runDuration, other.runDuration) + && Objects.equals(evaluationCost, other.evaluationCost) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(scorersData, name, dataObject, traceId, runDuration, evaluationCost, + Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExperimentRunItem.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExperimentRunItem.java new file mode 100644 index 0000000..3aa5443 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExperimentRunItem.java @@ -0,0 +1,115 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ExperimentRunItem { + @JsonProperty("organization_id") + private String organizationId; + @JsonProperty("experiment_run_id") + private String experimentRunId; + @JsonProperty("example_id") + private String exampleId; + @JsonProperty("data") + private Object data; + @JsonProperty("name") + private String name; + @JsonProperty("created_at") + private String createdAt; + @JsonProperty("scorers") + private List scorers; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getOrganizationId() { + return organizationId; + } + + public String getExperimentRunId() { + return experimentRunId; + } + + public String getExampleId() { + return exampleId; + } + + public Object getData() { + return data; + } + + public String getName() { + return name; + } + + public String getCreatedAt() { + return createdAt; + } + + public List getScorers() { + return scorers; + } + + public void setOrganizationId(String organizationId) { + this.organizationId = organizationId; + } + + public void setExperimentRunId(String experimentRunId) { + this.experimentRunId = experimentRunId; + } + + public void setExampleId(String exampleId) { + this.exampleId = exampleId; + } + + public void setData(Object data) { + this.data = data; + } + + public void setName(String name) { + this.name = name; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public void setScorers(List scorers) { + this.scorers = scorers; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + ExperimentRunItem other = (ExperimentRunItem) obj; + return Objects.equals(organizationId, other.organizationId) + && Objects.equals(experimentRunId, other.experimentRunId) && Objects.equals(exampleId, other.exampleId) + && Objects.equals(data, other.data) && Objects.equals(name, other.name) + && Objects.equals(createdAt, other.createdAt) && Objects.equals(scorers, other.scorers) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(organizationId, experimentRunId, exampleId, data, name, createdAt, scorers, + Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerData.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExperimentScorer.java similarity index 57% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerData.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExperimentScorer.java index ccca512..afde730 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerData.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ExperimentScorer.java @@ -8,27 +8,31 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class ScorerData { - @JsonProperty("id") - private String id; +public class ExperimentScorer { + @JsonProperty("scorer_data_id") + private String scorerDataId; @JsonProperty("name") private String name; - @JsonProperty("threshold") - private Double threshold; - @JsonProperty("success") - private Boolean success; @JsonProperty("score") private Double score; + @JsonProperty("success") + private Double success; @JsonProperty("reason") private String reason; - @JsonProperty("strict_mode") - private Boolean strictMode; @JsonProperty("evaluation_model") private String evaluationModel; + @JsonProperty("threshold") + private Double threshold; + @JsonProperty("created_at") + private String createdAt; @JsonProperty("error") private String error; @JsonProperty("additional_metadata") private Object additionalMetadata; + @JsonProperty("minimum_score_range") + private Double minimumScoreRange; + @JsonProperty("maximum_score_range") + private Double maximumScoreRange; private Map additionalProperties = new HashMap<>(); @@ -42,38 +46,38 @@ public void setAdditionalProperty(String name, Object value) { additionalProperties.put(name, value); } - public String getId() { - return id; + public String getScorerDataId() { + return scorerDataId; } public String getName() { return name; } - public Double getThreshold() { - return threshold; + public Double getScore() { + return score; } - public Boolean getSuccess() { + public Double getSuccess() { return success; } - public Double getScore() { - return score; - } - public String getReason() { return reason; } - public Boolean getStrictMode() { - return strictMode; - } - public String getEvaluationModel() { return evaluationModel; } + public Double getThreshold() { + return threshold; + } + + public String getCreatedAt() { + return createdAt; + } + public String getError() { return error; } @@ -82,38 +86,46 @@ public Object getAdditionalMetadata() { return additionalMetadata; } - public void setId(String id) { - this.id = id; + public Double getMinimumScoreRange() { + return minimumScoreRange; } - public void setName(String name) { - this.name = name; + public Double getMaximumScoreRange() { + return maximumScoreRange; } - public void setThreshold(Double threshold) { - this.threshold = threshold; + public void setScorerDataId(String scorerDataId) { + this.scorerDataId = scorerDataId; } - public void setSuccess(Boolean success) { - this.success = success; + public void setName(String name) { + this.name = name; } public void setScore(Double score) { this.score = score; } - public void setReason(String reason) { - this.reason = reason; + public void setSuccess(Double success) { + this.success = success; } - public void setStrictMode(Boolean strictMode) { - this.strictMode = strictMode; + public void setReason(String reason) { + this.reason = reason; } public void setEvaluationModel(String evaluationModel) { this.evaluationModel = evaluationModel; } + public void setThreshold(Double threshold) { + this.threshold = threshold; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + public void setError(String error) { this.error = error; } @@ -122,25 +134,34 @@ public void setAdditionalMetadata(Object additionalMetadata) { this.additionalMetadata = additionalMetadata; } + public void setMinimumScoreRange(Double minimumScoreRange) { + this.minimumScoreRange = minimumScoreRange; + } + + public void setMaximumScoreRange(Double maximumScoreRange) { + this.maximumScoreRange = maximumScoreRange; + } + @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; - ScorerData other = (ScorerData) obj; - return Objects.equals(id, other.id) && Objects.equals(name, other.name) - && Objects.equals(threshold, other.threshold) && Objects.equals(success, other.success) - && Objects.equals(score, other.score) && Objects.equals(reason, other.reason) - && Objects.equals(strictMode, other.strictMode) - && Objects.equals(evaluationModel, other.evaluationModel) && Objects.equals(error, other.error) - && Objects.equals(additionalMetadata, other.additionalMetadata) + ExperimentScorer other = (ExperimentScorer) obj; + return Objects.equals(scorerDataId, other.scorerDataId) && Objects.equals(name, other.name) + && Objects.equals(score, other.score) && Objects.equals(success, other.success) + && Objects.equals(reason, other.reason) && Objects.equals(evaluationModel, other.evaluationModel) + && Objects.equals(threshold, other.threshold) && Objects.equals(createdAt, other.createdAt) + && Objects.equals(error, other.error) && Objects.equals(additionalMetadata, other.additionalMetadata) + && Objects.equals(minimumScoreRange, other.minimumScoreRange) + && Objects.equals(maximumScoreRange, other.maximumScoreRange) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(id, name, threshold, success, score, reason, strictMode, evaluationModel, error, - additionalMetadata, Objects.hashCode(additionalProperties)); + return Objects.hash(scorerDataId, name, score, success, reason, evaluationModel, threshold, createdAt, error, + additionalMetadata, minimumScoreRange, maximumScoreRange, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchExperimentRunResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchExperimentRunResponse.java new file mode 100644 index 0000000..25e789b --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchExperimentRunResponse.java @@ -0,0 +1,61 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class FetchExperimentRunResponse { + @JsonProperty("results") + private List results; + @JsonProperty("ui_results_url") + private String uiResultsUrl; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public List getResults() { + return results; + } + + public String getUiResultsUrl() { + return uiResultsUrl; + } + + public void setResults(List results) { + this.results = results; + } + + public void setUiResultsUrl(String uiResultsUrl) { + this.uiResultsUrl = uiResultsUrl; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + FetchExperimentRunResponse other = (FetchExperimentRunResponse) obj; + return Objects.equals(results, other.results) && Objects.equals(uiResultsUrl, other.uiResultsUrl) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(results, uiResultsUrl, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchPromptResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchPromptResponse.java new file mode 100644 index 0000000..04855c6 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchPromptResponse.java @@ -0,0 +1,49 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class FetchPromptResponse { + @JsonProperty("commit") + private PromptCommitInfo commit; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public PromptCommitInfo getCommit() { + return commit; + } + + public void setCommit(PromptCommitInfo commit) { + this.commit = commit; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + FetchPromptResponse other = (FetchPromptResponse) obj; + return Objects.equals(commit, other.commit) && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(commit, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/GetPromptVersionsResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/GetPromptVersionsResponse.java new file mode 100644 index 0000000..ff015ff --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/GetPromptVersionsResponse.java @@ -0,0 +1,51 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class GetPromptVersionsResponse { + @JsonProperty("versions") + private List versions; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public List getVersions() { + return versions; + } + + public void setVersions(List versions) { + this.versions = versions; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + GetPromptVersionsResponse other = (GetPromptVersionsResponse) obj; + return Objects.equals(versions, other.versions) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(versions, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertExamplesRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertExamplesRequest.java new file mode 100644 index 0000000..6367bdd --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertExamplesRequest.java @@ -0,0 +1,51 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class InsertExamplesRequest { + @JsonProperty("examples") + private List examples; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public List getExamples() { + return examples; + } + + public void setExamples(List examples) { + this.examples = examples; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + InsertExamplesRequest other = (InsertExamplesRequest) obj; + return Objects.equals(examples, other.examples) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(examples, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertExamplesResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertExamplesResponse.java new file mode 100644 index 0000000..9e21d98 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertExamplesResponse.java @@ -0,0 +1,49 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class InsertExamplesResponse { + @JsonProperty("detail") + private String detail; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + InsertExamplesResponse other = (InsertExamplesResponse) obj; + return Objects.equals(detail, other.detail) && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(detail, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertPromptRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertPromptRequest.java new file mode 100644 index 0000000..137f209 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertPromptRequest.java @@ -0,0 +1,71 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class InsertPromptRequest { + @JsonProperty("name") + private String name; + @JsonProperty("prompt") + private String prompt; + @JsonProperty("tags") + private List tags; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getName() { + return name; + } + + public String getPrompt() { + return prompt; + } + + public List getTags() { + return tags; + } + + public void setName(String name) { + this.name = name; + } + + public void setPrompt(String prompt) { + this.prompt = prompt; + } + + public void setTags(List tags) { + this.tags = tags; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + InsertPromptRequest other = (InsertPromptRequest) obj; + return Objects.equals(name, other.name) && Objects.equals(prompt, other.prompt) + && Objects.equals(tags, other.tags) && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(name, prompt, tags, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertPromptResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertPromptResponse.java new file mode 100644 index 0000000..00b74e9 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/InsertPromptResponse.java @@ -0,0 +1,71 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class InsertPromptResponse { + @JsonProperty("commit_id") + private String commitId; + @JsonProperty("parent_commit_id") + private String parentCommitId; + @JsonProperty("created_at") + private String createdAt; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getCommitId() { + return commitId; + } + + public String getParentCommitId() { + return parentCommitId; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCommitId(String commitId) { + this.commitId = commitId; + } + + public void setParentCommitId(String parentCommitId) { + this.parentCommitId = parentCommitId; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + InsertPromptResponse other = (InsertPromptResponse) obj; + return Objects.equals(commitId, other.commitId) && Objects.equals(parentCommitId, other.parentCommitId) + && Objects.equals(createdAt, other.createdAt) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(commitId, parentCommitId, createdAt, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/EvalResults.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/LogEvalResultsRequest.java similarity index 79% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/EvalResults.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/LogEvalResultsRequest.java index 9d7494b..4a5e528 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/EvalResults.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/LogEvalResultsRequest.java @@ -9,13 +9,13 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class EvalResults { +public class LogEvalResultsRequest { @JsonProperty("results") - private List results; + private List results; @JsonProperty("run") - private Object run; + private ExampleEvaluationRun run; - private Map additionalProperties = new HashMap<>(); + private Map additionalProperties = new HashMap<>(); @JsonAnyGetter public Map getAdditionalProperties() { @@ -31,7 +31,7 @@ public List getResults() { return results; } - public Object getRun() { + public ExampleEvaluationRun getRun() { return run; } @@ -39,7 +39,7 @@ public void setResults(List results) { this.results = results; } - public void setRun(Object run) { + public void setRun(ExampleEvaluationRun run) { this.run = run; } @@ -49,7 +49,7 @@ public boolean equals(Object obj) { return true; if (obj == null || getClass() != obj.getClass()) return false; - EvalResults other = (EvalResults) obj; + LogEvalResultsRequest other = (LogEvalResultsRequest) obj; return Objects.equals(results, other.results) && Objects.equals(run, other.run) && Objects.equals(additionalProperties, other.additionalProperties); } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/LogEvalResultsResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/LogEvalResultsResponse.java new file mode 100644 index 0000000..b968cdb --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/LogEvalResultsResponse.java @@ -0,0 +1,50 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class LogEvalResultsResponse { + @JsonProperty("ui_results_url") + private String uiResultsUrl; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getUiResultsUrl() { + return uiResultsUrl; + } + + public void setUiResultsUrl(String uiResultsUrl) { + this.uiResultsUrl = uiResultsUrl; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + LogEvalResultsResponse other = (LogEvalResultsResponse) obj; + return Objects.equals(uiResultsUrl, other.uiResultsUrl) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(uiResultsUrl, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PromptCommitInfo.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PromptCommitInfo.java new file mode 100644 index 0000000..a545d1b --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PromptCommitInfo.java @@ -0,0 +1,136 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class PromptCommitInfo { + @JsonProperty("name") + private String name; + @JsonProperty("prompt") + private String prompt; + @JsonProperty("tags") + private List tags; + @JsonProperty("commit_id") + private String commitId; + @JsonProperty("parent_commit_id") + private String parentCommitId; + @JsonProperty("created_at") + private String createdAt; + @JsonProperty("first_name") + private String firstName; + @JsonProperty("last_name") + private String lastName; + @JsonProperty("user_email") + private String userEmail; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getName() { + return name; + } + + public String getPrompt() { + return prompt; + } + + public List getTags() { + return tags; + } + + public String getCommitId() { + return commitId; + } + + public String getParentCommitId() { + return parentCommitId; + } + + public String getCreatedAt() { + return createdAt; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public String getUserEmail() { + return userEmail; + } + + public void setName(String name) { + this.name = name; + } + + public void setPrompt(String prompt) { + this.prompt = prompt; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public void setCommitId(String commitId) { + this.commitId = commitId; + } + + public void setParentCommitId(String parentCommitId) { + this.parentCommitId = parentCommitId; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public void setUserEmail(String userEmail) { + this.userEmail = userEmail; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + PromptCommitInfo other = (PromptCommitInfo) obj; + return Objects.equals(name, other.name) && Objects.equals(prompt, other.prompt) + && Objects.equals(tags, other.tags) && Objects.equals(commitId, other.commitId) + && Objects.equals(parentCommitId, other.parentCommitId) && Objects.equals(createdAt, other.createdAt) + && Objects.equals(firstName, other.firstName) && Objects.equals(lastName, other.lastName) + && Objects.equals(userEmail, other.userEmail) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(name, prompt, tags, commitId, parentCommitId, createdAt, firstName, lastName, userEmail, + Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PromptScorer.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PromptScorer.java index 3c0662c..e1ff148 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PromptScorer.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PromptScorer.java @@ -33,8 +33,6 @@ public class PromptScorer { private String updatedAt; @JsonProperty("is_trace") private Boolean isTrace; - @JsonProperty("is_bucket_rubric") - private Boolean isBucketRubric; private Map additionalProperties = new HashMap<>(); @@ -96,10 +94,6 @@ public Boolean getIsTrace() { return isTrace; } - public Boolean getIsBucketRubric() { - return isBucketRubric; - } - public void setId(String id) { this.id = id; } @@ -148,10 +142,6 @@ public void setIsTrace(Boolean isTrace) { this.isTrace = isTrace; } - public void setIsBucketRubric(Boolean isBucketRubric) { - this.isBucketRubric = isBucketRubric; - } - @Override public boolean equals(Object obj) { if (this == obj) @@ -165,13 +155,12 @@ public boolean equals(Object obj) { && Objects.equals(model, other.model) && Objects.equals(options, other.options) && Objects.equals(description, other.description) && Objects.equals(createdAt, other.createdAt) && Objects.equals(updatedAt, other.updatedAt) && Objects.equals(isTrace, other.isTrace) - && Objects.equals(isBucketRubric, other.isBucketRubric) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { return Objects.hash(id, userId, organizationId, name, prompt, threshold, model, options, description, createdAt, - updatedAt, isTrace, isBucketRubric, Objects.hashCode(additionalProperties)); + updatedAt, isTrace, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PullDatasetResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PullDatasetResponse.java new file mode 100644 index 0000000..98e686e --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/PullDatasetResponse.java @@ -0,0 +1,82 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class PullDatasetResponse { + @JsonProperty("name") + private String name; + @JsonProperty("project_id") + private String projectId; + @JsonProperty("dataset_kind") + private String datasetKind; + @JsonProperty("examples") + private List examples; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getName() { + return name; + } + + public String getProjectId() { + return projectId; + } + + public String getDatasetKind() { + return datasetKind; + } + + public List getExamples() { + return examples; + } + + public void setName(String name) { + this.name = name; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public void setDatasetKind(String datasetKind) { + this.datasetKind = datasetKind; + } + + public void setExamples(List examples) { + this.examples = examples; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + PullDatasetResponse other = (PullDatasetResponse) obj; + return Objects.equals(name, other.name) && Objects.equals(projectId, other.projectId) + && Objects.equals(datasetKind, other.datasetKind) && Objects.equals(examples, other.examples) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(name, projectId, datasetKind, examples, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectRequest.java new file mode 100644 index 0000000..52bbd02 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectRequest.java @@ -0,0 +1,50 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ResolveProjectRequest { + @JsonProperty("project_name") + private String projectName; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + ResolveProjectRequest other = (ResolveProjectRequest) obj; + return Objects.equals(projectName, other.projectName) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(projectName, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectResponse.java new file mode 100644 index 0000000..83b4787 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ResolveProjectResponse.java @@ -0,0 +1,50 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ResolveProjectResponse { + @JsonProperty("project_id") + private String projectId; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + ResolveProjectResponse other = (ResolveProjectResponse) obj; + return Objects.equals(projectId, other.projectId) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(projectId, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/SavePromptScorerRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/SavePromptScorerRequest.java deleted file mode 100644 index c795d16..0000000 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/SavePromptScorerRequest.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.judgmentlabs.judgeval.internal.api.models; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class SavePromptScorerRequest { - @JsonProperty("name") - private String name; - @JsonProperty("prompt") - private String prompt; - @JsonProperty("threshold") - private Double threshold; - @JsonProperty("model") - private String model; - @JsonProperty("is_trace") - private Boolean isTrace; - @JsonProperty("options") - private Object options; - @JsonProperty("description") - private String description; - - private Map additionalProperties = new HashMap<>(); - - @JsonAnyGetter - public Map getAdditionalProperties() { - return additionalProperties; - } - - @JsonAnySetter - public void setAdditionalProperty(String name, Object value) { - additionalProperties.put(name, value); - } - - public String getName() { - return name; - } - - public String getPrompt() { - return prompt; - } - - public Double getThreshold() { - return threshold; - } - - public String getModel() { - return model; - } - - public Boolean getIsTrace() { - return isTrace; - } - - public Object getOptions() { - return options; - } - - public String getDescription() { - return description; - } - - public void setName(String name) { - this.name = name; - } - - public void setPrompt(String prompt) { - this.prompt = prompt; - } - - public void setThreshold(Double threshold) { - this.threshold = threshold; - } - - public void setModel(String model) { - this.model = model; - } - - public void setIsTrace(Boolean isTrace) { - this.isTrace = isTrace; - } - - public void setOptions(Object options) { - this.options = options; - } - - public void setDescription(String description) { - this.description = description; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null || getClass() != obj.getClass()) - return false; - SavePromptScorerRequest other = (SavePromptScorerRequest) obj; - return Objects.equals(name, other.name) && Objects.equals(prompt, other.prompt) - && Objects.equals(threshold, other.threshold) && Objects.equals(model, other.model) - && Objects.equals(isTrace, other.isTrace) && Objects.equals(options, other.options) - && Objects.equals(description, other.description) - && Objects.equals(additionalProperties, other.additionalProperties); - } - - @Override - public int hashCode() { - return Objects.hash(name, prompt, threshold, model, isTrace, options, description, - Objects.hashCode(additionalProperties)); - } -} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerConfig.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerConfig.java index 72b095d..8d1dccc 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerConfig.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerConfig.java @@ -18,12 +18,12 @@ public class ScorerConfig { private Double threshold; @JsonProperty("model") private String model; - @JsonProperty("strict_mode") - private Boolean strictMode; @JsonProperty("required_params") private List requiredParams; @JsonProperty("kwargs") private Object kwargs; + @JsonProperty("result_type") + private String resultType; private Map additionalProperties = new HashMap<>(); @@ -53,10 +53,6 @@ public String getModel() { return model; } - public Boolean getStrictMode() { - return strictMode; - } - public List getRequiredParams() { return requiredParams; } @@ -65,6 +61,10 @@ public Object getKwargs() { return kwargs; } + public String getResultType() { + return resultType; + } + public void setScoreType(String scoreType) { this.scoreType = scoreType; } @@ -81,10 +81,6 @@ public void setModel(String model) { this.model = model; } - public void setStrictMode(Boolean strictMode) { - this.strictMode = strictMode; - } - public void setRequiredParams(List requiredParams) { this.requiredParams = requiredParams; } @@ -93,6 +89,10 @@ public void setKwargs(Object kwargs) { this.kwargs = kwargs; } + public void setResultType(String resultType) { + this.resultType = resultType; + } + @Override public boolean equals(Object obj) { if (this == obj) @@ -102,14 +102,14 @@ public boolean equals(Object obj) { ScorerConfig other = (ScorerConfig) obj; return Objects.equals(scoreType, other.scoreType) && Objects.equals(name, other.name) && Objects.equals(threshold, other.threshold) && Objects.equals(model, other.model) - && Objects.equals(strictMode, other.strictMode) && Objects.equals(requiredParams, other.requiredParams) - && Objects.equals(kwargs, other.kwargs) + && Objects.equals(requiredParams, other.requiredParams) && Objects.equals(kwargs, other.kwargs) + && Objects.equals(resultType, other.resultType) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(scoreType, name, threshold, model, strictMode, requiredParams, kwargs, + return Objects.hash(scoreType, name, threshold, model, requiredParams, kwargs, resultType, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScoringResult.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScoringResult.java index 1231e90..b43a0ea 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScoringResult.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScoringResult.java @@ -1,30 +1,13 @@ package com.judgmentlabs.judgeval.internal.api.models; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Objects; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonProperty; public class ScoringResult { - @JsonProperty("success") - private Boolean success; - @JsonProperty("scorers_data") - private List scorersData; - @JsonProperty("name") - private String name; - @JsonProperty("data_object") - private Object dataObject; - @JsonProperty("trace_id") - private String traceId; - @JsonProperty("run_duration") - private Double runDuration; - @JsonProperty("evaluation_cost") - private Double evaluationCost; - private Map additionalProperties = new HashMap<>(); @JsonAnyGetter @@ -37,62 +20,6 @@ public void setAdditionalProperty(String name, Object value) { additionalProperties.put(name, value); } - public Boolean getSuccess() { - return success; - } - - public List getScorersData() { - return scorersData; - } - - public String getName() { - return name; - } - - public Object getDataObject() { - return dataObject; - } - - public String getTraceId() { - return traceId; - } - - public Double getRunDuration() { - return runDuration; - } - - public Double getEvaluationCost() { - return evaluationCost; - } - - public void setSuccess(Boolean success) { - this.success = success; - } - - public void setScorersData(List scorersData) { - this.scorersData = scorersData; - } - - public void setName(String name) { - this.name = name; - } - - public void setDataObject(Object dataObject) { - this.dataObject = dataObject; - } - - public void setTraceId(String traceId) { - this.traceId = traceId; - } - - public void setRunDuration(Double runDuration) { - this.runDuration = runDuration; - } - - public void setEvaluationCost(Double evaluationCost) { - this.evaluationCost = evaluationCost; - } - @Override public boolean equals(Object obj) { if (this == obj) @@ -100,16 +27,11 @@ public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) return false; ScoringResult other = (ScoringResult) obj; - return Objects.equals(success, other.success) && Objects.equals(scorersData, other.scorersData) - && Objects.equals(name, other.name) && Objects.equals(dataObject, other.dataObject) - && Objects.equals(traceId, other.traceId) && Objects.equals(runDuration, other.runDuration) - && Objects.equals(evaluationCost, other.evaluationCost) - && Objects.equals(additionalProperties, other.additionalProperties); + return Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(success, scorersData, name, dataObject, traceId, runDuration, evaluationCost, - Objects.hashCode(additionalProperties)); + return Objects.hash(Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchPromptScorersRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TagPromptRequest.java similarity index 60% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchPromptScorersRequest.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TagPromptRequest.java index 31f4c24..75c1d9a 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/FetchPromptScorersRequest.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TagPromptRequest.java @@ -9,11 +9,11 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class FetchPromptScorersRequest { - @JsonProperty("names") - private List names; - @JsonProperty("is_trace") - private Boolean isTrace; +public class TagPromptRequest { + @JsonProperty("commit_id") + private String commitId; + @JsonProperty("tags") + private List tags; private Map additionalProperties = new HashMap<>(); @@ -27,20 +27,20 @@ public void setAdditionalProperty(String name, Object value) { additionalProperties.put(name, value); } - public List getNames() { - return names; + public String getCommitId() { + return commitId; } - public Boolean getIsTrace() { - return isTrace; + public List getTags() { + return tags; } - public void setNames(List names) { - this.names = names; + public void setCommitId(String commitId) { + this.commitId = commitId; } - public void setIsTrace(Boolean isTrace) { - this.isTrace = isTrace; + public void setTags(List tags) { + this.tags = tags; } @Override @@ -49,13 +49,13 @@ public boolean equals(Object obj) { return true; if (obj == null || getClass() != obj.getClass()) return false; - FetchPromptScorersRequest other = (FetchPromptScorersRequest) obj; - return Objects.equals(names, other.names) && Objects.equals(isTrace, other.isTrace) + TagPromptRequest other = (TagPromptRequest) obj; + return Objects.equals(commitId, other.commitId) && Objects.equals(tags, other.tags) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(names, isTrace, Objects.hashCode(additionalProperties)); + return Objects.hash(commitId, tags, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TagPromptResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TagPromptResponse.java new file mode 100644 index 0000000..d4c6927 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TagPromptResponse.java @@ -0,0 +1,50 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TagPromptResponse { + @JsonProperty("commit_id") + private String commitId; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getCommitId() { + return commitId; + } + + public void setCommitId(String commitId) { + this.commitId = commitId; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + TagPromptResponse other = (TagPromptResponse) obj; + return Objects.equals(commitId, other.commitId) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(commitId, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceEvaluationRun.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceEvaluationRun.java index c19a9f8..497774e 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceEvaluationRun.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceEvaluationRun.java @@ -12,24 +12,28 @@ public class TraceEvaluationRun { @JsonProperty("id") private String id; - @JsonProperty("project_name") - private String projectName; + @JsonProperty("project_id") + private String projectId; @JsonProperty("eval_name") private String evalName; - @JsonProperty("custom_scorers") - private List customScorers; - @JsonProperty("judgment_scorers") - private List judgmentScorers; @JsonProperty("model") private String model; @JsonProperty("created_at") private String createdAt; + @JsonProperty("user_id") + private String userId; + @JsonProperty("scorers") + private List scorers; + @JsonProperty("custom_scorers") + private List customScorers; + @JsonProperty("judgment_scorers") + private List judgmentScorers; @JsonProperty("trace_and_span_ids") - private List> traceAndSpanIds; + private List> traceAndSpanIds; @JsonProperty("is_offline") private Boolean isOffline; - @JsonProperty("is_bucket_run") - private Boolean isBucketRun; + @JsonProperty("is_behavior") + private Boolean isBehavior; private Map additionalProperties = new HashMap<>(); @@ -47,22 +51,14 @@ public String getId() { return id; } - public String getProjectName() { - return projectName; + public String getProjectId() { + return projectId; } public String getEvalName() { return evalName; } - public List getCustomScorers() { - return customScorers; - } - - public List getJudgmentScorers() { - return judgmentScorers; - } - public String getModel() { return model; } @@ -71,7 +67,23 @@ public String getCreatedAt() { return createdAt; } - public List> getTraceAndSpanIds() { + public String getUserId() { + return userId; + } + + public List getScorers() { + return scorers; + } + + public List getCustomScorers() { + return customScorers; + } + + public List getJudgmentScorers() { + return judgmentScorers; + } + + public List> getTraceAndSpanIds() { return traceAndSpanIds; } @@ -79,30 +91,22 @@ public Boolean getIsOffline() { return isOffline; } - public Boolean getIsBucketRun() { - return isBucketRun; + public Boolean getIsBehavior() { + return isBehavior; } public void setId(String id) { this.id = id; } - public void setProjectName(String projectName) { - this.projectName = projectName; + public void setProjectId(String projectId) { + this.projectId = projectId; } public void setEvalName(String evalName) { this.evalName = evalName; } - public void setCustomScorers(List customScorers) { - this.customScorers = customScorers; - } - - public void setJudgmentScorers(List judgmentScorers) { - this.judgmentScorers = judgmentScorers; - } - public void setModel(String model) { this.model = model; } @@ -111,7 +115,23 @@ public void setCreatedAt(String createdAt) { this.createdAt = createdAt; } - public void setTraceAndSpanIds(List> traceAndSpanIds) { + public void setUserId(String userId) { + this.userId = userId; + } + + public void setScorers(List scorers) { + this.scorers = scorers; + } + + public void setCustomScorers(List customScorers) { + this.customScorers = customScorers; + } + + public void setJudgmentScorers(List judgmentScorers) { + this.judgmentScorers = judgmentScorers; + } + + public void setTraceAndSpanIds(List> traceAndSpanIds) { this.traceAndSpanIds = traceAndSpanIds; } @@ -119,8 +139,8 @@ public void setIsOffline(Boolean isOffline) { this.isOffline = isOffline; } - public void setIsBucketRun(Boolean isBucketRun) { - this.isBucketRun = isBucketRun; + public void setIsBehavior(Boolean isBehavior) { + this.isBehavior = isBehavior; } @Override @@ -130,17 +150,19 @@ public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) return false; TraceEvaluationRun other = (TraceEvaluationRun) obj; - return Objects.equals(id, other.id) && Objects.equals(projectName, other.projectName) - && Objects.equals(evalName, other.evalName) && Objects.equals(customScorers, other.customScorers) - && Objects.equals(judgmentScorers, other.judgmentScorers) && Objects.equals(model, other.model) - && Objects.equals(createdAt, other.createdAt) && Objects.equals(traceAndSpanIds, other.traceAndSpanIds) - && Objects.equals(isOffline, other.isOffline) && Objects.equals(isBucketRun, other.isBucketRun) + return Objects.equals(id, other.id) && Objects.equals(projectId, other.projectId) + && Objects.equals(evalName, other.evalName) && Objects.equals(model, other.model) + && Objects.equals(createdAt, other.createdAt) && Objects.equals(userId, other.userId) + && Objects.equals(scorers, other.scorers) && Objects.equals(customScorers, other.customScorers) + && Objects.equals(judgmentScorers, other.judgmentScorers) + && Objects.equals(traceAndSpanIds, other.traceAndSpanIds) && Objects.equals(isOffline, other.isOffline) + && Objects.equals(isBehavior, other.isBehavior) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(id, projectName, evalName, customScorers, judgmentScorers, model, createdAt, - traceAndSpanIds, isOffline, isBucketRun, Objects.hashCode(additionalProperties)); + return Objects.hash(id, projectId, evalName, model, createdAt, userId, scorers, customScorers, judgmentScorers, + traceAndSpanIds, isOffline, isBehavior, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceInfo.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceInfo.java new file mode 100644 index 0000000..c8459cc --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceInfo.java @@ -0,0 +1,60 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TraceInfo { + @JsonProperty("trace_id") + private String traceId; + @JsonProperty("span_id") + private String spanId; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getTraceId() { + return traceId; + } + + public String getSpanId() { + return spanId; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public void setSpanId(String spanId) { + this.spanId = spanId; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + TraceInfo other = (TraceInfo) obj; + return Objects.equals(traceId, other.traceId) && Objects.equals(spanId, other.spanId) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(traceId, spanId, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceScoringResult.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceScoringResult.java new file mode 100644 index 0000000..13e3e2c --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceScoringResult.java @@ -0,0 +1,105 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TraceScoringResult { + @JsonProperty("scorers_data") + private List scorersData; + @JsonProperty("name") + private String name; + @JsonProperty("data_object") + private TraceSpan dataObject; + @JsonProperty("trace_id") + private String traceId; + @JsonProperty("run_duration") + private Double runDuration; + @JsonProperty("evaluation_cost") + private Double evaluationCost; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public List getScorersData() { + return scorersData; + } + + public String getName() { + return name; + } + + public TraceSpan getDataObject() { + return dataObject; + } + + public String getTraceId() { + return traceId; + } + + public Double getRunDuration() { + return runDuration; + } + + public Double getEvaluationCost() { + return evaluationCost; + } + + public void setScorersData(List scorersData) { + this.scorersData = scorersData; + } + + public void setName(String name) { + this.name = name; + } + + public void setDataObject(TraceSpan dataObject) { + this.dataObject = dataObject; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public void setRunDuration(Double runDuration) { + this.runDuration = runDuration; + } + + public void setEvaluationCost(Double evaluationCost) { + this.evaluationCost = evaluationCost; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + TraceScoringResult other = (TraceScoringResult) obj; + return Objects.equals(scorersData, other.scorersData) && Objects.equals(name, other.name) + && Objects.equals(dataObject, other.dataObject) && Objects.equals(traceId, other.traceId) + && Objects.equals(runDuration, other.runDuration) + && Objects.equals(evaluationCost, other.evaluationCost) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(scorersData, name, dataObject, traceId, runDuration, evaluationCost, + Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/OtelTraceSpan.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceSpan.java similarity index 93% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/OtelTraceSpan.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceSpan.java index 949082d..a742776 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/OtelTraceSpan.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TraceSpan.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class OtelTraceSpan { +public class TraceSpan { @JsonProperty("organization_id") private String organizationId; @JsonProperty("project_id") @@ -37,15 +37,15 @@ public class OtelTraceSpan { @JsonProperty("span_attributes") private Object spanAttributes; @JsonProperty("duration") - private Integer duration; + private String duration; @JsonProperty("status_code") - private Integer statusCode; + private Double statusCode; @JsonProperty("status_message") private String statusMessage; @JsonProperty("events") private List events; @JsonProperty("links") - private List links; + private String links; private Map additionalProperties = new HashMap<>(); @@ -111,11 +111,11 @@ public Object getSpanAttributes() { return spanAttributes; } - public Integer getDuration() { + public String getDuration() { return duration; } - public Integer getStatusCode() { + public Double getStatusCode() { return statusCode; } @@ -127,7 +127,7 @@ public List getEvents() { return events; } - public List getLinks() { + public String getLinks() { return links; } @@ -183,11 +183,11 @@ public void setSpanAttributes(Object spanAttributes) { this.spanAttributes = spanAttributes; } - public void setDuration(Integer duration) { + public void setDuration(String duration) { this.duration = duration; } - public void setStatusCode(Integer statusCode) { + public void setStatusCode(Double statusCode) { this.statusCode = statusCode; } @@ -199,7 +199,7 @@ public void setEvents(List events) { this.events = events; } - public void setLinks(List links) { + public void setLinks(String links) { this.links = links; } @@ -209,7 +209,7 @@ public boolean equals(Object obj) { return true; if (obj == null || getClass() != obj.getClass()) return false; - OtelTraceSpan other = (OtelTraceSpan) obj; + TraceSpan other = (TraceSpan) obj; return Objects.equals(organizationId, other.organizationId) && Objects.equals(projectId, other.projectId) && Objects.equals(userId, other.userId) && Objects.equals(timestamp, other.timestamp) && Objects.equals(traceId, other.traceId) && Objects.equals(spanId, other.spanId) diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TriggerRootSpanRulesRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TriggerRootSpanRulesRequest.java new file mode 100644 index 0000000..57fca1c --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TriggerRootSpanRulesRequest.java @@ -0,0 +1,50 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TriggerRootSpanRulesRequest { + @JsonProperty("traces") + private List traces; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public List getTraces() { + return traces; + } + + public void setTraces(List traces) { + this.traces = traces; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + TriggerRootSpanRulesRequest other = (TriggerRootSpanRulesRequest) obj; + return Objects.equals(traces, other.traces) && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(traces, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TriggerRootSpanRulesResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TriggerRootSpanRulesResponse.java new file mode 100644 index 0000000..1030ec0 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/TriggerRootSpanRulesResponse.java @@ -0,0 +1,60 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TriggerRootSpanRulesResponse { + @JsonProperty("success") + private Boolean success; + @JsonProperty("queued_traces") + private Double queuedTraces; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public Boolean getSuccess() { + return success; + } + + public Double getQueuedTraces() { + return queuedTraces; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public void setQueuedTraces(Double queuedTraces) { + this.queuedTraces = queuedTraces; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + TriggerRootSpanRulesResponse other = (TriggerRootSpanRulesResponse) obj; + return Objects.equals(success, other.success) && Objects.equals(queuedTraces, other.queuedTraces) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(success, queuedTraces, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerExistsRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UntagPromptRequest.java similarity index 68% rename from judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerExistsRequest.java rename to judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UntagPromptRequest.java index 46e178a..70152bd 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/ScorerExistsRequest.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UntagPromptRequest.java @@ -1,6 +1,7 @@ package com.judgmentlabs.judgeval.internal.api.models; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -8,9 +9,9 @@ import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -public class ScorerExistsRequest { - @JsonProperty("name") - private String name; +public class UntagPromptRequest { + @JsonProperty("tags") + private List tags; private Map additionalProperties = new HashMap<>(); @@ -24,12 +25,12 @@ public void setAdditionalProperty(String name, Object value) { additionalProperties.put(name, value); } - public String getName() { - return name; + public List getTags() { + return tags; } - public void setName(String name) { - this.name = name; + public void setTags(List tags) { + this.tags = tags; } @Override @@ -38,12 +39,12 @@ public boolean equals(Object obj) { return true; if (obj == null || getClass() != obj.getClass()) return false; - ScorerExistsRequest other = (ScorerExistsRequest) obj; - return Objects.equals(name, other.name) && Objects.equals(additionalProperties, other.additionalProperties); + UntagPromptRequest other = (UntagPromptRequest) obj; + return Objects.equals(tags, other.tags) && Objects.equals(additionalProperties, other.additionalProperties); } @Override public int hashCode() { - return Objects.hash(name, Objects.hashCode(additionalProperties)); + return Objects.hash(tags, Objects.hashCode(additionalProperties)); } } \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UntagPromptResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UntagPromptResponse.java new file mode 100644 index 0000000..2bbd502 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UntagPromptResponse.java @@ -0,0 +1,51 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UntagPromptResponse { + @JsonProperty("commit_ids") + private List commitIds; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public List getCommitIds() { + return commitIds; + } + + public void setCommitIds(List commitIds) { + this.commitIds = commitIds; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + UntagPromptResponse other = (UntagPromptResponse) obj; + return Objects.equals(commitIds, other.commitIds) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(commitIds, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UploadCustomScorerRequest.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UploadCustomScorerRequest.java new file mode 100644 index 0000000..dd71da0 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UploadCustomScorerRequest.java @@ -0,0 +1,125 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UploadCustomScorerRequest { + @JsonProperty("scorer_name") + private String scorerName; + @JsonProperty("scorer_code") + private String scorerCode; + @JsonProperty("requirements_text") + private String requirementsText; + @JsonProperty("class_name") + private String className; + @JsonProperty("overwrite") + private Boolean overwrite; + @JsonProperty("scorer_type") + private String scorerType; + @JsonProperty("response_type") + private String responseType; + @JsonProperty("version") + private Double version; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getScorerName() { + return scorerName; + } + + public String getScorerCode() { + return scorerCode; + } + + public String getRequirementsText() { + return requirementsText; + } + + public String getClassName() { + return className; + } + + public Boolean getOverwrite() { + return overwrite; + } + + public String getScorerType() { + return scorerType; + } + + public String getResponseType() { + return responseType; + } + + public Double getVersion() { + return version; + } + + public void setScorerName(String scorerName) { + this.scorerName = scorerName; + } + + public void setScorerCode(String scorerCode) { + this.scorerCode = scorerCode; + } + + public void setRequirementsText(String requirementsText) { + this.requirementsText = requirementsText; + } + + public void setClassName(String className) { + this.className = className; + } + + public void setOverwrite(Boolean overwrite) { + this.overwrite = overwrite; + } + + public void setScorerType(String scorerType) { + this.scorerType = scorerType; + } + + public void setResponseType(String responseType) { + this.responseType = responseType; + } + + public void setVersion(Double version) { + this.version = version; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + UploadCustomScorerRequest other = (UploadCustomScorerRequest) obj; + return Objects.equals(scorerName, other.scorerName) && Objects.equals(scorerCode, other.scorerCode) + && Objects.equals(requirementsText, other.requirementsText) + && Objects.equals(className, other.className) && Objects.equals(overwrite, other.overwrite) + && Objects.equals(scorerType, other.scorerType) && Objects.equals(responseType, other.responseType) + && Objects.equals(version, other.version) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(scorerName, scorerCode, requirementsText, className, overwrite, scorerType, responseType, + version, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UploadCustomScorerResponse.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UploadCustomScorerResponse.java new file mode 100644 index 0000000..3bd2b81 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models/UploadCustomScorerResponse.java @@ -0,0 +1,71 @@ +package com.judgmentlabs.judgeval.internal.api.models; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UploadCustomScorerResponse { + @JsonProperty("scorer_name") + private String scorerName; + @JsonProperty("status") + private String status; + @JsonProperty("message") + private String message; + + private Map additionalProperties = new HashMap<>(); + + @JsonAnyGetter + public Map getAdditionalProperties() { + return additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + additionalProperties.put(name, value); + } + + public String getScorerName() { + return scorerName; + } + + public String getStatus() { + return status; + } + + public String getMessage() { + return message; + } + + public void setScorerName(String scorerName) { + this.scorerName = scorerName; + } + + public void setStatus(String status) { + this.status = status; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + UploadCustomScorerResponse other = (UploadCustomScorerResponse) obj; + return Objects.equals(scorerName, other.scorerName) && Objects.equals(status, other.status) + && Objects.equals(message, other.message) + && Objects.equals(additionalProperties, other.additionalProperties); + } + + @Override + public int hashCode() { + return Objects.hash(scorerName, status, message, Objects.hashCode(additionalProperties)); + } +} \ No newline at end of file diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/APIScorer.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/APIScorer.java index 1fb9bf2..c5ae38e 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/APIScorer.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/APIScorer.java @@ -2,7 +2,6 @@ import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -15,6 +14,7 @@ */ public class APIScorer extends com.judgmentlabs.judgeval.internal.api.models.BaseScorer implements BaseScorer { private APIScorerType scoreType; + private Double threshold; @JsonIgnore private List requiredParams; @@ -22,6 +22,7 @@ public class APIScorer extends com.judgmentlabs.judgeval.internal.api.models.Bas public APIScorer(APIScorerType scoreType) { super(); this.scoreType = scoreType; + this.threshold = 0.5; setName(scoreType.toString()); setScoreType(scoreType.toString()); this.requiredParams = new java.util.ArrayList<>(); @@ -34,7 +35,7 @@ public void setThreshold(double threshold) { if (threshold < 0 || threshold > 1) { throw new IllegalArgumentException("Threshold must be between 0 and 1, got: " + threshold); } - super.setThreshold(threshold); + this.threshold = threshold; } @JsonProperty("score_type") @@ -50,9 +51,8 @@ public void setRequiredParams(List requiredParams) { this.requiredParams = requiredParams; } - @Override public Double getThreshold() { - return Optional.ofNullable(super.getThreshold()) + return Optional.ofNullable(threshold) .orElse(0.5); } @@ -63,12 +63,6 @@ public String getName() { .orElse(null); } - @Override - public Boolean getStrictMode() { - return Optional.ofNullable(super.getStrictMode()) - .orElse(false); - } - @Override @JsonIgnore public ScorerConfig getScorerConfig() { @@ -76,12 +70,11 @@ public ScorerConfig getScorerConfig() { cfg.setScoreType(getScoreType()); cfg.setThreshold(getThreshold()); cfg.setName(getName()); - cfg.setStrictMode(getStrictMode()); cfg.setRequiredParams(getRequiredParams()); - Map kwargs = new HashMap<>(); - if (getAdditionalProperties() != null) - kwargs.putAll(getAdditionalProperties()); - cfg.setKwargs(kwargs); + cfg.setKwargs(Optional.ofNullable(getAdditionalProperties()) + .map(HashMap::new) + .orElseGet(HashMap::new)); + cfg.setResultType("numeric"); return cfg; } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/ScorersFactory.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/ScorersFactory.java index d687088..4fdc685 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/ScorersFactory.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/ScorersFactory.java @@ -1,5 +1,7 @@ package com.judgmentlabs.judgeval.scorers; +import java.util.Optional; + import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; import com.judgmentlabs.judgeval.scorers.built_in.BuiltInScorersFactory; import com.judgmentlabs.judgeval.scorers.custom_scorer.CustomScorerFactory; @@ -10,9 +12,11 @@ */ public final class ScorersFactory { private final JudgmentSyncClient client; + private final Optional projectId; - public ScorersFactory(JudgmentSyncClient client) { + public ScorersFactory(JudgmentSyncClient client, Optional projectId) { this.client = client; + this.projectId = projectId; } /** @@ -21,7 +25,7 @@ public ScorersFactory(JudgmentSyncClient client) { * @return the prompt scorer factory */ public PromptScorerFactory promptScorer() { - return new PromptScorerFactory(client, false); + return new PromptScorerFactory(client, projectId, false); } /** @@ -30,7 +34,7 @@ public PromptScorerFactory promptScorer() { * @return the trace prompt scorer factory */ public PromptScorerFactory tracePromptScorer() { - return new PromptScorerFactory(client, true); + return new PromptScorerFactory(client, projectId, true); } /** @@ -39,7 +43,7 @@ public PromptScorerFactory tracePromptScorer() { * @return the custom scorer factory */ public CustomScorerFactory customScorer() { - return new CustomScorerFactory(); + return new CustomScorerFactory(projectId); } /** diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/custom_scorer/CustomScorer.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/custom_scorer/CustomScorer.java index 953e201..6dde7ca 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/custom_scorer/CustomScorer.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/custom_scorer/CustomScorer.java @@ -13,12 +13,14 @@ * Docs: Upload Scorers */ public final class CustomScorer extends APIScorer { + private final String projectId; + private CustomScorer(Builder builder) { super(APIScorerType.CUSTOM); setName(builder.name); setClassName(builder.className); - // Java SDK only supports server-hosted scorers setServerHosted(true); + this.projectId = builder.projectId; } @Override @@ -26,6 +28,10 @@ public ScorerConfig getScorerConfig() { throw new UnsupportedOperationException("CustomScorer does not use ScorerConfig"); } + public String getProjectId() { + return projectId; + } + /** * Creates a new builder for configuring a CustomScorer. * @@ -41,6 +47,7 @@ public static Builder builder() { public static final class Builder { private String name; private String className; + private String projectId; public Builder name(String name) { this.name = name; @@ -52,6 +59,11 @@ public Builder className(String className) { return this; } + public Builder projectId(String projectId) { + this.projectId = projectId; + return this; + } + public CustomScorer build() { return new CustomScorer(this); } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/custom_scorer/CustomScorerFactory.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/custom_scorer/CustomScorerFactory.java index a768fd5..a164798 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/custom_scorer/CustomScorerFactory.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/custom_scorer/CustomScorerFactory.java @@ -1,10 +1,17 @@ package com.judgmentlabs.judgeval.scorers.custom_scorer; +import java.util.Optional; + +import com.judgmentlabs.judgeval.utils.Guards; + /** * Factory for creating custom scorer instances. */ public final class CustomScorerFactory { - public CustomScorerFactory() { + private final Optional projectId; + + public CustomScorerFactory(Optional projectId) { + this.projectId = projectId; } /** @@ -12,13 +19,10 @@ public CustomScorerFactory() { * * @param name * the scorer name - * @return the configured custom scorer + * @return the configured custom scorer, or null if project ID is not set */ public CustomScorer get(String name) { - return CustomScorer.builder() - .name(name) - .className(name) - .build(); + return get(name, name); } /** @@ -28,12 +32,15 @@ public CustomScorer get(String name) { * the scorer name * @param className * the class name - * @return the configured custom scorer + * @return the configured custom scorer, or null if project ID is not set */ public CustomScorer get(String name, String className) { - return CustomScorer.builder() - .name(name) - .className(className) - .build(); + return Guards.expectProjectId(projectId) + .map(pid -> CustomScorer.builder() + .name(name) + .className(className) + .projectId(pid) + .build()) + .orElse(null); } } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/prompt_scorer/PromptScorer.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/prompt_scorer/PromptScorer.java index 665d92c..181d056 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/prompt_scorer/PromptScorer.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/prompt_scorer/PromptScorer.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.Optional; import com.judgmentlabs.judgeval.data.APIScorerType; import com.judgmentlabs.judgeval.internal.api.models.ScorerConfig; @@ -37,7 +38,7 @@ public String getPrompt() { } public Map getOptions() { - return options != null ? new HashMap<>(options) : null; + return Optional.ofNullable(options).map(HashMap::new).orElse(null); } public String getScorerName() { @@ -50,17 +51,11 @@ public ScorerConfig getScorerConfig() { cfg.setScoreType(getScoreType()); cfg.setThreshold(getThreshold()); cfg.setName(getName()); - cfg.setStrictMode(getStrictMode()); cfg.setRequiredParams(getRequiredParams()); - Map kwargs = new HashMap<>(); kwargs.put("prompt", prompt); - if (options != null) { - kwargs.put("options", options); - } - if (getAdditionalProperties() != null) { - kwargs.putAll(getAdditionalProperties()); - } + Optional.ofNullable(options).ifPresent(o -> kwargs.put("options", o)); + Optional.ofNullable(getAdditionalProperties()).ifPresent(kwargs::putAll); cfg.setKwargs(kwargs); return cfg; } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/prompt_scorer/PromptScorerFactory.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/prompt_scorer/PromptScorerFactory.java index fc99067..fccd417 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/prompt_scorer/PromptScorerFactory.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/scorers/prompt_scorer/PromptScorerFactory.java @@ -7,8 +7,8 @@ import java.util.concurrent.ConcurrentHashMap; import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; -import com.judgmentlabs.judgeval.internal.api.models.FetchPromptScorersRequest; import com.judgmentlabs.judgeval.internal.api.models.FetchPromptScorersResponse; +import com.judgmentlabs.judgeval.utils.Guards; import com.judgmentlabs.judgeval.utils.Logger; /** @@ -16,11 +16,13 @@ */ public final class PromptScorerFactory { private final JudgmentSyncClient client; + private final Optional projectId; private final boolean isTrace; private static final Map cache = new ConcurrentHashMap<>(); - public PromptScorerFactory(JudgmentSyncClient client, boolean isTrace) { + public PromptScorerFactory(JudgmentSyncClient client, Optional projectId, boolean isTrace) { this.client = client; + this.projectId = projectId; this.isTrace = isTrace; } @@ -33,6 +35,12 @@ public PromptScorerFactory(JudgmentSyncClient client, boolean isTrace) { * @return the configured prompt scorer or null if not found or retrieval fails */ public PromptScorer get(String name) { + return Guards.expectProjectId(projectId) + .map(pid -> fetchAndCache(name, pid)) + .orElse(null); + } + + private PromptScorer fetchAndCache(String name, String pid) { CacheKey key = new CacheKey(name, client.getApiKey(), client.getOrganizationId()); com.judgmentlabs.judgeval.internal.api.models.PromptScorer cached = cache.get(key); if (cached != null) { @@ -40,55 +48,50 @@ public PromptScorer get(String name) { } try { - FetchPromptScorersRequest request = new FetchPromptScorersRequest(); - request.setNames(java.util.Collections.singletonList(name)); + FetchPromptScorersResponse response = client.getProjectsScorers(pid, name, String.valueOf(isTrace)); - FetchPromptScorersResponse response = client.fetchScorers(request); - - com.judgmentlabs.judgeval.internal.api.models.PromptScorer scorer = Optional.ofNullable(response) + return Optional.ofNullable(response) .map(FetchPromptScorersResponse::getScorers) .filter(scorers -> scorers != null && !scorers.isEmpty()) .map(scorers -> scorers.get(0)) - .orElseGet( - () -> { - Logger.error("Failed to fetch prompt scorer '" + name + "': not found"); - return null; - }); - - if (scorer == null) { - return null; - } - - if (Boolean.TRUE.equals(scorer.getIsTrace()) != isTrace) { - Logger.error("Scorer with name " + name + " is a " - + (Boolean.TRUE.equals(scorer.getIsTrace()) ? "TracePromptScorer" : "PromptScorer") + ", not a " - + (isTrace ? "TracePromptScorer" : "PromptScorer")); - return null; - } - - cache.put(key, scorer); - return createFromModel(scorer, name); + .filter(scorer -> { + if (Boolean.TRUE.equals(scorer.getIsTrace()) != isTrace) { + Logger.error("Scorer '" + name + "' is a " + + (Boolean.TRUE.equals(scorer.getIsTrace()) ? "TracePromptScorer" : "PromptScorer") + + ", not a " + (isTrace ? "TracePromptScorer" : "PromptScorer")); + return false; + } + return true; + }) + .map(scorer -> { + cache.put(key, scorer); + return createFromModel(scorer, name); + }) + .orElseGet(() -> { + Logger.error("Failed to fetch prompt scorer '" + name + "': not found"); + return null; + }); } catch (Exception e) { Logger.error("Failed to fetch prompt scorer '" + name + "': " + e.getMessage()); return null; } } + @SuppressWarnings("unchecked") private PromptScorer createFromModel(com.judgmentlabs.judgeval.internal.api.models.PromptScorer model, String name) { - Map options = null; - if (model.getOptions() != null) { - if (model.getOptions() instanceof Map) { - @SuppressWarnings("unchecked") - Map rawOptions = (Map) model.getOptions(); - options = new HashMap<>(); - for (Map.Entry entry : rawOptions.entrySet()) { - if (entry.getValue() instanceof Number) { - options.put(entry.getKey(), ((Number) entry.getValue()).doubleValue()); - } - } - } - } + Map options = Optional.ofNullable(model.getOptions()) + .filter(Map.class::isInstance) + .map(o -> (Map) o) + .map(raw -> { + Map result = new HashMap<>(); + raw.forEach((k, v) -> { + if (v instanceof Number) + result.put(k, ((Number) v).doubleValue()); + }); + return result; + }) + .orElse(null); return PromptScorer.builder() .name(name) diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/BaseTracer.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/BaseTracer.java index e604d8e..f4cd395 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/BaseTracer.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/BaseTracer.java @@ -10,18 +10,18 @@ import java.util.Optional; import java.util.UUID; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.judgmentlabs.judgeval.JudgmentAttributeKeys; import com.judgmentlabs.judgeval.data.Example; import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; import com.judgmentlabs.judgeval.internal.api.models.ExampleEvaluationRun; -import com.judgmentlabs.judgeval.internal.api.models.ResolveProjectNameRequest; -import com.judgmentlabs.judgeval.internal.api.models.ResolveProjectNameResponse; import com.judgmentlabs.judgeval.internal.api.models.TraceEvaluationRun; import com.judgmentlabs.judgeval.scorers.BaseScorer; import com.judgmentlabs.judgeval.scorers.custom_scorer.CustomScorer; import com.judgmentlabs.judgeval.tracer.exporters.JudgmentSpanExporter; import com.judgmentlabs.judgeval.tracer.exporters.NoOpSpanExporter; +import com.judgmentlabs.judgeval.utils.Guards; import com.judgmentlabs.judgeval.utils.Logger; import io.opentelemetry.api.GlobalOpenTelemetry; @@ -45,19 +45,14 @@ public abstract class BaseTracer { protected final ObjectMapper jacksonMapper; protected final Optional projectId; - protected BaseTracer(String projectName, + protected BaseTracer(String projectName, Optional projectId, boolean enableEvaluation, JudgmentSyncClient apiClient, ISerializer serializer) { this.projectName = Objects.requireNonNull(projectName, "projectName required"); + this.projectId = Optional.ofNullable(projectId).orElse(Optional.empty()); this.enableEvaluation = enableEvaluation; this.apiClient = Objects.requireNonNull(apiClient, "apiClient required"); this.serializer = Objects.requireNonNull(serializer, "serializer required"); - this.jacksonMapper = new ObjectMapper(); - this.projectId = resolveProjectId(projectName); - - this.projectId.ifPresentOrElse(id -> { - }, () -> Logger.error("Failed to resolve project " + projectName - + ", please create it first at https://app.judgmentlabs.ai/org/" + this.apiClient.getOrganizationId() - + "/projects. Skipping Judgment export.")); + this.jacksonMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); } /** @@ -255,20 +250,18 @@ private void safeExecute(String operation, Runnable action) { * the example data to evaluate against */ public void asyncEvaluate(BaseScorer scorer, Example example) { + if (scorer == null) + return; safeExecute("evaluate scorer", () -> { - if (!isEvaluationEnabled()) { + if (!isEvaluationEnabled()) return; - } - - getSampledSpanContext().ifPresent(spanContext -> { + Guards.expectProjectId(projectId).ifPresent(pid -> getSampledSpanContext().ifPresent(spanContext -> { String traceId = spanContext.getTraceId(); String spanId = spanContext.getSpanId(); - logEvaluationInfo("asyncEvaluate", traceId, spanId, scorer.getName()); - - ExampleEvaluationRun evaluationRun = createEvaluationRun(scorer, example, traceId, spanId); - enqueueEvaluation(evaluationRun); - }); + enqueueEvaluation( + createEvaluationRun(scorer, example, traceId, spanId, pid), pid); + })); }); } @@ -281,27 +274,27 @@ public void asyncEvaluate(BaseScorer scorer, Example example) { * the scorer to use for trace evaluation */ public void asyncTraceEvaluate(BaseScorer scorer) { + if (scorer == null) + return; safeExecute("evaluate trace scorer", () -> { - if (!isEvaluationEnabled()) { + if (!isEvaluationEnabled()) return; - } - - getSampledSpan().ifPresent(currentSpan -> { + Guards.expectProjectId(projectId).ifPresent(pid -> getSampledSpan().ifPresent(currentSpan -> { SpanContext spanContext = currentSpan.getSpanContext(); String traceId = spanContext.getTraceId(); String spanId = spanContext.getSpanId(); - logEvaluationInfo("asyncTraceEvaluate", traceId, spanId, scorer.getName()); - - TraceEvaluationRun evaluationRun = createTraceEvaluationRun(scorer, traceId, spanId); + TraceEvaluationRun evaluationRun = createTraceEvaluationRun( + scorer, traceId, spanId, pid); try { String traceEvalJson = jacksonMapper.writeValueAsString(evaluationRun); - currentSpan.setAttribute(JudgmentAttributeKeys.AttributeKeys.JUDGMENT_PENDING_TRACE_EVAL, + currentSpan.setAttribute( + JudgmentAttributeKeys.AttributeKeys.JUDGMENT_PENDING_TRACE_EVAL, traceEvalJson); } catch (Exception e) { Logger.error("Failed to serialize trace evaluation: " + e.getMessage()); } - }); + })); }); } @@ -481,18 +474,6 @@ public static Span span(String spanName) { .startSpan(); } - private Optional resolveProjectId(String name) { - try { - ResolveProjectNameRequest request = new ResolveProjectNameRequest(); - request.setProjectName(name); - ResolveProjectNameResponse response = apiClient.projectsResolve(request); - return Optional.ofNullable(response.getProjectId()) - .map(Object::toString); - } catch (Exception e) { - return Optional.empty(); - } - } - private String buildEndpoint(String baseUrl) { return baseUrl.endsWith("/") ? baseUrl + "otel/v1/traces" : baseUrl + "/otel/v1/traces"; } @@ -512,12 +493,12 @@ private String generateRunId(String prefix, String spanId) { } private ExampleEvaluationRun createEvaluationRun(BaseScorer scorer, Example example, String traceId, - String spanId) { + String spanId, String resolvedProjectId) { String runId = generateRunId("async_evaluate_", spanId); ExampleEvaluationRun evaluationRun = new ExampleEvaluationRun(); evaluationRun.setId(UUID.randomUUID().toString()); - evaluationRun.setProjectName(projectName); + evaluationRun.setProjectId(resolvedProjectId); evaluationRun.setEvalName(runId); evaluationRun.setTraceId(traceId); evaluationRun.setTraceSpanId(spanId); @@ -536,26 +517,30 @@ private ExampleEvaluationRun createEvaluationRun(BaseScorer scorer, Example exam } private TraceEvaluationRun createTraceEvaluationRun(BaseScorer scorer, String traceId, - String spanId) { + String spanId, String resolvedProjectId) { String evalName = generateRunId("async_trace_evaluate_", spanId); TraceEvaluationRun evaluationRun = new TraceEvaluationRun(); evaluationRun.setId(UUID.randomUUID().toString()); - evaluationRun.setProjectName(projectName); + evaluationRun.setProjectId(resolvedProjectId); evaluationRun.setEvalName(evalName); evaluationRun.setTraceAndSpanIds(List.of(List.of(traceId, spanId))); - evaluationRun.setJudgmentScorers(List.of(scorer.getScorerConfig())); - evaluationRun.setCustomScorers(List.of()); + if (scorer instanceof CustomScorer) { + evaluationRun.setJudgmentScorers(List.of()); + evaluationRun.setCustomScorers(List.of((com.judgmentlabs.judgeval.internal.api.models.BaseScorer) scorer)); + } else { + evaluationRun.setJudgmentScorers(List.of(scorer.getScorerConfig())); + evaluationRun.setCustomScorers(List.of()); + } evaluationRun.setIsOffline(false); - evaluationRun.setIsBucketRun(false); evaluationRun.setCreatedAt(Instant.now().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT)); return evaluationRun; } - private void enqueueEvaluation(ExampleEvaluationRun evaluationRun) { + private void enqueueEvaluation(ExampleEvaluationRun evaluationRun, String resolvedProjectId) { try { - apiClient.addToRunEvalQueue(evaluationRun); + apiClient.postProjectsEvalQueueExamples(resolvedProjectId, evaluationRun); } catch (Exception e) { Logger.error("Failed to enqueue evaluation run: " + e.getMessage()); } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/Tracer.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/Tracer.java index f07894f..4fc40b7 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/Tracer.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/Tracer.java @@ -25,6 +25,7 @@ public final class Tracer extends BaseTracer { private Tracer(Builder builder) { super( Objects.requireNonNull(builder.projectName, "projectName required"), + builder.projectId, builder.enableEvaluation, Objects.requireNonNull(builder.client, "client required"), builder.serializer != null ? builder.serializer : new GsonSerializer()); @@ -118,35 +119,27 @@ public static Builder builder() { public static final class Builder { private JudgmentSyncClient client; private String projectName; + private Optional projectId; private boolean enableEvaluation = true; private ISerializer serializer; private boolean initialize = true; private Attributes resourceAttributes; - /** - * Sets the Judgment API client. - * - * @param client - * the API client - * @return this builder - */ - public Builder client(JudgmentSyncClient client) { + Builder client(JudgmentSyncClient client) { this.client = client; return this; } - /** - * Sets the project name for this tracer. - * - * @param projectName - * the project name - * @return this builder - */ - public Builder projectName(String projectName) { + Builder projectName(String projectName) { this.projectName = projectName; return this; } + Builder projectId(Optional projectId) { + this.projectId = projectId; + return this; + } + /** * Sets whether evaluation is enabled. * diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/TracerFactory.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/TracerFactory.java index 4684103..0252b9f 100644 --- a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/TracerFactory.java +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/tracer/TracerFactory.java @@ -1,5 +1,7 @@ package com.judgmentlabs.judgeval.tracer; +import java.util.Optional; + import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; /** @@ -7,9 +9,13 @@ */ public final class TracerFactory { private final JudgmentSyncClient client; + private final String projectName; + private final Optional projectId; - public TracerFactory(JudgmentSyncClient client) { + public TracerFactory(JudgmentSyncClient client, String projectName, Optional projectId) { this.client = client; + this.projectName = projectName; + this.projectId = projectId; } /** @@ -19,6 +25,8 @@ public TracerFactory(JudgmentSyncClient client) { */ public Tracer.Builder create() { return Tracer.builder() - .client(client); + .client(client) + .projectName(projectName) + .projectId(projectId); } } diff --git a/judgeval-java/src/main/java/com/judgmentlabs/judgeval/utils/Guards.java b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/utils/Guards.java new file mode 100644 index 0000000..de7b8c8 --- /dev/null +++ b/judgeval-java/src/main/java/com/judgmentlabs/judgeval/utils/Guards.java @@ -0,0 +1,31 @@ +package com.judgmentlabs.judgeval.utils; + +import java.util.Optional; + +/** + * Validation guards for runtime preconditions. + */ +public final class Guards { + + private Guards() { + } + + /** + * Validates that a project ID exists. Logs an error with the caller method + * name and returns empty if missing. + * + * @param projectId + * the project ID to validate + * @return the project ID if present, or empty if missing + */ + public static Optional expectProjectId(Optional projectId) { + return Optional.ofNullable(projectId) + .flatMap(pid -> pid) + .or(() -> { + StackTraceElement[] stack = Thread.currentThread().getStackTrace(); + String caller = stack.length >= 3 ? stack[2].getMethodName() : "unknown"; + Logger.error("project_id is not set. " + caller + "() will be skipped."); + return Optional.empty(); + }); + } +} diff --git a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/JudgevalTest.java b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/JudgevalTest.java index 1f0274b..2dd4017 100644 --- a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/JudgevalTest.java +++ b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/JudgevalTest.java @@ -10,13 +10,15 @@ import com.judgmentlabs.judgeval.tracer.TracerFactory; class JudgevalTest { - private static final String TEST_API_URL = "https://api.test.com"; - private static final String TEST_API_KEY = "test-key"; - private static final String TEST_ORG_ID = "test-org"; + private static final String TEST_API_URL = "https://api.test.com"; + private static final String TEST_API_KEY = "test-key"; + private static final String TEST_ORG_ID = "test-org"; + private static final String TEST_PROJECT_NAME = "test-project"; @Test void builder_withAllParameters_buildsSuccessfully() { Judgeval client = Judgeval.builder() + .projectName(TEST_PROJECT_NAME) .apiKey(TEST_API_KEY) .organizationId(TEST_ORG_ID) .apiUrl(TEST_API_URL) @@ -29,6 +31,7 @@ void builder_withAllParameters_buildsSuccessfully() { void builder_withNullApiKey_throwsException() { assertThrows(NullPointerException.class, () -> { Judgeval.builder() + .projectName(TEST_PROJECT_NAME) .apiKey(null) .organizationId(TEST_ORG_ID) .build(); @@ -39,15 +42,27 @@ void builder_withNullApiKey_throwsException() { void builder_withNullOrganizationId_throwsException() { assertThrows(NullPointerException.class, () -> { Judgeval.builder() + .projectName(TEST_PROJECT_NAME) .apiKey(TEST_API_KEY) .organizationId(null) .build(); }); } + @Test + void builder_withNullProjectName_throwsException() { + assertThrows(NullPointerException.class, () -> { + Judgeval.builder() + .apiKey(TEST_API_KEY) + .organizationId(TEST_ORG_ID) + .build(); + }); + } + @Test void tracer_returnsTracerFactory() { Judgeval client = Judgeval.builder() + .projectName(TEST_PROJECT_NAME) .apiKey(TEST_API_KEY) .organizationId(TEST_ORG_ID) .build(); @@ -59,6 +74,7 @@ void tracer_returnsTracerFactory() { @Test void scorers_returnsScorersFactory() { Judgeval client = Judgeval.builder() + .projectName(TEST_PROJECT_NAME) .apiKey(TEST_API_KEY) .organizationId(TEST_ORG_ID) .build(); @@ -70,6 +86,7 @@ void scorers_returnsScorersFactory() { @Test void evaluation_returnsEvaluationFactory() { Judgeval client = Judgeval.builder() + .projectName(TEST_PROJECT_NAME) .apiKey(TEST_API_KEY) .organizationId(TEST_ORG_ID) .build(); diff --git a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/evaluation/EvaluationFactoryTest.java b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/evaluation/EvaluationFactoryTest.java index 0cb131e..6872dff 100644 --- a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/evaluation/EvaluationFactoryTest.java +++ b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/evaluation/EvaluationFactoryTest.java @@ -2,22 +2,26 @@ import static org.junit.jupiter.api.Assertions.*; +import java.util.Optional; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; class EvaluationFactoryTest { - private static final String TEST_API_URL = "https://api.test.com"; - private static final String TEST_API_KEY = "test-key"; - private static final String TEST_ORG_ID = "test-org"; + private static final String TEST_API_URL = "https://api.test.com"; + private static final String TEST_API_KEY = "test-key"; + private static final String TEST_ORG_ID = "test-org"; + private static final String TEST_PROJECT_NAME = "test-project"; + private static final String TEST_PROJECT_ID = "test-project-id"; private EvaluationFactory factory; @BeforeEach void setUp() { JudgmentSyncClient client = new JudgmentSyncClient(TEST_API_URL, TEST_API_KEY, TEST_ORG_ID); - factory = new EvaluationFactory(client); + factory = new EvaluationFactory(client, Optional.of(TEST_PROJECT_ID), TEST_PROJECT_NAME); } @Test diff --git a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/scorers/ScorersFactoryTest.java b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/scorers/ScorersFactoryTest.java index fe58522..28d4b7c 100644 --- a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/scorers/ScorersFactoryTest.java +++ b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/scorers/ScorersFactoryTest.java @@ -2,6 +2,8 @@ import static org.junit.jupiter.api.Assertions.*; +import java.util.Optional; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -11,16 +13,17 @@ import com.judgmentlabs.judgeval.scorers.prompt_scorer.PromptScorerFactory; class ScorersFactoryTest { - private static final String TEST_API_URL = "https://api.test.com"; - private static final String TEST_API_KEY = "test-key"; - private static final String TEST_ORG_ID = "test-org"; + private static final String TEST_API_URL = "https://api.test.com"; + private static final String TEST_API_KEY = "test-key"; + private static final String TEST_ORG_ID = "test-org"; + private static final String TEST_PROJECT_ID = "test-project-id"; private ScorersFactory factory; @BeforeEach void setUp() { JudgmentSyncClient client = new JudgmentSyncClient(TEST_API_URL, TEST_API_KEY, TEST_ORG_ID); - factory = new ScorersFactory(client); + factory = new ScorersFactory(client, Optional.of(TEST_PROJECT_ID)); } @Test diff --git a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/BaseTracerTest.java b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/BaseTracerTest.java index af29ca9..f598a23 100644 --- a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/BaseTracerTest.java +++ b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/BaseTracerTest.java @@ -7,7 +7,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.lenient; -import static org.mockito.Mockito.when; + +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -16,8 +17,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; -import com.judgmentlabs.judgeval.internal.api.models.ResolveProjectNameRequest; -import com.judgmentlabs.judgeval.internal.api.models.ResolveProjectNameResponse; import com.judgmentlabs.judgeval.tracer.exporters.JudgmentSpanExporter; import com.judgmentlabs.judgeval.tracer.exporters.NoOpSpanExporter; @@ -37,11 +36,6 @@ class BaseTracerTest { @BeforeEach void setUp() throws Exception { - ResolveProjectNameResponse response = new ResolveProjectNameResponse(); - response.setProjectId(TEST_PROJECT_ID); - - lenient().when(mockClient.projectsResolve(any(ResolveProjectNameRequest.class))) - .thenReturn(response); lenient().when(mockClient.getApiUrl()).thenReturn("https://api.example.com"); lenient().when(mockClient.getApiKey()).thenReturn("test-api-key"); lenient().when(mockClient.getOrganizationId()).thenReturn("test-org-id"); @@ -51,13 +45,14 @@ void setUp() throws Exception { tracer = new TestableBaseTracer( TEST_PROJECT_NAME, + Optional.of(TEST_PROJECT_ID), true, mockClient, mockSerializer); } @Test - void constructor_withValidParameters_resolvesProject() { + void constructor_withValidParameters_setsProject() { assertNotNull(tracer); assertEquals(TEST_PROJECT_NAME, tracer.getProjectName()); assertTrue(tracer.isEnableEvaluation()); @@ -70,6 +65,7 @@ void constructor_withNullProjectName_throwsException() { assertThrows(NullPointerException.class, () -> { new TestableBaseTracer( null, + Optional.of(TEST_PROJECT_ID), true, mockClient, mockSerializer); @@ -81,6 +77,7 @@ void constructor_withNullClient_throwsException() { assertThrows(NullPointerException.class, () -> { new TestableBaseTracer( TEST_PROJECT_NAME, + Optional.of(TEST_PROJECT_ID), true, null, mockSerializer); @@ -92,6 +89,7 @@ void constructor_withNullSerializer_throwsException() { assertThrows(NullPointerException.class, () -> { new TestableBaseTracer( TEST_PROJECT_NAME, + Optional.of(TEST_PROJECT_ID), true, mockClient, null); @@ -99,17 +97,15 @@ void constructor_withNullSerializer_throwsException() { } @Test - void constructor_withFailedProjectResolution_hasEmptyProjectId() throws Exception { - when(mockClient.projectsResolve(any(ResolveProjectNameRequest.class))) - .thenThrow(new RuntimeException("Project not found")); - - TestableBaseTracer failedTracer = new TestableBaseTracer( + void constructor_withEmptyProjectId_hasEmptyProjectId() { + TestableBaseTracer noProjectTracer = new TestableBaseTracer( TEST_PROJECT_NAME, + Optional.empty(), true, mockClient, mockSerializer); - assertFalse(failedTracer.getProjectId().isPresent()); + assertFalse(noProjectTracer.getProjectId().isPresent()); } @Test @@ -120,17 +116,15 @@ void getSpanExporter_withValidProjectId_returnsJudgmentSpanExporter() { } @Test - void getSpanExporter_withoutProjectId_returnsNoOpSpanExporter() throws Exception { - when(mockClient.projectsResolve(any(ResolveProjectNameRequest.class))) - .thenReturn(null); - - TestableBaseTracer failedTracer = new TestableBaseTracer( + void getSpanExporter_withoutProjectId_returnsNoOpSpanExporter() { + TestableBaseTracer noProjectTracer = new TestableBaseTracer( TEST_PROJECT_NAME, + Optional.empty(), true, mockClient, mockSerializer); - SpanExporter exporter = failedTracer.getSpanExporter(); + SpanExporter exporter = noProjectTracer.getSpanExporter(); assertNotNull(exporter); assertTrue(exporter instanceof NoOpSpanExporter); } @@ -147,9 +141,9 @@ void setAttributes_withNull_doesNotThrow() { } private static class TestableBaseTracer extends BaseTracer { - protected TestableBaseTracer(String projectName, boolean enableEvaluation, JudgmentSyncClient apiClient, - ISerializer serializer) { - super(projectName, enableEvaluation, apiClient, serializer); + protected TestableBaseTracer(String projectName, Optional projectId, + boolean enableEvaluation, JudgmentSyncClient apiClient, ISerializer serializer) { + super(projectName, projectId, enableEvaluation, apiClient, serializer); } @Override diff --git a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/TracerFactoryTest.java b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/TracerFactoryTest.java index 2c6ec4a..97d0951 100644 --- a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/TracerFactoryTest.java +++ b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/TracerFactoryTest.java @@ -2,22 +2,26 @@ import static org.junit.jupiter.api.Assertions.*; +import java.util.Optional; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; class TracerFactoryTest { - private static final String TEST_API_URL = "https://api.test.com"; - private static final String TEST_API_KEY = "test-key"; - private static final String TEST_ORG_ID = "test-org"; + private static final String TEST_API_URL = "https://api.test.com"; + private static final String TEST_API_KEY = "test-key"; + private static final String TEST_ORG_ID = "test-org"; + private static final String TEST_PROJECT_NAME = "test-project"; + private static final String TEST_PROJECT_ID = "test-project-id"; private TracerFactory factory; @BeforeEach void setUp() { JudgmentSyncClient client = new JudgmentSyncClient(TEST_API_URL, TEST_API_KEY, TEST_ORG_ID); - factory = new TracerFactory(client); + factory = new TracerFactory(client, TEST_PROJECT_NAME, Optional.of(TEST_PROJECT_ID)); } @Test diff --git a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/TracerTest.java b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/TracerTest.java index 5a707cf..6cb55d0 100644 --- a/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/TracerTest.java +++ b/judgeval-java/src/test/java/com/judgmentlabs/judgeval/tracer/TracerTest.java @@ -2,9 +2,10 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.lenient; +import java.util.Optional; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -12,8 +13,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import com.judgmentlabs.judgeval.internal.api.JudgmentSyncClient; -import com.judgmentlabs.judgeval.internal.api.models.ResolveProjectNameRequest; -import com.judgmentlabs.judgeval.internal.api.models.ResolveProjectNameResponse; @ExtendWith(MockitoExtension.class) class TracerTest { @@ -25,11 +24,9 @@ class TracerTest { @BeforeEach void setUp() throws Exception { - ResolveProjectNameResponse response = new ResolveProjectNameResponse(); - response.setProjectId(TEST_PROJECT_ID); - - lenient().when(mockClient.projectsResolve(any(ResolveProjectNameRequest.class))) - .thenReturn(response); + lenient().when(mockClient.getApiUrl()).thenReturn("https://api.example.com"); + lenient().when(mockClient.getApiKey()).thenReturn("test-api-key"); + lenient().when(mockClient.getOrganizationId()).thenReturn("test-org-id"); } @Test @@ -44,6 +41,7 @@ void builder_withNullProjectName_throwsException() { Tracer.builder() .client(mockClient) .projectName(null) + .projectId(Optional.of(TEST_PROJECT_ID)) .build(); }); } @@ -53,6 +51,7 @@ void builder_withNullClient_throwsException() { assertThrows(NullPointerException.class, () -> { Tracer.builder() .projectName(TEST_PROJECT_NAME) + .projectId(Optional.of(TEST_PROJECT_ID)) .client(null) .build(); }); diff --git a/scripts/generate-client.sh b/scripts/generate-client.sh old mode 100755 new mode 100644 index 224e63a..37702c3 --- a/scripts/generate-client.sh +++ b/scripts/generate-client.sh @@ -1,3 +1,3 @@ #!/bin/bash -python3 scripts/generate_client.py "${1:-http://localhost:8000/openapi.json}" +python3 scripts/generate_client.py "${1:-http://localhost:10001/openapi/json}" diff --git a/scripts/generate_client.py b/scripts/generate_client.py index 682de7a..530aad8 100755 --- a/scripts/generate_client.py +++ b/scripts/generate_client.py @@ -2,32 +2,30 @@ import json import os +import re import shutil import sys from typing import Any, Dict, List, Optional, Set -import httpx -JUDGEVAL_PATHS = [ - "/log_eval_results/", - "/fetch_experiment_run/", - "/add_to_run_eval_queue/", - "/get_evaluation_status/", - "/save_scorer/", - "/fetch_scorers/", - "/scorer_exists/", - "/projects/resolve/", -] +import httpx +INCLUDE_PREFIXES = ["/v1", "/otel"] HTTP_METHODS = {"GET", "POST", "PUT", "PATCH", "DELETE"} SUCCESS_STATUS_CODES = {"200", "201"} SCHEMA_REF_PREFIX = "#/components/schemas/" +JAVA_TYPE_MAP = { + "string": "String", + "integer": "Integer", + "number": "Double", + "boolean": "Boolean", + "object": "Object", +} -def resolve_ref(ref: str) -> str: - assert ref.startswith( - SCHEMA_REF_PREFIX - ), f"Reference must start with {SCHEMA_REF_PREFIX}" - return ref.replace(SCHEMA_REF_PREFIX, "") +BASE_PACKAGE = "com.judgmentlabs.judgeval.internal.api" +MODELS_PACKAGE = f"{BASE_PACKAGE}.models" +OUTPUT_DIR = "judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api" +MODELS_DIR = f"{OUTPUT_DIR}/models" def to_camel_case(name: str) -> str: @@ -35,172 +33,309 @@ def to_camel_case(name: str) -> str: return parts[0] + "".join(word.capitalize() for word in parts[1:]) -def to_class_name(name: str) -> str: - camel_case = to_camel_case(name) - return camel_case[0].upper() + camel_case[1:] - - -def get_method_name_from_path(path: str, method: str) -> str: - clean_path = path.strip("/").replace("/", "_").replace("-", "_") - return to_camel_case(clean_path) +def to_pascal_case(name: str) -> str: + if "_" in name: + parts = name.split("_") + return "".join(part[0].upper() + part[1:] if part else "" for part in parts) + if name: + return name[0].upper() + name[1:] + return name -def get_query_parameters(operation: Dict[str, Any]) -> List[Dict[str, Any]]: - return [ - { - "name": param["name"], - "required": param.get("required", False), - "type": param.get("schema", {}).get("type", "string"), - } - for param in operation.get("parameters", []) - if param.get("in") == "query" - ] - +def to_snake_case(name: str) -> str: + name = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name) + return re.sub("([a-z0-9])([A-Z])", r"\1_\2", name).lower() -def get_schema_from_content(content: Dict[str, Any]) -> Optional[str]: - if "application/json" in content: - schema = content["application/json"].get("schema", {}) - return resolve_ref(schema["$ref"]) if "$ref" in schema else None - return None - -def get_request_schema(operation: Dict[str, Any]) -> Optional[str]: - request_body = operation.get("requestBody", {}) - return ( - get_schema_from_content(request_body.get("content", {})) - if request_body - else None +def resolve_ref(ref: str) -> str: + assert ref.startswith(SCHEMA_REF_PREFIX) + return to_pascal_case(ref.replace(SCHEMA_REF_PREFIX, "")) + + +def collect_schemas_with_id(spec: Dict[str, Any]) -> Dict[str, Dict[str, Any]]: + schemas_by_id: Dict[str, Dict[str, Any]] = {} + + def collect_from_value(value: Any) -> None: + if isinstance(value, dict): + if "$id" in value: + schema_id = value["$id"] + if schema_id not in schemas_by_id: + schemas_by_id[schema_id] = { + k: v for k, v in value.items() if k != "$id" + } + print(f" Collected schema: {schema_id}", file=sys.stderr) + if "$ref" not in value: + for v in value.values(): + collect_from_value(v) + elif isinstance(value, list): + for item in value: + collect_from_value(item) + + print("Collecting schemas with $id from OpenAPI spec...", file=sys.stderr) + collect_from_value(spec) + print( + f"Collected {len(schemas_by_id)} schemas: {sorted(schemas_by_id.keys())}", + file=sys.stderr, ) - - -def get_response_schema(operation: Dict[str, Any]) -> Optional[str]: - responses = operation.get("responses", {}) - for status_code in SUCCESS_STATUS_CODES: - if status_code in responses: - result = get_schema_from_content(responses[status_code].get("content", {})) - if result: - return result - return None + return schemas_by_id def extract_dependencies( - schema: Dict[str, Any], visited: Optional[Set[str]] = None + schema: Dict[str, Any], + schemas_by_id: Dict[str, Dict[str, Any]], + visited: Optional[Set[str]] = None, ) -> Set[str]: if visited is None: visited = set() - schema_key = json.dumps(schema, sort_keys=True) - if schema_key in visited: - return set() - - visited.add(schema_key) dependencies: Set[str] = set() if "$ref" in schema: - return {resolve_ref(schema["$ref"])} - - for key in ["anyOf", "oneOf", "allOf"]: - if key in schema: - for s in schema[key]: - dependencies.update(extract_dependencies(s, visited)) - - if "properties" in schema: - for prop_schema in schema["properties"].values(): - dependencies.update(extract_dependencies(prop_schema, visited)) - - if "items" in schema: - dependencies.update(extract_dependencies(schema["items"], visited)) + return dependencies + + schema_id = schema.get("$id") + if schema_id and schema_id in visited: + return dependencies + if schema_id: + visited.add(schema_id) + full_schema = schemas_by_id.get(schema_id, schema) + else: + full_schema = schema + + if "properties" in full_schema and isinstance(full_schema["properties"], dict): + for prop_schema in full_schema["properties"].values(): + if isinstance(prop_schema, dict): + if "$id" in prop_schema: + dependencies.add(prop_schema["$id"]) + dependencies.update( + extract_dependencies(prop_schema, schemas_by_id, visited) + ) - if "additionalProperties" in schema and isinstance( - schema["additionalProperties"], dict + if "items" in full_schema and isinstance(full_schema["items"], dict): + items = full_schema["items"] + if "$id" in items: + dependencies.add(items["$id"]) + dependencies.update(extract_dependencies(items, schemas_by_id, visited)) + + for union_key in ("anyOf", "oneOf", "allOf"): + if union_key in full_schema and isinstance(full_schema[union_key], list): + for item in full_schema[union_key]: + if isinstance(item, dict): + if "$id" in item: + dependencies.add(item["$id"]) + dependencies.update( + extract_dependencies(item, schemas_by_id, visited) + ) + + if "additionalProperties" in full_schema and isinstance( + full_schema["additionalProperties"], dict ): dependencies.update( - extract_dependencies(schema["additionalProperties"], visited) + extract_dependencies( + full_schema["additionalProperties"], schemas_by_id, visited + ) ) return dependencies -def find_used_schemas(spec: Dict[str, Any]) -> Set[str]: - used_schemas = set() - schemas = spec.get("components", {}).get("schemas", {}) - - for path in JUDGEVAL_PATHS: - if path in spec["paths"]: - for method, operation in spec["paths"][path].items(): - if method.upper() in HTTP_METHODS: - for schema in [ - get_request_schema(operation), - get_response_schema(operation), - ]: - if schema: - used_schemas.add(schema) - - changed = True - while changed: - changed = False - new_schemas = set() - - for schema_name in used_schemas: - if schema_name in schemas: - deps = extract_dependencies(schemas[schema_name]) - for dep in deps: - if dep in schemas and dep not in used_schemas: - new_schemas.add(dep) - changed = True - - used_schemas.update(new_schemas) +def find_used_schemas( + spec: Dict[str, Any], schemas_by_id: Dict[str, Dict[str, Any]] +) -> Set[str]: + used_schemas: Set[str] = set() + + for path, path_item in spec.get("paths", {}).items(): + if not any(path.startswith(prefix) for prefix in INCLUDE_PREFIXES): + continue + for method, operation in path_item.items(): + if not isinstance(operation, dict): + continue + + request_body = operation.get("requestBody", {}) + if request_body: + for content in request_body.get("content", {}).values(): + if "schema" in content: + schema = content["schema"] + if "$id" in schema: + sid = schema["$id"] + used_schemas.add(sid) + if sid in schemas_by_id: + used_schemas.update( + extract_dependencies( + schemas_by_id[sid], schemas_by_id + ) + ) + + for response in operation.get("responses", {}).values(): + if not isinstance(response, dict): + continue + for content in response.get("content", {}).values(): + if "schema" in content: + schema = content["schema"] + if "$id" in schema: + sid = schema["$id"] + used_schemas.add(sid) + if sid in schemas_by_id: + used_schemas.update( + extract_dependencies( + schemas_by_id[sid], schemas_by_id + ) + ) + else: + used_schemas.update( + extract_dependencies(schema, schemas_by_id) + ) return used_schemas -def get_java_type(schema: Dict[str, Any]) -> str: - if "$ref" in schema: - return to_class_name(resolve_ref(schema["$ref"])) +def get_java_type(schema: Any, schemas_by_id: Dict[str, Dict[str, Any]]) -> str: + if not isinstance(schema, dict): + if isinstance(schema, list) and schema: + return f"List<{get_java_type(schema[0], schemas_by_id)}>" + return "Object" - for union_key in ["anyOf", "oneOf", "allOf"]: - if union_key in schema: - union_schemas = schema[union_key] + if "$ref" in schema: + return resolve_ref(schema["$ref"]) + + if "$id" in schema: + schema_data = schemas_by_id.get(schema["$id"], schema) + if schema_data.get("type") == "array": + items = schema_data.get("items", {}) + if items: + return f"List<{get_java_type(items, schemas_by_id)}>" + return "List" + return schema["$id"] + + for union_key in ("anyOf", "oneOf", "allOf"): + if union_key in schema and isinstance(schema[union_key], list): types = set() - - for union_schema in union_schemas: - if union_schema.get("type") == "null": - types.add("null") - else: - types.add(get_java_type(union_schema)) - - non_null_types = types - {"null"} - if len(non_null_types) == 1: - return list(non_null_types)[0] - else: - print( - f"Union type with multiple non-null types: {non_null_types}", - file=sys.stderr, - ) + for item in schema[union_key]: + if isinstance(item, dict) and item.get("type") == "null": + continue + types.add(get_java_type(item, schemas_by_id)) + non_null = types - {"null"} + if len(non_null) == 1: + return list(non_null)[0] + if not non_null: return "Object" + print( + f"Union type with multiple non-null types: {non_null}", file=sys.stderr + ) + return "Object" schema_type = schema.get("type", "object") - type_mapping = { - "string": "String", - "integer": "Integer", - "number": "Double", - "boolean": "Boolean", - "object": "Object", - } if schema_type == "array": items = schema.get("items", {}) - return f"List<{get_java_type(items)}>" if items else "List" + if items: + if isinstance(items, dict): + return f"List<{get_java_type(items, schemas_by_id)}>" + elif isinstance(items, list) and items: + return f"List<{get_java_type(items[0], schemas_by_id)}>" + return "List" + + return JAVA_TYPE_MAP.get(schema_type, "Object") + + +def get_schema_name_from_id( + schema: Dict[str, Any], schemas_by_id: Dict[str, Dict[str, Any]] +) -> Optional[str]: + if "$ref" in schema: + return resolve_ref(schema["$ref"]) + if "$id" in schema: + schema_data = schemas_by_id.get(schema["$id"], schema) + if schema_data.get("type") == "array": + return get_java_type(schema_data, schemas_by_id) + return schema["$id"] + return None + + +def get_method_name_from_operation( + operation: Dict[str, Any], path: str, method: str +) -> str: + operation_id = operation.get("operationId") + if operation_id: + name = to_snake_case(operation_id) + name = re.sub(r"^(get|post|put|patch|delete)_v1_", r"\1_", name) + name = re.sub(r"_by_project_id", "", name) + name = name.replace("-", "_") + return to_camel_case(name) + + name = re.sub(r"\{[^}]+\}", "", path) + name = name.strip("/").replace("/", "_").replace("-", "_") + name = re.sub(r"_+", "_", name).strip("_") + if not name: + return "index" + if name.startswith("v1_"): + name = name[3:] + elif name == "v1": + name = "index" + return to_camel_case(name) + + +def extract_path_params(path: str) -> List[Dict[str, Any]]: + return [ + {"name": match.group(1), "required": True, "type": "String", "in": "path"} + for match in re.finditer(r"\{(\w+)\}", path) + ] + + +def get_query_parameters(operation: Dict[str, Any]) -> List[Dict[str, Any]]: + return [ + { + "name": param["name"], + "required": param.get("required", False), + "type": "String", + } + for param in operation.get("parameters", []) + if param.get("in") == "query" + ] + + +def get_request_schema( + operation: Dict[str, Any], schemas_by_id: Dict[str, Dict[str, Any]] +) -> Optional[str]: + request_body = operation.get("requestBody", {}) + if not request_body: + return None + content = request_body.get("content", {}) + if "application/json" in content: + schema = content["application/json"].get("schema", {}) + if schema: + return get_schema_name_from_id(schema, schemas_by_id) + return None - return type_mapping.get(schema_type, "Object") + +def get_response_schema( + operation: Dict[str, Any], schemas_by_id: Dict[str, Dict[str, Any]] +) -> Optional[str]: + responses = operation.get("responses", {}) + for status_code in SUCCESS_STATUS_CODES: + if status_code in responses: + response = responses[status_code] + content = response.get("content", {}) + if "application/json" in content: + schema = content["application/json"].get("schema", {}) + if schema: + return get_schema_name_from_id(schema, schemas_by_id) + elif "text/plain" in content: + schema = content["text/plain"].get("schema", {}) + if schema: + return get_schema_name_from_id(schema, schemas_by_id) + return None -def generate_model_class(className: str, schema: Dict[str, Any]) -> str: +def generate_model_class( + class_name: str, schema: Dict[str, Any], schemas_by_id: Dict[str, Dict[str, Any]] +) -> Optional[str]: + if schema.get("type") == "array": + return None + required_fields = set(schema.get("required", [])) - has_required = bool(required_fields) lines = [ - "package com.judgmentlabs.judgeval.internal.api.models;", + f"package {MODELS_PACKAGE};", "", "import com.fasterxml.jackson.annotation.JsonAnyGetter;", "import com.fasterxml.jackson.annotation.JsonAnySetter;", @@ -209,50 +344,47 @@ def generate_model_class(className: str, schema: Dict[str, Any]) -> str: "import java.util.List;", "import java.util.Map;", "import java.util.Objects;", + "", + f"public class {class_name} {{", ] - lines.extend(["", f"public class {className} {{"]) - fields = [] getters = [] setters = [] equals_parts = [] - hashCode_parts = [] + hash_parts = [] if "properties" in schema: - for field_name, property_schema in schema["properties"].items(): - java_type = get_java_type(property_schema) - camel_case_name = to_camel_case(field_name) - is_required = field_name in required_fields - - field_lines = [ - f' @JsonProperty("{field_name}")', - f" private {java_type} {camel_case_name};", - ] + for field_name, prop_schema in schema["properties"].items(): + java_type = get_java_type(prop_schema, schemas_by_id) + camel_name = to_camel_case(field_name) + pascal_name = camel_name[0].upper() + camel_name[1:] - fields.extend(field_lines) + fields.extend( + [ + f' @JsonProperty("{field_name}")', + f" private {java_type} {camel_name};", + ] + ) getters.extend( [ - f" public {java_type} get{to_class_name(camel_case_name)}() {{", - f" return {camel_case_name};", + f" public {java_type} get{pascal_name}() {{", + f" return {camel_name};", " }", ] ) - setter_param = f"{java_type} {camel_case_name}" setters.extend( [ - f" public void set{to_class_name(camel_case_name)}({setter_param}) {{", - f" this.{camel_case_name} = {camel_case_name};", + f" public void set{pascal_name}({java_type} {camel_name}) {{", + f" this.{camel_name} = {camel_name};", " }", ] ) - equals_parts.append( - f"Objects.equals({camel_case_name}, other.{camel_case_name})" - ) - hashCode_parts.append(camel_case_name) + equals_parts.append(f"Objects.equals({camel_name}, other.{camel_name})") + hash_parts.append(camel_name) if fields: lines.extend(fields) @@ -278,26 +410,29 @@ def generate_model_class(className: str, schema: Dict[str, Any]) -> str: equals_parts.append( "Objects.equals(additionalProperties, other.additionalProperties)" ) - hashCode_parts.append("Objects.hashCode(additionalProperties)") + hash_parts.append("Objects.hashCode(additionalProperties)") lines.extend(getters) lines.append("") lines.extend(setters) lines.append("") + equals_expr = " && ".join(equals_parts) if equals_parts else "true" + hash_expr = ", ".join(hash_parts) if hash_parts else "" + lines.extend( [ " @Override", " public boolean equals(Object obj) {", " if (this == obj) return true;", " if (obj == null || getClass() != obj.getClass()) return false;", - f" {className} other = ({className}) obj;", - f" return {' && '.join(equals_parts) if equals_parts else 'true'};", + f" {class_name} other = ({class_name}) obj;", + f" return {equals_expr};", " }", "", " @Override", " public int hashCode() {", - f" return Objects.hash({', '.join(hashCode_parts) if hashCode_parts else ''});", + f" return Objects.hash({hash_expr});", " }", "}", ] @@ -306,15 +441,38 @@ def generate_model_class(className: str, schema: Dict[str, Any]) -> str: return "\n".join(lines) +def generate_url_expr(path: str, path_params: List[Dict[str, Any]]) -> str: + if not path_params: + return f'"{path}"' + + parts = [] + remaining = path + for param in path_params: + placeholder = f"{{{param['name']}}}" + idx = remaining.index(placeholder) + if idx > 0: + parts.append(f'"{remaining[:idx]}"') + parts.append(to_camel_case(param["name"])) + remaining = remaining[idx + len(placeholder) :] + if remaining: + parts.append(f'"{remaining}"') + + return " + ".join(parts) + + def generate_method_signature( method_name: str, request_type: Optional[str], + path_params: List[Dict[str, Any]], query_params: List[Dict[str, Any]], response_type: str, is_async: bool, ) -> str: params = [] + for param in path_params: + params.append(f"String {to_camel_case(param['name'])}") + for param in query_params: if param["required"]: params.append(f"String {param['name']}") @@ -326,19 +484,19 @@ def generate_method_signature( if not param["required"]: params.append(f"String {param['name']}") - return_type = f"CompletableFuture<{response_type}>" if is_async else response_type - throws_clause = "" if is_async else " throws IOException, InterruptedException" - - return ( - f" public {return_type} {method_name}({', '.join(params)}){throws_clause} {{" + return_type = ( + f"CompletableFuture<{response_type}>" if is_async else response_type ) + throws = "" if is_async else " throws IOException, InterruptedException" + + return f" public {return_type} {method_name}({', '.join(params)}){throws} {{" def generate_method_body( - method_name: str, path: str, method: str, request_type: Optional[str], + path_params: List[Dict[str, Any]], query_params: List[Dict[str, Any]], response_type: str, is_async: bool, @@ -348,18 +506,17 @@ def generate_method_body( if query_params: lines.append(" Map queryParams = new HashMap<>();") for param in query_params: - param_name = param["name"] + pname = param["name"] if param["required"]: - lines.append(f' queryParams.put("{param_name}", {param_name});') + lines.append(f' queryParams.put("{pname}", {pname});') else: - param_key = param["name"] lines.append( - f' Optional.ofNullable({param_name}).ifPresent(v -> queryParams.put("{param_key}", v));' + f' Optional.ofNullable({pname}).ifPresent(v -> queryParams.put("{pname}", v));' ) - lines.append( - f' String url = buildUrl("{path}"{", queryParams" if query_params else ""});' - ) + url_expr = generate_url_expr(path, path_params) + query_arg = ", queryParams" if query_params else "" + lines.append(f" String url = buildUrl({url_expr}{query_arg});") if method in ["GET", "DELETE"]: lines.extend( @@ -373,7 +530,6 @@ def generate_method_body( ) else: payload_expr = "payload" if request_type else "new Object()" - if is_async: lines.extend( [ @@ -400,18 +556,28 @@ def generate_method_body( ] ) + lines.append( + f' Logger.debug("HTTP {method} " + url);' + ) + if is_async: lines.extend( [ " return client.sendAsync(request, HttpResponse.BodyHandlers.ofString())", - " .thenApply(this::handleResponse);", + " .thenApply(r -> {", + ' Logger.debug("HTTP " + r.statusCode() + " " + url);', + " return handleResponse(r);", + " });", ] ) else: lines.append( " HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());" ) - if response_type == "Object": + lines.append( + ' Logger.debug("HTTP " + response.statusCode() + " " + url);' + ) + if response_type == "Object" or response_type.startswith("List<"): lines.append(" return handleResponse(response);") else: lines.append( @@ -422,11 +588,12 @@ def generate_method_body( def generate_client_class( - className: str, methods: List[Dict[str, Any]], is_async: bool + class_name: str, methods: List[Dict[str, Any]], is_async: bool ) -> str: imports = [ - "package com.judgmentlabs.judgeval.internal.api;", + f"package {BASE_PACKAGE};", "", + "import com.fasterxml.jackson.annotation.JsonInclude;", "import com.fasterxml.jackson.core.type.TypeReference;", "import com.fasterxml.jackson.databind.ObjectMapper;", "import java.io.IOException;", @@ -435,10 +602,12 @@ def generate_client_class( "import java.net.http.HttpRequest;", "import java.net.http.HttpResponse;", "import java.util.HashMap;", + "import java.util.List;", "import java.util.Map;", "import java.util.Objects;", "import java.util.Optional;", - "import com.judgmentlabs.judgeval.internal.api.models.*;", + f"import {MODELS_PACKAGE}.*;", + "import com.judgmentlabs.judgeval.utils.Logger;", ] if is_async: @@ -446,21 +615,21 @@ def generate_client_class( lines = imports + [ "", - f"public class {className} {{", + f"public class {class_name} {{", " private final HttpClient client;", " private final ObjectMapper mapper;", " private final String baseUrl;", " private final String apiKey;", " private final String organizationId;", "", - f" public {className}(String baseUrl, String apiKey, String organizationId) {{", + f" public {class_name}(String baseUrl, String apiKey, String organizationId) {{", ' this.baseUrl = Objects.requireNonNull(baseUrl, "Base URL cannot be null");', ' this.apiKey = Objects.requireNonNull(apiKey, "API key cannot be null");', ' this.organizationId = Objects.requireNonNull(organizationId, "Organization ID cannot be null");', " this.client = HttpClient.newBuilder()", " .version(HttpClient.Version.HTTP_1_1)", " .build();", - " this.mapper = new ObjectMapper();", + " this.mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);", " }", "", " public String getApiUrl() {", @@ -504,32 +673,29 @@ def generate_client_class( "", ] - throws_clause = "" if is_async else " throws IOException" - lines.append( - f" private T handleResponse(HttpResponse response){throws_clause} {{" - ) - lines.append(" if (response.statusCode() >= 400) {") - lines.append( - f' throw new RuntimeException("HTTP Error: " + response.statusCode() + " - " + response.body());' - ) - lines.append(" }") - lines.append(" try {") - lines.append( - " return mapper.readValue(response.body(), new TypeReference() {});" - ) - lines.append(" } catch (Exception e) {") - lines.append( - ' throw new RuntimeException("Failed to parse response", e);' + throws = "" if is_async else " throws IOException" + lines.extend( + [ + f" private T handleResponse(HttpResponse response){throws} {{", + " if (response.statusCode() >= 400) {", + ' throw new RuntimeException("HTTP Error: " + response.statusCode() + " - " + response.body());', + " }", + " try {", + " return mapper.readValue(response.body(), new TypeReference() {});", + " } catch (Exception e) {", + ' throw new RuntimeException("Failed to parse response", e);', + " }", + " }", + "", + ] ) - lines.append(" }") - lines.append(" }") - lines.append("") for method_info in methods: lines.append( generate_method_signature( method_info["name"], method_info["request_type"], + method_info["path_params"], method_info["query_params"], method_info["response_type"], is_async, @@ -537,10 +703,10 @@ def generate_client_class( ) lines.append( generate_method_body( - method_info["name"], method_info["path"], method_info["method"], method_info["request_type"], + method_info["path_params"], method_info["query_params"], method_info["response_type"], is_async, @@ -553,101 +719,82 @@ def generate_client_class( return "\n".join(lines) -def generate_api_files(spec: Dict[str, Any]) -> None: - used_schemas = find_used_schemas(spec) - schemas = spec.get("components", {}).get("schemas", {}) - - models_dir = ( - "judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api/models" +def main(): + spec_file = ( + sys.argv[1] if len(sys.argv) > 1 else "http://localhost:10001/openapi/json" ) - if os.path.exists(models_dir): - print(f"Clearing existing models directory: {models_dir}", file=sys.stderr) - shutil.rmtree(models_dir) - - os.makedirs(models_dir, exist_ok=True) - - print("Generating model classes...", file=sys.stderr) - for schema_name in used_schemas: - if schema_name in schemas: - className = to_class_name(schema_name) - model_class = generate_model_class(className, schemas[schema_name]) - - with open(f"{models_dir}/{className}.java", "w") as f: - f.write(model_class) - - print(f"Generated model: {className}", file=sys.stderr) - - filtered_paths = { - path: spec_data - for path, spec_data in spec["paths"].items() - if path in JUDGEVAL_PATHS - } - for path in JUDGEVAL_PATHS: - if path not in spec["paths"]: - print(f"Path {path} not found in OpenAPI spec", file=sys.stderr) - - methods = [] - for path, path_data in filtered_paths.items(): + if spec_file.startswith("http"): + r = httpx.get(spec_file) + r.raise_for_status() + spec = r.json() + else: + with open(spec_file, "r") as f: + spec = json.load(f) + + schemas_by_id = collect_schemas_with_id(spec) + used_schemas = find_used_schemas(spec, schemas_by_id) + print(f"Used schemas: {sorted(used_schemas)}", file=sys.stderr) + + if os.path.exists(MODELS_DIR): + print(f"Clearing existing models directory: {MODELS_DIR}", file=sys.stderr) + shutil.rmtree(MODELS_DIR) + os.makedirs(MODELS_DIR, exist_ok=True) + + for schema_id in sorted(used_schemas): + if schema_id in schemas_by_id: + model_code = generate_model_class( + schema_id, schemas_by_id[schema_id], schemas_by_id + ) + if model_code: + with open(f"{MODELS_DIR}/{schema_id}.java", "w") as f: + f.write(model_code) + print(f"Generated model: {schema_id}", file=sys.stderr) + + methods: List[Dict[str, Any]] = [] + for path, path_data in spec.get("paths", {}).items(): + if not any(path.startswith(prefix) for prefix in INCLUDE_PREFIXES): + continue for method, operation in path_data.items(): - if method.upper() in HTTP_METHODS: - method_name = get_method_name_from_path(path, method.upper()) - request_schema = get_request_schema(operation) - response_schema = get_response_schema(operation) - query_params = get_query_parameters(operation) - - print( - f"{method_name} {request_schema} {response_schema} {query_params}", - file=sys.stderr, - ) + if not isinstance(operation, dict) or method.upper() not in HTTP_METHODS: + continue - method_info = { + method_name = get_method_name_from_operation( + operation, path, method.upper() + ) + request_schema = get_request_schema(operation, schemas_by_id) + response_schema = get_response_schema(operation, schemas_by_id) + path_params = extract_path_params(path) + query_params = get_query_parameters(operation) + + print( + f"{method_name} req={request_schema} resp={response_schema} " + f"path_params={path_params} query_params={query_params}", + file=sys.stderr, + ) + + methods.append( + { "name": method_name, "path": path, "method": method.upper(), - "request_type": ( - to_class_name(request_schema) if request_schema else None - ), + "request_type": request_schema, + "path_params": path_params, "query_params": query_params, - "response_type": ( - to_class_name(response_schema) if response_schema else "Object" - ), + "response_type": response_schema if response_schema else "Object", } - methods.append(method_info) + ) - api_dir = "judgeval-java/src/main/java/com/judgmentlabs/judgeval/internal/api" - os.makedirs(api_dir, exist_ok=True) + os.makedirs(OUTPUT_DIR, exist_ok=True) - for is_async, class_name in [ + for is_async, cls_name in [ (False, "JudgmentSyncClient"), (True, "JudgmentAsyncClient"), ]: - client_class = generate_client_class(class_name, methods, is_async) - with open(f"{api_dir}/{class_name}.java", "w") as f: - f.write(client_class) - print(f"Generated: {api_dir}/{class_name}.java", file=sys.stderr) - - -def main(): - spec_file = ( - sys.argv[1] if len(sys.argv) > 1 else "http://localhost:8000/openapi.json" - ) - - try: - if spec_file.startswith("http"): - with httpx.Client() as client: - response = client.get(spec_file) - response.raise_for_status() - spec = response.json() - else: - with open(spec_file, "r") as f: - spec = json.load(f) - - generate_api_files(spec) - - except Exception as e: - print(f"Error generating API client: {e}", file=sys.stderr) - sys.exit(1) + client_code = generate_client_class(cls_name, methods, is_async) + with open(f"{OUTPUT_DIR}/{cls_name}.java", "w") as f: + f.write(client_code) + print(f"Generated: {OUTPUT_DIR}/{cls_name}.java", file=sys.stderr) if __name__ == "__main__":