@fudrouter/fsrouter 0.6.56 → 0.6.58

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.
@@ -176,7 +176,7 @@ class GlmExecutor extends DefaultExecutor {
176
176
  const cleanedBody = super.transformRequest(model, body, stream, credentials);
177
177
  return applyGlmRequestDefaults(cleanedBody, this.config.requestDefaults);
178
178
  }
179
- transformForTransport(model, body, stream, credentials, transport) {
179
+ async transformForTransport(model, body, stream, credentials, transport) {
180
180
  const effortTier = parseGlm52Effort(model);
181
181
  const effectiveModel = effortTier ? effortTier.baseModel : model;
182
182
  const transformed = this.transformRequest(effectiveModel, body, stream, credentials);
@@ -197,7 +197,7 @@ class GlmExecutor extends DefaultExecutor {
197
197
  }
198
198
  return transformed;
199
199
  }
200
- const translated = translateRequest(
200
+ const translated = await translateRequest(
201
201
  FORMATS.OPENAI,
202
202
  FORMATS.CLAUDE,
203
203
  effectiveModel,
@@ -221,13 +221,18 @@ function applyAdaptiveBudget(body, cfg) {
221
221
  );
222
222
  return setCustomBudget(body, budget);
223
223
  }
224
- function hasThinkingCapableModel(body) {
224
+ export function hasThinkingCapableModel(body) {
225
225
  const model = getStringField(toRecord(body), "model");
226
226
  const resolved = getResolvedModelCapabilities(model);
227
227
  if (resolved.supportsThinking === true) return true;
228
228
  if (resolved.supportsThinking === false) return false;
229
229
  return model.includes("claude") || model.includes("o1") || model.includes("o3") || model.includes("o4") || model.includes("gemini") || model.endsWith("-thinking") || model.includes("thinking");
230
230
  }
231
+ export function resolveKiroThinkingBudget(body, headers, model) {
232
+ return isThinkingEnabled(body, headers, model)
233
+ ? KIRO_THINKING_BUDGET_DEFAULT
234
+ : 0;
235
+ }
231
236
  export {
232
237
  DEFAULT_THINKING_CONFIG,
233
238
  EFFORT_BUDGETS,
@@ -236,7 +241,6 @@ export {
236
241
  applyThinkingBudget,
237
242
  ensureThinkingConfig,
238
243
  getThinkingBudgetConfig,
239
- hasThinkingCapableModel,
240
244
  hydrateThinkingBudgetConfig,
241
245
  normalizeThinkingLevel,
242
246
  setThinkingBudgetConfig
@@ -10,11 +10,36 @@ import { AntigravityExecutor } from "../executors/antigravity.js";
10
10
  const requestRegistry = new Map();
11
11
  const responseRegistry = new Map();
12
12
 
13
- import { createRequire } from "module";
14
- const require = createRequire(import.meta.url);
13
+ // Eagerly pre-load all translators at module load time
14
+ // (prevents race condition with mixed sync require() + dynamic import())
15
+ const reqMods = [
16
+ "./request/claude-to-openai.js",
17
+ "./request/openai-to-claude.js",
18
+ "./request/gemini-to-openai.js",
19
+ "./request/openai-to-gemini.js",
20
+ "./request/openai-to-vertex.js",
21
+ "./request/antigravity-to-openai.js",
22
+ "./request/openai-responses.js",
23
+ "./request/openai-to-kiro.js",
24
+ "./request/openai-to-cursor.js",
25
+ "./request/openai-to-ollama.js",
26
+ "./request/openai-to-commandcode.js",
27
+ ];
28
+ const resMods = [
29
+ "./response/claude-to-openai.js",
30
+ "./response/openai-to-claude.js",
31
+ "./response/gemini-to-openai.js",
32
+ "./response/openai-to-antigravity.js",
33
+ "./response/openai-responses.js",
34
+ "./response/kiro-to-openai.js",
35
+ "./response/cursor-to-openai.js",
36
+ "./response/ollama-to-openai.js",
37
+ "./response/commandcode-to-openai.js",
38
+ ];
39
+ await Promise.all([...reqMods, ...resMods].map(m => import(m)));
15
40
 
16
41
  // Track initialization state
17
- let initialized = false;
42
+ let initialized = true;
18
43
 
19
44
  // Register translator
20
45
  export function register(from, to, requestFn, responseFn) {
@@ -27,35 +52,8 @@ export function register(from, to, requestFn, responseFn) {
27
52
  }
28
53
  }
29
54
 
30
- // Lazy load translators (called once on first use)
31
- function ensureInitialized() {
32
- if (initialized) return;
33
- initialized = true;
34
-
35
- // Request translators - sync require pattern for bundler
36
- require("./request/claude-to-openai.js");
37
- require("./request/openai-to-claude.js");
38
- require("./request/gemini-to-openai.js");
39
- require("./request/openai-to-gemini.js");
40
- require("./request/openai-to-vertex.js");
41
- require("./request/antigravity-to-openai.js");
42
- require("./request/openai-responses.js");
43
- require("./request/openai-to-kiro.js");
44
- require("./request/openai-to-cursor.js");
45
- require("./request/openai-to-ollama.js");
46
- require("./request/openai-to-commandcode.js");
47
-
48
- // Response translators
49
- require("./response/claude-to-openai.js");
50
- require("./response/openai-to-claude.js");
51
- require("./response/gemini-to-openai.js");
52
- require("./response/openai-to-antigravity.js");
53
- require("./response/openai-responses.js");
54
- require("./response/kiro-to-openai.js");
55
- require("./response/cursor-to-openai.js");
56
- require("./response/ollama-to-openai.js");
57
- require("./response/commandcode-to-openai.js");
58
- }
55
+ // Lazy load translators (no-op, loaded eagerly at module level)
56
+ async function ensureInitialized() {}
59
57
 
60
58
  // Strip specific content types from messages (explicit opt-in via strip[] in PROVIDER_MODELS)
61
59
  function stripContentTypes(body, stripList = []) {
@@ -27,11 +27,11 @@ import { FORMATS } from "../formats.js";
27
27
  import { v4 as uuidv4 } from "uuid";
28
28
  import {
29
29
  resolveKiroModel,
30
- resolveKiroThinkingBudget,
31
30
  buildThinkingSystemPrefix,
32
31
  KIRO_AGENTIC_SYSTEM_PROMPT,
33
32
  resolveDefaultProfileArn,
34
33
  } from "../../config/kiroConstants.js";
34
+ import { resolveKiroThinkingBudget } from "../../services/thinkingBudget.js";
35
35
  import { DEFAULT_IMAGE_MIME } from "../schema/index.js";
36
36
  import { ROLE, CLAUDE_BLOCK } from "../schema/index.js";
37
37
 
@@ -8,11 +8,11 @@ import { v4 as uuidv4 } from "uuid";
8
8
  import { resolveSessionId } from "../../utils/sessionManager.js";
9
9
  import {
10
10
  resolveKiroModel,
11
- resolveKiroThinkingBudget,
12
11
  buildThinkingSystemPrefix,
13
12
  KIRO_AGENTIC_SYSTEM_PROMPT,
14
- resolveDefaultProfileArn
13
+ resolveDefaultProfileArn,
15
14
  } from "../../config/kiroConstants.js";
15
+ import { resolveKiroThinkingBudget } from "../../services/thinkingBudget.js";
16
16
  import { parseDataUri } from "../concerns/image.js";
17
17
  import { DEFAULT_IMAGE_MIME } from "../schema/index.js";
18
18
  import { ROLE, OPENAI_BLOCK, CLAUDE_BLOCK } from "../schema/index.js";
@@ -176,7 +176,7 @@ class GlmExecutor extends DefaultExecutor {
176
176
  const cleanedBody = super.transformRequest(model, body, stream, credentials);
177
177
  return applyGlmRequestDefaults(cleanedBody, this.config.requestDefaults);
178
178
  }
179
- transformForTransport(model, body, stream, credentials, transport) {
179
+ async transformForTransport(model, body, stream, credentials, transport) {
180
180
  const effortTier = parseGlm52Effort(model);
181
181
  const effectiveModel = effortTier ? effortTier.baseModel : model;
182
182
  const transformed = this.transformRequest(effectiveModel, body, stream, credentials);
@@ -197,7 +197,7 @@ class GlmExecutor extends DefaultExecutor {
197
197
  }
198
198
  return transformed;
199
199
  }
200
- const translated = translateRequest(
200
+ const translated = await translateRequest(
201
201
  FORMATS.OPENAI,
202
202
  FORMATS.CLAUDE,
203
203
  effectiveModel,
@@ -221,13 +221,18 @@ function applyAdaptiveBudget(body, cfg) {
221
221
  );
222
222
  return setCustomBudget(body, budget);
223
223
  }
224
- function hasThinkingCapableModel(body) {
224
+ export function hasThinkingCapableModel(body) {
225
225
  const model = getStringField(toRecord(body), "model");
226
226
  const resolved = getResolvedModelCapabilities(model);
227
227
  if (resolved.supportsThinking === true) return true;
228
228
  if (resolved.supportsThinking === false) return false;
229
229
  return model.includes("claude") || model.includes("o1") || model.includes("o3") || model.includes("o4") || model.includes("gemini") || model.endsWith("-thinking") || model.includes("thinking");
230
230
  }
231
+ export function resolveKiroThinkingBudget(body, headers, model) {
232
+ return isThinkingEnabled(body, headers, model)
233
+ ? KIRO_THINKING_BUDGET_DEFAULT
234
+ : 0;
235
+ }
231
236
  export {
232
237
  DEFAULT_THINKING_CONFIG,
233
238
  EFFORT_BUDGETS,
@@ -236,7 +241,6 @@ export {
236
241
  applyThinkingBudget,
237
242
  ensureThinkingConfig,
238
243
  getThinkingBudgetConfig,
239
- hasThinkingCapableModel,
240
244
  hydrateThinkingBudgetConfig,
241
245
  normalizeThinkingLevel,
242
246
  setThinkingBudgetConfig
@@ -10,11 +10,36 @@ import { AntigravityExecutor } from "../executors/antigravity.js";
10
10
  const requestRegistry = new Map();
11
11
  const responseRegistry = new Map();
12
12
 
13
- import { createRequire } from "module";
14
- const require = createRequire(import.meta.url);
13
+ // Eagerly pre-load all translators at module load time
14
+ // (prevents race condition with mixed sync require() + dynamic import())
15
+ const reqMods = [
16
+ "./request/claude-to-openai.js",
17
+ "./request/openai-to-claude.js",
18
+ "./request/gemini-to-openai.js",
19
+ "./request/openai-to-gemini.js",
20
+ "./request/openai-to-vertex.js",
21
+ "./request/antigravity-to-openai.js",
22
+ "./request/openai-responses.js",
23
+ "./request/openai-to-kiro.js",
24
+ "./request/openai-to-cursor.js",
25
+ "./request/openai-to-ollama.js",
26
+ "./request/openai-to-commandcode.js",
27
+ ];
28
+ const resMods = [
29
+ "./response/claude-to-openai.js",
30
+ "./response/openai-to-claude.js",
31
+ "./response/gemini-to-openai.js",
32
+ "./response/openai-to-antigravity.js",
33
+ "./response/openai-responses.js",
34
+ "./response/kiro-to-openai.js",
35
+ "./response/cursor-to-openai.js",
36
+ "./response/ollama-to-openai.js",
37
+ "./response/commandcode-to-openai.js",
38
+ ];
39
+ await Promise.all([...reqMods, ...resMods].map(m => import(m)));
15
40
 
16
41
  // Track initialization state
17
- let initialized = false;
42
+ let initialized = true;
18
43
 
19
44
  // Register translator
20
45
  export function register(from, to, requestFn, responseFn) {
@@ -27,35 +52,8 @@ export function register(from, to, requestFn, responseFn) {
27
52
  }
28
53
  }
29
54
 
30
- // Lazy load translators (called once on first use)
31
- function ensureInitialized() {
32
- if (initialized) return;
33
- initialized = true;
34
-
35
- // Request translators - sync require pattern for bundler
36
- require("./request/claude-to-openai.js");
37
- require("./request/openai-to-claude.js");
38
- require("./request/gemini-to-openai.js");
39
- require("./request/openai-to-gemini.js");
40
- require("./request/openai-to-vertex.js");
41
- require("./request/antigravity-to-openai.js");
42
- require("./request/openai-responses.js");
43
- require("./request/openai-to-kiro.js");
44
- require("./request/openai-to-cursor.js");
45
- require("./request/openai-to-ollama.js");
46
- require("./request/openai-to-commandcode.js");
47
-
48
- // Response translators
49
- require("./response/claude-to-openai.js");
50
- require("./response/openai-to-claude.js");
51
- require("./response/gemini-to-openai.js");
52
- require("./response/openai-to-antigravity.js");
53
- require("./response/openai-responses.js");
54
- require("./response/kiro-to-openai.js");
55
- require("./response/cursor-to-openai.js");
56
- require("./response/ollama-to-openai.js");
57
- require("./response/commandcode-to-openai.js");
58
- }
55
+ // Lazy load translators (no-op, loaded eagerly at module level)
56
+ async function ensureInitialized() {}
59
57
 
60
58
  // Strip specific content types from messages (explicit opt-in via strip[] in PROVIDER_MODELS)
61
59
  function stripContentTypes(body, stripList = []) {
@@ -27,11 +27,11 @@ import { FORMATS } from "../formats.js";
27
27
  import { v4 as uuidv4 } from "uuid";
28
28
  import {
29
29
  resolveKiroModel,
30
- resolveKiroThinkingBudget,
31
30
  buildThinkingSystemPrefix,
32
31
  KIRO_AGENTIC_SYSTEM_PROMPT,
33
32
  resolveDefaultProfileArn,
34
33
  } from "../../config/kiroConstants.js";
34
+ import { resolveKiroThinkingBudget } from "../../services/thinkingBudget.js";
35
35
  import { DEFAULT_IMAGE_MIME } from "../schema/index.js";
36
36
  import { ROLE, CLAUDE_BLOCK } from "../schema/index.js";
37
37
 
@@ -8,11 +8,11 @@ import { v4 as uuidv4 } from "uuid";
8
8
  import { resolveSessionId } from "../../utils/sessionManager.js";
9
9
  import {
10
10
  resolveKiroModel,
11
- resolveKiroThinkingBudget,
12
11
  buildThinkingSystemPrefix,
13
12
  KIRO_AGENTIC_SYSTEM_PROMPT,
14
- resolveDefaultProfileArn
13
+ resolveDefaultProfileArn,
15
14
  } from "../../config/kiroConstants.js";
15
+ import { resolveKiroThinkingBudget } from "../../services/thinkingBudget.js";
16
16
  import { parseDataUri } from "../concerns/image.js";
17
17
  import { DEFAULT_IMAGE_MIME } from "../schema/index.js";
18
18
  import { ROLE, OPENAI_BLOCK, CLAUDE_BLOCK } from "../schema/index.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fudrouter/fsrouter",
3
- "version": "0.6.56",
3
+ "version": "0.6.58",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "9Router v2 \u2014 Express Backend (API, SSE, DB, Auth, MITM)",