Skip to content

Fix: Handle missing prompt_tokens_details in OpenAI-compatible APIs #83

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 24 additions & 11 deletions defog/llm/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -753,13 +753,18 @@ async def _process_openai_response(
if tools and len(tools) > 0:
consecutive_exceptions = 0
while True:
total_input_tokens += (
response.usage.prompt_tokens
- response.usage.prompt_tokens_details.cached_tokens
)
total_cached_input_tokens += (
response.usage.prompt_tokens_details.cached_tokens
)
# Check if prompt_tokens_details exists in the response
if (
hasattr(response.usage, "prompt_tokens_details")
and response.usage.prompt_tokens_details is not None
):
cached_tokens = response.usage.prompt_tokens_details.cached_tokens
total_input_tokens += response.usage.prompt_tokens - cached_tokens
total_cached_input_tokens += cached_tokens
else:
# If prompt_tokens_details doesn't exist, assume all tokens are uncached
total_input_tokens += response.usage.prompt_tokens

total_output_tokens += response.usage.completion_tokens
message = response.choices[0].message
if message.tool_calls:
Expand Down Expand Up @@ -872,10 +877,18 @@ async def _process_openai_response(
content = response.choices[0].message.content

usage = response.usage
total_cached_input_tokens += usage.prompt_tokens_details.cached_tokens
total_input_tokens += (
usage.prompt_tokens - usage.prompt_tokens_details.cached_tokens
)
# Check if prompt_tokens_details exists in the response
if (
hasattr(usage, "prompt_tokens_details")
and usage.prompt_tokens_details is not None
):
cached_tokens = usage.prompt_tokens_details.cached_tokens
total_cached_input_tokens += cached_tokens
total_input_tokens += usage.prompt_tokens - cached_tokens
else:
# If prompt_tokens_details doesn't exist, assume all tokens are uncached
total_input_tokens += usage.prompt_tokens

total_output_tokens += usage.completion_tokens
return (
content,
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def package_files(directory):
name="defog",
packages=find_packages(),
package_data={"defog": ["gcp/*", "aws/*"] + next_static_files},
version="0.67.13",
version="0.67.14",
description="Defog is a Python library that helps you generate data queries from natural language questions.",
author="Full Stack Data Pte. Ltd.",
license="MIT",
Expand Down