diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 43bc303..619c641 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -8,32 +8,35 @@ * [Quick Start Guide](getting-started/quickstart.md) ## API Reference -* [Client Configuration](api-reference/client.md) -* [Public Client](api-reference/public-client.md) -* [Evaluations](api-reference/evaluations.md) -* [Results](api-reference/results.md) -* [Models & Benchmarks](api-reference/models-benchmarks.md) -* [Judges](api-reference/judges.md) -* [Traces](api-reference/traces.md) -* [Trace Evaluations](api-reference/trace-evaluations.md) -* [Judge Optimizations](api-reference/judge-optimizations.md) -* [Error Handling](api-reference/errors.md) +* [Overview](api-reference/README.md) + * [Client Configuration](api-reference/client.md) + * [Public Client](api-reference/public-client.md) + * [Evaluations](api-reference/evaluations.md) + * [Results](api-reference/results.md) + * [Models & Benchmarks](api-reference/models-benchmarks.md) + * [Judges](api-reference/judges.md) + * [Traces](api-reference/traces.md) + * [Trace Evaluations](api-reference/trace-evaluations.md) + * [Judge Optimizations](api-reference/judge-optimizations.md) + * [Error Handling](api-reference/errors.md) ## Code Examples -* [Creating Evaluations](examples/creating-evaluations.md) -* [Retrieving Results](examples/retrieving-results.md) -* [Models and Benchmarks](examples/models-and-benchmarks.md) -* [Judges and Traces](examples/judges-and-traces.md) -* [Public API](examples/public-api.md) +* [Overview](examples/README.md) + * [Creating Evaluations](examples/creating-evaluations.md) + * [Retrieving Results](examples/retrieving-results.md) + * [Models and Benchmarks](examples/models-and-benchmarks.md) + * [Judges and Traces](examples/judges-and-traces.md) + * [Public API](examples/public-api.md) ## Troubleshooting -* [Common Issues](troubleshooting/common-issues.md) -* [Authentication Problems](troubleshooting/authentication.md) -* [Error Codes Reference](troubleshooting/error-codes.md) +* [Overview](troubleshooting/README.md) + * [Common Issues](troubleshooting/common-issues.md) + * [Authentication Problems](troubleshooting/authentication.md) + * [Error Codes Reference](troubleshooting/error-codes.md) ## Security Best Practices -* [API Key Management](security/api-key-management.md) -* [Environment Variables](security/environment-variables.md) -* [Rate Limiting](security/rate-limiting.md) -* [Data Privacy](security/data-privacy.md) - +* [Overview](security/README.md) + * [API Key Management](security/api-key-management.md) + * [Environment Variables](security/environment-variables.md) + * [Rate Limiting](security/rate-limiting.md) + * [Data Privacy](security/data-privacy.md) diff --git a/examples/evaluation_sorting.py b/examples/evaluation_sorting.py index ff48e44..27b3c32 100644 --- a/examples/evaluation_sorting.py +++ b/examples/evaluation_sorting.py @@ -23,7 +23,7 @@ async def main(): # --- Get evaluations sorted by submission date (newest first) response = await client.evaluations.get_many( - sort_by="submittedAt", + sort_by="submitted_at", order="desc", page_size=5, ) @@ -34,7 +34,7 @@ async def main(): # --- Get evaluations sorted by average duration (fastest first) response = await client.evaluations.get_many( - sort_by="averageDuration", + sort_by="average_duration", order="asc", page_size=5, ) @@ -66,7 +66,7 @@ async def main(): # Replace with actual benchmark IDs from your organization response = await client.evaluations.get_many( benchmark_ids=["your-benchmark-id"], - sort_by="submittedAt", + sort_by="submitted_at", order="desc", ) if response: diff --git a/examples/public_evaluations.py b/examples/public_evaluations.py index 824063a..79b1294 100644 --- a/examples/public_evaluations.py +++ b/examples/public_evaluations.py @@ -34,7 +34,7 @@ def main(): response = client.evaluations.get_many( page=1, page_size=5, - sort_by="submittedAt", + sort_by="submitted_at", order="desc", ) if response: diff --git a/examples/public_models.py b/examples/public_models.py index 122ba2d..22826ae 100644 --- a/examples/public_models.py +++ b/examples/public_models.py @@ -35,7 +35,7 @@ def main(): print(f"\nFound {response.total_count} open-source models") # --- Sort by release date (newest first) - response = client.models.get(sort_by="releasedAt", order="desc", page_size=5) + response = client.models.get(sort_by="released_at", order="desc", page_size=5) print(f"\nNewest 5 models:") for model in response.models: print(f" - {model.name} (released_at={model.released_at})") diff --git a/src/layerlens/_version.py b/src/layerlens/_version.py index 1a8c01d..1f6dff1 100644 --- a/src/layerlens/_version.py +++ b/src/layerlens/_version.py @@ -1,4 +1,4 @@ -__version__ = "1.3.2" +__version__ = "1.3.3" # Will be templated during the build __git_commit__ = "__GIT_COMMIT__" diff --git a/src/layerlens/models/benchmark.py b/src/layerlens/models/benchmark.py index d10ce6c..7bca544 100644 --- a/src/layerlens/models/benchmark.py +++ b/src/layerlens/models/benchmark.py @@ -2,10 +2,12 @@ from typing import List, Optional -from pydantic import Field, BaseModel +from pydantic import Field, BaseModel, ConfigDict class Benchmark(BaseModel): + model_config = ConfigDict(extra="allow") + id: str key: str name: str @@ -32,6 +34,7 @@ def type(self) -> str: class PublicBenchmark(Benchmark): description: Optional[str] = Field(None, alias="full_description") language: Optional[str] = None + categories: Optional[List[str]] = None prompt_count: Optional[int] = None deprecated: Optional[bool] = None diff --git a/src/layerlens/models/model.py b/src/layerlens/models/model.py index e6123ae..fa9285f 100644 --- a/src/layerlens/models/model.py +++ b/src/layerlens/models/model.py @@ -2,10 +2,12 @@ from typing import Optional -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict class Model(BaseModel): + model_config = ConfigDict(extra="allow") + id: str key: str name: str diff --git a/src/layerlens/resources/benchmarks/benchmarks.py b/src/layerlens/resources/benchmarks/benchmarks.py index f8e4bf3..b4ecf69 100644 --- a/src/layerlens/resources/benchmarks/benchmarks.py +++ b/src/layerlens/resources/benchmarks/benchmarks.py @@ -40,6 +40,8 @@ def get( type: Literal["custom", "public"] | None = None, name: Optional[str] = None, key: Optional[str] = None, + categories: Optional[List[str]] = None, + languages: Optional[List[str]] = None, ) -> Optional[List[Benchmark]]: base_url = f"/organizations/{self._client.organization_id}/projects/{self._client.project_id}/benchmarks" @@ -49,6 +51,10 @@ def fetch(bench_type: str) -> BenchmarksResponse | None: params["name"] = name if key: params["key"] = key + if categories: + params["categories"] = ",".join(categories) + if languages: + params["languages"] = ",".join(languages) resp = self._get( base_url, @@ -77,6 +83,9 @@ def cast_benchmark(b: Benchmark, bench_type: str) -> Benchmark: if resp: benchmarks.extend([cast_benchmark(b, type) for b in resp.data.benchmarks]) + if name: + benchmarks = [b for b in benchmarks if name.lower() in b.name.lower()] + return benchmarks def get_by_id(self, id: str, *, timeout: float | httpx.Timeout | None = DEFAULT_TIMEOUT) -> Optional[Benchmark]: @@ -304,6 +313,8 @@ async def get( type: Literal["custom", "public"] | None = None, name: Optional[str] = None, key: Optional[str] = None, + categories: Optional[List[str]] = None, + languages: Optional[List[str]] = None, ) -> Optional[List[Benchmark]]: base_url = f"/organizations/{self._client.organization_id}/projects/{self._client.project_id}/benchmarks" @@ -313,6 +324,10 @@ async def fetch(bench_type: str) -> Optional[BenchmarksResponse]: params["name"] = name if key: params["key"] = key + if categories: + params["categories"] = ",".join(categories) + if languages: + params["languages"] = ",".join(languages) resp = await self._get( base_url, @@ -341,6 +356,9 @@ def cast_benchmark(b: Benchmark, bench_type: str) -> Benchmark: if resp: benchmarks.extend([cast_benchmark(b, type) for b in resp.data.benchmarks]) + if name: + benchmarks = [b for b in benchmarks if name.lower() in b.name.lower()] + return benchmarks async def get_by_id( diff --git a/src/layerlens/resources/comparisons/comparisons.py b/src/layerlens/resources/comparisons/comparisons.py index ed4851c..c05a752 100644 --- a/src/layerlens/resources/comparisons/comparisons.py +++ b/src/layerlens/resources/comparisons/comparisons.py @@ -37,9 +37,9 @@ def compare( if page is not None: params["page"] = str(page) if page_size is not None: - params["pageSize"] = str(page_size) + params["page_size"] = str(page_size) if outcome_filter: - params["outcomeFilter"] = outcome_filter + params["outcome_filter"] = outcome_filter if search: params["search"] = search @@ -79,7 +79,7 @@ def compare_models( model_ids=[model_id_1], benchmark_ids=[benchmark_id], status=EvaluationStatus.SUCCESS, - sort_by="submittedAt", + sort_by="submitted_at", order="desc", page_size=1, timeout=timeout, @@ -90,7 +90,7 @@ def compare_models( model_ids=[model_id_2], benchmark_ids=[benchmark_id], status=EvaluationStatus.SUCCESS, - sort_by="submittedAt", + sort_by="submitted_at", order="desc", page_size=1, timeout=timeout, @@ -127,9 +127,9 @@ async def compare( if page is not None: params["page"] = str(page) if page_size is not None: - params["pageSize"] = str(page_size) + params["page_size"] = str(page_size) if outcome_filter: - params["outcomeFilter"] = outcome_filter + params["outcome_filter"] = outcome_filter if search: params["search"] = search @@ -169,7 +169,7 @@ async def compare_models( model_ids=[model_id_1], benchmark_ids=[benchmark_id], status=EvaluationStatus.SUCCESS, - sort_by="submittedAt", + sort_by="submitted_at", order="desc", page_size=1, timeout=timeout, @@ -180,7 +180,7 @@ async def compare_models( model_ids=[model_id_2], benchmark_ids=[benchmark_id], status=EvaluationStatus.SUCCESS, - sort_by="submittedAt", + sort_by="submitted_at", order="desc", page_size=1, timeout=timeout, diff --git a/src/layerlens/resources/evaluations/evaluations.py b/src/layerlens/resources/evaluations/evaluations.py index c5cc040..0fb1e34 100644 --- a/src/layerlens/resources/evaluations/evaluations.py +++ b/src/layerlens/resources/evaluations/evaluations.py @@ -81,7 +81,7 @@ def get_many( *, page: Optional[int] = None, page_size: Optional[int] = None, - sort_by: Optional[Literal["submittedAt", "accuracy", "averageDuration"]] = None, + sort_by: Optional[Literal["submitted_at", "accuracy", "average_duration"]] = None, order: Optional[Literal["asc", "desc"]] = None, model_ids: Optional[List[str]] = None, benchmark_ids: Optional[List[str]] = None, @@ -94,7 +94,7 @@ def get_many( Args: page: Page number for pagination (1-based, defaults to 1 if not provided) page_size: Number of evaluations per page (default: 100, optional) - sort_by: Sort evaluations by field (submittedAt, accuracy, averageDuration) + sort_by: Sort evaluations by field (submitted_at, accuracy, average_duration) order: Sort order (asc or desc) model_ids: Filter by model IDs benchmark_ids: Filter by benchmark/dataset IDs @@ -105,18 +105,18 @@ def get_many( EvaluationsResponse object or None """ params = { - "organizationID": self._client.organization_id, - "projectID": self._client.project_id, + "organization_id": self._client.organization_id, + "project_id": self._client.project_id, } effective_page_size = min(max(page_size, 1), MAX_PAGE_SIZE) if page_size is not None else DEFAULT_PAGE_SIZE effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if order: params["order"] = order if model_ids: @@ -154,7 +154,7 @@ def get_many( try: return EvaluationsResponse.model_validate(resp_with_pagination) - except Exception: + except (ValueError, KeyError): return None def wait_for_completion( @@ -236,7 +236,7 @@ async def get_many( *, page: Optional[int] = None, page_size: Optional[int] = None, - sort_by: Optional[Literal["submittedAt", "accuracy", "averageDuration"]] = None, + sort_by: Optional[Literal["submitted_at", "accuracy", "average_duration"]] = None, order: Optional[Literal["asc", "desc"]] = None, model_ids: Optional[List[str]] = None, benchmark_ids: Optional[List[str]] = None, @@ -249,7 +249,7 @@ async def get_many( Args: page: Page number for pagination (1-based, defaults to 1 if not provided) page_size: Number of evaluations per page (default: 100, optional) - sort_by: Sort evaluations by field (submittedAt, accuracy, averageDuration) + sort_by: Sort evaluations by field (submitted_at, accuracy, average_duration) order: Sort order (asc or desc) model_ids: Filter by model IDs benchmark_ids: Filter by benchmark/dataset IDs @@ -260,18 +260,18 @@ async def get_many( EvaluationsResponse object or None """ params = { - "organizationID": self._client.organization_id, - "projectID": self._client.project_id, + "organization_id": self._client.organization_id, + "project_id": self._client.project_id, } effective_page_size = min(max(page_size, 1), MAX_PAGE_SIZE) if page_size is not None else DEFAULT_PAGE_SIZE effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if order: params["order"] = order if model_ids: @@ -309,7 +309,7 @@ async def get_many( try: return EvaluationsResponse.model_validate(resp_with_pagination) - except Exception: + except (ValueError, KeyError): return None async def wait_for_completion( diff --git a/src/layerlens/resources/judges/judges.py b/src/layerlens/resources/judges/judges.py index 3954204..fc8a0d2 100644 --- a/src/layerlens/resources/judges/judges.py +++ b/src/layerlens/resources/judges/judges.py @@ -82,7 +82,7 @@ def get_many( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) resp = self._get( self._base_url(), @@ -221,7 +221,7 @@ async def get_many( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) resp = await self._get( self._base_url(), diff --git a/src/layerlens/resources/models/models.py b/src/layerlens/resources/models/models.py index 122a3ae..7a25377 100644 --- a/src/layerlens/resources/models/models.py +++ b/src/layerlens/resources/models/models.py @@ -17,6 +17,7 @@ def get( type: Literal["custom", "public"] | None = None, name: Optional[str] = None, key: Optional[str] = None, + categories: Optional[List[str]] = None, companies: Optional[List[str]] = None, regions: Optional[List[str]] = None, licenses: Optional[List[str]] = None, @@ -29,6 +30,8 @@ def fetch(model_type: str) -> ModelsResponse | None: params["name"] = name if key: params["key"] = key + if categories: + params["categories"] = ",".join(categories) if companies: params["companies"] = ",".join(companies) if regions: @@ -63,6 +66,9 @@ def cast_model(m: Model, model_type: str) -> Model: if resp: models.extend([cast_model(m, type) for m in resp.data.models]) + if name: + models = [m for m in models if name.lower() in m.name.lower()] + return models def get_by_id(self, id: str, *, timeout: float | httpx.Timeout | None = DEFAULT_TIMEOUT) -> Optional[Model]: @@ -197,6 +203,7 @@ async def get( type: Literal["custom", "public"] | None = None, name: Optional[str] = None, key: Optional[str] = None, + categories: Optional[List[str]] = None, companies: Optional[List[str]] = None, regions: Optional[List[str]] = None, licenses: Optional[List[str]] = None, @@ -209,6 +216,8 @@ async def fetch(model_type: str) -> ModelsResponse | None: params["name"] = name if key: params["key"] = key + if categories: + params["categories"] = ",".join(categories) if companies: params["companies"] = ",".join(companies) if regions: @@ -243,6 +252,9 @@ def cast_model(m: Model, model_type: str) -> Model: if resp: models.extend([cast_model(m, type) for m in resp.data.models]) + if name: + models = [m for m in models if name.lower() in m.name.lower()] + return models async def get_by_id(self, id: str, *, timeout: float | httpx.Timeout | None = DEFAULT_TIMEOUT) -> Optional[Model]: diff --git a/src/layerlens/resources/public_benchmarks/public_benchmarks.py b/src/layerlens/resources/public_benchmarks/public_benchmarks.py index 148de05..367d606 100644 --- a/src/layerlens/resources/public_benchmarks/public_benchmarks.py +++ b/src/layerlens/resources/public_benchmarks/public_benchmarks.py @@ -55,10 +55,10 @@ def get( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if order: params["order"] = order if include_deprecated is not None: @@ -92,15 +92,15 @@ def get_prompts( if page is not None: params["page"] = str(page) if page_size is not None: - params["pageSize"] = str(page_size) + params["page_size"] = str(page_size) if search_field: params["search"] = search_field if search_value: - params["searchValue"] = search_value + params["search_value"] = search_value if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if sort_order: - params["sortOrder"] = sort_order + params["sort_order"] = sort_order resp = self._get( f"/datasets/{benchmark_id}/prompts", @@ -180,10 +180,10 @@ async def get( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if order: params["order"] = order if include_deprecated is not None: @@ -217,15 +217,15 @@ async def get_prompts( if page is not None: params["page"] = str(page) if page_size is not None: - params["pageSize"] = str(page_size) + params["page_size"] = str(page_size) if search_field: params["search"] = search_field if search_value: - params["searchValue"] = search_value + params["search_value"] = search_value if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if sort_order: - params["sortOrder"] = sort_order + params["sort_order"] = sort_order resp = await self._get( f"/datasets/{benchmark_id}/prompts", diff --git a/src/layerlens/resources/public_evaluations/public_evaluations.py b/src/layerlens/resources/public_evaluations/public_evaluations.py index 71f736d..86880ab 100644 --- a/src/layerlens/resources/public_evaluations/public_evaluations.py +++ b/src/layerlens/resources/public_evaluations/public_evaluations.py @@ -39,7 +39,7 @@ def get_many( *, page: Optional[int] = None, page_size: Optional[int] = None, - sort_by: Optional[Literal["submittedAt", "accuracy", "averageDuration"]] = None, + sort_by: Optional[Literal["submitted_at", "accuracy", "average_duration"]] = None, order: Optional[Literal["asc", "desc"]] = None, model_ids: Optional[List[str]] = None, benchmark_ids: Optional[List[str]] = None, @@ -52,7 +52,7 @@ def get_many( Args: page: Page number for pagination (1-based, defaults to 1 if not provided) page_size: Number of evaluations per page (default: 100, optional) - sort_by: Sort evaluations by field (submittedAt, accuracy, averageDuration) + sort_by: Sort evaluations by field (submitted_at, accuracy, average_duration) order: Sort order (asc or desc) model_ids: Filter by model IDs benchmark_ids: Filter by benchmark/dataset IDs @@ -68,10 +68,10 @@ def get_many( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if order: params["order"] = order if model_ids: @@ -107,7 +107,7 @@ def get_many( try: return EvaluationsResponse.model_validate(resp_with_pagination) - except Exception: + except (ValueError, KeyError): return None @@ -132,7 +132,7 @@ async def get_many( *, page: Optional[int] = None, page_size: Optional[int] = None, - sort_by: Optional[Literal["submittedAt", "accuracy", "averageDuration"]] = None, + sort_by: Optional[Literal["submitted_at", "accuracy", "average_duration"]] = None, order: Optional[Literal["asc", "desc"]] = None, model_ids: Optional[List[str]] = None, benchmark_ids: Optional[List[str]] = None, @@ -145,7 +145,7 @@ async def get_many( Args: page: Page number for pagination (1-based, defaults to 1 if not provided) page_size: Number of evaluations per page (default: 100, optional) - sort_by: Sort evaluations by field (submittedAt, accuracy, averageDuration) + sort_by: Sort evaluations by field (submitted_at, accuracy, average_duration) order: Sort order (asc or desc) model_ids: Filter by model IDs benchmark_ids: Filter by benchmark/dataset IDs @@ -161,10 +161,10 @@ async def get_many( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if order: params["order"] = order if model_ids: @@ -200,5 +200,5 @@ async def get_many( try: return EvaluationsResponse.model_validate(resp_with_pagination) - except Exception: + except (ValueError, KeyError): return None diff --git a/src/layerlens/resources/public_models/public_models.py b/src/layerlens/resources/public_models/public_models.py index d092c3f..431b22d 100644 --- a/src/layerlens/resources/public_models/public_models.py +++ b/src/layerlens/resources/public_models/public_models.py @@ -27,7 +27,7 @@ def get( licenses: Optional[List[str]] = None, sizes: Optional[List[str]] = None, sort_by: Optional[ - Literal["name", "createdAt", "releasedAt", "architectureType", "contextLength", "license", "region"] + Literal["name", "created_at", "released_at", "architecture_type", "context_length", "license", "region"] ] = None, order: Optional[Literal["asc", "desc"]] = None, page: Optional[int] = None, @@ -58,10 +58,10 @@ def get( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if order: params["order"] = order if include_deprecated is not None: @@ -94,7 +94,7 @@ async def get( licenses: Optional[List[str]] = None, sizes: Optional[List[str]] = None, sort_by: Optional[ - Literal["name", "createdAt", "releasedAt", "architectureType", "contextLength", "license", "region"] + Literal["name", "created_at", "released_at", "architecture_type", "context_length", "license", "region"] ] = None, order: Optional[Literal["asc", "desc"]] = None, page: Optional[int] = None, @@ -125,10 +125,10 @@ async def get( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if sort_by: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if order: params["order"] = order if include_deprecated is not None: diff --git a/src/layerlens/resources/results/results.py b/src/layerlens/resources/results/results.py index 7d8e87b..4c560cd 100644 --- a/src/layerlens/resources/results/results.py +++ b/src/layerlens/resources/results/results.py @@ -73,7 +73,7 @@ def get_by_id( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) # Get the response with cast_to to get parsed data resp = self._get( @@ -225,7 +225,7 @@ async def get_by_id( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) # Get the response with cast_to to get parsed data resp = await self._get( diff --git a/src/layerlens/resources/trace_evaluations/trace_evaluations.py b/src/layerlens/resources/trace_evaluations/trace_evaluations.py index 21fd2d2..702b20e 100644 --- a/src/layerlens/resources/trace_evaluations/trace_evaluations.py +++ b/src/layerlens/resources/trace_evaluations/trace_evaluations.py @@ -92,19 +92,19 @@ def get_many( params["page_size"] = str(effective_page_size) if judge_id is not None: - params["judgeId"] = judge_id + params["judge_id"] = judge_id if trace_id is not None: - params["traceId"] = trace_id + params["trace_id"] = trace_id if outcome is not None: params["outcome"] = outcome if time_range is not None: - params["timeRange"] = time_range + params["time_range"] = time_range if search is not None: params["search"] = search if sort_by is not None: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if sort_order is not None: - params["sortOrder"] = sort_order + params["sort_order"] = sort_order resp = self._get( self._base_url(), @@ -239,19 +239,19 @@ async def get_many( params["page_size"] = str(effective_page_size) if judge_id is not None: - params["judgeId"] = judge_id + params["judge_id"] = judge_id if trace_id is not None: - params["traceId"] = trace_id + params["trace_id"] = trace_id if outcome is not None: params["outcome"] = outcome if time_range is not None: - params["timeRange"] = time_range + params["time_range"] = time_range if search is not None: params["search"] = search if sort_by is not None: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if sort_order is not None: - params["sortOrder"] = sort_order + params["sort_order"] = sort_order resp = await self._get( self._base_url(), diff --git a/src/layerlens/resources/traces/traces.py b/src/layerlens/resources/traces/traces.py index 5e5012c..c90aee2 100644 --- a/src/layerlens/resources/traces/traces.py +++ b/src/layerlens/resources/traces/traces.py @@ -133,22 +133,22 @@ def get_many( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if source is not None: params["source"] = source if judge_id is not None: - params["judgeId"] = judge_id + params["judge_id"] = judge_id if status is not None: params["status"] = status if time_range is not None: - params["timeRange"] = time_range + params["time_range"] = time_range if search is not None: params["search"] = search if sort_by is not None: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if sort_order is not None: - params["sortOrder"] = sort_order + params["sort_order"] = sort_order resp = self._get( self._base_url(), @@ -307,22 +307,22 @@ async def get_many( effective_page = page if page is not None else DEFAULT_PAGE params["page"] = str(effective_page) - params["pageSize"] = str(effective_page_size) + params["page_size"] = str(effective_page_size) if source is not None: params["source"] = source if judge_id is not None: - params["judgeId"] = judge_id + params["judge_id"] = judge_id if status is not None: params["status"] = status if time_range is not None: - params["timeRange"] = time_range + params["time_range"] = time_range if search is not None: params["search"] = search if sort_by is not None: - params["sortBy"] = sort_by + params["sort_by"] = sort_by if sort_order is not None: - params["sortOrder"] = sort_order + params["sort_order"] = sort_order resp = await self._get( self._base_url(), diff --git a/tests/resources/test_comparisons.py b/tests/resources/test_comparisons.py index 85dfa2f..0773b35 100644 --- a/tests/resources/test_comparisons.py +++ b/tests/resources/test_comparisons.py @@ -85,7 +85,7 @@ def test_compare_models_success(self, comparisons, mock_public_client): assert calls[0].kwargs["model_ids"] == ["model-a"] assert calls[0].kwargs["benchmark_ids"] == ["bench-1"] assert calls[0].kwargs["status"] == EvaluationStatus.SUCCESS - assert calls[0].kwargs["sort_by"] == "submittedAt" + assert calls[0].kwargs["sort_by"] == "submitted_at" assert calls[0].kwargs["order"] == "desc" assert calls[0].kwargs["page_size"] == 1 @@ -166,8 +166,8 @@ def test_compare_models_passes_through_params(self, comparisons, mock_public_cli compare_call = comparisons._get.call_args params = compare_call.kwargs.get("params") or compare_call[1].get("params") assert params["page"] == "2" - assert params["pageSize"] == "50" - assert params["outcomeFilter"] == "both_succeed" + assert params["page_size"] == "50" + assert params["outcome_filter"] == "both_succeed" assert params["search"] == "test query" def test_compare_models_picks_most_recent(self, comparisons, mock_public_client): @@ -195,7 +195,7 @@ def test_compare_models_picks_most_recent(self, comparisons, mock_public_client) ) for call in mock_public_client.evaluations.get_many.call_args_list: - assert call.kwargs["sort_by"] == "submittedAt" + assert call.kwargs["sort_by"] == "submitted_at" assert call.kwargs["order"] == "desc" assert call.kwargs["page_size"] == 1 assert call.kwargs["status"] == EvaluationStatus.SUCCESS diff --git a/tests/resources/test_evaluations.py b/tests/resources/test_evaluations.py index 8a337eb..518000f 100644 --- a/tests/resources/test_evaluations.py +++ b/tests/resources/test_evaluations.py @@ -311,10 +311,10 @@ def test_get_all_returns_evaluations(self, evaluations_resource, mock_client, sa evaluations_resource._get.assert_called_once_with( "/evaluations", params={ - "organizationID": mock_client.organization_id, - "projectID": mock_client.project_id, + "organization_id": mock_client.organization_id, + "project_id": mock_client.project_id, "page": "1", - "pageSize": "100", + "page_size": "100", }, timeout=DEFAULT_TIMEOUT, cast_to=dict, @@ -804,14 +804,14 @@ def test_get_many_with_filters(self, public_evaluations, sample_evaluation_data) call_args = public_evaluations._get.call_args params = call_args.kwargs.get("params") or call_args[1].get("params") assert params["page"] == "2" - assert params["pageSize"] == "50" - assert params["sortBy"] == "accuracy" + assert params["page_size"] == "50" + assert params["sort_by"] == "accuracy" assert params["order"] == "desc" assert params["models"] == "m1,m2" assert params["datasets"] == "b1" assert params["status"] == "success" - assert "organizationID" not in params - assert "projectID" not in params + assert "organization_id" not in params + assert "project_id" not in params def test_get_many_pagination(self, public_evaluations, sample_evaluation_data): """get_many computes pagination correctly.""" diff --git a/tests/resources/test_judges.py b/tests/resources/test_judges.py index 91bb217..0a8d566 100644 --- a/tests/resources/test_judges.py +++ b/tests/resources/test_judges.py @@ -177,7 +177,7 @@ def test_get_many_judges_request_parameters(self, judges_resource, sample_judge_ "/organizations/org-123/projects/proj-456/judges", params={ "page": "2", - "pageSize": "50", + "page_size": "50", }, timeout=DEFAULT_TIMEOUT, cast_to=dict, @@ -196,7 +196,7 @@ def test_get_many_judges_default_pagination(self, judges_resource, sample_judge_ call_args = judges_resource._get.call_args params = call_args.kwargs["params"] assert params["page"] == "1" - assert params["pageSize"] == "100" + assert params["page_size"] == "100" def test_get_many_judges_none_response(self, judges_resource): """get_many returns None when response is invalid.""" diff --git a/tests/resources/test_results.py b/tests/resources/test_results.py index c825c12..a5083c4 100644 --- a/tests/resources/test_results.py +++ b/tests/resources/test_results.py @@ -87,7 +87,7 @@ def test_get_results_request_parameters(self, results_resource, mock_results_res results_resource._get.assert_called_once_with( "/results", - params={"evaluation_id": "eval-456", "page": "1", "pageSize": "100"}, + params={"evaluation_id": "eval-456", "page": "1", "page_size": "100"}, timeout=DEFAULT_TIMEOUT, cast_to=dict, ) @@ -583,7 +583,7 @@ def test_get_results_with_pagination_parameters(self, results_resource, sample_r params={ "evaluation_id": "eval-paginated", "page": "2", - "pageSize": "50", + "page_size": "50", }, timeout=DEFAULT_TIMEOUT, cast_to=dict, @@ -618,9 +618,9 @@ def test_get_results_pagination_parameter_conversion(self, results_resource, sam # Verify parameters are converted to strings assert params["page"] == "3" - assert params["pageSize"] == "25" + assert params["page_size"] == "25" assert isinstance(params["page"], str) - assert isinstance(params["pageSize"], str) + assert isinstance(params["page_size"], str) def test_get_results_default_page_parameter(self, results_resource, sample_result_data): """get method defaults to page 1 when no page is specified.""" @@ -642,7 +642,7 @@ def test_get_results_default_page_parameter(self, results_resource, sample_resul call_args = results_resource._get.call_args params = call_args.kwargs["params"] assert params["page"] == "1" - assert params["pageSize"] == "100" # pageSize is now always included with default value + assert params["page_size"] == "100" # pageSize is now always included with default value def test_get_results_pagination_metadata_calculation(self, results_resource, sample_result_data): """get method correctly calculates pagination metadata.""" @@ -854,7 +854,7 @@ def test_get_results_negative_page_values(self, results_resource): call_args = results_resource._get.call_args params = call_args.kwargs["params"] assert params["page"] == "-1" - assert params["pageSize"] == "1" # negative page_size should be corrected to 1 + assert params["page_size"] == "1" # negative page_size should be corrected to 1 assert isinstance(result, ResultsResponse) assert result.pagination.page_size == 1 # negative page_size should be corrected to 1 diff --git a/tests/resources/test_trace_evaluations.py b/tests/resources/test_trace_evaluations.py index c18ee09..a445bc1 100644 --- a/tests/resources/test_trace_evaluations.py +++ b/tests/resources/test_trace_evaluations.py @@ -199,13 +199,13 @@ def test_get_many_with_filters(self, trace_evals_resource, sample_trace_eval_dat params = call_args.kwargs["params"] assert params["page"] == "2" assert params["page_size"] == "10" - assert params["judgeId"] == "judge-789" - assert params["traceId"] == "trace-456" + assert params["judge_id"] == "judge-789" + assert params["trace_id"] == "trace-456" assert params["outcome"] == "pass" - assert params["timeRange"] == "7d" + assert params["time_range"] == "7d" assert params["search"] == "quality" - assert params["sortBy"] == "created_at" - assert params["sortOrder"] == "desc" + assert params["sort_by"] == "created_at" + assert params["sort_order"] == "desc" def test_get_many_default_pagination(self, trace_evals_resource): """get_many uses default pagination.""" diff --git a/tests/resources/test_traces.py b/tests/resources/test_traces.py index 864f5ce..021c56d 100644 --- a/tests/resources/test_traces.py +++ b/tests/resources/test_traces.py @@ -137,14 +137,14 @@ def test_get_many_traces_with_filters(self, traces_resource, sample_trace_with_e call_args = traces_resource._get.call_args params = call_args.kwargs["params"] assert params["page"] == "2" - assert params["pageSize"] == "50" + assert params["page_size"] == "50" assert params["source"] == "test-file.json" - assert params["judgeId"] == "judge-1" + assert params["judge_id"] == "judge-1" assert params["status"] == "pass" - assert params["timeRange"] == "7d" + assert params["time_range"] == "7d" assert params["search"] == "hello" - assert params["sortBy"] == "created_at" - assert params["sortOrder"] == "desc" + assert params["sort_by"] == "created_at" + assert params["sort_order"] == "desc" def test_get_many_traces_default_pagination(self, traces_resource): """get_many uses default pagination.""" @@ -159,7 +159,7 @@ def test_get_many_traces_default_pagination(self, traces_resource): call_args = traces_resource._get.call_args params = call_args.kwargs["params"] assert params["page"] == "1" - assert params["pageSize"] == "100" + assert params["page_size"] == "100" def test_get_many_traces_none_response(self, traces_resource): """get_many returns None when response is invalid."""