[Bugfix] Add Responses cache_write_tokens for API compat and CC parity (#57222)
Signed-off-by: Yifan Zong <yzong@redhat.com> Co-authored-by: Flora Feng <4florafeng@gmail.com>
This commit is contained in:
@@ -18,6 +18,9 @@ from openai.types.responses import (
|
||||
ResponseTextConfig,
|
||||
ResponseTextDeltaEvent,
|
||||
)
|
||||
from openai.types.responses import (
|
||||
ResponseUsage as OpenAIResponseUsage,
|
||||
)
|
||||
from openai.types.responses.response_format_text_json_schema_config import (
|
||||
ResponseFormatTextJSONSchemaConfig,
|
||||
)
|
||||
@@ -975,6 +978,7 @@ async def test_reasoning_tokens_counted_for_text_reasoning_model(monkeypatch):
|
||||
outputs=[completion],
|
||||
finished=True,
|
||||
num_cached_tokens=0,
|
||||
num_cache_creation_tokens=3,
|
||||
)
|
||||
context.append_output(req_output)
|
||||
|
||||
@@ -995,6 +999,9 @@ async def test_reasoning_tokens_counted_for_text_reasoning_model(monkeypatch):
|
||||
)
|
||||
|
||||
assert response.usage.output_tokens_details.reasoning_tokens == 1
|
||||
assert response.usage.input_tokens_details.cache_write_tokens == 3
|
||||
|
||||
OpenAIResponseUsage.model_validate(response.usage.model_dump(mode="json"))
|
||||
|
||||
|
||||
class TestExtractAllowedToolsFromMcpRequests:
|
||||
|
||||
@@ -682,6 +682,7 @@ def create_simple_context_output(
|
||||
prompt="Test prompt",
|
||||
prompt_token_ids=None,
|
||||
num_cached_tokens=0,
|
||||
num_cache_creation_tokens=None,
|
||||
logprobs=None,
|
||||
finished=True,
|
||||
):
|
||||
@@ -707,6 +708,7 @@ def create_simple_context_output(
|
||||
],
|
||||
finished=finished,
|
||||
num_cached_tokens=num_cached_tokens,
|
||||
num_cache_creation_tokens=num_cache_creation_tokens,
|
||||
)
|
||||
|
||||
|
||||
@@ -827,6 +829,7 @@ def test_simple_context_token_counting():
|
||||
token_ids=[10, 11],
|
||||
prompt_token_ids=[1, 2, 3, 4, 5],
|
||||
num_cached_tokens=2,
|
||||
num_cache_creation_tokens=3,
|
||||
)
|
||||
)
|
||||
context.append_output(
|
||||
@@ -835,12 +838,14 @@ def test_simple_context_token_counting():
|
||||
token_ids=[12],
|
||||
prompt_token_ids=[1, 2, 3, 4, 5],
|
||||
num_cached_tokens=2,
|
||||
num_cache_creation_tokens=3,
|
||||
)
|
||||
)
|
||||
|
||||
assert context.num_prompt_tokens == 5
|
||||
assert context.num_output_tokens == 3 # 2 + 1
|
||||
assert context.num_cached_tokens == 2
|
||||
assert context.num_cache_creation_tokens == 3
|
||||
|
||||
|
||||
def test_simple_context_final_output():
|
||||
|
||||
@@ -189,6 +189,7 @@ class SimpleContext(ConversationContext):
|
||||
self.num_prompt_tokens = 0
|
||||
self.num_output_tokens = 0
|
||||
self.num_cached_tokens = 0
|
||||
self.num_cache_creation_tokens = 0
|
||||
# todo num_reasoning_tokens is not implemented yet.
|
||||
self.num_reasoning_tokens = 0
|
||||
# not implemented yet for SimpleContext
|
||||
@@ -204,6 +205,8 @@ class SimpleContext(ConversationContext):
|
||||
raise ValueError("SimpleContext only supports RequestOutput.")
|
||||
self.num_prompt_tokens = len(output.prompt_token_ids or [])
|
||||
self.num_cached_tokens = output.num_cached_tokens or 0
|
||||
if output.num_cache_creation_tokens is not None:
|
||||
self.num_cache_creation_tokens = output.num_cache_creation_tokens
|
||||
self.num_output_tokens += len(output.outputs[0].token_ids or [])
|
||||
if output.kv_transfer_params is not None:
|
||||
self.kv_transfer_params = output.kv_transfer_params
|
||||
|
||||
@@ -80,6 +80,7 @@ _INT64_MAX = 2**63 - 1
|
||||
|
||||
class InputTokensDetails(OpenAIBaseModel):
|
||||
cached_tokens: int
|
||||
cache_write_tokens: int
|
||||
input_tokens_per_turn: list[int] = Field(default_factory=list)
|
||||
cached_tokens_per_turn: list[int] = Field(default_factory=list)
|
||||
|
||||
|
||||
@@ -837,6 +837,7 @@ class OpenAIServingResponses(GenerateBaseServing):
|
||||
output_tokens=num_generated_tokens,
|
||||
total_tokens=num_prompt_tokens + num_generated_tokens,
|
||||
input_tokens_details=InputTokensDetails(
|
||||
cache_write_tokens=getattr(context, "num_cache_creation_tokens", 0),
|
||||
cached_tokens=num_cached_tokens,
|
||||
input_tokens_per_turn=[
|
||||
turn.input_tokens for turn in context.all_turn_metrics
|
||||
|
||||
Reference in New Issue
Block a user