Build your dreams

Create your own AI apps easily.

No ceiling

Every graph compiles to standalone Python (LangGraph) you own. Hit a limit? Drop into a Custom Code node — it round-trips verbatim.

Composable nodes

Input, Agent, Tools, Router, Evaluator, Memory, Responder/Revisor. Wire them into anything from a simple reflex to full Reflexion.

Run it live

Stream your agent in the playground. The built-in fake model needs no API key — bring OpenAI or Anthropic when you're ready.

how it works

From idea to ownable agent, in three moves.

01

Draw the graph

Start from a template, or drop nodes and connect them. The canvas is just state — nodes and edges.

02

Run & inspect

Chat with it in the playground. Watch tokens stream and tool calls fire, turn by turn.

03

Own the code

Open the Code view and copy idiomatic LangGraph. Zero Calypr dependency, zero lock-in.

start from a template

The agent ladder, ready to run.

Eight archetypes from a single reflex up to tool-using ReAct and self-revising Reflexion. Load one, run it, read its code.

tpl

Simple reflex

Reacts to the latest input.

tpl

Model-based

Remembers the conversation.

tpl

Goal-based

Plans toward a goal.

tpl

Utility-based

Generates N, keeps the best.

tpl

Reflection

Critiques and revises itself.

tpl

Learning

Adapts from feedback.

tpl

ReAct

Reasons and calls tools in a loop.

tpl

Reflexion

Researches, then self-revises.

the canvas is the code

Export Python you’d actually merge.

Every node carries its own code generator, so the graph you draw projects to idiomatic LangGraph — grouped imports, a typed State, one function per node, the canonical tool loop. A round-trip test proves the generated module runs identically to the canvas.

Open the Code view
agent.py
"""ReAct Agent — generated by Calypr. Owns no Calypr dependency."""

def node_agent(state: State) -> dict:
    """Model-based agent: respond using the full conversation state."""
    model = init_chat_model("gpt-4o-mini", temperature=0.7).bind_tools([web_search])
    messages = state.get("messages") or []
    reply = model.invoke([SystemMessage(content=system), *messages])
    return {"messages": [reply]}


def build_graph():
    graph = StateGraph(State)
    graph.add_node("agent", node_agent)
    graph.add_node("tools", ToolNode([web_search]))
    graph.add_conditional_edges("agent", tools_condition, {"tools": "tools", END: "out"})
    graph.add_edge("tools", "agent")
    return graph.compile()

From a prompt to an agent you own.

No black box. No lock-in. Draw it, run it, take the code with you.