Default new agents to GPT-5.6 Luna Fast (#2683)

Co-authored-by: vercel-gh-bot-2[bot] <282331341+vercel-gh-bot-2[bot]@users.noreply.github.com>
Co-authored-by: AndrewBarba <1316152+AndrewBarba@users.noreply.github.com>
This commit is contained in:
vercel-gh-bot-2[bot]
2026-08-27 15:39:11 -07:00
committed by GitHub
parent 3e95a2706c
commit c77faa55eb
10 changed files with 28 additions and 24 deletions
@@ -0,0 +1,5 @@
---
"eve": patch
---
Use `openai/gpt-5.6-luna-fast` as the default model for config-less agents, new projects, and the setup model picker.
+1 -3
View File
@@ -21,9 +21,7 @@ For a static AI Gateway model ID, you can make the same source change from the
project root with `eve set --model anthropic/claude-opus-4.8` or from the local
dev TUI with `/model anthropic/claude-opus-4.8`.
The root `agent.ts` can be omitted when no runtime config is needed. eve then selects its default `agent.ts` source at the same slot, configured with `zai/glm-5.2`; authoring the file replaces that source. GLM 5.2 does not support image input; choose a
vision-capable model or [route image inputs to Gemini
Flash](./guides/dynamic-capabilities#route-image-inputs-to-a-vision-model).
The root `agent.ts` can be omitted when no runtime config is needed. eve then selects its default `agent.ts` source at the same slot, configured with `openai/gpt-5.6-luna-fast`; authoring the file replaces that source.
When `agent.ts` is present, `model` is required.
A config that selects a static Gateway model is compile-only. A config that contains a dynamic model or a direct-provider `LanguageModel` remains a runtime entry because eve must resolve that authored value while the agent runs. See [Authored module lifecycle](./reference/typescript-api#authored-module-lifecycle).
+1 -1
View File
@@ -54,7 +54,7 @@ After scaffolding, a human terminal usually continues into `eve dev`. If a codin
| Flag | Type | Default | Description |
| ---------------------- | ------ | ---------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `--model <model>` | string | `zai/glm-5.2` | Set the root agent's AI Gateway model ID. |
| `--model <model>` | string | `openai/gpt-5.6-luna-fast` | Set the root agent's AI Gateway model ID. |
| `--reasoning <effort>` | enum | provider default | Set reasoning to `none`, `minimal`, `low`, `medium`, `high`, or `xhigh`. `provider-default` leaves the field unauthored. |
| `--channel-web-nextjs` | flag | off | Add the Web Chat app (Next.js). Not for existing projects — run `eve add channel/web` there instead. |
@@ -59,7 +59,7 @@ describe("initAgentInstructions", () => {
describe("initAgentReadySummary", () => {
it("reports the model and generated instructions path", () => {
expect(stripAnsi(initAgentReadySummary(undefined, "/app"))).toBe(
"✓ Model zai/glm-5.2 (eve default)\n✓ Instructions /app/agent/instructions.md",
"✓ Model openai/gpt-5.6-luna-fast (eve default)\n✓ Instructions /app/agent/instructions.md",
);
expect(stripAnsi(initAgentReadySummary("openai/gpt-5.5", "/app"))).toContain(
"✓ Model openai/gpt-5.5\n",
@@ -55,10 +55,10 @@ const CATALOG: GatewayCatalogModel[] = [
tags: ["web-search"],
},
{
id: "zai/glm-5.2",
name: "GLM 5.2",
id: "openai/gpt-5.6-luna-fast",
name: "GPT-5.6 Luna Fast",
type: "language",
owned_by: "zai",
owned_by: "openai",
released: 100,
tags: ["reasoning"],
},
@@ -110,14 +110,14 @@ describe("modelOptionsFromCatalog", () => {
const options = modelOptionsFromCatalog(CATALOG);
expect(options.map((option) => option.value)).toEqual([
"zai/glm-5.2",
"openai/gpt-5.6-luna-fast",
"zai/glm-4.6",
"openai/gpt-5-mini",
]);
expect(options.filter((option) => option.featured).map((o) => o.value)).toEqual([
"zai/glm-5.2",
"openai/gpt-5.6-luna-fast",
]);
expect(options[0]?.hint).toBe("Z.AI");
expect(options[0]?.hint).toBe("OpenAI");
});
it("falls back to the static shortlist without a catalog or matches", () => {
@@ -149,7 +149,7 @@ describe("selectModel box", () => {
let captured: SingleSelectOptions<PrompterValue> | undefined;
const { prompter } = createSelectPrompter((opts) => {
captured = opts;
return "zai/glm-5.2";
return "openai/gpt-5.6-luna-fast";
});
const box = selectModel({ asker: interactiveAsker(prompter), deps: catalogDeps() });
@@ -157,16 +157,16 @@ describe("selectModel box", () => {
expect(result.kind).toBe("done");
if (result.kind !== "done") return;
expect(result.state.modelId).toBe("zai/glm-5.2");
expect(result.state.modelId).toBe("openai/gpt-5.6-luna-fast");
expect(captured?.search).toBe(true);
// The featured default remains first; the rest are newest release first.
expect(captured?.options.map((option) => option.value)).toEqual([
"zai/glm-5.2",
"openai/gpt-5.6-luna-fast",
"zai/glm-4.6",
"openai/gpt-5-mini",
]);
// Cursor defaults to the top catalog entry when no default is configured.
expect(captured?.initialValue).toBe("zai/glm-5.2");
expect(captured?.initialValue).toBe("openai/gpt-5.6-luna-fast");
});
it("orders the curated shortlist first, marks it featured, and pre-selects the default", async () => {
@@ -194,7 +194,7 @@ describe("selectModel box", () => {
expect(result.kind).toBe("done");
if (result.kind !== "done") return;
expect(captured?.options.map((option) => option.value)).toEqual([
"zai/glm-5.2",
"openai/gpt-5.6-luna-fast",
"anthropic/claude-opus-4.8",
"zai/glm-4.6",
"openai/gpt-5-mini",
@@ -202,7 +202,7 @@ describe("selectModel box", () => {
// Only the curated entries are featured: the picker's default view shows
// them alone, and scrolling or search surfaces the rest of the catalog.
expect(captured?.options.filter((option) => option.featured).map((o) => o.value)).toEqual([
"zai/glm-5.2",
"openai/gpt-5.6-luna-fast",
"anthropic/claude-opus-4.8",
]);
expect(captured?.initialValue).toBe(DEFAULT_AGENT_MODEL_ID);
+1 -1
View File
@@ -55,7 +55,7 @@ const FEATURED_MODEL_IDS: readonly string[] = [
];
const FALLBACK_MODELS: SelectOption<string>[] = [
modelOption(DEFAULT_AGENT_MODEL_ID, "GLM 5.2", "Z.AI"),
modelOption(DEFAULT_AGENT_MODEL_ID, "GPT-5.6 Luna Fast", "OpenAI"),
modelOption("anthropic/claude-opus-4.8", "Claude Opus 4.8", "Anthropic"),
modelOption("openai/gpt-5.5", "GPT-5.5", "OpenAI"),
modelOption("google/gemini-3.5", "Gemini 3.5", "Google", false),
+4 -4
View File
@@ -23,10 +23,10 @@ const APP_ROOT = "/app/my-agent";
const CATALOG: GatewayCatalogModel[] = [
{
id: "zai/glm-5.2",
name: "GLM 5.2",
id: "openai/gpt-5.6-luna-fast",
name: "GPT-5.6 Luna Fast",
type: "language",
owned_by: "zai",
owned_by: "openai",
tags: ["reasoning"],
},
{
@@ -433,7 +433,7 @@ describe("runModelFlow", () => {
expect(captured?.model).toEqual({
kind: "pick",
options: expect.arrayContaining([
expect.objectContaining({ value: "zai/glm-5.2", featured: true }),
expect.objectContaining({ value: "openai/gpt-5.6-luna-fast", featured: true }),
expect.objectContaining({ value: "anthropic/claude-sonnet-5" }),
expect.objectContaining({ value: "test/no-frills" }),
]),
@@ -2,4 +2,4 @@
* Model used when an agent does not declare one, baked in by `eve init`, and
* pre-selected in the setup model picker.
*/
export const DEFAULT_AGENT_MODEL_ID = "zai/glm-5.2";
export const DEFAULT_AGENT_MODEL_ID = "openai/gpt-5.6-luna-fast";
@@ -47,7 +47,7 @@ const ROOT_TYPE_DEFINITIONS = fileURLToPath(
const TSC_BIN_PATH = fileURLToPath(
new URL("../../../../node_modules/typescript/bin/tsc", import.meta.url),
);
const DEFAULT_AGENT_MODEL_ID = "zai/glm-5.2";
const DEFAULT_AGENT_MODEL_ID = "openai/gpt-5.6-luna-fast";
function applicationOwnedEntries<TEntry extends { readonly sourceId: string }>(
manifest: CompiledAgentManifest,
@@ -69,6 +69,7 @@ function collectGatewayModelIds(rootPaths: readonly string[]): ReadonlySet<strin
"anthropic/claude-opus-4.7",
"anthropic/claude-sonnet-5",
"zai/glm-5.2",
"openai/gpt-5.6-luna-fast",
"openai/gpt-5.4",
"openai/gpt-5.4-mini",
]);