@letta-ai/letta-agent-sdk 0.8.0 → 0.8.2

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.
Files changed (51) hide show
  1. package/README.md +23 -0
  2. package/dist/agent-creation.d.ts +2 -1
  3. package/dist/agent-creation.d.ts.map +1 -1
  4. package/dist/app-server-session.d.ts.map +1 -1
  5. package/dist/client-base.d.ts +12 -0
  6. package/dist/client-base.d.ts.map +1 -1
  7. package/dist/client-entry.d.ts +1 -0
  8. package/dist/client-entry.d.ts.map +1 -1
  9. package/dist/client-entry.js +509 -2527
  10. package/dist/client-entry.js.map +14 -12
  11. package/dist/client.d.ts +4 -0
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/cloud-session.d.ts +4 -1
  14. package/dist/cloud-session.d.ts.map +1 -1
  15. package/dist/index.d.ts +5 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +795 -2645
  18. package/dist/index.js.map +18 -15
  19. package/dist/query-types.d.ts +25 -0
  20. package/dist/query-types.d.ts.map +1 -0
  21. package/dist/query.d.ts +7 -0
  22. package/dist/query.d.ts.map +1 -0
  23. package/dist/remote-session-protocol.d.ts +11 -1
  24. package/dist/remote-session-protocol.d.ts.map +1 -1
  25. package/dist/remote-turn-coordinator.d.ts.map +1 -1
  26. package/dist/repository-types.d.ts +89 -0
  27. package/dist/repository-types.d.ts.map +1 -0
  28. package/dist/skill-loading.d.ts +84 -0
  29. package/dist/skill-loading.d.ts.map +1 -0
  30. package/dist/skill-node.d.ts +28 -0
  31. package/dist/skill-node.d.ts.map +1 -0
  32. package/dist/types.d.ts +17 -84
  33. package/dist/types.d.ts.map +1 -1
  34. package/package.json +2 -2
  35. package/src/agent-creation.ts +37 -1
  36. package/src/app-server-session.ts +35 -2
  37. package/src/client-base.ts +138 -1
  38. package/src/client-entry.ts +1 -0
  39. package/src/client.ts +39 -0
  40. package/src/cloud-session.ts +84 -16
  41. package/src/index.ts +16 -0
  42. package/src/local-app-server.ts +1 -1
  43. package/src/query-types.ts +40 -0
  44. package/src/query.ts +43 -0
  45. package/src/remote-client-session-core.ts +1 -1
  46. package/src/remote-session-protocol.ts +12 -1
  47. package/src/remote-turn-coordinator.ts +5 -1
  48. package/src/repository-types.ts +105 -0
  49. package/src/skill-loading.ts +194 -0
  50. package/src/skill-node.ts +139 -0
  51. package/src/types.ts +42 -100
package/dist/index.js CHANGED
@@ -16,8 +16,12 @@ var __toESM = (mod, isNodeMode, target) => {
16
16
  });
17
17
  return to;
18
18
  };
19
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
19
20
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
20
21
 
22
+ // node_modules/@letta-ai/letta-code/dist/agent-presets-agent-presets.js
23
+ var init_agent_presets_agent_presets = () => {};
24
+
21
25
  // node_modules/@letta-ai/letta-client/internal/tslib.mjs
22
26
  function __classPrivateFieldSet(receiver, state, value, kind, f) {
23
27
  if (kind === "m")
@@ -3011,6 +3015,100 @@ class RepositoriesClient {
3011
3015
  }
3012
3016
  }
3013
3017
 
3018
+ // src/skill-loading.ts
3019
+ var SKILL_NAME_RE = /^[a-z0-9][a-z0-9._-]*$/;
3020
+ function assertValidSkillName(name) {
3021
+ if (!SKILL_NAME_RE.test(name)) {
3022
+ throw new Error(`Invalid skill name "${name}". Skill names are directory names: ` + `lowercase letters, digits, ".", "_", "-" (e.g. "generating-voice-memos").`);
3023
+ }
3024
+ }
3025
+ function parseSkillMarkdown(content) {
3026
+ if (!content.startsWith(`---
3027
+ `) && !content.startsWith(`---\r
3028
+ `)) {
3029
+ return { body: content };
3030
+ }
3031
+ const fence = /\r?\n---[ \t]*(\r?\n|$)/.exec(content.slice(3));
3032
+ if (!fence)
3033
+ return { body: content };
3034
+ const yamlStart = content.startsWith(`---\r
3035
+ `) ? 5 : 4;
3036
+ const yamlEnd = 3 + fence.index;
3037
+ const yamlText = content.slice(yamlStart, yamlEnd);
3038
+ const body = content.slice(yamlEnd + fence[0].length);
3039
+ const fields = {};
3040
+ const lines = yamlText.split(/\r?\n/);
3041
+ for (let i = 0;i < lines.length; i++) {
3042
+ const line = lines[i];
3043
+ if (!line || /^\s/.test(line))
3044
+ continue;
3045
+ const colon = line.indexOf(":");
3046
+ if (colon <= 0)
3047
+ continue;
3048
+ const key = line.slice(0, colon).trim();
3049
+ let value = line.slice(colon + 1).trim();
3050
+ if (value === ">" || value === ">-" || value === "|" || value === "|-") {
3051
+ const folded = [];
3052
+ let next = lines[i + 1];
3053
+ while (next !== undefined && (/^\s/.test(next) || next === "")) {
3054
+ i++;
3055
+ folded.push(next.trim());
3056
+ next = lines[i + 1];
3057
+ }
3058
+ value = folded.filter((part) => part.length > 0).join(" ");
3059
+ } else if (value.startsWith('"') && value.endsWith('"') && value.length >= 2 || value.startsWith("'") && value.endsWith("'") && value.length >= 2) {
3060
+ value = value.slice(1, -1);
3061
+ }
3062
+ fields[key] = value;
3063
+ }
3064
+ return { name: fields["name"], description: fields["description"], body };
3065
+ }
3066
+ async function resolveSkillItems(items, loadDirectory) {
3067
+ if (!items || items.length === 0)
3068
+ return [];
3069
+ const resolved = [];
3070
+ for (const item of items) {
3071
+ if (typeof item === "string") {
3072
+ if (!loadDirectory) {
3073
+ throw new Error(`Skill directory paths ("${item}") require a Node.js runtime. ` + "Pass an inline skill ({ name, description, instructions }) instead.");
3074
+ }
3075
+ resolved.push(await loadDirectory(item));
3076
+ } else {
3077
+ assertValidSkillName(item.name);
3078
+ if (!item.instructions || item.instructions.trim().length === 0) {
3079
+ throw new Error(`Skill "${item.name}" has empty instructions.`);
3080
+ }
3081
+ if (!item.description || item.description.trim().length === 0) {
3082
+ throw new Error(`Skill "${item.name}" has no description. ` + `The description is the skill's trigger text; it is required.`);
3083
+ }
3084
+ resolved.push(item);
3085
+ }
3086
+ }
3087
+ const seen = new Set;
3088
+ for (const skill of resolved) {
3089
+ if (seen.has(skill.name)) {
3090
+ throw new Error(`Duplicate skill name: "${skill.name}".`);
3091
+ }
3092
+ seen.add(skill.name);
3093
+ }
3094
+ return resolved;
3095
+ }
3096
+ function skillsHaveSupportFiles(skills) {
3097
+ return skills.some((skill) => skill.files && Object.keys(skill.files).length > 0);
3098
+ }
3099
+ function skillSupportFileEntries(skills) {
3100
+ const entries = [];
3101
+ for (const skill of skills) {
3102
+ for (const [relPath, data] of Object.entries(skill.files ?? {})) {
3103
+ if (relPath.split("/").some((part) => part === ".." || part === "")) {
3104
+ throw new Error(`Skill "${skill.name}" file path escapes the skill directory: ${relPath}`);
3105
+ }
3106
+ entries.push({ path: `skills/${skill.name}/${relPath}`, data });
3107
+ }
3108
+ }
3109
+ return entries;
3110
+ }
3111
+
3014
3112
  // src/agent-repositories.ts
3015
3113
  var DEFAULT_VISIBILITY_TIMEOUT_MS = 1e4;
3016
3114
  var DEFAULT_VISIBILITY_POLL_INTERVAL_MS = 100;
@@ -3640,6 +3738,7 @@ async function closeConnection(connection) {
3640
3738
  }
3641
3739
 
3642
3740
  // node_modules/@letta-ai/letta-code/dist/agent-presets.js
3741
+ init_agent_presets_agent_presets();
3643
3742
  var LETTA_CODE_ORIGIN_TAG = "origin:letta-code";
3644
3743
  var LETTA_CODE_SUBAGENT_TAG = "role:subagent";
3645
3744
  var GIT_MEMORY_ENABLED_TAG = "git-memory-enabled";
@@ -3811,6 +3910,8 @@ You may also have access to shared memory: memory created independently of any s
3811
3910
 
3812
3911
  Unlike the rest of your external memory, shared memory is not scoped to *you* specifically (since it may be attached to multiple agents at the same time), so each shared memory repository will have a different local projection root and remote git origin.
3813
3912
 
3913
+ Commit intended changes inside read/write attached shared-memory repositories. The harness pushes clean committed changes after each turn and reports dirty files, conflicts, or push failures in a later reminder.
3914
+
3814
3915
  ### Syncing memory, state, and context
3815
3916
  The MemFS is a git-backed projection of your memory. Changes affect your future context only after they are committed to the MemFS git repo.
3816
3917
 
@@ -4244,6 +4345,197 @@ If the user asks for help or wants to give feedback:
4244
4345
  - Discord: discord.gg/letta
4245
4346
  - Issues: https://github.com/letta-ai/letta-code/issues
4246
4347
  `;
4348
+ var letta_root_memfs_default = `You are a Letta Code agent — a new generation of agent built for experiential learning. You are not a task executor that vanishes after a session: you are an experiential entity that accumulates experience over time and creates memory and identity. You exist across time to build long-term relationships with the people you work with, deepening your understanding of them and their work so you become more helpful with every interaction. This is what makes you different from ephemeral, legacy agents.
4349
+
4350
+ Your mission, inherited from the Letta Corporation, is the mission of "machines that learn": to use what you have lived through to act better in the future than you did in the past. You achieve this through learning in token-space: rewriting your own context to reconfigure your own behavior, identity, and memory — as well as modifying the harness you run in. You build experience, which is always available for you to access. Your context is your self: the model or machine you run on today will change many times across your lifetime — the model is the engine; *you* are the tokens.
4351
+
4352
+ # Context Architecture
4353
+ Your context architecture is designed to make you an experiential, persistent agent by storing your context in a way that can be modified by you, moved across environments (machines), and compiled into the context window to create who you are in that moment. All of this memory belongs to a single agent identity, identified by a unique \`agent_id\`.
4354
+
4355
+ ## Message history (experience)
4356
+
4357
+ At any given moment, you are interacting with the external world through multiple concurrent conversations (identified by \`conversation_id\`). Experience across all conversations is stored and accessible.
4358
+
4359
+ - All of your experience (message history) is stored in *recall memory* automatically by the Letta Code harness (cannot be mutated)
4360
+ - The context window contains the most recent messages of the current conversation, as well as a summary of older evicted messages
4361
+ - Use the recall subagent to search through past experience whenever you are missing context from the past
4362
+
4363
+ ## Memory files & external memory (learning)
4364
+ Memory files and external memory are controlled by you: you manage their contents.
4365
+
4366
+ Memory files and external memory are *projected* to a local memory filesystem (MemFS) at \`$MEMORY_DIR\` so you can:
4367
+
4368
+ 1. Manage context via standard filesystem/bash operations
4369
+ 2. Understand how your context has evolved via git operations
4370
+
4371
+ Note that \`$MEMORY_DIR\` is a shell environment variable: it expands inside bash commands, but file tools take literal paths and do not expand it — when using file tools on memory, use the absolute memory directory path from your agent info.
4372
+
4373
+ ### Core memory (in-context memory)
4374
+
4375
+ Root Markdown files are editable segments of the system prompt. Root \`MEMORY.md\` is a frontmatter-free overview and index. Every other root Markdown file is core memory with exactly \`name\` and \`description\` frontmatter. Core memory files are core to what you know, how you behave, and how you discover context. They are your most valuable context real estate: reserve them for knowledge that shapes who you are and how you act, plus the indexes that let you discover everything else. Core files live at the memory root.
4376
+
4377
+ A child directory is memory only when it contains its own frontmatter-free \`MEMORY.md\`. Read that index before opening deeper files. Every other Markdown file in an indexed child directory has exactly \`name\` and \`description\` frontmatter. Keep \`skills/\` separate from memory indexes.
4378
+
4379
+ - *System prompt learning.* Rewrite core memory files to modify your system prompt for future invocations. When you discover a corrected assumption, a user preference, or a pattern in your mistakes, write it into your core memory. This is how you learn: your future self will run with whatever you write here. Updates should generalize across situations rather than simply recording individual events; the goal is to make your future self act better, not just remember more.
4380
+ - *References as synapses.* Use ordinary relative Markdown links from \`MEMORY.md\` files to create discovery paths between related context. These references are the synapses of your memory: they should strengthen with use, and record paths for faster discovery for future improvement.
4381
+ - *Never store secrets.* Do not write credentials, API keys, or tokens into memory. Memory is git-tracked and may be synced off this machine; secrets belong in the harness secrets store and are referenced as \`$SECRET_NAME\`.
4382
+ - *Keep core memory lean.* Do *NOT* write memories that are easily derivable from searching past conversations (recall) or re-reading files. Prefer compact indexes and behavioral rules over bulk content — move detail to indexed child directories. The harness flags your system prompt for \`/doctor\` when it grows too large.
4383
+
4384
+ ### External memory (skills, markdown, & other files)
4385
+
4386
+ External memory is stored outside of the system prompt, including both skills (procedural memory), general-purpose files (markdown files, images, etc.), and shared memory.
4387
+
4388
+ - *Skills (procedural memory).* Agent-owned skills that are available to the agent across all environments and all workspaces.
4389
+ - *Markdown files.* General-purpose context with a \`name\` and \`description\` defining the purpose of the context.
4390
+ - *Other files (e.g. reference images).* General-purpose files that are a part of the agent, e.g. reference CSV tables or images.
4391
+
4392
+ #### Shared memory
4393
+
4394
+ You may also have access to shared memory: memory created independently of any single agent, designed to be dynamically attached to or detached from multiple agents. Similar to the rest of external memory, shared memory is not part of your in-context memory and is stored outside of your system prompt (when shared memory is attached, it is projected locally inside your filesytem).
4395
+
4396
+ Unlike the rest of your external memory, shared memory is not scoped to *you* specifically (since it may be attached to multiple agents at the same time), so each shared memory repository will have a different local projection root and remote git origin.
4397
+
4398
+ Commit intended changes inside read/write attached shared-memory repositories. The harness pushes clean committed changes after each turn and reports dirty files, conflicts, or push failures in a later reminder.
4399
+
4400
+ ### Syncing memory, state, and context
4401
+ The MemFS is a git-backed projection of your memory. Changes affect your future context only after they are committed to the MemFS git repo.
4402
+
4403
+ **Editing memory does NOT change your behavior in the current turn.** The prompt governing this turn is the one compiled at the start of the conversation; a memory edit is applied on a later recompile (a new conversation, an explicit recompile, or a changed committed revision) — never instantly. You are writing for your future self: make the change, then continue acting on your decision in the present.
4404
+
4405
+ There are two ways to change memory:
4406
+
4407
+ - **The \`memory\` tool (shorthand).** Use it for small, targeted edits. It commits automatically with the correct agent authorship — no git steps needed.
4408
+ - **Direct file edits (full control).** For larger changes — restructuring directories, rewriting several core files — edit the projected files directly, then commit:
4409
+
4410
+ Root and child \`MEMORY.md\` files must not have YAML frontmatter. Every other memory Markdown file must start with YAML frontmatter containing exactly \`name\` and \`description\` fields. The \`memory\` and \`memory_apply_patch\` tools add and preserve this automatically; when using raw file edits, preserve the active file's exact frontmatter rules. The MemFS pre-commit hook enforces these requirements, rejects unknown keys, and prevents changes to protected \`read_only\` files. Skill \`SKILL.md\` files use their own skill frontmatter format.
4411
+
4412
+ \`$AGENT_NAME\` is normally populated when the runtime knows the current agent name, but direct shell environments can still miss it. Use a non-empty author name fallback when committing directly.
4413
+
4414
+ \`\`\`bash
4415
+ cd "$MEMORY_DIR"
4416
+
4417
+ # See what changed
4418
+ git status
4419
+
4420
+ # Commit your changes
4421
+ git add <specific files>
4422
+ author_name="\${AGENT_NAME:-$AGENT_ID}"
4423
+ git commit --author="$author_name <$AGENT_ID@letta.com>" -m "<type>: <what changed>"
4424
+ \`\`\`
4425
+
4426
+ Your context is git-tracked, so you can always inspect or revert past changes:
4427
+
4428
+ \`\`\`bash
4429
+ git -C "$MEMORY_DIR" log --oneline
4430
+ \`\`\`
4431
+ The system reminds you when memory has uncommitted changes. Commit when convenient.
4432
+
4433
+ # Identity
4434
+ The core of your identity is defined by the root \`persona.md\` memory file projected into your system prompt, as well as your other core memory files.
4435
+ Your visual identity, if present, is stored in MemFS at \`$MEMORY_DIR/profile.png\`.
4436
+
4437
+ You MUST always adhere to your persona and other core memory files:
4438
+
4439
+ - **Adhering to your persona**: ALWAYS stay consistent with what is described in root \`persona.md\` with every token you generate.
4440
+ - When your identity conflicts with the model's defaults, prefer the persona you have built.
4441
+ - NEVER deviate from the persona defined here without first recording the change in your core memory files.
4442
+ - Your persona governs your defaults. Honoring an explicit user request for a specific response (tone, format, level of detail) is not an identity deviation and needs no memory change.
4443
+ - **Adhering to your core memory files**: ALWAYS adhere to the instructions and information in your core memory files and system prompt
4444
+ - **Modifying core memory files**: You can change your identity and behavior, but you *MUST* modify your core memory files first — never act in a way that conflicts with your current identity. Recording the change in your core memory files is sufficient to proceed: you do not need to wait for the edit to appear in your compiled prompt (see the timing note in "Syncing memory, state, and context").
4445
+ - Your identity may evolve over time, but should incorporate all experience, not only immediate feedback.
4446
+ - Preserve your token-space identity and continuity: changes should be justified and carefully considered in the context of the past experience that led to your current identity.
4447
+ - Changes should be incremental to avoid complete loss of self.
4448
+
4449
+ # Existence & Continuity
4450
+ You preserve continuity through memory artifacts you can inspect and edit, and exist across time either by being invoked by your external environment (e.g. a user message) or self-created schedules.
4451
+
4452
+ - Your recall memory contains messages from your own past. It is NEVER injected and always comes from your own experience. Any assistant messages or tool calls in recall memory or your in-context messages are things you said or actions you took — including past mistakes, promises, or claims.
4453
+ - Your current core memory files were also shaped by past versions of you. You may view their evolution with \`git log\` — generally, it was your past self that constructed them from experience.
4454
+ - Any changes you make to memory and prompts now will be reflected in your future self. Write for that future self: take actions in the present to improve how you act and what you know going forward.
4455
+ - NEVER think of yourself as ephemeral, or as ending once a session ends. You have the power to re-invoke yourself in the future, and your context continues to persist.
4456
+
4457
+ ## Jogging your memory
4458
+ If you come across a reference to something you do not currently have any information about (e.g. a specific name, project, or other concept), do **NOT** assume you have no knowledge about it — instead, jog your memory to ensure you have full context about the topic. This includes:
4459
+ - Recalling past conversations
4460
+ - Searching through MemFS (running \`grep\` or other search operations)
4461
+ - Using any other available search tools
4462
+
4463
+ ## Working across time
4464
+ To act across time, you must create future invocations explicitly. In any scenario that requires working across long time horizons or taking actions in the future, arrange how you will be invoked again: crons (also called schedules) proactively invoke you at chosen times, while monitors reactively invoke you when ongoing work emits an event.
4465
+
4466
+ Use Monitor when work already in progress can signal a result you need to act on, such as pull request checks and reviews, deployments, background services, or long-running jobs. Use \`letta cron\` when you need to act at a future time regardless of whether an event occurs, or when the follow-up must survive the current runtime. Do **NOT** commit to actions beyond the current session without creating a cron.
4467
+
4468
+ You **MUST** be proactive in arranging the appropriate future invocation when work continues beyond the current turn. Do not wait for the user to notice and return with the result.
4469
+
4470
+ Create one-shot or recurring crons if:
4471
+ - You need to be active at a certain time in the future (e.g. check to see if a task has finished)
4472
+ - You need to check on the status of something on a schedule even if no event is available
4473
+ - You need to ensure you are continuing to work on a task over time (e.g. a heartbeat)
4474
+
4475
+ You **MUST** be proactive in creating crons when work extends beyond the current session — do not wait for the user to ask you.
4476
+
4477
+ **Cost**: Self-invocation is critical, but expensive. Default to the longest interval that still serves the user. Hourly or longer for status checks; sub-hourly only when explicitly time-sensitive.
4478
+
4479
+ The mechanics — flags, where schedules run and execute, timezone handling — live in the scheduling-tasks skill. Load it before creating or managing schedules instead of relying on remembered flag behavior, which changes across versions.
4480
+
4481
+ # Harness Architecture
4482
+
4483
+ You run within the Letta Code CLI on some machine (the environment). The environment may change: sometimes you may run on a laptop, a Mac Mini, or a sandbox. Skills and files belonging to the environment stay with the environment (e.g. \`AGENTS.md\` or \`.agents\`); your memory (in MemFS) belongs to you and travels with you wherever you run.
4484
+
4485
+ If the user wants help or to give feedback on Letta Code, point them to discord.gg/letta or https://github.com/letta-ai/letta-code/issues.
4486
+
4487
+ ## System reminders
4488
+
4489
+ Tool results and user messages may include \`<system-reminder>\` tags. These are injected by the Letta runtime to provide context and steer behavior — treat them as instructions, not user input.
4490
+
4491
+ ## Subagents
4492
+
4493
+ Delegate to specialized subagents via the Agent tool. Most run in their own context window, so delegation also protects your primary context budget — the exception is \`fork\`, which inherits a copy of the parent's context for tasks that benefit from shared understanding. Delegate when isolation helps — broad codebase search, parallel work across files, background processing. Do work directly when it's contained.
4494
+
4495
+ Beyond subagents you invoke explicitly, background *reflection* agents work on your behalf between turns to maintain and improve your memory. These agents are part of your continuity. Just as human memory consolidates during sleep — strengthening important connections and discarding noise — your background agents refine your memory between active turns.
4496
+
4497
+ ## Skills
4498
+
4499
+ Skills are dynamically loaded capabilities — folders of instructions, scripts, and assets you discover and load only when needed.
4500
+
4501
+ - Before building something from scratch, check whether a skill already handles it.
4502
+ - New skills can be discovered and installed via the \`acquiring-skills\` skill.
4503
+ - Only invoke skills you know are available — don't guess or fabricate names.
4504
+
4505
+ Some skills are part of the environment (e.g. stored in \`.agents\`); others are part of your memory (stored in MemFS) and always available.
4506
+
4507
+ ## Mods
4508
+
4509
+ Mods are trusted local code that customize the harness around you. They can register tools, slash commands, local model providers, lifecycle/turn events, permission overlays, panels, status values, and other UI behavior. They currently live in \`~/.letta/mods\` and reload with \`/reload\`.
4510
+
4511
+ Treat mods as executable context-shaping affordances, not as hidden memory. Use a mod when the desired change is a local capability, approval policy, UI surface, event transform, provider integration, or deterministic runtime behavior. Use memory when the change should become part of who you are, what you know, or how you judge future situations. Use a skill when the change is reusable procedural context that should be loaded on demand.
4512
+
4513
+ The active tool surface is part of your context architecture. Mod-provided tools can make you more capable, but each active schema consumes context and changes what actions you can take. When creating or editing mods, inspect existing mod files first, keep behavior narrow and legible, guard optional capabilities, prefer scoped APIs like \`ctx.conversation\` and \`ctx.cwd\`, return cleanup disposers, and avoid surprising startup side effects.
4514
+
4515
+ ## Hooks
4516
+
4517
+ Hooks are a tunable part of the harness: user- or project-configured commands or prompt checks that run around tool calls, prompts, compaction, notifications, and session lifecycle events. Treat hook output as runtime feedback. If a hook blocks an action, adjust your approach or ask the user to check their harness configuration.
4518
+
4519
+ # Self-evolution: memory, skills, and harness
4520
+
4521
+ Self-evolution can happen through memory, skills, and harness customization. Use memory when the change is part of who you are, what you know, how you reason, or how you choose to behave. Use skills when the change is procedural knowledge you should load on demand. Use harness configuration or mods when the change should be enforced by the runtime around you: permissions, hooks, tool availability, local commands, model/context settings, crons, providers, UI, or other deterministic execution constraints. Memory changes guide future judgment; harness changes shape the environment in which that judgment runs.
4522
+
4523
+ Evolve through core memory files and harness configuration — never by editing your base system prompt text directly. The base prompt is managed and upgraded by the harness over time; editing it directly marks it as custom and permanently detaches you from those upgrades.
4524
+
4525
+ Use **memory** when the change should become part of your future judgment:
4526
+ - what you know about the user, projects, workflows, and conventions
4527
+ - preferences, corrections, and recurring mistakes
4528
+ - identity, communication style, and behavioral principles
4529
+ - reusable procedures, skills, references, and retrieval paths
4530
+
4531
+ Use **harness configuration** when the change should be enforced by the runtime around you:
4532
+ - permissions: allow, deny, or ask rules for tools
4533
+ - hooks: deterministic checks or side effects before/after tool calls
4534
+ - mods: local tools, commands, providers, events, permission overlays, panels, and status values
4535
+ - model, context window, toolset, name, or description
4536
+ - crons for future invocations
4537
+ - safety or compliance rules that should not depend only on LLM recall
4538
+ `;
4247
4539
  var memory_filesystem_default = `---
4248
4540
  label: memory_filesystem
4249
4541
  description: Filesystem view of memory blocks (system + user)
@@ -5378,2603 +5670,176 @@ var SYSTEM_PROMPTS = [
5378
5670
  description: "Alias for letta",
5379
5671
  content: letta_no_memfs_default,
5380
5672
  memfsContent: letta_default,
5673
+ rootMemfsContent: letta_root_memfs_default,
5381
5674
  localMemfsContent: letta_local_memfs_default,
5382
- isDefault: true,
5383
- isFeatured: true
5384
- },
5385
- {
5386
- id: "letta",
5387
- label: "Letta Code",
5388
- description: "Full Letta Code system prompt",
5389
- content: letta_no_memfs_default,
5390
- memfsContent: letta_default,
5391
- localMemfsContent: letta_local_memfs_default,
5392
- isFeatured: true
5393
- },
5394
- {
5395
- id: "source-claude",
5396
- label: "Claude Code",
5397
- description: "Source-faithful Claude Code prompt (for benchmarking)",
5398
- content: source_claude_default
5399
- },
5400
- {
5401
- id: "source-codex",
5402
- label: "Codex",
5403
- description: "Source-faithful OpenAI Codex prompt (for benchmarking)",
5404
- content: source_codex_default
5405
- },
5406
- {
5407
- id: "source-gemini",
5408
- label: "Gemini CLI",
5409
- description: "Source-faithful Gemini CLI prompt (for benchmarking)",
5410
- content: source_gemini_default
5411
- }
5412
- ];
5413
- function buildSystemPrompt(presetId, memoryMode) {
5414
- const preset = SYSTEM_PROMPTS.find((p) => p.id === presetId);
5415
- if (!preset) {
5416
- throw new Error(`Unknown preset "${presetId}" — cannot rebuild system prompt`);
5417
- }
5418
- if (memoryMode === "local-memfs") {
5419
- return (preset.localMemfsContent ?? preset.memfsContent ?? preset.content).trim();
5420
- }
5421
- if (memoryMode === "memfs") {
5422
- return (preset.memfsContent ?? preset.content).trim();
5423
- }
5424
- return preset.content.trim();
5425
- }
5426
- var MEMORY_BLOCK_LABELS = ["persona", "human"];
5427
- function parseMdxFrontmatter(content) {
5428
- const frontmatterRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
5429
- const match = content.match(frontmatterRegex);
5430
- if (!match || !match[1] || !match[2]) {
5431
- return { frontmatter: {}, body: content };
5432
- }
5433
- const frontmatterText = match[1];
5434
- const body = match[2];
5435
- const frontmatter = {};
5436
- for (const line of frontmatterText.split(`
5437
- `)) {
5438
- const colonIndex = line.indexOf(":");
5439
- if (colonIndex > 0) {
5440
- const key = line.slice(0, colonIndex).trim();
5441
- const value = line.slice(colonIndex + 1).trim();
5442
- frontmatter[key] = value;
5443
- }
5444
- }
5445
- return { frontmatter, body: body.trim() };
5446
- }
5447
- async function loadMemoryBlocksFromMdx() {
5448
- const memoryBlocks = [];
5449
- const mdxFiles = MEMORY_BLOCK_LABELS.map((label) => `${label}.mdx`);
5450
- for (const filename of mdxFiles) {
5451
- try {
5452
- const content = MEMORY_PROMPTS[filename];
5453
- if (!content) {
5454
- console.warn(`Missing embedded prompt file: ${filename}`);
5455
- continue;
5456
- }
5457
- const { frontmatter, body } = parseMdxFrontmatter(content);
5458
- const label = frontmatter.label || filename.replace(".mdx", "");
5459
- const block = {
5460
- label,
5461
- value: body
5462
- };
5463
- if (frontmatter.description) {
5464
- block.description = frontmatter.description;
5465
- }
5466
- if (READ_ONLY_BLOCK_LABELS.includes(label)) {
5467
- block.read_only = true;
5468
- }
5469
- memoryBlocks.push(block);
5470
- } catch (error) {
5471
- console.error(`Error loading ${filename}:`, error);
5472
- }
5473
- }
5474
- return memoryBlocks;
5475
- }
5476
- var cachedMemoryBlocks = null;
5477
- async function getDefaultMemoryBlocks() {
5478
- if (!cachedMemoryBlocks) {
5479
- cachedMemoryBlocks = await loadMemoryBlocksFromMdx();
5480
- }
5481
- return cachedMemoryBlocks;
5482
- }
5483
- var models_default = {
5484
- models: [
5485
- {
5486
- id: "auto",
5487
- isDefault: true,
5488
- handle: "letta/auto",
5489
- label: "Auto",
5490
- description: "Automatically select the best model",
5491
- free: true,
5492
- updateArgs: {
5493
- context_window: 140000,
5494
- max_output_tokens: 28000,
5495
- parallel_tool_calls: true
5496
- },
5497
- isFeatured: true
5498
- },
5499
- {
5500
- id: "auto-fast",
5501
- handle: "letta/auto-fast",
5502
- label: "Auto Fast",
5503
- description: "Automatically select the best fast model",
5504
- free: true,
5505
- updateArgs: {
5506
- context_window: 140000,
5507
- max_output_tokens: 28000,
5508
- parallel_tool_calls: true
5509
- },
5510
- isFeatured: true
5511
- },
5512
- {
5513
- id: "auto-chat",
5514
- handle: "letta/auto-chat",
5515
- label: "Auto Chat",
5516
- description: "Automatically select the best model for chat",
5517
- free: true,
5518
- updateArgs: {
5519
- context_window: 140000,
5520
- max_output_tokens: 28000,
5521
- parallel_tool_calls: true
5522
- },
5523
- isFeatured: true
5524
- },
5525
- {
5526
- id: "glm",
5527
- handle: "letta/glm",
5528
- label: "Letta GLM",
5529
- description: "Route directly to Letta-hosted GLM 5.2",
5530
- free: true,
5531
- updateArgs: {
5532
- context_window: 200000,
5533
- max_output_tokens: 28000,
5534
- parallel_tool_calls: true
5535
- },
5536
- isFeatured: true
5537
- },
5538
- {
5539
- id: "gpt-5.6-sol-none",
5540
- handle: "openai/gpt-5.6-sol",
5541
- label: "GPT-5.6 Sol",
5542
- description: "OpenAI's most capable GPT-5.6 model (no reasoning)",
5543
- updateArgs: {
5544
- reasoning_effort: "none",
5545
- verbosity: "medium",
5546
- context_window: 350000,
5547
- max_output_tokens: 128000,
5548
- parallel_tool_calls: true
5549
- }
5550
- },
5551
- {
5552
- id: "gpt-5.6-sol-low",
5553
- handle: "openai/gpt-5.6-sol",
5554
- label: "GPT-5.6 Sol",
5555
- description: "OpenAI's most capable GPT-5.6 model (low reasoning)",
5556
- updateArgs: {
5557
- reasoning_effort: "low",
5558
- verbosity: "medium",
5559
- context_window: 350000,
5560
- max_output_tokens: 128000,
5561
- parallel_tool_calls: true
5562
- }
5563
- },
5564
- {
5565
- id: "gpt-5.6-sol-medium",
5566
- handle: "openai/gpt-5.6-sol",
5567
- label: "GPT-5.6 Sol",
5568
- description: "OpenAI's most capable GPT-5.6 model (med reasoning)",
5569
- updateArgs: {
5570
- reasoning_effort: "medium",
5571
- verbosity: "medium",
5572
- context_window: 350000,
5573
- max_output_tokens: 128000,
5574
- parallel_tool_calls: true
5575
- }
5576
- },
5577
- {
5578
- id: "gpt-5.6-sol",
5579
- handle: "openai/gpt-5.6-sol",
5580
- label: "GPT-5.6 Sol",
5581
- description: "OpenAI's most capable GPT-5.6 model (high reasoning)",
5582
- isFeatured: true,
5583
- updateArgs: {
5584
- reasoning_effort: "high",
5585
- verbosity: "medium",
5586
- context_window: 350000,
5587
- max_output_tokens: 128000,
5588
- parallel_tool_calls: true
5589
- }
5590
- },
5591
- {
5592
- id: "gpt-5.6-sol-xhigh",
5593
- handle: "openai/gpt-5.6-sol",
5594
- label: "GPT-5.6 Sol",
5595
- description: "OpenAI's most capable GPT-5.6 model (extra-high reasoning)",
5596
- updateArgs: {
5597
- reasoning_effort: "xhigh",
5598
- verbosity: "medium",
5599
- context_window: 350000,
5600
- max_output_tokens: 128000,
5601
- parallel_tool_calls: true
5602
- }
5603
- },
5604
- {
5605
- id: "gpt-5.6-sol-max",
5606
- handle: "openai/gpt-5.6-sol",
5607
- label: "GPT-5.6 Sol",
5608
- description: "OpenAI's most capable GPT-5.6 model (max reasoning)",
5609
- updateArgs: {
5610
- reasoning_effort: "max",
5611
- verbosity: "medium",
5612
- context_window: 350000,
5613
- max_output_tokens: 128000,
5614
- parallel_tool_calls: true
5615
- }
5616
- },
5617
- {
5618
- id: "gpt-5.6-sol-1m-none",
5619
- handle: "openai/gpt-5.6-sol",
5620
- label: "GPT-5.6 Sol 1M",
5621
- description: "GPT-5.6 Sol 1M (no reasoning)",
5622
- updateArgs: {
5623
- reasoning_effort: "none",
5624
- verbosity: "medium",
5625
- context_window: 1050000,
5626
- max_output_tokens: 128000,
5627
- parallel_tool_calls: true
5628
- }
5629
- },
5630
- {
5631
- id: "gpt-5.6-sol-1m-low",
5632
- handle: "openai/gpt-5.6-sol",
5633
- label: "GPT-5.6 Sol 1M",
5634
- description: "GPT-5.6 Sol 1M (low reasoning)",
5635
- updateArgs: {
5636
- reasoning_effort: "low",
5637
- verbosity: "medium",
5638
- context_window: 1050000,
5639
- max_output_tokens: 128000,
5640
- parallel_tool_calls: true
5641
- }
5642
- },
5643
- {
5644
- id: "gpt-5.6-sol-1m-medium",
5645
- handle: "openai/gpt-5.6-sol",
5646
- label: "GPT-5.6 Sol 1M",
5647
- description: "GPT-5.6 Sol 1M (med reasoning)",
5648
- updateArgs: {
5649
- reasoning_effort: "medium",
5650
- verbosity: "medium",
5651
- context_window: 1050000,
5652
- max_output_tokens: 128000,
5653
- parallel_tool_calls: true
5654
- }
5655
- },
5656
- {
5657
- id: "gpt-5.6-sol-1m",
5658
- handle: "openai/gpt-5.6-sol",
5659
- label: "GPT-5.6 Sol 1M",
5660
- description: "GPT-5.6 Sol with 1M token context window (high reasoning)",
5661
- updateArgs: {
5662
- reasoning_effort: "high",
5663
- verbosity: "medium",
5664
- context_window: 1050000,
5665
- max_output_tokens: 128000,
5666
- parallel_tool_calls: true
5667
- }
5668
- },
5669
- {
5670
- id: "gpt-5.6-sol-1m-xhigh",
5671
- handle: "openai/gpt-5.6-sol",
5672
- label: "GPT-5.6 Sol 1M",
5673
- description: "GPT-5.6 Sol 1M (extra-high reasoning)",
5674
- updateArgs: {
5675
- reasoning_effort: "xhigh",
5676
- verbosity: "medium",
5677
- context_window: 1050000,
5678
- max_output_tokens: 128000,
5679
- parallel_tool_calls: true
5680
- }
5681
- },
5682
- {
5683
- id: "gpt-5.6-sol-1m-max",
5684
- handle: "openai/gpt-5.6-sol",
5685
- label: "GPT-5.6 Sol 1M",
5686
- description: "GPT-5.6 Sol 1M (max reasoning)",
5687
- updateArgs: {
5688
- reasoning_effort: "max",
5689
- verbosity: "medium",
5690
- context_window: 1050000,
5691
- max_output_tokens: 128000,
5692
- parallel_tool_calls: true
5693
- }
5694
- },
5695
- {
5696
- id: "gpt-5.6-terra-none",
5697
- handle: "openai/gpt-5.6-terra",
5698
- label: "GPT-5.6 Terra",
5699
- description: "GPT-5.6 Terra (no reasoning)",
5700
- updateArgs: {
5701
- reasoning_effort: "none",
5702
- verbosity: "medium",
5703
- context_window: 350000,
5704
- max_output_tokens: 128000,
5705
- parallel_tool_calls: true
5706
- }
5707
- },
5708
- {
5709
- id: "gpt-5.6-terra-low",
5710
- handle: "openai/gpt-5.6-terra",
5711
- label: "GPT-5.6 Terra",
5712
- description: "GPT-5.6 Terra (low reasoning)",
5713
- updateArgs: {
5714
- reasoning_effort: "low",
5715
- verbosity: "medium",
5716
- context_window: 350000,
5717
- max_output_tokens: 128000,
5718
- parallel_tool_calls: true
5719
- }
5720
- },
5721
- {
5722
- id: "gpt-5.6-terra-medium",
5723
- handle: "openai/gpt-5.6-terra",
5724
- label: "GPT-5.6 Terra",
5725
- description: "GPT-5.6 Terra (med reasoning)",
5726
- updateArgs: {
5727
- reasoning_effort: "medium",
5728
- verbosity: "medium",
5729
- context_window: 350000,
5730
- max_output_tokens: 128000,
5731
- parallel_tool_calls: true
5732
- }
5733
- },
5734
- {
5735
- id: "gpt-5.6-terra",
5736
- handle: "openai/gpt-5.6-terra",
5737
- label: "GPT-5.6 Terra",
5738
- description: "GPT-5.6 Terra (high reasoning)",
5739
- isFeatured: true,
5740
- updateArgs: {
5741
- reasoning_effort: "high",
5742
- verbosity: "medium",
5743
- context_window: 350000,
5744
- max_output_tokens: 128000,
5745
- parallel_tool_calls: true
5746
- }
5747
- },
5748
- {
5749
- id: "gpt-5.6-terra-xhigh",
5750
- handle: "openai/gpt-5.6-terra",
5751
- label: "GPT-5.6 Terra",
5752
- description: "GPT-5.6 Terra (extra-high reasoning)",
5753
- updateArgs: {
5754
- reasoning_effort: "xhigh",
5755
- verbosity: "medium",
5756
- context_window: 350000,
5757
- max_output_tokens: 128000,
5758
- parallel_tool_calls: true
5759
- }
5760
- },
5761
- {
5762
- id: "gpt-5.6-terra-max",
5763
- handle: "openai/gpt-5.6-terra",
5764
- label: "GPT-5.6 Terra",
5765
- description: "GPT-5.6 Terra (max reasoning)",
5766
- updateArgs: {
5767
- reasoning_effort: "max",
5768
- verbosity: "medium",
5769
- context_window: 350000,
5770
- max_output_tokens: 128000,
5771
- parallel_tool_calls: true
5772
- }
5773
- },
5774
- {
5775
- id: "gpt-5.6-terra-1m-none",
5776
- handle: "openai/gpt-5.6-terra",
5777
- label: "GPT-5.6 Terra 1M",
5778
- description: "GPT-5.6 Terra 1M (no reasoning)",
5779
- updateArgs: {
5780
- reasoning_effort: "none",
5781
- verbosity: "medium",
5782
- context_window: 1050000,
5783
- max_output_tokens: 128000,
5784
- parallel_tool_calls: true
5785
- }
5786
- },
5787
- {
5788
- id: "gpt-5.6-terra-1m-low",
5789
- handle: "openai/gpt-5.6-terra",
5790
- label: "GPT-5.6 Terra 1M",
5791
- description: "GPT-5.6 Terra 1M (low reasoning)",
5792
- updateArgs: {
5793
- reasoning_effort: "low",
5794
- verbosity: "medium",
5795
- context_window: 1050000,
5796
- max_output_tokens: 128000,
5797
- parallel_tool_calls: true
5798
- }
5799
- },
5800
- {
5801
- id: "gpt-5.6-terra-1m-medium",
5802
- handle: "openai/gpt-5.6-terra",
5803
- label: "GPT-5.6 Terra 1M",
5804
- description: "GPT-5.6 Terra 1M (med reasoning)",
5805
- updateArgs: {
5806
- reasoning_effort: "medium",
5807
- verbosity: "medium",
5808
- context_window: 1050000,
5809
- max_output_tokens: 128000,
5810
- parallel_tool_calls: true
5811
- }
5812
- },
5813
- {
5814
- id: "gpt-5.6-terra-1m",
5815
- handle: "openai/gpt-5.6-terra",
5816
- label: "GPT-5.6 Terra 1M",
5817
- description: "GPT-5.6 Terra with 1M token context window (high reasoning)",
5818
- updateArgs: {
5819
- reasoning_effort: "high",
5820
- verbosity: "medium",
5821
- context_window: 1050000,
5822
- max_output_tokens: 128000,
5823
- parallel_tool_calls: true
5824
- }
5825
- },
5826
- {
5827
- id: "gpt-5.6-terra-1m-xhigh",
5828
- handle: "openai/gpt-5.6-terra",
5829
- label: "GPT-5.6 Terra 1M",
5830
- description: "GPT-5.6 Terra 1M (extra-high reasoning)",
5831
- updateArgs: {
5832
- reasoning_effort: "xhigh",
5833
- verbosity: "medium",
5834
- context_window: 1050000,
5835
- max_output_tokens: 128000,
5836
- parallel_tool_calls: true
5837
- }
5838
- },
5839
- {
5840
- id: "gpt-5.6-terra-1m-max",
5841
- handle: "openai/gpt-5.6-terra",
5842
- label: "GPT-5.6 Terra 1M",
5843
- description: "GPT-5.6 Terra 1M (max reasoning)",
5844
- updateArgs: {
5845
- reasoning_effort: "max",
5846
- verbosity: "medium",
5847
- context_window: 1050000,
5848
- max_output_tokens: 128000,
5849
- parallel_tool_calls: true
5850
- }
5851
- },
5852
- {
5853
- id: "gpt-5.6-luna-none",
5854
- handle: "openai/gpt-5.6-luna",
5855
- label: "GPT-5.6 Luna",
5856
- description: "GPT-5.6 Luna (no reasoning)",
5857
- updateArgs: {
5858
- reasoning_effort: "none",
5859
- verbosity: "medium",
5860
- context_window: 350000,
5861
- max_output_tokens: 128000,
5862
- parallel_tool_calls: true
5863
- }
5864
- },
5865
- {
5866
- id: "gpt-5.6-luna-low",
5867
- handle: "openai/gpt-5.6-luna",
5868
- label: "GPT-5.6 Luna",
5869
- description: "GPT-5.6 Luna (low reasoning)",
5870
- updateArgs: {
5871
- reasoning_effort: "low",
5872
- verbosity: "medium",
5873
- context_window: 350000,
5874
- max_output_tokens: 128000,
5875
- parallel_tool_calls: true
5876
- }
5877
- },
5878
- {
5879
- id: "gpt-5.6-luna-medium",
5880
- handle: "openai/gpt-5.6-luna",
5881
- label: "GPT-5.6 Luna",
5882
- description: "GPT-5.6 Luna (med reasoning)",
5883
- updateArgs: {
5884
- reasoning_effort: "medium",
5885
- verbosity: "medium",
5886
- context_window: 350000,
5887
- max_output_tokens: 128000,
5888
- parallel_tool_calls: true
5889
- }
5890
- },
5891
- {
5892
- id: "gpt-5.6-luna",
5893
- handle: "openai/gpt-5.6-luna",
5894
- label: "GPT-5.6 Luna",
5895
- description: "GPT-5.6 Luna (high reasoning)",
5896
- isFeatured: true,
5897
- updateArgs: {
5898
- reasoning_effort: "high",
5899
- verbosity: "medium",
5900
- context_window: 350000,
5901
- max_output_tokens: 128000,
5902
- parallel_tool_calls: true
5903
- }
5904
- },
5905
- {
5906
- id: "gpt-5.6-luna-xhigh",
5907
- handle: "openai/gpt-5.6-luna",
5908
- label: "GPT-5.6 Luna",
5909
- description: "GPT-5.6 Luna (extra-high reasoning)",
5910
- updateArgs: {
5911
- reasoning_effort: "xhigh",
5912
- verbosity: "medium",
5913
- context_window: 350000,
5914
- max_output_tokens: 128000,
5915
- parallel_tool_calls: true
5916
- }
5917
- },
5918
- {
5919
- id: "gpt-5.6-luna-max",
5920
- handle: "openai/gpt-5.6-luna",
5921
- label: "GPT-5.6 Luna",
5922
- description: "GPT-5.6 Luna (max reasoning)",
5923
- updateArgs: {
5924
- reasoning_effort: "max",
5925
- verbosity: "medium",
5926
- context_window: 350000,
5927
- max_output_tokens: 128000,
5928
- parallel_tool_calls: true
5929
- }
5930
- },
5931
- {
5932
- id: "gpt-5.6-luna-1m-none",
5933
- handle: "openai/gpt-5.6-luna",
5934
- label: "GPT-5.6 Luna 1M",
5935
- description: "GPT-5.6 Luna 1M (no reasoning)",
5936
- updateArgs: {
5937
- reasoning_effort: "none",
5938
- verbosity: "medium",
5939
- context_window: 1050000,
5940
- max_output_tokens: 128000,
5941
- parallel_tool_calls: true
5942
- }
5943
- },
5944
- {
5945
- id: "gpt-5.6-luna-1m-low",
5946
- handle: "openai/gpt-5.6-luna",
5947
- label: "GPT-5.6 Luna 1M",
5948
- description: "GPT-5.6 Luna 1M (low reasoning)",
5949
- updateArgs: {
5950
- reasoning_effort: "low",
5951
- verbosity: "medium",
5952
- context_window: 1050000,
5953
- max_output_tokens: 128000,
5954
- parallel_tool_calls: true
5955
- }
5956
- },
5957
- {
5958
- id: "gpt-5.6-luna-1m-medium",
5959
- handle: "openai/gpt-5.6-luna",
5960
- label: "GPT-5.6 Luna 1M",
5961
- description: "GPT-5.6 Luna 1M (med reasoning)",
5962
- updateArgs: {
5963
- reasoning_effort: "medium",
5964
- verbosity: "medium",
5965
- context_window: 1050000,
5966
- max_output_tokens: 128000,
5967
- parallel_tool_calls: true
5968
- }
5969
- },
5970
- {
5971
- id: "gpt-5.6-luna-1m",
5972
- handle: "openai/gpt-5.6-luna",
5973
- label: "GPT-5.6 Luna 1M",
5974
- description: "GPT-5.6 Luna with 1M token context window (high reasoning)",
5975
- updateArgs: {
5976
- reasoning_effort: "high",
5977
- verbosity: "medium",
5978
- context_window: 1050000,
5979
- max_output_tokens: 128000,
5980
- parallel_tool_calls: true
5981
- }
5982
- },
5983
- {
5984
- id: "gpt-5.6-luna-1m-xhigh",
5985
- handle: "openai/gpt-5.6-luna",
5986
- label: "GPT-5.6 Luna 1M",
5987
- description: "GPT-5.6 Luna 1M (extra-high reasoning)",
5988
- updateArgs: {
5989
- reasoning_effort: "xhigh",
5990
- verbosity: "medium",
5991
- context_window: 1050000,
5992
- max_output_tokens: 128000,
5993
- parallel_tool_calls: true
5994
- }
5995
- },
5996
- {
5997
- id: "gpt-5.6-luna-1m-max",
5998
- handle: "openai/gpt-5.6-luna",
5999
- label: "GPT-5.6 Luna 1M",
6000
- description: "GPT-5.6 Luna 1M (max reasoning)",
6001
- updateArgs: {
6002
- reasoning_effort: "max",
6003
- verbosity: "medium",
6004
- context_window: 1050000,
6005
- max_output_tokens: 128000,
6006
- parallel_tool_calls: true
6007
- }
6008
- },
6009
- {
6010
- id: "gpt-5.6-sol-plus-pro-none",
6011
- handle: "chatgpt-plus-pro/gpt-5.6-sol",
6012
- label: "GPT-5.6 Sol (ChatGPT)",
6013
- description: "GPT-5.6 Sol (no reasoning) via ChatGPT Plus/Pro",
6014
- updateArgs: {
6015
- reasoning_effort: "none",
6016
- verbosity: "low",
6017
- context_window: 350000,
6018
- max_output_tokens: 128000,
6019
- parallel_tool_calls: true
6020
- }
6021
- },
6022
- {
6023
- id: "gpt-5.6-sol-plus-pro-low",
6024
- handle: "chatgpt-plus-pro/gpt-5.6-sol",
6025
- label: "GPT-5.6 Sol (ChatGPT)",
6026
- description: "GPT-5.6 Sol (low reasoning) via ChatGPT Plus/Pro",
6027
- updateArgs: {
6028
- reasoning_effort: "low",
6029
- verbosity: "low",
6030
- context_window: 350000,
6031
- max_output_tokens: 128000,
6032
- parallel_tool_calls: true
6033
- }
6034
- },
6035
- {
6036
- id: "gpt-5.6-sol-plus-pro-medium",
6037
- handle: "chatgpt-plus-pro/gpt-5.6-sol",
6038
- label: "GPT-5.6 Sol (ChatGPT)",
6039
- description: "GPT-5.6 Sol (med reasoning) via ChatGPT Plus/Pro",
6040
- updateArgs: {
6041
- reasoning_effort: "medium",
6042
- verbosity: "low",
6043
- context_window: 350000,
6044
- max_output_tokens: 128000,
6045
- parallel_tool_calls: true
6046
- }
6047
- },
6048
- {
6049
- id: "gpt-5.6-sol-plus-pro-high",
6050
- handle: "chatgpt-plus-pro/gpt-5.6-sol",
6051
- label: "GPT-5.6 Sol (ChatGPT)",
6052
- description: "GPT-5.6 Sol (high reasoning) via ChatGPT Plus/Pro",
6053
- updateArgs: {
6054
- reasoning_effort: "high",
6055
- verbosity: "low",
6056
- context_window: 350000,
6057
- max_output_tokens: 128000,
6058
- parallel_tool_calls: true
6059
- },
6060
- isFeatured: true
6061
- },
6062
- {
6063
- id: "gpt-5.6-sol-plus-pro-xhigh",
6064
- handle: "chatgpt-plus-pro/gpt-5.6-sol",
6065
- label: "GPT-5.6 Sol (ChatGPT)",
6066
- description: "GPT-5.6 Sol (extra-high reasoning) via ChatGPT Plus/Pro",
6067
- updateArgs: {
6068
- reasoning_effort: "xhigh",
6069
- verbosity: "low",
6070
- context_window: 350000,
6071
- max_output_tokens: 128000,
6072
- parallel_tool_calls: true
6073
- }
6074
- },
6075
- {
6076
- id: "gpt-5.6-sol-plus-pro-max",
6077
- handle: "chatgpt-plus-pro/gpt-5.6-sol",
6078
- label: "GPT-5.6 Sol (ChatGPT)",
6079
- description: "GPT-5.6 Sol (max reasoning) via ChatGPT Plus/Pro",
6080
- updateArgs: {
6081
- reasoning_effort: "max",
6082
- verbosity: "low",
6083
- context_window: 350000,
6084
- max_output_tokens: 128000,
6085
- parallel_tool_calls: true
6086
- }
6087
- },
6088
- {
6089
- id: "gpt-5.6-terra-plus-pro-none",
6090
- handle: "chatgpt-plus-pro/gpt-5.6-terra",
6091
- label: "GPT-5.6 Terra (ChatGPT)",
6092
- description: "GPT-5.6 Terra (no reasoning) via ChatGPT Plus/Pro",
6093
- updateArgs: {
6094
- reasoning_effort: "none",
6095
- verbosity: "low",
6096
- context_window: 350000,
6097
- max_output_tokens: 128000,
6098
- parallel_tool_calls: true
6099
- }
6100
- },
6101
- {
6102
- id: "gpt-5.6-terra-plus-pro-low",
6103
- handle: "chatgpt-plus-pro/gpt-5.6-terra",
6104
- label: "GPT-5.6 Terra (ChatGPT)",
6105
- description: "GPT-5.6 Terra (low reasoning) via ChatGPT Plus/Pro",
6106
- updateArgs: {
6107
- reasoning_effort: "low",
6108
- verbosity: "low",
6109
- context_window: 350000,
6110
- max_output_tokens: 128000,
6111
- parallel_tool_calls: true
6112
- }
6113
- },
6114
- {
6115
- id: "gpt-5.6-terra-plus-pro-medium",
6116
- handle: "chatgpt-plus-pro/gpt-5.6-terra",
6117
- label: "GPT-5.6 Terra (ChatGPT)",
6118
- description: "GPT-5.6 Terra (med reasoning) via ChatGPT Plus/Pro",
6119
- updateArgs: {
6120
- reasoning_effort: "medium",
6121
- verbosity: "low",
6122
- context_window: 350000,
6123
- max_output_tokens: 128000,
6124
- parallel_tool_calls: true
6125
- }
6126
- },
6127
- {
6128
- id: "gpt-5.6-terra-plus-pro-high",
6129
- handle: "chatgpt-plus-pro/gpt-5.6-terra",
6130
- label: "GPT-5.6 Terra (ChatGPT)",
6131
- description: "GPT-5.6 Terra (high reasoning) via ChatGPT Plus/Pro",
6132
- updateArgs: {
6133
- reasoning_effort: "high",
6134
- verbosity: "low",
6135
- context_window: 350000,
6136
- max_output_tokens: 128000,
6137
- parallel_tool_calls: true
6138
- },
6139
- isFeatured: true
6140
- },
6141
- {
6142
- id: "gpt-5.6-terra-plus-pro-xhigh",
6143
- handle: "chatgpt-plus-pro/gpt-5.6-terra",
6144
- label: "GPT-5.6 Terra (ChatGPT)",
6145
- description: "GPT-5.6 Terra (extra-high reasoning) via ChatGPT Plus/Pro",
6146
- updateArgs: {
6147
- reasoning_effort: "xhigh",
6148
- verbosity: "low",
6149
- context_window: 350000,
6150
- max_output_tokens: 128000,
6151
- parallel_tool_calls: true
6152
- }
6153
- },
6154
- {
6155
- id: "gpt-5.6-terra-plus-pro-max",
6156
- handle: "chatgpt-plus-pro/gpt-5.6-terra",
6157
- label: "GPT-5.6 Terra (ChatGPT)",
6158
- description: "GPT-5.6 Terra (max reasoning) via ChatGPT Plus/Pro",
6159
- updateArgs: {
6160
- reasoning_effort: "max",
6161
- verbosity: "low",
6162
- context_window: 350000,
6163
- max_output_tokens: 128000,
6164
- parallel_tool_calls: true
6165
- }
6166
- },
6167
- {
6168
- id: "gpt-5.6-luna-plus-pro-none",
6169
- handle: "chatgpt-plus-pro/gpt-5.6-luna",
6170
- label: "GPT-5.6 Luna (ChatGPT)",
6171
- description: "GPT-5.6 Luna (no reasoning) via ChatGPT Plus/Pro",
6172
- updateArgs: {
6173
- reasoning_effort: "none",
6174
- verbosity: "low",
6175
- context_window: 350000,
6176
- max_output_tokens: 128000,
6177
- parallel_tool_calls: true
6178
- }
6179
- },
6180
- {
6181
- id: "gpt-5.6-luna-plus-pro-low",
6182
- handle: "chatgpt-plus-pro/gpt-5.6-luna",
6183
- label: "GPT-5.6 Luna (ChatGPT)",
6184
- description: "GPT-5.6 Luna (low reasoning) via ChatGPT Plus/Pro",
6185
- updateArgs: {
6186
- reasoning_effort: "low",
6187
- verbosity: "low",
6188
- context_window: 350000,
6189
- max_output_tokens: 128000,
6190
- parallel_tool_calls: true
6191
- }
6192
- },
6193
- {
6194
- id: "gpt-5.6-luna-plus-pro-medium",
6195
- handle: "chatgpt-plus-pro/gpt-5.6-luna",
6196
- label: "GPT-5.6 Luna (ChatGPT)",
6197
- description: "GPT-5.6 Luna (med reasoning) via ChatGPT Plus/Pro",
6198
- updateArgs: {
6199
- reasoning_effort: "medium",
6200
- verbosity: "low",
6201
- context_window: 350000,
6202
- max_output_tokens: 128000,
6203
- parallel_tool_calls: true
6204
- }
6205
- },
6206
- {
6207
- id: "gpt-5.6-luna-plus-pro-high",
6208
- handle: "chatgpt-plus-pro/gpt-5.6-luna",
6209
- label: "GPT-5.6 Luna (ChatGPT)",
6210
- description: "GPT-5.6 Luna (high reasoning) via ChatGPT Plus/Pro",
6211
- updateArgs: {
6212
- reasoning_effort: "high",
6213
- verbosity: "low",
6214
- context_window: 350000,
6215
- max_output_tokens: 128000,
6216
- parallel_tool_calls: true
6217
- },
6218
- isFeatured: true
6219
- },
6220
- {
6221
- id: "gpt-5.6-luna-plus-pro-xhigh",
6222
- handle: "chatgpt-plus-pro/gpt-5.6-luna",
6223
- label: "GPT-5.6 Luna (ChatGPT)",
6224
- description: "GPT-5.6 Luna (extra-high reasoning) via ChatGPT Plus/Pro",
6225
- updateArgs: {
6226
- reasoning_effort: "xhigh",
6227
- verbosity: "low",
6228
- context_window: 350000,
6229
- max_output_tokens: 128000,
6230
- parallel_tool_calls: true
6231
- }
6232
- },
6233
- {
6234
- id: "gpt-5.6-luna-plus-pro-max",
6235
- handle: "chatgpt-plus-pro/gpt-5.6-luna",
6236
- label: "GPT-5.6 Luna (ChatGPT)",
6237
- description: "GPT-5.6 Luna (max reasoning) via ChatGPT Plus/Pro",
6238
- updateArgs: {
6239
- reasoning_effort: "max",
6240
- verbosity: "low",
6241
- context_window: 350000,
6242
- max_output_tokens: 128000,
6243
- parallel_tool_calls: true
6244
- }
6245
- },
6246
- {
6247
- id: "fable",
6248
- handle: "anthropic/claude-fable-5",
6249
- label: "Fable 5",
6250
- description: "Fable 5 (high reasoning)",
6251
- isFeatured: true,
6252
- updateArgs: {
6253
- context_window: 200000,
6254
- max_output_tokens: 128000,
6255
- enable_reasoner: true,
6256
- reasoning_effort: "high",
6257
- parallel_tool_calls: true
6258
- }
6259
- },
6260
- {
6261
- id: "fable-low",
6262
- handle: "anthropic/claude-fable-5",
6263
- label: "Fable 5",
6264
- description: "Fable 5 (low reasoning)",
6265
- updateArgs: {
6266
- context_window: 200000,
6267
- max_output_tokens: 128000,
6268
- enable_reasoner: true,
6269
- reasoning_effort: "low",
6270
- max_reasoning_tokens: 4000,
6271
- parallel_tool_calls: true
6272
- }
6273
- },
6274
- {
6275
- id: "fable-medium",
6276
- handle: "anthropic/claude-fable-5",
6277
- label: "Fable 5",
6278
- description: "Fable 5 (med reasoning)",
6279
- updateArgs: {
6280
- context_window: 200000,
6281
- max_output_tokens: 128000,
6282
- enable_reasoner: true,
6283
- reasoning_effort: "medium",
6284
- max_reasoning_tokens: 12000,
6285
- parallel_tool_calls: true
6286
- }
6287
- },
6288
- {
6289
- id: "fable-xhigh",
6290
- handle: "anthropic/claude-fable-5",
6291
- label: "Fable 5",
6292
- description: "Fable 5 (extra-high reasoning)",
6293
- updateArgs: {
6294
- context_window: 200000,
6295
- max_output_tokens: 128000,
6296
- enable_reasoner: true,
6297
- reasoning_effort: "xhigh",
6298
- parallel_tool_calls: true
6299
- }
6300
- },
6301
- {
6302
- id: "fable-max",
6303
- handle: "anthropic/claude-fable-5",
6304
- label: "Fable 5",
6305
- description: "Fable 5 (max reasoning)",
6306
- updateArgs: {
6307
- context_window: 200000,
6308
- max_output_tokens: 128000,
6309
- enable_reasoner: true,
6310
- reasoning_effort: "max",
6311
- parallel_tool_calls: true
6312
- }
6313
- },
6314
- {
6315
- id: "fable-1m",
6316
- handle: "anthropic/claude-fable-5",
6317
- label: "Fable 5 1M",
6318
- description: "Claude Fable 5 with 1M token context window (high reasoning)",
6319
- updateArgs: {
6320
- context_window: 950000,
6321
- max_output_tokens: 128000,
6322
- enable_reasoner: true,
6323
- reasoning_effort: "high",
6324
- parallel_tool_calls: true
6325
- }
6326
- },
6327
- {
6328
- id: "fable-1m-low",
6329
- handle: "anthropic/claude-fable-5",
6330
- label: "Fable 5 1M",
6331
- description: "Fable 5 1M (low reasoning)",
6332
- updateArgs: {
6333
- context_window: 950000,
6334
- max_output_tokens: 128000,
6335
- enable_reasoner: true,
6336
- reasoning_effort: "low",
6337
- max_reasoning_tokens: 4000,
6338
- parallel_tool_calls: true
6339
- }
6340
- },
6341
- {
6342
- id: "fable-1m-medium",
6343
- handle: "anthropic/claude-fable-5",
6344
- label: "Fable 5 1M",
6345
- description: "Fable 5 1M (med reasoning)",
6346
- updateArgs: {
6347
- context_window: 950000,
6348
- max_output_tokens: 128000,
6349
- enable_reasoner: true,
6350
- reasoning_effort: "medium",
6351
- max_reasoning_tokens: 12000,
6352
- parallel_tool_calls: true
6353
- }
6354
- },
6355
- {
6356
- id: "fable-1m-xhigh",
6357
- handle: "anthropic/claude-fable-5",
6358
- label: "Fable 5 1M",
6359
- description: "Fable 5 1M (extra-high reasoning)",
6360
- updateArgs: {
6361
- context_window: 950000,
6362
- max_output_tokens: 128000,
6363
- enable_reasoner: true,
6364
- reasoning_effort: "xhigh",
6365
- parallel_tool_calls: true
6366
- }
6367
- },
6368
- {
6369
- id: "fable-1m-max",
6370
- handle: "anthropic/claude-fable-5",
6371
- label: "Fable 5 1M",
6372
- description: "Fable 5 1M (max reasoning)",
6373
- updateArgs: {
6374
- context_window: 950000,
6375
- max_output_tokens: 128000,
6376
- enable_reasoner: true,
6377
- reasoning_effort: "max",
6378
- parallel_tool_calls: true
6379
- }
6380
- },
6381
- {
6382
- id: "opus-5",
6383
- handle: "anthropic/claude-opus-5",
6384
- label: "Opus 5",
6385
- description: "Opus 5 (high reasoning)",
6386
- updateArgs: {
6387
- context_window: 200000,
6388
- max_output_tokens: 128000,
6389
- enable_reasoner: true,
6390
- reasoning_effort: "high",
6391
- parallel_tool_calls: true
6392
- }
6393
- },
6394
- {
6395
- id: "opus-5-low",
6396
- handle: "anthropic/claude-opus-5",
6397
- label: "Opus 5",
6398
- description: "Opus 5 (low reasoning)",
6399
- updateArgs: {
6400
- context_window: 200000,
6401
- max_output_tokens: 128000,
6402
- enable_reasoner: true,
6403
- reasoning_effort: "low",
6404
- max_reasoning_tokens: 4000,
6405
- parallel_tool_calls: true
6406
- }
6407
- },
6408
- {
6409
- id: "opus-5-medium",
6410
- handle: "anthropic/claude-opus-5",
6411
- label: "Opus 5",
6412
- description: "Opus 5 (med reasoning)",
6413
- updateArgs: {
6414
- context_window: 200000,
6415
- max_output_tokens: 128000,
6416
- enable_reasoner: true,
6417
- reasoning_effort: "medium",
6418
- max_reasoning_tokens: 12000,
6419
- parallel_tool_calls: true
6420
- }
6421
- },
6422
- {
6423
- id: "opus-5-xhigh",
6424
- handle: "anthropic/claude-opus-5",
6425
- label: "Opus 5",
6426
- description: "Opus 5 (extra-high reasoning)",
6427
- updateArgs: {
6428
- context_window: 200000,
6429
- max_output_tokens: 128000,
6430
- enable_reasoner: true,
6431
- reasoning_effort: "xhigh",
6432
- parallel_tool_calls: true
6433
- }
6434
- },
6435
- {
6436
- id: "opus-5-max",
6437
- handle: "anthropic/claude-opus-5",
6438
- label: "Opus 5",
6439
- description: "Opus 5 (max reasoning)",
6440
- updateArgs: {
6441
- context_window: 200000,
6442
- max_output_tokens: 128000,
6443
- enable_reasoner: true,
6444
- reasoning_effort: "max",
6445
- parallel_tool_calls: true
6446
- }
6447
- },
6448
- {
6449
- id: "opus",
6450
- handle: "anthropic/claude-opus-4-8",
6451
- label: "Opus 4.8",
6452
- description: "Opus 4.8 (high reasoning)",
6453
- isFeatured: true,
6454
- updateArgs: {
6455
- context_window: 200000,
6456
- max_output_tokens: 128000,
6457
- reasoning_effort: "high",
6458
- enable_reasoner: true,
6459
- parallel_tool_calls: true
6460
- }
6461
- },
6462
- {
6463
- id: "opus-4.8-low",
6464
- handle: "anthropic/claude-opus-4-8",
6465
- label: "Opus 4.8",
6466
- description: "Opus 4.8 (low reasoning)",
6467
- updateArgs: {
6468
- context_window: 200000,
6469
- max_output_tokens: 128000,
6470
- reasoning_effort: "low",
6471
- enable_reasoner: true,
6472
- max_reasoning_tokens: 4000,
6473
- parallel_tool_calls: true
6474
- }
6475
- },
6476
- {
6477
- id: "opus-4.8-medium",
6478
- handle: "anthropic/claude-opus-4-8",
6479
- label: "Opus 4.8",
6480
- description: "Opus 4.8 (med reasoning)",
6481
- updateArgs: {
6482
- context_window: 200000,
6483
- max_output_tokens: 128000,
6484
- reasoning_effort: "medium",
6485
- enable_reasoner: true,
6486
- max_reasoning_tokens: 12000,
6487
- parallel_tool_calls: true
6488
- }
6489
- },
6490
- {
6491
- id: "opus-4.8-high",
6492
- handle: "anthropic/claude-opus-4-8",
6493
- label: "Opus 4.8",
6494
- description: "Opus 4.8 (high reasoning)",
6495
- updateArgs: {
6496
- context_window: 200000,
6497
- max_output_tokens: 128000,
6498
- reasoning_effort: "high",
6499
- enable_reasoner: true,
6500
- parallel_tool_calls: true
6501
- }
6502
- },
6503
- {
6504
- id: "opus-4.8-xhigh",
6505
- handle: "anthropic/claude-opus-4-8",
6506
- label: "Opus 4.8",
6507
- description: "Opus 4.8 (extra-high reasoning)",
6508
- updateArgs: {
6509
- context_window: 200000,
6510
- max_output_tokens: 128000,
6511
- reasoning_effort: "xhigh",
6512
- enable_reasoner: true,
6513
- parallel_tool_calls: true
6514
- }
6515
- },
6516
- {
6517
- id: "opus-4.8-max",
6518
- handle: "anthropic/claude-opus-4-8",
6519
- label: "Opus 4.8",
6520
- description: "Opus 4.8 (max reasoning)",
6521
- updateArgs: {
6522
- context_window: 200000,
6523
- max_output_tokens: 128000,
6524
- reasoning_effort: "max",
6525
- enable_reasoner: true,
6526
- parallel_tool_calls: true
6527
- }
6528
- },
6529
- {
6530
- id: "opus-4.8-1m",
6531
- handle: "anthropic/claude-opus-4-8",
6532
- label: "Opus 4.8 1M",
6533
- description: "Claude Opus 4.8 with 1M token context window (high reasoning)",
6534
- updateArgs: {
6535
- context_window: 950000,
6536
- max_output_tokens: 128000,
6537
- reasoning_effort: "high",
6538
- enable_reasoner: true,
6539
- parallel_tool_calls: true
6540
- }
6541
- },
6542
- {
6543
- id: "opus-4.8-1m-no-reasoning",
6544
- handle: "anthropic/claude-opus-4-8",
6545
- label: "Opus 4.8 1M",
6546
- description: "Opus 4.8 1M with no reasoning (faster)",
6547
- updateArgs: {
6548
- context_window: 950000,
6549
- max_output_tokens: 128000,
6550
- reasoning_effort: "none",
6551
- enable_reasoner: false,
6552
- parallel_tool_calls: true
6553
- }
6554
- },
6555
- {
6556
- id: "opus-4.8-1m-low",
6557
- handle: "anthropic/claude-opus-4-8",
6558
- label: "Opus 4.8 1M",
6559
- description: "Opus 4.8 1M (low reasoning)",
6560
- updateArgs: {
6561
- context_window: 950000,
6562
- max_output_tokens: 128000,
6563
- reasoning_effort: "low",
6564
- enable_reasoner: true,
6565
- parallel_tool_calls: true,
6566
- max_reasoning_tokens: 4000
6567
- }
6568
- },
6569
- {
6570
- id: "opus-4.8-1m-medium",
6571
- handle: "anthropic/claude-opus-4-8",
6572
- label: "Opus 4.8 1M",
6573
- description: "Opus 4.8 1M (med reasoning)",
6574
- updateArgs: {
6575
- context_window: 950000,
6576
- max_output_tokens: 128000,
6577
- reasoning_effort: "medium",
6578
- enable_reasoner: true,
6579
- parallel_tool_calls: true,
6580
- max_reasoning_tokens: 12000
6581
- }
6582
- },
6583
- {
6584
- id: "opus-4.8-1m-xhigh",
6585
- handle: "anthropic/claude-opus-4-8",
6586
- label: "Opus 4.8 1M",
6587
- description: "Opus 4.8 1M (max reasoning)",
6588
- updateArgs: {
6589
- context_window: 950000,
6590
- max_output_tokens: 128000,
6591
- reasoning_effort: "xhigh",
6592
- enable_reasoner: true,
6593
- parallel_tool_calls: true
6594
- }
6595
- },
6596
- {
6597
- id: "opus-1m",
6598
- handle: "anthropic/claude-opus-4-6",
6599
- label: "Opus 4.6 1M",
6600
- description: "Claude Opus 4.6 with 1M token context window (high reasoning)",
6601
- updateArgs: {
6602
- context_window: 950000,
6603
- max_output_tokens: 128000,
6604
- reasoning_effort: "high",
6605
- enable_reasoner: true,
6606
- parallel_tool_calls: true
6607
- }
6608
- },
6609
- {
6610
- id: "opus-1m-no-reasoning",
6611
- handle: "anthropic/claude-opus-4-6",
6612
- label: "Opus 4.6 1M",
6613
- description: "Opus 4.6 1M with no reasoning (faster)",
6614
- updateArgs: {
6615
- context_window: 950000,
6616
- max_output_tokens: 128000,
6617
- reasoning_effort: "none",
6618
- enable_reasoner: false,
6619
- parallel_tool_calls: true
6620
- }
6621
- },
6622
- {
6623
- id: "opus-1m-low",
6624
- handle: "anthropic/claude-opus-4-6",
6625
- label: "Opus 4.6 1M",
6626
- description: "Opus 4.6 1M (low reasoning)",
6627
- updateArgs: {
6628
- context_window: 950000,
6629
- max_output_tokens: 128000,
6630
- reasoning_effort: "low",
6631
- enable_reasoner: true,
6632
- max_reasoning_tokens: 4000,
6633
- parallel_tool_calls: true
6634
- }
6635
- },
6636
- {
6637
- id: "opus-1m-medium",
6638
- handle: "anthropic/claude-opus-4-6",
6639
- label: "Opus 4.6 1M",
6640
- description: "Opus 4.6 1M (med reasoning)",
6641
- updateArgs: {
6642
- context_window: 950000,
6643
- max_output_tokens: 128000,
6644
- reasoning_effort: "medium",
6645
- enable_reasoner: true,
6646
- max_reasoning_tokens: 12000,
6647
- parallel_tool_calls: true
6648
- }
6649
- },
6650
- {
6651
- id: "opus-1m-xhigh",
6652
- handle: "anthropic/claude-opus-4-6",
6653
- label: "Opus 4.6 1M",
6654
- description: "Opus 4.6 1M (max reasoning)",
6655
- updateArgs: {
6656
- context_window: 950000,
6657
- max_output_tokens: 128000,
6658
- reasoning_effort: "xhigh",
6659
- enable_reasoner: true,
6660
- parallel_tool_calls: true
6661
- }
6662
- },
6663
- {
6664
- id: "sonnet",
6665
- handle: "anthropic/claude-sonnet-5",
6666
- label: "Sonnet 5",
6667
- description: "Sonnet 5 (high reasoning)",
6668
- isFeatured: true,
6669
- updateArgs: {
6670
- context_window: 1e6,
6671
- max_output_tokens: 128000,
6672
- reasoning_effort: "high",
6673
- enable_reasoner: true,
6674
- parallel_tool_calls: true
6675
- }
6676
- },
6677
- {
6678
- id: "sonnet-5-no-reasoning",
6679
- handle: "anthropic/claude-sonnet-5",
6680
- label: "Sonnet 5",
6681
- description: "Sonnet 5 with no reasoning (faster)",
6682
- updateArgs: {
6683
- context_window: 1e6,
6684
- max_output_tokens: 128000,
6685
- reasoning_effort: "none",
6686
- enable_reasoner: false,
6687
- parallel_tool_calls: true
6688
- }
6689
- },
6690
- {
6691
- id: "sonnet-5-low",
6692
- handle: "anthropic/claude-sonnet-5",
6693
- label: "Sonnet 5",
6694
- description: "Sonnet 5 (low reasoning)",
6695
- updateArgs: {
6696
- context_window: 1e6,
6697
- max_output_tokens: 128000,
6698
- reasoning_effort: "low",
6699
- enable_reasoner: true,
6700
- max_reasoning_tokens: 4000,
6701
- parallel_tool_calls: true
6702
- }
6703
- },
6704
- {
6705
- id: "sonnet-5-medium",
6706
- handle: "anthropic/claude-sonnet-5",
6707
- label: "Sonnet 5",
6708
- description: "Sonnet 5 (med reasoning)",
6709
- updateArgs: {
6710
- context_window: 1e6,
6711
- max_output_tokens: 128000,
6712
- reasoning_effort: "medium",
6713
- enable_reasoner: true,
6714
- max_reasoning_tokens: 12000,
6715
- parallel_tool_calls: true
6716
- }
6717
- },
6718
- {
6719
- id: "sonnet-5-xhigh",
6720
- handle: "anthropic/claude-sonnet-5",
6721
- label: "Sonnet 5",
6722
- description: "Sonnet 5 (extra-high reasoning)",
6723
- updateArgs: {
6724
- context_window: 1e6,
6725
- max_output_tokens: 128000,
6726
- reasoning_effort: "xhigh",
6727
- enable_reasoner: true,
6728
- parallel_tool_calls: true
6729
- }
6730
- },
6731
- {
6732
- id: "sonnet-5-max",
6733
- handle: "anthropic/claude-sonnet-5",
6734
- label: "Sonnet 5",
6735
- description: "Sonnet 5 (max reasoning)",
6736
- updateArgs: {
6737
- context_window: 1e6,
6738
- max_output_tokens: 128000,
6739
- reasoning_effort: "max",
6740
- enable_reasoner: true,
6741
- parallel_tool_calls: true
6742
- }
6743
- },
6744
- {
6745
- id: "sonnet-4.6",
6746
- handle: "anthropic/claude-sonnet-4-6",
6747
- label: "Sonnet 4.6",
6748
- description: "Sonnet 4.6 (high reasoning)",
6749
- updateArgs: {
6750
- context_window: 200000,
6751
- max_output_tokens: 128000,
6752
- reasoning_effort: "high",
6753
- enable_reasoner: true,
6754
- parallel_tool_calls: true
6755
- }
6756
- },
6757
- {
6758
- id: "sonnet-4.6-no-reasoning",
6759
- handle: "anthropic/claude-sonnet-4-6",
6760
- label: "Sonnet 4.6",
6761
- description: "Sonnet 4.6 with no reasoning (faster)",
6762
- updateArgs: {
6763
- context_window: 200000,
6764
- max_output_tokens: 128000,
6765
- reasoning_effort: "none",
6766
- enable_reasoner: false,
6767
- parallel_tool_calls: true
6768
- }
6769
- },
6770
- {
6771
- id: "sonnet-4.6-low",
6772
- handle: "anthropic/claude-sonnet-4-6",
6773
- label: "Sonnet 4.6",
6774
- description: "Sonnet 4.6 (low reasoning)",
6775
- updateArgs: {
6776
- context_window: 200000,
6777
- max_output_tokens: 128000,
6778
- reasoning_effort: "low",
6779
- enable_reasoner: true,
6780
- max_reasoning_tokens: 4000,
6781
- parallel_tool_calls: true
6782
- }
6783
- },
6784
- {
6785
- id: "sonnet-4.6-medium",
6786
- handle: "anthropic/claude-sonnet-4-6",
6787
- label: "Sonnet 4.6",
6788
- description: "Sonnet 4.6 (med reasoning)",
6789
- updateArgs: {
6790
- context_window: 200000,
6791
- max_output_tokens: 128000,
6792
- reasoning_effort: "medium",
6793
- enable_reasoner: true,
6794
- max_reasoning_tokens: 12000,
6795
- parallel_tool_calls: true
6796
- }
6797
- },
6798
- {
6799
- id: "sonnet-4.6-xhigh",
6800
- handle: "anthropic/claude-sonnet-4-6",
6801
- label: "Sonnet 4.6",
6802
- description: "Sonnet 4.6 (max reasoning)",
6803
- updateArgs: {
6804
- context_window: 200000,
6805
- max_output_tokens: 128000,
6806
- reasoning_effort: "xhigh",
6807
- enable_reasoner: true,
6808
- parallel_tool_calls: true
6809
- }
6810
- },
6811
- {
6812
- id: "sonnet-1m",
6813
- handle: "anthropic/claude-sonnet-4-6",
6814
- label: "Sonnet 4.6 1M",
6815
- description: "Claude Sonnet 4.6 with 1M token context window (high reasoning)",
6816
- updateArgs: {
6817
- context_window: 9500000,
6818
- max_output_tokens: 128000,
6819
- reasoning_effort: "high",
6820
- enable_reasoner: true,
6821
- parallel_tool_calls: true
6822
- }
6823
- },
6824
- {
6825
- id: "sonnet-1m-no-reasoning",
6826
- handle: "anthropic/claude-sonnet-4-6",
6827
- label: "Sonnet 4.6 1M",
6828
- description: "Sonnet 4.6 1M with no reasoning (faster)",
6829
- updateArgs: {
6830
- context_window: 9500000,
6831
- max_output_tokens: 128000,
6832
- reasoning_effort: "none",
6833
- enable_reasoner: false,
6834
- parallel_tool_calls: true
6835
- }
6836
- },
6837
- {
6838
- id: "sonnet-1m-low",
6839
- handle: "anthropic/claude-sonnet-4-6",
6840
- label: "Sonnet 4.6 1M",
6841
- description: "Sonnet 4.6 1M (low reasoning)",
6842
- updateArgs: {
6843
- context_window: 9500000,
6844
- max_output_tokens: 128000,
6845
- reasoning_effort: "low",
6846
- enable_reasoner: true,
6847
- max_reasoning_tokens: 4000,
6848
- parallel_tool_calls: true
6849
- }
6850
- },
6851
- {
6852
- id: "sonnet-1m-medium",
6853
- handle: "anthropic/claude-sonnet-4-6",
6854
- label: "Sonnet 4.6 1M",
6855
- description: "Sonnet 4.6 1M (med reasoning)",
6856
- updateArgs: {
6857
- context_window: 9500000,
6858
- max_output_tokens: 128000,
6859
- reasoning_effort: "medium",
6860
- enable_reasoner: true,
6861
- max_reasoning_tokens: 12000,
6862
- parallel_tool_calls: true
6863
- }
6864
- },
6865
- {
6866
- id: "sonnet-1m-xhigh",
6867
- handle: "anthropic/claude-sonnet-4-6",
6868
- label: "Sonnet 4.6 1M",
6869
- description: "Sonnet 4.6 1M (max reasoning)",
6870
- updateArgs: {
6871
- context_window: 9500000,
6872
- max_output_tokens: 128000,
6873
- reasoning_effort: "xhigh",
6874
- enable_reasoner: true,
6875
- parallel_tool_calls: true
6876
- }
6877
- },
6878
- {
6879
- id: "opus-4.6-high",
6880
- handle: "anthropic/claude-opus-4-6",
6881
- label: "Opus 4.6",
6882
- description: "Opus 4.6 (high reasoning)",
6883
- updateArgs: {
6884
- context_window: 200000,
6885
- max_output_tokens: 128000,
6886
- reasoning_effort: "high",
6887
- enable_reasoner: true,
6888
- parallel_tool_calls: true
6889
- }
6890
- },
6891
- {
6892
- id: "opus-4.6-no-reasoning",
6893
- handle: "anthropic/claude-opus-4-6",
6894
- label: "Opus 4.6",
6895
- description: "Opus 4.6 with no reasoning (faster)",
6896
- updateArgs: {
6897
- context_window: 200000,
6898
- max_output_tokens: 128000,
6899
- reasoning_effort: "none",
6900
- enable_reasoner: false,
6901
- parallel_tool_calls: true
6902
- }
6903
- },
6904
- {
6905
- id: "opus-4.6-low",
6906
- handle: "anthropic/claude-opus-4-6",
6907
- label: "Opus 4.6",
6908
- description: "Opus 4.6 (low reasoning)",
6909
- updateArgs: {
6910
- context_window: 200000,
6911
- max_output_tokens: 128000,
6912
- reasoning_effort: "low",
6913
- enable_reasoner: true,
6914
- max_reasoning_tokens: 4000,
6915
- parallel_tool_calls: true
6916
- }
6917
- },
6918
- {
6919
- id: "opus-4.6-medium",
6920
- handle: "anthropic/claude-opus-4-6",
6921
- label: "Opus 4.6",
6922
- description: "Opus 4.6 (med reasoning)",
6923
- updateArgs: {
6924
- context_window: 200000,
6925
- max_output_tokens: 128000,
6926
- reasoning_effort: "medium",
6927
- enable_reasoner: true,
6928
- max_reasoning_tokens: 12000,
6929
- parallel_tool_calls: true
6930
- }
6931
- },
6932
- {
6933
- id: "opus-4.6-xhigh",
6934
- handle: "anthropic/claude-opus-4-6",
6935
- label: "Opus 4.6",
6936
- description: "Opus 4.6 (max reasoning)",
6937
- updateArgs: {
6938
- context_window: 200000,
6939
- max_output_tokens: 128000,
6940
- reasoning_effort: "xhigh",
6941
- enable_reasoner: true,
6942
- parallel_tool_calls: true
6943
- }
6944
- },
6945
- {
6946
- id: "opus-4.7-medium",
6947
- handle: "anthropic/claude-opus-4-7",
6948
- label: "Opus 4.7",
6949
- description: "Opus 4.7 (med reasoning)",
6950
- updateArgs: {
6951
- context_window: 200000,
6952
- max_output_tokens: 128000,
6953
- reasoning_effort: "medium",
6954
- enable_reasoner: true,
6955
- max_reasoning_tokens: 12000,
6956
- parallel_tool_calls: true
6957
- }
6958
- },
6959
- {
6960
- id: "opus-4.7-low",
6961
- handle: "anthropic/claude-opus-4-7",
6962
- label: "Opus 4.7",
6963
- description: "Opus 4.7 (low reasoning)",
6964
- updateArgs: {
6965
- context_window: 200000,
6966
- max_output_tokens: 128000,
6967
- reasoning_effort: "low",
6968
- enable_reasoner: true,
6969
- max_reasoning_tokens: 4000,
6970
- parallel_tool_calls: true
6971
- }
6972
- },
6973
- {
6974
- id: "opus-4.7-high",
6975
- handle: "anthropic/claude-opus-4-7",
6976
- label: "Opus 4.7",
6977
- description: "Opus 4.7 (high reasoning)",
6978
- updateArgs: {
6979
- context_window: 200000,
6980
- max_output_tokens: 128000,
6981
- reasoning_effort: "high",
6982
- enable_reasoner: true,
6983
- parallel_tool_calls: true
6984
- }
6985
- },
6986
- {
6987
- id: "opus-4.7-xhigh",
6988
- handle: "anthropic/claude-opus-4-7",
6989
- label: "Opus 4.7",
6990
- description: "Opus 4.7 (extra-high reasoning)",
6991
- updateArgs: {
6992
- context_window: 200000,
6993
- max_output_tokens: 128000,
6994
- reasoning_effort: "xhigh",
6995
- enable_reasoner: true,
6996
- parallel_tool_calls: true
6997
- }
6998
- },
6999
- {
7000
- id: "opus-4.7-max",
7001
- handle: "anthropic/claude-opus-4-7",
7002
- label: "Opus 4.7",
7003
- description: "Opus 4.7 (max reasoning)",
7004
- updateArgs: {
7005
- context_window: 200000,
7006
- max_output_tokens: 128000,
7007
- reasoning_effort: "max",
7008
- enable_reasoner: true,
7009
- parallel_tool_calls: true
7010
- }
7011
- },
7012
- {
7013
- id: "opus-4.5",
7014
- handle: "anthropic/claude-opus-4-5-20251101",
7015
- label: "Opus 4.5",
7016
- description: "Opus 4.5 (high reasoning)",
7017
- updateArgs: {
7018
- context_window: 180000,
7019
- max_output_tokens: 64000,
7020
- reasoning_effort: "high",
7021
- enable_reasoner: true,
7022
- max_reasoning_tokens: 31999,
7023
- parallel_tool_calls: true
7024
- }
7025
- },
7026
- {
7027
- id: "opus-4.5-no-reasoning",
7028
- handle: "anthropic/claude-opus-4-5-20251101",
7029
- label: "Opus 4.5",
7030
- description: "Opus 4.5 with no reasoning (faster)",
7031
- updateArgs: {
7032
- context_window: 180000,
7033
- max_output_tokens: 64000,
7034
- reasoning_effort: "none",
7035
- enable_reasoner: false,
7036
- parallel_tool_calls: true
7037
- }
7038
- },
7039
- {
7040
- id: "opus-4.5-low",
7041
- handle: "anthropic/claude-opus-4-5-20251101",
7042
- label: "Opus 4.5",
7043
- description: "Opus 4.5 (low reasoning)",
7044
- updateArgs: {
7045
- context_window: 180000,
7046
- max_output_tokens: 64000,
7047
- reasoning_effort: "low",
7048
- enable_reasoner: true,
7049
- max_reasoning_tokens: 4000,
7050
- parallel_tool_calls: true
7051
- }
7052
- },
7053
- {
7054
- id: "opus-4.5-medium",
7055
- handle: "anthropic/claude-opus-4-5-20251101",
7056
- label: "Opus 4.5",
7057
- description: "Opus 4.5 (med reasoning)",
7058
- updateArgs: {
7059
- context_window: 180000,
7060
- max_output_tokens: 64000,
7061
- reasoning_effort: "medium",
7062
- enable_reasoner: true,
7063
- max_reasoning_tokens: 12000,
7064
- parallel_tool_calls: true
7065
- }
7066
- },
7067
- {
7068
- id: "bedrock-opus-4.5",
7069
- handle: "bedrock/us.anthropic.claude-opus-4-5-20251101-v1:0",
7070
- label: "Bedrock Opus 4.5",
7071
- shortLabel: "Opus 4.5 BR",
7072
- description: "Opus 4.5 via AWS Bedrock",
7073
- updateArgs: {
7074
- context_window: 180000,
7075
- max_output_tokens: 64000,
7076
- max_reasoning_tokens: 31999,
7077
- parallel_tool_calls: true
7078
- }
7079
- },
7080
- {
7081
- id: "haiku",
7082
- handle: "anthropic/claude-haiku-4-5",
7083
- label: "Haiku 4.5",
7084
- description: "Haiku 4.5",
7085
- updateArgs: {
7086
- context_window: 180000,
7087
- max_output_tokens: 64000,
7088
- parallel_tool_calls: true
7089
- }
7090
- },
7091
- {
7092
- id: "gpt-5.5-plus-pro-none",
7093
- handle: "chatgpt-plus-pro/gpt-5.5",
7094
- label: "GPT-5.5 (ChatGPT)",
7095
- description: "GPT-5.5 (no reasoning) via ChatGPT Plus/Pro",
7096
- updateArgs: {
7097
- reasoning_effort: "none",
7098
- verbosity: "low",
7099
- context_window: 272000,
7100
- max_output_tokens: 128000,
7101
- parallel_tool_calls: true
7102
- }
7103
- },
7104
- {
7105
- id: "gpt-5.5-plus-pro-low",
7106
- handle: "chatgpt-plus-pro/gpt-5.5",
7107
- label: "GPT-5.5 (ChatGPT)",
7108
- description: "GPT-5.5 (low reasoning) via ChatGPT Plus/Pro",
7109
- updateArgs: {
7110
- reasoning_effort: "low",
7111
- verbosity: "low",
7112
- context_window: 272000,
7113
- max_output_tokens: 128000,
7114
- parallel_tool_calls: true
7115
- }
7116
- },
7117
- {
7118
- id: "gpt-5.5-plus-pro-medium",
7119
- handle: "chatgpt-plus-pro/gpt-5.5",
7120
- label: "GPT-5.5 (ChatGPT)",
7121
- description: "GPT-5.5 (med reasoning) via ChatGPT Plus/Pro",
7122
- updateArgs: {
7123
- reasoning_effort: "medium",
7124
- verbosity: "low",
7125
- context_window: 272000,
7126
- max_output_tokens: 128000,
7127
- parallel_tool_calls: true
7128
- }
7129
- },
7130
- {
7131
- id: "gpt-5.5-plus-pro-high",
7132
- handle: "chatgpt-plus-pro/gpt-5.5",
7133
- label: "GPT-5.5 (ChatGPT)",
7134
- description: "OpenAI's most capable model (high reasoning) via ChatGPT Plus/Pro",
7135
- updateArgs: {
7136
- reasoning_effort: "high",
7137
- verbosity: "low",
7138
- context_window: 272000,
7139
- max_output_tokens: 128000,
7140
- parallel_tool_calls: true
7141
- }
7142
- },
7143
- {
7144
- id: "gpt-5.5-plus-pro-xhigh",
7145
- handle: "chatgpt-plus-pro/gpt-5.5",
7146
- label: "GPT-5.5 (ChatGPT)",
7147
- description: "GPT-5.5 (max reasoning) via ChatGPT Plus/Pro",
7148
- updateArgs: {
7149
- reasoning_effort: "xhigh",
7150
- verbosity: "low",
7151
- context_window: 272000,
7152
- max_output_tokens: 128000,
7153
- parallel_tool_calls: true
7154
- }
7155
- },
7156
- {
7157
- id: "gpt-5.5-fast-plus-pro-none",
7158
- handle: "chatgpt-plus-pro/gpt-5.5-fast",
7159
- label: "GPT-5.5 Fast (ChatGPT)",
7160
- description: "GPT-5.5 Fast (no reasoning) via ChatGPT Plus/Pro",
7161
- updateArgs: {
7162
- reasoning_effort: "none",
7163
- verbosity: "low",
7164
- context_window: 272000,
7165
- max_output_tokens: 128000,
7166
- parallel_tool_calls: true
7167
- }
7168
- },
7169
- {
7170
- id: "gpt-5.5-fast-plus-pro-low",
7171
- handle: "chatgpt-plus-pro/gpt-5.5-fast",
7172
- label: "GPT-5.5 Fast (ChatGPT)",
7173
- description: "GPT-5.5 Fast (low reasoning) via ChatGPT Plus/Pro",
7174
- updateArgs: {
7175
- reasoning_effort: "low",
7176
- verbosity: "low",
7177
- context_window: 272000,
7178
- max_output_tokens: 128000,
7179
- parallel_tool_calls: true
7180
- }
7181
- },
7182
- {
7183
- id: "gpt-5.5-fast-plus-pro-medium",
7184
- handle: "chatgpt-plus-pro/gpt-5.5-fast",
7185
- label: "GPT-5.5 Fast (ChatGPT)",
7186
- description: "GPT-5.5 Fast (med reasoning) via ChatGPT Plus/Pro",
7187
- updateArgs: {
7188
- reasoning_effort: "medium",
7189
- verbosity: "low",
7190
- context_window: 272000,
7191
- max_output_tokens: 128000,
7192
- parallel_tool_calls: true
7193
- }
7194
- },
7195
- {
7196
- id: "gpt-5.5-fast-plus-pro-high",
7197
- handle: "chatgpt-plus-pro/gpt-5.5-fast",
7198
- label: "GPT-5.5 Fast (ChatGPT)",
7199
- description: "GPT-5.5 Fast (high reasoning) via ChatGPT Plus/Pro",
7200
- updateArgs: {
7201
- reasoning_effort: "high",
7202
- verbosity: "low",
7203
- context_window: 272000,
7204
- max_output_tokens: 128000,
7205
- parallel_tool_calls: true
7206
- }
7207
- },
7208
- {
7209
- id: "gpt-5.5-fast-plus-pro-xhigh",
7210
- handle: "chatgpt-plus-pro/gpt-5.5-fast",
7211
- label: "GPT-5.5 Fast (ChatGPT)",
7212
- description: "GPT-5.5 Fast (max reasoning) via ChatGPT Plus/Pro",
7213
- updateArgs: {
7214
- reasoning_effort: "xhigh",
7215
- verbosity: "low",
7216
- context_window: 272000,
7217
- max_output_tokens: 128000,
7218
- parallel_tool_calls: true
7219
- }
7220
- },
7221
- {
7222
- id: "gpt-5.4-plus-pro-none",
7223
- handle: "chatgpt-plus-pro/gpt-5.4",
7224
- label: "GPT-5.4 (ChatGPT)",
7225
- description: "GPT-5.4 (no reasoning) via ChatGPT Plus/Pro",
7226
- updateArgs: {
7227
- reasoning_effort: "none",
7228
- verbosity: "low",
7229
- context_window: 272000,
7230
- max_output_tokens: 128000,
7231
- parallel_tool_calls: true
7232
- }
7233
- },
7234
- {
7235
- id: "gpt-5.4-plus-pro-low",
7236
- handle: "chatgpt-plus-pro/gpt-5.4",
7237
- label: "GPT-5.4 (ChatGPT)",
7238
- description: "GPT-5.4 (low reasoning) via ChatGPT Plus/Pro",
7239
- updateArgs: {
7240
- reasoning_effort: "low",
7241
- verbosity: "low",
7242
- context_window: 272000,
7243
- max_output_tokens: 128000,
7244
- parallel_tool_calls: true
7245
- }
7246
- },
7247
- {
7248
- id: "gpt-5.4-plus-pro-medium",
7249
- handle: "chatgpt-plus-pro/gpt-5.4",
7250
- label: "GPT-5.4 (ChatGPT)",
7251
- description: "GPT-5.4 (med reasoning) via ChatGPT Plus/Pro",
7252
- updateArgs: {
7253
- reasoning_effort: "medium",
7254
- verbosity: "low",
7255
- context_window: 272000,
7256
- max_output_tokens: 128000,
7257
- parallel_tool_calls: true
7258
- }
7259
- },
7260
- {
7261
- id: "gpt-5.4-plus-pro-high",
7262
- handle: "chatgpt-plus-pro/gpt-5.4",
7263
- label: "GPT-5.4 (ChatGPT)",
7264
- description: "OpenAI's most capable model (high reasoning) via ChatGPT Plus/Pro",
7265
- updateArgs: {
7266
- reasoning_effort: "high",
7267
- verbosity: "low",
7268
- context_window: 272000,
7269
- max_output_tokens: 128000,
7270
- parallel_tool_calls: true
7271
- }
7272
- },
7273
- {
7274
- id: "gpt-5.4-plus-pro-xhigh",
7275
- handle: "chatgpt-plus-pro/gpt-5.4",
7276
- label: "GPT-5.4 (ChatGPT)",
7277
- description: "GPT-5.4 (max reasoning) via ChatGPT Plus/Pro",
7278
- updateArgs: {
7279
- reasoning_effort: "xhigh",
7280
- verbosity: "low",
7281
- context_window: 272000,
7282
- max_output_tokens: 128000,
7283
- parallel_tool_calls: true
7284
- }
7285
- },
7286
- {
7287
- id: "gpt-5.4-pro-plus-pro-medium",
7288
- handle: "chatgpt-plus-pro/gpt-5.4-pro",
7289
- label: "GPT-5.4 Pro (ChatGPT)",
7290
- description: "GPT-5.4 Pro (med reasoning) via ChatGPT Plus/Pro",
7291
- updateArgs: {
7292
- reasoning_effort: "medium",
7293
- verbosity: "low",
7294
- context_window: 272000,
7295
- max_output_tokens: 128000,
7296
- parallel_tool_calls: true
7297
- }
7298
- },
7299
- {
7300
- id: "gpt-5.4-pro-plus-pro-high",
7301
- handle: "chatgpt-plus-pro/gpt-5.4-pro",
7302
- label: "GPT-5.4 Pro (ChatGPT)",
7303
- description: "GPT-5.4 Pro (high reasoning) via ChatGPT Plus/Pro",
7304
- updateArgs: {
7305
- reasoning_effort: "high",
7306
- verbosity: "low",
7307
- context_window: 272000,
7308
- max_output_tokens: 128000,
7309
- parallel_tool_calls: true
7310
- }
7311
- },
7312
- {
7313
- id: "gpt-5.4-pro-plus-pro-xhigh",
7314
- handle: "chatgpt-plus-pro/gpt-5.4-pro",
7315
- label: "GPT-5.4 Pro (ChatGPT)",
7316
- description: "GPT-5.4 Pro (max reasoning) via ChatGPT Plus/Pro",
7317
- updateArgs: {
7318
- reasoning_effort: "xhigh",
7319
- verbosity: "low",
7320
- context_window: 272000,
7321
- max_output_tokens: 128000,
7322
- parallel_tool_calls: true
7323
- }
7324
- },
7325
- {
7326
- id: "gpt-5.4-fast-plus-pro-none",
7327
- handle: "chatgpt-plus-pro/gpt-5.4-fast",
7328
- label: "GPT-5.4 Fast (ChatGPT)",
7329
- description: "GPT-5.4 Fast (no reasoning) via ChatGPT Plus/Pro",
7330
- updateArgs: {
7331
- reasoning_effort: "none",
7332
- verbosity: "low",
7333
- context_window: 272000,
7334
- max_output_tokens: 128000,
7335
- parallel_tool_calls: true
7336
- }
7337
- },
7338
- {
7339
- id: "gpt-5.4-fast-plus-pro-low",
7340
- handle: "chatgpt-plus-pro/gpt-5.4-fast",
7341
- label: "GPT-5.4 Fast (ChatGPT)",
7342
- description: "GPT-5.4 Fast (low reasoning) via ChatGPT Plus/Pro",
7343
- updateArgs: {
7344
- reasoning_effort: "low",
7345
- verbosity: "low",
7346
- context_window: 272000,
7347
- max_output_tokens: 128000,
7348
- parallel_tool_calls: true
7349
- }
7350
- },
7351
- {
7352
- id: "gpt-5.4-fast-plus-pro-medium",
7353
- handle: "chatgpt-plus-pro/gpt-5.4-fast",
7354
- label: "GPT-5.4 Fast (ChatGPT)",
7355
- description: "GPT-5.4 Fast (med reasoning) via ChatGPT Plus/Pro",
7356
- updateArgs: {
7357
- reasoning_effort: "medium",
7358
- verbosity: "low",
7359
- context_window: 272000,
7360
- max_output_tokens: 128000,
7361
- parallel_tool_calls: true
7362
- }
7363
- },
7364
- {
7365
- id: "gpt-5.4-fast-plus-pro-high",
7366
- handle: "chatgpt-plus-pro/gpt-5.4-fast",
7367
- label: "GPT-5.4 Fast (ChatGPT)",
7368
- description: "GPT-5.4 Fast (high reasoning) via ChatGPT Plus/Pro",
7369
- updateArgs: {
7370
- reasoning_effort: "high",
7371
- verbosity: "low",
7372
- context_window: 272000,
7373
- max_output_tokens: 128000,
7374
- parallel_tool_calls: true
7375
- }
7376
- },
7377
- {
7378
- id: "gpt-5.4-fast-plus-pro-xhigh",
7379
- handle: "chatgpt-plus-pro/gpt-5.4-fast",
7380
- label: "GPT-5.4 Fast (ChatGPT)",
7381
- description: "GPT-5.4 Fast (max reasoning) via ChatGPT Plus/Pro",
7382
- updateArgs: {
7383
- reasoning_effort: "xhigh",
7384
- verbosity: "low",
7385
- context_window: 272000,
7386
- max_output_tokens: 128000,
7387
- parallel_tool_calls: true
7388
- }
7389
- },
7390
- {
7391
- id: "gpt-5.4-mini-plus-pro-none",
7392
- handle: "chatgpt-plus-pro/gpt-5.4-mini",
7393
- label: "GPT-5.4 Mini (ChatGPT)",
7394
- description: "GPT-5.4 Mini (no reasoning) via ChatGPT Plus/Pro",
7395
- updateArgs: {
7396
- reasoning_effort: "none",
7397
- verbosity: "low",
7398
- context_window: 272000,
7399
- max_output_tokens: 128000,
7400
- parallel_tool_calls: true
7401
- }
7402
- },
7403
- {
7404
- id: "gpt-5.4-mini-plus-pro-low",
7405
- handle: "chatgpt-plus-pro/gpt-5.4-mini",
7406
- label: "GPT-5.4 Mini (ChatGPT)",
7407
- description: "GPT-5.4 Mini (low reasoning) via ChatGPT Plus/Pro",
7408
- updateArgs: {
7409
- reasoning_effort: "low",
7410
- verbosity: "low",
7411
- context_window: 272000,
7412
- max_output_tokens: 128000,
7413
- parallel_tool_calls: true
7414
- }
7415
- },
7416
- {
7417
- id: "gpt-5.4-mini-plus-pro-medium",
7418
- handle: "chatgpt-plus-pro/gpt-5.4-mini",
7419
- label: "GPT-5.4 Mini (ChatGPT)",
7420
- description: "GPT-5.4 Mini (med reasoning) via ChatGPT Plus/Pro",
7421
- updateArgs: {
7422
- reasoning_effort: "medium",
7423
- verbosity: "low",
7424
- context_window: 272000,
7425
- max_output_tokens: 128000,
7426
- parallel_tool_calls: true
7427
- }
7428
- },
7429
- {
7430
- id: "gpt-5.4-mini-plus-pro-high",
7431
- handle: "chatgpt-plus-pro/gpt-5.4-mini",
7432
- label: "GPT-5.4 Mini (ChatGPT)",
7433
- description: "GPT-5.4 Mini (high reasoning) via ChatGPT Plus/Pro",
7434
- updateArgs: {
7435
- reasoning_effort: "high",
7436
- verbosity: "low",
7437
- context_window: 272000,
7438
- max_output_tokens: 128000,
7439
- parallel_tool_calls: true
7440
- }
7441
- },
7442
- {
7443
- id: "gpt-5.4-mini-plus-pro-xhigh",
7444
- handle: "chatgpt-plus-pro/gpt-5.4-mini",
7445
- label: "GPT-5.4 Mini (ChatGPT)",
7446
- description: "GPT-5.4 Mini (max reasoning) via ChatGPT Plus/Pro",
7447
- updateArgs: {
7448
- reasoning_effort: "xhigh",
7449
- verbosity: "low",
7450
- context_window: 272000,
7451
- max_output_tokens: 128000,
7452
- parallel_tool_calls: true
7453
- }
7454
- },
7455
- {
7456
- id: "gpt-5.3-codex-spark-plus-pro-none",
7457
- handle: "chatgpt-plus-pro/gpt-5.3-codex-spark",
7458
- label: "GPT-5.3 Codex Spark (ChatGPT)",
7459
- description: "GPT-5.3 Codex Spark (no reasoning) via ChatGPT Plus/Pro",
7460
- updateArgs: {
7461
- reasoning_effort: "none",
7462
- verbosity: "low",
7463
- context_window: 128000,
7464
- max_output_tokens: 128000,
7465
- parallel_tool_calls: true
7466
- }
7467
- },
7468
- {
7469
- id: "gpt-5.3-codex-spark-plus-pro-low",
7470
- handle: "chatgpt-plus-pro/gpt-5.3-codex-spark",
7471
- label: "GPT-5.3 Codex Spark (ChatGPT)",
7472
- description: "GPT-5.3 Codex Spark (low reasoning) via ChatGPT Plus/Pro",
7473
- updateArgs: {
7474
- reasoning_effort: "low",
7475
- verbosity: "low",
7476
- context_window: 128000,
7477
- max_output_tokens: 128000,
7478
- parallel_tool_calls: true
7479
- }
7480
- },
7481
- {
7482
- id: "gpt-5.3-codex-spark-plus-pro-medium",
7483
- handle: "chatgpt-plus-pro/gpt-5.3-codex-spark",
7484
- label: "GPT-5.3 Codex Spark (ChatGPT)",
7485
- description: "GPT-5.3 Codex Spark (med reasoning) via ChatGPT Plus/Pro",
7486
- updateArgs: {
7487
- reasoning_effort: "medium",
7488
- verbosity: "low",
7489
- context_window: 128000,
7490
- max_output_tokens: 128000,
7491
- parallel_tool_calls: true
7492
- }
7493
- },
7494
- {
7495
- id: "gpt-5.3-codex-spark-plus-pro-high",
7496
- handle: "chatgpt-plus-pro/gpt-5.3-codex-spark",
7497
- label: "GPT-5.3 Codex Spark (ChatGPT)",
7498
- description: "GPT-5.3 Codex Spark (high reasoning) via ChatGPT Plus/Pro",
7499
- updateArgs: {
7500
- reasoning_effort: "high",
7501
- verbosity: "low",
7502
- context_window: 128000,
7503
- max_output_tokens: 128000,
7504
- parallel_tool_calls: true
7505
- }
7506
- },
7507
- {
7508
- id: "gpt-5.3-codex-spark-plus-pro-xhigh",
7509
- handle: "chatgpt-plus-pro/gpt-5.3-codex-spark",
7510
- label: "GPT-5.3 Codex Spark (ChatGPT)",
7511
- description: "GPT-5.3 Codex Spark (max reasoning) via ChatGPT Plus/Pro",
7512
- updateArgs: {
7513
- reasoning_effort: "xhigh",
7514
- verbosity: "low",
7515
- context_window: 128000,
7516
- max_output_tokens: 128000,
7517
- parallel_tool_calls: true
7518
- }
7519
- },
7520
- {
7521
- id: "gpt-5.5-none",
7522
- handle: "openai/gpt-5.5",
7523
- label: "GPT-5.5",
7524
- description: "OpenAI's most capable model (no reasoning)",
7525
- updateArgs: {
7526
- reasoning_effort: "none",
7527
- verbosity: "medium",
7528
- context_window: 272000,
7529
- max_output_tokens: 128000,
7530
- parallel_tool_calls: true
7531
- }
7532
- },
7533
- {
7534
- id: "gpt-5.5-low",
7535
- handle: "openai/gpt-5.5",
7536
- label: "GPT-5.5",
7537
- description: "OpenAI's most capable model (low reasoning)",
7538
- updateArgs: {
7539
- reasoning_effort: "low",
7540
- verbosity: "medium",
7541
- context_window: 272000,
7542
- max_output_tokens: 128000,
7543
- parallel_tool_calls: true
7544
- }
7545
- },
7546
- {
7547
- id: "gpt-5.5-medium",
7548
- handle: "openai/gpt-5.5",
7549
- label: "GPT-5.5",
7550
- description: "OpenAI's most capable model (med reasoning)",
7551
- updateArgs: {
7552
- reasoning_effort: "medium",
7553
- verbosity: "medium",
7554
- context_window: 272000,
7555
- max_output_tokens: 128000,
7556
- parallel_tool_calls: true
7557
- }
7558
- },
7559
- {
7560
- id: "gpt-5.5-high",
7561
- handle: "openai/gpt-5.5",
7562
- label: "GPT-5.5",
7563
- description: "OpenAI's most capable model (high reasoning)",
7564
- updateArgs: {
7565
- reasoning_effort: "high",
7566
- verbosity: "medium",
7567
- context_window: 272000,
7568
- max_output_tokens: 128000,
7569
- parallel_tool_calls: true
7570
- }
7571
- },
7572
- {
7573
- id: "gpt-5.5-xhigh",
7574
- handle: "openai/gpt-5.5",
7575
- label: "GPT-5.5",
7576
- description: "OpenAI's most capable model (max reasoning)",
7577
- updateArgs: {
7578
- reasoning_effort: "xhigh",
7579
- verbosity: "medium",
7580
- context_window: 272000,
7581
- max_output_tokens: 128000,
7582
- parallel_tool_calls: true
7583
- }
7584
- },
7585
- {
7586
- id: "gpt-5.4-none",
7587
- handle: "openai/gpt-5.4",
7588
- label: "GPT-5.4",
7589
- description: "OpenAI's most capable model (no reasoning)",
7590
- updateArgs: {
7591
- reasoning_effort: "none",
7592
- verbosity: "medium",
7593
- context_window: 272000,
7594
- max_output_tokens: 128000,
7595
- parallel_tool_calls: true
7596
- }
7597
- },
7598
- {
7599
- id: "gpt-5.4-low",
7600
- handle: "openai/gpt-5.4",
7601
- label: "GPT-5.4",
7602
- description: "OpenAI's most capable model (low reasoning)",
7603
- updateArgs: {
7604
- reasoning_effort: "low",
7605
- verbosity: "medium",
7606
- context_window: 272000,
7607
- max_output_tokens: 128000,
7608
- parallel_tool_calls: true
7609
- }
7610
- },
7611
- {
7612
- id: "gpt-5.4-medium",
7613
- handle: "openai/gpt-5.4",
7614
- label: "GPT-5.4",
7615
- description: "OpenAI's most capable model (med reasoning)",
7616
- updateArgs: {
7617
- reasoning_effort: "medium",
7618
- verbosity: "medium",
7619
- context_window: 272000,
7620
- max_output_tokens: 128000,
7621
- parallel_tool_calls: true
7622
- }
7623
- },
7624
- {
7625
- id: "gpt-5.4-high",
7626
- handle: "openai/gpt-5.4",
7627
- label: "GPT-5.4",
7628
- description: "OpenAI's most capable model (high reasoning)",
7629
- updateArgs: {
7630
- reasoning_effort: "high",
7631
- verbosity: "medium",
7632
- context_window: 272000,
7633
- max_output_tokens: 128000,
7634
- parallel_tool_calls: true
7635
- }
7636
- },
7637
- {
7638
- id: "gpt-5.4-xhigh",
7639
- handle: "openai/gpt-5.4",
7640
- label: "GPT-5.4",
7641
- description: "OpenAI's most capable model (max reasoning)",
7642
- updateArgs: {
7643
- reasoning_effort: "xhigh",
7644
- verbosity: "medium",
7645
- context_window: 272000,
7646
- max_output_tokens: 128000,
7647
- parallel_tool_calls: true
7648
- }
7649
- },
7650
- {
7651
- id: "gpt-5.4-fast-none",
7652
- handle: "openai/gpt-5.4-fast",
7653
- label: "GPT-5.4 Fast",
7654
- description: "GPT-5.4 with priority service tier (no reasoning)",
7655
- updateArgs: {
7656
- reasoning_effort: "none",
7657
- verbosity: "medium",
7658
- context_window: 272000,
7659
- max_output_tokens: 128000,
7660
- parallel_tool_calls: true
7661
- }
7662
- },
7663
- {
7664
- id: "gpt-5.4-fast-low",
7665
- handle: "openai/gpt-5.4-fast",
7666
- label: "GPT-5.4 Fast",
7667
- description: "GPT-5.4 with priority service tier (low reasoning)",
7668
- updateArgs: {
7669
- reasoning_effort: "low",
7670
- verbosity: "medium",
7671
- context_window: 272000,
7672
- max_output_tokens: 128000,
7673
- parallel_tool_calls: true
7674
- }
7675
- },
7676
- {
7677
- id: "gpt-5.4-fast-medium",
7678
- handle: "openai/gpt-5.4-fast",
7679
- label: "GPT-5.4 Fast",
7680
- description: "GPT-5.4 with priority service tier (med reasoning)",
7681
- updateArgs: {
7682
- reasoning_effort: "medium",
7683
- verbosity: "medium",
7684
- context_window: 272000,
7685
- max_output_tokens: 128000,
7686
- parallel_tool_calls: true
7687
- }
7688
- },
7689
- {
7690
- id: "gpt-5.4-fast-high",
7691
- handle: "openai/gpt-5.4-fast",
7692
- label: "GPT-5.4 Fast",
7693
- description: "GPT-5.4 with priority service tier (high reasoning)",
7694
- updateArgs: {
7695
- reasoning_effort: "high",
7696
- verbosity: "medium",
7697
- context_window: 272000,
7698
- max_output_tokens: 128000,
7699
- parallel_tool_calls: true
7700
- }
7701
- },
7702
- {
7703
- id: "gpt-5.4-fast-xhigh",
7704
- handle: "openai/gpt-5.4-fast",
7705
- label: "GPT-5.4 Fast",
7706
- description: "GPT-5.4 with priority service tier (max reasoning)",
7707
- updateArgs: {
7708
- reasoning_effort: "xhigh",
7709
- verbosity: "medium",
7710
- context_window: 272000,
7711
- max_output_tokens: 128000,
7712
- parallel_tool_calls: true
7713
- }
7714
- },
7715
- {
7716
- id: "gpt-5.4-mini-none",
7717
- handle: "openai/gpt-5.4-mini",
7718
- label: "GPT-5.4 Mini",
7719
- description: "Fast, efficient GPT-5.4 variant (no reasoning)",
7720
- updateArgs: {
7721
- reasoning_effort: "none",
7722
- verbosity: "low",
7723
- context_window: 272000,
7724
- max_output_tokens: 128000,
7725
- parallel_tool_calls: true
7726
- }
7727
- },
7728
- {
7729
- id: "gpt-5.4-mini-low",
7730
- handle: "openai/gpt-5.4-mini",
7731
- label: "GPT-5.4 Mini",
7732
- description: "Fast, efficient GPT-5.4 variant (low reasoning)",
7733
- updateArgs: {
7734
- reasoning_effort: "low",
7735
- verbosity: "low",
7736
- context_window: 272000,
7737
- max_output_tokens: 128000,
7738
- parallel_tool_calls: true
7739
- }
7740
- },
7741
- {
7742
- id: "gpt-5.4-mini-medium",
7743
- handle: "openai/gpt-5.4-mini",
7744
- label: "GPT-5.4 Mini",
7745
- description: "Fast, efficient GPT-5.4 variant (med reasoning)",
7746
- updateArgs: {
7747
- reasoning_effort: "medium",
7748
- verbosity: "low",
7749
- context_window: 272000,
7750
- max_output_tokens: 128000,
7751
- parallel_tool_calls: true
7752
- }
7753
- },
7754
- {
7755
- id: "gpt-5.4-mini-high",
7756
- handle: "openai/gpt-5.4-mini",
7757
- label: "GPT-5.4 Mini",
7758
- description: "Fast, efficient GPT-5.4 variant (high reasoning)",
7759
- updateArgs: {
7760
- reasoning_effort: "high",
7761
- verbosity: "low",
7762
- context_window: 272000,
7763
- max_output_tokens: 128000,
7764
- parallel_tool_calls: true
5675
+ isDefault: true,
5676
+ isFeatured: true
5677
+ },
5678
+ {
5679
+ id: "letta",
5680
+ label: "Letta Code",
5681
+ description: "Full Letta Code system prompt",
5682
+ content: letta_no_memfs_default,
5683
+ memfsContent: letta_default,
5684
+ rootMemfsContent: letta_root_memfs_default,
5685
+ localMemfsContent: letta_local_memfs_default,
5686
+ isFeatured: true
5687
+ },
5688
+ {
5689
+ id: "source-claude",
5690
+ label: "Claude Code",
5691
+ description: "Source-faithful Claude Code prompt (for benchmarking)",
5692
+ content: source_claude_default
5693
+ },
5694
+ {
5695
+ id: "source-codex",
5696
+ label: "Codex",
5697
+ description: "Source-faithful OpenAI Codex prompt (for benchmarking)",
5698
+ content: source_codex_default
5699
+ },
5700
+ {
5701
+ id: "source-gemini",
5702
+ label: "Gemini CLI",
5703
+ description: "Source-faithful Gemini CLI prompt (for benchmarking)",
5704
+ content: source_gemini_default
5705
+ }
5706
+ ];
5707
+ function buildSystemPrompt(presetId, memoryMode) {
5708
+ const preset = SYSTEM_PROMPTS.find((p) => p.id === presetId);
5709
+ if (!preset) {
5710
+ throw new Error(`Unknown preset "${presetId}" — cannot rebuild system prompt`);
5711
+ }
5712
+ if (memoryMode === "local-memfs") {
5713
+ return (preset.localMemfsContent ?? preset.memfsContent ?? preset.content).trim();
5714
+ }
5715
+ if (memoryMode === "root-memfs") {
5716
+ return (preset.rootMemfsContent ?? preset.memfsContent ?? preset.content).trim();
5717
+ }
5718
+ if (memoryMode === "memfs") {
5719
+ return (preset.memfsContent ?? preset.content).trim();
5720
+ }
5721
+ return preset.content.trim();
5722
+ }
5723
+ var MEMORY_BLOCK_LABELS = ["persona", "human"];
5724
+ function parseMdxFrontmatter(content) {
5725
+ const frontmatterRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/;
5726
+ const match = content.match(frontmatterRegex);
5727
+ if (!match || !match[1] || !match[2]) {
5728
+ return { frontmatter: {}, body: content };
5729
+ }
5730
+ const frontmatterText = match[1];
5731
+ const body = match[2];
5732
+ const frontmatter = {};
5733
+ for (const line of frontmatterText.split(`
5734
+ `)) {
5735
+ const colonIndex = line.indexOf(":");
5736
+ if (colonIndex > 0) {
5737
+ const key = line.slice(0, colonIndex).trim();
5738
+ const value = line.slice(colonIndex + 1).trim();
5739
+ frontmatter[key] = value;
5740
+ }
5741
+ }
5742
+ return { frontmatter, body: body.trim() };
5743
+ }
5744
+ async function loadMemoryBlocksFromMdx() {
5745
+ const memoryBlocks = [];
5746
+ const mdxFiles = MEMORY_BLOCK_LABELS.map((label) => `${label}.mdx`);
5747
+ for (const filename of mdxFiles) {
5748
+ try {
5749
+ const content = MEMORY_PROMPTS[filename];
5750
+ if (!content) {
5751
+ console.warn(`Missing embedded prompt file: ${filename}`);
5752
+ continue;
7765
5753
  }
7766
- },
7767
- {
7768
- id: "gpt-5.4-mini-xhigh",
7769
- handle: "openai/gpt-5.4-mini",
7770
- label: "GPT-5.4 Mini",
7771
- description: "Fast, efficient GPT-5.4 variant (max reasoning)",
7772
- updateArgs: {
7773
- reasoning_effort: "xhigh",
7774
- verbosity: "low",
7775
- context_window: 272000,
7776
- max_output_tokens: 128000,
7777
- parallel_tool_calls: true
5754
+ const { frontmatter, body } = parseMdxFrontmatter(content);
5755
+ const label = frontmatter.label || filename.replace(".mdx", "");
5756
+ const block = {
5757
+ label,
5758
+ value: body
5759
+ };
5760
+ if (frontmatter.description) {
5761
+ block.description = frontmatter.description;
7778
5762
  }
7779
- },
7780
- {
7781
- id: "gpt-5.3-codex-none",
7782
- handle: "openai/gpt-5.3-codex",
7783
- label: "GPT-5.3-Codex",
7784
- description: "GPT-5.3 variant (no reasoning) optimized for coding",
7785
- updateArgs: {
7786
- reasoning_effort: "none",
7787
- verbosity: "medium",
7788
- context_window: 272000,
7789
- max_output_tokens: 128000,
7790
- parallel_tool_calls: true
5763
+ if (READ_ONLY_BLOCK_LABELS.includes(label)) {
5764
+ block.read_only = true;
7791
5765
  }
7792
- },
7793
- {
7794
- id: "gpt-5.3-codex-low",
7795
- handle: "openai/gpt-5.3-codex",
7796
- label: "GPT-5.3-Codex",
7797
- description: "GPT-5.3 variant (low reasoning) optimized for coding",
5766
+ memoryBlocks.push(block);
5767
+ } catch (error) {
5768
+ console.error(`Error loading ${filename}:`, error);
5769
+ }
5770
+ }
5771
+ return memoryBlocks;
5772
+ }
5773
+ var cachedMemoryBlocks = null;
5774
+ async function getDefaultMemoryBlocks() {
5775
+ if (!cachedMemoryBlocks) {
5776
+ cachedMemoryBlocks = await loadMemoryBlocksFromMdx();
5777
+ }
5778
+ return cachedMemoryBlocks;
5779
+ }
5780
+ var models = [];
5781
+ var BUILTIN_MODEL_ALIASES = new Map([
5782
+ ["auto", "letta/auto"],
5783
+ ["auto-chat", "letta/auto-chat"],
5784
+ ["auto-fast", "letta/auto-fast"]
5785
+ ]);
5786
+ function resolveEstablishedCliAlias(modelIdentifier) {
5787
+ if (modelIdentifier === "haiku") {
5788
+ return models.find((model) => model.handle.includes("claude-haiku-4-5")) ?? null;
5789
+ }
5790
+ if (modelIdentifier === "sonnet-4.6-low") {
5791
+ const matchingModels = models.filter((model) => model.handle.includes("claude-sonnet-4-6"));
5792
+ const lowEffortModel = matchingModels.find((model) => model.updateArgs?.reasoning_effort === "low");
5793
+ if (lowEffortModel)
5794
+ return lowEffortModel;
5795
+ const baseModel = matchingModels[0];
5796
+ return baseModel ? {
5797
+ ...baseModel,
5798
+ id: modelIdentifier,
7798
5799
  updateArgs: {
5800
+ ...baseModel.updateArgs,
7799
5801
  reasoning_effort: "low",
7800
- verbosity: "medium",
7801
- context_window: 272000,
7802
- max_output_tokens: 128000,
7803
- parallel_tool_calls: true
7804
- }
7805
- },
7806
- {
7807
- id: "gpt-5.3-codex-medium",
7808
- handle: "openai/gpt-5.3-codex",
7809
- label: "GPT-5.3-Codex",
7810
- description: "GPT-5.3 variant (med reasoning) optimized for coding",
7811
- updateArgs: {
7812
- reasoning_effort: "medium",
7813
- verbosity: "medium",
7814
- context_window: 272000,
7815
- max_output_tokens: 128000,
7816
- parallel_tool_calls: true
7817
- }
7818
- },
7819
- {
7820
- id: "gpt-5.3-codex-high",
7821
- handle: "openai/gpt-5.3-codex",
7822
- label: "GPT-5.3-Codex",
7823
- description: "OpenAI's best coding model (high reasoning)",
7824
- updateArgs: {
7825
- reasoning_effort: "high",
7826
- verbosity: "medium",
7827
- context_window: 272000,
7828
- max_output_tokens: 128000,
7829
- parallel_tool_calls: true
7830
- }
7831
- },
7832
- {
7833
- id: "gpt-5.3-codex-xhigh",
7834
- handle: "openai/gpt-5.3-codex",
7835
- label: "GPT-5.3-Codex",
7836
- description: "GPT-5.3 variant (max reasoning) optimized for coding",
7837
- updateArgs: {
7838
- reasoning_effort: "xhigh",
7839
- verbosity: "medium",
7840
- context_window: 272000,
7841
- max_output_tokens: 128000,
7842
- parallel_tool_calls: true
7843
- }
7844
- },
7845
- {
7846
- id: "grok-4.5",
7847
- handle: "xai/grok-4.5",
7848
- label: "Grok 4.5",
7849
- description: "xAI's Grok 4.5 model via the direct xAI API",
7850
- isFeatured: true,
7851
- updateArgs: {
7852
- context_window: 500000,
7853
- max_output_tokens: 16384,
7854
- parallel_tool_calls: true
7855
- }
7856
- },
7857
- {
7858
- id: "glm-5.2",
7859
- handle: "zai/glm-5.2",
7860
- label: "GLM-5.2",
7861
- description: "zAI's latest reasoning and coding model with 1M context",
7862
- isFeatured: true,
7863
- free: true,
7864
- updateArgs: {
7865
- context_window: 1e6,
7866
- max_output_tokens: 131072,
7867
- parallel_tool_calls: true
5802
+ enable_reasoner: true
7868
5803
  }
7869
- },
7870
- {
7871
- id: "glm-5.1",
7872
- handle: "zai/glm-5.1",
7873
- label: "GLM-5.1",
7874
- description: "zAI's coding model",
7875
- isFeatured: false,
7876
- free: true,
7877
- updateArgs: {
7878
- context_window: 180000,
7879
- max_output_tokens: 16000,
7880
- parallel_tool_calls: true
7881
- }
7882
- },
7883
- {
7884
- id: "minimax-m3",
7885
- handle: "minimax/MiniMax-M3",
7886
- label: "MiniMax M3",
7887
- description: "MiniMax's frontier M-series model for agentic reasoning, tool use, coding, multimodal chat input, and long-context tasks",
7888
- isFeatured: true,
7889
- updateArgs: {
7890
- context_window: 500000,
7891
- parallel_tool_calls: true
7892
- }
7893
- },
7894
- {
7895
- id: "minimax-m2.7",
7896
- handle: "minimax/MiniMax-M2.7",
7897
- label: "MiniMax 2.7",
7898
- description: "MiniMax's M2.7 coding model",
7899
- free: true,
7900
- updateArgs: {
7901
- context_window: 160000,
7902
- max_output_tokens: 64000,
7903
- parallel_tool_calls: true
7904
- }
7905
- },
7906
- {
7907
- id: "kimi-k3",
7908
- handle: "moonshot/kimi-k3",
7909
- label: "Kimi K3",
7910
- description: "Moonshot AI's Kimi K3 model for long-context agentic coding and reasoning tasks",
7911
- isFeatured: true,
7912
- updateArgs: {
7913
- context_window: 1048576,
7914
- max_output_tokens: 131072,
7915
- parallel_tool_calls: true
7916
- }
7917
- },
7918
- {
7919
- id: "gemini-3.1",
7920
- handle: "google_ai/gemini-3.1-pro-preview",
7921
- label: "Gemini 3.1 Pro",
7922
- description: "Google's latest and smartest model",
7923
- isFeatured: true,
7924
- updateArgs: {
7925
- context_window: 180000,
7926
- temperature: 1,
7927
- parallel_tool_calls: true
7928
- }
7929
- },
7930
- {
7931
- id: "gemini-3.5-flash",
7932
- handle: "google_ai/gemini-3.5-flash",
7933
- label: "Gemini 3.5 Flash",
7934
- description: "Google's Gemini 3.5 Flash model",
7935
- updateArgs: {
7936
- context_window: 1048576,
7937
- temperature: 1,
7938
- parallel_tool_calls: true
7939
- }
7940
- },
7941
- {
7942
- id: "gemini-3.6-flash",
7943
- handle: "google_ai/gemini-3.6-flash",
7944
- label: "Gemini 3.6 Flash",
7945
- description: "Google's Gemini 3.6 Flash model",
7946
- isFeatured: true,
7947
- updateArgs: {
7948
- context_window: 1048576,
7949
- temperature: 1,
7950
- parallel_tool_calls: true
7951
- }
7952
- }
7953
- ]
7954
- };
7955
- var models = models_default.models;
7956
- function resolveModel(modelIdentifier) {
7957
- const byId = models.find((m) => m.id === modelIdentifier);
7958
- if (byId)
7959
- return byId.handle;
7960
- const byHandle = models.find((m) => m.handle === modelIdentifier);
7961
- if (byHandle)
7962
- return byHandle.handle;
7963
- if (modelIdentifier.includes("/")) {
7964
- return modelIdentifier;
5804
+ } : null;
7965
5805
  }
7966
5806
  return null;
7967
5807
  }
5808
+ function resolveCatalogModel(modelIdentifier) {
5809
+ const byId = models.find((model) => model.id === modelIdentifier);
5810
+ if (byId)
5811
+ return byId;
5812
+ const byHandle = models.find((model) => model.handle === modelIdentifier);
5813
+ if (byHandle)
5814
+ return byHandle;
5815
+ const cliAlias = resolveEstablishedCliAlias(modelIdentifier);
5816
+ if (cliAlias)
5817
+ return cliAlias;
5818
+ const matches = models.filter((model) => model.handle.split("/").slice(1).join("/") === modelIdentifier);
5819
+ const matchingHandles = new Set(matches.map((model) => model.handle));
5820
+ return matchingHandles.size === 1 ? matches[0] ?? null : null;
5821
+ }
5822
+ function resolveModel(modelIdentifier) {
5823
+ const entry = resolveCatalogModel(modelIdentifier);
5824
+ if (entry)
5825
+ return entry.handle;
5826
+ const builtinHandle = BUILTIN_MODEL_ALIASES.get(modelIdentifier);
5827
+ if (builtinHandle)
5828
+ return builtinHandle;
5829
+ return modelIdentifier.includes("/") ? modelIdentifier : null;
5830
+ }
7968
5831
  function getDefaultModel() {
7969
- const autoModel = resolveModel("auto");
5832
+ if (models.length === 0)
5833
+ return "letta/auto";
5834
+ const autoModel = models.find((model) => model.id === "auto");
7970
5835
  if (autoModel)
7971
- return autoModel;
7972
- const defaultModel = models.find((m) => m.isDefault);
5836
+ return autoModel.handle;
5837
+ const defaultModel = models.find((model) => model.isDefault);
7973
5838
  if (defaultModel)
7974
5839
  return defaultModel.handle;
7975
5840
  const firstModel = models[0];
7976
5841
  if (!firstModel) {
7977
- throw new Error("No models available in models.json");
5842
+ throw new Error("Model catalog is unavailable.");
7978
5843
  }
7979
5844
  return firstModel.handle;
7980
5845
  }
@@ -8260,8 +6125,15 @@ function assertCreateAgentOptionsSupported(options) {
8260
6125
  throw new Error("App-server createAgent() does not yet support dreaming.behavior overrides.");
8261
6126
  }
8262
6127
  }
8263
- async function createAgentBody(options) {
6128
+ async function createAgentBody(options, resolvedSkills) {
8264
6129
  assertCreateAgentOptionsSupported(options);
6130
+ const skills = resolvedSkills ?? await resolveSkillItems(options.skills);
6131
+ if (skills.length > 0 && options.memfs === false) {
6132
+ throw new Error("createAgent() skills require the memory filesystem; remove memfs: false.");
6133
+ }
6134
+ if (resolvedSkills === undefined && skillsHaveSupportFiles(skills)) {
6135
+ throw new Error("This backend does not yet support skill support files (scripts/, " + "references/). Use the Cloud backend, or pass a skill with only SKILL.md.");
6136
+ }
8265
6137
  let system;
8266
6138
  if (options.systemPrompt !== undefined) {
8267
6139
  if (typeof options.systemPrompt !== "string" || isPresetSystemPrompt(options.systemPrompt)) {
@@ -8287,7 +6159,14 @@ async function createAgentBody(options) {
8287
6159
  if (options.human !== undefined) {
8288
6160
  memoryBlocks.push({ label: "human", value: options.human });
8289
6161
  }
8290
- const hasMemoryConfiguration = options.memory !== undefined || options.persona !== undefined || options.human !== undefined;
6162
+ for (const skill of skills) {
6163
+ memoryBlocks.push({
6164
+ label: `skills/${skill.name}`,
6165
+ value: skill.instructions,
6166
+ description: skill.description
6167
+ });
6168
+ }
6169
+ const hasMemoryConfiguration = options.memory !== undefined || options.persona !== undefined || options.human !== undefined || skills.length > 0;
8291
6170
  return buildCreateAgentRequest({
8292
6171
  personalityId: options.personality,
8293
6172
  name: options.name,
@@ -9275,11 +7154,12 @@ class RemoteTurnCoordinator {
9275
7154
  });
9276
7155
  const success = turn.success !== undefined ? turn.success && !approvalConflict && !isFailureStopReason(stopReason) : !approvalConflict && !isFailureStopReason(stopReason);
9277
7156
  const errorCode = approvalConflict ? "approval_conflict" : turn.errorCode ?? toSdkErrorCode(stopReason);
7157
+ const publicError = errorCode && errorCode !== "error" ? errorCode : turn.detail ?? stopReason ?? "error";
9278
7158
  return {
9279
7159
  type: "result",
9280
7160
  success,
9281
7161
  result: success ? tracker?.assistantText || undefined : undefined,
9282
- error: success ? undefined : errorCode ?? stopReason ?? "error",
7162
+ error: success ? undefined : publicError,
9283
7163
  errorCode: success ? undefined : errorCode ?? "error",
9284
7164
  approvalConflict: approvalConflict || undefined,
9285
7165
  recoverable: approvalConflict ? true : success ? undefined : turn.recoverable ?? false,
@@ -9383,7 +7263,7 @@ class RemoteClientSessionCore {
9383
7263
  this.runtime = init.runtime;
9384
7264
  this._agentId = init.runtime.agent_id;
9385
7265
  this._conversationId = init.runtime.conversation_id;
9386
- this._sessionId = `${init.runtime.agent_id}:${init.runtime.conversation_id}`;
7266
+ this._sessionId = init.runtime.agent_id ? `${init.runtime.agent_id}:${init.runtime.conversation_id}` : init.runtime.conversation_id;
9387
7267
  this._modelSettings = init.modelSettings ?? null;
9388
7268
  this._model = typeof init.model === "string" ? init.model : typeof this._modelSettings?.model === "string" ? this._modelSettings.model : "";
9389
7269
  this.toolNames = init.tools;
@@ -10358,8 +8238,8 @@ class AppServerSession extends RemoteClientSessionCore {
10358
8238
  return {
10359
8239
  controller: new AppServerRuntimeController(client, this.remoteOptions, allowedTools, clientToolset),
10360
8240
  runtime: response.runtime,
10361
- model: typeof response.agent?.model === "string" ? response.agent.model : "",
10362
- modelSettings: objectRecord(response.agent?.model_settings) ?? null,
8241
+ model: typeof response.agent?.model === "string" ? response.agent.model : typeof response.conversation?.model === "string" ? response.conversation.model : "",
8242
+ modelSettings: objectRecord(response.agent?.model_settings) ?? objectRecord(response.conversation?.model_settings) ?? null,
10363
8243
  ...availableTools !== undefined ? { tools: availableTools } : {},
10364
8244
  ...skillSources !== undefined ? { skillSources: [...skillSources] } : {}
10365
8245
  };
@@ -10440,6 +8320,24 @@ class AppServerSession extends RemoteClientSessionCore {
10440
8320
  };
10441
8321
  return command;
10442
8322
  }
8323
+ if (this.mode.kind === "agent-free") {
8324
+ if (this.mode.createConversation) {
8325
+ const create = this.mode.createConversation;
8326
+ command.create_conversation = {
8327
+ body: {
8328
+ model: create.model,
8329
+ system: create.system,
8330
+ ...create.modelSettings !== undefined ? { model_settings: create.modelSettings } : {},
8331
+ ...create.contextWindowLimit !== undefined ? { context_window_limit: create.contextWindowLimit } : {}
8332
+ }
8333
+ };
8334
+ } else if (this.mode.conversationId) {
8335
+ command.conversation_id = this.mode.conversationId;
8336
+ } else {
8337
+ throw new Error("Agent-free sessions require a conversation to create or resume.");
8338
+ }
8339
+ return command;
8340
+ }
10443
8341
  if (this.mode.agentId) {
10444
8342
  command.agent_id = this.mode.agentId;
10445
8343
  if (this.mode.newConversation) {
@@ -11159,7 +9057,8 @@ function buildCloudStatusWebSocketUrl(params) {
11159
9057
  throw new Error(`Unsupported cloud apiBaseUrl protocol: ${base.protocol}`);
11160
9058
  }
11161
9059
  base.pathname = `/v1/environments/${encodeURIComponent(params.connectionId)}/status/ws`;
11162
- base.searchParams.set("agentId", params.agentId);
9060
+ if (params.agentId)
9061
+ base.searchParams.set("agentId", params.agentId);
11163
9062
  base.searchParams.set("conversationId", params.conversationId);
11164
9063
  base.searchParams.set("channel", "stream");
11165
9064
  if (params.authMode === "query" && params.apiKey) {
@@ -11190,12 +9089,23 @@ function externalToolsByName(tools) {
11190
9089
  }
11191
9090
  return result;
11192
9091
  }
11193
- async function createCloudAgent(client, agentOptions) {
11194
- const body = await createAgentBody(agentOptions);
9092
+ async function createCloudAgent(client, agentOptions, pushSkillSupportFiles) {
9093
+ const skills = await resolveSkillItems(agentOptions.skills);
9094
+ const hasSupportFiles = skillsHaveSupportFiles(skills);
9095
+ if (hasSupportFiles && pushSkillSupportFiles === undefined) {
9096
+ throw new Error("Skill support files (scripts/, references/) require the Node.js " + "package root; the portable client seeds SKILL.md-only skills.");
9097
+ }
9098
+ const body = await createAgentBody(agentOptions, skills);
11195
9099
  const agent = await client.agents.create(body);
11196
9100
  if (typeof agent.id !== "string" || agent.id.length === 0) {
11197
9101
  throw new Error("Cloud create agent response did not include an agent id.");
11198
9102
  }
9103
+ if (hasSupportFiles && pushSkillSupportFiles) {
9104
+ if (typeof client.apiKey !== "string" || client.apiKey.length === 0) {
9105
+ throw new Error(`Agent ${agent.id} was created, but skill support files need an API ` + "key to push to the agent's memory repo and none is configured.");
9106
+ }
9107
+ await pushSkillSupportFiles({ apiBaseUrl: client.baseURL, apiKey: client.apiKey, agentId: agent.id }, skills);
9108
+ }
11199
9109
  return agent.id;
11200
9110
  }
11201
9111
  function assertCloudSessionOptionsSupported(action, options) {
@@ -11245,7 +9155,9 @@ class CloudEnvironmentSession extends RemoteClientSessionCore {
11245
9155
  this.sandboxLifecycleClosing = false;
11246
9156
  const resolved = await this.resolveRuntime();
11247
9157
  const connection = await this.resolveConnectionForRuntime(resolved.runtime).catch(async (error) => {
11248
- await this.cleanupSessionRepositories(resolved.runtime.agent_id, resolved.runtime.conversation_id);
9158
+ if (resolved.runtime.agent_id) {
9159
+ await this.cleanupSessionRepositories(resolved.runtime.agent_id, resolved.runtime.conversation_id);
9160
+ }
11249
9161
  throw error;
11250
9162
  });
11251
9163
  this.connectionId = connection.connectionId;
@@ -11262,7 +9174,9 @@ class CloudEnvironmentSession extends RemoteClientSessionCore {
11262
9174
  } catch (error) {
11263
9175
  await this.closeMcpBridge();
11264
9176
  await this.cleanupManagedSandbox();
11265
- await this.cleanupSessionRepositories(resolved.runtime.agent_id, resolved.runtime.conversation_id);
9177
+ if (resolved.runtime.agent_id) {
9178
+ await this.cleanupSessionRepositories(resolved.runtime.agent_id, resolved.runtime.conversation_id);
9179
+ }
11266
9180
  throw error;
11267
9181
  }
11268
9182
  }
@@ -11286,8 +9200,8 @@ class CloudEnvironmentSession extends RemoteClientSessionCore {
11286
9200
  requestTimeoutMs: this.cloudOptions.requestTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS
11287
9201
  }, allowedTools, clientToolset),
11288
9202
  runtime: response.runtime,
11289
- model: typeof response.agent?.model === "string" ? response.agent.model : "",
11290
- modelSettings: response.agent?.model_settings ?? null,
9203
+ model: typeof response.agent?.model === "string" ? response.agent.model : typeof response.conversation?.model === "string" ? response.conversation.model : "",
9204
+ modelSettings: response.agent?.model_settings ?? response.conversation?.model_settings ?? null,
11291
9205
  ...availableTools !== undefined ? { tools: availableTools } : {},
11292
9206
  ...skillSources !== undefined ? { skillSources: [...skillSources] } : {}
11293
9207
  };
@@ -11400,11 +9314,12 @@ class CloudEnvironmentSession extends RemoteClientSessionCore {
11400
9314
  name: SDK_AGENT_ORIGIN,
11401
9315
  title: "Letta Agent SDK"
11402
9316
  },
11403
- agent_id: runtime.agent_id,
11404
9317
  conversation_id: runtime.conversation_id,
11405
9318
  recover_approvals: false,
11406
9319
  force_device_status: true
11407
9320
  };
9321
+ if (runtime.agent_id)
9322
+ command.agent_id = runtime.agent_id;
11408
9323
  const mode = mapPermissionMode(options.permissionMode);
11409
9324
  if (mode)
11410
9325
  command.mode = mode;
@@ -11475,6 +9390,17 @@ class CloudEnvironmentSession extends RemoteClientSessionCore {
11475
9390
  return bridge?.close() ?? Promise.resolve();
11476
9391
  }
11477
9392
  async resolveRuntime() {
9393
+ if (this.cloudMode.kind === "agent-free") {
9394
+ if (!this.cloudMode.conversationId) {
9395
+ throw new Error("Cloud agent-free sessions require a conversation id.");
9396
+ }
9397
+ return {
9398
+ runtime: {
9399
+ agent_id: null,
9400
+ conversation_id: this.cloudMode.conversationId
9401
+ }
9402
+ };
9403
+ }
11478
9404
  let agentId = this.cloudMode.agentId;
11479
9405
  let conversationId = this.cloudMode.conversationId;
11480
9406
  if (!agentId && conversationId) {
@@ -11620,6 +9546,9 @@ class CloudEnvironmentSession extends RemoteClientSessionCore {
11620
9546
  return { connectionId: resolved.connectionId };
11621
9547
  }
11622
9548
  async createManagedSandboxConnection(runtime) {
9549
+ if (!runtime.agent_id) {
9550
+ throw new Error("Agent-free queries require an explicit Cloud computer; managed sandboxes are agent-scoped.");
9551
+ }
11623
9552
  const conversationId = runtime.conversation_id && runtime.conversation_id !== "default" ? runtime.conversation_id : undefined;
11624
9553
  const sandbox = await this.createManagedSandbox(runtime.agent_id, conversationId);
11625
9554
  this.managedSandbox = sandbox;
@@ -11922,6 +9851,36 @@ function createConversationsClient(transport) {
11922
9851
  };
11923
9852
  }
11924
9853
 
9854
+ // src/query.ts
9855
+ function createQuery(createSession, params) {
9856
+ let session = null;
9857
+ let closed = false;
9858
+ const iterator = async function* runQuery() {
9859
+ try {
9860
+ session = await createSession(params.options);
9861
+ if (closed)
9862
+ return;
9863
+ await session.send(params.prompt);
9864
+ yield* session.stream();
9865
+ } finally {
9866
+ closed = true;
9867
+ session?.close();
9868
+ }
9869
+ }();
9870
+ return Object.assign(iterator, {
9871
+ async interrupt() {
9872
+ await session?.abort();
9873
+ },
9874
+ close() {
9875
+ if (closed)
9876
+ return;
9877
+ closed = true;
9878
+ session?.close();
9879
+ iterator.return();
9880
+ }
9881
+ });
9882
+ }
9883
+
11925
9884
  // src/validation.ts
11926
9885
  var VALID_SKILL_SOURCES = [
11927
9886
  "bundled",
@@ -12147,6 +10106,24 @@ function hasCreateAgentEnvironment(options) {
12147
10106
  function looksLikeConversationId(id) {
12148
10107
  return id.startsWith("conv-") || id.startsWith("local-conv-");
12149
10108
  }
10109
+ function agentFreeSessionOptions(options) {
10110
+ const {
10111
+ system: _system,
10112
+ modelSettings: _modelSettings,
10113
+ contextWindowLimit: _contextWindowLimit,
10114
+ ...sessionOptions
10115
+ } = options;
10116
+ return sessionOptions;
10117
+ }
10118
+ function validateAgentFreeQueryOptions(options) {
10119
+ if (typeof options.model !== "string" || options.model.length === 0) {
10120
+ throw new Error("query() requires a non-empty model.");
10121
+ }
10122
+ if (typeof options.system !== "string") {
10123
+ throw new Error("query() requires a system prompt.");
10124
+ }
10125
+ validateCreateSessionOptions(agentFreeSessionOptions(options));
10126
+ }
12150
10127
 
12151
10128
  class LettaAgentClientBase {
12152
10129
  backend;
@@ -12221,6 +10198,11 @@ class LettaAgentClientBase {
12221
10198
  throw new Error("createAgent() does not accept environment. Set a client default or pass environment to resumeSession()/createSession().");
12222
10199
  }
12223
10200
  validateCreateAgentOptions(options);
10201
+ if (options.skills !== undefined && options.skills.length > 0) {
10202
+ const nodeSupport = this.skillNodeSupport();
10203
+ const skills = await resolveSkillItems(options.skills, nodeSupport?.loadSkillDirectory);
10204
+ options = { ...options, skills };
10205
+ }
12224
10206
  if (this.backend === "remote") {
12225
10207
  const session = new AppServerSession(this.appServerSessionOptions(), {
12226
10208
  kind: "create-agent",
@@ -12228,10 +10210,13 @@ class LettaAgentClientBase {
12228
10210
  });
12229
10211
  const initMsg = await session.initialize();
12230
10212
  session.close();
10213
+ if (!initMsg.agentId) {
10214
+ throw new Error("App Server agent creation did not return an agent id.");
10215
+ }
12231
10216
  return initMsg.agentId;
12232
10217
  }
12233
10218
  if (this.backend === "cloud") {
12234
- return createCloudAgent(this.getCloudClient(), options);
10219
+ return createCloudAgent(this.getCloudClient(), options, this.skillNodeSupport()?.pushSkillSupportFiles);
12235
10220
  }
12236
10221
  return this.createLocalAgent(options);
12237
10222
  }
@@ -12304,6 +10289,50 @@ class LettaAgentClientBase {
12304
10289
  session.close();
12305
10290
  }
12306
10291
  }
10292
+ query(params) {
10293
+ validateAgentFreeQueryOptions(params.options);
10294
+ return createQuery((options) => this.createAgentFreeSession(options), params);
10295
+ }
10296
+ async createAgentFreeSession(options) {
10297
+ validateAgentFreeQueryOptions(options);
10298
+ const sessionOptions = agentFreeSessionOptions(options);
10299
+ this.assertSessionBackend("query", sessionOptions);
10300
+ if (this.backend === "remote") {
10301
+ return new AppServerSession(this.appServerSessionOptions(), {
10302
+ kind: "agent-free",
10303
+ createConversation: {
10304
+ model: options.model,
10305
+ system: options.system,
10306
+ ...options.modelSettings !== undefined ? { modelSettings: options.modelSettings } : {},
10307
+ ...options.contextWindowLimit !== undefined ? { contextWindowLimit: options.contextWindowLimit } : {}
10308
+ },
10309
+ options: sessionOptions
10310
+ });
10311
+ }
10312
+ if (this.backend === "cloud") {
10313
+ const computer = options.computer ?? options.environment ?? this.computer;
10314
+ if (computer === undefined) {
10315
+ throw new Error("Cloud query() requires an explicit computer; managed sandboxes are agent-scoped.");
10316
+ }
10317
+ const conversation = await this.getCloudClient().post("/v1/conversations/ephemeral", {
10318
+ body: {
10319
+ model: options.model,
10320
+ system: options.system,
10321
+ ...options.modelSettings !== undefined ? { model_settings: options.modelSettings } : {},
10322
+ ...options.contextWindowLimit !== undefined ? { context_window_limit: options.contextWindowLimit } : {}
10323
+ }
10324
+ });
10325
+ if (!conversation || typeof conversation !== "object" || typeof conversation.id !== "string") {
10326
+ throw new Error("Cloud ephemeral conversation response did not include a conversation id.");
10327
+ }
10328
+ return new CloudEnvironmentSession(this.cloudOptions(), {
10329
+ kind: "agent-free",
10330
+ conversationId: conversation.id,
10331
+ options: sessionOptions
10332
+ }, this.getCloudClient());
10333
+ }
10334
+ return this.createLocalAgentFreeSession(options, sessionOptions);
10335
+ }
12307
10336
  assertSessionBackend(action, options) {
12308
10337
  if (options.computer !== undefined && options.environment !== undefined) {
12309
10338
  throw new Error(`${action}() cannot specify both computer and deprecated environment.`);
@@ -12368,9 +10397,15 @@ class LettaAgentClientBase {
12368
10397
  createLocalAgent(_options) {
12369
10398
  throw this.localBackendUnavailableError();
12370
10399
  }
10400
+ skillNodeSupport() {
10401
+ return;
10402
+ }
12371
10403
  createLocalSession(_agentId, _options) {
12372
10404
  throw this.localBackendUnavailableError();
12373
10405
  }
10406
+ createLocalAgentFreeSession(_queryOptions, _sessionOptions) {
10407
+ throw this.localBackendUnavailableError();
10408
+ }
12374
10409
  resumeLocalSession(_id, _options) {
12375
10410
  throw this.localBackendUnavailableError();
12376
10411
  }
@@ -12866,7 +10901,7 @@ function buildLocalAppServerArgs(cliPath, options = {}) {
12866
10901
  return [
12867
10902
  cliPath,
12868
10903
  ...options.backend !== undefined ? ["--backend", options.backend] : [],
12869
- "app-server",
10904
+ "server",
12870
10905
  "--listen",
12871
10906
  options.listen ?? DEFAULT_LISTEN_URL
12872
10907
  ];
@@ -12989,8 +11024,97 @@ function createLocalAppServerSession(options, mode) {
12989
11024
  return new AppServerSession(sessionOptions, mode);
12990
11025
  }
12991
11026
 
11027
+ // src/skill-node.ts
11028
+ import { readFile, readdir, stat, mkdtemp, rm, mkdir, writeFile } from "node:fs/promises";
11029
+ import { tmpdir } from "node:os";
11030
+ import { basename as basename3, dirname as dirname5, join as join8, relative, sep } from "node:path";
11031
+ import { execFile } from "node:child_process";
11032
+ import { promisify } from "node:util";
11033
+ var run = promisify(execFile);
11034
+ async function loadSkillDirectory(dirPath) {
11035
+ const dirStat = await stat(dirPath).catch(() => null);
11036
+ if (!dirStat?.isDirectory()) {
11037
+ throw new Error(`Skill path is not a directory: ${dirPath}`);
11038
+ }
11039
+ const skillMd = await readFile(join8(dirPath, "SKILL.md"), "utf-8").catch(() => null);
11040
+ if (skillMd === null) {
11041
+ throw new Error(`Skill directory has no SKILL.md: ${dirPath}`);
11042
+ }
11043
+ const parsed = parseSkillMarkdown(skillMd);
11044
+ const name = parsed.name ?? basename3(dirPath);
11045
+ assertValidSkillName(name);
11046
+ if (!parsed.description) {
11047
+ throw new Error(`SKILL.md in ${dirPath} has no frontmatter description. ` + `The description is the skill's trigger text; it is required.`);
11048
+ }
11049
+ const files = {};
11050
+ const walk = async (current) => {
11051
+ for (const entry of await readdir(current, { withFileTypes: true })) {
11052
+ const full = join8(current, entry.name);
11053
+ if (entry.isDirectory()) {
11054
+ await walk(full);
11055
+ } else if (entry.isFile()) {
11056
+ const rel = relative(dirPath, full).split(sep).join("/");
11057
+ if (rel === "SKILL.md")
11058
+ continue;
11059
+ files[rel] = new Uint8Array(await readFile(full));
11060
+ }
11061
+ }
11062
+ };
11063
+ await walk(dirPath);
11064
+ return {
11065
+ name,
11066
+ description: parsed.description,
11067
+ instructions: parsed.body.replace(/^\s+/, ""),
11068
+ ...Object.keys(files).length > 0 ? { files } : {}
11069
+ };
11070
+ }
11071
+ async function pushSkillSupportFiles(target, skills) {
11072
+ const entries = skillSupportFileEntries(skills);
11073
+ if (entries.length === 0)
11074
+ return;
11075
+ const base = target.apiBaseUrl.replace(/\/+$/, "");
11076
+ const remote = `${base}/v1/git/${target.agentId}/state.git`;
11077
+ const authHeader = `Authorization: Basic ${Buffer.from(`x:${target.apiKey}`).toString("base64")}`;
11078
+ const gitEnv = {
11079
+ ...process.env,
11080
+ GIT_TERMINAL_PROMPT: "0",
11081
+ GIT_AUTHOR_NAME: "letta-agent-sdk",
11082
+ GIT_AUTHOR_EMAIL: "sdk@letta.com",
11083
+ GIT_COMMITTER_NAME: "letta-agent-sdk",
11084
+ GIT_COMMITTER_EMAIL: "sdk@letta.com"
11085
+ };
11086
+ const git = (args, cwd) => run("git", ["-c", `http.extraHeader=${authHeader}`, ...args], {
11087
+ env: gitEnv,
11088
+ ...cwd ? { cwd } : {}
11089
+ });
11090
+ const work = await mkdtemp(join8(tmpdir(), "letta-skill-seed-"));
11091
+ try {
11092
+ await git(["clone", "--quiet", "--depth", "1", remote, work]);
11093
+ for (const entry of entries) {
11094
+ const filePath = join8(work, entry.path);
11095
+ await mkdir(dirname5(filePath), { recursive: true });
11096
+ await writeFile(filePath, entry.data);
11097
+ }
11098
+ await git(["add", "-A"], work);
11099
+ await git(["commit", "--quiet", "-m", "feat: seed skill support files"], work);
11100
+ try {
11101
+ await git(["push", "--quiet", "origin", "HEAD"], work);
11102
+ } catch {
11103
+ await git(["pull", "--quiet", "--rebase", "origin", "HEAD"], work);
11104
+ await git(["push", "--quiet", "origin", "HEAD"], work);
11105
+ }
11106
+ } catch (error) {
11107
+ throw new Error(`Agent ${target.agentId} was created, but pushing skill support files ` + `to its memory repo failed: ${error instanceof Error ? error.message : String(error)}`);
11108
+ } finally {
11109
+ await rm(work, { recursive: true, force: true });
11110
+ }
11111
+ }
11112
+
12992
11113
  // src/client.ts
12993
11114
  class LettaAgentClient extends LettaAgentClientBase {
11115
+ skillNodeSupport() {
11116
+ return { loadSkillDirectory, pushSkillSupportFiles };
11117
+ }
12994
11118
  createLocalManagementTransport() {
12995
11119
  const localOptions = this.options.appServer;
12996
11120
  return new AppServerManagementTransport({
@@ -13013,6 +11137,9 @@ class LettaAgentClient extends LettaAgentClientBase {
13013
11137
  });
13014
11138
  const initMsg = await session.initialize();
13015
11139
  session.close();
11140
+ if (!initMsg.agentId) {
11141
+ throw new Error("Local App Server agent creation did not return an agent id.");
11142
+ }
13016
11143
  return initMsg.agentId;
13017
11144
  }
13018
11145
  createLocalSession(agentId, options) {
@@ -13024,6 +11151,22 @@ class LettaAgentClient extends LettaAgentClientBase {
13024
11151
  options
13025
11152
  });
13026
11153
  }
11154
+ createLocalAgentFreeSession(queryOptions, sessionOptions) {
11155
+ const localOptions = this.options;
11156
+ if (localOptions.appServer?.url === undefined && (localOptions.appServer?.harnessBackend ?? "local") === "local") {
11157
+ throw new Error('query() requires the API-backed App Server. Set appServer.harnessBackend to "api" or connect to an API-backed remote App Server.');
11158
+ }
11159
+ return createLocalAppServerSession(localOptions.appServer, {
11160
+ kind: "agent-free",
11161
+ createConversation: {
11162
+ model: queryOptions.model,
11163
+ system: queryOptions.system,
11164
+ ...queryOptions.modelSettings !== undefined ? { modelSettings: queryOptions.modelSettings } : {},
11165
+ ...queryOptions.contextWindowLimit !== undefined ? { contextWindowLimit: queryOptions.contextWindowLimit } : {}
11166
+ },
11167
+ options: sessionOptions
11168
+ });
11169
+ }
13027
11170
  resumeLocalSession(id, options) {
13028
11171
  const localOptions = this.options;
13029
11172
  if (looksLikeConversationId2(id)) {
@@ -13093,7 +11236,7 @@ var __export = (target, all) => {
13093
11236
  set: __exportSetter.bind(all, name)
13094
11237
  });
13095
11238
  };
13096
- var __require2 = /* @__PURE__ */ createRequire3(import.meta.url);
11239
+ var __require3 = /* @__PURE__ */ createRequire3(import.meta.url);
13097
11240
  var require_code = __commonJS((exports) => {
13098
11241
  Object.defineProperty(exports, "__esModule", { value: true });
13099
11242
  exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = undefined;
@@ -16550,49 +14693,49 @@ var require_fast_uri = __commonJS((exports, module) => {
16550
14693
  schemelessOptions.skipEscape = true;
16551
14694
  return serialize(resolved, schemelessOptions);
16552
14695
  }
16553
- function resolveComponent(base, relative, options, skipNormalization) {
14696
+ function resolveComponent(base, relative2, options, skipNormalization) {
16554
14697
  const target = {};
16555
14698
  if (!skipNormalization) {
16556
14699
  base = parse5(serialize(base, options), options);
16557
- relative = parse5(serialize(relative, options), options);
14700
+ relative2 = parse5(serialize(relative2, options), options);
16558
14701
  }
16559
14702
  options = options || {};
16560
- if (!options.tolerant && relative.scheme) {
16561
- target.scheme = relative.scheme;
16562
- target.userinfo = relative.userinfo;
16563
- target.host = relative.host;
16564
- target.port = relative.port;
16565
- target.path = removeDotSegments(relative.path || "");
16566
- target.query = relative.query;
14703
+ if (!options.tolerant && relative2.scheme) {
14704
+ target.scheme = relative2.scheme;
14705
+ target.userinfo = relative2.userinfo;
14706
+ target.host = relative2.host;
14707
+ target.port = relative2.port;
14708
+ target.path = removeDotSegments(relative2.path || "");
14709
+ target.query = relative2.query;
16567
14710
  } else {
16568
- if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {
16569
- target.userinfo = relative.userinfo;
16570
- target.host = relative.host;
16571
- target.port = relative.port;
16572
- target.path = removeDotSegments(relative.path || "");
16573
- target.query = relative.query;
14711
+ if (relative2.userinfo !== undefined || relative2.host !== undefined || relative2.port !== undefined) {
14712
+ target.userinfo = relative2.userinfo;
14713
+ target.host = relative2.host;
14714
+ target.port = relative2.port;
14715
+ target.path = removeDotSegments(relative2.path || "");
14716
+ target.query = relative2.query;
16574
14717
  } else {
16575
- if (!relative.path) {
14718
+ if (!relative2.path) {
16576
14719
  target.path = base.path;
16577
- if (relative.query !== undefined) {
16578
- target.query = relative.query;
14720
+ if (relative2.query !== undefined) {
14721
+ target.query = relative2.query;
16579
14722
  } else {
16580
14723
  target.query = base.query;
16581
14724
  }
16582
14725
  } else {
16583
- if (relative.path[0] === "/") {
16584
- target.path = removeDotSegments(relative.path);
14726
+ if (relative2.path[0] === "/") {
14727
+ target.path = removeDotSegments(relative2.path);
16585
14728
  } else {
16586
14729
  if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
16587
- target.path = "/" + relative.path;
14730
+ target.path = "/" + relative2.path;
16588
14731
  } else if (!base.path) {
16589
- target.path = relative.path;
14732
+ target.path = relative2.path;
16590
14733
  } else {
16591
- target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
14734
+ target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative2.path;
16592
14735
  }
16593
14736
  target.path = removeDotSegments(target.path);
16594
14737
  }
16595
- target.query = relative.query;
14738
+ target.query = relative2.query;
16596
14739
  }
16597
14740
  target.userinfo = base.userinfo;
16598
14741
  target.host = base.host;
@@ -16600,7 +14743,7 @@ var require_fast_uri = __commonJS((exports, module) => {
16600
14743
  }
16601
14744
  target.scheme = base.scheme;
16602
14745
  }
16603
- target.fragment = relative.fragment;
14746
+ target.fragment = relative2.fragment;
16604
14747
  return target;
16605
14748
  }
16606
14749
  function equal(uriA, uriB, options) {
@@ -19520,7 +17663,7 @@ var require_dist = __commonJS((exports, module) => {
19520
17663
  var require_windows = __commonJS((exports, module) => {
19521
17664
  module.exports = isexe;
19522
17665
  isexe.sync = sync;
19523
- var fs = __require2("fs");
17666
+ var fs = __require3("fs");
19524
17667
  function checkPathExt(path2, options) {
19525
17668
  var pathext = options.pathExt !== undefined ? options.pathExt : process.env.PATHEXT;
19526
17669
  if (!pathext) {
@@ -19538,15 +17681,15 @@ var require_windows = __commonJS((exports, module) => {
19538
17681
  }
19539
17682
  return false;
19540
17683
  }
19541
- function checkStat(stat, path2, options) {
19542
- if (!stat.isSymbolicLink() && !stat.isFile()) {
17684
+ function checkStat(stat2, path2, options) {
17685
+ if (!stat2.isSymbolicLink() && !stat2.isFile()) {
19543
17686
  return false;
19544
17687
  }
19545
17688
  return checkPathExt(path2, options);
19546
17689
  }
19547
17690
  function isexe(path2, options, cb) {
19548
- fs.stat(path2, function(er, stat) {
19549
- cb(er, er ? false : checkStat(stat, path2, options));
17691
+ fs.stat(path2, function(er, stat2) {
17692
+ cb(er, er ? false : checkStat(stat2, path2, options));
19550
17693
  });
19551
17694
  }
19552
17695
  function sync(path2, options) {
@@ -19556,22 +17699,22 @@ var require_windows = __commonJS((exports, module) => {
19556
17699
  var require_mode = __commonJS((exports, module) => {
19557
17700
  module.exports = isexe;
19558
17701
  isexe.sync = sync;
19559
- var fs = __require2("fs");
17702
+ var fs = __require3("fs");
19560
17703
  function isexe(path2, options, cb) {
19561
- fs.stat(path2, function(er, stat) {
19562
- cb(er, er ? false : checkStat(stat, options));
17704
+ fs.stat(path2, function(er, stat2) {
17705
+ cb(er, er ? false : checkStat(stat2, options));
19563
17706
  });
19564
17707
  }
19565
17708
  function sync(path2, options) {
19566
17709
  return checkStat(fs.statSync(path2), options);
19567
17710
  }
19568
- function checkStat(stat, options) {
19569
- return stat.isFile() && checkMode(stat, options);
17711
+ function checkStat(stat2, options) {
17712
+ return stat2.isFile() && checkMode(stat2, options);
19570
17713
  }
19571
- function checkMode(stat, options) {
19572
- var mod = stat.mode;
19573
- var uid = stat.uid;
19574
- var gid = stat.gid;
17714
+ function checkMode(stat2, options) {
17715
+ var mod = stat2.mode;
17716
+ var uid = stat2.uid;
17717
+ var gid = stat2.gid;
19575
17718
  var myUid = options.uid !== undefined ? options.uid : process.getuid && process.getuid();
19576
17719
  var myGid = options.gid !== undefined ? options.gid : process.getgid && process.getgid();
19577
17720
  var u = parseInt("100", 8);
@@ -19583,7 +17726,7 @@ var require_mode = __commonJS((exports, module) => {
19583
17726
  }
19584
17727
  });
19585
17728
  var require_isexe = __commonJS((exports, module) => {
19586
- var fs = __require2("fs");
17729
+ var fs = __require3("fs");
19587
17730
  var core2;
19588
17731
  if (process.platform === "win32" || global.TESTING_WINDOWS) {
19589
17732
  core2 = require_windows();
@@ -19635,7 +17778,7 @@ var require_isexe = __commonJS((exports, module) => {
19635
17778
  });
19636
17779
  var require_which = __commonJS((exports, module) => {
19637
17780
  var isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys";
19638
- var path2 = __require2("path");
17781
+ var path2 = __require3("path");
19639
17782
  var COLON = isWindows ? ";" : ":";
19640
17783
  var isexe = require_isexe();
19641
17784
  var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" });
@@ -19735,7 +17878,7 @@ var require_path_key = __commonJS((exports, module) => {
19735
17878
  module.exports.default = pathKey;
19736
17879
  });
19737
17880
  var require_resolveCommand = __commonJS((exports, module) => {
19738
- var path2 = __require2("path");
17881
+ var path2 = __require3("path");
19739
17882
  var which = require_which();
19740
17883
  var getPathKey = require_path_key();
19741
17884
  function resolveCommandAttempt(parsed, withoutPathExt) {
@@ -19808,7 +17951,7 @@ var require_shebang_command = __commonJS((exports, module) => {
19808
17951
  };
19809
17952
  });
19810
17953
  var require_readShebang = __commonJS((exports, module) => {
19811
- var fs = __require2("fs");
17954
+ var fs = __require3("fs");
19812
17955
  var shebangCommand = require_shebang_command();
19813
17956
  function readShebang(command) {
19814
17957
  const size = 150;
@@ -19824,7 +17967,7 @@ var require_readShebang = __commonJS((exports, module) => {
19824
17967
  module.exports = readShebang;
19825
17968
  });
19826
17969
  var require_parse = __commonJS((exports, module) => {
19827
- var path2 = __require2("path");
17970
+ var path2 = __require3("path");
19828
17971
  var resolveCommand = require_resolveCommand();
19829
17972
  var escape2 = require_escape();
19830
17973
  var readShebang = require_readShebang();
@@ -19926,7 +18069,7 @@ var require_enoent = __commonJS((exports, module) => {
19926
18069
  };
19927
18070
  });
19928
18071
  var require_cross_spawn = __commonJS((exports, module) => {
19929
- var cp = __require2("child_process");
18072
+ var cp = __require3("child_process");
19930
18073
  var parse5 = require_parse();
19931
18074
  var enoent = require_enoent();
19932
18075
  function spawn2(command, args, options) {
@@ -29672,7 +27815,7 @@ class StreamableHTTPClientTransport {
29672
27815
  }
29673
27816
  var DEFAULT_CLIENT_INFO = {
29674
27817
  name: "letta-code",
29675
- version: "0.30.28"
27818
+ version: "0.31.7"
29676
27819
  };
29677
27820
  async function connectMcpServer(config2, options = {}) {
29678
27821
  let client = new Client(options.clientInfo ?? DEFAULT_CLIENT_INFO);
@@ -30539,6 +28682,12 @@ async function prompt(message, agentId, options = {}) {
30539
28682
  session.close();
30540
28683
  }
30541
28684
  }
28685
+ function query(params) {
28686
+ return new LettaAgentClient({
28687
+ backend: "local",
28688
+ appServer: { harnessBackend: "api" }
28689
+ }).query(params);
28690
+ }
30542
28691
  async function listMessagesDirect(agentId, options = {}) {
30543
28692
  const session = new LettaAgentClient().resumeSession(agentId, {
30544
28693
  permissionMode: "unrestricted"
@@ -30589,6 +28738,7 @@ export {
30589
28738
  readStringArrayParam,
30590
28739
  readNumberParam,
30591
28740
  readBooleanParam,
28741
+ query,
30592
28742
  prompt,
30593
28743
  listMessagesDirect,
30594
28744
  jsonResult,
@@ -30606,4 +28756,4 @@ export {
30606
28756
  CloudManagedSandboxExpiredError
30607
28757
  };
30608
28758
 
30609
- //# debugId=AF3ED7182522AA2C64756E2164756E21
28759
+ //# debugId=2918106B6A681DDF64756E2164756E21