|
51 | 51 | ResponseOutputText,
|
52 | 52 | ResponseRefusalDeltaEvent,
|
53 | 53 | ResponseTextDeltaEvent,
|
| 54 | + ResponseUsage, |
54 | 55 | )
|
55 | 56 | from openai.types.responses.response_input_param import FunctionCallOutput, ItemReference, Message
|
| 57 | +from openai.types.responses.response_usage import OutputTokensDetails |
56 | 58 |
|
57 | 59 | from .. import _debug
|
58 | 60 | from ..agent_output import AgentOutputSchema
|
@@ -405,7 +407,23 @@ async def stream_response(
|
405 | 407 | for function_call in state.function_calls.values():
|
406 | 408 | outputs.append(function_call)
|
407 | 409 |
|
408 |
| - final_response = response.model_copy(update={"output": outputs, "usage": usage}) |
| 410 | + final_response = response.model_copy() |
| 411 | + final_response.output = outputs |
| 412 | + final_response.usage = ( |
| 413 | + ResponseUsage( |
| 414 | + input_tokens=usage.prompt_tokens, |
| 415 | + output_tokens=usage.completion_tokens, |
| 416 | + total_tokens=usage.total_tokens, |
| 417 | + output_tokens_details=OutputTokensDetails( |
| 418 | + reasoning_tokens=usage.completion_tokens_details.reasoning_tokens |
| 419 | + if usage.completion_tokens_details |
| 420 | + and usage.completion_tokens_details.reasoning_tokens |
| 421 | + else 0 |
| 422 | + ), |
| 423 | + ) |
| 424 | + if usage |
| 425 | + else None |
| 426 | + ) |
409 | 427 |
|
410 | 428 | yield ResponseCompletedEvent(
|
411 | 429 | response=final_response,
|
@@ -503,6 +521,7 @@ async def _fetch_response(
|
503 | 521 | top_p=self._non_null_or_not_given(model_settings.top_p),
|
504 | 522 | frequency_penalty=self._non_null_or_not_given(model_settings.frequency_penalty),
|
505 | 523 | presence_penalty=self._non_null_or_not_given(model_settings.presence_penalty),
|
| 524 | + max_tokens=self._non_null_or_not_given(model_settings.max_tokens), |
506 | 525 | tool_choice=tool_choice,
|
507 | 526 | response_format=response_format,
|
508 | 527 | parallel_tool_calls=parallel_tool_calls,
|
@@ -808,6 +827,13 @@ def ensure_assistant_message() -> ChatCompletionAssistantMessageParam:
|
808 | 827 | "content": cls.extract_text_content(content),
|
809 | 828 | }
|
810 | 829 | result.append(msg_developer)
|
| 830 | + elif role == "assistant": |
| 831 | + flush_assistant_message() |
| 832 | + msg_assistant: ChatCompletionAssistantMessageParam = { |
| 833 | + "role": "assistant", |
| 834 | + "content": cls.extract_text_content(content), |
| 835 | + } |
| 836 | + result.append(msg_assistant) |
811 | 837 | else:
|
812 | 838 | raise UserError(f"Unexpected role in easy_input_message: {role}")
|
813 | 839 |
|
|
0 commit comments