Skip to content

Commit edf953a

Browse files
fixing headers
1 parent 23618da commit edf953a

File tree

2 files changed

+18
-29
lines changed

2 files changed

+18
-29
lines changed

src/openlayer/lib/integrations/portkey_tracer.py

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ def stream_chunks(
194194
if any(v is not None for v in chunk_usage.values()):
195195
latest_usage_data = chunk_usage
196196

197-
# Update metadata from latest chunk (headers/cost/etc.)
197+
# Update metadata from latest chunk (headers/etc.)
198198
chunk_metadata = extract_portkey_unit_metadata(chunk, model_name)
199199
if chunk_metadata:
200200
latest_chunk_metadata.update(chunk_metadata)
@@ -487,7 +487,7 @@ def extract_portkey_metadata(client: "Portkey") -> Dict[str, Any]:
487487

488488

489489
def extract_portkey_unit_metadata(unit: Any, model_name: str) -> Dict[str, Any]:
490-
"""Extract metadata from a response or chunk unit (headers, cost, ids)."""
490+
"""Extract metadata from a response or chunk unit (headers, ids)."""
491491
metadata: Dict[str, Any] = {}
492492
try:
493493
# Extract system fingerprint if available (OpenAI-compatible)
@@ -512,16 +512,12 @@ def extract_portkey_unit_metadata(unit: Any, model_name: str) -> Dict[str, Any]:
512512
lower = {k.lower(): v for k, v in headers.items()}
513513
if "x-portkey-trace-id" in lower:
514514
metadata["portkey_trace_id"] = lower["x-portkey-trace-id"]
515-
if "x-portkey-provider" in lower:
516-
metadata["provider"] = lower["x-portkey-provider"]
517515
if "x-portkey-cache-status" in lower:
518516
metadata["portkey_cache_status"] = lower["x-portkey-cache-status"]
519-
# Cost if surfaced by gateway
520-
if "x-portkey-cost" in lower:
521-
try:
522-
metadata["cost"] = float(lower["x-portkey-cost"])
523-
except Exception:
524-
pass
517+
if "x-portkey-retry-attempt-count" in lower:
518+
metadata["portkey_retry_attempt_count"] = lower["x-portkey-retry-attempt-count"]
519+
if "x-portkey-last-used-option-index" in lower:
520+
metadata["portkey_last_used_option_index"] = lower["x-portkey-last-used-option-index"]
525521
except Exception:
526522
pass
527523
# Attach model for convenience
@@ -662,7 +658,7 @@ def calculate_streaming_usage_and_cost(
662658

663659
total_tokens = (prompt_tokens or 0) + (completion_tokens or 0)
664660

665-
# Cost from headers if present; otherwise simple heuristic for some models
661+
# Cost from metadata if present; otherwise simple heuristic for some models
666662
cost = latest_chunk_metadata.get("cost")
667663
if cost is None and total_tokens and model_name:
668664
ml = model_name.lower()
@@ -678,21 +674,14 @@ def calculate_streaming_usage_and_cost(
678674
def _extract_provider_from_object(obj: Any) -> Optional[str]:
679675
"""Extract provider from a response or chunk object.
680676
681-
Checks response_metadata and _response_headers for provider information.
677+
Checks response_metadata for provider information.
682678
Returns None if no provider is found.
683679
"""
684680
try:
685681
# Check response_metadata
686682
if hasattr(obj, "response_metadata") and _is_dict_like(obj.response_metadata):
687683
if "provider" in obj.response_metadata:
688684
return obj.response_metadata["provider"]
689-
# Check _response_headers
690-
if hasattr(obj, "_response_headers"):
691-
headers = getattr(obj, "_response_headers")
692-
if _is_dict_like(headers):
693-
for k, v in headers.items():
694-
if isinstance(k, str) and k.lower() == "x-portkey-provider" and v:
695-
return str(v)
696685
except Exception:
697686
pass
698687
return None

tests/test_portkey_integration.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,16 +145,16 @@ def test_extract_portkey_metadata(self) -> None:
145145
assert "Authorization" not in metadata["portkeyHeaders"]
146146

147147
def test_extract_portkey_unit_metadata(self) -> None:
148-
"""Unit metadata should capture headers, cost, and provider hints."""
148+
"""Unit metadata should capture headers and retry/option index hints."""
149149
from openlayer.lib.integrations.portkey_tracer import extract_portkey_unit_metadata
150150

151151
unit = SimpleNamespace(
152152
system_fingerprint="fingerprint-123",
153153
_response_headers={
154154
"x-portkey-trace-id": "trace-1",
155-
"x-portkey-provider": "anthropic",
156155
"x-portkey-cache-status": "HIT",
157-
"x-portkey-cost": "0.45",
156+
"x-portkey-retry-attempt-count": "2",
157+
"x-portkey-last-used-option-index": "config.targets[1]",
158158
"content-type": "application/json",
159159
},
160160
)
@@ -163,9 +163,9 @@ def test_extract_portkey_unit_metadata(self) -> None:
163163

164164
assert metadata["system_fingerprint"] == "fingerprint-123"
165165
assert metadata["portkey_trace_id"] == "trace-1"
166-
assert metadata["provider"] == "anthropic"
167166
assert metadata["portkey_cache_status"] == "HIT"
168-
assert metadata["cost"] == pytest.approx(0.45)
167+
assert metadata["portkey_retry_attempt_count"] == "2"
168+
assert metadata["portkey_last_used_option_index"] == "config.targets[1]"
169169
assert metadata["portkey_model"] == "claude-3-opus"
170170
assert metadata["response_headers"]["content-type"] == "application/json"
171171

@@ -178,8 +178,9 @@ class DictLikeHeaders:
178178
def __init__(self):
179179
self._data = {
180180
"x-portkey-trace-id": "trace-2",
181-
"x-portkey-provider": "openai",
182181
"x-portkey-cache-status": "MISS",
182+
"x-portkey-retry-attempt-count": "3",
183+
"x-portkey-last-used-option-index": "config.targets[1]",
183184
}
184185

185186
def items(self):
@@ -192,8 +193,9 @@ def items(self):
192193
metadata = extract_portkey_unit_metadata(unit, "gpt-4")
193194

194195
assert metadata["portkey_trace_id"] == "trace-2"
195-
assert metadata["provider"] == "openai"
196196
assert metadata["portkey_cache_status"] == "MISS"
197+
assert metadata["portkey_retry_attempt_count"] == "3"
198+
assert metadata["portkey_last_used_option_index"] == "config.targets[1]"
197199

198200
def test_extract_usage_from_response(self) -> None:
199201
"""Usage extraction should read OpenAI-style usage objects."""
@@ -318,9 +320,8 @@ def test_detect_provider_from_response_fallback(self) -> None:
318320
"""Provider detection should fall back to response metadata or model name."""
319321
from openlayer.lib.integrations.portkey_tracer import detect_provider
320322

321-
client = SimpleNamespace(headers={"x-portkey-provider": "openai"})
323+
client = SimpleNamespace()
322324
response = SimpleNamespace(
323-
_response_headers={"X-Portkey-Provider": "anthropic"},
324325
response_metadata={"provider": "anthropic"},
325326
)
326327

@@ -335,7 +336,6 @@ def test_detect_provider_from_chunk_fallback(self) -> None:
335336

336337
chunk = SimpleNamespace(
337338
response_metadata={"provider": "cohere"},
338-
_response_headers={"X-Portkey-Provider": "cohere"},
339339
)
340340
client = SimpleNamespace()
341341

0 commit comments

Comments
 (0)