Skip to content

Commit fef13ad

Browse files
Sync public snapshot from freebuff-private
Source: CodebuffAI/freebuff-private@012a1fd5306a72eac1d88e720fbbfa2119cf556f
1 parent ade06a3 commit fef13ad

7 files changed

Lines changed: 61 additions & 60 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ Freebuff includes a curated model catalog. The regular picker currently offers:
3737
| **DeepSeek V4 Flash 07/31** | Full access | The default everywhere in full mode; fast coding and tool use |
3838
| **GPT-5.6 Luna** | Full access | Strong all-around with native images; two sessions a day |
3939
| **MiMo 2.5** | Full and limited access | The limited-mode default; balanced performance with image support |
40-
| **DeepSeek V4 Pro** | Full access | Deepest reasoning; one session a day, paused during peak hours |
40+
| **DeepSeek V4 Pro** | Full access | Deepest reasoning; one session a day |
4141

42-
These limits are **temporary**, and they exist because the providers serving DeepSeek now charge more than free mode can carry. V4 Pro is one session a day and paused during peak hours, when V4 Flash covers those hours instead; GPT-5.6 Luna is two sessions a day; models may serve from a quantized (Q8_0) build. MiMo 2.5 stays unlimited. All of it is intended to be reverted.
42+
These limits are **temporary**, and they exist because the providers serving DeepSeek now charge more than free mode can carry. V4 Pro is one session a day; GPT-5.6 Luna is two sessions a day; models may serve from a quantized (Q8_0) build. MiMo 2.5 stays unlimited. All of it is intended to be reverted.
4343

4444
Beyond the regular picker:
4545

README.zh-CN.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ Freebuff 提供经过筛选的模型目录。常规模型选择器目前包括
3737
| **DeepSeek V4 Flash 07/31** | 完整访问 | 完整模式下所有平台的默认模型;快速编程和工具调用 |
3838
| **GPT-5.6 Luna** | 完整访问 | 综合能力强,原生支持图像;每天两次会话 |
3939
| **MiMo 2.5** | 完整和受限访问 | 受限模式的默认模型;均衡性能并支持图像 |
40-
| **DeepSeek V4 Pro** | 完整访问 | 推理最深入;每天一次会话,高峰时段停用 |
40+
| **DeepSeek V4 Pro** | 完整访问 | 推理最深入;每天一次会话 |
4141

42-
以下限制是**临时**的,原因是为 DeepSeek 提供服务的供应商收费已超出免费模式可承受的范围。V4 Pro 每天一次会话,并在高峰时段停用,此时由 V4 Flash 接替使用;GPT-5.6 Luna 每天两次会话;模型可能由量化(Q8_0)版本提供服务。MiMo 2.5 保持无限使用。这些调整都计划在之后恢复。
42+
以下限制是**临时**的,原因是为 DeepSeek 提供服务的供应商收费已超出免费模式可承受的范围。V4 Pro 每天一次会话;GPT-5.6 Luna 每天两次会话;模型可能由量化(Q8_0)版本提供服务。MiMo 2.5 保持无限使用。这些调整都计划在之后恢复。
4343

4444
常规模型选择器之外:
4545

bun.lock

Lines changed: 1 addition & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/src/__tests__/freebuff-models.test.ts

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -310,26 +310,39 @@ describe('freebuff model availability', () => {
310310
* old availability onto the new row would produce, closing the catalog's two
311311
* strongest models for ten hours a day.
312312
*/
313-
test('at peak V4 Pro closes and V4 Flash stays open', () => {
314-
// 02:00 UTC — inside the window. 12:00 UTC — outside it.
315-
const peak = new Date('2026-08-21T02:00:00Z')
316-
const offPeak = new Date('2026-08-21T12:00:00Z')
317-
313+
/**
314+
* THE invariant, restated as what it has always really been: V4 Pro and V4
315+
* Flash are never closed at the same time.
316+
*
317+
* Which one closes has flipped three times in two days, each time following
318+
* the LANE — a row is shut at peak only while served by a provider that
319+
* doubles there. Pinning the assertion to a particular row made it a
320+
* tripwire for every lane move; pinning it to the pair keeps the property
321+
* that actually protects users, which is that the catalog's two strongest
322+
* models are never dark together.
323+
*
324+
* Both are `always` as of 2026-08-22, with Pro on a flat-priced lane.
325+
*/
326+
test('V4 Pro and V4 Flash are never both closed', () => {
327+
for (const hour of [0, 2, 5, 9, 10, 12, 18, 23]) {
328+
const at = new Date(Date.UTC(2026, 7, 22, hour, 0, 0))
329+
const pro = isFreebuffSessionModelAvailable(
330+
FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID,
331+
at,
332+
)
333+
const flash = isFreebuffSessionModelAvailable(
334+
FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID,
335+
at,
336+
)
337+
expect(pro || flash, `both closed at ${hour}:00 UTC`).toBe(true)
338+
}
339+
// Today specifically: neither closes at all.
340+
const peak = new Date('2026-08-22T02:00:00Z')
318341
expect(
319342
isFreebuffSessionModelAvailable(FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID, peak),
320-
).toBe(false)
321-
expect(
322-
isFreebuffSessionModelAvailable(FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID, peak),
323343
).toBe(true)
324-
// Both open outside it.
325344
expect(
326-
isFreebuffSessionModelAvailable(
327-
FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID,
328-
offPeak,
329-
),
330-
).toBe(true)
331-
expect(
332-
isFreebuffSessionModelAvailable(FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID, offPeak),
345+
isFreebuffSessionModelAvailable(FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID, peak),
333346
).toBe(true)
334347
})
335348

@@ -339,22 +352,21 @@ describe('freebuff model availability', () => {
339352
* FALLBACK_FREEBUFF_MODEL_ID (the unlimited row), which would defeat the
340353
* point of closing it.
341354
*/
342-
test('a V4 Pro pick lands on Flash at peak, not on the unlimited row', () => {
343-
// Closing Pro is only worth doing if its traffic lands on the other PREMIUM
344-
// reasoning row rather than stepping all the way down to the unlimited one.
345-
// The pointer ran Flash -> Pro for one day, while Flash was the closed row;
346-
// it reverses with the closure, or it aims traffic at a shut model.
355+
/**
356+
* ARMED, NOT DELETED. `unavailableFallback` is what stops a closed row
357+
* dumping its traffic on the unlimited model instead of the other premium
358+
* one, and it has been needed twice — Flash -> Pro, then Pro -> Flash — as
359+
* the closure followed the lane. Nothing declares it today because nothing
360+
* closes, so this asserts the mechanism rather than a particular pair.
361+
*/
362+
test('any row that closes redirects to an OPEN premium row, not the unlimited one', () => {
347363
const peak = new Date('2026-08-22T02:00:00Z')
348-
const offPeak = new Date('2026-08-22T12:00:00Z')
349-
350-
expect(
351-
resolveAvailableFreebuffModel(FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID, peak),
352-
).toBe(FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID)
353-
// Untouched outside the window — the redirect is the exception, not the
354-
// steady state.
355-
expect(
356-
resolveAvailableFreebuffModel(FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID, offPeak),
357-
).toBe(FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID)
364+
for (const model of FREEBUFF_MODELS) {
365+
if (isFreebuffSessionModelAvailable(model.id, peak)) continue
366+
const landed = resolveAvailableFreebuffModel(model.id, peak)
367+
expect(landed, `${model.id} redirect`).not.toBe(model.id)
368+
expect(isFreebuffSessionModelAvailable(landed, peak)).toBe(true)
369+
}
358370
})
359371

360372
/**

common/src/constants/freebuff-models.ts

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -812,27 +812,18 @@ const DEEPSEEK_V4_PRO_MODEL = {
812812
// instead of ranking it. "Smartest" read as a recommendation the rest of the
813813
// catalog no longer makes.
814814
tagline: 'Deep reasoning',
815-
// CLOSED 00:00-10:00 UTC (5pm-3am Pacific) again as of 2026-08-22 — see
816-
// DEEPSEEK_EXPENSIVE_WINDOW_UTC. This tracks the LANE, not a change of heart:
817-
// Pro briefly reopened at peak while it was served by a flat-priced gateway,
818-
// and it is back on DeepSeek direct, which doubles every rate inside that
819-
// window. The hour of lead-in matters for the same reason it always did — a
820-
// session admitted just before peak keeps its model for a full hour.
815+
// ALWAYS as of 2026-08-22, and this tracks the LANE rather than a change of
816+
// policy — the third time this row has moved, always for the same reason.
817+
// Pro is closed at peak only while it is served by a provider that doubles
818+
// there. It is back on Cheaper Inference, whose card is FLAT, so there is no
819+
// expensive window to hide from and a ten-hour closure would cost users the
820+
// model for nothing.
821821
//
822-
// PAIRED WITH V4 FLASH, which reopens in the same commit. The two rows must
823-
// never be closed at once: they are the catalog's two strongest models, and
824-
// shutting both for ten hours a day leaves the premium pool with nothing to
825-
// spend on. Change one, check the other.
826-
availability: 'off_peak_only',
827-
// Where a Pro pick goes during those ten hours. Without this it falls to
828-
// FALLBACK_FREEBUFF_MODEL_ID — the unlimited row — which is a bigger step
829-
// down than the situation calls for: the user picked a premium reasoning
830-
// model, and the other premium reasoning model is open. Both draw the same
831-
// pool, so the redirect spends exactly what the original would have.
832-
//
833-
// The pointer ran Flash -> Pro for one day, while Flash was the closed row.
834-
// It has to reverse with the closure, or it aims traffic at a shut model.
835-
unavailableFallback: FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID,
822+
// THE PAIRING STILL HOLDS: V4 Flash is `always` too, so neither is shut. The
823+
// rule that matters is that these two are never closed at once, not that one
824+
// of them always is — if Pro ever returns to DeepSeek direct, close it again
825+
// and check Flash in the same commit.
826+
availability: 'always',
836827
warning: FREEBUFF_AI_TRAINING_NOTICE,
837828
dataUse: 'training',
838829
premium: true,

common/src/util/freebuff-model-availability.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export const FREEBUFF_PAUSED_MODEL_NOTICE =
5959
* our costs rather than anything they did.
6060
*/
6161
export const FREEBUFF_TIER_CHANGE_NOTICE =
62-
'V4 Pro pauses at peak times and is 1 session a day; GPT-5.6 Luna is 2. V4 Flash stays available all day. —❤️ Freebuff Team'
62+
'V4 Pro is 1 session a day and GPT-5.6 Luna is 2. Everything else is unmetered. —❤️ Freebuff Team'
6363

6464
const PRIVACY_SIGNAL_LABELS: Partial<Record<FreebuffIpPrivacySignal, string>> =
6565
{

freebuff/cli/release/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ freebuff
2929

3030
**How can it be free?** Freebuff is supported by text ads.
3131

32-
**What models do you use?** In full mode, the regular picker includes DeepSeek V4 Flash 07/31, GPT-5.6 Luna, MiMo 2.5, and DeepSeek V4 Pro. DeepSeek V4 Flash 07/31 is the CLI default, and the picker falls back to MiMo 2.5 once your daily premium sessions are used up. Limited mode uses MiMo 2.5. These limits are temporary and exist because the providers serving DeepSeek now charge more than free mode can carry: V4 Pro is one session a day and paused during peak hours, GPT-5.6 Luna is two sessions a day, and models may serve from a quantized (Q8_0) build.
32+
**What models do you use?** In full mode, the regular picker includes DeepSeek V4 Flash 07/31, GPT-5.6 Luna, MiMo 2.5, and DeepSeek V4 Pro. DeepSeek V4 Flash 07/31 is the CLI default, and the picker falls back to MiMo 2.5 once your daily premium sessions are used up. Limited mode uses MiMo 2.5. These limits are temporary and exist because the providers serving DeepSeek now charge more than free mode can carry: V4 Pro is one session a day, GPT-5.6 Luna is two sessions a day, and models may serve from a quantized (Q8_0) build.
3333

3434
**Which countries is Freebuff available in?** All countries. Freebuff runs in "full" mode in the US, Canada, UK, EU, and other select countries, and in "limited" mode everywhere else (or while using a VPN). See [freebuff.com](https://freebuff.com) for the full list.
3535

0 commit comments

Comments
 (0)