mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
838a7fd61d
* Replace Role and FinishReason classes with NewType + Literal
- Remove EnumLike metaclass from _types.py
- Replace Role class with NewType('Role', str) + RoleLiteral
- Replace FinishReason class with NewType('FinishReason', str) + FinishReasonLiteral
- Update all usages across codebase to use string literals
- Remove .value access patterns (direct string comparison now works)
- Add backward compatibility for legacy dict serialization format
- Update tests to reflect new string-based types
Addresses #3591, #3615
* Simplify ChatResponse and AgentResponse type hints (#3592)
- Remove overloads from ChatResponse.__init__
- Remove text parameter from ChatResponse.__init__
- Remove | dict[str, Any] from finish_reason and usage_details params
- Remove **kwargs from AgentResponse.__init__
- Both now accept ChatMessage | Sequence[ChatMessage] | None for messages
- Update docstrings and examples to reflect changes
- Fix tests that were using removed kwargs
- Fix Role type hint usage in ag-ui utils
* Remove text parameter from ChatResponseUpdate and AgentResponseUpdate (#3597)
- Remove text parameter from ChatResponseUpdate.__init__
- Remove text parameter from AgentResponseUpdate.__init__
- Remove **kwargs from both update classes
- Simplify contents parameter type to Sequence[Content] | None
- Update all usages to use contents=[Content.from_text(...)] pattern
- Fix imports in test files
- Update docstrings and examples
* Rename from_chat_response_updates to from_updates (#3593)
- ChatResponse.from_chat_response_updates → ChatResponse.from_updates
- ChatResponse.from_chat_response_generator → ChatResponse.from_update_generator
- AgentResponse.from_agent_run_response_updates → AgentResponse.from_updates
* Remove try_parse_value method from ChatResponse and AgentResponse (#3595)
- Remove try_parse_value method from ChatResponse
- Remove try_parse_value method from AgentResponse
- Remove try_parse_value calls from from_updates and from_update_generator methods
- Update samples to use try/except with response.value instead
- Update tests to use response.value pattern
- Users should now use response.value with try/except for safe parsing
* Add agent_id to AgentResponse and clarify author_name documentation (#3596)
- Add agent_id parameter to AgentResponse class
- Document that author_name is on ChatMessage objects, not responses
- Update ChatResponse docstring with author_name note
- Update AgentResponse docstring with author_name note
* Simplify ChatMessage.__init__ signature (#3618)
- Make contents a positional argument accepting Sequence[Content | str]
- Auto-convert strings in contents to TextContent
- Remove overloads, keep text kwarg for backward compatibility with serialization
- Update _parse_content_list to handle string items
- Update all usages across codebase to use new format: ChatMessage("role", ["text"])
* Allow Content as input on run and get_response
- Update prepare_messages and normalize_messages to accept Content
- Update type signatures in _agents.py and _clients.py
- Add tests for Content input handling
* Fix ChatMessage usage across packages and samples
Update all remaining ChatMessage(role=..., text=...) to use new
ChatMessage('role', ['text']) signature.
* Fix Role string usage and response format parsing
- Fix redis provider: remove .value access on string literals
- Fix durabletask ensure_response_format: set _response_format before accessing .value
* Fix ollama .value and ai_model_id issues, handle None in content list
- Fix ollama _chat_client: remove .value on string literals
- Fix ollama _chat_client: rename ai_model_id to model_id
- Fix _parse_content_list: skip None values gracefully
* Fix A2AAgent type signature to include Content
* Fix Role/FinishReason NewType dict annotations and improve test coverage to 95%
* Fix mypy errors for Role/FinishReason NewType usage
* Fix Role.TOOL and Role.ASSISTANT usage in _orchestrator_helpers.py
* Fix Role NewType usage in durabletask _models.py
596 lines
22 KiB
Python
596 lines
22 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import copy
|
|
import os
|
|
from collections.abc import Awaitable, Callable
|
|
from typing import Any
|
|
|
|
import pytest
|
|
from pytest import MonkeyPatch, mark, param
|
|
from samples.getting_started.agents.azure_ai.azure_ai_with_function_tools import (
|
|
mixed_tools_example as azure_ai_with_function_tools_mixed,
|
|
)
|
|
from samples.getting_started.agents.azure_ai.azure_ai_with_function_tools import (
|
|
tools_on_agent_level as azure_ai_with_function_tools_agent,
|
|
)
|
|
from samples.getting_started.agents.azure_ai.azure_ai_with_function_tools import (
|
|
tools_on_run_level as azure_ai_with_function_tools_run,
|
|
)
|
|
|
|
from samples.getting_started.agents.azure_ai.azure_ai_basic import (
|
|
main as azure_ai_basic,
|
|
)
|
|
from samples.getting_started.agents.azure_ai.azure_ai_with_code_interpreter import (
|
|
main as azure_ai_with_code_interpreter,
|
|
)
|
|
from samples.getting_started.agents.azure_ai.azure_ai_with_existing_agent import (
|
|
main as azure_ai_with_existing_agent,
|
|
)
|
|
from samples.getting_started.agents.azure_ai.azure_ai_with_explicit_settings import (
|
|
main as azure_ai_with_explicit_settings,
|
|
)
|
|
from samples.getting_started.agents.azure_ai.azure_ai_with_local_mcp import (
|
|
main as azure_ai_with_local_mcp,
|
|
)
|
|
from samples.getting_started.agents.azure_ai.azure_ai_with_thread import (
|
|
main as azure_ai_with_thread,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_assistants_basic import (
|
|
main as azure_assistants_basic,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_assistants_with_code_interpreter import (
|
|
main as azure_assistants_with_code_interpreter,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_assistants_with_existing_assistant import (
|
|
main as azure_assistants_with_existing_assistant,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_assistants_with_explicit_settings import (
|
|
main as azure_assistants_with_explicit_settings,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_assistants_with_function_tools import (
|
|
main as azure_assistants_with_function_tools,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_assistants_with_thread import (
|
|
main as azure_assistants_with_thread,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_chat_client_basic import (
|
|
main as azure_chat_client_basic,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_chat_client_with_explicit_settings import (
|
|
main as azure_chat_client_with_explicit_settings,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_chat_client_with_function_tools import (
|
|
main as azure_chat_client_with_function_tools,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_chat_client_with_thread import (
|
|
main as azure_chat_client_with_thread,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_responses_client_basic import (
|
|
main as azure_responses_client_basic,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_responses_client_with_code_interpreter import (
|
|
main as azure_responses_client_with_code_interpreter,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_responses_client_with_explicit_settings import (
|
|
main as azure_responses_client_with_explicit_settings,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_responses_client_with_function_tools import (
|
|
main as azure_responses_client_with_function_tools,
|
|
)
|
|
from samples.getting_started.agents.azure_openai.azure_responses_client_with_thread import (
|
|
main as azure_responses_client_with_thread,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_assistants_basic import (
|
|
main as openai_assistants_basic,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_assistants_with_code_interpreter import (
|
|
main as openai_assistants_with_code_interpreter,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_assistants_with_existing_assistant import (
|
|
main as openai_assistants_with_existing_assistant,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_assistants_with_explicit_settings import (
|
|
main as openai_assistants_with_explicit_settings,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_assistants_with_file_search import (
|
|
main as openai_assistants_with_file_search,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_assistants_with_function_tools import (
|
|
main as openai_assistants_with_function_tools,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_assistants_with_thread import (
|
|
main as openai_assistants_with_thread,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_chat_client_basic import (
|
|
main as openai_chat_client_basic,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_chat_client_with_explicit_settings import (
|
|
main as openai_chat_client_with_explicit_settings,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_chat_client_with_function_tools import (
|
|
main as openai_chat_client_with_function_tools,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_chat_client_with_local_mcp import (
|
|
main as openai_chat_client_with_local_mcp,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_chat_client_with_thread import (
|
|
main as openai_chat_client_with_thread,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_chat_client_with_web_search import (
|
|
main as openai_chat_client_with_web_search,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_basic import (
|
|
main as openai_responses_client_basic,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_reasoning import (
|
|
main as openai_responses_client_reasoning,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_with_code_interpreter import (
|
|
main as openai_responses_client_with_code_interpreter,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_with_explicit_settings import (
|
|
main as openai_responses_client_with_explicit_settings,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_with_file_search import (
|
|
main as openai_responses_client_with_file_search,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_with_function_tools import (
|
|
main as openai_responses_client_with_function_tools,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_with_local_mcp import (
|
|
main as openai_responses_client_with_local_mcp,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_with_thread import (
|
|
main as openai_responses_client_with_thread,
|
|
)
|
|
from samples.getting_started.agents.openai.openai_responses_client_with_web_search import (
|
|
main as openai_responses_client_with_web_search,
|
|
)
|
|
|
|
# Environment variable for controlling sample tests
|
|
RUN_SAMPLES_TESTS = "RUN_SAMPLES_TESTS"
|
|
|
|
# All agent samples across providers
|
|
agent_samples = [
|
|
# Azure Assistants Agent samples
|
|
param(
|
|
azure_assistants_basic,
|
|
[], # Non-interactive sample
|
|
id="azure_assistants_basic",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_assistants_with_code_interpreter,
|
|
[], # Non-interactive sample
|
|
id="azure_assistants_with_code_interpreter",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_assistants_with_function_tools,
|
|
[], # Non-interactive sample
|
|
id="azure_assistants_with_function_tools",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_assistants_with_existing_assistant,
|
|
[], # Non-interactive sample
|
|
id="azure_assistants_with_existing_assistant",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_assistants_with_explicit_settings,
|
|
[], # Non-interactive sample
|
|
id="azure_assistants_with_explicit_settings",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_assistants_with_thread,
|
|
[], # Non-interactive sample
|
|
id="azure_assistants_with_thread",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
# Azure Chat Client Agent samples
|
|
param(
|
|
azure_chat_client_basic,
|
|
[], # Non-interactive sample
|
|
id="azure_chat_client_basic",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_chat_client_with_explicit_settings,
|
|
[], # Non-interactive sample
|
|
id="azure_chat_client_with_explicit_settings",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_chat_client_with_function_tools,
|
|
[], # Non-interactive sample
|
|
id="azure_chat_client_with_function_tools",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_chat_client_with_thread,
|
|
[], # Non-interactive sample
|
|
id="azure_chat_client_with_thread",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
# Azure Responses Client Agent samples
|
|
param(
|
|
azure_responses_client_basic,
|
|
[], # Non-interactive sample
|
|
id="azure_responses_client_basic",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_responses_client_with_code_interpreter,
|
|
[], # Non-interactive sample
|
|
id="azure_responses_client_with_code_interpreter",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_responses_client_with_explicit_settings,
|
|
[], # Non-interactive sample
|
|
id="azure_responses_client_with_explicit_settings",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_responses_client_with_function_tools,
|
|
[], # Non-interactive sample
|
|
id="azure_responses_client_with_function_tools",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_responses_client_with_thread,
|
|
[], # Non-interactive sample
|
|
id="azure_responses_client_with_thread",
|
|
marks=[
|
|
pytest.mark.azure,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
# Azure AI Agent samples
|
|
param(
|
|
azure_ai_basic,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_basic",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_ai_with_code_interpreter,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_with_code_interpreter",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_ai_with_existing_agent,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_with_existing_agent",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_ai_with_explicit_settings,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_with_explicit_settings",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_ai_with_function_tools_agent,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_with_function_tools",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_ai_with_function_tools_run,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_with_function_tools",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_ai_with_function_tools_mixed,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_with_function_tools",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_ai_with_thread,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_with_thread",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
azure_ai_with_local_mcp,
|
|
[], # Non-interactive sample
|
|
id="azure_ai_with_local_mcp",
|
|
marks=[
|
|
pytest.mark.azure_ai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
# OpenAI Assistants Agent samples
|
|
param(
|
|
openai_assistants_basic,
|
|
[], # Non-interactive sample
|
|
id="openai_assistants_basic",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_assistants_with_code_interpreter,
|
|
[], # Non-interactive sample
|
|
id="openai_assistants_with_code_interpreter",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_assistants_with_existing_assistant,
|
|
[], # Non-interactive sample
|
|
id="openai_assistants_with_existing_assistant",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_assistants_with_explicit_settings,
|
|
[], # Non-interactive sample
|
|
id="openai_assistants_with_explicit_settings",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_assistants_with_file_search,
|
|
[], # Non-interactive sample
|
|
id="openai_assistants_with_file_search",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
pytest.mark.skip(reason="OpenAI file search functionality is currently broken - tracked in GitHub issue"),
|
|
],
|
|
),
|
|
param(
|
|
openai_assistants_with_function_tools,
|
|
[], # Non-interactive sample
|
|
id="openai_assistants_with_function_tools",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_assistants_with_thread,
|
|
[], # Non-interactive sample
|
|
id="openai_assistants_with_thread",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
# OpenAI Chat Client Agent samples
|
|
param(
|
|
openai_chat_client_basic,
|
|
[], # Non-interactive sample
|
|
id="openai_chat_client_basic",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_chat_client_with_explicit_settings,
|
|
[], # Non-interactive sample
|
|
id="openai_chat_client_with_explicit_settings",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_chat_client_with_function_tools,
|
|
[], # Non-interactive sample
|
|
id="openai_chat_client_with_function_tools",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_chat_client_with_local_mcp,
|
|
[], # Non-interactive sample
|
|
id="openai_chat_client_with_local_mcp",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_chat_client_with_thread,
|
|
[], # Non-interactive sample
|
|
id="openai_chat_client_with_thread",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_chat_client_with_web_search,
|
|
[], # Non-interactive sample
|
|
id="openai_chat_client_with_web_search",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
# OpenAI Responses Client Agent samples
|
|
param(
|
|
openai_responses_client_basic,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_basic",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_responses_client_reasoning,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_reasoning",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_responses_client_with_code_interpreter,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_with_code_interpreter",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_responses_client_with_explicit_settings,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_with_explicit_settings",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_responses_client_with_file_search,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_with_file_search",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
pytest.mark.skip(reason="OpenAI file search functionality is currently broken - tracked in GitHub issue"),
|
|
],
|
|
),
|
|
param(
|
|
openai_responses_client_with_function_tools,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_with_function_tools",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_responses_client_with_local_mcp,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_with_local_mcp",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_responses_client_with_thread,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_with_thread",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
param(
|
|
openai_responses_client_with_web_search,
|
|
[], # Non-interactive sample
|
|
id="openai_responses_client_with_web_search",
|
|
marks=[
|
|
pytest.mark.openai,
|
|
pytest.mark.skipif(os.getenv(RUN_SAMPLES_TESTS, None) is None, reason="Not running sample tests."),
|
|
],
|
|
),
|
|
]
|
|
|
|
|
|
@pytest.mark.flaky
|
|
@mark.parametrize("sample, responses", agent_samples)
|
|
async def test_agent_samples(sample: Callable[..., Awaitable[Any]], responses: list[str], monkeypatch: MonkeyPatch):
|
|
"""Test agent samples with input mocking and retry logic."""
|
|
saved_responses = copy.deepcopy(responses)
|
|
|
|
def reset():
|
|
responses.clear()
|
|
responses.extend(saved_responses)
|
|
|
|
def mock_input(prompt: str = "") -> str:
|
|
return responses.pop(0) if responses else "exit"
|
|
|
|
monkeypatch.setattr("builtins.input", mock_input)
|
|
await sample
|