Files
letta-server/fern/pages/agents/workflows.mdx
2025-09-09 09:35:12 -07:00

137 lines
4.7 KiB
Plaintext

---
title: Workflows
subtitle: Workflows are systems that execute tool calls in a sequence
slug: guides/agents/architectures/workflows
---
Workflows execute predefined sequences of tool calls with LLM-driven decision making. Use the `workflow_agent` agent type for structured, sequential processes where you need deterministic execution paths.
Workflows are stateless by default but can branch and make decisions based on tool outputs and LLM reasoning.
## Agents vs Workflows
**Agents** are autonomous systems that decide what tools to call and when, based on goals and context.
**Workflows** are predefined sequences where the LLM follows structured paths (for example, start with tool A, then call either tool B or tool C), making decisions within defined branching points.
The definition between an *agent* and a *workflow* is not always clear and each can have various overlapping levels of autonomy: workflows can be made more autonomous by structuring the decision points to be highly general, and agents can be made more deterministic by adding tool rules to constrain their behavior.
## Workflows vs Tool Rules
An alternative to workflows is using autonomous agents (MemGPT, ReAct, Sleep-time) with [tool rules](/guides/agents/tool-rules) to constrain behavior.
**Use the workflow architecture when:**
* You have an existing workflow to implement in Letta (e.g., moving from n8n, LangGraph, or another workflow builder)
* You need strict sequential execution with minimal autonomy
**Use tool rules (on top of other agent architectures) when:**
* You want more autonomous behavior, but with certain guardrails
* Your task requires adaptive decision making (tool sequences are hard to predict)
* You want to have the flexibility (as a developer) to adapt the level of autonomy (for example, reducing constraints as the underlying LLMs improve)
## Creating Workflows
Workflows are created using the `workflow_agent` agent type.
By default, there are no constraints on the sequence of tool calls that can be made: to add constraints and build a "graph", you can use the `tool_rules` parameter to add tool rules to the agent.
For example, in the following code snippet, we are creating a workflow agent that can call the `web_search` tool, and then call either the `send_email` or `create_report` tool, based on the LLM's reasoning.
<CodeGroup>
```python title="python" maxLines=50
from letta_client import Letta
client = Letta(token="LETTA_API_KEY")
# create the workflow agent with tool rules
agent = client.agents.create(
agent_type="workflow_agent",
model="openai/gpt-4.1",
embedding="openai/text-embedding-3-small",
tools=["web_search", "send_email", "create_report"],
tool_rules=[
{
"tool_name": "web_search",
"type": "run_first"
},
{
"tool_name": "web_search",
"type": "constrain_child_tools",
"children": ["send_email", "create_report"]
},
{
"tool_name": "send_email",
"type": "exit_loop"
},
{
"tool_name": "create_report",
"type": "exit_loop"
}
]
)
```
```typescript title="node.js" maxLines=50
import { LettaClient } from '@letta-ai/letta-client'
const client = new LettaClient({ token: "LETTA_API_KEY" });
// create the workflow agent with tool rules
const agent = await client.agents.create({
agentType: "workflow_agent",
model: "openai/gpt-4.1",
embedding: "openai/text-embedding-3-small",
tools: ["web_search", "send_email", "create_report"],
toolRules: [
{
toolName: "web_search",
type: "run_first"
},
{
toolName: "web_search",
type: "constrain_child_tools",
children: ["send_email", "create_report"]
},
{
toolName: "send_email",
type: "exit_loop"
},
{
toolName: "create_report",
type: "exit_loop"
}
]
});
```
```bash title="curl" maxLines=50
curl -X POST https://api.letta.com/v1/agents \
-H "Authorization: Bearer $LETTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_type": "workflow_agent",
"model": "openai/gpt-4.1",
"embedding": "openai/text-embedding-3-small",
"tools": ["web_search", "send_email", "create_report"],
"tool_rules": [
{
"tool_name": "web_search",
"type": "run_first"
},
{
"tool_name": "web_search",
"type": "constrain_child_tools",
"children": ["send_email", "create_report"]
},
{
"tool_name": "send_email",
"type": "exit_loop"
},
{
"tool_name": "create_report",
"type": "exit_loop"
}
]
}'
```
</CodeGroup>