Skip to content

Commit a746bfa

Browse files
authored
Merge pull request #135 from getjavelin/feature/openai-register
feat: Refactor JavelinClient initialization, improve tracing with OpenTelemetry status handling, and simplify OpenAI base URL logic
2 parents bbfbadd + a39357f commit a746bfa

2 files changed

Lines changed: 24 additions & 15 deletions

File tree

examples/openai_client.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@
1212
javelin_api_key = os.getenv('JAVELIN_API_KEY')
1313
gemini_api_key = os.getenv("GEMINI_API_KEY")
1414

15-
# Initialize Javelin Client
15+
# Global JavelinClient, used for everything
1616
config = JavelinConfig(
1717
base_url="https://api-dev.javelin.live",
1818
# base_url="http://localhost:8000",
1919
javelin_api_key=javelin_api_key,
2020
)
21-
client = JavelinClient(config)
21+
client = JavelinClient(config) # Global JavelinClient
2222

2323
# Initialize Javelin Client
2424
def initialize_javelin_client():
25-
javelin_api_key = os.getenv('JAVELIN_API_KEY')
2625
config = JavelinConfig(
2726
base_url="https://api-dev.javelin.live",
27+
# base_url="http://localhost:8000",
2828
javelin_api_key=javelin_api_key,
2929
)
3030
return JavelinClient(config)
@@ -288,8 +288,13 @@ def main_sync():
288288
openai_completions()
289289
openai_embeddings()
290290
openai_streaming_chat()
291+
292+
openai_client = create_azureopenai_client() # same global client
293+
register_azureopenai(client, openai_client)
294+
azure_openai_chat_completions(openai_client)
291295

292-
client = initialize_javelin_client()
296+
# Pending: model specs, uncomment after model is available
297+
'''
293298
openai_client = create_gemini_client()
294299
register_gemini(client, openai_client)
295300
gemini_chat_completions(openai_client)
@@ -298,20 +303,15 @@ def main_sync():
298303
gemini_image_understanding(openai_client)
299304
gemini_structured_output(openai_client)
300305
gemini_embeddings(openai_client)
301-
302-
client = initialize_javelin_client()
303-
openai_client = create_azureopenai_client()
304-
register_azureopenai(client, openai_client)
305-
azure_openai_chat_completions(openai_client)
306306
307-
client = initialize_javelin_client()
308307
openai_client = create_deepseek_client()
309308
register_deepseek(client, openai_client)
310309
deepseek_chat_completions(openai_client)
311310
312311
# deepseek_reasoning_model()
313312
314313
mistral_chat_completions()
314+
'''
315315

316316
async def main_async():
317317
await async_openai_chat_completions()

javelin_sdk/client.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
from javelin_sdk.tracing_setup import configure_span_exporter
1818
import inspect
1919
from opentelemetry.trace import SpanKind
20+
from opentelemetry.trace import Status, StatusCode
2021
from opentelemetry.semconv._incubating.attributes import gen_ai_attributes
21-
import openai
2222

2323
API_BASEURL = "https://api-dev.javelin.live"
2424
API_BASE_PATH = "/v1"
@@ -158,13 +158,13 @@ def register_provider(self,
158158

159159
client_id = id(openai_client)
160160
if client_id in self.patched_clients:
161+
print (f"Client {client_id} already patched")
161162
return openai_client # Skip if already patched
162163

163164
self.patched_clients.add(client_id) # Mark as patched
164165

165166
# Store the OpenAI base URL
166-
if self.openai_base_url is None:
167-
self.openai_base_url = openai_client.base_url
167+
self.openai_base_url = openai_client.base_url
168168

169169
# Point the OpenAI client to Javelin's base URL
170170
openai_client.base_url = f"{self.base_url}/{provider_name}"
@@ -244,8 +244,8 @@ def _sync_execution(span):
244244
else:
245245
return _sync_execution(span)
246246
except Exception as e:
247-
span.set_attribute("error", True)
248-
span.set_attribute("error.message", str(e))
247+
span.set_status(Status(StatusCode.ERROR, str(e)))
248+
span.set_attribute("is_exception", True)
249249
raise
250250
else:
251251
# Tracing is disabled
@@ -259,6 +259,15 @@ def _capture_response_details(span, response, kwargs, system_name):
259259
if hasattr(response, "to_json"):
260260
response_data = response.to_dict()
261261

262+
# Set status code based on response
263+
status_code = response_data.get("status_code", 200)
264+
status_message = response_data.get("status_message", "OK")
265+
266+
if status_code >= 400:
267+
span.set_status(Status(StatusCode.ERROR, status_message))
268+
else:
269+
span.set_status(Status(StatusCode.OK, status_message))
270+
262271
# Set basic response attributes
263272
JavelinClient.set_span_attribute_if_not_none(span, gen_ai_attributes.GEN_AI_RESPONSE_MODEL, response_data.get('model'))
264273
JavelinClient.set_span_attribute_if_not_none(span, gen_ai_attributes.GEN_AI_RESPONSE_ID, response_data.get('id'))

0 commit comments

Comments
 (0)