Skip to content

Commit c217ea7

Browse files
authored
Merge pull request #1003 from parea-ai/refetch-project-uuid
refetch project uuid if missing
2 parents bbca12c + defb0e1 commit c217ea7

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

parea/client.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,23 +71,34 @@ class Parea:
7171

7272
def __attrs_post_init__(self):
7373
self._client.set_api_key(self.api_key)
74+
parea_logger.set_client(self._client)
7475

7576
if self.api_key:
7677
try:
7778
project_api_response: CreateGetProjectResponseSchema = self._create_or_get_project(self.project_name)
7879
if project_api_response.was_created:
7980
print(f"Created project {project_api_response.name}")
8081
self._project = structure(asdict(project_api_response), ProjectSchema)
81-
parea_logger.set_project_uuid(self.project_uuid)
82+
parea_logger.set_project_uuid(self._project.uuid, self.project_name)
8283
except httpx.HTTPStatusError as e:
8384
if e.response.status_code == 502:
8485
logger.error("Error creating Parea project please try again")
8586
else:
8687
raise
87-
parea_logger.set_client(self._client)
8888
else:
8989
logger.warning("No API key found. Parea client will not be able to send data to the Parea API.")
9090

91+
def _get_project_uuid(self) -> Optional[str]:
92+
if not (self._project and self._project.uuid):
93+
project_api_response: CreateGetProjectResponseSchema = self._create_or_get_project(self.project_name or "default")
94+
self._project = structure(asdict(project_api_response), ProjectSchema)
95+
parea_logger.set_project_uuid(self._project.uuid, self.project_name)
96+
try:
97+
return self._project.uuid
98+
except Exception as e:
99+
logger.error(f"Parea: Error getting project uuid for project {self.project_name}: {e}")
100+
return None
101+
91102
def wrap_openai_client(self, client: "OpenAI", integration: Optional[str] = None) -> None:
92103
"""Only necessary for instance client with OpenAI version >= 1.0.0"""
93104
from parea.wrapper import OpenAIWrapper
@@ -156,12 +167,12 @@ def integrate_with_sglang(self):
156167

157168
def _add_project_uuid_to_data(self, data) -> dict:
158169
data_dict = asdict(data)
159-
data_dict["project_uuid"] = self._project.uuid
170+
data_dict["project_uuid"] = self.project_uuid
160171
return data_dict
161172

162173
@property
163174
def project_uuid(self) -> str:
164-
return self._project.uuid
175+
return self._get_project_uuid()
165176

166177
def completion(self, data: Completion) -> CompletionResponse:
167178
data = self._update_data_and_trace(data)
@@ -431,7 +442,7 @@ def _update_data_and_trace(self, data: Completion) -> Completion:
431442
data = serialize_metadata_values(data)
432443
inference_id = gen_trace_id()
433444
data.inference_id = inference_id
434-
data.project_uuid = self._project.uuid
445+
data.project_uuid = self.project_uuid
435446

436447
try:
437448
parent_trace_id = get_current_trace_id()

parea/parea_logger.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
from typing import Any, Dict
1+
from typing import Any, Dict, Optional
22

33
import json
4+
import logging
45
import os
56

67
from attrs import asdict, define, field
8+
from cattrs import structure
79

810
from parea.api_client import HTTPClient
911
from parea.constants import PAREA_OS_ENV_EXPERIMENT_UUID
1012
from parea.helpers import serialize_metadata_values
1113
from parea.schemas.log import TraceIntegrations
12-
from parea.schemas.models import TraceLog, UpdateLog
14+
from parea.schemas.models import CreateGetProjectResponseSchema, TraceLog, UpdateLog
1315
from parea.utils.universal_encoder import json_dumps
1416

17+
logger = logging.getLogger()
18+
1519
LOG_ENDPOINT = "/trace_log"
1620
VENDOR_LOG_ENDPOINT = "/trace_log/{vendor}"
1721

@@ -20,12 +24,31 @@
2024
class PareaLogger:
2125
_client: HTTPClient = field(init=False, default=None)
2226
_project_uuid: str = field(init=False, default=None)
27+
_project_name: str = field(init=False, default=None)
2328

2429
def set_client(self, client: HTTPClient) -> None:
2530
self._client = client
2631

27-
def set_project_uuid(self, project_uuid: str) -> None:
32+
def set_project_uuid(self, project_uuid: str, project_name: str) -> None:
2833
self._project_uuid = project_uuid
34+
self._project_name = project_name
35+
36+
def _get_project_uuid(self) -> Optional[str]:
37+
if not self._project_uuid:
38+
self._project_uuid = self._create_or_get_project(self._project_name or "default").uuid
39+
try:
40+
return self._project_uuid
41+
except Exception as e:
42+
logger.error(f"PareaLogger: Error getting project uuid for project {self._project_name}: {e}")
43+
return None
44+
45+
def _create_or_get_project(self, name: str) -> CreateGetProjectResponseSchema:
46+
r = self._client.request(
47+
"POST",
48+
"/project",
49+
data={"name": name},
50+
)
51+
return structure(r.json(), CreateGetProjectResponseSchema)
2952

3053
def update_log(self, data: UpdateLog) -> None:
3154
data = serialize_metadata_values(data)
@@ -37,7 +60,7 @@ def update_log(self, data: UpdateLog) -> None:
3760

3861
def record_log(self, data: TraceLog) -> None:
3962
data = serialize_metadata_values(data)
40-
data.project_uuid = self._project_uuid
63+
data.project_uuid = self._get_project_uuid()
4164
self._client.request(
4265
"POST",
4366
LOG_ENDPOINT,
@@ -60,7 +83,7 @@ def default_log(self, data: TraceLog) -> None:
6083
self.record_log(data)
6184

6285
def record_vendor_log(self, data: Dict[str, Any], vendor: TraceIntegrations) -> None:
63-
data["project_uuid"] = self._project_uuid
86+
data["project_uuid"] = self._get_project_uuid()
6487
if experiment_uuid := os.getenv(PAREA_OS_ENV_EXPERIMENT_UUID, None):
6588
data["experiment_uuid"] = experiment_uuid
6689
self._client.add_integration("langchain")
@@ -71,7 +94,7 @@ def record_vendor_log(self, data: Dict[str, Any], vendor: TraceIntegrations) ->
7194
)
7295

7396
async def arecord_vendor_log(self, data: Dict[str, Any], vendor: TraceIntegrations) -> None:
74-
data["project_uuid"] = self._project_uuid
97+
data["project_uuid"] = self._get_project_uuid()
7598
if experiment_uuid := os.getenv(PAREA_OS_ENV_EXPERIMENT_UUID, None):
7699
data["experiment_uuid"] = experiment_uuid
77100
self._client.add_integration("langchain")

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.187"
9+
version = "0.2.188"
1010
description = "Parea python sdk"
1111
readme = "README.md"
1212
authors = ["joel-parea-ai <[email protected]>"]

0 commit comments

Comments
 (0)