A production-grade, type-safe Python Agent framework
Project description
Nonoka
A production-grade, type-safe Python agent framework with deterministic orchestration, conversational execution, and first-class MCP integration.
Features
- Type-safe core — Pydantic-validated schemas throughout; agents, tools, and plans are all strongly typed
- Deterministic orchestration —
Plan+Step+ref()for explicit control flow, not just prompt-and-pray - Conversational execution —
ReActAgent,ReflectiveAgent, andPlanExecutorparadigms out of the box - First-class tools —
@tooldecorator with automatic Pydantic schema generation - Prompt engineering —
@promptdecorator andPromptTemplatefor composable, type-safe prompt construction - MCP ready — built-in MCP (Model Context Protocol) support via
mcp - Resilient execution — structured error taxonomy (
TransientError,LogicError,SafetyError, etc.) with configurableRetryPolicy - Observable hooks —
Hookssystem for tracing, logging, and custom middleware - Multi-backend LLM — powered by
litellm, supporting OpenAI, Anthropic, DeepSeek, and 100+ providers
Installation
pip install nonoka
Or with uv:
uv add nonoka
Quick Start
import asyncio
import nonoka
@nonoka.tool
def get_weather(city: str) -> str:
"""Get the weather for a city."""
return f"Sunny in {city}!"
async def main():
agent = nonoka.Agent(
name="weather-bot",
tools=[get_weather],
)
result = await agent.run("What's the weather in Tokyo?")
print(result.output)
asyncio.run(main())
Plans & Orchestration
Explicit multi-step workflows with type-safe references:
from nonoka import PlanBuilder, ref
plan = (
PlanBuilder()
.add_step("research", "Search for information")
.add_step("summarize", "Summarize findings", depends_on=[ref("research")])
.build()
)
executor = nonoka.PlanExecutor(plan=plan)
result = await executor.run("Latest AI breakthroughs")
Prompt Templates
Composable, type-safe prompts:
from nonoka import prompt, PromptTemplate
@prompt
def translate(text: str, target: str = "Chinese") -> str:
"""Translate the following text to {target}:
{text}
"""
# Or programmatically
tpl = PromptTemplate("Summarize this in {style}:\n{content}")
output = tpl.render(style="bullet points", content=long_text)
ReAct Agent
agent = nonoka.ReActAgent(tools=[search, calculator])
result = await agent.run("What is 42 * the current temperature in Paris?")
Configuration
Nonoka integrates with pydantic-settings for environment-driven config:
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
openai_api_key: str
default_model: str = "gpt-4o"
class Config:
env_prefix = "NONOKA_"
Requirements
- Python >= 3.10
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nonoka-1.1.0.tar.gz.
File metadata
- Download URL: nonoka-1.1.0.tar.gz
- Upload date:
- Size: 72.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56e4a84989d0cd0a9812582aeb1f9b32f5a4ea4608452f7fb1a4a744a916d3cc
|
|
| MD5 |
8332dc498a863cf9f5c2e812919cbb11
|
|
| BLAKE2b-256 |
531880dbec3e781a433a4dca1f3f590ed00d8f98c012f55f0b3f19d7a1d6cb95
|
File details
Details for the file nonoka-1.1.0-py3-none-any.whl.
File metadata
- Download URL: nonoka-1.1.0-py3-none-any.whl
- Upload date:
- Size: 65.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88b2990b8a5c060fc6fc31f506abdf374853bae065d18f242c408c8594172077
|
|
| MD5 |
a1be6bf5f8ac9ae037ab542613dfb982
|
|
| BLAKE2b-256 |
06805ff46f3fb1c4fc0c8a2b7854619f0bc5fc3867161e911c57a4c5fb081409
|