From 2bd33a499f35db203d0f0bad86e1ff2259775484 Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 14 Jul 2026 21:35:56 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=90=9B=20(python-sdk-docs):=20Fix=20t?= =?UTF-8?q?runcated=20Google=20ADK=20/=20Pydantic=20AI=20/=20Microsoft=20A?= =?UTF-8?q?gent=20Framework=20quickstart=20snippets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 3 vendored snippets were truncated at `) as ctx:` with no `with` body, making them syntactically invalid Python. Re-vendor each from its upstream examples/python//src/main.py so the `with` block has a real body (the standard Agent/Gateway/Mode print block + policy rules) and the try/finally each already opens is properly closed, matching the adapter-cleanup pattern the real examples use. Refs AAASM-4585 --- quickstart_snippets/google-adk.py | 12 ++++++++++++ .../microsoft-agent-framework-tool-policy.py | 13 +++++++++++++ quickstart_snippets/pydantic-ai.py | 12 ++++++++++++ 3 files changed, 37 insertions(+) diff --git a/quickstart_snippets/google-adk.py b/quickstart_snippets/google-adk.py index 1efd391b..7916986e 100644 --- a/quickstart_snippets/google-adk.py +++ b/quickstart_snippets/google-adk.py @@ -9,3 +9,15 @@ agent_id="google-adk-demo-agent", mode="sdk-only", ) as ctx: + print(f" Agent: {ctx.client.agent_id}") + print(f" Gateway: {ctx.client.gateway_url}") + print(f" Mode: {ctx.network_mode} (offline demo)") + print() + + print("Policy rules (local simulation of gateway policy):") + print(" DENY — delete_records, write_file (destructive operations)") + print(" PENDING — send_email (requires human approval)") + print(" ALLOW — everything else") + print() +finally: + ungovern_tool_class(DemoTool) diff --git a/quickstart_snippets/microsoft-agent-framework-tool-policy.py b/quickstart_snippets/microsoft-agent-framework-tool-policy.py index 6874538b..be38ed1c 100644 --- a/quickstart_snippets/microsoft-agent-framework-tool-policy.py +++ b/quickstart_snippets/microsoft-agent-framework-tool-policy.py @@ -18,3 +18,16 @@ agent_id="microsoft-agent-framework-demo-agent", mode="sdk-only", ) as ctx: + print(f" Agent: {ctx.client.agent_id}") + print(f" Gateway: {ctx.client.gateway_url}") + print(f" Mode: {ctx.network_mode} (offline demo)") + print() + + print("Policy rules (local simulation of gateway policy):") + print(" DENY — delete_records, write_file (destructive operations)") + print(" PENDING — send_email (requires human approval)") + print(" ALLOW — everything else") + print() +finally: + if adapter is not None: + adapter.unregister_hooks() diff --git a/quickstart_snippets/pydantic-ai.py b/quickstart_snippets/pydantic-ai.py index 20043aa5..859a6d36 100644 --- a/quickstart_snippets/pydantic-ai.py +++ b/quickstart_snippets/pydantic-ai.py @@ -9,3 +9,15 @@ agent_id="pydantic-ai-demo-agent", mode="sdk-only", ) as ctx: + print(f" Agent: {ctx.client.agent_id}") + print(f" Gateway: {ctx.client.gateway_url}") + print(f" Mode: {ctx.network_mode} (offline demo)") + print() + + print("Policy rules (local simulation of gateway policy):") + print(" DENY — delete_records, write_file (destructive operations)") + print(" PENDING — send_email (requires human approval)") + print(" ALLOW — everything else") + print() +finally: + adapter.unregister_hooks() From 72f53899ea29464036607ca16506e0d4a2e1b284 Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 14 Jul 2026 21:36:06 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=F0=9F=93=9D=20(python-sdk-docs):=20Regener?= =?UTF-8?q?ate=20quick-start=20tabs=20from=20fixed=20snippets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Byproduct of the vendored-snippet fix in the previous commit: running scripts/generate_quickstart_tabs.py picks up the completed with-blocks for Google ADK, Pydantic AI, and Microsoft Agent Framework so the rendered doc no longer ends the tab mid-statement. Refs AAASM-4585 --- docs/quick-start.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/quick-start.md b/docs/quick-start.md index a9944c99..da34e7a9 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -211,6 +211,18 @@ with no API keys and no outbound network. agent_id="google-adk-demo-agent", mode="sdk-only", ) as ctx: + print(f" Agent: {ctx.client.agent_id}") + print(f" Gateway: {ctx.client.gateway_url}") + print(f" Mode: {ctx.network_mode} (offline demo)") + print() + + print("Policy rules (local simulation of gateway policy):") + print(" DENY — delete_records, write_file (destructive operations)") + print(" PENDING — send_email (requires human approval)") + print(" ALLOW — everything else") + print() + finally: + ungovern_tool_class(DemoTool) ``` === "Haystack" @@ -362,6 +374,19 @@ with no API keys and no outbound network. agent_id="microsoft-agent-framework-demo-agent", mode="sdk-only", ) as ctx: + print(f" Agent: {ctx.client.agent_id}") + print(f" Gateway: {ctx.client.gateway_url}") + print(f" Mode: {ctx.network_mode} (offline demo)") + print() + + print("Policy rules (local simulation of gateway policy):") + print(" DENY — delete_records, write_file (destructive operations)") + print(" PENDING — send_email (requires human approval)") + print(" ALLOW — everything else") + print() + finally: + if adapter is not None: + adapter.unregister_hooks() ``` === "OpenAI Agents SDK" @@ -396,6 +421,18 @@ with no API keys and no outbound network. agent_id="pydantic-ai-demo-agent", mode="sdk-only", ) as ctx: + print(f" Agent: {ctx.client.agent_id}") + print(f" Gateway: {ctx.client.gateway_url}") + print(f" Mode: {ctx.network_mode} (offline demo)") + print() + + print("Policy rules (local simulation of gateway policy):") + print(" DENY — delete_records, write_file (destructive operations)") + print(" PENDING — send_email (requires human approval)") + print(" ALLOW — everything else") + print() + finally: + adapter.unregister_hooks() ``` === "Semantic Kernel" From 367003cc565c0eb492409d547d1a7a7a9c98c164 Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 14 Jul 2026 22:20:35 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=F0=9F=93=9D=20(python-sdk-docs):=20Add=20r?= =?UTF-8?q?eal=20import=20lines=20to=20all=2016=20quickstart=20snippets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every vendored quickstart_snippets/*.py had zero import lines, so the quick-start page's per-framework tabs never showed what to import, leaving a copy-pasting reader with a NameError on init_assembly and every framework-specific call. Import lines are sourced verbatim from the matching ai-agent-assembly/examples source (origin/master), limited to the lines actually needed by each excerpt's body. Refs AAASM-4590 --- quickstart_snippets/agno-tool-policy.py | 5 +++++ quickstart_snippets/autogen-tool-policy.py | 4 ++++ quickstart_snippets/crewai-research-crew.py | 6 ++++++ quickstart_snippets/custom-tool-policy.py | 10 ++++++++++ quickstart_snippets/google-adk.py | 6 ++++++ quickstart_snippets/haystack-tool-policy.py | 5 +++++ quickstart_snippets/langchain-basic-agent.py | 5 +++++ quickstart_snippets/langchain-research-agent.py | 5 +++++ quickstart_snippets/langgraph.py | 6 ++++++ quickstart_snippets/llamaindex-tool-policy.py | 5 +++++ .../microsoft-agent-framework-tool-policy.py | 7 +++++++ quickstart_snippets/openai-agents-sdk.py | 5 +++++ quickstart_snippets/pydantic-ai.py | 5 +++++ quickstart_snippets/semantic-kernel-tool-policy.py | 5 +++++ quickstart_snippets/smolagents-tool-policy.py | 5 +++++ quickstart_snippets/strands-agents-tool-policy.py | 4 ++++ 16 files changed, 88 insertions(+) diff --git a/quickstart_snippets/agno-tool-policy.py b/quickstart_snippets/agno-tool-policy.py index 454b0894..482dd47f 100644 --- a/quickstart_snippets/agno-tool-policy.py +++ b/quickstart_snippets/agno-tool-policy.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.agno import AgnoPatch + +from src.policy import LocalPolicyEngine + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/autogen-tool-policy.py b/quickstart_snippets/autogen-tool-policy.py index 82b71661..d7b11498 100644 --- a/quickstart_snippets/autogen-tool-policy.py +++ b/quickstart_snippets/autogen-tool-policy.py @@ -1,3 +1,7 @@ +from agent_assembly import init_assembly + +from src.policy import LocalPolicyEngine, governed_run + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/crewai-research-crew.py b/quickstart_snippets/crewai-research-crew.py index ae693944..b199a77e 100644 --- a/quickstart_snippets/crewai-research-crew.py +++ b/quickstart_snippets/crewai-research-crew.py @@ -1,3 +1,9 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.langchain import AssemblyCallbackHandler + +from src.crew import CREW, MOCK_TRAJECTORY +from src.policy import DAILY_BUDGET_USD, CrewPolicyEngine, MockApprover + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/custom-tool-policy.py b/quickstart_snippets/custom-tool-policy.py index 3c83bf48..31438a3a 100644 --- a/quickstart_snippets/custom-tool-policy.py +++ b/quickstart_snippets/custom-tool-policy.py @@ -1,3 +1,13 @@ +from agent_assembly import init_assembly + +from src.policy import LocalPolicyEngine, governed +from src.tools import ( + compute_sum, + fetch_stock_price, + send_http_request, + write_to_disk, +) + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/google-adk.py b/quickstart_snippets/google-adk.py index 7916986e..abd2352b 100644 --- a/quickstart_snippets/google-adk.py +++ b/quickstart_snippets/google-adk.py @@ -1,3 +1,9 @@ +from agent_assembly import init_assembly + +from src.governance import govern_tool_class, ungovern_tool_class +from src.policy import LocalPolicyEngine +from src.tools import DemoTool, build_tools + # Govern the concrete demo tool class BEFORE init_assembly so the offline # LocalPolicyEngine stays wired as the interceptor (the patch is idempotent). govern_tool_class(DemoTool, LocalPolicyEngine()) diff --git a/quickstart_snippets/haystack-tool-policy.py b/quickstart_snippets/haystack-tool-policy.py index f0424de3..42e797b6 100644 --- a/quickstart_snippets/haystack-tool-policy.py +++ b/quickstart_snippets/haystack-tool-policy.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.haystack import HaystackPatch + +from src.policy import LocalPolicyEngine + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/langchain-basic-agent.py b/quickstart_snippets/langchain-basic-agent.py index 74b9afcf..8e2eaa7a 100644 --- a/quickstart_snippets/langchain-basic-agent.py +++ b/quickstart_snippets/langchain-basic-agent.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.langchain import AssemblyCallbackHandler + +from src.policy import LocalPolicyEngine + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/langchain-research-agent.py b/quickstart_snippets/langchain-research-agent.py index ff179593..89b50d85 100644 --- a/quickstart_snippets/langchain-research-agent.py +++ b/quickstart_snippets/langchain-research-agent.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.langchain import AssemblyCallbackHandler + +from src.policy import DAILY_BUDGET_USD, NETWORK_ALLOWLIST, BalancedPolicyEngine + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/langgraph.py b/quickstart_snippets/langgraph.py index ccffca96..347dbe9e 100644 --- a/quickstart_snippets/langgraph.py +++ b/quickstart_snippets/langgraph.py @@ -1,3 +1,9 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.langchain import AssemblyCallbackHandler +from agent_assembly.adapters.langgraph import LangGraphAdapter + +from src.policy import LocalPolicyEngine + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/llamaindex-tool-policy.py b/quickstart_snippets/llamaindex-tool-policy.py index 672538dc..6cd1d72a 100644 --- a/quickstart_snippets/llamaindex-tool-policy.py +++ b/quickstart_snippets/llamaindex-tool-policy.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.llamaindex import LlamaIndexAdapter, LlamaIndexPatch + +from src.policy import LocalPolicyEngine + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/microsoft-agent-framework-tool-policy.py b/quickstart_snippets/microsoft-agent-framework-tool-policy.py index be38ed1c..fee46e6b 100644 --- a/quickstart_snippets/microsoft-agent-framework-tool-policy.py +++ b/quickstart_snippets/microsoft-agent-framework-tool-policy.py @@ -1,3 +1,10 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.microsoft_agent_framework import ( + MicrosoftAgentFrameworkAdapter, +) + +from src.policy import LocalPolicyEngine + policy = LocalPolicyEngine() # Live path: install the governance hooks BEFORE init_assembly. The adapter diff --git a/quickstart_snippets/openai-agents-sdk.py b/quickstart_snippets/openai-agents-sdk.py index 076c3bf9..8390909e 100644 --- a/quickstart_snippets/openai-agents-sdk.py +++ b/quickstart_snippets/openai-agents-sdk.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.langchain import AssemblyCallbackHandler + +from src.policy import LocalPolicyEngine + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/pydantic-ai.py b/quickstart_snippets/pydantic-ai.py index 859a6d36..da8a4bc4 100644 --- a/quickstart_snippets/pydantic-ai.py +++ b/quickstart_snippets/pydantic-ai.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.pydantic_ai import PydanticAIAdapter + +from src.policy import LocalPolicyEngine + adapter = PydanticAIAdapter() adapter.set_process_agent_id("pydantic-ai-demo-agent") adapter.register_hooks(LocalPolicyEngine()) diff --git a/quickstart_snippets/semantic-kernel-tool-policy.py b/quickstart_snippets/semantic-kernel-tool-policy.py index 7d5feb30..cd40d2f3 100644 --- a/quickstart_snippets/semantic-kernel-tool-policy.py +++ b/quickstart_snippets/semantic-kernel-tool-policy.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly + +from src.policy import LocalPolicyEngine, governed_invoke +from src.tools import PLUGIN_NAME, build_kernel + with init_assembly( gateway_url=gateway_url, api_key=api_key, diff --git a/quickstart_snippets/smolagents-tool-policy.py b/quickstart_snippets/smolagents-tool-policy.py index e83897ad..7171b2bf 100644 --- a/quickstart_snippets/smolagents-tool-policy.py +++ b/quickstart_snippets/smolagents-tool-policy.py @@ -1,3 +1,8 @@ +from agent_assembly import init_assembly +from agent_assembly.adapters.smolagents import SmolagentsPatch + +from src.policy import LocalPolicyEngine + policy = LocalPolicyEngine() patch = SmolagentsPatch(policy) patch.apply() diff --git a/quickstart_snippets/strands-agents-tool-policy.py b/quickstart_snippets/strands-agents-tool-policy.py index 11f82087..01cf57b5 100644 --- a/quickstart_snippets/strands-agents-tool-policy.py +++ b/quickstart_snippets/strands-agents-tool-policy.py @@ -1,3 +1,7 @@ +from agent_assembly import init_assembly + +from src.policy import LocalPolicyEngine, governed_run + with init_assembly( gateway_url=gateway_url, api_key=api_key, From ea1df98b6180c0c63c8b36e3fc6998372f5568a3 Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 14 Jul 2026 22:23:30 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E2=9C=A8=20(python-sdk-docs):=20Support=20?= =?UTF-8?q?optional=20per-framework=20version-compat=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit quickstart_snippets/manifest.json can now carry an optional version_compat_note field per framework entry; render_tab() renders it as a nested "Version compatibility" admonition beneath that framework's code fence. Needed so AAASM-4590's compat notes stay generator-driven (never a hand-edit of the generated region) for frameworks with a real, citable import-path break in their version history. Refs AAASM-4590 --- scripts/generate_quickstart_tabs.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/scripts/generate_quickstart_tabs.py b/scripts/generate_quickstart_tabs.py index 6e29e28d..04c7ee6c 100644 --- a/scripts/generate_quickstart_tabs.py +++ b/scripts/generate_quickstart_tabs.py @@ -23,6 +23,13 @@ * Idempotent: running twice produces no diff. The drift check enforces this. * Data-driven: the tab list is exactly ``manifest.json``'s ``frameworks`` array, in listed order, so a framework added upstream appears once it is re-vendored. + +A framework entry may carry an optional ``version_compat_note`` (AAASM-4590): +markdown text rendered as a nested "Version compatibility" admonition beneath that +framework's code fence. This is a local extension of the vendored manifest schema +(not part of the upstream ``examples`` copy) — the note isn't tied to a runnable +example, it exists to warn readers about a real, citable import-path break in the +framework's own version history. Add one only when there's a real source to cite. """ from __future__ import annotations @@ -59,11 +66,22 @@ def _indent_tab_body(line: str) -> str: return f" {line}" if line else "" -def render_tab(label: str, code: str) -> str: - """Render one ``=== "