Every graph compiles to standalone Python (LangGraph) you own. Hit a limit? Drop into a Custom Code node — it round-trips verbatim.
Input, Agent, Tools, Router, Evaluator, Memory, Responder/Revisor. Wire them into anything from a simple reflex to full Reflexion.
Stream your agent in the playground. The built-in fake model needs no API key — bring OpenAI or Anthropic when you're ready.
Start from a template, or drop nodes and connect them. The canvas is just state — nodes and edges.
Chat with it in the playground. Watch tokens stream and tool calls fire, turn by turn.
Open the Code view and copy idiomatic LangGraph. Zero Calypr dependency, zero lock-in.
Eight archetypes from a single reflex up to tool-using ReAct and self-revising Reflexion. Load one, run it, read its code.
Reacts to the latest input.
Remembers the conversation.
Plans toward a goal.
Generates N, keeps the best.
Critiques and revises itself.
Adapts from feedback.
Reasons and calls tools in a loop.
Researches, then self-revises.
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.
"""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()No black box. No lock-in. Draw it, run it, take the code with you.