Observed since 20 Oct, 22:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Monty CodeAct integrations for Microsoft Agent Framework.
Monty-backed CodeAct integrations for Microsoft Agent Framework.
[!WARNING] This package is in beta. APIs may change before its stable release. It is included in
agent-framework[all].
[!WARNING] FIDES integration is not supported with CodeAct providers. Host-tool calls made inside generated code bypass the agent's function middleware, so FIDES policy enforcement and label tracking do not apply to those nested calls or intermediate code values. Checks on the outer
execute_codeinvocation do not enforce the policies of individual tools called inside it.Registering tools with recognized FIDES
additional_propertieslogs a warning, but does not block execution. This is a best-effort diagnostic: FIDES also uses defaults for unannotated tools, so no warning does not imply support or safety. Keep tools that require FIDES as direct agent tools, not Monty-managed tools, and enforce authorization and destination restrictions inside host functions. See the FIDES guide.
pip install agent-framework-monty --pre
The package depends on pydantic-monty, a
Rust-based Python interpreter, so it runs on Linux, macOS, and Windows wherever
Monty wheels are published — no hypervisor or WASM backend required.
Use MontyCodeActProvider to automatically inject the execute_code tool and
CodeAct instructions into every agent run. Tools registered on the provider are
available inside the Monty interpreter as typed async functions (e.g.
await compute(operation="add", a=1, b=2)), and as a fallback through
call_tool(...).
from agent_framework import Agent, tool
from agent_framework.monty import MontyCodeActProvider
@tool
def compute(operation: str, a: float, b: float) -> float:
"""Perform a math operation."""
ops = {"add": a + b, "subtract": a - b, "multiply": a * b, "divide": a / b}
return ops[operation]
codeact = MontyCodeActProvider(
tools=[compute],
approval_mode="never_require",
)
agent = Agent(
client=client,
name="CodeActAgent",
instructions="You are a helpful assistant.",
context_providers=[codeact],
)
result = await agent.run("Multiply 6 by 7 using execute_code.")
Use MontyExecuteCodeTool directly when you want full control over how the
tool is added to the agent (e.g. when mixing sandbox tools with direct-only
tools on the same agent).
from agent_framework import Agent, tool
from agent_framework.monty import MontyExecuteCodeTool
@tool
def send_email(to: str, subject: str, body: str) -> str:
"""Send an email (direct-only, not available inside the sandbox)."""
return f"Email sent to {to}"
execute_code = MontyExecuteCodeTool(
tools=[compute],
approval_mode="never_require",
)
agent = Agent(
client=client,
name="MixedToolsAgent",
instructions="You are a helpful assistant.",
tools=[send_email, execute_code],
)
For fixed configurations where provider lifecycle overhead is unnecessary, build the CodeAct instructions once and pass them to the agent at construction time:
execute_code = MontyExecuteCodeTool(
tools=[compute],
approval_mode="never_require",
)
codeact_instructions = execute_code.build_instructions(tools_visible_to_model=False)
agent = Agent(
client=client,
name="StaticWiringAgent",
instructions=f"You are a helpful assistant.\n\n{codeact_instructions}",
tools=[execute_code],
)
Both MontyCodeActProvider and MontyExecuteCodeTool accept the keyword-only
tool_description_format parameter. It controls the registered tools' parameter
documentation in both the execute_code description and CodeAct instructions:
"compact" (default) lists scalar parameter types, required/optional status,
descriptions, enum choices, and defaults."json" includes the complete parameter JSON Schema.{"compute": "json", "send_email": "compact"} selects formats
by exact, case-sensitive tool name. Names missing from the mapping use compact.Compact automatically falls back to complete JSON Schema, with an explanatory note, for schemas it cannot represent faithfully, such as nested objects, arrays, references, unions, or additional constraints. Parameter schemas and runtime type checking are not changed.
Mappings are copied at construction and for each run snapshot. Entries for
currently unregistered tools are retained for later add_tools calls, including
after removal or clearing of the registry. State snapshots include the configured
string or mapping in tool_description_format.
Only "compact", "json", or mappings from string names to these values are
accepted: unsupported choices raise ValueError; None, invalid input types,
non-string mapping keys, and non-string choices raise TypeError.
Tool parameter schemas are model-visible metadata, just as they are for direct function calling. Do not put credentials, tenant identifiers, or other secrets in parameter descriptions, enum values, defaults, or custom schema fields.
Registered FunctionTool instances retain their invocation and exception counters
across execute_code calls and provider runs. Their max_invocations and
max_invocation_exceptions limits use the same counters as direct invocations of
those instances. A provider's run-scoped snapshot captures tool membership; it
does not reset host tool counters.
Mount host directories into the sandbox and cap execution resources:
from agent_framework.monty import FileMount, MontyCodeActProvider
codeact = MontyCodeActProvider(
tools=[compute],
workspace_root="/host/workspace", # auto-mounted at /input (read-write)
file_mounts=[
"/host/data", # shorthand: same path on both sides
("/host/models", "/sandbox/models"), # explicit (host, mount_path)
FileMount( # full control
host_path="/host/cache",
mount_path="/sandbox/cache",
mode="overlay", # "read-only" | "read-write" | "overlay"
write_bytes_limit=10 * 1024 * 1024,
),
],
resource_limits={ # Monty ResourceLimits TypedDict
"max_duration_secs": 5.0,
"max_memory": 64 * 1024 * 1024,
},
)
workspace_root mirrors the Hyperlight default: the directory is mounted
at /input in read-write mode.file_mounts accepts a string shorthand, a (host_path, mount_path)
tuple, or a FileMount named tuple (with optional mode and
write_bytes_limit).read-write mount are scanned
after each execute_code call and returned as Content.from_data(...)
attachments (with a path annotation in additional_properties),
mirroring Hyperlight's /output flow.overlay mounts buffer writes in memory (nothing leaks to the host and
nothing is captured). read-only mounts reject writes.resource_limits is forwarded straight to Monty's
ResourceLimits TypedDict
(max_duration_secs, max_memory, gc_interval, max_recursion_depth,
max_suspensions).execute_codeThe model generates Python code that runs inside Monty's Rust-based interpreter. Available primitives:
| Primitive | Behavior |
|---|---|
await tool_name(**kwargs) | Direct typed call to a registered host tool. Argument types are checked before execution. |
await call_tool("name", **kwargs) | Generic fallback that dispatches by tool name. Not type-checked. |
asyncio.gather(...) | Fans out concurrent tool calls. |
print(...) | Captured and surfaced as text in the tool result. |
Monty runs its own Python interpreter, not the host's Python environment. This
integration exposes no pip or package-installation option; installing a
dependency on the host does not make it importable in Monty code. Use the
interpreter's supported modules for code that runs inside Monty.
Unlike Hyperlight, MontyCodeActProvider and MontyExecuteCodeTool do not expose
an allowed_domains option. For external API calls or operations requiring
host-installed packages, register a host function in tools and invoke it with
await tool_name(...) or await call_tool("name", ...). Keep credentials,
authorization, and any destination allow-list checks inside that function.
These functions execute on the host rather than inside the Monty interpreter.
MontyCodeActProvider and MontyExecuteCodeTool mirror the API surface of
the agent-framework-hyperlight counterparts where the underlying runtime
supports it.sys, os, typing, asyncio, re,
datetime, json), and async functions are supported, but exotic features
may not be available. OS-level access (filesystem, network, subprocess) is
rejected with PermissionError by default; mount host directories with
workspace_root / file_mounts to grant scoped filesystem access.agent-framework[all] and is reachable through
the lazy-loading namespace agent_framework.monty.Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 1.0.0b261015 | 15 Oct 2026 | 2 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 22:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:200e69963ecd56867fdfc318234c425d81786946fe67101b000cbb10553b909e