* feat: add two-way mode control for listener connections Enable bidirectional permission mode control between letta-cloud UI and letta-code instances. **Backend:** - Added ModeChangeMessage and ModeChangedMessage to WebSocket protocol - Added sendModeChange endpoint (/v1/listeners/:connectionId/mode) - listenersRouter publishes mode_change via Redis Pub/Sub - listenersHandler handles mode_changed acknowledgments from letta-code - Stores current mode in Redis for UI state sync **Contract:** - Added sendModeChange contract with PermissionModeSchema - 4 modes: default, acceptEdits, plan, bypassPermissions **Frontend:** - Extended PermissionMode type to 4 modes (was 2: ask/never) - PermissionModeSelector now shows all 4 modes with descriptions - Added disabled prop (grayed out when Cloud orchestrator selected) - PermissionModeContext.sendModeChangeToDevice() calls API - AgentMessenger sends mode changes to device on mode/device change - Updated auto-approval logic (only in Cloud mode, only for bypassPermissions) - Updated inputMode logic (device handles approvals, not cloud) **Translations:** - Updated en.json with 4 mode labels and descriptions - Removed legacy "askAlways" and "neverAsk" keys **Mode Behavior:** - default: Ask permission for each tool - acceptEdits: Auto-approve file edits only - plan: Read-only exploration (denies writes) - bypassPermissions: Auto-approve everything **Lint Fixes:** - Removed unused imports and functions from trackingMiddleware.ts 🐾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta <noreply@letta.com> * fix: store mode in connectionData and show approvals for all modes **Backend:** - Fixed Redis WRONGTYPE error - store currentMode inside connectionData object - Changed const connectionData to let connectionData (needs mutation) - Updated mode_changed handler to reassign entire connectionData object - Updated ping handler for consistency (also reassigns connectionData) - Added currentMode field to ListenerConnectionSchema (optional) **Frontend:** - Simplified inputMode logic - always show approval UI when toolCallsToApprove.length > 0 - Removed mode-specific approval filtering (show approvals even in bypass/acceptEdits for visibility) - Users can see what tools are being auto-approved during execution **Why:** - Redis key is a JSON string (via setRedisData), not a hash - Cannot use hset on string keys - causes WRONGTYPE error - Must update entire object via setRedisData like ping handler does - Approval visibility helpful for debugging/understanding agent behavior 🐾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta <noreply@letta.com> * fix: use useMutation hook for sendModeChange instead of direct call cloudAPI is initialized via initTsrReactQuery, so sendModeChange is a mutation hook object, not a callable function. Use .useMutation() at the component level and mutateAsync in the callback. Co-authored-by: Shubham Naik <4shub@users.noreply.github.com> * chore: update logs --------- Co-authored-by: Letta <noreply@letta.com> Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com> Co-authored-by: Shubham Naik <4shub@users.noreply.github.com>
Letta (formerly MemGPT)
Letta is the platform for building stateful agents: AI with advanced memory that can learn and self-improve over time.
- Letta Code: run agents locally in your terminal
- Letta API: build agents into your applications
Get started in the CLI
Requires Node.js 18+
- Install the Letta Code CLI tool:
npm install -g @letta-ai/letta-code - Run
lettain your terminal to launch an agent with memory running on your local computer
When running the CLI tool, your agent help you code and do any task you can do on your computer.
Letta Code supports skills and subagents, and bundles pre-built skills/subagents for advanced memory and continual learning. Letta is fully model-agnostic, though we recommend Opus 4.5 and GPT-5.2 for best performance (see our model leaderboard for our rankings).
Get started with the Letta API
Use the Letta API to integrate stateful agents into your own applications. Letta has a full-featured agents API, and a Python and Typescript SDK (view our API reference).
Installation
TypeScript / Node.js:
npm install @letta-ai/letta-client
Python:
pip install letta-client
Hello World example
Below is a quick example of creating a stateful agent and sending it a message (requires a Letta API key). See the full quickstart guide for complete documentation.
TypeScript:
import Letta from "@letta-ai/letta-client";
const client = new Letta({ apiKey: process.env.LETTA_API_KEY });
// Create your agent
const agentState = await client.agents.create({
model: "openai/gpt-5.2",
memory_blocks: [
{
label: "human",
value:
"Name: Timber. Status: dog. Occupation: building Letta, infrastructure to democratize self-improving superintelligence",
},
{
label: "persona",
value:
"I am a self-improving superintelligence. Timber is my best friend and collaborator.",
},
],
tools: ["web_search", "fetch_webpage"],
});
console.log("Agent created with ID:", agentState.id);
// Send your agent a message
const response = await client.agents.messages.create(agentState.id, {
input: "What do you know about me?",
});
for (const message of response.messages) {
console.log(message);
}
Python:
from letta_client import Letta
import os
client = Letta(api_key=os.getenv("LETTA_API_KEY"))
# Create your agent
agent_state = client.agents.create(
model="openai/gpt-5.2",
memory_blocks=[
{
"label": "human",
"value": "Name: Timber. Status: dog. Occupation: building Letta, infrastructure to democratize self-improving superintelligence"
},
{
"label": "persona",
"value": "I am a self-improving superintelligence. Timber is my best friend and collaborator."
}
],
tools=["web_search", "fetch_webpage"]
)
print(f"Agent created with ID: {agent_state.id}")
# Send your agent a message
response = client.agents.messages.create(
agent_id=agent_state.id,
input="What do you know about me?"
)
for message in response.messages:
print(message)
Contributing
Letta is an open source project built by over a hundred contributors from around the world. There are many ways to get involved in the Letta OSS project!
- Join the Discord: Chat with the Letta devs and other AI developers.
- Chat on our forum: If you're not into Discord, check out our developer forum.
- Follow our socials: Twitter/X, LinkedIn, YouTube
Legal notices: By using Letta and related Letta services (such as the Letta endpoint or hosted service), you are agreeing to our privacy policy and terms of service.
