Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Usage

RequestUsage

Usage details for a single API request.

Source code insrc/agents/usage.py
@dataclassclassRequestUsage:"""Usage details for a single API request."""input_tokens:int"""Input tokens for this individual request."""output_tokens:int"""Output tokens for this individual request."""total_tokens:int"""Total tokens (input + output) for this individual request."""input_tokens_details:InputTokensDetails"""Details about the input tokens for this individual request."""output_tokens_details:OutputTokensDetails"""Details about the output tokens for this individual request."""

input_tokensinstance-attribute

input_tokens:int

Input tokens for this individual request.

output_tokensinstance-attribute

output_tokens:int

Output tokens for this individual request.

total_tokensinstance-attribute

total_tokens:int

Total tokens (input + output) for this individual request.

input_tokens_detailsinstance-attribute

input_tokens_details:InputTokensDetails

Details about the input tokens for this individual request.

output_tokens_detailsinstance-attribute

output_tokens_details:OutputTokensDetails

Details about the output tokens for this individual request.

Usage

Source code insrc/agents/usage.py
@dataclassclassUsage:requests:int=0"""Total requests made to the LLM API."""input_tokens:int=0"""Total input tokens sent, across all requests."""input_tokens_details:Annotated[InputTokensDetails,BeforeValidator(_normalize_input_tokens_details)]=field(default_factory=lambda:InputTokensDetails(cached_tokens=0))"""Details about the input tokens, matching responses API usage details."""output_tokens:int=0"""Total output tokens received, across all requests."""output_tokens_details:Annotated[OutputTokensDetails,BeforeValidator(_normalize_output_tokens_details)]=field(default_factory=lambda:OutputTokensDetails(reasoning_tokens=0))"""Details about the output tokens, matching responses API usage details."""total_tokens:int=0"""Total tokens sent and received, across all requests."""request_usage_entries:list[RequestUsage]=field(default_factory=list)"""List of RequestUsage entries for accurate per-request cost calculation.    Each call to `add()` automatically creates an entry in this list if the added usage    represents a new request (i.e., has non-zero tokens).    Example:        For a run that makes 3 API calls with 100K, 150K, and 80K input tokens each,        the aggregated `input_tokens` would be 330K, but `request_usage_entries` would        preserve the [100K, 150K, 80K] breakdown, which could be helpful for detailed        cost calculation or context window management.    """def__post_init__(self)->None:# Some providers don't populate optional token detail fields# (cached_tokens, reasoning_tokens), and the OpenAI SDK's generated# code can bypass Pydantic validation (e.g., via model_construct),# allowing None values. We normalize these to 0 to prevent TypeErrors.input_details_none=self.input_tokens_detailsisNoneinput_cached_none=(notinput_details_noneandself.input_tokens_details.cached_tokensisNone)ifinput_details_noneorinput_cached_none:self.input_tokens_details=InputTokensDetails(cached_tokens=0)output_details_none=self.output_tokens_detailsisNoneoutput_reasoning_none=(notoutput_details_noneandself.output_tokens_details.reasoning_tokensisNone)ifoutput_details_noneoroutput_reasoning_none:self.output_tokens_details=OutputTokensDetails(reasoning_tokens=0)defadd(self,other:Usage)->None:"""Add another Usage object to this one, aggregating all fields.        This method automatically preserves request_usage_entries.        Args:            other: The Usage object to add to this one.        """self.requests+=other.requestsifother.requestselse0self.input_tokens+=other.input_tokensifother.input_tokenselse0self.output_tokens+=other.output_tokensifother.output_tokenselse0self.total_tokens+=other.total_tokensifother.total_tokenselse0# Null guards for nested token details (other may bypass validation via model_construct)other_cached=(other.input_tokens_details.cached_tokensifother.input_tokens_detailsandother.input_tokens_details.cached_tokenselse0)other_reasoning=(other.output_tokens_details.reasoning_tokensifother.output_tokens_detailsandother.output_tokens_details.reasoning_tokenselse0)self_cached=(self.input_tokens_details.cached_tokensifself.input_tokens_detailsandself.input_tokens_details.cached_tokenselse0)self_reasoning=(self.output_tokens_details.reasoning_tokensifself.output_tokens_detailsandself.output_tokens_details.reasoning_tokenselse0)self.input_tokens_details=InputTokensDetails(cached_tokens=self_cached+other_cached)self.output_tokens_details=OutputTokensDetails(reasoning_tokens=self_reasoning+other_reasoning)# Automatically preserve request_usage_entries.# If the other Usage represents a single request with tokens, record it.ifother.requests==1andother.total_tokens>0:input_details=other.input_tokens_detailsorInputTokensDetails(cached_tokens=0)output_details=other.output_tokens_detailsorOutputTokensDetails(reasoning_tokens=0)request_usage=RequestUsage(input_tokens=other.input_tokens,output_tokens=other.output_tokens,total_tokens=other.total_tokens,input_tokens_details=input_details,output_tokens_details=output_details,)self.request_usage_entries.append(request_usage)elifother.request_usage_entries:# If the other Usage already has individual request breakdowns, merge them.self.request_usage_entries.extend(other.request_usage_entries)

requestsclass-attributeinstance-attribute

requests:int=0

Total requests made to the LLM API.

input_tokensclass-attributeinstance-attribute

input_tokens:int=0

Total input tokens sent, across all requests.

input_tokens_detailsclass-attributeinstance-attribute

input_tokens_details:Annotated[InputTokensDetails,BeforeValidator(_normalize_input_tokens_details),]=field(default_factory=lambda:InputTokensDetails(cached_tokens=0))

Details about the input tokens, matching responses API usage details.

output_tokensclass-attributeinstance-attribute

output_tokens:int=0

Total output tokens received, across all requests.

output_tokens_detailsclass-attributeinstance-attribute

output_tokens_details:Annotated[OutputTokensDetails,BeforeValidator(_normalize_output_tokens_details),]=field(default_factory=lambda:OutputTokensDetails(reasoning_tokens=0))

Details about the output tokens, matching responses API usage details.

total_tokensclass-attributeinstance-attribute

total_tokens:int=0

Total tokens sent and received, across all requests.

request_usage_entriesclass-attributeinstance-attribute

request_usage_entries:list[RequestUsage]=field(default_factory=list)

List of RequestUsage entries for accurate per-request cost calculation.

Each call toadd() automatically creates an entry in this list if the added usagerepresents a new request (i.e., has non-zero tokens).

Example

For a run that makes 3 API calls with 100K, 150K, and 80K input tokens each,the aggregatedinput_tokens would be 330K, butrequest_usage_entries wouldpreserve the [100K, 150K, 80K] breakdown, which could be helpful for detailedcost calculation or context window management.

add

add(other:Usage)->None

Add another Usage object to this one, aggregating all fields.

This method automatically preserves request_usage_entries.

Parameters:

NameTypeDescriptionDefault
otherUsage

The Usage object to add to this one.

required
Source code insrc/agents/usage.py
defadd(self,other:Usage)->None:"""Add another Usage object to this one, aggregating all fields.    This method automatically preserves request_usage_entries.    Args:        other: The Usage object to add to this one.    """self.requests+=other.requestsifother.requestselse0self.input_tokens+=other.input_tokensifother.input_tokenselse0self.output_tokens+=other.output_tokensifother.output_tokenselse0self.total_tokens+=other.total_tokensifother.total_tokenselse0# Null guards for nested token details (other may bypass validation via model_construct)other_cached=(other.input_tokens_details.cached_tokensifother.input_tokens_detailsandother.input_tokens_details.cached_tokenselse0)other_reasoning=(other.output_tokens_details.reasoning_tokensifother.output_tokens_detailsandother.output_tokens_details.reasoning_tokenselse0)self_cached=(self.input_tokens_details.cached_tokensifself.input_tokens_detailsandself.input_tokens_details.cached_tokenselse0)self_reasoning=(self.output_tokens_details.reasoning_tokensifself.output_tokens_detailsandself.output_tokens_details.reasoning_tokenselse0)self.input_tokens_details=InputTokensDetails(cached_tokens=self_cached+other_cached)self.output_tokens_details=OutputTokensDetails(reasoning_tokens=self_reasoning+other_reasoning)# Automatically preserve request_usage_entries.# If the other Usage represents a single request with tokens, record it.ifother.requests==1andother.total_tokens>0:input_details=other.input_tokens_detailsorInputTokensDetails(cached_tokens=0)output_details=other.output_tokens_detailsorOutputTokensDetails(reasoning_tokens=0)request_usage=RequestUsage(input_tokens=other.input_tokens,output_tokens=other.output_tokens,total_tokens=other.total_tokens,input_tokens_details=input_details,output_tokens_details=output_details,)self.request_usage_entries.append(request_usage)elifother.request_usage_entries:# If the other Usage already has individual request breakdowns, merge them.self.request_usage_entries.extend(other.request_usage_entries)

[8]ページ先頭

©2009-2025 Movatter.jp