Skip to content

Commit 500626b

Browse files
committed
refetch project uuid if missing
1 parent bbca12c commit 500626b

File tree

3 files changed

+34
-11
lines changed

3 files changed

+34
-11
lines changed

parea/client.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,23 +71,30 @@ 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) -> 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+
return self._project.uuid
97+
9198
def wrap_openai_client(self, client: "OpenAI", integration: Optional[str] = None) -> None:
9299
"""Only necessary for instance client with OpenAI version >= 1.0.0"""
93100
from parea.wrapper import OpenAIWrapper
@@ -156,12 +163,12 @@ def integrate_with_sglang(self):
156163

157164
def _add_project_uuid_to_data(self, data) -> dict:
158165
data_dict = asdict(data)
159-
data_dict["project_uuid"] = self._project.uuid
166+
data_dict["project_uuid"] = self.project_uuid
160167
return data_dict
161168

162169
@property
163170
def project_uuid(self) -> str:
164-
return self._project.uuid
171+
return self._get_project_uuid()
165172

166173
def completion(self, data: Completion) -> CompletionResponse:
167174
data = self._update_data_and_trace(data)
@@ -431,7 +438,7 @@ def _update_data_and_trace(self, data: Completion) -> Completion:
431438
data = serialize_metadata_values(data)
432439
inference_id = gen_trace_id()
433440
data.inference_id = inference_id
434-
data.project_uuid = self._project.uuid
441+
data.project_uuid = self.project_uuid
435442

436443
try:
437444
parent_trace_id = get_current_trace_id()

parea/parea_logger.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
import os
55

66
from attrs import asdict, define, field
7+
from cattrs import structure
78

89
from parea.api_client import HTTPClient
910
from parea.constants import PAREA_OS_ENV_EXPERIMENT_UUID
1011
from parea.helpers import serialize_metadata_values
1112
from parea.schemas.log import TraceIntegrations
12-
from parea.schemas.models import TraceLog, UpdateLog
13+
from parea.schemas.models import CreateGetProjectResponseSchema, TraceLog, UpdateLog
1314
from parea.utils.universal_encoder import json_dumps
1415

1516
LOG_ENDPOINT = "/trace_log"
@@ -20,12 +21,27 @@
2021
class PareaLogger:
2122
_client: HTTPClient = field(init=False, default=None)
2223
_project_uuid: str = field(init=False, default=None)
24+
_project_name: str = field(init=False, default=None)
2325

2426
def set_client(self, client: HTTPClient) -> None:
2527
self._client = client
2628

27-
def set_project_uuid(self, project_uuid: str) -> None:
29+
def set_project_uuid(self, project_uuid: str, project_name: str) -> None:
2830
self._project_uuid = project_uuid
31+
self._project_name = project_name
32+
33+
def _get_project_uuid(self) -> str:
34+
if not self._project_uuid:
35+
self._project_uuid = self._create_or_get_project(self._project_name or "default").uuid
36+
return self._project_uuid
37+
38+
def _create_or_get_project(self, name: str) -> CreateGetProjectResponseSchema:
39+
r = self._client.request(
40+
"POST",
41+
"/project",
42+
data={"name": name},
43+
)
44+
return structure(r.json(), CreateGetProjectResponseSchema)
2945

3046
def update_log(self, data: UpdateLog) -> None:
3147
data = serialize_metadata_values(data)
@@ -37,7 +53,7 @@ def update_log(self, data: UpdateLog) -> None:
3753

3854
def record_log(self, data: TraceLog) -> None:
3955
data = serialize_metadata_values(data)
40-
data.project_uuid = self._project_uuid
56+
data.project_uuid = self._get_project_uuid()
4157
self._client.request(
4258
"POST",
4359
LOG_ENDPOINT,
@@ -60,7 +76,7 @@ def default_log(self, data: TraceLog) -> None:
6076
self.record_log(data)
6177

6278
def record_vendor_log(self, data: Dict[str, Any], vendor: TraceIntegrations) -> None:
63-
data["project_uuid"] = self._project_uuid
79+
data["project_uuid"] = self._get_project_uuid()
6480
if experiment_uuid := os.getenv(PAREA_OS_ENV_EXPERIMENT_UUID, None):
6581
data["experiment_uuid"] = experiment_uuid
6682
self._client.add_integration("langchain")
@@ -71,7 +87,7 @@ def record_vendor_log(self, data: Dict[str, Any], vendor: TraceIntegrations) ->
7187
)
7288

7389
async def arecord_vendor_log(self, data: Dict[str, Any], vendor: TraceIntegrations) -> None:
74-
data["project_uuid"] = self._project_uuid
90+
data["project_uuid"] = self._get_project_uuid()
7591
if experiment_uuid := os.getenv(PAREA_OS_ENV_EXPERIMENT_UUID, None):
7692
data["experiment_uuid"] = experiment_uuid
7793
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)