This release is a pre-release and may not be stable for production use.
agent-framework-monty
Monty-backed CodeAct integrations for Microsoft Agent Framework.
Installation
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.
Quick start
Context provider (recommended)
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.")
Standalone tool
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],
)
Manual static wiring
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],
)
File mounts and resource limits
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_rootmirrors the Hyperlight default: the directory is mounted at/inputinread-writemode.file_mountsaccepts a string shorthand, a(host_path, mount_path)tuple, or aFileMountnamed tuple (with optionalmodeandwrite_bytes_limit).- Files written by the sandbox to any
read-writemount are scanned after eachexecute_codecall and returned asContent.from_data(...)attachments (with apathannotation inadditional_properties), mirroring Hyperlight's/outputflow. overlaymounts buffer writes in memory (nothing leaks to the host and nothing is captured).read-onlymounts reject writes.resource_limitsis forwarded straight to Monty'sResourceLimitsTypedDict (max_allocations,max_duration_secs,max_memory,gc_interval,max_recursion_depth).
DSL inside execute_code
The 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. |
Notes
MontyCodeActProviderandMontyExecuteCodeToolmirror the API surface of theagent-framework-hyperlightcounterparts where the underlying runtime supports it.- Monty interprets a subset of Python (a Rust-based interpreter). Most
control flow, common stdlib modules (
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 withPermissionErrorby default; mount host directories withworkspace_root/file_mountsto grant scoped filesystem access. - Code is type-checked against tool signatures via ty before execution, so wrong argument types surface as a clear error before any host tool runs.
- The beta package is part of
agent-framework[all]and is reachable through the lazy-loading namespaceagent_framework.monty.
Metadata
Release files for agent-framework-monty 1.0.0b260730
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| agent_framework_monty-1.0.0b260730.tar.gz | 19.7 kB | Without provenance | Details for agent_framework_monty-1.0.0b260730.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| agent_framework_monty-1.0.0b260730-py3-none-any.whl | Python 3 | none | any | Details for agent_framework_monty-1.0.0b260730-py3-none-any.whl |
Total release size: 40.5 kB
Release files / agent_framework_monty-1.0.0b260730.tar.gz
| Download URL | agent_framework_monty-1.0.0b260730.tar.gz |
|---|---|
| Size | 19.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
132abde2fffc93efd8f2fbcf0c5c4eff98d42192901d05cb331c63f5455b4306
|
|
BLAKE2b-256 checksum How to use checksums |
52a00febb4db1e03b0c56f16d4c7f99c1afea837fefb4a91a91d7d7306cc7288
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / agent_framework_monty-1.0.0b260730-py3-none-any.whl
| Download URL | agent_framework_monty-1.0.0b260730-py3-none-any.whl |
|---|---|
| Size | 20.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e7d55cf7ce09e3a79609d3dfa6380531039199a7dbe287828fbbc223bd91f7f0
|
|
BLAKE2b-256 checksum How to use checksums |
2867548dd41b192814859d0e151b3888bd89ea5d5fb0ec1048d1932d5a18f68f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for agent-framework-monty 1.0.0b260730
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.