claudish 7.54.0 → 7.55.0

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 (2) hide show
  1. package/dist/index.js +103 -85
  2. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -729,7 +729,7 @@ var init_onepassword_config = __esm(() => {
729
729
  });
730
730
 
731
731
  // src/version.ts
732
- var VERSION = "7.54.0";
732
+ var VERSION = "7.55.0";
733
733
 
734
734
  // src/logger.ts
735
735
  var exports_logger = {};
@@ -35268,39 +35268,17 @@ var init_xiaomi_model_dialect = __esm(() => {
35268
35268
  // src/adapters/dialect-manager.ts
35269
35269
  var exports_dialect_manager = {};
35270
35270
  __export(exports_dialect_manager, {
35271
- DialectManager: () => DialectManager,
35272
- AdapterManager: () => DialectManager
35271
+ resolveModelDialect: () => resolveModelDialect
35273
35272
  });
35274
-
35275
- class DialectManager {
35276
- adapters;
35277
- defaultAdapter;
35278
- constructor(modelId, wireFormat) {
35279
- this.adapters = [
35280
- new GrokModelDialect(modelId, wireFormat),
35281
- new GeminiAPIFormat(modelId, wireFormat),
35282
- new CodexAPIFormat(modelId, wireFormat),
35283
- new OpenAIAPIFormat(modelId, wireFormat),
35284
- new QwenModelDialect(modelId, wireFormat),
35285
- new MiniMaxModelDialect(modelId, wireFormat),
35286
- new DeepSeekModelDialect(modelId, wireFormat),
35287
- new GLMModelDialect(modelId, wireFormat),
35288
- new XiaomiModelDialect(modelId, wireFormat)
35289
- ];
35290
- this.defaultAdapter = new DefaultAPIFormat(modelId, wireFormat);
35291
- }
35292
- getAdapter() {
35293
- for (const adapter of this.adapters) {
35294
- if (adapter.shouldHandle(this.defaultAdapter.getModelId())) {
35295
- return adapter;
35296
- }
35297
- }
35298
- return this.defaultAdapter;
35299
- }
35300
- needsTransformation() {
35301
- return this.getAdapter() !== this.defaultAdapter;
35273
+ function resolveModelDialect(modelId, wireFormat) {
35274
+ for (const make of DIALECT_FACTORIES) {
35275
+ const dialect = make(modelId, wireFormat);
35276
+ if (dialect.shouldHandle(modelId))
35277
+ return dialect;
35302
35278
  }
35279
+ return new DefaultAPIFormat(modelId, wireFormat);
35303
35280
  }
35281
+ var DIALECT_FACTORIES;
35304
35282
  var init_dialect_manager = __esm(() => {
35305
35283
  init_base_api_format();
35306
35284
  init_codex_api_format();
@@ -35312,6 +35290,17 @@ var init_dialect_manager = __esm(() => {
35312
35290
  init_openai_api_format();
35313
35291
  init_qwen_model_dialect();
35314
35292
  init_xiaomi_model_dialect();
35293
+ DIALECT_FACTORIES = [
35294
+ (m, w) => new GrokModelDialect(m, w),
35295
+ (m, w) => new GeminiAPIFormat(m, w),
35296
+ (m, w) => new CodexAPIFormat(m, w),
35297
+ (m, w) => new OpenAIAPIFormat(m, w),
35298
+ (m, w) => new QwenModelDialect(m, w),
35299
+ (m, w) => new MiniMaxModelDialect(m, w),
35300
+ (m, w) => new DeepSeekModelDialect(m, w),
35301
+ (m, w) => new GLMModelDialect(m, w),
35302
+ (m, w) => new XiaomiModelDialect(m, w)
35303
+ ];
35315
35304
  });
35316
35305
 
35317
35306
  // src/auth/quota/types.ts
@@ -37534,6 +37523,9 @@ class OpenAIProviderTransport {
37534
37523
  }
37535
37524
  return `${this.provider.baseUrl}${this.provider.apiPath}`;
37536
37525
  }
37526
+ overrideStreamFormat() {
37527
+ return this.provider.streamFormatOverride;
37528
+ }
37537
37529
  async getHeaders() {
37538
37530
  const headers = {};
37539
37531
  if (this.apiKey) {
@@ -39867,6 +39859,44 @@ data: {"type":"ping"}
39867
39859
  let insideThinkingBlock = false;
39868
39860
  let thinkingBlocksSuppressed = 0;
39869
39861
  let suppressedFrame = false;
39862
+ let highestSeenIndex = -1;
39863
+ const remappedBlocks = new Map;
39864
+ const trackIndex = (idx) => {
39865
+ if (idx > highestSeenIndex)
39866
+ highestSeenIndex = idx;
39867
+ };
39868
+ const emitIndexed = (controller2, data, line) => {
39869
+ if (typeof data.index !== "number") {
39870
+ enqueueData(controller2, data, line);
39871
+ return;
39872
+ }
39873
+ if (data.type === "content_block_start") {
39874
+ const expected = highestSeenIndex + 1;
39875
+ if (data.index !== expected) {
39876
+ log(`[AnthropicSSE] content_block_start index ${data.index} remapped to ${expected} (model=${opts.modelName})`);
39877
+ remappedBlocks.set(data.index, expected);
39878
+ const remapped2 = { ...data, index: expected };
39879
+ enqueueData(controller2, remapped2, `data: ${JSON.stringify(remapped2)}`);
39880
+ } else {
39881
+ enqueueData(controller2, data, line);
39882
+ }
39883
+ trackIndex(expected);
39884
+ return;
39885
+ }
39886
+ const remapped = remappedBlocks.get(data.index);
39887
+ if (data.type === "content_block_stop")
39888
+ remappedBlocks.delete(data.index);
39889
+ if (remapped !== undefined) {
39890
+ const modified = { ...data, index: remapped };
39891
+ enqueueData(controller2, modified, `data: ${JSON.stringify(modified)}`);
39892
+ } else if (data.index > highestSeenIndex) {
39893
+ log(`[AnthropicSSE] Dropping orphan ${data.type} at index ${data.index} (no open block \u2014 model=${opts.modelName})`);
39894
+ pendingEventLine = null;
39895
+ suppressedFrame = true;
39896
+ } else {
39897
+ enqueueData(controller2, data, line);
39898
+ }
39899
+ };
39870
39900
  while (true) {
39871
39901
  const { done, value } = await reader.read();
39872
39902
  if (done)
@@ -39921,18 +39951,7 @@ data: ${JSON.stringify({
39921
39951
  suppressedFrame = true;
39922
39952
  continue;
39923
39953
  }
39924
- if (typeof data.index === "number" && thinkingBlocksSuppressed > 0) {
39925
- const reindexed = data.index - thinkingBlocksSuppressed;
39926
- const modifiedLine = `data: ${JSON.stringify({ ...data, index: reindexed })}`;
39927
- if (!isClosed) {
39928
- flushPendingEvent(controller);
39929
- controller.enqueue(encoder.encode(`${modifiedLine}
39930
- `));
39931
- noteLifecycle(data, reindexed);
39932
- }
39933
- } else {
39934
- enqueueData(controller, data, line);
39935
- }
39954
+ emitIndexed(controller, data, line);
39936
39955
  } catch {
39937
39956
  if (!isClosed) {
39938
39957
  flushPendingEvent(controller);
@@ -39964,47 +39983,44 @@ data: ${JSON.stringify({
39964
39983
  }
39965
39984
  return;
39966
39985
  }
39967
- enqueueData(controller, data, line);
39968
- if (data.message?.usage) {
39969
- inputTokens = data.message.usage.input_tokens || inputTokens;
39970
- outputTokens = data.message.usage.output_tokens || outputTokens;
39971
- }
39972
- if (data.usage) {
39973
- inputTokens = data.usage.input_tokens || inputTokens;
39974
- outputTokens = data.usage.output_tokens || outputTokens;
39975
- }
39976
- if (data.type === "content_block_delta" && data.delta?.type === "text_delta") {
39977
- const txt = data.delta.text || "";
39978
- opts.onAssistantText?.(txt, "text");
39979
- textChunks++;
39980
- log(`[AnthropicSSE] Text chunk: "${txt.substring(0, 30).replace(/\n/g, "\\n")}" (${txt.length} chars)`);
39981
- }
39982
- if (data.type === "content_block_start" && data.content_block?.type === "tool_use") {
39983
- toolUseBlocks++;
39984
- opts.onToolCallObserved?.(data.content_block.name);
39985
- log(`[AnthropicSSE] Tool use: ${data.content_block.name}`);
39986
- }
39987
- if (data.type === "message_delta" && data.delta?.stop_reason) {
39988
- stopReason = data.delta.stop_reason;
39989
- }
39986
+ emitIndexed(controller, data, line);
39987
+ try {
39988
+ if (data.message?.usage) {
39989
+ inputTokens = data.message.usage.input_tokens || inputTokens;
39990
+ outputTokens = data.message.usage.output_tokens || outputTokens;
39991
+ }
39992
+ if (data.usage) {
39993
+ inputTokens = data.usage.input_tokens || inputTokens;
39994
+ outputTokens = data.usage.output_tokens || outputTokens;
39995
+ }
39996
+ if (data.type === "content_block_delta" && data.delta?.type === "text_delta") {
39997
+ const txt = data.delta.text || "";
39998
+ opts.onAssistantText?.(txt, "text");
39999
+ textChunks++;
40000
+ log(`[AnthropicSSE] Text chunk: "${txt.substring(0, 30).replace(/\n/g, "\\n")}" (${txt.length} chars)`);
40001
+ }
40002
+ if (data.type === "content_block_start" && data.content_block?.type === "tool_use") {
40003
+ toolUseBlocks++;
40004
+ opts.onToolCallObserved?.(data.content_block.name);
40005
+ log(`[AnthropicSSE] Tool use: ${data.content_block.name}`);
40006
+ }
40007
+ if (data.type === "message_delta" && data.delta?.stop_reason) {
40008
+ stopReason = data.delta.stop_reason;
40009
+ }
40010
+ } catch {}
39990
40011
  } catch {
39991
40012
  if (!isClosed) {
39992
40013
  controller.enqueue(encoder.encode(`${line}
39993
40014
  `));
39994
40015
  }
39995
40016
  }
39996
- } else if (filterThinking) {
40017
+ } else {
39997
40018
  if (line.startsWith("event:")) {
39998
40019
  pendingEventLine = line;
39999
40020
  } else if (line.trim() === "" && suppressedFrame) {
40000
40021
  suppressedFrame = false;
40001
40022
  } else if (!isClosed) {
40002
40023
  controller.enqueue(encoder.encode(`${line}
40003
- `));
40004
- }
40005
- } else {
40006
- if (!isClosed) {
40007
- controller.enqueue(encoder.encode(`${line}
40008
40024
  `));
40009
40025
  }
40010
40026
  }
@@ -41484,7 +41500,7 @@ function extractAuthHeaders(c) {
41484
41500
 
41485
41501
  class ComposedHandler {
41486
41502
  provider;
41487
- adapterManager;
41503
+ resolvedDialect;
41488
41504
  explicitAdapter;
41489
41505
  modelAdapter;
41490
41506
  middlewareManager;
@@ -41506,8 +41522,8 @@ class ComposedHandler {
41506
41522
  this.options = options;
41507
41523
  this.explicitAdapter = options.adapter;
41508
41524
  this.isInteractive = options.isInteractive ?? false;
41509
- this.adapterManager = new DialectManager(this.bareModelName, this.explicitAdapter?.getStreamFormat());
41510
- const resolvedModelAdapter = this.adapterManager.getAdapter();
41525
+ this.resolvedDialect = resolveModelDialect(this.bareModelName, this.explicitAdapter?.getStreamFormat());
41526
+ const resolvedModelAdapter = this.resolvedDialect;
41511
41527
  if (resolvedModelAdapter.getName() !== "DefaultAPIFormat") {
41512
41528
  this.modelAdapter = resolvedModelAdapter;
41513
41529
  }
@@ -41525,7 +41541,7 @@ class ComposedHandler {
41525
41541
  });
41526
41542
  }
41527
41543
  getAdapter() {
41528
- return this.explicitAdapter || this.adapterManager.getAdapter();
41544
+ return this.explicitAdapter || this.resolvedDialect;
41529
41545
  }
41530
41546
  getModelContextWindow() {
41531
41547
  return this.modelAdapter?.getContextWindow() ?? this.getAdapter().getContextWindow();
@@ -43484,6 +43500,9 @@ class AnthropicProviderTransport {
43484
43500
  getEndpoint() {
43485
43501
  return `${this.provider.baseUrl}${this.provider.apiPath}`;
43486
43502
  }
43503
+ overrideStreamFormat() {
43504
+ return this.provider.streamFormatOverride;
43505
+ }
43487
43506
  async getHeaders() {
43488
43507
  const headers = {
43489
43508
  "anthropic-version": "2023-06-01"
@@ -43830,7 +43849,8 @@ function buildComplexHandler(ep, ctx, apiKey, baseUrl) {
43830
43849
  apiKeyEnvVar: ctx.provider.apiKeyEnvVar,
43831
43850
  prefixes: ctx.provider.prefixes ?? [],
43832
43851
  headers: ep.headers,
43833
- authScheme: ep.authScheme ?? "bearer"
43852
+ authScheme: ep.authScheme ?? "bearer",
43853
+ streamFormatOverride: ep.streamFormat
43834
43854
  };
43835
43855
  const transport = new OpenAIProviderTransport(remoteProvider, finalModel, apiKey);
43836
43856
  const adapter = new OpenAIAPIFormat(finalModel);
@@ -43848,7 +43868,8 @@ function buildComplexHandler(ep, ctx, apiKey, baseUrl) {
43848
43868
  apiKeyEnvVar: ctx.provider.apiKeyEnvVar,
43849
43869
  prefixes: ctx.provider.prefixes ?? [],
43850
43870
  headers: ep.headers,
43851
- authScheme: ep.authScheme ?? "x-api-key"
43871
+ authScheme: ep.authScheme ?? "x-api-key",
43872
+ streamFormatOverride: ep.streamFormat
43852
43873
  };
43853
43874
  const transport = new AnthropicProviderTransport(remoteProvider, apiKey);
43854
43875
  const adapter = new AnthropicAPIFormat(finalModel, ctx.provider.name);
@@ -48066,8 +48087,7 @@ var init_local_adapter = __esm(() => {
48066
48087
  constructor(modelId, providerName) {
48067
48088
  super(modelId);
48068
48089
  this.providerName = providerName;
48069
- const manager = new DialectManager(modelId);
48070
- this.innerAdapter = manager.getAdapter();
48090
+ this.innerAdapter = resolveModelDialect(modelId);
48071
48091
  }
48072
48092
  processTextContent(textContent, accumulatedText) {
48073
48093
  return this.innerAdapter.processTextContent(textContent, accumulatedText);
@@ -48235,8 +48255,7 @@ var init_openrouter_api_format = __esm(() => {
48235
48255
  innerAdapter;
48236
48256
  constructor(modelId) {
48237
48257
  super(modelId);
48238
- const manager = new DialectManager(modelId);
48239
- this.innerAdapter = manager.getAdapter();
48258
+ this.innerAdapter = resolveModelDialect(modelId);
48240
48259
  }
48241
48260
  modelSupportsReasoning() {
48242
48261
  const id = this.modelId.toLowerCase();
@@ -72075,9 +72094,8 @@ async function probeModelRouting(models, jsonOutput, options = { live: true, tim
72075
72094
  formatAdapterName = "OpenAIAPIFormat";
72076
72095
  declaredStreamFormat = "openai-sse";
72077
72096
  }
72078
- const { DialectManager: DialectManager2 } = await Promise.resolve().then(() => (init_dialect_manager(), exports_dialect_manager));
72079
- const adapterManager = new DialectManager2(modelName);
72080
- const modelTranslator = adapterManager.getAdapter();
72097
+ const { resolveModelDialect: resolveModelDialect2 } = await Promise.resolve().then(() => (init_dialect_manager(), exports_dialect_manager));
72098
+ const modelTranslator = resolveModelDialect2(modelName);
72081
72099
  const modelTranslatorName = modelTranslator.getName();
72082
72100
  const TRANSPORT_OVERRIDES = {
72083
72101
  litellm: "openai-sse",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudish",
3
- "version": "7.54.0",
3
+ "version": "7.55.0",
4
4
  "description": "Run Claude Code with any model - OpenRouter, Ollama, LM Studio & local models",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -60,10 +60,10 @@
60
60
  "ai"
61
61
  ],
62
62
  "optionalDependencies": {
63
- "@claudish/magmux-darwin-arm64": "7.54.0",
64
- "@claudish/magmux-darwin-x64": "7.54.0",
65
- "@claudish/magmux-linux-arm64": "7.54.0",
66
- "@claudish/magmux-linux-x64": "7.54.0"
63
+ "@claudish/magmux-darwin-arm64": "7.55.0",
64
+ "@claudish/magmux-darwin-x64": "7.55.0",
65
+ "@claudish/magmux-linux-arm64": "7.55.0",
66
+ "@claudish/magmux-linux-x64": "7.55.0"
67
67
  },
68
68
  "author": "Jack Rudenko <i@madappgang.com>",
69
69
  "license": "MIT",