From fd7ca1806653368153acb5de9bd282b6b5a3cb54 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Sat, 24 Jan 2026 20:10:40 -0800 Subject: [PATCH] fix: patch default model (#670) Co-authored-by: Letta --- src/agent/model.ts | 16 ++++++++++++++++ src/cli/commands/registry.ts | 16 ++++++++-------- src/index.ts | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/agent/model.ts b/src/agent/model.ts index dcd2fb9..f0a0e83 100644 --- a/src/agent/model.ts +++ b/src/agent/model.ts @@ -40,6 +40,22 @@ export function getDefaultModel(): string { return firstModel.handle; } +/** + * Get the default model handle based on billing tier. + * Free tier users get glm-4.7, everyone else gets the standard default. + * @param billingTier - The user's billing tier (e.g., "free", "pro", "enterprise") + * @returns The model handle to use as default + */ +export function getDefaultModelForTier(billingTier?: string | null): string { + // Free tier gets glm-4.7 (a free model) + if (billingTier?.toLowerCase() === "free") { + const freeDefault = models.find((m) => m.id === "glm-4.7"); + if (freeDefault) return freeDefault.handle; + } + // Everyone else (pro, enterprise, unknown) gets the standard default + return getDefaultModel(); +} + /** * Format available models for error messages */ diff --git a/src/cli/commands/registry.ts b/src/cli/commands/registry.ts index 416b73f..22af551 100644 --- a/src/cli/commands/registry.ts +++ b/src/cli/commands/registry.ts @@ -68,12 +68,12 @@ export const commands: Record = { return "Opening message search..."; }, }, - "/plan": { - desc: "Enter plan mode", + "/connect": { + desc: "Connect your LLM API keys (OpenAI, Anthropic, etc.)", order: 17, handler: () => { - // Handled specially in App.tsx - return "Entering plan mode..."; + // Handled specially in App.tsx - opens ProviderSelector + return "Opening provider connection..."; }, }, "/clear": { @@ -263,12 +263,12 @@ export const commands: Record = { }, // === Session management (order 40-49) === - "/connect": { - desc: "Connect your LLM API keys (OpenAI, Anthropic, etc.)", + "/plan": { + desc: "Enter plan mode", order: 40, handler: () => { - // Handled specially in App.tsx - opens ProviderSelector - return "Opening provider connection..."; + // Handled specially in App.tsx + return "Entering plan mode..."; }, }, "/disconnect": { diff --git a/src/index.ts b/src/index.ts index a28b75d..89f6072 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1514,8 +1514,37 @@ async function main(): Promise { return; } - // Use selected server model (from self-hosted model picker) if available - const effectiveModel = selectedServerModel || model; + // Determine effective model: + // 1. Use selectedServerModel if user picked from self-hosted picker + // 2. Use model if --model flag was passed + // 3. Otherwise, use billing-tier-aware default (free tier gets glm-4.7) + let effectiveModel = selectedServerModel || model; + if (!effectiveModel && !selfHostedBaseUrl) { + // On Letta API without explicit model - check billing tier for appropriate default + const { getDefaultModelForTier } = await import("./agent/model"); + let billingTier: string | null = null; + try { + const baseURL = + process.env.LETTA_BASE_URL || + settings.env?.LETTA_BASE_URL || + LETTA_CLOUD_API_URL; + const apiKey = + process.env.LETTA_API_KEY || settings.env?.LETTA_API_KEY; + const response = await fetch(`${baseURL}/v1/metadata/balance`, { + headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : {}, + }); + if (response.ok) { + const data = (await response.json()) as { + billing_tier?: string; + }; + billingTier = data.billing_tier ?? null; + } + } catch { + // Ignore - will use standard default + } + effectiveModel = getDefaultModelForTier(billingTier); + } + const updateArgs = getModelUpdateArgs(effectiveModel); const result = await createAgent( undefined,