luckytri 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +2 -0
  3. package/README.md +2 -0
  4. package/docs/en/CHANGELOG.md +20 -13
  5. package/docs/en/guide.md +7 -5
  6. package/docs/en/her-life.md +2 -2
  7. package/docs/en/webui.md +1 -1
  8. package/docs/zh/CHANGELOG.md +20 -13
  9. package/docs/zh/guide.md +7 -5
  10. package/docs/zh/her-life.md +2 -2
  11. package/docs/zh/webui.md +1 -1
  12. package/package.json +2 -1
  13. package/public/app/assets/ChatsPage-CFMVozoG.css +1 -0
  14. package/public/app/assets/{ChatsPage-CshdtTzV.js → ChatsPage-DCYMkJ91.js} +2 -2
  15. package/public/app/assets/{Empty-C7yzOBzy.js → Empty-CLyZkxR5.js} +1 -1
  16. package/public/app/assets/{Empty-DmUB2-Bk.css → Empty-DIobYG3x.css} +1 -1
  17. package/public/app/assets/{Field-BjFv4Rfn.js → Field-BpaRwLI_.js} +1 -1
  18. package/public/app/assets/{HeartPage-eqo6ru16.js → HeartPage-BIOMTiwr.js} +1 -1
  19. package/public/app/assets/HeartPage-C-2jvgzF.css +1 -0
  20. package/public/app/assets/{LifePage-CN8GE5NK.js → LifePage-BCgM4JkR.js} +1 -1
  21. package/public/app/assets/LifePage-CG1OHbRK.css +1 -0
  22. package/public/app/assets/MemoryPage-C_Bu4rfb.css +1 -0
  23. package/public/app/assets/{MemoryPage-CCpMN4Wg.js → MemoryPage-vShvRqMt.js} +1 -1
  24. package/public/app/assets/NaturePage-CPZlImT0.css +1 -0
  25. package/public/app/assets/{NaturePage-C0JqdBTR.js → NaturePage-Cy9ptr4G.js} +2 -2
  26. package/public/app/assets/PeoplePage-3RRUITDz.css +1 -0
  27. package/public/app/assets/{PeoplePage-BXGBbO4u.js → PeoplePage-CUZekB2E.js} +1 -1
  28. package/public/app/assets/{PluginsPage-Dksp5AV5.js → PluginsPage-1RM4rmJP.js} +1 -1
  29. package/public/app/assets/{SystemPage-BenIyTvk.css → SystemPage-BI2CB5Ig.css} +1 -1
  30. package/public/app/assets/{SystemPage-Cd7aa8eE.js → SystemPage-BeT5TmIV.js} +1 -1
  31. package/public/app/assets/TimePage-C-guwPk2.css +1 -0
  32. package/public/app/assets/{TimePage-Bs_zImb4.js → TimePage-taTmPMM8.js} +2 -2
  33. package/public/app/assets/{index-BHZcHUMh.css → index-DY5AM0Hz.css} +1 -1
  34. package/public/app/assets/{index-CyRtYxP3.js → index-DdYwC5ZU.js} +3 -3
  35. package/public/app/assets/{knowledge-BJOIyuJo.js → knowledge-DJmfu2KN.js} +1 -1
  36. package/public/app/assets/{media-Bwtx8blz.js → media-BEtnE0Gv.js} +1 -1
  37. package/public/app/assets/{mind-DtTVrW6Z.js → mind-Dtiw0-QK.js} +1 -1
  38. package/public/app/index.html +6 -5
  39. package/public/guide.en.html +11 -3
  40. package/public/guide.html +6 -3
  41. package/public/tutorial.en.md +2 -0
  42. package/public/tutorial.md +2 -0
  43. package/scripts/import-data.js +128 -128
  44. package/scripts/proxy-config.js +167 -167
  45. package/scripts/service-supervisor.js +50 -0
  46. package/scripts/start-server.js +71 -16
  47. package/scripts/update-instance.js +201 -201
  48. package/server/channels/adapters.js +27 -27
  49. package/server/channels/onebot/adapter.js +288 -288
  50. package/server/channels/qqbot/adapter.js +253 -253
  51. package/server/channels/qqbot/api.js +199 -199
  52. package/server/channels/qqbot/credentials.js +11 -11
  53. package/server/channels/qqbot/gateway.js +274 -274
  54. package/server/channels/qqbot/index.js +389 -389
  55. package/server/channels/segments.js +40 -40
  56. package/server/channels/session-key.js +153 -153
  57. package/server/channels/state.js +42 -42
  58. package/server/core/api.js +564 -564
  59. package/server/core/context-builder.js +288 -288
  60. package/server/core/context-compactor.js +454 -454
  61. package/server/core/conversation-cues.js +325 -325
  62. package/server/core/conversation-manager.js +87 -87
  63. package/server/core/feedback.js +8 -8
  64. package/server/core/group-style.js +72 -72
  65. package/server/core/initiative-context.js +66 -66
  66. package/server/core/input-budget.js +32 -32
  67. package/server/core/local-demo.js +98 -98
  68. package/server/core/message-manager.js +118 -118
  69. package/server/core/message-scheduler.js +78 -78
  70. package/server/core/model-json.js +190 -190
  71. package/server/core/model-presets.js +900 -900
  72. package/server/core/name-call.js +29 -29
  73. package/server/core/network.js +157 -157
  74. package/server/core/person-name.js +22 -22
  75. package/server/core/persona-manager.js +2 -1
  76. package/server/core/reply-delivery.js +404 -403
  77. package/server/core/reply-target-resolver.js +50 -50
  78. package/server/core/response-generator.js +50 -50
  79. package/server/core/response-validator.js +14 -2
  80. package/server/core/retired-prompts.js +51 -51
  81. package/server/core/sessions.js +109 -109
  82. package/server/core/speaker-names.js +92 -92
  83. package/server/core/topic-tracker.js +65 -65
  84. package/server/http.js +18 -18
  85. package/server/i18n/decisions.js +209 -206
  86. package/server/i18n/errors.js +4 -0
  87. package/server/i18n/index.js +144 -144
  88. package/server/i18n/models.js +111 -111
  89. package/server/knowledge/api.js +342 -342
  90. package/server/knowledge/embedding-profile.js +114 -114
  91. package/server/knowledge/index.js +13 -13
  92. package/server/knowledge/retrieval.js +93 -93
  93. package/server/knowledge/schema.js +158 -158
  94. package/server/knowledge/vector-index.js +90 -90
  95. package/server/mind/affect.js +265 -265
  96. package/server/mind/attention.js +200 -200
  97. package/server/mind/bonds.js +565 -565
  98. package/server/mind/clock.js +83 -83
  99. package/server/mind/continuity.js +562 -562
  100. package/server/mind/conversation-origin.js +175 -175
  101. package/server/mind/days.js +210 -210
  102. package/server/mind/evidence-read.js +45 -45
  103. package/server/mind/faces.js +373 -373
  104. package/server/mind/guard.js +60 -60
  105. package/server/mind/initiative.js +338 -338
  106. package/server/mind/life/activities.js +21 -21
  107. package/server/mind/life/context.js +330 -323
  108. package/server/mind/life/diary.js +20 -0
  109. package/server/mind/life/growth.js +261 -254
  110. package/server/mind/life/index.js +10 -2
  111. package/server/mind/life/presence.js +305 -305
  112. package/server/mind/meetings.js +1069 -1069
  113. package/server/mind/memory-policy.js +48 -48
  114. package/server/mind/memory.js +888 -888
  115. package/server/mind/nature.js +358 -358
  116. package/server/mind/novelty.js +19 -19
  117. package/server/mind/periods.js +118 -118
  118. package/server/mind/reading.js +120 -120
  119. package/server/mind/relationship-context.js +71 -0
  120. package/server/mind/relationships.js +390 -279
  121. package/server/mind/salience.js +201 -201
  122. package/server/mind/schema.js +567 -567
  123. package/server/mind/self.js +484 -484
  124. package/server/mind/thoughts.js +274 -274
  125. package/server/mind/time/agenda.js +242 -242
  126. package/server/mind/time/api.js +200 -200
  127. package/server/mind/time/attention.js +34 -34
  128. package/server/mind/time/delivery-links.js +130 -130
  129. package/server/mind/time/model-material.js +77 -77
  130. package/server/mind/time/presentation.js +51 -51
  131. package/server/mind/time/schedule.js +83 -83
  132. package/server/mind/time/schema.js +84 -84
  133. package/server/mind/time/search.js +383 -383
  134. package/server/mind/time/sharing.js +472 -472
  135. package/server/mind/time/task-links.js +311 -311
  136. package/server/mind/time/works.js +432 -432
  137. package/server/mind/traits.js +191 -191
  138. package/server/mind/view.js +9 -1
  139. package/server/runtime/installation.js +116 -116
  140. package/server/runtime/update-execution.js +2 -1
  141. package/server/runtime/update-manager.js +140 -140
  142. package/server/storage/data-package.js +298 -298
  143. package/server/storage/data-transfer-api.js +50 -50
  144. package/server/storage/data-transfer-worker.js +18 -18
  145. package/server/storage/data-transfer.js +416 -416
  146. package/server/studio/display-names.js +139 -139
  147. package/server/studio/management.js +102 -102
  148. package/server/studio/updates.js +144 -144
  149. package/server/version.js +10 -10
  150. package/public/app/assets/ChatsPage-DfyPCS9N.css +0 -1
  151. package/public/app/assets/HeartPage-Bft9wZp5.css +0 -1
  152. package/public/app/assets/LifePage-BUi5euBF.css +0 -1
  153. package/public/app/assets/MemoryPage-cZvXfkXb.css +0 -1
  154. package/public/app/assets/NaturePage-CHkpb5NK.css +0 -1
  155. package/public/app/assets/PeoplePage-BTU0H1pM.css +0 -1
  156. package/public/app/assets/TimePage-BOms_n4I.css +0 -1
@@ -1,144 +1,144 @@
1
- import { ERRORS, ERROR_PATTERNS } from "./errors.js";
2
- import { LABELS, LABEL_PATTERNS } from "./labels.js";
3
- import { MODEL_LABELS, MODEL_PATTERNS } from "./models.js";
4
- import { DECISIONS, DECISION_PATTERNS } from "./decisions.js";
5
-
6
- // The server writes its own wording in Chinese, which is the key here. When the
7
- // page asks for English (header `X-LuckyTri-Locale: en`), strings that match a
8
- // known sentence are swapped on the way out of /api. Everything she or anyone
9
- // else wrote is a different string and passes through untouched.
10
-
11
- export const LOCALE_HEADER = "x-luckytri-locale";
12
-
13
- const HAN = /[\u3400-\u9fff]/;
14
- const MAX_DEPTH = 4;
15
-
16
- // Values under these keys are somebody's words, never the system's.
17
- const CONTENT_KEYS = new Set([
18
- "content",
19
- "text",
20
- "body",
21
- "raw",
22
- "rawContent",
23
- "raw_content",
24
- "summary_text",
25
- "nickname",
26
- ]);
27
-
28
- const EXACT = new Map(
29
- Object.entries({ ...LABELS, ...MODEL_LABELS, ...DECISIONS, ...ERRORS }),
30
- );
31
-
32
- const SEPARATORS = { ",": ", ", ";": "; ", "、": ", " };
33
-
34
- function compile([zh, en]) {
35
- const parts = zh.split(/\{\d\}/);
36
- const slots = [...zh.matchAll(/\{(\d)\}/g)].map((m) => Number(m[1]));
37
- const source = parts
38
- .map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
39
- .join("(.+?)");
40
- return {
41
- weight: parts.join("").length,
42
- re: new RegExp(`^${source}$`, "s"),
43
- slots,
44
- en,
45
- };
46
- }
47
-
48
- const PATTERNS = [
49
- ...ERROR_PATTERNS,
50
- ...LABEL_PATTERNS,
51
- ...MODEL_PATTERNS,
52
- ...DECISION_PATTERNS,
53
- ]
54
- .map(compile)
55
- .sort((a, b) => b.weight - a.weight);
56
-
57
- // "1 days ago" reads badly; the code writes numbers, not grammar.
58
- function singular(text) {
59
- return text.replace(
60
- /(^|[^\d.,])1 (day|week|month|year|session|message|character)s\b/g,
61
- (_, lead, noun) => `${lead}1 ${noun}`,
62
- );
63
- }
64
-
65
- function translateText(text, depth = 0) {
66
- if (!HAN.test(text)) return text;
67
- const hit = EXACT.get(text);
68
- if (hit !== undefined) return hit;
69
- if (depth >= MAX_DEPTH) return text;
70
-
71
- for (const { re, slots, en } of PATTERNS) {
72
- const match = re.exec(text);
73
- if (!match) continue;
74
- const values = [];
75
- slots.forEach((slot, index) => {
76
- values[slot] = translateText(match[index + 1], depth + 1);
77
- });
78
- return singular(en.replace(/\{(\d)\}/g, (_, i) => values[Number(i)] ?? ""));
79
- }
80
-
81
- // A sentence with a detail in brackets: "…(detail)".
82
- const bracket = /^([^()]+)(([^()]+))(。?)$/.exec(text);
83
- if (bracket) {
84
- const head = translateText(bracket[1], depth + 1);
85
- if (!HAN.test(head))
86
- return `${head} (${translateText(bracket[2], depth + 1)})${bracket[3] ? "." : ""}`;
87
- }
88
-
89
- // "a,b" lists and a closing full stop: translate when every piece is known.
90
- if (text.endsWith("。")) {
91
- const head = translateText(text.slice(0, -1), depth + 1);
92
- if (!HAN.test(head)) return `${head}.`;
93
- }
94
- if (/[,;、]/.test(text)) {
95
- const pieces = text.split(/([,;、])/);
96
- const out = pieces.map((piece, index) =>
97
- index % 2 ? SEPARATORS[piece] : translateText(piece, depth + 1),
98
- );
99
- const joined = out.join("").trim();
100
- if (!HAN.test(joined)) return joined;
101
- }
102
- return text;
103
- }
104
-
105
- export function localeOf(req) {
106
- const raw = String(req?.headers?.[LOCALE_HEADER] || "").toLowerCase();
107
- return raw === "en" || raw.startsWith("en-") ? "en" : "zh";
108
- }
109
-
110
- export function translate(text, locale = "en") {
111
- return locale === "en" && typeof text === "string"
112
- ? translateText(text)
113
- : text;
114
- }
115
-
116
- export function localizeValue(value, locale = "en") {
117
- if (locale !== "en") return value;
118
- return walk(value);
119
- }
120
-
121
- function walk(value, key = "") {
122
- if (typeof value === "string") {
123
- return CONTENT_KEYS.has(key) ? value : translateText(value);
124
- }
125
- if (Array.isArray(value)) return value.map((item) => walk(item, key));
126
- if (value && typeof value === "object") {
127
- if (value instanceof Date) return value;
128
- const out = {};
129
- for (const [name, item] of Object.entries(value))
130
- out[name] = walk(item, name);
131
- return out;
132
- }
133
- return value;
134
- }
135
-
136
- // Mounted first on /api so that errors raised by later middleware are covered.
137
- export function localizeApi(req, res, next) {
138
- req.locale = localeOf(req);
139
- if (req.locale === "en") {
140
- const json = res.json.bind(res);
141
- res.json = (body) => json(localizeValue(body, "en"));
142
- }
143
- next();
144
- }
1
+ import { ERRORS, ERROR_PATTERNS } from "./errors.js";
2
+ import { LABELS, LABEL_PATTERNS } from "./labels.js";
3
+ import { MODEL_LABELS, MODEL_PATTERNS } from "./models.js";
4
+ import { DECISIONS, DECISION_PATTERNS } from "./decisions.js";
5
+
6
+ // The server writes its own wording in Chinese, which is the key here. When the
7
+ // page asks for English (header `X-LuckyTri-Locale: en`), strings that match a
8
+ // known sentence are swapped on the way out of /api. Everything she or anyone
9
+ // else wrote is a different string and passes through untouched.
10
+
11
+ export const LOCALE_HEADER = "x-luckytri-locale";
12
+
13
+ const HAN = /[\u3400-\u9fff]/;
14
+ const MAX_DEPTH = 4;
15
+
16
+ // Values under these keys are somebody's words, never the system's.
17
+ const CONTENT_KEYS = new Set([
18
+ "content",
19
+ "text",
20
+ "body",
21
+ "raw",
22
+ "rawContent",
23
+ "raw_content",
24
+ "summary_text",
25
+ "nickname",
26
+ ]);
27
+
28
+ const EXACT = new Map(
29
+ Object.entries({ ...LABELS, ...MODEL_LABELS, ...DECISIONS, ...ERRORS }),
30
+ );
31
+
32
+ const SEPARATORS = { ",": ", ", ";": "; ", "、": ", " };
33
+
34
+ function compile([zh, en]) {
35
+ const parts = zh.split(/\{\d\}/);
36
+ const slots = [...zh.matchAll(/\{(\d)\}/g)].map((m) => Number(m[1]));
37
+ const source = parts
38
+ .map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
39
+ .join("(.+?)");
40
+ return {
41
+ weight: parts.join("").length,
42
+ re: new RegExp(`^${source}$`, "s"),
43
+ slots,
44
+ en,
45
+ };
46
+ }
47
+
48
+ const PATTERNS = [
49
+ ...ERROR_PATTERNS,
50
+ ...LABEL_PATTERNS,
51
+ ...MODEL_PATTERNS,
52
+ ...DECISION_PATTERNS,
53
+ ]
54
+ .map(compile)
55
+ .sort((a, b) => b.weight - a.weight);
56
+
57
+ // "1 days ago" reads badly; the code writes numbers, not grammar.
58
+ function singular(text) {
59
+ return text.replace(
60
+ /(^|[^\d.,])1 (day|week|month|year|session|message|character)s\b/g,
61
+ (_, lead, noun) => `${lead}1 ${noun}`,
62
+ );
63
+ }
64
+
65
+ function translateText(text, depth = 0) {
66
+ if (!HAN.test(text)) return text;
67
+ const hit = EXACT.get(text);
68
+ if (hit !== undefined) return hit;
69
+ if (depth >= MAX_DEPTH) return text;
70
+
71
+ for (const { re, slots, en } of PATTERNS) {
72
+ const match = re.exec(text);
73
+ if (!match) continue;
74
+ const values = [];
75
+ slots.forEach((slot, index) => {
76
+ values[slot] = translateText(match[index + 1], depth + 1);
77
+ });
78
+ return singular(en.replace(/\{(\d)\}/g, (_, i) => values[Number(i)] ?? ""));
79
+ }
80
+
81
+ // A sentence with a detail in brackets: "…(detail)".
82
+ const bracket = /^([^()]+)(([^()]+))(。?)$/.exec(text);
83
+ if (bracket) {
84
+ const head = translateText(bracket[1], depth + 1);
85
+ if (!HAN.test(head))
86
+ return `${head} (${translateText(bracket[2], depth + 1)})${bracket[3] ? "." : ""}`;
87
+ }
88
+
89
+ // "a,b" lists and a closing full stop: translate when every piece is known.
90
+ if (text.endsWith("。")) {
91
+ const head = translateText(text.slice(0, -1), depth + 1);
92
+ if (!HAN.test(head)) return `${head}.`;
93
+ }
94
+ if (/[,;、]/.test(text)) {
95
+ const pieces = text.split(/([,;、])/);
96
+ const out = pieces.map((piece, index) =>
97
+ index % 2 ? SEPARATORS[piece] : translateText(piece, depth + 1),
98
+ );
99
+ const joined = out.join("").trim();
100
+ if (!HAN.test(joined)) return joined;
101
+ }
102
+ return text;
103
+ }
104
+
105
+ export function localeOf(req) {
106
+ const raw = String(req?.headers?.[LOCALE_HEADER] || "").toLowerCase();
107
+ return raw === "en" || raw.startsWith("en-") ? "en" : "zh";
108
+ }
109
+
110
+ export function translate(text, locale = "en") {
111
+ return locale === "en" && typeof text === "string"
112
+ ? translateText(text)
113
+ : text;
114
+ }
115
+
116
+ export function localizeValue(value, locale = "en") {
117
+ if (locale !== "en") return value;
118
+ return walk(value);
119
+ }
120
+
121
+ function walk(value, key = "") {
122
+ if (typeof value === "string") {
123
+ return CONTENT_KEYS.has(key) ? value : translateText(value);
124
+ }
125
+ if (Array.isArray(value)) return value.map((item) => walk(item, key));
126
+ if (value && typeof value === "object") {
127
+ if (value instanceof Date) return value;
128
+ const out = {};
129
+ for (const [name, item] of Object.entries(value))
130
+ out[name] = walk(item, name);
131
+ return out;
132
+ }
133
+ return value;
134
+ }
135
+
136
+ // Mounted first on /api so that errors raised by later middleware are covered.
137
+ export function localizeApi(req, res, next) {
138
+ req.locale = localeOf(req);
139
+ if (req.locale === "en") {
140
+ const json = res.json.bind(res);
141
+ res.json = (body) => json(localizeValue(body, "en"));
142
+ }
143
+ next();
144
+ }
@@ -1,111 +1,111 @@
1
- // English for the model library: provider names, tiers, thinking levels and the
2
- // notes beside each preset. Product and model names stay as the vendors write
3
- // them; only the Chinese around them is translated.
4
- const STANDARD_TAIL = "输入超过 272K 整单按长上下文计价。";
5
- const STANDARD_TAIL_EN =
6
- "Input over 272K is billed entirely at the long-context rate.";
7
- const FLAT_TAIL = "1M 内同一价格,没有分档。";
8
- const FLAT_TAIL_EN = "One price within 1M, no tiers.";
9
-
10
- export const MODEL_LABELS = {
11
- // tiers
12
- "标准(输入 ≤272K)": "Standard (input ≤272K)",
13
- "百万(1.05M)": "Million (1.05M)",
14
-
15
- // thinking levels
16
- 关闭: "Off",
17
- 极低: "Minimal",
18
- 低: "Low",
19
- 中: "Medium",
20
- 高: "High",
21
- 极高: "Extra high",
22
- 最深: "Deepest",
23
-
24
- // providers and labels
25
- 火山方舟: "Volcengine Ark",
26
- "火山方舟 Coding Plan": "Volcengine Ark Coding Plan",
27
- "方舟自动路由(ark-code-latest)": "Ark auto-routing (ark-code-latest)",
28
- "GLM 最新别名(glm-latest)": "GLM latest alias (glm-latest)",
29
- "小米 MiMo": "Xiaomi MiMo",
30
- "智谱 GLM": "Zhipu GLM",
31
- 通义千问: "Qwen",
32
- "亚马逊 Bedrock": "Amazon Bedrock",
33
- 自定义: "Custom",
34
- 自定义兼容接口: "Custom compatible API",
35
- "OpenRouter · 自选模型": "OpenRouter · your own model",
36
-
37
- // notes
38
- "控制台管理的动态模型入口;实际使用哪一个模型由 Coding Plan 控制台选择,切换通常数分钟后生效。支持图片理解。":
39
- "A dynamic model entry managed in the console; which model is actually used is chosen in the Coding Plan console, and a switch usually takes a few minutes. Supports image understanding.",
40
- [`当前主力。思考默认开启(high),可关闭;支持看图。${FLAT_TAIL}`]: `The current mainstay. Thinking is on by default (high) and can be turned off; supports images. ${FLAT_TAIL_EN}`,
41
- [`V4-Pro-0813。思考默认开启(high),可关闭;仅文本。${FLAT_TAIL}`]: `V4-Pro-0813. Thinking is on by default (high) and can be turned off; text only. ${FLAT_TAIL_EN}`,
42
- [`旗舰。思考默认开启,可关闭;支持图片、视频、音频输入。${FLAT_TAIL}`]: `Flagship. Thinking is on by default and can be turned off; accepts image, video and audio input. ${FLAT_TAIL_EN}`,
43
- [`高频调用。思考默认开启,可关闭;支持图片、视频、音频输入。${FLAT_TAIL}`]: `For frequent calls. Thinking is on by default and can be turned off; accepts image, video and audio input. ${FLAT_TAIL_EN}`,
44
- [`旗舰。思考不能关闭,默认 max;仅文本。${FLAT_TAIL}`]: `Flagship. Thinking cannot be turned off and defaults to max; text only. ${FLAT_TAIL_EN}`,
45
- [`原生多模态。思考不能关闭,默认 max;支持图片、视频。${FLAT_TAIL}`]: `Natively multimodal. Thinking cannot be turned off and defaults to max; supports images and video. ${FLAT_TAIL_EN}`,
46
- "旗舰。思考不能关闭,默认 max;支持看图。1M 内同一价格;输出和输入共用窗口,官方默认输出 128K。":
47
- "Flagship. Thinking cannot be turned off and defaults to max; supports images. One price within 1M; output and input share the window, with a vendor default output of 128K.",
48
- "通用模型。思考默认开启,可关闭;支持看图。输出和输入共用 256K 窗口,官方默认输出 32K。":
49
- "General-purpose. Thinking is on by default and can be turned off; supports images. Output and input share a 256K window, with a vendor default output of 32K.",
50
- [`最强旗舰。思考不能关闭,官方未写默认档,预填 medium;支持看图。${STANDARD_TAIL}`]: `The strongest flagship. Thinking cannot be turned off; the vendor states no default level, so medium is prefilled; supports images. ${STANDARD_TAIL_EN}`,
51
- [`复杂编码与智能体。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Complex coding and agents. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
52
- [`高频轻量。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Lightweight for frequent calls. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
53
- "OpenRouter 路由 · openai/gpt-6-astra。1.05M 上下文、128K 最大输出;支持图片、结构化输出和工具调用。":
54
- "OpenRouter route · openai/gpt-6-astra. 1.05M context, 128K max output; supports images, structured output and tool calls.",
55
- "OpenRouter 路由 · openai/gpt-6-sol。1.05M 上下文、128K 最大输出;支持图片、结构化输出和工具调用。":
56
- "OpenRouter route · openai/gpt-6-sol. 1.05M context, 128K max output; supports images, structured output and tool calls.",
57
- "OpenRouter 路由 · openai/gpt-6-luna。1.05M 上下文、128K 最大输出;支持图片、结构化输出和工具调用。":
58
- "OpenRouter route · openai/gpt-6-luna. 1.05M context, 128K max output; supports images, structured output and tool calls.",
59
- "OpenRouter 路由 · z-ai/glm-5.3-flash。1,310,720 上下文、131,072 最大输出;支持图片、结构化输出和工具调用。":
60
- "OpenRouter route · z-ai/glm-5.3-flash. 1,310,720 context, 131,072 max output; supports images, structured output and tool calls.",
61
- [`上一代旗舰,别名 gpt-5.6。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Previous-generation flagship, alias gpt-5.6. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
62
- [`上一代均衡款。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Previous-generation balanced model. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
63
- [`上一代高性价比。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Previous-generation value model. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
64
- [`旗舰,快照 qwen3.8-max-0902。思考默认开启(xhigh),可关闭;支持图片、视频。${FLAT_TAIL}`]: `Flagship, snapshot qwen3.8-max-0902. Thinking is on by default (xhigh) and can be turned off; supports images and video. ${FLAT_TAIL_EN}`,
65
- [`轻量。思考默认开启(xhigh),可关闭;支持图片、视频。${FLAT_TAIL}`]: `Lightweight. Thinking is on by default (xhigh) and can be turned off; supports images and video. ${FLAT_TAIL_EN}`,
66
- [`美国跨区推理。思考不能关闭,预填 medium;支持看图。runtime 不支持结构化输出,已关闭 JSON 输出。${STANDARD_TAIL}`]: `US cross-region inference. Thinking cannot be turned off and medium is prefilled; supports images. The runtime has no structured output, so JSON output is turned off. ${STANDARD_TAIL_EN}`,
67
- [`AWS 模型卡尚未发布,模型 ID 取自 OpenAI 的 Bedrock 指南,JSON 输出先关闭。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `The AWS model card is not published yet; the model ID comes from OpenAI's Bedrock guide, and JSON output is off for now. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
68
- "OpenCode Zen · GPT-6 系列旗舰 · Responses 接口。":
69
- "OpenCode Zen · GPT-6 series flagship · Responses API.",
70
- "OpenCode Zen · GPT-6 均衡款 · Responses 接口。":
71
- "OpenCode Zen · GPT-6 balanced · Responses API.",
72
- "OpenCode Zen · GPT-6 轻量款 · Responses 接口。":
73
- "OpenCode Zen · GPT-6 lightweight · Responses API.",
74
- "OpenCode Zen · 快速推理 · Chat Completions 接口。":
75
- "OpenCode Zen · fast inference · Chat Completions API.",
76
- "OpenCode Zen · DeepSeek V4 旗舰 · Chat Completions 接口。":
77
- "OpenCode Zen · DeepSeek V4 flagship · Chat Completions API.",
78
- "OpenCode Zen · 轻量高速 · Chat Completions 接口。":
79
- "OpenCode Zen · lightweight and fast · Chat Completions API.",
80
- "OpenCode Zen · 智谱轻量多模态 · Chat Completions 接口。":
81
- "OpenCode Zen · Zhipu lightweight multimodal · Chat Completions API.",
82
- "OpenCode Zen · 智谱旗舰 · Chat Completions 接口。":
83
- "OpenCode Zen · Zhipu flagship · Chat Completions API.",
84
- "OpenCode Zen · Kimi 旗舰 · Chat Completions 接口。":
85
- "OpenCode Zen · Kimi flagship · Chat Completions API.",
86
- "OpenCode Zen · 通义千问轻量多模态 · Anthropic Messages 接口。":
87
- "OpenCode Zen · Qwen lightweight multimodal · Anthropic Messages API.",
88
- "OpenCode Zen · MiniMax 主力模型 · Chat Completions 接口。":
89
- "OpenCode Zen · MiniMax main model · Chat Completions API.",
90
- "OpenCode Zen · 当前限时免费 · Chat Completions 接口。参考 OpenRouter Space Bunny Alpha 规格:1M 上下文、最高 524K 输出,支持图像/视频、推理、工具和 JSON;其匿名第三方提供方可能保留提示和回答。LuckyTri 默认输入 128K、输出 8K、低推理;当前图片链路可用,视频链路未支持。Zen 路由能力与数据政策可能不同。":
91
- "OpenCode Zen · free for a limited time · Chat Completions API. Modeled on the OpenRouter Space Bunny Alpha spec: 1M context, up to 524K output, image/video, reasoning, tools and JSON; its anonymous third-party providers may keep prompts and replies. LuckyTri defaults to 128K input, 8K output and low reasoning; images work today, video is not supported. Zen routes may differ in ability and data policy.",
92
- "OpenAI 兼容接口。上下文先按 128K 填,思考档可按供应商再改。":
93
- "OpenAI-compatible API. Context is prefilled at 128K; the thinking level can be changed per provider.",
94
- "已填好 OpenRouter API 地址。请自行填写模型 ID、API Key,并按所选模型设置上下文、输出和能力参数。":
95
- "The OpenRouter API URL is filled in. Enter the model ID and API key yourself, and set the context, output and ability parameters for the chosen model.",
96
- };
97
-
98
- export const MODEL_PATTERNS = [
99
- [
100
- "OpenCode Go · {0} · {1} 接口。默认上下文和输出预算为保守起始值,可按账户实际模型上限调整。",
101
- "OpenCode Go · {0} · {1} API. Default context and output budgets are conservative starting values; adjust them to your account's real model limits.",
102
- ],
103
- [
104
- "Coding Plan 专属 Responses 接口 · 上下文 {0} · 官方最大输出 {1} · 支持图片理解。默认中等推理;Kimi K2.8 Preview 在 LuckyTri 中预留 64K 输出预算以保留长上下文。",
105
- "Coding Plan–only Responses API · context {0} · vendor max output {1} · supports image understanding. Medium reasoning by default; Kimi K2.8 Preview reserves a 64K output budget in LuckyTri to keep the long context.",
106
- ],
107
- [
108
- "Coding Plan 专属 Responses 接口 · 上下文 {0} · 官方最大输出 {1} · 文本模型。默认中等推理;Kimi K2.8 Preview 在 LuckyTri 中预留 64K 输出预算以保留长上下文。",
109
- "Coding Plan–only Responses API · context {0} · vendor max output {1} · text model. Medium reasoning by default; Kimi K2.8 Preview reserves a 64K output budget in LuckyTri to keep the long context.",
110
- ],
111
- ];
1
+ // English for the model library: provider names, tiers, thinking levels and the
2
+ // notes beside each preset. Product and model names stay as the vendors write
3
+ // them; only the Chinese around them is translated.
4
+ const STANDARD_TAIL = "输入超过 272K 整单按长上下文计价。";
5
+ const STANDARD_TAIL_EN =
6
+ "Input over 272K is billed entirely at the long-context rate.";
7
+ const FLAT_TAIL = "1M 内同一价格,没有分档。";
8
+ const FLAT_TAIL_EN = "One price within 1M, no tiers.";
9
+
10
+ export const MODEL_LABELS = {
11
+ // tiers
12
+ "标准(输入 ≤272K)": "Standard (input ≤272K)",
13
+ "百万(1.05M)": "Million (1.05M)",
14
+
15
+ // thinking levels
16
+ 关闭: "Off",
17
+ 极低: "Minimal",
18
+ 低: "Low",
19
+ 中: "Medium",
20
+ 高: "High",
21
+ 极高: "Extra high",
22
+ 最深: "Deepest",
23
+
24
+ // providers and labels
25
+ 火山方舟: "Volcengine Ark",
26
+ "火山方舟 Coding Plan": "Volcengine Ark Coding Plan",
27
+ "方舟自动路由(ark-code-latest)": "Ark auto-routing (ark-code-latest)",
28
+ "GLM 最新别名(glm-latest)": "GLM latest alias (glm-latest)",
29
+ "小米 MiMo": "Xiaomi MiMo",
30
+ "智谱 GLM": "Zhipu GLM",
31
+ 通义千问: "Qwen",
32
+ "亚马逊 Bedrock": "Amazon Bedrock",
33
+ 自定义: "Custom",
34
+ 自定义兼容接口: "Custom compatible API",
35
+ "OpenRouter · 自选模型": "OpenRouter · your own model",
36
+
37
+ // notes
38
+ "控制台管理的动态模型入口;实际使用哪一个模型由 Coding Plan 控制台选择,切换通常数分钟后生效。支持图片理解。":
39
+ "A dynamic model entry managed in the console; which model is actually used is chosen in the Coding Plan console, and a switch usually takes a few minutes. Supports image understanding.",
40
+ [`当前主力。思考默认开启(high),可关闭;支持看图。${FLAT_TAIL}`]: `The current mainstay. Thinking is on by default (high) and can be turned off; supports images. ${FLAT_TAIL_EN}`,
41
+ [`V4-Pro-0813。思考默认开启(high),可关闭;仅文本。${FLAT_TAIL}`]: `V4-Pro-0813. Thinking is on by default (high) and can be turned off; text only. ${FLAT_TAIL_EN}`,
42
+ [`旗舰。思考默认开启,可关闭;支持图片、视频、音频输入。${FLAT_TAIL}`]: `Flagship. Thinking is on by default and can be turned off; accepts image, video and audio input. ${FLAT_TAIL_EN}`,
43
+ [`高频调用。思考默认开启,可关闭;支持图片、视频、音频输入。${FLAT_TAIL}`]: `For frequent calls. Thinking is on by default and can be turned off; accepts image, video and audio input. ${FLAT_TAIL_EN}`,
44
+ [`旗舰。思考不能关闭,默认 max;仅文本。${FLAT_TAIL}`]: `Flagship. Thinking cannot be turned off and defaults to max; text only. ${FLAT_TAIL_EN}`,
45
+ [`原生多模态。思考不能关闭,默认 max;支持图片、视频。${FLAT_TAIL}`]: `Natively multimodal. Thinking cannot be turned off and defaults to max; supports images and video. ${FLAT_TAIL_EN}`,
46
+ "旗舰。思考不能关闭,默认 max;支持看图。1M 内同一价格;输出和输入共用窗口,官方默认输出 128K。":
47
+ "Flagship. Thinking cannot be turned off and defaults to max; supports images. One price within 1M; output and input share the window, with a vendor default output of 128K.",
48
+ "通用模型。思考默认开启,可关闭;支持看图。输出和输入共用 256K 窗口,官方默认输出 32K。":
49
+ "General-purpose. Thinking is on by default and can be turned off; supports images. Output and input share a 256K window, with a vendor default output of 32K.",
50
+ [`最强旗舰。思考不能关闭,官方未写默认档,预填 medium;支持看图。${STANDARD_TAIL}`]: `The strongest flagship. Thinking cannot be turned off; the vendor states no default level, so medium is prefilled; supports images. ${STANDARD_TAIL_EN}`,
51
+ [`复杂编码与智能体。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Complex coding and agents. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
52
+ [`高频轻量。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Lightweight for frequent calls. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
53
+ "OpenRouter 路由 · openai/gpt-6-astra。1.05M 上下文、128K 最大输出;支持图片、结构化输出和工具调用。":
54
+ "OpenRouter route · openai/gpt-6-astra. 1.05M context, 128K max output; supports images, structured output and tool calls.",
55
+ "OpenRouter 路由 · openai/gpt-6-sol。1.05M 上下文、128K 最大输出;支持图片、结构化输出和工具调用。":
56
+ "OpenRouter route · openai/gpt-6-sol. 1.05M context, 128K max output; supports images, structured output and tool calls.",
57
+ "OpenRouter 路由 · openai/gpt-6-luna。1.05M 上下文、128K 最大输出;支持图片、结构化输出和工具调用。":
58
+ "OpenRouter route · openai/gpt-6-luna. 1.05M context, 128K max output; supports images, structured output and tool calls.",
59
+ "OpenRouter 路由 · z-ai/glm-5.3-flash。1,310,720 上下文、131,072 最大输出;支持图片、结构化输出和工具调用。":
60
+ "OpenRouter route · z-ai/glm-5.3-flash. 1,310,720 context, 131,072 max output; supports images, structured output and tool calls.",
61
+ [`上一代旗舰,别名 gpt-5.6。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Previous-generation flagship, alias gpt-5.6. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
62
+ [`上一代均衡款。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Previous-generation balanced model. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
63
+ [`上一代高性价比。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `Previous-generation value model. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
64
+ [`旗舰,快照 qwen3.8-max-0902。思考默认开启(xhigh),可关闭;支持图片、视频。${FLAT_TAIL}`]: `Flagship, snapshot qwen3.8-max-0902. Thinking is on by default (xhigh) and can be turned off; supports images and video. ${FLAT_TAIL_EN}`,
65
+ [`轻量。思考默认开启(xhigh),可关闭;支持图片、视频。${FLAT_TAIL}`]: `Lightweight. Thinking is on by default (xhigh) and can be turned off; supports images and video. ${FLAT_TAIL_EN}`,
66
+ [`美国跨区推理。思考不能关闭,预填 medium;支持看图。runtime 不支持结构化输出,已关闭 JSON 输出。${STANDARD_TAIL}`]: `US cross-region inference. Thinking cannot be turned off and medium is prefilled; supports images. The runtime has no structured output, so JSON output is turned off. ${STANDARD_TAIL_EN}`,
67
+ [`AWS 模型卡尚未发布,模型 ID 取自 OpenAI 的 Bedrock 指南,JSON 输出先关闭。思考默认 medium,可关闭;支持看图。${STANDARD_TAIL}`]: `The AWS model card is not published yet; the model ID comes from OpenAI's Bedrock guide, and JSON output is off for now. Thinking defaults to medium and can be turned off; supports images. ${STANDARD_TAIL_EN}`,
68
+ "OpenCode Zen · GPT-6 系列旗舰 · Responses 接口。":
69
+ "OpenCode Zen · GPT-6 series flagship · Responses API.",
70
+ "OpenCode Zen · GPT-6 均衡款 · Responses 接口。":
71
+ "OpenCode Zen · GPT-6 balanced · Responses API.",
72
+ "OpenCode Zen · GPT-6 轻量款 · Responses 接口。":
73
+ "OpenCode Zen · GPT-6 lightweight · Responses API.",
74
+ "OpenCode Zen · 快速推理 · Chat Completions 接口。":
75
+ "OpenCode Zen · fast inference · Chat Completions API.",
76
+ "OpenCode Zen · DeepSeek V4 旗舰 · Chat Completions 接口。":
77
+ "OpenCode Zen · DeepSeek V4 flagship · Chat Completions API.",
78
+ "OpenCode Zen · 轻量高速 · Chat Completions 接口。":
79
+ "OpenCode Zen · lightweight and fast · Chat Completions API.",
80
+ "OpenCode Zen · 智谱轻量多模态 · Chat Completions 接口。":
81
+ "OpenCode Zen · Zhipu lightweight multimodal · Chat Completions API.",
82
+ "OpenCode Zen · 智谱旗舰 · Chat Completions 接口。":
83
+ "OpenCode Zen · Zhipu flagship · Chat Completions API.",
84
+ "OpenCode Zen · Kimi 旗舰 · Chat Completions 接口。":
85
+ "OpenCode Zen · Kimi flagship · Chat Completions API.",
86
+ "OpenCode Zen · 通义千问轻量多模态 · Anthropic Messages 接口。":
87
+ "OpenCode Zen · Qwen lightweight multimodal · Anthropic Messages API.",
88
+ "OpenCode Zen · MiniMax 主力模型 · Chat Completions 接口。":
89
+ "OpenCode Zen · MiniMax main model · Chat Completions API.",
90
+ "OpenCode Zen · 当前限时免费 · Chat Completions 接口。参考 OpenRouter Space Bunny Alpha 规格:1M 上下文、最高 524K 输出,支持图像/视频、推理、工具和 JSON;其匿名第三方提供方可能保留提示和回答。LuckyTri 默认输入 128K、输出 8K、低推理;当前图片链路可用,视频链路未支持。Zen 路由能力与数据政策可能不同。":
91
+ "OpenCode Zen · free for a limited time · Chat Completions API. Modeled on the OpenRouter Space Bunny Alpha spec: 1M context, up to 524K output, image/video, reasoning, tools and JSON; its anonymous third-party providers may keep prompts and replies. LuckyTri defaults to 128K input, 8K output and low reasoning; images work today, video is not supported. Zen routes may differ in ability and data policy.",
92
+ "OpenAI 兼容接口。上下文先按 128K 填,思考档可按供应商再改。":
93
+ "OpenAI-compatible API. Context is prefilled at 128K; the thinking level can be changed per provider.",
94
+ "已填好 OpenRouter API 地址。请自行填写模型 ID、API Key,并按所选模型设置上下文、输出和能力参数。":
95
+ "The OpenRouter API URL is filled in. Enter the model ID and API key yourself, and set the context, output and ability parameters for the chosen model.",
96
+ };
97
+
98
+ export const MODEL_PATTERNS = [
99
+ [
100
+ "OpenCode Go · {0} · {1} 接口。默认上下文和输出预算为保守起始值,可按账户实际模型上限调整。",
101
+ "OpenCode Go · {0} · {1} API. Default context and output budgets are conservative starting values; adjust them to your account's real model limits.",
102
+ ],
103
+ [
104
+ "Coding Plan 专属 Responses 接口 · 上下文 {0} · 官方最大输出 {1} · 支持图片理解。默认中等推理;Kimi K2.8 Preview 在 LuckyTri 中预留 64K 输出预算以保留长上下文。",
105
+ "Coding Plan–only Responses API · context {0} · vendor max output {1} · supports image understanding. Medium reasoning by default; Kimi K2.8 Preview reserves a 64K output budget in LuckyTri to keep the long context.",
106
+ ],
107
+ [
108
+ "Coding Plan 专属 Responses 接口 · 上下文 {0} · 官方最大输出 {1} · 文本模型。默认中等推理;Kimi K2.8 Preview 在 LuckyTri 中预留 64K 输出预算以保留长上下文。",
109
+ "Coding Plan–only Responses API · context {0} · vendor max output {1} · text model. Medium reasoning by default; Kimi K2.8 Preview reserves a 64K output budget in LuckyTri to keep the long context.",
110
+ ],
111
+ ];