Python: [BREAKING] update to v1.0.0 (#5062)

* updates to final deprecated pieces and versions

* fix mypy

* fix readme links
This commit is contained in:
Eduard van Valkenburg
2026-04-02 17:26:30 +02:00
committed by GitHub
Unverified
parent 5f06b68535
commit 3446eb8d5d
171 changed files with 2580 additions and 2392 deletions
@@ -219,7 +219,7 @@ class FoundryMemoryProvider(ContextProvider):
if line_separated_memories:
context.extend_messages(
self.source_id,
[Message(role="user", text=f"{self.context_prompt}\n{line_separated_memories}")],
[Message(role="user", contents=[f"{self.context_prompt}\n{line_separated_memories}"])],
)
except Exception as e:
# Log but don't fail - memory retrieval is non-critical
+4 -4
View File
@@ -4,7 +4,7 @@ description = "Microsoft Foundry integrations for Microsoft Agent Framework."
authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}]
readme = "README.md"
requires-python = ">=3.10"
version = "1.0.0rc6"
version = "1.0.0"
license-files = ["LICENSE"]
urls.homepage = "https://aka.ms/agent-framework"
urls.source = "https://github.com/microsoft/agent-framework/tree/main/python"
@@ -12,7 +12,7 @@ urls.release_notes = "https://github.com/microsoft/agent-framework/releases?q=ta
urls.issues = "https://github.com/microsoft/agent-framework/issues"
classifiers = [
"License :: OSI Approved :: MIT License",
"Development Status :: 4 - Beta",
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
@@ -23,8 +23,8 @@ classifiers = [
"Typing :: Typed",
]
dependencies = [
"agent-framework-core>=1.0.0rc6",
"agent-framework-openai>=1.0.0rc6",
"agent-framework-core>=1.0.0,<2",
"agent-framework-openai>=1.0.0,<2",
"azure-ai-inference>=1.0.0b9,<1.0.0b10",
"azure-ai-projects>=2.0.0,<3.0",
]
@@ -359,7 +359,7 @@ async def test_web_search_tool_with_location() -> None:
assert web_search_tool.user_location.city == "Seattle"
assert web_search_tool.user_location.country == "US"
_, run_options, _ = await client._prepare_request(
messages=[Message(role="user", text="What's the weather?")],
messages=[Message(role="user", contents=["What's the weather?"])],
options={"tools": [web_search_tool], "tool_choice": "auto"},
)
@@ -387,7 +387,7 @@ async def test_code_interpreter_tool_variations() -> None:
assert code_tool_with_files.container.file_ids == ["file1", "file2"]
_, run_options, _ = await client._prepare_request(
messages=[Message(role="user", text="Process these files")],
messages=[Message(role="user", contents=["Process these files"])],
options={"tools": [code_tool_with_files]},
)
@@ -428,7 +428,7 @@ async def test_chat_message_parsing_with_function_calls() -> None:
)
function_result = Content.from_function_result(call_id="test-call-id", result="Function executed successfully")
messages = [
Message(role="user", text="Call a function"),
Message(role="user", contents=["Call a function"]),
Message(role="assistant", contents=[function_call]),
Message(role="tool", contents=[function_result]),
]
@@ -471,7 +471,7 @@ async def test_content_filter_exception() -> None:
client.client.responses.create.side_effect = mock_error
with pytest.raises(OpenAIContentFilterException) as exc_info:
await client.get_response(messages=[Message(role="user", text="Test message")])
await client.get_response(messages=[Message(role="user", contents=["Test message"])])
assert "content error" in str(exc_info.value)
@@ -495,7 +495,7 @@ async def test_response_format_parse_path() -> None:
client.client.responses.parse = AsyncMock(return_value=mock_parsed_response)
response = await client.get_response(
messages=[Message(role="user", text="Test message")],
messages=[Message(role="user", contents=["Test message"])],
options={"response_format": OutputStruct, "store": True},
)
assert response.response_id == "parsed_response_123"
@@ -523,7 +523,7 @@ async def test_response_format_parse_path_with_conversation_id() -> None:
client.client.responses.parse = AsyncMock(return_value=mock_parsed_response)
response = await client.get_response(
messages=[Message(role="user", text="Test message")],
messages=[Message(role="user", contents=["Test message"])],
options={"response_format": OutputStruct, "store": True},
)
assert response.response_id == "parsed_response_123"
@@ -563,7 +563,7 @@ async def test_response_format_dict_parse_path() -> None:
client.client.responses.create = AsyncMock(return_value=mock_response)
response = await client.get_response(
messages=[Message(role="user", text="Test message")],
messages=[Message(role="user", contents=["Test message"])],
options={"response_format": response_format},
)
@@ -589,7 +589,7 @@ async def test_bad_request_error_non_content_filter() -> None:
with pytest.raises(ChatClientException) as exc_info:
await client.get_response(
messages=[Message(role="user", text="Test message")],
messages=[Message(role="user", contents=["Test message"])],
options={"response_format": OutputStruct},
)
@@ -656,12 +656,12 @@ async def test_integration_options(
client.function_invocation_configuration["max_iterations"] = 2
if option_name.startswith("tools") or option_name.startswith("tool_choice"):
messages = [Message(role="user", text="What is the weather in Seattle?")]
messages = [Message(role="user", contents=["What is the weather in Seattle?"])]
elif option_name.startswith("response_format"):
messages = [Message(role="user", text="The weather in Seattle is sunny")]
messages.append(Message(role="user", text="What is the weather in Seattle?"))
messages = [Message(role="user", contents=["The weather in Seattle is sunny"])]
messages.append(Message(role="user", contents=["What is the weather in Seattle?"]))
else:
messages = [Message(role="user", text="Say 'Hello World' briefly.")]
messages = [Message(role="user", contents=["Say 'Hello World' briefly."])]
options: dict[str, Any] = {option_name: option_value}
if option_name.startswith("tool_choice"):
@@ -700,7 +700,7 @@ async def test_integration_web_search() -> None:
"messages": [
Message(
role="user",
text="Who are the main characters of Kpop Demon Hunters? Do a web search to find the answer.",
contents=["Who are the main characters of Kpop Demon Hunters? Do a web search to find the answer."],
)
],
"options": {"tool_choice": "auto", "tools": [web_search_tool]},
@@ -728,7 +728,7 @@ async def test_integration_tool_rich_content_image() -> None:
client = FoundryChatClient(credential=AzureCliCredential())
client.function_invocation_configuration["max_iterations"] = 2
messages = [Message(role="user", text="Call the get_test_image tool and describe what you see.")]
messages = [Message(role="user", contents=["Call the get_test_image tool and describe what you see."])]
options: dict[str, Any] = {"tools": [get_test_image], "tool_choice": "auto"}
response = await client.get_response(messages=messages, options=options, stream=True).get_final_response()
@@ -156,7 +156,7 @@ async def test_retrieves_static_memories_on_first_run(mock_project_client: Async
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="Hello")], session_id="s1")
ctx = SessionContext(input_messages=[Message(role="user", contents=["Hello"])], session_id="s1")
await provider.before_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx, state=session.state.setdefault(provider.source_id, {})
@@ -191,7 +191,7 @@ async def test_contextual_memories_added_to_context(mock_project_client: AsyncMo
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="Hello")], session_id="s1")
ctx = SessionContext(input_messages=[Message(role="user", contents=["Hello"])], session_id="s1")
await provider.before_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx, state=session.state.setdefault(provider.source_id, {})
@@ -218,7 +218,7 @@ async def test_empty_input_skips_contextual_search(mock_project_client: AsyncMoc
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="")], session_id="s1")
ctx = SessionContext(input_messages=[Message(role="user", contents=[""])], session_id="s1")
await provider.before_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx, state=session.state.setdefault(provider.source_id, {})
@@ -240,7 +240,7 @@ async def test_empty_search_results_no_messages(mock_project_client: AsyncMock)
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="test")], session_id="s1")
ctx = SessionContext(input_messages=[Message(role="user", contents=["test"])], session_id="s1")
await provider.before_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx, state=session.state.setdefault(provider.source_id, {})
@@ -265,7 +265,7 @@ async def test_static_memories_only_retrieved_once(mock_project_client: AsyncMoc
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="Hello")], session_id="s1")
ctx = SessionContext(input_messages=[Message(role="user", contents=["Hello"])], session_id="s1")
# First call
await provider.before_run( # type: ignore[arg-type]
@@ -280,7 +280,7 @@ async def test_static_memories_only_retrieved_once(mock_project_client: AsyncMoc
mock_project_client.beta.memory_stores.search_memories.return_value = contextual_result2
# Second call - should only search contextual, not static
ctx2 = SessionContext(input_messages=[Message(role="user", text="World")], session_id="s1")
ctx2 = SessionContext(input_messages=[Message(role="user", contents=["World"])], session_id="s1")
await provider.before_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx2, state=session.state.setdefault(provider.source_id, {})
)
@@ -296,7 +296,7 @@ async def test_handles_search_exception_gracefully(mock_project_client: AsyncMoc
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="Hello")], session_id="s1")
ctx = SessionContext(input_messages=[Message(role="user", contents=["Hello"])], session_id="s1")
# Should not raise exception
await provider.before_run( # type: ignore[arg-type]
@@ -321,8 +321,8 @@ async def test_stores_input_and_response(mock_project_client: AsyncMock) -> None
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="question")], session_id="s1")
ctx._response = AgentResponse(messages=[Message(role="assistant", text="answer")])
ctx = SessionContext(input_messages=[Message(role="user", contents=["question"])], session_id="s1")
ctx._response = AgentResponse(messages=[Message(role="assistant", contents=["answer"])])
await provider.after_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx, state=session.state.setdefault(provider.source_id, {})
@@ -350,12 +350,12 @@ async def test_only_stores_user_assistant_system(mock_project_client: AsyncMock)
session = AgentSession(session_id="test-session")
ctx = SessionContext(
input_messages=[
Message(role="user", text="hello"),
Message(role="tool", text="tool output"),
Message(role="user", contents=["hello"]),
Message(role="tool", contents=["tool output"]),
],
session_id="s1",
)
ctx._response = AgentResponse(messages=[Message(role="assistant", text="reply")])
ctx._response = AgentResponse(messages=[Message(role="assistant", contents=["reply"])])
await provider.after_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx, state=session.state.setdefault(provider.source_id, {})
@@ -377,8 +377,8 @@ async def test_skips_empty_messages(mock_project_client: AsyncMock) -> None:
session = AgentSession(session_id="test-session")
ctx = SessionContext(
input_messages=[
Message(role="user", text=""),
Message(role="user", text=" "),
Message(role="user", contents=[""]),
Message(role="user", contents=[" "]),
],
session_id="s1",
)
@@ -402,8 +402,8 @@ async def test_uses_configured_update_delay(mock_project_client: AsyncMock) -> N
update_delay=60,
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="hi")], session_id="s1")
ctx._response = AgentResponse(messages=[Message(role="assistant", text="hey")])
ctx = SessionContext(input_messages=[Message(role="user", contents=["hi"])], session_id="s1")
ctx._response = AgentResponse(messages=[Message(role="assistant", contents=["hey"])])
await provider.after_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx, state=session.state.setdefault(provider.source_id, {})
@@ -427,8 +427,8 @@ async def test_uses_previous_update_id_for_incremental_updates(mock_project_clie
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx1 = SessionContext(input_messages=[Message(role="user", text="first")], session_id="s1")
ctx1._response = AgentResponse(messages=[Message(role="assistant", text="response1")])
ctx1 = SessionContext(input_messages=[Message(role="user", contents=["first"])], session_id="s1")
ctx1._response = AgentResponse(messages=[Message(role="assistant", contents=["response1"])])
# First update
await provider.after_run( # type: ignore[arg-type]
@@ -437,8 +437,8 @@ async def test_uses_previous_update_id_for_incremental_updates(mock_project_clie
assert session.state[provider.source_id]["previous_update_id"] == "update-1"
# Second update should use previous_update_id
ctx2 = SessionContext(input_messages=[Message(role="user", text="second")], session_id="s1")
ctx2._response = AgentResponse(messages=[Message(role="assistant", text="response2")])
ctx2 = SessionContext(input_messages=[Message(role="user", contents=["second"])], session_id="s1")
ctx2._response = AgentResponse(messages=[Message(role="assistant", contents=["response2"])])
await provider.after_run( # type: ignore[arg-type]
agent=None, session=session, context=ctx2, state=session.state.setdefault(provider.source_id, {})
@@ -458,8 +458,8 @@ async def test_handles_update_exception_gracefully(mock_project_client: AsyncMoc
scope="user_123",
)
session = AgentSession(session_id="test-session")
ctx = SessionContext(input_messages=[Message(role="user", text="hi")], session_id="s1")
ctx._response = AgentResponse(messages=[Message(role="assistant", text="hey")])
ctx = SessionContext(input_messages=[Message(role="user", contents=["hi"])], session_id="s1")
ctx._response = AgentResponse(messages=[Message(role="assistant", contents=["hey"])])
# Should not raise exception
await provider.after_run( # type: ignore[arg-type]