Skip to main content

Simple, flexible AI agent framework with a small DSL and explicit state

Project description

PicoFlow — Simple, Flexible AI Agent Framework

Build agents with explicit steps and a small DSL.
LLMs, tools, loops, and branches compose naturally.


A Minimal PicoFlow Application

from picoflow import flow, llm, create_agent

LLM_URL = "llm+openai://api.openai.com/v1/chat/completions?model=gpt-4.1-mini&api_key_env=OPENAI_API_KEY&insecure=1"

@flow
async def mem(ctx):
    return ctx.add_memory("user", ctx.input)

agent = create_agent(
    mem >> llm("Answer in one sentence: {input}", llm_adapter=LLM_URL)
)

print(agent.get_output("What is PicoFlow?", trace=True))
export OPENAI_API_KEY=sk-...
python minimal.py

Core Ideas

  • Flow = step
    A flow is just a Python function that takes and returns State.

  • DSL = pipeline
    Use >> to compose steps into readable execution graphs.

  • Agent = runner
    create_agent(flow) gives you run / arun / get_output.

  • State = context (Ctx)
    Ctx is an alias of State. It is immutable and explicit.


Quick Start (Step by Step)

1. Define Steps with @flow

from picoflow import flow, Ctx

@flow
async def normalize(ctx: Ctx) -> Ctx:
    return ctx.update(input=ctx.input.strip().lower())

2. Call LLM as a Step

from picoflow import llm

ask = llm("Answer briefly: {input}")

3. Compose with DSL

pipeline = normalize >> ask

4. Run with Agent

from picoflow import create_agent

agent = create_agent(pipeline)

state = await agent.arun("Hello WORLD")
print(state.output)

DSL in One Minute

Sequential

flow = a >> b >> c

Loop

flow = step.repeat()

or:

flow = repeat(step, until=lambda s: s.done)

Parallel + Merge

flow = fork(a, b) >> merge()

Custom merge:

flow = fork(a, b) >> merge(
    mode=MergeType.CUSTOM,
    reducer=lambda branches, main: branches[0]
)

LLM URL

from picoflow.adapters.registry import from_url

adapter = from_url(
    "llm+openai://api.openai.com/v1/chat/completions"
    "?model=gpt-4.1-mini&api_key_env=OPENAI_API_KEY&insecure=1"
)

Then:

flow = llm("Explain: {input}", llm_adapter=adapter)

Custom Adapters

class MyAdapter(LLMAdapter):
    def __call__(self, prompt: str, stream: bool):
        ...
from picoflow.adapters.registry import register

register("myllm", lambda url: MyAdapter(...))

Use:

llm+myllm://host/model?param=value

Runtime Options

Tracing

await agent.arun("hi", trace=True)

Timeout

await agent.arun("hi", timeout=10)

Streaming

async def on_chunk(text: str):
    print(text, end="", flush=True)

await agent.arun("stream me", stream_callback=on_chunk)

Tools

from picoflow import tool

flow = tool("search", lambda q: {"result": "..."} )

Results:

state.tools["search"]

Troubleshooting: SSL certificate verify failed

Recommended (secure): set your CA bundle

export SSL_CERT_FILE=/path/to/ca.pem
# or
export PICO_CA_FILE=/path/to/ca.pem

Quick debug (insecure): disable verification temporarily

...&insecure=1

or

export PICO_SSL_VERIFY=0

Do not use this in production.

Note: Local Ollama usage (llm+ollama://localhost:11434/...) uses plain HTTP and does not require SSL configuration.


📚 Cookbook (Examples)

The cookbook/ directory contains small, focused examples for common patterns.
Each folder is runnable and demonstrates one specific feature or usage style.

cookbook/
├─ minimal-demo        # Smallest runnable PicoFlow example
├─ multiple-crew       # Multi-agent / crew-style collaboration
├─ simple-chat         # Basic chat agent
├─ simple-chat-stream  # Streaming responses from LLM
├─ simple-tool         # Tool calling and tool state
└─ trace               # Tracing and execution visualization

How to run

All examples are standalone scripts:

export OPENAI_API_KEY=sk-...
cd cookbook/simple-chat
python main.py

When to use which example

  • Start hereminimal-demo
    Understand Flow, DSL (>>), and Agent execution.

  • LLM interactionsimple-chat, simple-chat-stream
    Prompt → response, with and without streaming.

  • Tool callingsimple-tool
    How tools are defined, executed, and stored in state.tools.

  • Multi-step / multi-agentmultiple-crew
    Composition of multiple flows and roles.

  • Debugging & observabilitytrace
    How tracing hooks and structured events work.

Cookbook examples are intentionally small and close to real usage.
They are recommended as the primary learning path after reading the Minimal Example.


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

picoflow-0.1.2.tar.gz (19.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

picoflow-0.1.2-py3-none-any.whl (23.0 kB view details)

Uploaded Python 3

File details

Details for the file picoflow-0.1.2.tar.gz.

File metadata

  • Download URL: picoflow-0.1.2.tar.gz
  • Upload date:
  • Size: 19.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.10

File hashes

Hashes for picoflow-0.1.2.tar.gz
Algorithm Hash digest
SHA256 303a8230a859788b56ccba644fcc1826fe802bc0d1575b7d83ddf184b9b9d73b
MD5 2fab23d61280c25790c562066cd38d54
BLAKE2b-256 39d56cdfa446498b3b83e4a242d89810dc9a81fdcf34c0d273c6dee8b6175267

See more details on using hashes here.

File details

Details for the file picoflow-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: picoflow-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 23.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.10

File hashes

Hashes for picoflow-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5ba1308cb3ed9d1a90901797dfbb8d596fa3046f977eaedd2690db35b0b49898
MD5 e52b1e489a0076b9e38a7333d7acce7d
BLAKE2b-256 8d2498dab584f4a4c0014ef6e7e6fb883d83c899f8abe1f78c7ee821faced1b8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page