mycode-sdk
Lightweight Python SDK for building AI agents.
Install
uv add mycode-sdk
# or
pip install mycode-sdk
Quick start
import asyncio
from mycode import Agent, bash_tool, read_tool
async def main() -> None:
agent = Agent(
model="claude-sonnet-4-6",
api_key="YOUR_API_KEY",
tools=[read_tool, bash_tool],
)
async for event in agent.achat("Read pyproject.toml and tell me the project name."):
if event.type == "text":
print(event.data["delta"], end="", flush=True)
asyncio.run(main())
Agent(...) infers the provider from the model id. No tools are registered unless you pass tools=[...].
For a simple synchronous call, use run():
result = agent.run("Read pyproject.toml and tell me the project name.")
print(result.text)
Multi-turn conversations
Call achat() or run() again on the same Agent — history accumulates automatically:
agent = Agent(model="claude-sonnet-4-6", api_key="...")
agent.run("What is 2 + 2?")
agent.run("Now multiply that by 10.") # remembers the earlier answer
Attachments
Pass attachments to achat() or run() to add files alongside the prompt:
from mycode import Attachment
agent.run("Describe these.", attachments=["diagram.png", "report.pdf", "notes.txt"])
# Or build them explicitly — raw bytes and inline text never touch the disk:
agent.run(
"Review.",
attachments=[
Attachment.path("diagram.png"),
Attachment.bytes(png_data, media_type="image/png"),
Attachment.text("TODO: ship it", name="note.md"),
],
)
Images support image/png, image/jpeg, image/gif, image/webp; documents support application/pdf. Sending an image or PDF to a model that lacks that capability yields an error event; a bad path or unsupported type raises ValueError before the model is called.
Saving sessions
Pass session_dir to persist the conversation to disk. Each session lives in a subdirectory named by session_id:
from pathlib import Path
agent = Agent(
model="claude-sonnet-4-6",
api_key="...",
session_dir=Path("./chats"),
session_id="my-chat",
)
Construct another Agent with the same (session_dir, session_id) later to resume the conversation — the history is loaded automatically.
Built-in tools
from mycode import read_tool, write_tool, edit_tool, bash_tool
Four tools for reading, writing, editing files, and running shell commands. Opt in by passing them to tools=[...].
Custom tools
Decorate a typed function with @tool:
from mycode import Agent, tool
@tool
def greet(name: str) -> str:
"""Return a friendly greeting.
Args:
name: Person name.
"""
return f"hello, {name}"
agent = Agent(
model="claude-sonnet-4-6",
api_key="...",
tools=[greet],
)
To call a built-in tool from inside your own tool, type the first parameter as ToolContext:
from mycode import ToolContext, tool
@tool
def summarize_file(ctx: ToolContext, path: str) -> str:
"""Return the first line of a text file."""
result = ctx.read(path)
return result.output.splitlines()[0] if result.output else ""
Tool hooks
Inspect or replace tool calls before they run. Return None from before_tool to let the tool execute, or a ToolExecutionResult to skip it:
from mycode import Agent, Hooks, ToolExecutionResult, bash_tool
hooks = Hooks()
@hooks.before_tool
async def block_rm(ctx):
cmd = str(ctx.tool_input.get("command") or "")
if ctx.tool_name == "bash" and "rm -rf" in cmd:
return ToolExecutionResult(output="error: blocked", is_error=True)
return None
agent = Agent(
model="claude-sonnet-4-6",
api_key="...",
tools=[bash_tool],
hooks=hooks,
)
@hooks.after_tool runs after the tool and can replace the result (audit, redact, etc.).
See docs/sdk.md for the event stream, cancellation, sessions, and the full Agent / @tool reference.
Release files for mycode-sdk 0.9.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mycode_sdk-0.9.5.tar.gz | 51.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mycode_sdk-0.9.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 112.1 kB
Release files / mycode_sdk-0.9.5.tar.gz
| Download URL | mycode_sdk-0.9.5.tar.gz |
|---|---|
| Size | 51.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4301182b0896081a075fe3abcb96fdb83ac29136e5213ac91ead9ad9bd305a47
|
|
BLAKE2b-256 checksum How to use checksums |
8b806dabf9db46d8b73edc6b945437e48baf1065310f318b48954cad0b80f078
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / mycode_sdk-0.9.5-py3-none-any.whl
| Download URL | mycode_sdk-0.9.5-py3-none-any.whl |
|---|---|
| Size | 60.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4878738eee326569ceb00f813340d8ff6a5bf577fcbfe3f11d7896bbc513ca7b
|
|
BLAKE2b-256 checksum How to use checksums |
a941ded9ec7d373900c32b32516b4852109f8340aca94fafe4d4fa8ef5fe1d2e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|