mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
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:
@@ -82,10 +82,13 @@ class PurviewPolicyMiddleware(AgentMiddleware):
|
||||
if should_block_prompt:
|
||||
from agent_framework import AgentResponse, Message
|
||||
|
||||
msg = self._settings.get("blocked_prompt_message", None) or "Prompt blocked by policy"
|
||||
|
||||
context.result = AgentResponse(
|
||||
messages=[
|
||||
Message(
|
||||
role="system", text=self._settings.get("blocked_prompt_message", "Prompt blocked by policy")
|
||||
role="system",
|
||||
contents=[msg],
|
||||
)
|
||||
]
|
||||
)
|
||||
@@ -119,11 +122,13 @@ class PurviewPolicyMiddleware(AgentMiddleware):
|
||||
if should_block_response:
|
||||
from agent_framework import AgentResponse, Message
|
||||
|
||||
msg = self._settings.get("blocked_response_message", None) or "Response blocked by policy"
|
||||
|
||||
context.result = AgentResponse(
|
||||
messages=[
|
||||
Message(
|
||||
role="system",
|
||||
text=self._settings.get("blocked_response_message", "Response blocked by policy"),
|
||||
contents=[msg],
|
||||
)
|
||||
]
|
||||
)
|
||||
@@ -189,7 +194,8 @@ class PurviewChatPolicyMiddleware(ChatMiddleware):
|
||||
from agent_framework import ChatResponse, Message
|
||||
|
||||
blocked_message = Message(
|
||||
role="system", text=self._settings.get("blocked_prompt_message", "Prompt blocked by policy")
|
||||
role="system",
|
||||
contents=[self._settings.get("blocked_prompt_message", None) or "Prompt blocked by policy"],
|
||||
)
|
||||
context.result = ChatResponse(messages=[blocked_message])
|
||||
raise MiddlewareTermination
|
||||
@@ -224,7 +230,9 @@ class PurviewChatPolicyMiddleware(ChatMiddleware):
|
||||
|
||||
blocked_message = Message(
|
||||
role="system",
|
||||
text=self._settings.get("blocked_response_message", "Response blocked by policy"),
|
||||
contents=[
|
||||
self._settings.get("blocked_response_message", None) or "Response blocked by policy"
|
||||
],
|
||||
)
|
||||
context.result = ChatResponse(messages=[blocked_message])
|
||||
else:
|
||||
|
||||
@@ -4,7 +4,7 @@ description = "Microsoft Purview (Graph dataSecurityAndGovernance) integration f
|
||||
authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}]
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10"
|
||||
version = "1.0.0b260330"
|
||||
version = "1.0.0b260402"
|
||||
license-files = ["LICENSE"]
|
||||
urls.homepage = "https://github.com/microsoft/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"
|
||||
urls.issues = "https://github.com/microsoft/agent-framework/issues"
|
||||
classifiers = [
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Development Status :: 3 - Alpha",
|
||||
"Development Status :: 4 - Beta",
|
||||
"Intended Audience :: Developers",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
@@ -24,7 +24,7 @@ classifiers = [
|
||||
"Typing :: Typed",
|
||||
]
|
||||
dependencies = [
|
||||
"agent-framework-core>=1.0.0rc6",
|
||||
"agent-framework-core>=1.0.0,<2",
|
||||
"azure-core>=1.30.0,<2",
|
||||
"httpx>=0.27.0,<0.29",
|
||||
]
|
||||
|
||||
@@ -37,7 +37,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
client = DummyChatClient()
|
||||
chat_options = MagicMock()
|
||||
chat_options.model = "test-model"
|
||||
return ChatContext(client=client, messages=[Message(role="user", text="Hello")], options=chat_options)
|
||||
return ChatContext(client=client, messages=[Message(role="user", contents=["Hello"])], options=chat_options)
|
||||
|
||||
async def test_initialization(self, middleware: PurviewChatPolicyMiddleware) -> None:
|
||||
assert middleware._client is not None
|
||||
@@ -55,7 +55,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
class Result:
|
||||
def __init__(self):
|
||||
self.messages = [Message(role="assistant", text="Hi there")]
|
||||
self.messages = [Message(role="assistant", contents=["Hi there"])]
|
||||
|
||||
chat_context.result = Result()
|
||||
|
||||
@@ -91,7 +91,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
async def mock_next() -> None:
|
||||
class Result:
|
||||
def __init__(self):
|
||||
self.messages = [Message(role="assistant", text="Sensitive output")] # pragma: no cover
|
||||
self.messages = [Message(role="assistant", contents=["Sensitive output"])] # pragma: no cover
|
||||
|
||||
chat_context.result = Result()
|
||||
|
||||
@@ -108,7 +108,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
chat_options.model = "test-model"
|
||||
streaming_context = ChatContext(
|
||||
client=client,
|
||||
messages=[Message(role="user", text="Hello")],
|
||||
messages=[Message(role="user", contents=["Hello"])],
|
||||
options=chat_options,
|
||||
stream=True,
|
||||
)
|
||||
@@ -140,7 +140,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="Response")]
|
||||
result.messages = [Message(role="assistant", contents=["Response"])]
|
||||
chat_context.result = result
|
||||
|
||||
await middleware.process(chat_context, mock_next)
|
||||
@@ -164,7 +164,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="Response")]
|
||||
result.messages = [Message(role="assistant", contents=["Response"])]
|
||||
chat_context.result = result
|
||||
|
||||
await middleware.process(chat_context, mock_next)
|
||||
@@ -187,7 +187,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
client = DummyChatClient()
|
||||
chat_options = MagicMock()
|
||||
chat_options.model = "test-model"
|
||||
context = ChatContext(client=client, messages=[Message(role="user", text="Hello")], options=chat_options)
|
||||
context = ChatContext(client=client, messages=[Message(role="user", contents=["Hello"])], options=chat_options)
|
||||
|
||||
async def mock_process_messages(*args, **kwargs):
|
||||
raise PurviewPaymentRequiredError("Payment required")
|
||||
@@ -211,7 +211,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
client = DummyChatClient()
|
||||
chat_options = MagicMock()
|
||||
chat_options.model = "test-model"
|
||||
context = ChatContext(client=client, messages=[Message(role="user", text="Hello")], options=chat_options)
|
||||
context = ChatContext(client=client, messages=[Message(role="user", contents=["Hello"])], options=chat_options)
|
||||
|
||||
call_count = 0
|
||||
|
||||
@@ -226,7 +226,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="OK")]
|
||||
result.messages = [Message(role="assistant", contents=["OK"])]
|
||||
context.result = result
|
||||
|
||||
with pytest.raises(PurviewPaymentRequiredError):
|
||||
@@ -242,7 +242,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
client = DummyChatClient()
|
||||
chat_options = MagicMock()
|
||||
chat_options.model = "test-model"
|
||||
context = ChatContext(client=client, messages=[Message(role="user", text="Hello")], options=chat_options)
|
||||
context = ChatContext(client=client, messages=[Message(role="user", contents=["Hello"])], options=chat_options)
|
||||
|
||||
async def mock_process_messages(*args, **kwargs):
|
||||
raise PurviewPaymentRequiredError("Payment required")
|
||||
@@ -251,7 +251,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="Response")]
|
||||
result.messages = [Message(role="assistant", contents=["Response"])]
|
||||
context.result = result
|
||||
|
||||
# Should not raise, just log
|
||||
@@ -282,7 +282,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
client = DummyChatClient()
|
||||
chat_options = MagicMock()
|
||||
chat_options.model = "test-model"
|
||||
context = ChatContext(client=client, messages=[Message(role="user", text="Hello")], options=chat_options)
|
||||
context = ChatContext(client=client, messages=[Message(role="user", contents=["Hello"])], options=chat_options)
|
||||
|
||||
async def mock_process_messages(*args, **kwargs):
|
||||
raise ValueError("Some error")
|
||||
@@ -291,7 +291,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="Response")]
|
||||
result.messages = [Message(role="assistant", contents=["Response"])]
|
||||
context.result = result
|
||||
|
||||
# Should not raise, just log
|
||||
@@ -309,7 +309,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
client = DummyChatClient()
|
||||
chat_options = MagicMock()
|
||||
chat_options.model = "test-model"
|
||||
context = ChatContext(client=client, messages=[Message(role="user", text="Hello")], options=chat_options)
|
||||
context = ChatContext(client=client, messages=[Message(role="user", contents=["Hello"])], options=chat_options)
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", side_effect=ValueError("boom")):
|
||||
|
||||
@@ -329,7 +329,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
client = DummyChatClient()
|
||||
chat_options = MagicMock()
|
||||
chat_options.model = "test-model"
|
||||
context = ChatContext(client=client, messages=[Message(role="user", text="Hello")], options=chat_options)
|
||||
context = ChatContext(client=client, messages=[Message(role="user", contents=["Hello"])], options=chat_options)
|
||||
|
||||
call_count = 0
|
||||
|
||||
@@ -344,7 +344,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="OK")]
|
||||
result.messages = [Message(role="assistant", contents=["OK"])]
|
||||
context.result = result
|
||||
|
||||
with pytest.raises(ValueError, match="post"):
|
||||
@@ -355,7 +355,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
) -> None:
|
||||
"""Test that session_id is extracted from context.options['conversation_id']."""
|
||||
chat_client = DummyChatClient()
|
||||
messages = [Message(role="user", text="Hello")]
|
||||
messages = [Message(role="user", contents=["Hello"])]
|
||||
options = {"conversation_id": "conv-123", "model": "test-model"}
|
||||
context = ChatContext(client=chat_client, messages=messages, options=options)
|
||||
|
||||
@@ -363,7 +363,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="Hi")]
|
||||
result.messages = [Message(role="assistant", contents=["Hi"])]
|
||||
context.result = result
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
@@ -377,14 +377,14 @@ class TestPurviewChatPolicyMiddleware:
|
||||
) -> None:
|
||||
"""Test that session_id is None when options don't contain conversation_id."""
|
||||
chat_client = DummyChatClient()
|
||||
messages = [Message(role="user", text="Hello")]
|
||||
messages = [Message(role="user", contents=["Hello"])]
|
||||
context = ChatContext(client=chat_client, messages=messages, options=None)
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")) as mock_proc:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="Hi")]
|
||||
result.messages = [Message(role="assistant", contents=["Hi"])]
|
||||
context.result = result
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
@@ -395,7 +395,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
async def test_chat_middleware_session_id_used_in_post_check(self, middleware: PurviewChatPolicyMiddleware) -> None:
|
||||
"""Test that session_id is passed to post-check process_messages call."""
|
||||
chat_client = DummyChatClient()
|
||||
messages = [Message(role="user", text="Hello")]
|
||||
messages = [Message(role="user", contents=["Hello"])]
|
||||
options = {"conversation_id": "conv-999"}
|
||||
context = ChatContext(client=chat_client, messages=messages, options=options)
|
||||
|
||||
@@ -403,7 +403,7 @@ class TestPurviewChatPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
result = MagicMock()
|
||||
result.messages = [Message(role="assistant", text="Response")]
|
||||
result.messages = [Message(role="assistant", contents=["Response"])]
|
||||
context.result = result
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -50,7 +50,7 @@ class TestPurviewPolicyMiddleware:
|
||||
self, middleware: PurviewPolicyMiddleware, mock_agent: MagicMock
|
||||
) -> None:
|
||||
"""Test middleware allows prompt that passes policy check."""
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello, how are you?")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello, how are you?"])])
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")):
|
||||
next_called = False
|
||||
@@ -58,7 +58,7 @@ class TestPurviewPolicyMiddleware:
|
||||
async def mock_next() -> None:
|
||||
nonlocal next_called
|
||||
next_called = True
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="I'm good, thanks!")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["I'm good, thanks!"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -69,7 +69,7 @@ class TestPurviewPolicyMiddleware:
|
||||
self, middleware: PurviewPolicyMiddleware, mock_agent: MagicMock
|
||||
) -> None:
|
||||
"""Test middleware blocks prompt that violates policy."""
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Sensitive information")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Sensitive information"])])
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(True, "user-123")):
|
||||
next_called = False
|
||||
@@ -89,7 +89,7 @@ class TestPurviewPolicyMiddleware:
|
||||
|
||||
async def test_middleware_checks_response(self, middleware: PurviewPolicyMiddleware, mock_agent: MagicMock) -> None:
|
||||
"""Test middleware checks agent response for policy violations."""
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])])
|
||||
|
||||
call_count = 0
|
||||
|
||||
@@ -103,7 +103,7 @@ class TestPurviewPolicyMiddleware:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(
|
||||
messages=[Message(role="assistant", text="Here's some sensitive information")]
|
||||
messages=[Message(role="assistant", contents=["Here's some sensitive information"])]
|
||||
)
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
@@ -121,7 +121,7 @@ class TestPurviewPolicyMiddleware:
|
||||
# Set ignore_exceptions to True so AttributeError is caught and logged
|
||||
middleware._settings["ignore_exceptions"] = True
|
||||
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])])
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")):
|
||||
|
||||
@@ -138,12 +138,12 @@ class TestPurviewPolicyMiddleware:
|
||||
"""Test middleware passes correct activity type to processor."""
|
||||
from agent_framework_purview._models import Activity
|
||||
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Test")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Test"])])
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")) as mock_process:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Response")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Response"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -157,13 +157,13 @@ class TestPurviewPolicyMiddleware:
|
||||
self, middleware: PurviewPolicyMiddleware, mock_agent: MagicMock
|
||||
) -> None:
|
||||
"""Test that streaming results skip post-check evaluation."""
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])])
|
||||
context.stream = True
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")) as mock_proc:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="streaming")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["streaming"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -175,7 +175,7 @@ class TestPurviewPolicyMiddleware:
|
||||
"""Test that 402 in pre-check is raised when ignore_payment_required=False."""
|
||||
from agent_framework_purview._exceptions import PurviewPaymentRequiredError
|
||||
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])])
|
||||
|
||||
with patch.object(
|
||||
middleware._processor,
|
||||
@@ -195,7 +195,7 @@ class TestPurviewPolicyMiddleware:
|
||||
"""Test that 402 in post-check is raised when ignore_payment_required=False."""
|
||||
from agent_framework_purview._exceptions import PurviewPaymentRequiredError
|
||||
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])])
|
||||
|
||||
call_count = 0
|
||||
|
||||
@@ -209,7 +209,7 @@ class TestPurviewPolicyMiddleware:
|
||||
with patch.object(middleware._processor, "process_messages", side_effect=side_effect):
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="OK")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["OK"])])
|
||||
|
||||
with pytest.raises(PurviewPaymentRequiredError):
|
||||
await middleware.process(context, mock_next)
|
||||
@@ -220,7 +220,7 @@ class TestPurviewPolicyMiddleware:
|
||||
"""Test that post-check exceptions are propagated when ignore_exceptions=False."""
|
||||
middleware._settings["ignore_exceptions"] = False
|
||||
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])])
|
||||
|
||||
call_count = 0
|
||||
|
||||
@@ -234,7 +234,7 @@ class TestPurviewPolicyMiddleware:
|
||||
with patch.object(middleware._processor, "process_messages", side_effect=side_effect):
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="OK")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["OK"])])
|
||||
|
||||
with pytest.raises(ValueError, match="Post-check blew up"):
|
||||
await middleware.process(context, mock_next)
|
||||
@@ -246,14 +246,14 @@ class TestPurviewPolicyMiddleware:
|
||||
# Set ignore_exceptions to True
|
||||
middleware._settings["ignore_exceptions"] = True
|
||||
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Test")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Test"])])
|
||||
|
||||
with patch.object(
|
||||
middleware._processor, "process_messages", side_effect=Exception("Pre-check error")
|
||||
) as mock_process:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Response")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Response"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -269,7 +269,7 @@ class TestPurviewPolicyMiddleware:
|
||||
# Set ignore_exceptions to True
|
||||
middleware._settings["ignore_exceptions"] = True
|
||||
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Test")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Test"])])
|
||||
|
||||
call_count = 0
|
||||
|
||||
@@ -283,7 +283,7 @@ class TestPurviewPolicyMiddleware:
|
||||
with patch.object(middleware._processor, "process_messages", side_effect=mock_process_messages):
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Response")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Response"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -300,7 +300,7 @@ class TestPurviewPolicyMiddleware:
|
||||
|
||||
mock_agent = MagicMock()
|
||||
mock_agent.name = "test-agent"
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Test")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Test"])])
|
||||
|
||||
# Mock processor to raise an exception
|
||||
async def mock_process_messages(*args, **kwargs):
|
||||
@@ -309,7 +309,7 @@ class TestPurviewPolicyMiddleware:
|
||||
with patch.object(middleware._processor, "process_messages", side_effect=mock_process_messages):
|
||||
|
||||
async def mock_next():
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Response")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Response"])])
|
||||
|
||||
# Should not raise, just log
|
||||
await middleware.process(context, mock_next)
|
||||
@@ -324,7 +324,7 @@ class TestPurviewPolicyMiddleware:
|
||||
|
||||
mock_agent = MagicMock()
|
||||
mock_agent.name = "test-agent"
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Test")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Test"])])
|
||||
|
||||
# Mock processor to raise an exception
|
||||
async def mock_process_messages(*args, **kwargs):
|
||||
@@ -344,12 +344,12 @@ class TestPurviewPolicyMiddleware:
|
||||
) -> None:
|
||||
"""Test that session_id is extracted from session.service_session_id."""
|
||||
session = AgentSession(service_session_id="thread-123")
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")], session=session)
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])], session=session)
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")) as mock_proc:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Hi")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Hi"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -361,13 +361,13 @@ class TestPurviewPolicyMiddleware:
|
||||
self, middleware: PurviewPolicyMiddleware, mock_agent: MagicMock
|
||||
) -> None:
|
||||
"""Test that session_id is extracted from message.additional_properties['conversation_id']."""
|
||||
messages = [Message(role="user", text="Hello", additional_properties={"conversation_id": "conv-456"})]
|
||||
messages = [Message(role="user", contents=["Hello"], additional_properties={"conversation_id": "conv-456"})]
|
||||
context = AgentContext(agent=mock_agent, messages=messages)
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")) as mock_proc:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Hi")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Hi"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -380,13 +380,13 @@ class TestPurviewPolicyMiddleware:
|
||||
) -> None:
|
||||
"""Test that session.service_session_id takes precedence over message conversation_id."""
|
||||
session = AgentSession(service_session_id="thread-789")
|
||||
messages = [Message(role="user", text="Hello", additional_properties={"conversation_id": "conv-456"})]
|
||||
messages = [Message(role="user", contents=["Hello"], additional_properties={"conversation_id": "conv-456"})]
|
||||
context = AgentContext(agent=mock_agent, messages=messages, session=session)
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")) as mock_proc:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Hi")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Hi"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -397,12 +397,12 @@ class TestPurviewPolicyMiddleware:
|
||||
self, middleware: PurviewPolicyMiddleware, mock_agent: MagicMock
|
||||
) -> None:
|
||||
"""Test that session_id is None when no session or conversation_id is available."""
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")])
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])])
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")) as mock_proc:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Hi")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Hi"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
@@ -414,12 +414,12 @@ class TestPurviewPolicyMiddleware:
|
||||
) -> None:
|
||||
"""Test that session_id is passed to post-check process_messages call."""
|
||||
session = AgentSession(service_session_id="thread-999")
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", text="Hello")], session=session)
|
||||
context = AgentContext(agent=mock_agent, messages=[Message(role="user", contents=["Hello"])], session=session)
|
||||
|
||||
with patch.object(middleware._processor, "process_messages", return_value=(False, "user-123")) as mock_proc:
|
||||
|
||||
async def mock_next() -> None:
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", text="Response")])
|
||||
context.result = AgentResponse(messages=[Message(role="assistant", contents=["Response"])])
|
||||
|
||||
await middleware.process(context, mock_next)
|
||||
|
||||
|
||||
@@ -83,8 +83,8 @@ class TestScopedContentProcessor:
|
||||
async def test_process_messages_with_defaults(self, processor: ScopedContentProcessor) -> None:
|
||||
"""Test process_messages with settings that have defaults."""
|
||||
messages = [
|
||||
Message(role="user", text="Hello"),
|
||||
Message(role="assistant", text="Hi there"),
|
||||
Message(role="user", contents=["Hello"]),
|
||||
Message(role="assistant", contents=["Hi there"]),
|
||||
]
|
||||
|
||||
with patch.object(processor, "_map_messages", return_value=([], None)) as mock_map:
|
||||
@@ -98,7 +98,7 @@ class TestScopedContentProcessor:
|
||||
self, processor: ScopedContentProcessor, process_content_request_factory
|
||||
) -> None:
|
||||
"""Test process_messages returns True when content should be blocked."""
|
||||
messages = [Message(role="user", text="Sensitive content")]
|
||||
messages = [Message(role="user", contents=["Sensitive content"])]
|
||||
|
||||
mock_request = process_content_request_factory("Sensitive content")
|
||||
|
||||
@@ -122,7 +122,7 @@ class TestScopedContentProcessor:
|
||||
messages = [
|
||||
Message(
|
||||
role="user",
|
||||
text="Test message",
|
||||
contents=["Test message"],
|
||||
message_id="msg-123",
|
||||
author_name="12345678-1234-1234-1234-123456789012",
|
||||
),
|
||||
@@ -139,7 +139,7 @@ class TestScopedContentProcessor:
|
||||
"""Test _map_messages gets token info when settings lack some defaults."""
|
||||
settings = PurviewSettings(app_name="Test App", tenant_id="12345678-1234-1234-1234-123456789012")
|
||||
processor = ScopedContentProcessor(mock_client, settings)
|
||||
messages = [Message(role="user", text="Test", message_id="msg-123")]
|
||||
messages = [Message(role="user", contents=["Test"], message_id="msg-123")]
|
||||
|
||||
requests, user_id = await processor._map_messages(messages, Activity.UPLOAD_TEXT)
|
||||
|
||||
@@ -156,7 +156,7 @@ class TestScopedContentProcessor:
|
||||
return_value={"user_id": "test-user", "client_id": "test-client"}
|
||||
)
|
||||
|
||||
messages = [Message(role="user", text="Test", message_id="msg-123")]
|
||||
messages = [Message(role="user", contents=["Test"], message_id="msg-123")]
|
||||
|
||||
with pytest.raises(ValueError, match="Tenant id required"):
|
||||
await processor._map_messages(messages, Activity.UPLOAD_TEXT)
|
||||
@@ -333,7 +333,7 @@ class TestScopedContentProcessor:
|
||||
messages = [
|
||||
Message(
|
||||
role="user",
|
||||
text="Test message",
|
||||
contents=["Test message"],
|
||||
additional_properties={"user_id": "22345678-1234-1234-1234-123456789012"},
|
||||
),
|
||||
]
|
||||
@@ -355,7 +355,7 @@ class TestScopedContentProcessor:
|
||||
)
|
||||
processor = ScopedContentProcessor(mock_client, settings)
|
||||
|
||||
messages = [Message(role="user", text="Test message")]
|
||||
messages = [Message(role="user", contents=["Test message"])]
|
||||
|
||||
requests, user_id = await processor._map_messages(
|
||||
messages, Activity.UPLOAD_TEXT, provided_user_id="32345678-1234-1234-1234-123456789012"
|
||||
@@ -376,7 +376,7 @@ class TestScopedContentProcessor:
|
||||
)
|
||||
processor = ScopedContentProcessor(mock_client, settings)
|
||||
|
||||
messages = [Message(role="user", text="Test message")]
|
||||
messages = [Message(role="user", contents=["Test message"])]
|
||||
|
||||
requests, user_id = await processor._map_messages(messages, Activity.UPLOAD_TEXT)
|
||||
|
||||
@@ -479,7 +479,7 @@ class TestUserIdResolution:
|
||||
settings = PurviewSettings(app_name="Test App") # No tenant_id or app_location
|
||||
processor = ScopedContentProcessor(mock_client, settings)
|
||||
|
||||
messages = [Message(role="user", text="Test")]
|
||||
messages = [Message(role="user", contents=["Test"])]
|
||||
|
||||
requests, user_id = await processor._map_messages(messages, Activity.UPLOAD_TEXT)
|
||||
|
||||
@@ -495,7 +495,7 @@ class TestUserIdResolution:
|
||||
messages = [
|
||||
Message(
|
||||
role="user",
|
||||
text="Test",
|
||||
contents=["Test"],
|
||||
additional_properties={"user_id": "22222222-2222-2222-2222-222222222222"},
|
||||
)
|
||||
]
|
||||
@@ -515,7 +515,7 @@ class TestUserIdResolution:
|
||||
messages = [
|
||||
Message(
|
||||
role="user",
|
||||
text="Test",
|
||||
contents=["Test"],
|
||||
author_name="33333333-3333-3333-3333-333333333333",
|
||||
)
|
||||
]
|
||||
@@ -533,7 +533,7 @@ class TestUserIdResolution:
|
||||
messages = [
|
||||
Message(
|
||||
role="user",
|
||||
text="Test",
|
||||
contents=["Test"],
|
||||
author_name="John Doe", # Not a GUID
|
||||
)
|
||||
]
|
||||
@@ -550,7 +550,7 @@ class TestUserIdResolution:
|
||||
"""Test provided_user_id parameter is used as last resort."""
|
||||
processor = ScopedContentProcessor(mock_client, settings)
|
||||
|
||||
messages = [Message(role="user", text="Test")]
|
||||
messages = [Message(role="user", contents=["Test"])]
|
||||
|
||||
requests, user_id = await processor._map_messages(
|
||||
messages, Activity.UPLOAD_TEXT, provided_user_id="44444444-4444-4444-4444-444444444444"
|
||||
@@ -562,7 +562,7 @@ class TestUserIdResolution:
|
||||
"""Test invalid provided_user_id is ignored."""
|
||||
processor = ScopedContentProcessor(mock_client, settings)
|
||||
|
||||
messages = [Message(role="user", text="Test")]
|
||||
messages = [Message(role="user", contents=["Test"])]
|
||||
|
||||
requests, user_id = await processor._map_messages(messages, Activity.UPLOAD_TEXT, provided_user_id="not-a-guid")
|
||||
|
||||
@@ -575,10 +575,12 @@ class TestUserIdResolution:
|
||||
|
||||
messages = [
|
||||
Message(
|
||||
role="user", text="First", additional_properties={"user_id": "55555555-5555-5555-5555-555555555555"}
|
||||
role="user",
|
||||
contents=["First"],
|
||||
additional_properties={"user_id": "55555555-5555-5555-5555-555555555555"},
|
||||
),
|
||||
Message(role="assistant", text="Response"),
|
||||
Message(role="user", text="Second"),
|
||||
Message(role="assistant", contents=["Response"]),
|
||||
Message(role="user", contents=["Second"]),
|
||||
]
|
||||
|
||||
requests, user_id = await processor._map_messages(messages, Activity.UPLOAD_TEXT)
|
||||
@@ -594,14 +596,16 @@ class TestUserIdResolution:
|
||||
processor = ScopedContentProcessor(mock_client, settings)
|
||||
|
||||
messages = [
|
||||
Message(role="user", text="First", author_name="Not a GUID"),
|
||||
Message(role="user", contents=["First"], author_name="Not a GUID"),
|
||||
Message(
|
||||
role="assistant",
|
||||
text="Response",
|
||||
contents=["Response"],
|
||||
additional_properties={"user_id": "66666666-6666-6666-6666-666666666666"},
|
||||
),
|
||||
Message(
|
||||
role="user", text="Third", additional_properties={"user_id": "77777777-7777-7777-7777-777777777777"}
|
||||
role="user",
|
||||
contents=["Third"],
|
||||
additional_properties={"user_id": "77777777-7777-7777-7777-777777777777"},
|
||||
),
|
||||
]
|
||||
|
||||
@@ -653,7 +657,7 @@ class TestScopedContentProcessorCaching:
|
||||
scope_identifier="scope-123", scopes=[]
|
||||
)
|
||||
|
||||
messages = [Message(role="user", text="Test")]
|
||||
messages = [Message(role="user", contents=["Test"])]
|
||||
|
||||
await processor.process_messages(messages, Activity.UPLOAD_TEXT, user_id="12345678-1234-1234-1234-123456789012")
|
||||
|
||||
@@ -675,7 +679,7 @@ class TestScopedContentProcessorCaching:
|
||||
|
||||
mock_client.get_protection_scopes.side_effect = PurviewPaymentRequiredError("Payment required")
|
||||
|
||||
messages = [Message(role="user", text="Test")]
|
||||
messages = [Message(role="user", contents=["Test"])]
|
||||
|
||||
with pytest.raises(PurviewPaymentRequiredError):
|
||||
await processor.process_messages(
|
||||
|
||||
Reference in New Issue
Block a user