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

211 lines
6.3 KiB
Plaintext

# Scheduling
**Scheduling** is a technique for triggering Letta agents at regular intervals.
Many real-world applications require proactive behavior, such as checking emails every few hours or scraping news sites.
Scheduling can support autonomous agents with the capability to manage ongoing processes.
<Note>
Native scheduling functionality is on the Letta Cloud roadmap. The approaches described in this guide are temporary solutions that work with both self-hosted and cloud deployments.
</Note>
## Common Use Cases
When building autonomous agents with Letta, you often need to trigger them at regular intervals for tasks like:
- **System Monitoring**: Health checks that adapt based on historical patterns
- **Data Processing**: Intelligent ETL processes that handle edge cases contextually
- **Memory Maintenance**: Agents that optimize their own knowledge base over time
- **Proactive Notifications**: Context-aware alerts that consider user preferences and timing
- **Continuous Learning**: Agents that regularly ingest new information and update their understanding
This guide covers simple approaches to implement scheduled agent interactions.
## Option 1: Simple Loop
The most straightforward approach for development and testing:
<CodeGroup>
```python title="python"
import time
from letta_client import Letta
from datetime import datetime
client = Letta(base_url="http://localhost:8283")
agent_id = "your_agent_id"
while True:
response = client.agents.messages.create(
agent_id=agent_id,
messages=[{
"role": "user",
"content": f"Scheduled check at {datetime.now()}"
}]
)
print(f"[{datetime.now()}] Agent responded")
time.sleep(300) # 5 minutes
```
```typescript title="node.js"
import { LettaClient } from '@letta-ai/letta-client';
const client = new LettaClient({ baseUrl: "http://localhost:8283" });
const agentId = "your_agent_id";
while (true) {
const response = await client.agents.messages.create(agentId, {
messages: [{
role: "user",
content: `Scheduled check at ${new Date()}`
}]
});
console.log(`[${new Date()}] Agent responded`);
await new Promise(resolve => setTimeout(resolve, 300000)); // 5 minutes
}
```
</CodeGroup>
**Pros:** Simple, easy to debug
**Cons:** Blocks terminal, stops if process dies
## Option 2: System Cron Jobs
For production deployments, use cron for reliability:
<CodeGroup>
```python title="python"
#!/usr/bin/env python3
from letta_client import Letta
from datetime import datetime
try:
client = Letta(base_url="http://localhost:8283")
response = client.agents.messages.create(
agent_id="your_agent_id",
messages=[{
"role": "user",
"content": "Scheduled maintenance check"
}]
)
print(f"[{datetime.now()}] Success")
except Exception as e:
print(f"[{datetime.now()}] Error: {e}")
```
```typescript title="node.js"
#!/usr/bin/env node
import { LettaClient } from '@letta-ai/letta-client';
async function sendMessage() {
try {
const client = new LettaClient({ baseUrl: "http://localhost:8283" });
const response = await client.agents.messages.create("your_agent_id", {
messages: [{
role: "user",
content: "Scheduled maintenance check"
}]
});
console.log(`[${new Date()}] Success`);
} catch (error) {
console.error(`[${new Date()}] Error:`, error);
}
}
sendMessage();
```
</CodeGroup>
Add to crontab with `crontab -e`:
```bash
*/5 * * * * /usr/bin/python3 /path/to/send_message.py >> /var/log/letta_cron.log 2>&1
# or for Node.js:
*/5 * * * * /usr/bin/node /path/to/send_message.js >> /var/log/letta_cron.log 2>&1
```
**Pros:** System-managed, survives reboots
**Cons:** Requires cron access
## Best Practices
1. **Error Handling**: Always wrap API calls in try-catch blocks
2. **Logging**: Log both successes and failures for debugging
3. **Environment Variables**: Store credentials securely
4. **Rate Limiting**: Respect API limits and add backoff for failures
## Example: Memory Maintenance Bot
Complete example that performs periodic memory cleanup:
<CodeGroup>
```python title="python"
#!/usr/bin/env python3
import logging
from datetime import datetime
from letta_client import Letta
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
def run_maintenance():
try:
client = Letta(base_url="http://localhost:8283")
agent_id = "your_agent_id"
response = client.agents.messages.create(
agent_id=agent_id,
messages=[{
"role": "user",
"content": "Please review your memory blocks for outdated information and clean up as needed."
}]
)
# Print any assistant messages
for message in response.messages:
if message.message_type == "assistant_message":
logging.info(f"Agent response: {message.content[:100]}...")
except Exception as e:
logging.error(f"Maintenance failed: {e}")
if __name__ == "__main__":
run_maintenance()
```
```typescript title="node.js"
#!/usr/bin/env node
import { LettaClient } from '@letta-ai/letta-client';
async function runMaintenance() {
try {
const client = new LettaClient({ baseUrl: "http://localhost:8283" });
const agentId = "your_agent_id";
const response = await client.agents.messages.create(agentId, {
messages: [{
role: "user",
content: "Please review your memory blocks for outdated information and clean up as needed."
}]
});
// Print any assistant messages
for (const message of response.messages) {
if (message.messageType === "assistant_message") {
console.log(`Agent response: ${message.content?.substring(0, 100)}...`);
}
}
} catch (error) {
console.error("Maintenance failed:", error);
}
}
// Run if called directly
if (import.meta.url === `file://${process.argv[1]}`) {
runMaintenance();
}
```
</CodeGroup>
Choose the scheduling method that best fits your deployment environment. For production systems, cron offers the best reliability, while simple loops are perfect for development and testing.