mirror of
https://github.com/microsoft/semantic-kernel.git
synced 2026-10-12 02:19:06 +00:00
## Summary Adds reasoning capabilities to Python OpenAI ResponsesAgent, bringing parity with the C# implementation. This enables fine-grained control over reasoning effort for O-series models (o1, o3-mini, o4-mini) and gpt-5 that support the reasoning parameter. Fixes #12843 ## Changes ### Core Implementation - **`openai_responses_agent.py`**: Added reasoning configuration support - Constructor-level reasoning effort setting - Per-invocation reasoning effort override capability - Proper parameter validation and model compatibility checks - **`responses_agent_thread_actions.py`**: Extended thread actions to support reasoning parameters - Reasoning effort propagation through thread operations - Metadata preservation for reasoning tokens and summaries ### Sample and Tests - **`responses_agent_reasoning.py`**: Comprehensive demonstration sample - Constructor vs per-invocation reasoning configuration - Function calling integration with reasoning - Reasoning comparison scenarios (low/medium/high effort) - Error handling and troubleshooting guidance - **`test_openai_responses_agent_reasoning.py`**: Full unit test coverage - Parameter validation tests - Integration scenarios with function calling - Edge cases and error conditions ## Features ✅ **Constructor-Level Reasoning**: Set default reasoning effort when creating agents ✅ **Per-Invocation Override**: Override reasoning effort per request ✅ **Priority Hierarchy**: per-invocation > constructor > model default ✅ **Function Calling Compatible**: Works seamlessly with existing plugin system ✅ **Azure OpenAI & OpenAI Support**: Compatible with both service providers ✅ **Model Validation**: Automatic compatibility checks for O-series models nad GÜT-5 ✅ **Metadata Access**: Reasoning tokens and summaries available in response metadata ## Usage Example ```python # Constructor-level reasoning # Constructor-level reasoning configuration agent = AzureResponsesAgent( ai_model_id="gpt-5", client=client, reasoning={"effort": "low"} # Default reasoning for all requests ) # Per-invocation override response = await agent.invoke( "Solve this complex problem step by step", reasoning={"effort": "high"} ) # Invoke with reasoning callback to capture intermediate thoughts response = await agent.invoke( "Analyze this data step by step", reasoning={"effort": "high", "summary": "detailed"}, on_intermediate_message=handle_reasoning_message ) # Streaming with reasoning async for response in agent.invoke_stream( "Explain quantum computing in detail", reasoning={"effort": "high", "summary": "detailed"}, on_intermediate_message=handle_reasoning_message ): print(response.content, end="", flush=True) --------- Co-authored-by: Evan Mattson <[email protected]> Co-authored-by: Evan Mattson <[email protected]>
36 lines
1.5 KiB
Python
36 lines
1.5 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
from enum import Enum
|
|
from typing import Final
|
|
|
|
AUDIO_CONTENT_TAG: Final[str] = "audio"
|
|
CHAT_MESSAGE_CONTENT_TAG: Final[str] = "message"
|
|
CHAT_HISTORY_TAG: Final[str] = "chat_history"
|
|
TEXT_CONTENT_TAG: Final[str] = "text"
|
|
IMAGE_CONTENT_TAG: Final[str] = "image"
|
|
ANNOTATION_CONTENT_TAG: Final[str] = "annotation"
|
|
STREAMING_ANNOTATION_CONTENT_TAG: Final[str] = "streaming_annotation"
|
|
BINARY_CONTENT_TAG: Final[str] = "binary"
|
|
FILE_REFERENCE_CONTENT_TAG: Final[str] = "file_reference"
|
|
STREAMING_FILE_REFERENCE_CONTENT_TAG: Final[str] = "streaming_file_reference"
|
|
FUNCTION_CALL_CONTENT_TAG: Final[str] = "function_call"
|
|
FUNCTION_RESULT_CONTENT_TAG: Final[str] = "function_result"
|
|
REASONING_CONTENT_TAG: Final[str] = "reasoning"
|
|
DISCRIMINATOR_FIELD: Final[str] = "content_type"
|
|
|
|
|
|
class ContentTypes(str, Enum):
|
|
"""Content types enumeration."""
|
|
|
|
AUDIO_CONTENT = AUDIO_CONTENT_TAG
|
|
ANNOTATION_CONTENT = ANNOTATION_CONTENT_TAG
|
|
BINARY_CONTENT = BINARY_CONTENT_TAG
|
|
CHAT_MESSAGE_CONTENT = CHAT_MESSAGE_CONTENT_TAG
|
|
IMAGE_CONTENT = IMAGE_CONTENT_TAG
|
|
FILE_REFERENCE_CONTENT = FILE_REFERENCE_CONTENT_TAG
|
|
FUNCTION_CALL_CONTENT = FUNCTION_CALL_CONTENT_TAG
|
|
FUNCTION_RESULT_CONTENT = FUNCTION_RESULT_CONTENT_TAG
|
|
REASONING_CONTENT = REASONING_CONTENT_TAG
|
|
STREAMING_ANNOTATION_CONTENT = STREAMING_ANNOTATION_CONTENT_TAG
|
|
STREAMING_FILE_REFERENCE_CONTENT = STREAMING_FILE_REFERENCE_CONTENT_TAG
|
|
TEXT_CONTENT = TEXT_CONTENT_TAG
|