Skip to content

Commit ea3c057

Browse files
Sync public snapshot from freebuff-private
Source: CodebuffAI/freebuff-private@a186b4d3778cc5fac6907d345479f1bae22ae999
1 parent e46bc82 commit ea3c057

12 files changed

Lines changed: 273 additions & 87 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Freebuff includes a curated model catalog. The regular picker currently offers:
3737
| **GPT-5.6 Luna** | Full access | The default in full mode; strong all-around with native images |
3838
| **DeepSeek V4 Flash 07/31** | Full access | Fast coding and tool use; pauses during peak hours |
3939
| **MiMo 2.5** | Full and limited access | The limited-mode default; balanced performance with image support |
40+
| **Ox Alpha** | Full and limited access | 1M context, no session cost; experimental — may be unreliable |
4041
| **DeepSeek V4 Pro** | Full access | Deepest reasoning; one session a day |
4142

4243
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.
@@ -60,7 +61,7 @@ Freebuff uses specialized agents instead of sending every task through one model
6061

6162
## Free access
6263

63-
Freebuff is available in every country. Supported regions receive full access; other regions and VPN users receive limited access, currently MiMo 2.5 with three one-hour sessions per day, earnable up to seven.
64+
Freebuff is available in every country. Supported regions receive full access; other regions and VPN users receive limited access, currently MiMo 2.5 and Ox Alpha with three one-hour sessions per day, earnable up to seven.
6465

6566
Text ads support the included models. Freebuff shows the applicable session limits and any model-specific data-use notice before you start.
6667

README.zh-CN.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Freebuff 提供经过筛选的模型目录。常规模型选择器目前包括
3737
| **GPT-5.6 Luna** | 完整访问 | 完整模式下的默认模型;综合能力强,原生支持图像 |
3838
| **DeepSeek V4 Flash 07/31** | 完整访问 | 快速编程和工具调用;高峰时段暂停 |
3939
| **MiMo 2.5** | 完整和受限访问 | 受限模式的默认模型;均衡性能并支持图像 |
40+
| **Ox Alpha** | 完整和受限访问 | 100 万上下文,不消耗会话;实验性功能,可能不稳定 |
4041
| **DeepSeek V4 Pro** | 完整访问 | 推理最深入;每天一次会话 |
4142

4243
以下限制是**临时**的,原因是为 DeepSeek 提供服务的供应商收费已超出免费模式可承受的范围。V4 Pro 每天一次会话;GPT-5.6 Luna 每天两次会话;模型可能由量化(Q8_0)版本提供服务。MiMo 2.5 保持无限使用。这些调整都计划在之后恢复。
@@ -60,7 +61,7 @@ Freebuff 使用专业化智能体,而不是把所有任务都交给同一个
6061

6162
## 免费访问
6263

63-
Freebuff 在所有国家和地区均可使用。受支持的地区提供完整访问;其他地区以及使用 VPN 的用户获得受限访问,目前包括 MiMo 2.5,每天可使用六个一小时会话。
64+
Freebuff 在所有国家和地区均可使用。受支持的地区提供完整访问;其他地区以及使用 VPN 的用户获得受限访问,目前包括 MiMo 2.5 和 Ox Alpha,每天可使用六个一小时会话。
6465

6566
内置模型由文字广告支持。开始前,Freebuff 会显示适用的会话限制以及模型特定的数据使用提示。
6667

agents/__tests__/base3.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import base3FreeGlm from '../base3-free-glm'
1515
import base3FreeLuna from '../base3-free-luna'
1616
import base3FreeMimo from '../base3-free-mimo'
1717
import base3FreeMinimaxM3 from '../base3-free-minimax-m3'
18+
import base3FreeOxAlpha from '../base3-free-ox-alpha'
1819
import base3Lite from '../base3-lite'
1920

2021
/**
@@ -46,11 +47,14 @@ const CLI_ROOTS = [
4647
base3FreeGlm,
4748
base3FreeLuna,
4849
base3FreeFable,
50+
base3FreeOxAlpha,
4951
]
5052

5153
describe('base3 CLI roots', () => {
5254
test('keeps the efficiency flags the runtime reads', () => {
53-
expect(CLI_ROOTS.length).toBe(11)
55+
// 12 since Ox Alpha reached the CLI on 2026-08-24. The count is asserted so
56+
// a root added without the flags below cannot slip in unnoticed.
57+
expect(CLI_ROOTS.length).toBe(12)
5458
for (const agent of CLI_ROOTS) {
5559
// Windowed reads + the 100-entry glob cap + search-first tool wording.
5660
expect(agent.windowedFileReads).toBe(true)

agents/base3-free-ox-alpha.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { FREEBUFF_OX_ALPHA_MODEL_ID } from '@codebuff/common/constants/freebuff-models'
2+
3+
import { createBase3CliRoot } from './base3'
4+
5+
/**
6+
* Buffy on Ox Alpha, for CLI and Desktop (2026-08-24).
7+
*
8+
* No `reasoningOptions`, for the reason spelled out on base3-free-luna: an
9+
* agent-declared reasoning reaches the wire as `body.reasoning` and makes the
10+
* agent the authority on effort, which leaves the user's picker choice unable
11+
* to do anything. That matters more here than on most rows -- this endpoint
12+
* reports `reasoning.mandatory: true` with `default_effort: max`, and `max`
13+
* costs ~4.8x the tokens of `high` for no better answer while being the rung
14+
* most likely to spend the whole budget thinking and return
15+
* `finish_reason: "length"` with null content. The catalog row names `high`
16+
* explicitly and the server fills it in; hard-coding anything here would take
17+
* that away.
18+
*/
19+
const definition = {
20+
...createBase3CliRoot({
21+
model: FREEBUFF_OX_ALPHA_MODEL_ID,
22+
isFreebuff: true,
23+
}),
24+
id: 'base3-free-ox-alpha',
25+
displayName: 'Buffy on Ox Alpha',
26+
}
27+
28+
export default definition
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { FREEBUFF_OX_ALPHA_MODEL_ID } from '@codebuff/common/constants/freebuff-models'
2+
3+
import { publisher } from '../constants'
4+
import type { SecretAgentDefinition } from '../types/secret-agent-definition'
5+
import { createReviewer } from './code-reviewer'
6+
7+
const definition: SecretAgentDefinition = {
8+
id: 'code-reviewer-ox-alpha',
9+
publisher,
10+
...createReviewer(FREEBUFF_OX_ALPHA_MODEL_ID),
11+
}
12+
13+
export default definition

bun.lock

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

cli/src/components/freebuff-model-selector.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,11 @@ export const FreebuffModelSelector: React.FC<FreebuffModelSelectorProps> = ({
624624
m.reasoningEffort ? 14 + m.reasoningEffort.length : 0
625625
// Same treatment for the " · NEW" badge (6 chars).
626626
const newSuffixLen = 6
627+
// Ox Alpha reached the CLI on 2026-08-24 as an experimental row. The badge is
628+
// the only promise we can keep about a model an anonymous host can reprice,
629+
// rename or withdraw without notice, so it has to survive the width maths the
630+
// same way NEW does -- an unaccounted suffix truncates the row it labels.
631+
const testSuffixLen = ' · TEST'.length
627632

628633
// Line 1, in each mode.
629634
const columnLabelLen = (m: FreebuffModelOption) =>
@@ -633,15 +638,17 @@ export const FreebuffModelSelector: React.FC<FreebuffModelSelectorProps> = ({
633638
m.tagline.length +
634639
reasoningSuffixLen(m) +
635640
multimodalSuffixLen(m) +
636-
(m.isNew ? newSuffixLen : 0)
641+
(m.isNew ? newSuffixLen : 0) +
642+
(m.experimental ? testSuffixLen : 0)
637643
const compactLabelLen = (m: FreebuffModelOption) =>
638644
2 +
639645
m.displayName.length +
640646
3 /* " · " */ +
641647
m.tagline.length +
642648
reasoningSuffixLen(m) +
643649
multimodalSuffixLen(m) +
644-
(m.isNew ? newSuffixLen : 0)
650+
(m.isNew ? newSuffixLen : 0) +
651+
(m.experimental ? testSuffixLen : 0)
645652

646653
// Line 2, or 0 for a row with no details. Centered in the card rather
647654
// than indented under line 1's details column — the notice is a footnote
@@ -971,6 +978,14 @@ export const FreebuffModelSelector: React.FC<FreebuffModelSelectorProps> = ({
971978
{' · NEW'}
972979
</span>
973980
)}
981+
{/* Warning-coloured rather than primary: NEW is an invitation, TEST
982+
is a caveat, and a user scanning the picker should be able to tell
983+
them apart without reading. */}
984+
{model.experimental && (
985+
<span fg={warningColor} attributes={TextAttributes.BOLD}>
986+
{' · TEST'}
987+
</span>
988+
)}
974989
</text>
975990
{details.length > 0 && (
976991
<text>

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

Lines changed: 62 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,83 +3,84 @@ import { describe, expect, test } from 'bun:test'
33

44
import { isFreeModeAllowedAgentModel } from '../constants/free-agents'
55
import {
6-
canFreebuffModelSpawnGeminiThinker,
76
DEFAULT_FREEBUFF_MODEL_ID,
87
DEFAULT_FREEBUFF_WEB_MODEL_ID,
98
FALLBACK_FREEBUFF_MODEL_ID,
10-
FREEBUFF_WEB_DEEMPHASIZED_MODEL_IDS,
119
FREEBUFF_DEEPSEEK_V4_FLASH_MODEL_ID,
1210
FREEBUFF_DEEPSEEK_V4_PRO_MODEL_ID,
1311
FREEBUFF_DESKTOP_SESSION_LIMITS,
14-
FREEBUFF_FABLE_5_MODEL_ID,
1512
FREEBUFF_ENABLE_MIMO_MODELS_IN_UI,
13+
FREEBUFF_FABLE_5_MODEL_ID,
1614
FREEBUFF_GLM_V52_MODEL_ID,
1715
FREEBUFF_GPT_5_6_LUNA_ES_MODEL_ID,
1816
FREEBUFF_GPT_5_6_LUNA_MAX_PRICE,
1917
FREEBUFF_GPT_5_6_LUNA_MODEL_ID,
2018
FREEBUFF_GPT_5_6_LUNA_PROVIDER_ROUTE,
2119
FREEBUFF_GPT_5_6_LUNA_REASONING_EFFORT,
2220
FREEBUFF_KIMI_K3_ECO_MODEL_ID,
21+
FREEBUFF_MIMO_V25_MODEL_ID,
22+
FREEBUFF_MODELS,
2323
FREEBUFF_MUSE_SPARK_12_CONTRIBUTOR_MODEL_ID,
2424
FREEBUFF_MUSE_SPARK_REASONING_EFFORT,
25-
getFreebuffModelReasoningEffort,
25+
FREEBUFF_OX_ALPHA_MODEL_ID,
26+
FREEBUFF_PER_MODEL_SESSION_CAPS,
27+
FREEBUFF_STANDARD_MODEL_IDS,
28+
FREEBUFF_WEB_ALL_MODELS,
29+
FREEBUFF_WEB_DEEMPHASIZED_MODEL_IDS,
30+
FREEBUFF_WEB_GOD_ONLY_MODELS,
31+
FREEBUFF_WEB_MODELS,
32+
FREEBUFF_WEB_RETIRED_PICKER_MODEL_IDS,
33+
LIMITED_FREEBUFF_MODEL_ID,
34+
LIMITED_FREEBUFF_MODEL_IDS,
2635
MUSE_SPARK_12_CONTRIBUTOR_UPSTREAM_MODEL_ID,
2736
MUSE_SPARK_FALLBACK_AFTER_MS,
2837
MUSE_SPARK_FALLBACK_MODEL_ID,
2938
MUSE_SPARK_FALLBACK_NOTICE,
30-
isMuseSparkModelId,
31-
LIMITED_FREEBUFF_MODEL_ID,
32-
LIMITED_FREEBUFF_MODEL_IDS,
33-
FREEBUFF_MIMO_V25_MODEL_ID,
34-
FREEBUFF_MODELS,
35-
FREEBUFF_WEB_GOD_ONLY_MODELS,
36-
FREEBUFF_WEB_ALL_MODELS,
37-
FREEBUFF_WEB_MODELS,
38-
FREEBUFF_WEB_RETIRED_PICKER_MODEL_IDS,
39-
FREEBUFF_STANDARD_MODEL_IDS,
4039
SUPPORTED_FREEBUFF_MODELS,
40+
canFreebuffModelSpawnGeminiThinker,
41+
freebuffWithdrawnModelMessage,
4142
getFreebuffDeploymentAvailabilityLabel,
4243
getFreebuffDesktopSessionBucket,
4344
getFreebuffModel,
4445
getFreebuffModelImageSupport,
45-
getFreebuffWebModel,
46+
getFreebuffModelReasoningEffort,
47+
getFreebuffModelSupersededBy,
4648
getFreebuffModelsForAccessTier,
49+
getFreebuffPerModelSessionCap,
50+
getFreebuffWebModel,
4751
getRecommendedFreebuffModelId,
4852
getRecommendedFreebuffWebModelId,
49-
isFreebuffWebDeemphasizedModelId,
5053
isFreebuffDeploymentHours,
5154
isFreebuffGlmV52ModelId,
5255
isFreebuffGpt56LunaModelId,
5356
isFreebuffLimitedOfferModelId,
54-
getFreebuffPerModelSessionCap,
55-
freebuffWithdrawnModelMessage,
57+
isFreebuffModelAllowedForAccessTier,
58+
isFreebuffModelId,
59+
isFreebuffMultimodalModelId,
5660
isFreebuffPausedFreeModelId,
61+
isFreebuffPremiumModelId,
5762
isFreebuffSessionModelAllowedForAccessTier,
5863
isFreebuffSessionModelAvailable,
59-
resolveAvailableFreebuffModel,
60-
FREEBUFF_PER_MODEL_SESSION_CAPS,
64+
isFreebuffSessionModelId,
6165
isFreebuffTracedModelId,
66+
isFreebuffWebDeemphasizedModelId,
6267
isFreebuffWebGeoExemptModelId,
63-
isFreebuffWebSelectableModelId,
64-
isFreebuffModelId,
65-
isFreebuffMultimodalModelId,
66-
isFreebuffModelAllowedForAccessTier,
67-
isFreebuffPremiumModelId,
6868
isFreebuffWebGodOnlyModelId,
69-
isFreebuffWebRememberableModelId,
7069
isFreebuffWebModelAllowedForLimitedTier,
7170
isFreebuffWebModelId,
7271
isFreebuffWebMultimodalModelId,
7372
isFreebuffWebPremiumModelId,
74-
resolveRememberedFreebuffWebModel,
73+
isFreebuffWebRememberableModelId,
74+
isFreebuffWebSelectableModelId,
75+
isMuseSparkModelId,
7576
isSupportedFreebuffModelId,
76-
isFreebuffSessionModelId,
77-
resolveFreebuffWebModel,
78-
resolveFreebuffWebModelForLimitedTier,
77+
migrateSupersededFreebuffModelPreference,
78+
resolveAvailableFreebuffModel,
7979
resolveFreebuffModelForAccessTier,
8080
resolveFreebuffSessionModelForAccessTier,
81-
getFreebuffModelSupersededBy,
82-
migrateSupersededFreebuffModelPreference,
81+
resolveFreebuffWebModel,
82+
resolveFreebuffWebModelForLimitedTier,
83+
resolveRememberedFreebuffWebModel,
8384
} from '../constants/freebuff-models'
8485
import type { FreebuffModelOption } from '../constants/freebuff-models'
8586
import { minimaxModels } from '../constants/model-config'
@@ -217,6 +218,20 @@ describe('freebuff model availability', () => {
217218
expect(isFreebuffTracedModelId(model.id)).toBe(
218219
model.dataUse === 'training',
219220
)
221+
// Ox Alpha is the ONE row where a warning does not imply a training
222+
// grant, and it entered this test's scope on 2026-08-24 by joining the
223+
// CLI catalog -- the exception used to hold for free because the row was
224+
// browser-only. Its host RETAINS prompts and does not train on them, so
225+
// `dataUse` stays 'service' (that is what drives trace storage, and
226+
// claiming a grant we were not given would be wrong in the direction
227+
// that changes behavior) while the warning still tells a user what they
228+
// want to know before pasting a private repo into an anonymous provider.
229+
// ox-alpha.test.ts pins the pairing so it reads as a decision.
230+
if (model.id === FREEBUFF_OX_ALPHA_MODEL_ID) {
231+
expect(model.dataUse).toBe('service')
232+
expect(model.warning).toBeDefined()
233+
continue
234+
}
220235
expect(model.warning !== undefined).toBe(model.dataUse === 'training')
221236
}
222237
})
@@ -1058,9 +1073,15 @@ describe('freebuff model availability', () => {
10581073

10591074
test('limited access exposes non-Pro MiMo 2.5, and not the paused Flash', () => {
10601075
expect(LIMITED_FREEBUFF_MODEL_ID).toBe(FREEBUFF_MIMO_V25_MODEL_ID)
1061-
expect(LIMITED_FREEBUFF_MODEL_IDS).toEqual([FREEBUFF_MIMO_V25_MODEL_ID])
1076+
// Ox Alpha joined on 2026-08-24. It costs this pool nothing extra: the
1077+
// limited tier is metered by REGION, not by model.
1078+
expect(LIMITED_FREEBUFF_MODEL_IDS).toEqual([
1079+
FREEBUFF_MIMO_V25_MODEL_ID,
1080+
FREEBUFF_OX_ALPHA_MODEL_ID,
1081+
])
10621082
expect(getFreebuffModelsForAccessTier('limited').map((m) => m.id)).toEqual([
10631083
FREEBUFF_MIMO_V25_MODEL_ID,
1084+
FREEBUFF_OX_ALPHA_MODEL_ID,
10641085
])
10651086
expect(
10661087
isFreebuffModelAllowedForAccessTier(
@@ -1301,7 +1322,14 @@ describe('freebuff model availability', () => {
13011322
expect(model.displayName).toContain(date)
13021323
}
13031324
// Nothing else claims to be new, or the badge stops meaning anything.
1304-
expect(catalog.filter((model) => model.isNew)).toHaveLength(dated.length)
1325+
// Ox Alpha is the one non-dated row carrying it: it joined the CLI catalog
1326+
// on 2026-08-24 having shipped four days earlier, so it is genuinely new to
1327+
// these surfaces even though its name carries no build date.
1328+
expect(
1329+
catalog.filter(
1330+
(model) => model.isNew && model.id !== FREEBUFF_OX_ALPHA_MODEL_ID,
1331+
),
1332+
).toHaveLength(dated.length)
13051333
})
13061334

13071335
test('migrates no saved pick anywhere, now that nothing supersedes', () => {

0 commit comments

Comments
 (0)