Skip to content

Commit a42c2ca

Browse files
Sync public snapshot from freebuff-private
Source: CodebuffAI/freebuff-private@d879ad7e69641d25107980706d4626d9d5e57cdd
1 parent 0f7e29f commit a42c2ca

6 files changed

Lines changed: 106 additions & 26 deletions

File tree

agents/base-chat.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ End every response by calling the suggest_followups tool with exactly 3 followup
6262
// budget below lands on exactly 400k. Without this Luna took
6363
// DEFAULT_CONTEXT_WINDOW and got a 52k budget on a million-token model.
6464
'openai/gpt-5.6-luna': 1_000_000,
65+
'openai/gpt-5.6-luna-es': 372_000,
6566
'meta/muse-spark-1.2-contributor': 1_000_000,
6667
// Ox Alpha: 1,048,576 published, entered low for the same reason.
6768
'stealth/ox-alpha': 1_000_000,

bun.lock

Lines changed: 48 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/src/__tests__/free-agents.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,7 @@ describe('every freebuff root agent declares a prompt opening', () => {
685685
'base2-free-glm': BASE2,
686686
// God-only Kimi K3 test root; createBase2('free', …) like its siblings.
687687
'base2-free-kimi-k3-eco': BASE2,
688+
'base2-free-luna-es': BASE2,
688689
// Limited-offer trial root; createBase2('free', …) like its siblings.
689690
'base2-free-fable': BASE2,
690691
// Extended-context `-max` roots; createBase2('free', …) like their

common/src/constants/free-agents.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
FREEBUFF_DEEPSEEK_V4_PRO_MAX_MODEL_ID,
1717
FREEBUFF_GPT_5_6_LUNA_MAX_MODEL_ID,
1818
FREEBUFF_KIMI_K3_ECO_MODEL_ID,
19+
FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID,
1920
FREEBUFF_MINIMAX_M3_MODEL_ID,
2021
FREEBUFF_MUSE_SPARK_12_CONTRIBUTOR_MODEL_ID,
2122
FREEBUFF_OX_ALPHA_MODEL_ID,
@@ -124,6 +125,7 @@ export const FREEBUFF_WEB_BASE3_AGENT_ID_BY_MODEL: Record<string, string> = {
124125
[FREEBUFF_GPT_5_6_LUNA_MODEL_ID]: 'base3-free-luna',
125126
[FREEBUFF_GLM_V52_MODEL_ID]: 'base3-free-glm',
126127
[FREEBUFF_KIMI_K3_ECO_MODEL_ID]: 'base3-free-kimi-k3-eco',
128+
[FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID]: 'base3-free-luna-es',
127129
[FREEBUFF_MUSE_SPARK_12_CONTRIBUTOR_MODEL_ID]: 'base3-free-muse-spark',
128130
[FREEBUFF_OX_ALPHA_MODEL_ID]: 'base3-free-ox-alpha',
129131
}
@@ -307,6 +309,7 @@ export const FREEBUFF_ROOT_AGENT_IDS = [
307309
'base2-free-luna',
308310
'base2-free-glm',
309311
'base2-free-kimi-k3-eco',
312+
'base2-free-luna-es',
310313
// Extended-context `-max` roots. Listed here for the same reason every other
311314
// root is: a root absent from this list is treated as a subagent, so a
312315
// top-level request on one fails the hierarchy check with
@@ -353,6 +356,7 @@ export const FREEBUFF_ROOT_AGENT_IDS = [
353356
'base3-free-luna',
354357
'base3-free-glm',
355358
'base3-free-kimi-k3-eco',
359+
'base3-free-luna-es',
356360
'base3-free-muse-spark',
357361
'base3-free-ox-alpha',
358362
// Freebuff CLI base3 roots. Every other id it needs is already above,
@@ -375,6 +379,7 @@ export const FREEBUFF_ROOT_AGENT_ID_BY_MODEL: Record<string, string> = {
375379
[FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID]: 'base2-free-deepseek-flash',
376380
[FREEBUFF_GLM_V52_MODEL_ID]: 'base2-free-glm',
377381
[FREEBUFF_KIMI_K3_ECO_MODEL_ID]: 'base2-free-kimi-k3-eco',
382+
[FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID]: 'base2-free-luna-es',
378383
[FREEBUFF_FABLE_5_MODEL_ID]: 'base2-free-fable',
379384
[FREEBUFF_MUSE_SPARK_12_CONTRIBUTOR_MODEL_ID]: 'base2-free-muse-spark',
380385
[FREEBUFF_OX_ALPHA_MODEL_ID]: 'base2-free-ox-alpha',
@@ -512,6 +517,12 @@ export const FREE_MODE_AGENT_MODELS: Record<string, Set<string>> = {
512517
'base2-free-luna': new Set([FREEBUFF_GPT_5_6_LUNA_MODEL_ID]),
513518
'base2-free-glm': new Set([FREEBUFF_GLM_V52_MODEL_ID]),
514519
'base2-free-kimi-k3-eco': new Set([FREEBUFF_KIMI_K3_ECO_MODEL_ID]),
520+
// Novita's `-es` route. Pinned to the one model like every other root. It is
521+
// a Codex session rather than Luna (see web/src/llm-api/novita.ts), so it is
522+
// deliberately NOT reachable from `base2-free-luna` — the two must never
523+
// share a root, or a Luna request could land on Codex.
524+
'base2-free-luna-es': new Set([FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID]),
525+
'base3-free-luna-es': new Set([FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID]),
515526
// Extended-context roots for the provisioned `-max` tiers. Pinned one model
516527
// each like every other root, and not in any client catalog: these are
517528
// provisioned per-account rather than rendered from a picker, so a client

common/src/constants/freebuff-models.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,23 @@ export const FREEBUFF_GLM_V52_MODEL_ID = 'z-ai/glm-5.2'
191191
* (agents/constants.ts) is this same model id, so keying either off the model
192192
* alone would change Codebuff's paid lite mode as a side effect. */
193193
export const FREEBUFF_GPT_5_6_LUNA_MODEL_ID = 'openai/gpt-5.6-luna'
194+
/**
195+
* The Novita `-es` route. GOD-ONLY, and NOT a cheaper GPT-5.6 Luna.
196+
*
197+
* Its own id rather than a second lane under Luna's, because it is a different
198+
* model: measured 2026-08-21 it answers "I'm Codex, an OpenAI coding agent
199+
* based on GPT-5", volunteers Codex's internal tool names, and carries a fixed
200+
* ~4,450-token Codex system prompt we did not send. Serving that under Luna's
201+
* row would be the silent substitution the DeepSeek legacy/GA split exists to
202+
* prevent — and here the model says the quiet part out loud to any user who
203+
* asks what it is.
204+
*
205+
* A SECOND ID FOR THE SAME MODEL IS NORMALLY THE BUG (see GLM's note above:
206+
* an extra id is an extra door onto a quota pool). This is the opposite case —
207+
* one id per distinct model, kept apart precisely so neither can be mistaken
208+
* for the other. It is god-only, so it opens no pool.
209+
*/
210+
export const FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID = 'openai/gpt-5.6-luna-es'
194211
/** OpenRouter provider slug Luna prefers (first in `provider.order`). */
195212
export const FREEBUFF_GPT_5_6_LUNA_PROVIDER_ROUTE = 'openai'
196213
/** Price ceiling for Luna, USD per million tokens. Sent as OpenRouter's
@@ -722,6 +739,10 @@ export const FREEBUFF_MODEL_CONTEXT_WINDOWS: Record<string, number> = {
722739
// summarize rewrites history from the front and throws away the prompt cache
723740
// with it.
724741
[FREEBUFF_GPT_5_6_LUNA_MODEL_ID]: 1_000_000,
742+
// Novita publishes 372k for the `-es` route (their /v1/models, 2026-08-21),
743+
// far below Luna's own 1M — it is a Codex session, not the Luna API model.
744+
// Sized from what the provider states rather than inherited from the name.
745+
[FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID]: 372_000,
725746
// Meta publishes 1,048,576 for every Muse Spark variant. Entered as 1_000_000
726747
// for the same reason Luna is: it stays on the safe side of the asymmetry
727748
// above while remaining an honest order of magnitude, where falling through
@@ -1067,6 +1088,27 @@ const GLM_V52_MODEL = {
10671088
* routing, billing, and the CROF_MODEL_MAP entry. If the full K3 is ever added
10681089
* as its own row, this label has to be disambiguated at that point.
10691090
*/
1091+
const GPT_5_6_LUNA_ES_MODEL = {
1092+
id: FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID,
1093+
// Named for what it IS. "Luna" appears nowhere: the route answers "Codex" when
1094+
// asked, so a row calling it Luna would be contradicted by the model itself.
1095+
displayName: 'Codex (test)',
1096+
tagline: 'Novita route — evaluation only',
1097+
availability: 'always',
1098+
// No AI-training claim either way: the supplier has no resale agreement for
1099+
// this route, so we have no data-use terms to pass on. `service` is the
1100+
// conservative reading — we are not asserting a training warning we cannot
1101+
// substantiate, and not asserting safety we cannot either.
1102+
dataUse: 'service',
1103+
// TRUE so it cannot fall into FREEBUFF_STANDARD_MODEL_IDS, which is derived
1104+
// as `WEB_ALL.filter(m => !m.premium)` — the UNMETERED pool. God-only is the
1105+
// gate; this flag is what stops the row becoming free inference if the gate
1106+
// is ever widened.
1107+
premium: true,
1108+
multimodal: false,
1109+
reasoningEffort: FREEBUFF_GPT_5_6_LUNA_REASONING_EFFORT,
1110+
} as const satisfies FreebuffModelOption
1111+
10701112
const KIMI_K3_ECO_MODEL = {
10711113
id: FREEBUFF_KIMI_K3_ECO_MODEL_ID,
10721114
displayName: 'Kimi K3',
@@ -1451,6 +1493,7 @@ export const FREEBUFF_WEB_MODELS = [
14511493

14521494
export const FREEBUFF_WEB_GOD_ONLY_MODELS = [
14531495
KIMI_K3_ECO_MODEL,
1496+
GPT_5_6_LUNA_ES_MODEL,
14541497
] as const satisfies readonly FreebuffModelOption[]
14551498

14561499
export const FREEBUFF_WEB_ALL_MODELS = [

common/src/constants/spend-providers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ export const SPEND_PROVIDER_IDS = [
5151
'meta',
5252
'minimax',
5353
'moonshot',
54+
'novita',
5455
'openai',
5556
'opencode-zen',
5657
'openrouter',
@@ -102,6 +103,7 @@ const PROVIDER_LABELS: Partial<Record<SpendProviderId, string>> = {
102103
openrouter: 'OpenRouter',
103104
runinfra: 'RunInfra',
104105
siliconflow: 'SiliconFlow',
106+
novita: 'Novita',
105107
minimax: 'MiniMax',
106108
canopywave: 'CanopyWave',
107109
xiaomi: 'Xiaomi',

0 commit comments

Comments
 (0)