@code-yeongyu/senpi 2026.9.26 → 2026.9.27

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 (77) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/bun-runtime.d.ts +18 -2
  3. package/dist/bun-runtime.d.ts.map +1 -1
  4. package/dist/bun-runtime.js +60 -8
  5. package/dist/bun-runtime.js.map +1 -1
  6. package/dist/bundle/chunks/{app-server-command-ZRCKWY2X.js → app-server-command-7WEJGW7D.js} +1 -1
  7. package/dist/bundle/chunks/bun-extension-importer-R4HXF3GD.js +14 -0
  8. package/dist/bundle/chunks/{chunk-QGC46CGK.js → chunk-3QCAGZFO.js} +17 -16
  9. package/dist/bundle/chunks/chunk-HCXLCGMF.js +8 -0
  10. package/dist/bundle/chunks/{chunk-OZCB6BP3.js → chunk-HH3D5ZYA.js} +3 -3
  11. package/dist/bundle/chunks/chunk-W3D3ZYDS.js +2 -0
  12. package/dist/bundle/chunks/{cli-main-H6JAXAXV.js → cli-main-YLZ4MMLV.js} +1 -1
  13. package/dist/bundle/chunks/{interactive-host-runtime-YI75GFD5.js → interactive-host-runtime-6WY6424X.js} +1 -1
  14. package/dist/bundle/chunks/{interactive-mode-HM7UQYRC.js → interactive-mode-6AHR5TEM.js} +1 -1
  15. package/dist/bundle/chunks/{multi-session-host-7YX2I7UK.js → multi-session-host-5IWJEFDF.js} +1 -1
  16. package/dist/bundle/chunks/{package-manager-cli-3ISYTEL2.js → package-manager-cli-FZKBCLWV.js} +1 -1
  17. package/dist/bundle/chunks/{rpc-mode-6PY4TN5F.js → rpc-mode-JSCHAE6O.js} +1 -1
  18. package/dist/bundle/chunks/session-worker.js +117 -116
  19. package/dist/bundle/cli.js +1 -1
  20. package/dist/bundle/index.js +1 -1
  21. package/dist/bundle/rpc-entry.js +1 -1
  22. package/dist/core/agent-session.d.ts.map +1 -1
  23. package/dist/core/agent-session.js +10 -5
  24. package/dist/core/agent-session.js.map +1 -1
  25. package/dist/core/extensions/bun-extension-importer.d.ts.map +1 -1
  26. package/dist/core/extensions/bun-extension-importer.js +10 -4
  27. package/dist/core/extensions/bun-extension-importer.js.map +1 -1
  28. package/dist/core/extensions/bun-extension-registry.js +6 -5
  29. package/dist/core/extensions/bun-extension-registry.js.map +1 -1
  30. package/dist/core/messages.d.ts.map +1 -1
  31. package/dist/core/messages.js +4 -2
  32. package/dist/core/messages.js.map +1 -1
  33. package/dist/core/provider-rejected-images.d.ts +18 -0
  34. package/dist/core/provider-rejected-images.d.ts.map +1 -0
  35. package/dist/core/provider-rejected-images.js +107 -0
  36. package/dist/core/provider-rejected-images.js.map +1 -0
  37. package/dist/core/session-title-generator.d.ts.map +1 -1
  38. package/dist/core/session-title-generator.js +21 -3
  39. package/dist/core/session-title-generator.js.map +1 -1
  40. package/dist/core/session-title-reasoning.d.ts +14 -0
  41. package/dist/core/session-title-reasoning.d.ts.map +1 -0
  42. package/dist/core/session-title-reasoning.js +31 -0
  43. package/dist/core/session-title-reasoning.js.map +1 -0
  44. package/dist/core/tools/path-utils.d.ts.map +1 -1
  45. package/dist/core/tools/path-utils.js +13 -0
  46. package/dist/core/tools/path-utils.js.map +1 -1
  47. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  48. package/dist/modes/interactive/interactive-mode.js +2 -0
  49. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  50. package/dist/modes/interactive/runtime-notice-presenter.d.ts +8 -0
  51. package/dist/modes/interactive/runtime-notice-presenter.d.ts.map +1 -0
  52. package/dist/modes/interactive/runtime-notice-presenter.js +69 -0
  53. package/dist/modes/interactive/runtime-notice-presenter.js.map +1 -0
  54. package/dist/modes/interactive/runtime-notice.d.ts +50 -0
  55. package/dist/modes/interactive/runtime-notice.d.ts.map +1 -0
  56. package/dist/modes/interactive/runtime-notice.js +104 -0
  57. package/dist/modes/interactive/runtime-notice.js.map +1 -0
  58. package/docs/environment-variables.md +2 -0
  59. package/docs/quickstart.md +7 -1
  60. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
  61. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  62. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  63. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  64. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  65. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  66. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  67. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  68. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  69. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  70. package/node_modules/@earendil-works/pi-pty/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
  71. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  72. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  73. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  74. package/package.json +7 -7
  75. package/dist/bundle/chunks/bun-extension-importer-H4IJCWWQ.js +0 -14
  76. package/dist/bundle/chunks/chunk-34HMVB33.js +0 -2
  77. package/dist/bundle/chunks/chunk-T3JBT2IK.js +0 -8
@@ -0,0 +1,8 @@
1
+ import { type BunRuntimeOptions } from "../../bun-runtime.ts";
2
+ import type { NoticeSpec } from "../../core/extensions/notice/index.ts";
3
+ import { type BunAvailability } from "./runtime-notice.ts";
4
+ export declare const RUNTIME_NOTICE_STATE_FILE = "runtime-notice.json";
5
+ export declare function readShownVersion(agentDir: string): string | undefined;
6
+ export declare function detectBunAvailability(options: BunRuntimeOptions): BunAvailability;
7
+ export declare function maybeShowRuntimeNotice(show: (spec: NoticeSpec) => void): void;
8
+ //# sourceMappingURL=runtime-notice-presenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-notice-presenter.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/runtime-notice-presenter.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,iBAAiB,EAItB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAExE,OAAO,EACN,KAAK,eAAe,EAMpB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAE/D,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUrE;AAYD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,eAAe,CAOjF;AAOD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAwB7E"}
@@ -0,0 +1,69 @@
1
+ import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { bunVersionSatisfies, findBunBinary, processBunRuntimeOptions, } from "../../bun-runtime.js";
4
+ import { APP_COMMAND, APP_NAME, BRAND, detectInstallMethod, getAgentDir, PACKAGE_NAME, VERSION } from "../../config.js";
5
+ import { envValue } from "../../core/brand.js";
6
+ import { hasInheritedInspectorOption } from "../../inspector-policy.js";
7
+ import { buildRuntimeNotice, reinstallTarget, runtimeNoticeSkipReason, runtimePinEnvName, SKIP_RUNTIME_NOTICE_ENV_SUFFIX, } from "./runtime-notice.js";
8
+ export const RUNTIME_NOTICE_STATE_FILE = "runtime-notice.json";
9
+ export function readShownVersion(agentDir) {
10
+ let parsed;
11
+ try {
12
+ parsed = JSON.parse(readFileSync(join(agentDir, RUNTIME_NOTICE_STATE_FILE), "utf8"));
13
+ }
14
+ catch {
15
+ // Missing or unreadable state means the notice was never recorded as shown.
16
+ return undefined;
17
+ }
18
+ if (typeof parsed !== "object" || parsed === null || !("shownVersion" in parsed))
19
+ return undefined;
20
+ return typeof parsed.shownVersion === "string" ? parsed.shownVersion : undefined;
21
+ }
22
+ function recordShownVersion(agentDir, version) {
23
+ try {
24
+ mkdirSync(agentDir, { recursive: true });
25
+ writeFileSync(join(agentDir, RUNTIME_NOTICE_STATE_FILE), `${JSON.stringify({ shownVersion: version })}\n`);
26
+ }
27
+ catch {
28
+ // Best effort: a read-only agent dir only means the notice shows again next launch,
29
+ // which must never fail the interactive startup that is already underway.
30
+ }
31
+ }
32
+ export function detectBunAvailability(options) {
33
+ const bunPath = findBunBinary(options);
34
+ if (bunPath === undefined)
35
+ return { kind: "missing" };
36
+ const version = options.bunVersion(bunPath);
37
+ return version !== undefined && bunVersionSatisfies(version)
38
+ ? { kind: "ready", version }
39
+ : { kind: "outdated", version };
40
+ }
41
+ function skipRequested() {
42
+ const value = envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);
43
+ return value !== undefined && value !== "" && value !== "0";
44
+ }
45
+ export function maybeShowRuntimeNotice(show) {
46
+ const agentDir = getAgentDir();
47
+ const skip = runtimeNoticeSkipReason({
48
+ versions: process.versions,
49
+ env: process.env,
50
+ hasInheritedInspectorOption: hasInheritedInspectorOption(),
51
+ skipRequested: skipRequested(),
52
+ engineVersion: VERSION,
53
+ shownVersion: readShownVersion(agentDir),
54
+ });
55
+ if (skip !== undefined)
56
+ return;
57
+ show(buildRuntimeNotice({
58
+ appName: APP_NAME,
59
+ appCommand: APP_COMMAND,
60
+ nodeVersion: process.version,
61
+ platform: process.platform,
62
+ installMethod: detectInstallMethod(),
63
+ target: reinstallTarget(BRAND, PACKAGE_NAME),
64
+ bun: detectBunAvailability(processBunRuntimeOptions(existsSync, realpathSync)),
65
+ pinEnvName: runtimePinEnvName(process.env),
66
+ }));
67
+ recordShownVersion(agentDir, VERSION);
68
+ }
69
+ //# sourceMappingURL=runtime-notice-presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-notice-presenter.js","sourceRoot":"","sources":["../../../src/modes/interactive/runtime-notice-presenter.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n\ttype BunRuntimeOptions,\n\tbunVersionSatisfies,\n\tfindBunBinary,\n\tprocessBunRuntimeOptions,\n} from \"../../bun-runtime.ts\";\nimport { APP_COMMAND, APP_NAME, BRAND, detectInstallMethod, getAgentDir, PACKAGE_NAME, VERSION } from \"../../config.ts\";\nimport { envValue } from \"../../core/brand.ts\";\nimport type { NoticeSpec } from \"../../core/extensions/notice/index.ts\";\nimport { hasInheritedInspectorOption } from \"../../inspector-policy.ts\";\nimport {\n\ttype BunAvailability,\n\tbuildRuntimeNotice,\n\treinstallTarget,\n\truntimeNoticeSkipReason,\n\truntimePinEnvName,\n\tSKIP_RUNTIME_NOTICE_ENV_SUFFIX,\n} from \"./runtime-notice.ts\";\n\nexport const RUNTIME_NOTICE_STATE_FILE = \"runtime-notice.json\";\n\nexport function readShownVersion(agentDir: string): string | undefined {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(readFileSync(join(agentDir, RUNTIME_NOTICE_STATE_FILE), \"utf8\"));\n\t} catch {\n\t\t// Missing or unreadable state means the notice was never recorded as shown.\n\t\treturn undefined;\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || !(\"shownVersion\" in parsed)) return undefined;\n\treturn typeof parsed.shownVersion === \"string\" ? parsed.shownVersion : undefined;\n}\n\nfunction recordShownVersion(agentDir: string, version: string): void {\n\ttry {\n\t\tmkdirSync(agentDir, { recursive: true });\n\t\twriteFileSync(join(agentDir, RUNTIME_NOTICE_STATE_FILE), `${JSON.stringify({ shownVersion: version })}\\n`);\n\t} catch {\n\t\t// Best effort: a read-only agent dir only means the notice shows again next launch,\n\t\t// which must never fail the interactive startup that is already underway.\n\t}\n}\n\nexport function detectBunAvailability(options: BunRuntimeOptions): BunAvailability {\n\tconst bunPath = findBunBinary(options);\n\tif (bunPath === undefined) return { kind: \"missing\" };\n\tconst version = options.bunVersion(bunPath);\n\treturn version !== undefined && bunVersionSatisfies(version)\n\t\t? { kind: \"ready\", version }\n\t\t: { kind: \"outdated\", version };\n}\n\nfunction skipRequested(): boolean {\n\tconst value = envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);\n\treturn value !== undefined && value !== \"\" && value !== \"0\";\n}\n\nexport function maybeShowRuntimeNotice(show: (spec: NoticeSpec) => void): void {\n\tconst agentDir = getAgentDir();\n\tconst skip = runtimeNoticeSkipReason({\n\t\tversions: process.versions,\n\t\tenv: process.env,\n\t\thasInheritedInspectorOption: hasInheritedInspectorOption(),\n\t\tskipRequested: skipRequested(),\n\t\tengineVersion: VERSION,\n\t\tshownVersion: readShownVersion(agentDir),\n\t});\n\tif (skip !== undefined) return;\n\tshow(\n\t\tbuildRuntimeNotice({\n\t\t\tappName: APP_NAME,\n\t\t\tappCommand: APP_COMMAND,\n\t\t\tnodeVersion: process.version,\n\t\t\tplatform: process.platform,\n\t\t\tinstallMethod: detectInstallMethod(),\n\t\t\ttarget: reinstallTarget(BRAND, PACKAGE_NAME),\n\t\t\tbun: detectBunAvailability(processBunRuntimeOptions(existsSync, realpathSync)),\n\t\t\tpinEnvName: runtimePinEnvName(process.env),\n\t\t}),\n\t);\n\trecordShownVersion(agentDir, VERSION);\n}\n"]}
@@ -0,0 +1,50 @@
1
+ import type { InstallMethod } from "../../config.ts";
2
+ import type { BrandProfile } from "../../core/brand.ts";
3
+ import type { NoticeSpec } from "../../core/extensions/notice/index.ts";
4
+ export declare const SKIP_RUNTIME_NOTICE_ENV_SUFFIX = "SKIP_RUNTIME_NOTICE";
5
+ export type RuntimeNoticeSkip = "bun-runtime" | "node-pinned" | "inspector" | "skip-requested" | "already-shown";
6
+ export interface RuntimeNoticeGate {
7
+ readonly versions: Readonly<Record<string, string | undefined>>;
8
+ readonly env: NodeJS.ProcessEnv;
9
+ readonly hasInheritedInspectorOption: boolean;
10
+ readonly skipRequested: boolean;
11
+ readonly engineVersion: string;
12
+ readonly shownVersion: string | undefined;
13
+ }
14
+ /**
15
+ * The variable that pins the runtime from the user's side. The OmO Native launcher always
16
+ * forwards its own runtime as `SENPI_RUNTIME`, so under OmO Native only `OMO_RUNTIME` is the
17
+ * user's choice; a forwarded `SENPI_RUNTIME=node` just means the launcher could not use Bun.
18
+ */
19
+ export declare function runtimePinEnvName(env: NodeJS.ProcessEnv): string;
20
+ export declare function runtimeNoticeSkipReason(gate: RuntimeNoticeGate): RuntimeNoticeSkip | undefined;
21
+ export type BunAvailability = {
22
+ readonly kind: "missing";
23
+ } | {
24
+ readonly kind: "outdated";
25
+ readonly version: string | undefined;
26
+ } | {
27
+ readonly kind: "ready";
28
+ readonly version: string;
29
+ };
30
+ export interface ReinstallTarget {
31
+ readonly packageName: string;
32
+ readonly installSpec: string;
33
+ readonly ignoreScripts: boolean;
34
+ }
35
+ export declare function reinstallTarget(brand: BrandProfile | undefined, packageName: string): ReinstallTarget | undefined;
36
+ /** Clean reinstall: remove the Node-managed copy so PATH cannot keep resolving it, then add it with Bun. */
37
+ export declare function bunReinstallCommand(method: InstallMethod, target: ReinstallTarget): string;
38
+ export declare function installBunCommand(platform: NodeJS.Platform): string;
39
+ export interface RuntimeNoticeInput {
40
+ readonly appName: string;
41
+ readonly appCommand: string;
42
+ readonly nodeVersion: string;
43
+ readonly platform: NodeJS.Platform;
44
+ readonly installMethod: InstallMethod;
45
+ readonly target: ReinstallTarget | undefined;
46
+ readonly bun: BunAvailability;
47
+ readonly pinEnvName: string;
48
+ }
49
+ export declare function buildRuntimeNotice(input: RuntimeNoticeInput): NoticeSpec;
50
+ //# sourceMappingURL=runtime-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-notice.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/runtime-notice.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAEpF,eAAO,MAAM,8BAA8B,wBAAwB,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEjH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAEhE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,SAAS,CAO9F;AAED,MAAM,MAAM,eAAe,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAQjH;AAiBD,4GAA4G;AAC5G,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAI1F;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAInE;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B;AAyBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,UAAU,CAaxE"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * The "running on Node.js" startup notice: when to show it and what it says.
3
+ *
4
+ * The only trigger is the runtime itself. Every install path that can run on Bun already
5
+ * re-execs there (`bun-runtime.ts` for senpi, the OmO Native launcher for omo), so a process
6
+ * still on Node here is one the user can fix: Bun is missing or too old, or the package was
7
+ * installed by a manager that keeps it on Node. Everything in this file is pure; the
8
+ * interactive mode supplies the facts through `runtime-notice-presenter.ts`.
9
+ */
10
+ import { MIN_BUN_VERSION, RUNTIME_ENV_VAR } from "../../bun-runtime.js";
11
+ export const SKIP_RUNTIME_NOTICE_ENV_SUFFIX = "SKIP_RUNTIME_NOTICE";
12
+ /**
13
+ * The variable that pins the runtime from the user's side. The OmO Native launcher always
14
+ * forwards its own runtime as `SENPI_RUNTIME`, so under OmO Native only `OMO_RUNTIME` is the
15
+ * user's choice; a forwarded `SENPI_RUNTIME=node` just means the launcher could not use Bun.
16
+ */
17
+ export function runtimePinEnvName(env) {
18
+ return env.OMO_NATIVE === "1" ? "OMO_RUNTIME" : RUNTIME_ENV_VAR;
19
+ }
20
+ export function runtimeNoticeSkipReason(gate) {
21
+ if (gate.versions.bun !== undefined)
22
+ return "bun-runtime";
23
+ if (gate.env[runtimePinEnvName(gate.env)] === "node")
24
+ return "node-pinned";
25
+ if (gate.hasInheritedInspectorOption)
26
+ return "inspector";
27
+ if (gate.skipRequested)
28
+ return "skip-requested";
29
+ if (gate.shownVersion === gate.engineVersion)
30
+ return "already-shown";
31
+ return undefined;
32
+ }
33
+ export function reinstallTarget(brand, packageName) {
34
+ if (brand === undefined)
35
+ return { packageName, installSpec: packageName, ignoreScripts: true };
36
+ const update = brand.update;
37
+ // A brand without an update channel manages its own installs; there is no command to offer.
38
+ if (update === undefined)
39
+ return undefined;
40
+ const installSpec = update.distTag === "latest" ? update.packageName : `${update.packageName}@${update.distTag}`;
41
+ // Branded products may rely on their install script; senpi documents --ignore-scripts.
42
+ return { packageName: update.packageName, installSpec, ignoreScripts: false };
43
+ }
44
+ function uninstallCommand(method, packageName) {
45
+ switch (method) {
46
+ case "npm":
47
+ return `npm uninstall -g ${packageName}`;
48
+ case "pnpm":
49
+ return `pnpm remove -g ${packageName}`;
50
+ case "yarn":
51
+ return `yarn global remove ${packageName}`;
52
+ case "bun":
53
+ case "bun-binary":
54
+ case "unknown":
55
+ return undefined;
56
+ }
57
+ }
58
+ /** Clean reinstall: remove the Node-managed copy so PATH cannot keep resolving it, then add it with Bun. */
59
+ export function bunReinstallCommand(method, target) {
60
+ const install = `bun add -g ${target.ignoreScripts ? "--ignore-scripts " : ""}${target.installSpec}`;
61
+ const uninstall = uninstallCommand(method, target.packageName);
62
+ return uninstall === undefined ? install : `${uninstall} && ${install}`;
63
+ }
64
+ export function installBunCommand(platform) {
65
+ return platform === "win32"
66
+ ? `powershell -c "irm bun.sh/install.ps1 | iex"`
67
+ : "curl -fsSL https://bun.sh/install | bash";
68
+ }
69
+ function bunStep(input) {
70
+ switch (input.bun.kind) {
71
+ case "missing":
72
+ return { text: `Install Bun: ${installBunCommand(input.platform)}`, tone: "accent" };
73
+ case "outdated":
74
+ return {
75
+ text: `Upgrade Bun (found ${input.bun.version ?? "an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,
76
+ tone: "accent",
77
+ };
78
+ case "ready":
79
+ return undefined;
80
+ }
81
+ }
82
+ function reinstallStep(input, afterBunStep) {
83
+ const lead = afterBunStep ? "Then reinstall" : "Reinstall";
84
+ // A Bun-global install needs no reinstall: a current Bun takes it over on the next launch.
85
+ if (input.installMethod === "bun" || input.target === undefined) {
86
+ return { text: `${afterBunStep ? "Then restart" : "Restart"} ${input.appCommand}.`, tone: "accent" };
87
+ }
88
+ return { text: `${lead} with Bun: ${bunReinstallCommand(input.installMethod, input.target)}`, tone: "accent" };
89
+ }
90
+ export function buildRuntimeNotice(input) {
91
+ const first = bunStep(input);
92
+ const extra = [
93
+ ...(first === undefined ? [] : [first]),
94
+ reinstallStep(input, first !== undefined),
95
+ { text: `To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.` },
96
+ ];
97
+ return {
98
+ title: "Running on Node.js",
99
+ tone: "warning",
100
+ why: `${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,
101
+ extra,
102
+ };
103
+ }
104
+ //# sourceMappingURL=runtime-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-notice.js","sourceRoot":"","sources":["../../../src/modes/interactive/runtime-notice.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The \"running on Node.js\" startup notice: when to show it and what it says.\n *\n * The only trigger is the runtime itself. Every install path that can run on Bun already\n * re-execs there (`bun-runtime.ts` for senpi, the OmO Native launcher for omo), so a process\n * still on Node here is one the user can fix: Bun is missing or too old, or the package was\n * installed by a manager that keeps it on Node. Everything in this file is pure; the\n * interactive mode supplies the facts through `runtime-notice-presenter.ts`.\n */\nimport { MIN_BUN_VERSION, RUNTIME_ENV_VAR } from \"../../bun-runtime.ts\";\nimport type { InstallMethod } from \"../../config.ts\";\nimport type { BrandProfile } from \"../../core/brand.ts\";\nimport type { NoticeLine, NoticeSpec } from \"../../core/extensions/notice/index.ts\";\n\nexport const SKIP_RUNTIME_NOTICE_ENV_SUFFIX = \"SKIP_RUNTIME_NOTICE\";\n\nexport type RuntimeNoticeSkip = \"bun-runtime\" | \"node-pinned\" | \"inspector\" | \"skip-requested\" | \"already-shown\";\n\nexport interface RuntimeNoticeGate {\n\treadonly versions: Readonly<Record<string, string | undefined>>;\n\treadonly env: NodeJS.ProcessEnv;\n\treadonly hasInheritedInspectorOption: boolean;\n\treadonly skipRequested: boolean;\n\treadonly engineVersion: string;\n\treadonly shownVersion: string | undefined;\n}\n\n/**\n * The variable that pins the runtime from the user's side. The OmO Native launcher always\n * forwards its own runtime as `SENPI_RUNTIME`, so under OmO Native only `OMO_RUNTIME` is the\n * user's choice; a forwarded `SENPI_RUNTIME=node` just means the launcher could not use Bun.\n */\nexport function runtimePinEnvName(env: NodeJS.ProcessEnv): string {\n\treturn env.OMO_NATIVE === \"1\" ? \"OMO_RUNTIME\" : RUNTIME_ENV_VAR;\n}\n\nexport function runtimeNoticeSkipReason(gate: RuntimeNoticeGate): RuntimeNoticeSkip | undefined {\n\tif (gate.versions.bun !== undefined) return \"bun-runtime\";\n\tif (gate.env[runtimePinEnvName(gate.env)] === \"node\") return \"node-pinned\";\n\tif (gate.hasInheritedInspectorOption) return \"inspector\";\n\tif (gate.skipRequested) return \"skip-requested\";\n\tif (gate.shownVersion === gate.engineVersion) return \"already-shown\";\n\treturn undefined;\n}\n\nexport type BunAvailability =\n\t| { readonly kind: \"missing\" }\n\t| { readonly kind: \"outdated\"; readonly version: string | undefined }\n\t| { readonly kind: \"ready\"; readonly version: string };\n\nexport interface ReinstallTarget {\n\treadonly packageName: string;\n\treadonly installSpec: string;\n\treadonly ignoreScripts: boolean;\n}\n\nexport function reinstallTarget(brand: BrandProfile | undefined, packageName: string): ReinstallTarget | undefined {\n\tif (brand === undefined) return { packageName, installSpec: packageName, ignoreScripts: true };\n\tconst update = brand.update;\n\t// A brand without an update channel manages its own installs; there is no command to offer.\n\tif (update === undefined) return undefined;\n\tconst installSpec = update.distTag === \"latest\" ? update.packageName : `${update.packageName}@${update.distTag}`;\n\t// Branded products may rely on their install script; senpi documents --ignore-scripts.\n\treturn { packageName: update.packageName, installSpec, ignoreScripts: false };\n}\n\nfunction uninstallCommand(method: InstallMethod, packageName: string): string | undefined {\n\tswitch (method) {\n\t\tcase \"npm\":\n\t\t\treturn `npm uninstall -g ${packageName}`;\n\t\tcase \"pnpm\":\n\t\t\treturn `pnpm remove -g ${packageName}`;\n\t\tcase \"yarn\":\n\t\t\treturn `yarn global remove ${packageName}`;\n\t\tcase \"bun\":\n\t\tcase \"bun-binary\":\n\t\tcase \"unknown\":\n\t\t\treturn undefined;\n\t}\n}\n\n/** Clean reinstall: remove the Node-managed copy so PATH cannot keep resolving it, then add it with Bun. */\nexport function bunReinstallCommand(method: InstallMethod, target: ReinstallTarget): string {\n\tconst install = `bun add -g ${target.ignoreScripts ? \"--ignore-scripts \" : \"\"}${target.installSpec}`;\n\tconst uninstall = uninstallCommand(method, target.packageName);\n\treturn uninstall === undefined ? install : `${uninstall} && ${install}`;\n}\n\nexport function installBunCommand(platform: NodeJS.Platform): string {\n\treturn platform === \"win32\"\n\t\t? `powershell -c \"irm bun.sh/install.ps1 | iex\"`\n\t\t: \"curl -fsSL https://bun.sh/install | bash\";\n}\n\nexport interface RuntimeNoticeInput {\n\treadonly appName: string;\n\treadonly appCommand: string;\n\treadonly nodeVersion: string;\n\treadonly platform: NodeJS.Platform;\n\treadonly installMethod: InstallMethod;\n\treadonly target: ReinstallTarget | undefined;\n\treadonly bun: BunAvailability;\n\treadonly pinEnvName: string;\n}\n\nfunction bunStep(input: RuntimeNoticeInput): NoticeLine | undefined {\n\tswitch (input.bun.kind) {\n\t\tcase \"missing\":\n\t\t\treturn { text: `Install Bun: ${installBunCommand(input.platform)}`, tone: \"accent\" };\n\t\tcase \"outdated\":\n\t\t\treturn {\n\t\t\t\ttext: `Upgrade Bun (found ${input.bun.version ?? \"an unreadable version\"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,\n\t\t\t\ttone: \"accent\",\n\t\t\t};\n\t\tcase \"ready\":\n\t\t\treturn undefined;\n\t}\n}\n\nfunction reinstallStep(input: RuntimeNoticeInput, afterBunStep: boolean): NoticeLine {\n\tconst lead = afterBunStep ? \"Then reinstall\" : \"Reinstall\";\n\t// A Bun-global install needs no reinstall: a current Bun takes it over on the next launch.\n\tif (input.installMethod === \"bun\" || input.target === undefined) {\n\t\treturn { text: `${afterBunStep ? \"Then restart\" : \"Restart\"} ${input.appCommand}.`, tone: \"accent\" };\n\t}\n\treturn { text: `${lead} with Bun: ${bunReinstallCommand(input.installMethod, input.target)}`, tone: \"accent\" };\n}\n\nexport function buildRuntimeNotice(input: RuntimeNoticeInput): NoticeSpec {\n\tconst first = bunStep(input);\n\tconst extra: NoticeLine[] = [\n\t\t...(first === undefined ? [] : [first]),\n\t\treinstallStep(input, first !== undefined),\n\t\t{ text: `To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.` },\n\t];\n\treturn {\n\t\ttitle: \"Running on Node.js\",\n\t\ttone: \"warning\",\n\t\twhy: `${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,\n\t\textra,\n\t};\n}\n"]}
@@ -87,6 +87,8 @@ These variables are read by Pi itself:
87
87
  | `PI_PACKAGE_DIR` | Override the package directory, useful for Nix/Guix store paths |
88
88
  | `PI_OFFLINE` | Disable startup network operations, including update checks, package updates, and install/update telemetry |
89
89
  | `PI_SKIP_VERSION_CHECK` | Disable the `pi.dev` latest-version request |
90
+ | `SENPI_RUNTIME` | `node` keeps senpi on Node.js and hides the Node.js runtime notice; `bun` re-execs under any installed Bun. Without it, a Bun-global install runs on its Bun and any other installed package runs on a discovered Bun 1.4.0 or newer |
91
+ | `PI_SKIP_RUNTIME_NOTICE` | Hide the one-time "Running on Node.js" notice without changing the runtime |
90
92
  | `PI_TELEMETRY` | Override install/update telemetry and provider attribution headers: `1`/`true`/`yes` or `0`/`false`/`no` |
91
93
  | `PI_CACHE_RETENTION` | Set to `long` to opt into extended provider prompt caching where supported; direct Anthropic defaults to 5 minutes |
92
94
  | `PI_SHARE_VIEWER_URL` | Override the base URL used by `/share` |
@@ -13,12 +13,18 @@ Senpi is distributed as an npm package:
13
13
  bun add -g @code-yeongyu/senpi
14
14
  ```
15
15
 
16
+ Senpi runs on Bun whenever it can: a `bun add -g` install always does, and an npm, pnpm, or Yarn
17
+ install hands itself to Bun 1.4.0 or newer when one is installed. If senpi still starts on Node.js
18
+ (no Bun, or an older one), the interactive UI shows a "Running on Node.js" notice once per version
19
+ with the commands to install or upgrade Bun and reinstall senpi with it. Set `SENPI_RUNTIME=node`
20
+ to stay on Node.js without the notice.
21
+
16
22
  ### Uninstall
17
23
 
18
24
  Use the package manager that installed senpi:
19
25
 
20
26
  ```bash
21
- # bun add -g
27
+ # npm
22
28
  npm uninstall -g @code-yeongyu/senpi
23
29
 
24
30
  # pnpm
@@ -12,6 +12,18 @@
12
12
 
13
13
  ### Removed
14
14
 
15
+ ## [2026.9.27] - 2026-09-27
16
+
17
+ ### Breaking Changes
18
+
19
+ ### Added
20
+
21
+ ### Changed
22
+
23
+ ### Fixed
24
+
25
+ ### Removed
26
+
15
27
  ## [2026.9.26] - 2026-09-26
16
28
 
17
29
  ### Breaking Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.9.26",
3
+ "version": "2026.9.27",
4
4
  "private": true,
5
5
  "description": "Source-only senpi extension package for codemode evaluation tools",
6
6
  "type": "module",
@@ -31,14 +31,14 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@babel/parser": "8.0.4",
34
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.26",
34
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.27",
35
35
  "typebox": "1.3.34"
36
36
  },
37
37
  "peerDependencies": {
38
- "@code-yeongyu/senpi": "2026.9.26"
38
+ "@code-yeongyu/senpi": "2026.9.27"
39
39
  },
40
40
  "devDependencies": {
41
- "@code-yeongyu/senpi": "2026.9.26"
41
+ "@code-yeongyu/senpi": "2026.9.27"
42
42
  },
43
43
  "keywords": [
44
44
  "senpi",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-agent-core",
3
- "version": "2026.9.26",
3
+ "version": "2026.9.27",
4
4
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -57,8 +57,8 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@earendil-works/chord": "0.85.1",
60
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.26",
61
- "@earendil-works/pi-telemetry": "npm:@code-yeongyu/senpi-telemetry@2026.9.26",
60
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.27",
61
+ "@earendil-works/pi-telemetry": "npm:@code-yeongyu/senpi-telemetry@2026.9.27",
62
62
  "diff": "9.0.0",
63
63
  "ignore": "7.0.9",
64
64
  "typebox": "1.3.34",
@@ -1 +1 @@
1
- {"schemaVersion":3,"generatedAt":"2026-09-26T06:36:10.631Z","structureHash":"20e7e8c4809315751fc5039acaa4afa63f582b93a109b71de50a85ce390366c5","files":{"alibaba-token-plan.json":"3a9c1be76d47459371e9fa2feeffc31e7edbbfec65fa9cc41236988efc4cf6d9","amazon-bedrock.json":"848e38fd1ade9c6e94c3037c1c6104ac515809a6f190d264eafd9f48ab0ae1ae","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"f9db437d92449fb860a2d457a6019cdfd51c11180c08df2b5f14d75ade773953","azure-openai-responses.json":"d70ff10410e6dd8eacb4a53b9fe887be836562cbb4b74eaee4f28bdbc4ac0732","bai.json":"2b12b15bd43462e60711944dd7283db8676611d9d76c82c2a01f64913e16a67e","baseten.json":"d155c434294b5167244cffb6dea6793f9669e91e8ab65b564f9510d81b330e37","cerebras.json":"3be228c613905c215c9da3d0b3535e10cc594ff2351b05390744c7c34de89b6c","chatgpt-subscription.json":"421c6ad932de4259c8f0c08589da278bed99ec80c042f2490d8ffd2a86f4da99","cloudflare-ai-gateway.json":"b64cc5c7c0df4bfce0c3c2b14fe5290636553914b09718634668ad98276a9bc5","cloudflare-workers-ai.json":"8ee15540a01cf79d0e4063c493ae3c436af2fc1d456f9faf1b066418247183e9","deepseek.json":"b5f9693ec641e9a957dc5f7a22042b3bb928bac3d7268406619b6f18e21c4b83","fireworks.json":"6db9832f7e9d817050646f8b266d64128040c1b8f1d34bd4c9b6e5a74bbac3bf","github-copilot.json":"5c9fc5b1b553a26aa7bc843a3e36fa14cf220d528ecd89528c601c5090c88a2d","google-vertex.json":"97d80ac909d256cc1bf19ac54d9d8131c492e7c0c102ad89f68ade528544e0ad","google.json":"68f6cf6283cc0d69b77b0fa79e9c94774e96524f61ebba616319f05d5c9db56c","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"2f93082144a7b2a1cbf79148244ce7559e0428d6310c5eb0648bca89b15a8b4b","minimax-cn.json":"4f636b47b28a507ad33b5eaba33fc4889e5956504d10f2a0d9c61167ae01ff1d","minimax.json":"9fd1764ffeefebded8579039cf0c48854a43e4c5b724f62361fc2ac54f705aa1","mistral.json":"be522597b22bceeb0bb9a0ba1781647649ffd19637d0c8e67b056d7b0ec33d52","moonshotai-cn.json":"326de79b46f6fdbf0879f005b3040d1b14049e81fa678de407b73ed1bd3bce9c","moonshotai.json":"4b917a375e9c880b903927cf5fe1ae1052c74b64d5027a007bb1e67ad0410755","nvidia.json":"6493e09b5db8b8fe9c8fae5bc15dc287645f37f83a4ed3a1ad1181e5830b5ff7","openai.json":"4c18b28b168f56d621670866a62d2d435da3a8eee55a204bdbabe02c48e6513e","opencode-go.json":"128c2f110f817e4151ce61dc4a93e2e13db24f309ddee3f36b55c07366043b77","opencode.json":"f6b593f8b3fe1fd32a655104550b0cf99b0a63f9c5adde0b5b5c6020a9ed33f1","opengateway.json":"121f544154757cfbccd3bc3d7344986a5822886c12e1c00b39ebf20ef609f239","openrouter.json":"6ffb7cd27ce403ca8fd444e2bfb73ea1c9ae8d7b7e6bff3e12efac87f26238e2","qwen-token-plan-cn.json":"4bf520ed38e5c3045680d2ec2816fa8a69079dbe97f7b929767a63172288da6b","qwen-token-plan-individual.json":"eb040e78595853e980011308b1bf9caacae6dc8a91abbac5ffebd402515dd2a6","qwen-token-plan.json":"a5c67213745329ec3ba79f712f31c1c32a781d7ffb8c04f9819f36c27672531f","together.json":"200fa2cc0b4666e3818c260e41b9925b925180e2d0931d7c900e16494b2314b4","venice.json":"d34b566ee6e7a2ed31abd9099a1c0448f1d521fc696382d03d86c90634270cf1","vercel-ai-gateway.json":"ee3bc2eacaae8fa49420f0dfe133eb277fcb758863ccc3a69b7e1bd4fde645dd","xai.json":"9b23faa5218e966a17108c05d2498a617ade1eae9b0d0684284c77d67949a3f1","xiaomi-token-plan-ams.json":"7df74a255259fc1d5be8e682c3ffb0908eaaf0af711f6433dedcf345ce3e8393","xiaomi-token-plan-cn.json":"7dc672723d5b37e5b92605752f74f46f44eba10be2b0cb959790260b9e0c2a4e","xiaomi-token-plan-sgp.json":"69b333b158be038459a511a673f4536a5b03d4931c3119339f1ac741bc03d502","xiaomi.json":"333299657f211ad9edac0f3d4298b7e5776626914c9c80e22305a87533f23966","zai-coding-cn.json":"69c572aa75104f16ccbddbaace60c267f4bcc74f86d34891ca43110d312fb1ad","zai.json":"15c8182a88e58bdc1b1c3eb0603c690475342c8a826ceddfe9af1b36b28345ee"}}
1
+ {"schemaVersion":3,"generatedAt":"2026-09-27T04:28:13.133Z","structureHash":"de13fd32a0f46b302e3edd0d4d50c72e20019642cf25e876b706b4edc97089e5","files":{"alibaba-token-plan.json":"3a9c1be76d47459371e9fa2feeffc31e7edbbfec65fa9cc41236988efc4cf6d9","amazon-bedrock.json":"848e38fd1ade9c6e94c3037c1c6104ac515809a6f190d264eafd9f48ab0ae1ae","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"f9db437d92449fb860a2d457a6019cdfd51c11180c08df2b5f14d75ade773953","azure-openai-responses.json":"d70ff10410e6dd8eacb4a53b9fe887be836562cbb4b74eaee4f28bdbc4ac0732","bai.json":"2b12b15bd43462e60711944dd7283db8676611d9d76c82c2a01f64913e16a67e","baseten.json":"d155c434294b5167244cffb6dea6793f9669e91e8ab65b564f9510d81b330e37","cerebras.json":"3be228c613905c215c9da3d0b3535e10cc594ff2351b05390744c7c34de89b6c","chatgpt-subscription.json":"421c6ad932de4259c8f0c08589da278bed99ec80c042f2490d8ffd2a86f4da99","cloudflare-ai-gateway.json":"b64cc5c7c0df4bfce0c3c2b14fe5290636553914b09718634668ad98276a9bc5","cloudflare-workers-ai.json":"8ee15540a01cf79d0e4063c493ae3c436af2fc1d456f9faf1b066418247183e9","deepseek.json":"b5f9693ec641e9a957dc5f7a22042b3bb928bac3d7268406619b6f18e21c4b83","fireworks.json":"bbb8149854a2658f221afa47ae8e2617e6b58a8e2784aa822faaf54f0c0f18c3","github-copilot.json":"5c9fc5b1b553a26aa7bc843a3e36fa14cf220d528ecd89528c601c5090c88a2d","google-vertex.json":"97d80ac909d256cc1bf19ac54d9d8131c492e7c0c102ad89f68ade528544e0ad","google.json":"68f6cf6283cc0d69b77b0fa79e9c94774e96524f61ebba616319f05d5c9db56c","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"2f93082144a7b2a1cbf79148244ce7559e0428d6310c5eb0648bca89b15a8b4b","minimax-cn.json":"4f636b47b28a507ad33b5eaba33fc4889e5956504d10f2a0d9c61167ae01ff1d","minimax.json":"9fd1764ffeefebded8579039cf0c48854a43e4c5b724f62361fc2ac54f705aa1","mistral.json":"be522597b22bceeb0bb9a0ba1781647649ffd19637d0c8e67b056d7b0ec33d52","moonshotai-cn.json":"326de79b46f6fdbf0879f005b3040d1b14049e81fa678de407b73ed1bd3bce9c","moonshotai.json":"4b917a375e9c880b903927cf5fe1ae1052c74b64d5027a007bb1e67ad0410755","nvidia.json":"6493e09b5db8b8fe9c8fae5bc15dc287645f37f83a4ed3a1ad1181e5830b5ff7","openai.json":"4c18b28b168f56d621670866a62d2d435da3a8eee55a204bdbabe02c48e6513e","opencode-go.json":"00b2c0154285829e8db1e7b9ad492771b098cb88a61b036e51a6861b2f2f6dc1","opencode.json":"1655e248e76f919fd14ca4b8a6201d1dd89b2190b295028c5d7a4a2a03809946","opengateway.json":"121f544154757cfbccd3bc3d7344986a5822886c12e1c00b39ebf20ef609f239","openrouter.json":"0e9b4a8b67efcfb16f8bb1ac891eca0a9a8a5958df944071c35e32671740f9e3","qwen-token-plan-cn.json":"4bf520ed38e5c3045680d2ec2816fa8a69079dbe97f7b929767a63172288da6b","qwen-token-plan-individual.json":"eb040e78595853e980011308b1bf9caacae6dc8a91abbac5ffebd402515dd2a6","qwen-token-plan.json":"a5c67213745329ec3ba79f712f31c1c32a781d7ffb8c04f9819f36c27672531f","together.json":"200fa2cc0b4666e3818c260e41b9925b925180e2d0931d7c900e16494b2314b4","venice.json":"d34b566ee6e7a2ed31abd9099a1c0448f1d521fc696382d03d86c90634270cf1","vercel-ai-gateway.json":"95a697cd6f9eba46972dbfa301e80f18f45c701e6068c0326d2f36da10b7ce7e","xai.json":"9b23faa5218e966a17108c05d2498a617ade1eae9b0d0684284c77d67949a3f1","xiaomi-token-plan-ams.json":"7df74a255259fc1d5be8e682c3ffb0908eaaf0af711f6433dedcf345ce3e8393","xiaomi-token-plan-cn.json":"7dc672723d5b37e5b92605752f74f46f44eba10be2b0cb959790260b9e0c2a4e","xiaomi-token-plan-sgp.json":"69b333b158be038459a511a673f4536a5b03d4931c3119339f1ac741bc03d502","xiaomi.json":"333299657f211ad9edac0f3d4298b7e5776626914c9c80e22305a87533f23966","zai-coding-cn.json":"69c572aa75104f16ccbddbaace60c267f4bcc74f86d34891ca43110d312fb1ad","zai.json":"15c8182a88e58bdc1b1c3eb0603c690475342c8a826ceddfe9af1b36b28345ee"}}
@@ -1 +1 @@
1
- {"anthropic-messages":{"accounts/fireworks/models/deepseek-v4-flash-0731":{"id":"accounts/fireworks/models/deepseek-v4-flash-0731","name":"DeepSeek V4 Flash 0731","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.22,"output":0.66,"cacheRead":0.007,"cacheWrite":0},"contextWindow":1000000,"maxTokens":384000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/deepseek-v4-flash-vision-exp":{"id":"accounts/fireworks/models/deepseek-v4-flash-vision-exp","name":"DeepSeek V4 Flash Vision Exp","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.22,"output":0.66,"cacheRead":0.007,"cacheWrite":0},"contextWindow":1000000,"maxTokens":384000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/deepseek-v4-pro":{"id":"accounts/fireworks/models/deepseek-v4-pro","name":"DeepSeek V4 Pro","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":1.2,"output":1.2,"cacheRead":0.6,"cacheWrite":0},"contextWindow":1000000,"maxTokens":384000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/deepseek-v4-pro-0813":{"id":"accounts/fireworks/models/deepseek-v4-pro-0813","name":"DeepSeek V4 Pro 0813","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":1.32,"output":3.96,"cacheRead":0.044,"cacheWrite":0},"contextWindow":1000000,"maxTokens":384000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/deepseek-v4p1-flash":{"id":"accounts/fireworks/models/deepseek-v4p1-flash","name":"DeepSeek V4.1 Flash","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.22,"output":0.66,"cacheRead":0.007,"cacheWrite":0},"contextWindow":1000000,"maxTokens":384000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/ember-1":{"id":"accounts/fireworks/models/ember-1","name":"Ember-1","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/gpt-oss-120b":{"id":"accounts/fireworks/models/gpt-oss-120b","name":"GPT OSS 120B","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.15,"output":0.6,"cacheRead":0.015,"cacheWrite":0},"contextWindow":131072,"maxTokens":32768,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":null}},"accounts/fireworks/models/inkling":{"id":"accounts/fireworks/models/inkling","name":"Inkling","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":1,"output":4.05,"cacheRead":0.17,"cacheWrite":0},"contextWindow":1048576,"maxTokens":1048576,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}},"accounts/fireworks/models/kimi-k2p6":{"id":"accounts/fireworks/models/kimi-k2p6","name":"Kimi K2.6","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.95,"output":4,"cacheRead":0.16,"cacheWrite":0},"contextWindow":262000,"maxTokens":262000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}},"accounts/fireworks/models/kimi-k2p7-code":{"id":"accounts/fireworks/models/kimi-k2p7-code","name":"Kimi K2.7 Code","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.95,"output":4,"cacheRead":0.19,"cacheWrite":0},"contextWindow":262000,"maxTokens":262000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}},"accounts/fireworks/models/minimax-m2p7":{"id":"accounts/fireworks/models/minimax-m2p7","name":"MiniMax-M2.7","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":1.2,"output":1.2,"cacheRead":0.6,"cacheWrite":0},"contextWindow":196608,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":null}},"accounts/fireworks/models/minimax-m3":{"id":"accounts/fireworks/models/minimax-m3","name":"MiniMax-M3","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.3,"output":1.2,"cacheRead":0.06,"cacheWrite":0},"contextWindow":512000,"maxTokens":512000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":null}},"accounts/fireworks/models/muse-glimmer-30b":{"id":"accounts/fireworks/models/muse-glimmer-30b","name":"Muse Glimmer 30B","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.35,"output":1.5,"cacheRead":0.04,"cacheWrite":0},"contextWindow":131072,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":"medium","high":"high","xhigh":"xhigh","max":null}},"accounts/fireworks/models/nemotron-3-ultra-nvfp4":{"id":"accounts/fireworks/models/nemotron-3-ultra-nvfp4","name":"Nemotron 3 Ultra 550B A55B","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.6,"output":2.4,"cacheRead":0.12,"cacheWrite":0},"contextWindow":262144,"maxTokens":128000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}},"accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b":{"id":"accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b","name":"Nemotron 3.5 Lightning 30B A3B","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.05,"output":0.2,"cacheRead":0.01,"cacheWrite":0},"contextWindow":262144,"maxTokens":262144,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}},"accounts/fireworks/models/qwen3p7-plus":{"id":"accounts/fireworks/models/qwen3p7-plus","name":"Qwen 3.7 Plus","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.4,"output":1.6,"cacheRead":0.08,"cacheWrite":0},"contextWindow":262144,"maxTokens":65536,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":null}},"accounts/fireworks/models/qwen3p8-2p4t-a95b":{"id":"accounts/fireworks/models/qwen3p8-2p4t-a95b","name":"Qwen3.8 2.4T A95B","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":2,"output":6,"cacheRead":0.25,"cacheWrite":0},"contextWindow":262144,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":null,"xhigh":"xhigh","max":null}},"accounts/fireworks/models/qwen3p8-max":{"id":"accounts/fireworks/models/qwen3p8-max","name":"Qwen3.8 Max","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":2,"output":6,"cacheRead":0.25,"cacheWrite":0},"contextWindow":262144,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":null,"xhigh":"xhigh","max":null}},"accounts/fireworks/routers/deepseek-flash-latest":{"id":"accounts/fireworks/routers/deepseek-flash-latest","name":"DeepSeek Flash Latest","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.22,"output":0.66,"cacheRead":0.007,"cacheWrite":0},"contextWindow":1000000,"maxTokens":384000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/kimi-fast-latest":{"id":"accounts/fireworks/routers/kimi-fast-latest","name":"Kimi Fast Latest","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":4.5,"output":22.5,"cacheRead":0.45,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/kimi-latest":{"id":"accounts/fireworks/routers/kimi-latest","name":"Kimi Latest","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/minimax-latest":{"id":"accounts/fireworks/routers/minimax-latest","name":"MiniMax Latest","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.3,"output":1.2,"cacheRead":0.06,"cacheWrite":0},"contextWindow":512000,"maxTokens":512000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":null}},"accounts/fireworks/routers/qwen-max-latest":{"id":"accounts/fireworks/routers/qwen-max-latest","name":"Qwen Max Latest (Qwen3.8 Max)","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":2,"output":6,"cacheRead":0.25,"cacheWrite":0},"contextWindow":262144,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}}},"openai-completions":{"accounts/fireworks/models/glm-5p2":{"id":"accounts/fireworks/models/glm-5p2","name":"GLM 5.2","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.14,"cacheWrite":0},"contextWindow":1048575,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/glm-5p3":{"id":"accounts/fireworks/models/glm-5p3","name":"GLM 5.3","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"contextWindow":1048573,"maxTokens":262144,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/glm-5p3-flash":{"id":"accounts/fireworks/models/glm-5p3-flash","name":"GLM 5.3 Flash","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.15,"output":0.5,"cacheRead":0.03,"cacheWrite":0},"contextWindow":1048573,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/kimi-k3":{"id":"accounts/fireworks/models/kimi-k3","name":"Kimi K3","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false,"requiresReasoningContentOnAssistantMessages":true,"thinkingFormat":"openai","deferredToolsMode":"kimi"},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-5p2-fast":{"id":"accounts/fireworks/routers/glm-5p2-fast","name":"GLM 5.2 Fast","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":2.1,"output":6.6,"cacheRead":0.21,"cacheWrite":0},"contextWindow":1048575,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-5p3-fast":{"id":"accounts/fireworks/routers/glm-5p3-fast","name":"GLM 5.3 Fast","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":2.1,"output":6.6,"cacheRead":0.39,"cacheWrite":0},"contextWindow":1048572,"maxTokens":262144,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-fast-latest":{"id":"accounts/fireworks/routers/glm-fast-latest","name":"GLM 5.3 Fast (Latest)","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":2.1,"output":6.6,"cacheRead":0.39,"cacheWrite":0},"contextWindow":1048572,"maxTokens":262144,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-flash-latest":{"id":"accounts/fireworks/routers/glm-flash-latest","name":"GLM Flash Latest (GLM 5.3 Flash)","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.15,"output":0.5,"cacheRead":0.03,"cacheWrite":0},"contextWindow":1048573,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-latest":{"id":"accounts/fireworks/routers/glm-latest","name":"GLM Latest","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"contextWindow":1048573,"maxTokens":262144,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/kimi-k3-fast":{"id":"accounts/fireworks/routers/kimi-k3-fast","name":"Kimi K3 Fast","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":4.5,"output":22.5,"cacheRead":0.45,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false,"requiresReasoningContentOnAssistantMessages":true,"thinkingFormat":"openai","deferredToolsMode":"kimi"},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}}}}
1
+ {"anthropic-messages":{"accounts/fireworks/models/deepseek-v4p1-flash":{"id":"accounts/fireworks/models/deepseek-v4p1-flash","name":"DeepSeek V4.1 Flash","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.22,"output":0.66,"cacheRead":0.007,"cacheWrite":0},"contextWindow":1000000,"maxTokens":384000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/ember-1":{"id":"accounts/fireworks/models/ember-1","name":"Ember-1","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/gpt-oss-120b":{"id":"accounts/fireworks/models/gpt-oss-120b","name":"GPT OSS 120B","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.15,"output":0.6,"cacheRead":0.015,"cacheWrite":0},"contextWindow":131072,"maxTokens":32768,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":null}},"accounts/fireworks/models/inkling":{"id":"accounts/fireworks/models/inkling","name":"Inkling","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":1,"output":4.05,"cacheRead":0.17,"cacheWrite":0},"contextWindow":1048576,"maxTokens":1048576,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}},"accounts/fireworks/models/minimax-m3":{"id":"accounts/fireworks/models/minimax-m3","name":"MiniMax-M3","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.3,"output":1.2,"cacheRead":0.06,"cacheWrite":0},"contextWindow":512000,"maxTokens":512000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":null}},"accounts/fireworks/models/nemotron-3-ultra-nvfp4":{"id":"accounts/fireworks/models/nemotron-3-ultra-nvfp4","name":"Nemotron 3 Ultra 550B A55B","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.6,"output":2.4,"cacheRead":0.12,"cacheWrite":0},"contextWindow":262144,"maxTokens":128000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}},"accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b":{"id":"accounts/fireworks/models/nemotron-lightning-3p5-30b-a3b","name":"Nemotron 3.5 Lightning 30B A3B","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.05,"output":0.2,"cacheRead":0.01,"cacheWrite":0},"contextWindow":262144,"maxTokens":262144,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}},"accounts/fireworks/models/qwen3p8-2p4t-a95b":{"id":"accounts/fireworks/models/qwen3p8-2p4t-a95b","name":"Qwen3.8 2.4T A95B","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":2,"output":6,"cacheRead":0.25,"cacheWrite":0},"contextWindow":262144,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":null,"xhigh":"xhigh","max":null}},"accounts/fireworks/models/qwen3p8-max":{"id":"accounts/fireworks/models/qwen3p8-max","name":"Qwen3.8 Max","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":2,"output":6,"cacheRead":0.25,"cacheWrite":0},"contextWindow":262144,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":null,"xhigh":"xhigh","max":null}},"accounts/fireworks/routers/deepseek-flash-latest":{"id":"accounts/fireworks/routers/deepseek-flash-latest","name":"DeepSeek Flash Latest","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.22,"output":0.66,"cacheRead":0.007,"cacheWrite":0},"contextWindow":1000000,"maxTokens":384000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/kimi-fast-latest":{"id":"accounts/fireworks/routers/kimi-fast-latest","name":"Kimi Fast Latest","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":4.5,"output":22.5,"cacheRead":0.45,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/kimi-latest":{"id":"accounts/fireworks/routers/kimi-latest","name":"Kimi Latest","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":"none","minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/minimax-latest":{"id":"accounts/fireworks/routers/minimax-latest","name":"MiniMax Latest","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":0.3,"output":1.2,"cacheRead":0.06,"cacheWrite":0},"contextWindow":512000,"maxTokens":512000,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false,"forceAdaptiveThinking":true},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":"medium","high":"high","xhigh":null,"max":null}},"accounts/fireworks/routers/qwen-max-latest":{"id":"accounts/fireworks/routers/qwen-max-latest","name":"Qwen Max Latest (Qwen3.8 Max)","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":2,"output":6,"cacheRead":0.25,"cacheWrite":0},"contextWindow":262144,"maxTokens":131072,"api":"anthropic-messages","baseUrl":"https://api.fireworks.ai/inference","compat":{"supportsToolReferences":true,"allowEmptySignature":true,"sendSessionAffinityHeaders":true,"supportsEagerToolInputStreaming":false,"supportsCacheControlOnTools":false,"supportsLongCacheRetention":false}}},"openai-completions":{"accounts/fireworks/models/glm-5p3":{"id":"accounts/fireworks/models/glm-5p3","name":"GLM 5.3","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"contextWindow":1048573,"maxTokens":262144,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/glm-5p3-flash":{"id":"accounts/fireworks/models/glm-5p3-flash","name":"GLM 5.3 Flash","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.15,"output":0.5,"cacheRead":0.03,"cacheWrite":0},"contextWindow":1048573,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/models/kimi-k3":{"id":"accounts/fireworks/models/kimi-k3","name":"Kimi K3","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false,"requiresReasoningContentOnAssistantMessages":true,"thinkingFormat":"openai","deferredToolsMode":"kimi"},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-5p3-fast":{"id":"accounts/fireworks/routers/glm-5p3-fast","name":"GLM 5.3 Fast","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":2.1,"output":6.6,"cacheRead":0.39,"cacheWrite":0},"contextWindow":1048572,"maxTokens":262144,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-fast-latest":{"id":"accounts/fireworks/routers/glm-fast-latest","name":"GLM 5.3 Fast (Latest)","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":2.1,"output":6.6,"cacheRead":0.39,"cacheWrite":0},"contextWindow":1048572,"maxTokens":262144,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-flash-latest":{"id":"accounts/fireworks/routers/glm-flash-latest","name":"GLM Flash Latest (GLM 5.3 Flash)","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":0.15,"output":0.5,"cacheRead":0.03,"cacheWrite":0},"contextWindow":1048573,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/glm-latest":{"id":"accounts/fireworks/routers/glm-latest","name":"GLM Latest","provider":"fireworks","reasoning":true,"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"contextWindow":1048573,"maxTokens":262144,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}},"accounts/fireworks/routers/kimi-k3-fast":{"id":"accounts/fireworks/routers/kimi-k3-fast","name":"Kimi K3 Fast","provider":"fireworks","reasoning":true,"input":["text","image"],"cost":{"input":4.5,"output":22.5,"cacheRead":0.45,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072,"api":"openai-completions","baseUrl":"https://api.fireworks.ai/inference/v1","compat":{"supportsStore":false,"supportsDeveloperRole":false,"sendSessionAffinityHeaders":true,"supportsLongCacheRetention":false,"requiresReasoningContentOnAssistantMessages":true,"thinkingFormat":"openai","deferredToolsMode":"kimi"},"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"}}}}