packages/examples/farcaster/README.md
A self-contained reference showing how to run an elizaOS agent that monitors and posts on Farcaster – implemented in TypeScript, Python, and Rust.
| Component | Description |
|---|---|
| Text generation + embeddings | OpenAI via plugin-openai |
| Farcaster integration | Neynar API via plugin-farcaster |
| Persistence | plugin-sql (PGLite or PostgreSQL) |
The agent responds to mentions in your Farcaster feed and can autonomously post casts.
cd typescript
cp ../env.example .env
# Edit .env with your credentials
bun install
bun run start
cd python
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp ../env.example .env
# Edit .env with your credentials
python agent.py
cd rust/farcaster-agent
cp ../../env.example .env
# Edit .env with your credentials
cargo run --release
Copy env.example to .env and fill in the required values:
| Variable | Required | Description |
|---|---|---|
OPENAI_API_KEY | Yes | OpenAI API key |
FARCASTER_FID | Yes | Your Farcaster ID (FID) |
FARCASTER_SIGNER_UUID | Yes | Neynar signer UUID |
FARCASTER_NEYNAR_API_KEY | Yes | Neynar API key |
FARCASTER_DRY_RUN | No | Set to true to disable posting (default: true) |
FARCASTER_MODE | No | polling or webhook (default: polling) |
FARCASTER_POLL_INTERVAL | No | Polling interval in seconds (default: 120) |
ENABLE_CAST | No | Enable autonomous casting (default: false) |
CAST_INTERVAL_MIN | No | Min minutes between autonomous casts (default: 90) |
CAST_INTERVAL_MAX | No | Max minutes between autonomous casts (default: 180) |
MAX_CAST_LENGTH | No | Maximum cast length (default: 320) |
DATABASE_URL | No | PostgreSQL URL (uses PGLite if not set) |
For each incoming mention, the examples route the event through the elizaOS "message service" for consistent state composition and response generation.
@elizaos/plugin-farcaster which registers:
FarcasterService (handles polling, client lifecycle)SEND_CAST, REPLY_TO_CASTfarcasterProfile, farcasterTimeline, farcasterThreadFarcasterService background clientsruntime.messageService.handleMessage() inside the pluginFarcasterClient and calls runtime.message_service.handle_message()DefaultMessageService implements the canonical flow:
FarcasterService and calls runtime.message_service().handle_message()DefaultMessageService is response-focused (saves message, composes state, calls model, returns response)For each incoming mention:
Memory for the Farcaster cast (stable IDs per cast/thread)FARCASTER_DRY_RUN=true)TypeScript relies on the plugin-farcaster service for polling and posting; Python/Rust run explicit polling loops.
The default character (FarcasterBot) is configured as a helpful AI agent on Farcaster. Customize character.ts (or character.py/character.rs) to change:
message_service.handle_message() for proper state composition and response generationThe @elizaos/plugin-farcaster plugin provides these components (auto-registered in TypeScript, available for manual use in Python/Rust):
| Action | Description | Trigger Keywords |
|---|---|---|
SEND_CAST | Post a new cast to Farcaster | "post", "cast", "share", "announce" |
REPLY_TO_CAST | Reply to an existing cast | "reply", "respond", "answer", "comment" |
| Provider | Description |
|---|---|
farcasterProfile | Agent's Farcaster profile (username, FID, bio) |
farcasterTimeline | Recent casts from agent's timeline |
farcasterThread | Thread context for ongoing conversations |
| Service | Description |
|---|---|
FarcasterService | Main service managing client lifecycle, polling, and cast operations |
examples/farcaster/
├── README.md # This file
├── env.example # Environment variable template
├── .gitignore # Git ignore rules
├── typescript/ # TypeScript implementation
│ ├── agent.ts # Main entry point
│ ├── character.ts # Character configuration
│ ├── package.json # Dependencies
│ └── tsconfig.json # TypeScript config
├── python/ # Python implementation
│ ├── agent.py # Main entry point
│ ├── character.py # Character configuration
│ └── requirements.txt
└── rust/ # Rust implementation
└── farcaster-agent/
├── Cargo.toml
├── src/
│ ├── main.rs
│ └── character.rs
└── tests/
└── smoke.rs
Create a signer at neynar.com and add the UUID to your .env file.
The agent handles 429 errors automatically with exponential backoff. You can also increase FARCASTER_POLL_INTERVAL.
Casts are automatically truncated to MAX_CAST_LENGTH (default 320 characters).