This commit is contained in:
9qeklajc
2026-04-05 00:30:24 +02:00
parent 22ede7636a
commit 31a9730cd8
+20 -64
View File
@@ -301,8 +301,6 @@ class BaseUpstreamProvider:
original_model = model_obj.id
transformed_model = self.transform_model_name(original_model)
data["model"] = transformed_model
print("[routstr DEBUG] REQUEST BODY:", json.dumps(data, indent=2), flush=True)
print("[routstr DEBUG] MODEL OBJECT:", model_obj.model_dump() if hasattr(model_obj, 'model_dump') else vars(model_obj), flush=True)
logger.debug(
"Transformed model name in request",
extra={
@@ -563,14 +561,6 @@ class BaseUpstreamProvider:
usage_chunk_data["usage"]["remaining_balance_msats"] = (
remaining_balance_msats
)
# Normalize to OpenAI format so AI SDK maps prompt_tokens->inputTokens
u = usage_chunk_data["usage"]
if "prompt_tokens" not in u:
u["prompt_tokens"] = u.get("input_tokens", cost_data.get("input_tokens", 0))
if "completion_tokens" not in u:
u["completion_tokens"] = u.get("output_tokens", cost_data.get("output_tokens", 0))
if "total_tokens" not in u:
u["total_tokens"] = u.get("prompt_tokens", 0) + u.get("completion_tokens", 0)
# Keep detailed cost in metadata
usage_chunk_data["metadata"] = usage_chunk_data.get(
"metadata", {}
@@ -584,7 +574,6 @@ class BaseUpstreamProvider:
usage_chunk_data["metadata"]["routstr"]["cost"][
"remaining_balance_msats"
] = remaining_balance_msats
print("[routstr DEBUG] STREAMING USAGE CHUNK:", json.dumps(usage_chunk_data, indent=2), flush=True)
yield f"data: {json.dumps(usage_chunk_data)}\n\n".encode()
usage_finalized = True
except Exception as e:
@@ -679,22 +668,13 @@ class BaseUpstreamProvider:
await session.refresh(key)
remaining_balance_msats = key.balance
# Ensure usage exists with token counts and cost data for OpenCode
if "usage" not in response_json:
response_json["usage"] = {}
usage = response_json["usage"]
# Normalize to OpenAI format so AI SDK maps prompt_tokens->inputTokens
if "prompt_tokens" not in usage:
usage["prompt_tokens"] = usage.get("input_tokens", cost_data.get("input_tokens", 0))
if "completion_tokens" not in usage:
usage["completion_tokens"] = usage.get("output_tokens", cost_data.get("output_tokens", 0))
if "total_tokens" not in usage:
usage["total_tokens"] = usage["prompt_tokens"] + usage["completion_tokens"]
response_json["usage"]["cost"] = cost_data.get("total_usd", 0.0)
response_json["usage"]["cost_sats"] = (
cost_data.get("total_msats", 0) // 1000
)
response_json["usage"]["remaining_balance_msats"] = remaining_balance_msats
# Merge cost into usage for OpenCode
if "usage" in response_json:
response_json["usage"]["cost"] = cost_data.get("total_usd", 0.0)
response_json["usage"]["cost_sats"] = (
cost_data.get("total_msats", 0) // 1000
)
response_json["usage"]["remaining_balance_msats"] = remaining_balance_msats
# Keep detailed cost
response_json["metadata"] = response_json.get("metadata", {})
@@ -740,7 +720,6 @@ class BaseUpstreamProvider:
if requested_model:
response_json["model"] = requested_model
print("[routstr DEBUG] NON-STREAMING RESPONSE:", json.dumps(response_json, indent=2), flush=True)
return Response(
content=json.dumps(response_json).encode(),
status_code=response.status_code,
@@ -841,6 +820,8 @@ class BaseUpstreamProvider:
if isinstance(obj, dict):
if obj.get("model"):
last_model_seen = str(obj.get("model"))
if requested_model:
obj["model"] = requested_model
# Track reasoning tokens for Responses API
if usage := obj.get("usage", {}):
@@ -895,18 +876,7 @@ class BaseUpstreamProvider:
usage_chunk_data["response"]["usage"][
"remaining_balance_msats"
] = remaining_balance_msats
else:
# Ensure usage exists with token counts and cost data
if "usage" not in usage_chunk_data:
usage_chunk_data["usage"] = {}
u2 = usage_chunk_data["usage"]
# Normalize to OpenAI format so AI SDK maps prompt_tokens->inputTokens
if "prompt_tokens" not in u2:
u2["prompt_tokens"] = u2.get("input_tokens", cost_data.get("input_tokens", 0))
if "completion_tokens" not in u2:
u2["completion_tokens"] = u2.get("output_tokens", cost_data.get("output_tokens", 0))
if "total_tokens" not in u2:
u2["total_tokens"] = u2.get("prompt_tokens", 0) + u2.get("completion_tokens", 0)
elif "usage" in usage_chunk_data:
usage_chunk_data["usage"]["cost"] = cost_data.get(
"total_usd", 0.0
)
@@ -930,7 +900,6 @@ class BaseUpstreamProvider:
usage_chunk_data["metadata"]["routstr"]["cost"][
"remaining_balance_msats"
] = remaining_balance_msats
print("[routstr DEBUG] STREAMING USAGE CHUNK (responses API):", json.dumps(usage_chunk_data, indent=2), flush=True)
yield f"data: {json.dumps(usage_chunk_data)}\n\n".encode()
usage_finalized = True
except Exception:
@@ -1019,22 +988,13 @@ class BaseUpstreamProvider:
await session.refresh(key)
remaining_balance_msats = key.balance
# Ensure usage exists with token counts and cost data for OpenCode
if "usage" not in response_json:
response_json["usage"] = {}
usage = response_json["usage"]
# Normalize to OpenAI format so AI SDK maps prompt_tokens->inputTokens
if "prompt_tokens" not in usage:
usage["prompt_tokens"] = usage.get("input_tokens", cost_data.get("input_tokens", 0))
if "completion_tokens" not in usage:
usage["completion_tokens"] = usage.get("output_tokens", cost_data.get("output_tokens", 0))
if "total_tokens" not in usage:
usage["total_tokens"] = usage["prompt_tokens"] + usage["completion_tokens"]
response_json["usage"]["cost"] = cost_data.get("total_usd", 0.0)
response_json["usage"]["cost_sats"] = (
cost_data.get("total_msats", 0) // 1000
)
response_json["usage"]["remaining_balance_msats"] = remaining_balance_msats
# Merge cost into usage for OpenCode
if "usage" in response_json:
response_json["usage"]["cost"] = cost_data.get("total_usd", 0.0)
response_json["usage"]["cost_sats"] = (
cost_data.get("total_msats", 0) // 1000
)
response_json["usage"]["remaining_balance_msats"] = remaining_balance_msats
# Keep detailed cost
response_json["metadata"] = response_json.get("metadata", {})
@@ -1080,7 +1040,6 @@ class BaseUpstreamProvider:
if requested_model:
response_json["model"] = requested_model
print("[routstr DEBUG] NON-STREAMING RESPONSE (responses API):", json.dumps(response_json, indent=2), flush=True)
return Response(
content=json.dumps(response_json).encode(),
status_code=response.status_code,
@@ -1344,12 +1303,7 @@ class BaseUpstreamProvider:
path = self.normalize_request_path(path, model_obj)
url = self.build_request_url(path, model_obj)
original_model_id: str | None = None
if request_body:
try:
original_model_id = json.loads(request_body).get("model")
except Exception:
pass
original_model_id = model_obj.id if model_obj else None
transformed_body = self.prepare_request_body(request_body, model_obj)
@@ -1635,6 +1589,8 @@ class BaseUpstreamProvider:
path = self.normalize_request_path(path, model_obj)
url = self.build_request_url(path, model_obj)
original_model_id = model_obj.id if model_obj else None
transformed_body = self.prepare_responses_request_body(request_body, model_obj)
logger.info(