@letta-ai/letta-agent-sdk 0.2.7 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +91 -325
- package/dist/app-server-management.d.ts +28 -0
- package/dist/app-server-management.d.ts.map +1 -0
- package/dist/app-server-session.d.ts +13 -18
- package/dist/app-server-session.d.ts.map +1 -1
- package/dist/client-base.d.ts +61 -0
- package/dist/client-base.d.ts.map +1 -0
- package/dist/client-entry.d.ts +19 -0
- package/dist/client-entry.d.ts.map +1 -0
- package/dist/client-entry.js +9143 -0
- package/dist/client-entry.js.map +25 -0
- package/dist/client.d.ts +8 -49
- package/dist/client.d.ts.map +1 -1
- package/dist/cloud-management.d.ts +25 -0
- package/dist/cloud-management.d.ts.map +1 -0
- package/dist/cloud-session.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8556 -6439
- package/dist/index.js.map +20 -37
- package/dist/interactiveToolPolicy.d.ts +7 -0
- package/dist/interactiveToolPolicy.d.ts.map +1 -1
- package/dist/local-app-server-session.d.ts +4 -0
- package/dist/local-app-server-session.d.ts.map +1 -0
- package/dist/management-types.d.ts +110 -0
- package/dist/management-types.d.ts.map +1 -0
- package/dist/management.d.ts +21 -0
- package/dist/management.d.ts.map +1 -0
- package/dist/remote-client-session-core.d.ts +8 -7
- package/dist/remote-client-session-core.d.ts.map +1 -1
- package/dist/session.d.ts +5 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/tests/advanced-session.d.ts +1 -9
- package/dist/tests/advanced-session.d.ts.map +1 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/types.d.ts +193 -15
- package/dist/types.d.ts.map +1 -1
- package/dist/websocket.d.ts +9 -0
- package/dist/websocket.d.ts.map +1 -0
- package/package.json +9 -2
- package/dist/dream/agent.d.ts +0 -55
- package/dist/dream/agent.d.ts.map +0 -1
- package/dist/dream/aggregate.d.ts +0 -38
- package/dist/dream/aggregate.d.ts.map +0 -1
- package/dist/dream/batching.d.ts +0 -12
- package/dist/dream/batching.d.ts.map +0 -1
- package/dist/dream/clone.d.ts +0 -14
- package/dist/dream/clone.d.ts.map +0 -1
- package/dist/dream/cursors.d.ts +0 -7
- package/dist/dream/cursors.d.ts.map +0 -1
- package/dist/dream/index.d.ts +0 -67
- package/dist/dream/index.d.ts.map +0 -1
- package/dist/dream/memfs.d.ts +0 -75
- package/dist/dream/memfs.d.ts.map +0 -1
- package/dist/dream/normalize-core.d.ts +0 -67
- package/dist/dream/normalize-core.d.ts.map +0 -1
- package/dist/dream/prompts.d.ts +0 -26
- package/dist/dream/prompts.d.ts.map +0 -1
- package/dist/dream/redact.d.ts +0 -3
- package/dist/dream/redact.d.ts.map +0 -1
- package/dist/dream/reflect.d.ts +0 -49
- package/dist/dream/reflect.d.ts.map +0 -1
- package/dist/dream/registry.d.ts +0 -4
- package/dist/dream/registry.d.ts.map +0 -1
- package/dist/dream/runner.d.ts +0 -30
- package/dist/dream/runner.d.ts.map +0 -1
- package/dist/dream/sdk-messages.d.ts +0 -4
- package/dist/dream/sdk-messages.d.ts.map +0 -1
- package/dist/dream/select.d.ts +0 -6
- package/dist/dream/select.d.ts.map +0 -1
- package/dist/dream/sources/claude-code.d.ts +0 -18
- package/dist/dream/sources/claude-code.d.ts.map +0 -1
- package/dist/dream/sources/codex.d.ts +0 -20
- package/dist/dream/sources/codex.d.ts.map +0 -1
- package/dist/dream/sources/letta.d.ts +0 -3
- package/dist/dream/sources/letta.d.ts.map +0 -1
- package/dist/dream/sources/openhands.d.ts +0 -43
- package/dist/dream/sources/openhands.d.ts.map +0 -1
- package/dist/dream/sources/transcript-file.d.ts +0 -8
- package/dist/dream/sources/transcript-file.d.ts.map +0 -1
- package/dist/dream/store-utils.d.ts +0 -21
- package/dist/dream/store-utils.d.ts.map +0 -1
- package/dist/dream/transcripts.d.ts +0 -27
- package/dist/dream/transcripts.d.ts.map +0 -1
- package/dist/dream/types.d.ts +0 -48
- package/dist/dream/types.d.ts.map +0 -1
- package/dist/dream/workers.d.ts +0 -12
- package/dist/dream/workers.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@letta-ai/letta-agent-sdk) [](https://discord.gg/letta)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Build applications with stateful agents powered by the [Letta agent harness](https://www.letta.com/agent). The Agent SDK provides one TypeScript interface for managed, local, and self-hosted deployments.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -10,399 +10,165 @@ The SDK interface to [**Letta Code**](https://github.com/letta-ai/letta-code). B
|
|
|
10
10
|
npm install @letta-ai/letta-agent-sdk
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Local execution requires Node.js 22.19 or newer.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
## Quick start
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
18
|
import { LettaAgentClient } from "@letta-ai/letta-agent-sdk";
|
|
19
19
|
|
|
20
|
-
// Local: SDK-owned Letta Code app-server over loopback websockets. The SDK
|
|
21
|
-
// spawns/manages the app-server process for you.
|
|
22
|
-
const localClient = new LettaAgentClient({ backend: "local" });
|
|
23
|
-
|
|
24
|
-
// Remote: connect to a user-managed Letta Code app-server over websockets.
|
|
25
|
-
const remoteClient = new LettaAgentClient({
|
|
26
|
-
backend: "remote",
|
|
27
|
-
url: "http://127.0.0.1:4500",
|
|
28
|
-
// Required when the app-server is bound to a non-loopback interface with
|
|
29
|
-
// --ws-auth capability-token.
|
|
30
|
-
authToken: process.env.LETTA_APP_SERVER_TOKEN,
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// Constellation: create or resume agents whose state lives in Letta's
|
|
34
|
-
// agent cloud, with an SDK-managed sandbox by default.
|
|
35
20
|
const client = new LettaAgentClient({
|
|
36
21
|
backend: "cloud",
|
|
37
22
|
apiKey: process.env.LETTA_API_KEY,
|
|
38
23
|
});
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Persistent agent with multi-turn conversations
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
import { LettaAgentClient } from "@letta-ai/letta-agent-sdk";
|
|
45
|
-
|
|
46
|
-
const client = new LettaAgentClient({ backend: "local" });
|
|
47
24
|
|
|
48
25
|
const agentId = await client.createAgent({
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
await using session = client.resumeSession(agentId);
|
|
53
|
-
|
|
54
|
-
await session.send("Find and fix the bug in auth.ts");
|
|
55
|
-
for await (const msg of session.stream()) {
|
|
56
|
-
if (msg.type === "assistant") console.log(msg.content);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
await session.send("Add a unit test for the fix");
|
|
60
|
-
for await (const msg of session.stream()) {
|
|
61
|
-
if (msg.type === "assistant") console.log(msg.content);
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
Cloud, remote, and local agent sessions can accept another `send()` while a
|
|
66
|
-
turn is streaming. The SDK sends the same `input` frame used by Letta Desktop
|
|
67
|
-
and the listener owns queueing; `stream()` may surface `queue_update` events
|
|
68
|
-
before the current turn's `result`.
|
|
69
|
-
|
|
70
|
-
By default, `resumeSession(agentId)` continues the agent’s default conversation.
|
|
71
|
-
Use `createSession(agentId)` when you want to start a fresh thread.
|
|
72
|
-
|
|
73
|
-
For Constellation agents, omitting `environment` lets the SDK create and manage
|
|
74
|
-
a sandbox for the session. `environment` is still session-scoped and can
|
|
75
|
-
override the client default when you want to use a specific remote runtime:
|
|
76
|
-
|
|
77
|
-
```ts
|
|
78
|
-
await using session = client.resumeSession(agentId, {
|
|
79
|
-
environment: { name: "LettaDevelopers" },
|
|
80
|
-
});
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
The top-level helpers (`createAgent`, `createSession`, `resumeSession`, and
|
|
84
|
-
`prompt`) remain available. Local helper calls use Letta Code's default agent
|
|
85
|
-
selection when you do not pass an agent ID.
|
|
86
|
-
|
|
87
|
-
### User-managed app-server backend
|
|
88
|
-
|
|
89
|
-
Use `backend: "remote"` when you already have a Letta Code app-server running.
|
|
90
|
-
The app-server URL selects the execution environment; the SDK uses the same
|
|
91
|
-
Letta Code websocket protocol for `runtime_start`, `input`, streaming deltas,
|
|
92
|
-
and SDK-defined external tools.
|
|
93
|
-
|
|
94
|
-
```ts
|
|
95
|
-
const client = new LettaAgentClient({
|
|
96
|
-
backend: "remote",
|
|
97
|
-
url: "http://127.0.0.1:4500",
|
|
98
|
-
authToken: process.env.LETTA_APP_SERVER_TOKEN,
|
|
99
|
-
requestTimeoutMs: 120_000,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
const agentId = await client.createAgent({
|
|
103
|
-
model: "anthropic/claude-sonnet-4",
|
|
104
|
-
persona: "You are a helpful coding assistant.",
|
|
26
|
+
model: "anthropic/claude-opus-4-8",
|
|
27
|
+
persona: "You are a proactive research assistant.",
|
|
28
|
+
human: "The user prefers concise summaries with sources and next steps.",
|
|
105
29
|
});
|
|
106
30
|
|
|
107
31
|
await using session = client.createSession(agentId);
|
|
108
32
|
|
|
109
|
-
await session.send("
|
|
110
|
-
for await (const
|
|
111
|
-
if (
|
|
33
|
+
await session.send("Research the latest project changes and prepare a brief.");
|
|
34
|
+
for await (const message of session.stream()) {
|
|
35
|
+
if (message.type === "assistant") {
|
|
36
|
+
console.log(message.content);
|
|
37
|
+
}
|
|
112
38
|
}
|
|
113
39
|
```
|
|
114
40
|
|
|
41
|
+
An agent is the persistent entity with memory. A conversation is a thread on that agent. A session is the active connection used to send messages, stream events, execute tools, and handle approvals.
|
|
115
42
|
|
|
116
|
-
|
|
43
|
+
- `createSession(agentId)` starts a new conversation.
|
|
44
|
+
- `resumeSession(conversationId)` resumes a saved conversation.
|
|
45
|
+
- `resumeSession(agentId)` resumes the agent's default conversation.
|
|
46
|
+
- `prompt(message, agentId)` runs a one-shot prompt in a new conversation.
|
|
117
47
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
come online, and refreshes it while the session is active. Non-default
|
|
121
|
-
conversations request a conversation-scoped sandbox from supporting servers;
|
|
122
|
-
the default conversation and legacy servers retain the agent-scoped lifecycle.
|
|
123
|
-
Managed sandboxes are left for TTL cleanup by default so another session for the
|
|
124
|
-
same conversation can reconnect to them.
|
|
48
|
+
Portable sessions also expose the stateful controls needed by interactive
|
|
49
|
+
clients:
|
|
125
50
|
|
|
126
51
|
```ts
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
// Optional: defaults to a 5-minute refresh TTL.
|
|
132
|
-
ttlMinutes: 5,
|
|
133
|
-
// Optional: defaults false. Set true only with exclusive ownership.
|
|
134
|
-
terminateOnClose: false,
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
const agentId = await client.createAgent({
|
|
139
|
-
model: "anthropic/claude-sonnet-4",
|
|
140
|
-
persona: "You are a helpful coding assistant.",
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
await using session = client.resumeSession(agentId, {
|
|
144
|
-
permissionMode: "unrestricted",
|
|
52
|
+
const state = await session.bootstrapState();
|
|
53
|
+
await session.changeDeviceState({
|
|
54
|
+
cwd: "/workspace/project",
|
|
55
|
+
permissionMode: "acceptEdits",
|
|
145
56
|
});
|
|
146
57
|
|
|
147
|
-
await session.
|
|
148
|
-
|
|
149
|
-
|
|
58
|
+
const removed = await session.removeQueuedMessage(queueItemId);
|
|
59
|
+
if (!removed.removed) {
|
|
60
|
+
// Reconcile the authoritative queue before offering the action again.
|
|
150
61
|
}
|
|
62
|
+
|
|
63
|
+
await session.recoverPendingApprovals();
|
|
151
64
|
```
|
|
152
65
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
66
|
+
`removeQueuedMessage()` waits for an app-server acknowledgement.
|
|
67
|
+
`changeDeviceState()` currently confirms command transport only because the
|
|
68
|
+
underlying protocol does not acknowledge that mutation.
|
|
156
69
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
70
|
+
The read side of the device state is exposed as a one-shot getter and a
|
|
71
|
+
subscription — enough to restore permission-mode UI and re-surface pending
|
|
72
|
+
approvals when a mobile or web client returns to the foreground:
|
|
160
73
|
|
|
161
74
|
```ts
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
environment: { name: "devbox" },
|
|
166
|
-
});
|
|
75
|
+
const status = await session.getDeviceStatus();
|
|
76
|
+
// status.permissionMode, status.workingDirectory, status.isOnline,
|
|
77
|
+
// status.isProcessing, status.pendingControlRequests, status.raw
|
|
167
78
|
|
|
168
|
-
|
|
169
|
-
|
|
79
|
+
const unsubscribe = session.onDeviceStatus((status) => {
|
|
80
|
+
// Called for every device-status update pushed by the runtime.
|
|
170
81
|
});
|
|
82
|
+
unsubscribe();
|
|
171
83
|
```
|
|
172
84
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
85
|
+
`getDeviceStatus()` always sends a lightweight, request-correlated `sync`
|
|
86
|
+
(`recover_approvals: false`, `force_device_status: true`) and resolves only
|
|
87
|
+
after the runtime acknowledges it and replays a fresh status. This makes the
|
|
88
|
+
getter safe for foreground reconciliation instead of returning a snapshot
|
|
89
|
+
cached before the app was backgrounded. Pending approval request IDs are for
|
|
90
|
+
correlation; decisions continue through `recoverPendingApprovals()` and the
|
|
91
|
+
session's `canUseTool` callback.
|
|
176
92
|
|
|
177
|
-
|
|
178
|
-
await using session = client.resumeSession(agentId, {
|
|
179
|
-
environment: { connectionId: "conn-123" },
|
|
180
|
-
});
|
|
181
|
-
```
|
|
93
|
+
## Deployment options
|
|
182
94
|
|
|
183
|
-
|
|
184
|
-
|
|
95
|
+
| Backend | Agent state | Tool execution |
|
|
96
|
+
| --- | --- | --- |
|
|
97
|
+
| `cloud` | Letta Cloud | Managed cloud sandbox or a selected computer |
|
|
98
|
+
| `local` | Current computer | Current computer through an SDK-managed App Server |
|
|
99
|
+
| `remote` | Configured by the App Server | A user-managed App Server computer |
|
|
185
100
|
|
|
186
|
-
|
|
187
|
-
sandboxes refresh and terminate by sandbox ID. Legacy agent-scoped sandboxes
|
|
188
|
-
retain the latest-active ownership check. Pass `sandbox.terminateOnClose: true`
|
|
189
|
-
to request best-effort eager cleanup, but only when no other session or
|
|
190
|
-
reconnecting client needs the sandbox.
|
|
191
|
-
|
|
192
|
-
If Cloud reaps a conversation-scoped sandbox before the next refresh,
|
|
193
|
-
`send()` throws `CloudManagedSandboxExpiredError` before transmitting the turn.
|
|
194
|
-
Close the old SDK session and resume the same conversation to create a fresh
|
|
195
|
-
connection, then retry safely:
|
|
101
|
+
### Local
|
|
196
102
|
|
|
197
103
|
```ts
|
|
198
|
-
|
|
199
|
-
CloudManagedSandboxExpiredError,
|
|
200
|
-
LettaAgentClient,
|
|
201
|
-
} from "@letta-ai/letta-agent-sdk";
|
|
104
|
+
const client = new LettaAgentClient({ backend: "local" });
|
|
202
105
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
apiKey: process.env.LETTA_API_KEY,
|
|
106
|
+
await using session = client.createSession(agentId, {
|
|
107
|
+
cwd: process.cwd(),
|
|
206
108
|
});
|
|
207
|
-
const conversationId = "conv-123";
|
|
208
|
-
let session = client.resumeSession(conversationId);
|
|
209
|
-
|
|
210
|
-
async function sendWithSandboxRecovery(message: string): Promise<void> {
|
|
211
|
-
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
212
|
-
try {
|
|
213
|
-
await session.send(message);
|
|
214
|
-
for await (const event of session.stream()) {
|
|
215
|
-
if (event.type === "assistant") console.log(event.content);
|
|
216
|
-
}
|
|
217
|
-
return;
|
|
218
|
-
} catch (error) {
|
|
219
|
-
if (!(error instanceof CloudManagedSandboxExpiredError) || attempt > 0) {
|
|
220
|
-
throw error;
|
|
221
|
-
}
|
|
222
|
-
session.close();
|
|
223
|
-
session = client.resumeSession(conversationId);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
109
|
```
|
|
228
110
|
|
|
229
|
-
|
|
230
|
-
fails after `send()` succeeds, inspect conversation history before retrying
|
|
231
|
-
because the original message may already have reached the runtime.
|
|
232
|
-
|
|
233
|
-
By default, websocket authentication uses `Authorization` headers. Set
|
|
234
|
-
`webSocketAuth: "query"` for browser-style websocket clients that cannot send
|
|
235
|
-
custom upgrade headers.
|
|
236
|
-
|
|
237
|
-
## Cloud repositories
|
|
238
|
-
|
|
239
|
-
Cloud clients can create hosted repositories, manage text files inside them,
|
|
240
|
-
and attach repositories to a session as resources. Repository resources are
|
|
241
|
-
attached before the session starts and detached when the SDK session closes.
|
|
111
|
+
### Remote App Server
|
|
242
112
|
|
|
243
113
|
```ts
|
|
244
114
|
const client = new LettaAgentClient({
|
|
245
|
-
backend: "
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
const repo = await client.repositories.create({ name: "inputs" });
|
|
250
|
-
|
|
251
|
-
await client.repositories.files.create(repo.id, {
|
|
252
|
-
path: "data.csv",
|
|
253
|
-
content: csvContent,
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
await using session = client.createSession(agentId, {
|
|
257
|
-
resources: [
|
|
258
|
-
{ type: "repository", repositoryId: repo.id },
|
|
259
|
-
],
|
|
115
|
+
backend: "remote",
|
|
116
|
+
url: "http://127.0.0.1:4500",
|
|
117
|
+
authToken: process.env.LETTA_APP_SERVER_TOKEN,
|
|
260
118
|
});
|
|
261
|
-
|
|
262
|
-
await session.send("Analyze the files in the attached repository.");
|
|
263
119
|
```
|
|
264
120
|
|
|
265
|
-
|
|
266
|
-
version history helpers are available under `client.repositories.versions`.
|
|
121
|
+
See the [deployment guide](https://docs.letta.com/letta-agent-sdk/deployment) for managed sandboxes, remote computers, App Server setup, and authentication.
|
|
267
122
|
|
|
268
|
-
##
|
|
123
|
+
## Browser and React Native
|
|
269
124
|
|
|
270
|
-
|
|
271
|
-
`model`, `reasoningEffort`, `cwd`, `permissionMode`, and dreaming triggers. For
|
|
272
|
-
remote and Constellation sessions, `cwd` must be a path inside the selected
|
|
273
|
-
runtime environment.
|
|
125
|
+
Use the portable `/client` entry point in browser, Expo, and React Native applications. It supports the `cloud` and `remote` backends without importing Node process-management modules.
|
|
274
126
|
|
|
275
127
|
```ts
|
|
276
|
-
import { LettaAgentClient } from "@letta-ai/letta-agent-sdk";
|
|
277
|
-
|
|
278
|
-
const client = new LettaAgentClient({ backend: "local" });
|
|
128
|
+
import { LettaAgentClient } from "@letta-ai/letta-agent-sdk/client";
|
|
279
129
|
|
|
280
|
-
const
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
// sessions, use a path inside the selected runtime environment.
|
|
285
|
-
cwd: "/workspace/project",
|
|
286
|
-
permissionMode: "unrestricted",
|
|
287
|
-
dreaming: {
|
|
288
|
-
trigger: "step-count", // off | step-count | compaction-event
|
|
289
|
-
stepCount: 8,
|
|
290
|
-
},
|
|
130
|
+
const client = new LettaAgentClient({
|
|
131
|
+
backend: "cloud",
|
|
132
|
+
apiKey: userProvidedApiKey,
|
|
133
|
+
webSocketAuth: "query",
|
|
291
134
|
});
|
|
292
135
|
```
|
|
293
136
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
```ts
|
|
297
|
-
const catalog = await session.listModels();
|
|
298
|
-
await session.updateModel({ model: "sonnet", reasoningEffort: "medium" });
|
|
299
|
-
```
|
|
137
|
+
For authenticated Remote App Servers in React Native, pass the platform WebSocket through `createReactNativeWebSocketConstructor()` so capability-token headers use React Native's third constructor argument.
|
|
300
138
|
|
|
301
|
-
|
|
302
|
-
session.
|
|
139
|
+
## Management APIs
|
|
303
140
|
|
|
304
|
-
|
|
305
|
-
protocol commands:
|
|
141
|
+
The client exposes agent, conversation, model, and Cloud repository management alongside active sessions:
|
|
306
142
|
|
|
307
143
|
```ts
|
|
308
|
-
await
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
144
|
+
const agents = await client.agents.list({ tags: ["support"] });
|
|
145
|
+
const conversations = await client.conversations.list({
|
|
146
|
+
agentId: agents[0].id,
|
|
147
|
+
orderBy: "lastMessageAt",
|
|
148
|
+
order: "desc",
|
|
312
149
|
});
|
|
313
150
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
type: "sync",
|
|
317
|
-
runtime: { agent_id: session.agentId!, conversation_id: session.conversationId! },
|
|
318
|
-
},
|
|
319
|
-
{ responseType: "sync_response" },
|
|
320
|
-
);
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
## Dreaming
|
|
151
|
+
// No open session required — safe for model pickers and settings screens.
|
|
152
|
+
const { entries: models, availableHandles } = await client.models.list();
|
|
324
153
|
|
|
325
|
-
|
|
326
|
-
snapshots, initialize a guarded memory filesystem, then run a dream over the
|
|
327
|
-
exact transcript list. Reflection batches edit isolated clones and a final
|
|
328
|
-
aggregation pass synthesizes their diffs into the dream agent's MemFS.
|
|
154
|
+
await client.agents.delete(agents[0].id);
|
|
329
155
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
dream,
|
|
335
|
-
initDreamAgent,
|
|
336
|
-
} from "@letta-ai/letta-agent-sdk";
|
|
337
|
-
|
|
338
|
-
const client = new LettaAgentClient({
|
|
339
|
-
backend: "local",
|
|
340
|
-
appServer: { harnessBackend: "api" },
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
// 1. Collect immutable snapshots after an exclusive cutoff. Limits apply per
|
|
344
|
-
// source, so this selects the five newest eligible sessions from each store.
|
|
345
|
-
const transcripts = await collectTranscripts({
|
|
346
|
-
after: "2026-07-01T00:00:00Z",
|
|
347
|
-
sources: [
|
|
348
|
-
{ type: "claude", limit: 5 },
|
|
349
|
-
{ type: "codex", limit: 5 },
|
|
350
|
-
],
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
// 2. Initialize the complete starting MemFS. Seeded files may be modified but
|
|
354
|
-
// not deleted. New files and directories are allowed only below skills/.
|
|
355
|
-
const agent = await initDreamAgent(client, {
|
|
356
|
-
model: "anthropic/claude-opus-4-8",
|
|
357
|
-
memfs: {
|
|
358
|
-
directories: ["skills"],
|
|
359
|
-
files: {
|
|
360
|
-
"system/project/AGENTS.md":
|
|
361
|
-
"---\ndescription: Project guidance\n---\n\n# Project guidance\n",
|
|
362
|
-
},
|
|
363
|
-
},
|
|
364
|
-
guard: {
|
|
365
|
-
allowedNewFilePrefixes: ["skills"],
|
|
366
|
-
},
|
|
156
|
+
const repository = await client.repositories.create({ name: "inputs" });
|
|
157
|
+
await client.repositories.files.create(repository.id, {
|
|
158
|
+
path: "brief.md",
|
|
159
|
+
content: "# Project brief\n",
|
|
367
160
|
});
|
|
161
|
+
```
|
|
368
162
|
|
|
369
|
-
|
|
370
|
-
// reflection batch, not to the aggregation pass.
|
|
371
|
-
const result = await dream({
|
|
372
|
-
client,
|
|
373
|
-
agentId: agent.agentId,
|
|
374
|
-
transcripts,
|
|
375
|
-
reflectionPrompt: "Only retain learnings relevant to this project.",
|
|
376
|
-
});
|
|
163
|
+
`client.repositories` is available on the `cloud` backend. See [Cloud repositories](https://docs.letta.com/letta-agent-sdk/repositories) for file operations, version history, and session resources.
|
|
377
164
|
|
|
378
|
-
|
|
379
|
-
console.log(result.success, result.runRoot, result.aggregation.report);
|
|
380
|
-
}
|
|
381
|
-
```
|
|
165
|
+
## Documentation
|
|
382
166
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
The pre-commit guard is installed on the canonical MemFS and every reflection
|
|
390
|
-
clone. The SDK also validates every commit and the final working tree after
|
|
391
|
-
each run, so `--no-verify` cannot bypass the policy. For finer control, pass
|
|
392
|
-
`guard.allowedOperations` rules for exact or recursive paths. Every run records
|
|
393
|
-
batch inputs, output clones, diffs, normalized worker trajectories, reports,
|
|
394
|
-
and an immutable final aggregate snapshot under `runRoot`. See
|
|
395
|
-
[`examples/dream.ts`](./examples/dream.ts).
|
|
396
|
-
|
|
397
|
-
OpenHands conversations retain incremental cursors in the dream agent's SDK
|
|
398
|
-
state; later dreams skip records at or before the last successfully reflected
|
|
399
|
-
timestamp. Claude and Codex sessions are finite snapshots and remain
|
|
400
|
-
cursor-free.
|
|
401
|
-
|
|
402
|
-
## Links
|
|
403
|
-
|
|
404
|
-
- Docs: https://docs.letta.com/letta-agent-sdk
|
|
405
|
-
- Examples: [`./examples`](./examples)
|
|
167
|
+
- [Overview](https://docs.letta.com/letta-agent-sdk/overview)
|
|
168
|
+
- [Quickstart](https://docs.letta.com/letta-agent-sdk/quickstart)
|
|
169
|
+
- [Deployment](https://docs.letta.com/letta-agent-sdk/deployment)
|
|
170
|
+
- [SDK reference](https://docs.letta.com/letta-agent-sdk/reference)
|
|
171
|
+
- [Examples](./examples)
|
|
406
172
|
|
|
407
173
|
---
|
|
408
174
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ManagementQuery, ManagementTransport } from "./management.js";
|
|
2
|
+
import type { ConversationMessagesResult, LettaAgent, LettaConversation } from "./management-types.js";
|
|
3
|
+
import type { LettaCodeRemoteClientOptions, ListModelsResult } from "./types.js";
|
|
4
|
+
type OwnedConnection = {
|
|
5
|
+
url: string;
|
|
6
|
+
close(): void;
|
|
7
|
+
};
|
|
8
|
+
export type AppServerManagementOptions = Partial<LettaCodeRemoteClientOptions> & {
|
|
9
|
+
url?: string;
|
|
10
|
+
connect?: () => Promise<OwnedConnection>;
|
|
11
|
+
};
|
|
12
|
+
export declare class AppServerManagementTransport implements ManagementTransport {
|
|
13
|
+
private readonly options;
|
|
14
|
+
constructor(options: AppServerManagementOptions);
|
|
15
|
+
listAgents(query: ManagementQuery): Promise<LettaAgent[]>;
|
|
16
|
+
retrieveAgent(agentId: string): Promise<LettaAgent>;
|
|
17
|
+
updateAgent(agentId: string, body: Record<string, unknown>): Promise<LettaAgent>;
|
|
18
|
+
deleteAgent(agentId: string): Promise<void>;
|
|
19
|
+
listModels(): Promise<ListModelsResult>;
|
|
20
|
+
listConversations(query: ManagementQuery): Promise<LettaConversation[]>;
|
|
21
|
+
retrieveConversation(conversationId: string): Promise<LettaConversation>;
|
|
22
|
+
createConversation(body: Record<string, unknown>): Promise<LettaConversation>;
|
|
23
|
+
updateConversation(conversationId: string, body: Record<string, unknown>): Promise<LettaConversation>;
|
|
24
|
+
listConversationMessages(conversationId: string, query: ManagementQuery): Promise<ConversationMessagesResult>;
|
|
25
|
+
private request;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=app-server-management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-server-management.d.ts","sourceRoot":"","sources":["../src/app-server-management.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,0BAA0B,EAC1B,UAAU,EACV,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAEV,4BAA4B,EAC5B,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,KAAK,eAAe,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,IAAI,IAAI,CAAA;CAAE,CAAC;AAkCtD,MAAM,MAAM,0BAA0B,GACpC,OAAO,CAAC,4BAA4B,CAAC,GAAG;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CAC1C,CAAC;AA8CJ,qBAAa,4BACX,YAAW,mBAAmB;IAElB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,0BAA0B;IAE1D,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAYzD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAanD,WAAW,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,UAAU,CAAC;IAahB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3C,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA0BvC,iBAAiB,CACrB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAYzB,oBAAoB,CACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,iBAAiB,CAAC;IAavB,kBAAkB,CACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,iBAAiB,CAAC;IAavB,kBAAkB,CACtB,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,iBAAiB,CAAC;IAavB,wBAAwB,CAC5B,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,0BAA0B,CAAC;YAgBxB,OAAO;CA8CtB"}
|
|
@@ -1,27 +1,22 @@
|
|
|
1
1
|
import { type AppServerClient, type AppServerExternalToolCallHandler } from "@letta-ai/letta-code/app-server-client";
|
|
2
2
|
import { RemoteClientSessionCore, type ProtocolMessage, type RemoteClientRuntimeController, type RuntimeSendTurnOptions, type RuntimeScope, type RuntimeSessionInit, type RuntimeSessionMode } from "./remote-client-session-core.js";
|
|
3
|
-
import type { AnyAgentTool, CanUseToolResponse, CreateAgentOptions, LettaCodeRemoteClientOptions, LettaCodeClientSessionOptions, ListModelsResult, ListMessagesOptions, ListMessagesResult, RecoverPendingApprovalsOptions, RecoverPendingApprovalsResult, SendMessage, UpdateModelResult } from "./types.js";
|
|
3
|
+
import type { AnyAgentTool, CanUseToolContext, CanUseToolResponse, CreateAgentOptions, LettaCodeRemoteClientOptions, LettaCodeClientSessionOptions, ListModelsResult, ListMessagesOptions, ListMessagesResult, RecoverPendingApprovalsOptions, RecoverPendingApprovalsResult, SendMessage, UpdateModelResult } from "./types.js";
|
|
4
4
|
type UpdateModelPayload = {
|
|
5
5
|
model_id?: string;
|
|
6
6
|
model_handle?: string;
|
|
7
7
|
};
|
|
8
8
|
export declare function agentToolNames(agent: Record<string, unknown> | null | undefined): string[] | undefined;
|
|
9
9
|
export type AppServerSessionOptions = Partial<LettaCodeRemoteClientOptions> & {
|
|
10
|
-
/** Base websocket URL.
|
|
11
|
-
* it to spawn an SDK-owned app-server lazily at initialize(). */
|
|
10
|
+
/** Base websocket URL. */
|
|
12
11
|
url?: string;
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
/** Extra environment variables for SDK-owned local app-server processes. */
|
|
22
|
-
localEnv?: Record<string, string | undefined>;
|
|
23
|
-
/** Whether create-agent runtime_start should pin the created agent globally. */
|
|
24
|
-
pinGlobalAgent?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Internal lazy connection hook. The Node entry point uses this to start a
|
|
14
|
+
* local app-server without pulling process-management code into `/client`.
|
|
15
|
+
*/
|
|
16
|
+
connect?: (sessionEnv?: Record<string, string>) => Promise<{
|
|
17
|
+
url: string;
|
|
18
|
+
close(): void;
|
|
19
|
+
}>;
|
|
25
20
|
/** Whether SDK create-agent payloads should add the origin tag automatically. */
|
|
26
21
|
includeSdkOriginTag?: boolean;
|
|
27
22
|
};
|
|
@@ -29,7 +24,7 @@ export type AppServerSessionMode = RuntimeSessionMode;
|
|
|
29
24
|
export declare function assertRemoteSessionOptionsSupported(action: string, options: LettaCodeClientSessionOptions): void;
|
|
30
25
|
export declare function createAgentBody(options: CreateAgentOptions, settings?: {
|
|
31
26
|
includeSdkOriginTag?: boolean;
|
|
32
|
-
}): Record<string, unknown
|
|
27
|
+
}): Promise<Record<string, unknown>>;
|
|
33
28
|
export declare function externalToolGroups(tools: AnyAgentTool[] | undefined): Array<Record<string, unknown>> | undefined;
|
|
34
29
|
export declare function createExternalToolCallHandler(externalTools: Map<string, AnyAgentTool>): AppServerExternalToolCallHandler;
|
|
35
30
|
type AppServerApprovalOptions = LettaCodeClientSessionOptions | CreateAgentOptions;
|
|
@@ -42,7 +37,7 @@ type AppServerApprovalResponseDecision = {
|
|
|
42
37
|
behavior: "deny";
|
|
43
38
|
message: string;
|
|
44
39
|
};
|
|
45
|
-
export declare function resolveAppServerToolApproval(options: AppServerApprovalOptions, toolName: string, toolInput: Record<string, unknown
|
|
40
|
+
export declare function resolveAppServerToolApproval(options: AppServerApprovalOptions, toolName: string, toolInput: Record<string, unknown>, context?: CanUseToolContext): Promise<CanUseToolResponse>;
|
|
46
41
|
export declare function toAppServerApprovalDecision(decision: CanUseToolResponse): AppServerApprovalResponseDecision;
|
|
47
42
|
export declare function registerAppServerControlRequestHandler(config: {
|
|
48
43
|
client: AppServerClient;
|
|
@@ -70,7 +65,7 @@ export declare class AppServerRuntimeController implements RemoteClientRuntimeCo
|
|
|
70
65
|
}
|
|
71
66
|
export declare class AppServerSession extends RemoteClientSessionCore {
|
|
72
67
|
private readonly remoteOptions;
|
|
73
|
-
private
|
|
68
|
+
private ownedConnection;
|
|
74
69
|
private externalTools;
|
|
75
70
|
private removeExternalToolHandler;
|
|
76
71
|
private removeControlRequestHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-server-session.d.ts","sourceRoot":"","sources":["../src/app-server-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,gCAAgC,EAEtC,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"app-server-session.d.ts","sourceRoot":"","sources":["../src/app-server-session.ts"],"names":[],"mappings":"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"}
|