Skip to content

Commit 3a85aaf

Browse files
authored
Merge pull request #1045 from parea-ai/PAI-1455-fetch-traces-via-api
feat: fetch logs via api
2 parents e5bbcae + 47db1b4 commit 3a85aaf

File tree

5 files changed

+85
-3
lines changed

5 files changed

+85
-3
lines changed

cookbook/fetch_logs.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import os
2+
3+
from dotenv import load_dotenv
4+
5+
from parea import Parea
6+
from parea.schemas import FilterOperator, QueryParams
7+
8+
load_dotenv()
9+
10+
p = Parea(api_key=os.getenv("PAREA_API_KEY"))
11+
12+
paginated_resp = p.get_trace_logs(QueryParams(project_name="default", filter_field="trace_name", filter_operator=FilterOperator.LIKE, filter_value="llm"))
13+
print(f"Num. LLM logs fetched: {len(paginated_resp.results)} | total LLM logs: {paginated_resp.total}")

parea/client.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from parea.cache.cache import Cache
1515
from parea.constants import PAREA_OS_ENV_EXPERIMENT_UUID
1616
from parea.experiment.datasets import create_test_cases, create_test_collection
17-
from parea.helpers import gen_trace_id, serialize_metadata_values, structure_trace_log_from_api, structure_trace_logs_from_api
17+
from parea.helpers import create_paginated_trace_logs_response_from_api, gen_trace_id, serialize_metadata_values, structure_trace_log_from_api, structure_trace_logs_from_api
1818
from parea.parea_logger import parea_logger
1919
from parea.schemas import EvaluationResult
2020
from parea.schemas.models import (
@@ -30,7 +30,9 @@
3030
FeedbackRequest,
3131
FinishExperimentRequestSchema,
3232
ListExperimentUUIDsFilters,
33+
PaginatedTraceLogsResponse,
3334
ProjectSchema,
35+
QueryParams,
3436
TestCaseCollection,
3537
TraceLogFilters,
3638
TraceLogTree,
@@ -59,6 +61,7 @@
5961
GET_TRACE_LOG_ENDPOINT = "/trace_log/{trace_id}"
6062
LIST_EXPERIMENTS_ENDPOINT = "/experiments"
6163
GET_EXPERIMENT_LOGS_ENDPOINT = "/experiment/{experiment_uuid}/trace_logs"
64+
GET_TRACE_LOGS_ENDPOINT = "/get_trace_logs"
6265

6366

6467
@define
@@ -524,6 +527,14 @@ async def aget_experiment(self, experiment_uuid: str) -> Optional[ExperimentWith
524527
result = response_json[0] if isinstance(response_json, list) else None
525528
return structure(result, ExperimentWithPinnedStatsSchema)
526529

530+
def get_trace_logs(self, query_params: QueryParams) -> PaginatedTraceLogsResponse:
531+
response = self._client.request("POST", GET_TRACE_LOGS_ENDPOINT, data=asdict(query_params))
532+
return create_paginated_trace_logs_response_from_api(response.json())
533+
534+
async def aget_trace_logs(self, query_params: QueryParams) -> PaginatedTraceLogsResponse:
535+
response = await self._client.request_async("POST", GET_TRACE_LOGS_ENDPOINT, data=asdict(query_params))
536+
return create_paginated_trace_logs_response_from_api(response.json())
537+
527538

528539
def patch_openai_client_classes(openai_client, parea_client: Parea):
529540
"""Creates a subclass of the given openai_client to always wrap it with Parea at instantiation."""

parea/helpers.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from cattrs import GenConverter
1212

1313
from parea.constants import ADJECTIVES, NOUNS, TURN_OFF_PAREA_LOGGING
14-
from parea.schemas.models import Completion, TraceLog, TraceLogTree, UpdateLog
14+
from parea.schemas.models import Completion, PaginatedTraceLogsResponse, TraceLog, TraceLogTree, UpdateLog
1515
from parea.utils.universal_encoder import json_dumps
1616

1717

@@ -103,13 +103,35 @@ def structure_float_or_none(obj: Any, cl: type) -> Optional[float]:
103103
converter.register_structure_hook(Union[str, Dict[str, str], None], structure_union_type)
104104
converter.register_structure_hook(float, structure_float_or_none)
105105
converter.register_structure_hook(Optional[float], structure_float_or_none)
106+
107+
def structure_trace_log_tree(data, _):
108+
kwargs = {}
109+
for key, value in data.items():
110+
if key == "children_logs":
111+
kwargs["children_logs"] = [structure_trace_log_tree(child, TraceLogTree) for child in value]
112+
elif key in fields_dict(TraceLogTree):
113+
kwargs[key] = value
114+
return TraceLogTree(**kwargs)
115+
116+
converter.register_structure_hook(TraceLogTree, structure_trace_log_tree)
117+
106118
return converter.structure(d, TraceLogTree)
107119

108120

109121
def structure_trace_logs_from_api(data: List[dict]) -> List[TraceLogTree]:
110122
return [structure_trace_log_from_api(d) for d in data]
111123

112124

125+
def create_paginated_trace_logs_response_from_api(data: dict) -> PaginatedTraceLogsResponse:
126+
return PaginatedTraceLogsResponse(
127+
total=data["total"],
128+
page=data["page"],
129+
total_pages=data["total_pages"],
130+
page_size=data["page_size"],
131+
results=structure_trace_logs_from_api(data["results"]),
132+
)
133+
134+
113135
PAREA_LOGGING_DISABLED = False
114136

115137

parea/schemas/models.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,5 +480,41 @@ class FilterOperator(str, Enum):
480480
@define
481481
class TraceLogFilters:
482482
filter_field: Optional[str] = None
483+
filter_key: Optional[str] = None
483484
filter_operator: Optional[FilterOperator] = None
484485
filter_value: Optional[str] = None
486+
487+
488+
class TimeRange(str, Enum):
489+
NA = "na"
490+
LAST_1_HOUR = "1h"
491+
LAST_3_HOURS = "3h"
492+
LAST_6_HOURS = "6h"
493+
LAST_24_HOURS = "24h"
494+
LAST_7_DAYS = "7d"
495+
LAST_1_MONTH = "1m"
496+
LAST_3_MONTHS = "3m"
497+
LAST_6_MONTHS = "6m"
498+
LAST_12_MONTHS = "1y"
499+
500+
501+
@define
502+
class QueryParams:
503+
project_name: str
504+
filter_field: Optional[str] = None
505+
filter_key: Optional[str] = None
506+
filter_operator: Optional[FilterOperator] = None
507+
filter_value: Optional[str] = None
508+
page: int = 1
509+
page_size: int = 20
510+
time_range: TimeRange = TimeRange.NA
511+
status: Optional[str] = None
512+
513+
514+
@define
515+
class PaginatedTraceLogsResponse:
516+
total: int
517+
page: int
518+
total_pages: int
519+
page_size: int
520+
results: List[TraceLogTree]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api"
66
[tool.poetry]
77
name = "parea-ai"
88
packages = [{ include = "parea" }]
9-
version = "0.2.198"
9+
version = "0.2.199"
1010
description = "Parea python sdk"
1111
readme = "README.md"
1212
authors = ["joel-parea-ai <[email protected]>"]

0 commit comments

Comments
 (0)