@ljoukov/llm 7.0.9 → 7.0.11

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.
package/README.md CHANGED
@@ -450,19 +450,19 @@ Use a `chatgpt-` prefix:
450
450
  import { generateText } from "@ljoukov/llm";
451
451
 
452
452
  const result = await generateText({
453
- model: "chatgpt-gpt-5.4",
453
+ model: "chatgpt-gpt-5.5",
454
454
  input: "Return exactly: OK",
455
455
  });
456
456
 
457
457
  console.log(result.text);
458
458
  ```
459
459
 
460
- `chatgpt-gpt-5.4-fast` is also supported as a convenience alias for ChatGPT-authenticated `gpt-5.4` with priority processing enabled (`service_tier="priority"`), matching Codex `/fast` semantics.
460
+ `gpt-5.5-fast` and `chatgpt-gpt-5.5-fast` are also supported as convenience aliases for `gpt-5.5` with priority processing enabled (`service_tier="priority"`), matching Codex `/fast` semantics.
461
461
 
462
462
  Supported OpenAI text model ids are fixed literal unions in code, not arbitrary strings:
463
463
 
464
- - OpenAI API: `gpt-5.4`, `gpt-5.4-mini`, `gpt-5.4-nano`
465
- - ChatGPT auth: `chatgpt-gpt-5.4`, `chatgpt-gpt-5.4-fast`, `chatgpt-gpt-5.4-mini`, `chatgpt-gpt-5.3-codex-spark`
464
+ - OpenAI API: `gpt-5.5`, `gpt-5.5-fast`, `gpt-5.4`, `gpt-5.4-mini`, `gpt-5.4-nano`
465
+ - ChatGPT auth: `chatgpt-gpt-5.5`, `chatgpt-gpt-5.5-fast`, `chatgpt-gpt-5.4`, `chatgpt-gpt-5.4-fast`, `chatgpt-gpt-5.4-mini`, `chatgpt-gpt-5.3-codex-spark`
466
466
 
467
467
  ## JSON outputs
468
468
 
@@ -742,7 +742,7 @@ console.log(result.text);
742
742
  For read/search/write tasks in a workspace, enable `filesystemTool`. The library auto-selects a tool profile by model
743
743
  when `profile: "auto"`:
744
744
 
745
- - Codex-like models (`gpt-5.4`, `chatgpt-gpt-5.4`, `chatgpt-gpt-5.4-fast`, and `chatgpt-gpt-5.3-codex-spark`): Codex-compatible filesystem tool shape.
745
+ - Codex-like models (`gpt-5.5`, `gpt-5.5-fast`, `chatgpt-gpt-5.5`, `chatgpt-gpt-5.5-fast`, `gpt-5.4`, `chatgpt-gpt-5.4`, `chatgpt-gpt-5.4-fast`, and `chatgpt-gpt-5.3-codex-spark`): Codex-compatible filesystem tool shape.
746
746
  - Gemini models: Gemini-compatible filesystem tool shape.
747
747
  - Other models: model-agnostic profile (currently Gemini-style).
748
748
 
package/dist/index.cjs CHANGED
@@ -36,6 +36,7 @@ __export(index_exports, {
36
36
  CODEX_APPLY_PATCH_LARK_GRAMMAR: () => CODEX_APPLY_PATCH_LARK_GRAMMAR,
37
37
  DEFAULT_FILE_TTL_SECONDS: () => DEFAULT_FILE_TTL_SECONDS,
38
38
  DEFAULT_SIGNED_URL_TTL_SECONDS: () => DEFAULT_SIGNED_URL_TTL_SECONDS,
39
+ EXPERIMENTAL_CHATGPT_MODEL_PREFIX: () => EXPERIMENTAL_CHATGPT_MODEL_PREFIX,
39
40
  FIREWORKS_DEFAULT_GLM_MODEL: () => FIREWORKS_DEFAULT_GLM_MODEL,
40
41
  FIREWORKS_DEFAULT_GPT_OSS_120B_MODEL: () => FIREWORKS_DEFAULT_GPT_OSS_120B_MODEL,
41
42
  FIREWORKS_DEFAULT_KIMI_MODEL: () => FIREWORKS_DEFAULT_KIMI_MODEL,
@@ -90,6 +91,7 @@ __export(index_exports, {
90
91
  getChatGptAuthProfile: () => getChatGptAuthProfile,
91
92
  getCurrentToolCallContext: () => getCurrentToolCallContext,
92
93
  isChatGptModelId: () => isChatGptModelId,
94
+ isExperimentalChatGptModelId: () => isExperimentalChatGptModelId,
93
95
  isFireworksModelId: () => isFireworksModelId,
94
96
  isGeminiImageModelId: () => isGeminiImageModelId,
95
97
  isGeminiModelId: () => isGeminiModelId,
@@ -318,7 +320,61 @@ function getGeminiImagePricing(modelId) {
318
320
  return void 0;
319
321
  }
320
322
 
323
+ // src/openai/models.ts
324
+ var OPENAI_MODEL_IDS = [
325
+ "gpt-5.5",
326
+ "gpt-5.5-fast",
327
+ "gpt-5.4",
328
+ "gpt-5.4-mini",
329
+ "gpt-5.4-nano"
330
+ ];
331
+ function isOpenAiModelId(value) {
332
+ return OPENAI_MODEL_IDS.includes(value);
333
+ }
334
+ var CHATGPT_MODEL_IDS = [
335
+ "chatgpt-gpt-5.5",
336
+ "chatgpt-gpt-5.5-fast",
337
+ "chatgpt-gpt-5.4",
338
+ "chatgpt-gpt-5.4-fast",
339
+ "chatgpt-gpt-5.4-mini",
340
+ "chatgpt-gpt-5.3-codex-spark"
341
+ ];
342
+ var FAST_MODEL_SUFFIX = "-fast";
343
+ var OPENAI_PRIORITY_MODEL_IDS = ["gpt-5.5-fast"];
344
+ var CHATGPT_PRIORITY_MODEL_IDS = ["chatgpt-gpt-5.5-fast", "chatgpt-gpt-5.4-fast"];
345
+ var EXPERIMENTAL_CHATGPT_MODEL_PREFIX = "experimental-chatgpt-";
346
+ function isExperimentalChatGptModelId(value) {
347
+ return value.startsWith(EXPERIMENTAL_CHATGPT_MODEL_PREFIX) && value.length > EXPERIMENTAL_CHATGPT_MODEL_PREFIX.length;
348
+ }
349
+ function isChatGptModelId(value) {
350
+ return CHATGPT_MODEL_IDS.includes(value) || isExperimentalChatGptModelId(value);
351
+ }
352
+ function stripFastSuffix(model) {
353
+ return model.endsWith(FAST_MODEL_SUFFIX) ? model.slice(0, -FAST_MODEL_SUFFIX.length) : model;
354
+ }
355
+ function resolveOpenAiProviderModel(model) {
356
+ return OPENAI_PRIORITY_MODEL_IDS.includes(model) ? stripFastSuffix(model) : model;
357
+ }
358
+ function resolveOpenAiServiceTier(model) {
359
+ return OPENAI_PRIORITY_MODEL_IDS.includes(model) ? "priority" : void 0;
360
+ }
361
+ function stripChatGptPrefix(model) {
362
+ if (isExperimentalChatGptModelId(model)) {
363
+ return model.slice(EXPERIMENTAL_CHATGPT_MODEL_PREFIX.length);
364
+ }
365
+ return model.slice("chatgpt-".length);
366
+ }
367
+ function resolveChatGptProviderModel(model) {
368
+ const providerModel = stripChatGptPrefix(model);
369
+ return CHATGPT_PRIORITY_MODEL_IDS.includes(model) ? stripFastSuffix(providerModel) : providerModel;
370
+ }
371
+ function resolveChatGptServiceTier(model) {
372
+ return CHATGPT_PRIORITY_MODEL_IDS.includes(model) ? "priority" : void 0;
373
+ }
374
+
321
375
  // src/openai/pricing.ts
376
+ var OPENAI_GPT_55_FAST_MODEL_IDS = ["gpt-5.5-fast", "chatgpt-gpt-5.5-fast"];
377
+ var OPENAI_GPT_55_STANDARD_MODEL_IDS = ["gpt-5.5", "chatgpt-gpt-5.5"];
322
378
  var OPENAI_GPT_54_FAST_MODEL_IDS = ["gpt-5.4-fast", "chatgpt-gpt-5.4-fast"];
323
379
  var OPENAI_GPT_54_MINI_MODEL_IDS = ["gpt-5.4-mini", "chatgpt-gpt-5.4-mini"];
324
380
  var OPENAI_GPT_54_NANO_MODEL_IDS = ["gpt-5.4-nano"];
@@ -327,6 +383,16 @@ var OPENAI_GPT_53_CODEX_SPARK_MODEL_IDS = [
327
383
  "chatgpt-gpt-5.3-codex-spark"
328
384
  ];
329
385
  var OPENAI_GPT_54_STANDARD_MODEL_IDS = ["gpt-5.4", "chatgpt-gpt-5.4"];
386
+ var OPENAI_GPT_55_PRICING = {
387
+ inputRate: 5 / 1e6,
388
+ cachedRate: 0.5 / 1e6,
389
+ outputRate: 30 / 1e6
390
+ };
391
+ var OPENAI_GPT_55_PRIORITY_PRICING = {
392
+ inputRate: 12.5 / 1e6,
393
+ cachedRate: 1.25 / 1e6,
394
+ outputRate: 75 / 1e6
395
+ };
330
396
  var OPENAI_GPT_54_PRICING = {
331
397
  inputRate: 2.5 / 1e6,
332
398
  cachedRate: 0.25 / 1e6,
@@ -348,6 +414,15 @@ var OPENAI_GPT_54_NANO_PRICING = {
348
414
  outputRate: 0.4 / 1e6
349
415
  };
350
416
  function getOpenAiPricing(modelId) {
417
+ if (isExperimentalChatGptModelId(modelId)) {
418
+ return OPENAI_GPT_54_PRICING;
419
+ }
420
+ if (OPENAI_GPT_55_FAST_MODEL_IDS.includes(modelId)) {
421
+ return OPENAI_GPT_55_PRIORITY_PRICING;
422
+ }
423
+ if (OPENAI_GPT_55_STANDARD_MODEL_IDS.includes(modelId)) {
424
+ return OPENAI_GPT_55_PRICING;
425
+ }
351
426
  if (OPENAI_GPT_54_FAST_MODEL_IDS.includes(modelId)) {
352
427
  return OPENAI_GPT_54_PRIORITY_PRICING;
353
428
  }
@@ -2832,35 +2907,6 @@ async function runOpenAiCall(fn, modelId, runOptions) {
2832
2907
  return getSchedulerForModel3(modelId).run(async () => fn(getOpenAiClient()), runOptions);
2833
2908
  }
2834
2909
 
2835
- // src/openai/models.ts
2836
- var OPENAI_MODEL_IDS = ["gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano"];
2837
- function isOpenAiModelId(value) {
2838
- return OPENAI_MODEL_IDS.includes(value);
2839
- }
2840
- var CHATGPT_MODEL_IDS = [
2841
- "chatgpt-gpt-5.4",
2842
- "chatgpt-gpt-5.4-fast",
2843
- "chatgpt-gpt-5.4-mini",
2844
- "chatgpt-gpt-5.3-codex-spark"
2845
- ];
2846
- function isChatGptModelId(value) {
2847
- return CHATGPT_MODEL_IDS.includes(value);
2848
- }
2849
- function stripChatGptPrefix(model) {
2850
- return model.slice("chatgpt-".length);
2851
- }
2852
- function resolveChatGptProviderModel(model) {
2853
- switch (model) {
2854
- case "chatgpt-gpt-5.4-fast":
2855
- return "gpt-5.4";
2856
- default:
2857
- return stripChatGptPrefix(model);
2858
- }
2859
- }
2860
- function resolveChatGptServiceTier(model) {
2861
- return model === "chatgpt-gpt-5.4-fast" ? "priority" : void 0;
2862
- }
2863
-
2864
2910
  // src/agentLogging.ts
2865
2911
  var import_node_async_hooks = require("async_hooks");
2866
2912
  var import_node_buffer2 = require("buffer");
@@ -5058,7 +5104,11 @@ function resolveProvider(model) {
5058
5104
  }
5059
5105
  }
5060
5106
  if (isOpenAiModelId(model)) {
5061
- return { provider: "openai", model };
5107
+ return {
5108
+ provider: "openai",
5109
+ model: resolveOpenAiProviderModel(model),
5110
+ serviceTier: resolveOpenAiServiceTier(model)
5111
+ };
5062
5112
  }
5063
5113
  throw new Error(`Unsupported text model: ${model}`);
5064
5114
  }
@@ -7832,6 +7882,7 @@ async function runTextCall(params) {
7832
7882
  {
7833
7883
  model: modelForProvider,
7834
7884
  input: openAiInput,
7885
+ ...providerInfo.serviceTier ? { service_tier: providerInfo.serviceTier } : {},
7835
7886
  reasoning,
7836
7887
  text: openAiTextConfig,
7837
7888
  ...openAiTools ? { tools: openAiTools } : {},
@@ -7936,7 +7987,7 @@ async function runTextCall(params) {
7936
7987
  pushEvent({ type: "blocked" });
7937
7988
  }
7938
7989
  if (result2.model) {
7939
- modelVersion = providerInfo.serviceTier ? request.model : `chatgpt-${result2.model}`;
7990
+ modelVersion = providerInfo.serviceTier || isExperimentalChatGptModelId(request.model) ? request.model : `chatgpt-${result2.model}`;
7940
7991
  pushEvent({ type: "model", modelVersion });
7941
7992
  }
7942
7993
  latestUsage = extractChatGptUsageTokens(result2.usage);
@@ -8717,6 +8768,7 @@ async function runToolLoop(request) {
8717
8768
  const stepRequestPayload = {
8718
8769
  model: providerInfo.model,
8719
8770
  input: preparedInput,
8771
+ ...providerInfo.serviceTier ? { service_tier: providerInfo.serviceTier } : {},
8720
8772
  ...previousResponseId ? { previous_response_id: previousResponseId } : {},
8721
8773
  ...openAiTools.length > 0 ? { tools: openAiTools } : {},
8722
8774
  ...openAiTools.length > 0 ? { parallel_tool_calls: true } : {},
@@ -8745,6 +8797,7 @@ async function runToolLoop(request) {
8745
8797
  {
8746
8798
  model: providerInfo.model,
8747
8799
  input: preparedInput,
8800
+ ...providerInfo.serviceTier ? { service_tier: providerInfo.serviceTier } : {},
8748
8801
  ...previousResponseId ? { previous_response_id: previousResponseId } : {},
8749
8802
  ...openAiTools.length > 0 ? { tools: openAiTools } : {},
8750
8803
  ...openAiTools.length > 0 ? { parallel_tool_calls: true } : {},
@@ -9142,7 +9195,7 @@ async function runToolLoop(request) {
9142
9195
  }
9143
9196
  });
9144
9197
  const modelCompletedAtMs = Date.now();
9145
- modelVersion = response.model && !providerInfo.serviceTier ? `chatgpt-${response.model}` : request.model;
9198
+ modelVersion = response.model && !providerInfo.serviceTier && !isExperimentalChatGptModelId(request.model) ? `chatgpt-${response.model}` : request.model;
9146
9199
  usageTokens = extractChatGptUsageTokens(response.usage);
9147
9200
  const stepCostUsd = estimateCallCostUsd({
9148
9201
  modelId: modelVersion,
@@ -12752,8 +12805,11 @@ async function runAccessHook2(runtime, context) {
12752
12805
  await runtime.checkAccess(context);
12753
12806
  }
12754
12807
  function isCodexModel(model) {
12808
+ if (model.startsWith("experimental-chatgpt-")) {
12809
+ return true;
12810
+ }
12755
12811
  const normalized = model.startsWith("chatgpt-") ? model.slice("chatgpt-".length) : model;
12756
- return normalized.includes("codex") || normalized === "gpt-5.4" || normalized === "gpt-5.4-fast";
12812
+ return normalized.includes("codex") || normalized === "gpt-5.5" || normalized === "gpt-5.5-fast" || normalized === "gpt-5.4" || normalized === "gpt-5.4-fast";
12757
12813
  }
12758
12814
  function isGeminiModel(model) {
12759
12815
  return model.startsWith("gemini-");
@@ -14192,6 +14248,7 @@ async function runCandidateEvolution(options) {
14192
14248
  CODEX_APPLY_PATCH_LARK_GRAMMAR,
14193
14249
  DEFAULT_FILE_TTL_SECONDS,
14194
14250
  DEFAULT_SIGNED_URL_TTL_SECONDS,
14251
+ EXPERIMENTAL_CHATGPT_MODEL_PREFIX,
14195
14252
  FIREWORKS_DEFAULT_GLM_MODEL,
14196
14253
  FIREWORKS_DEFAULT_GPT_OSS_120B_MODEL,
14197
14254
  FIREWORKS_DEFAULT_KIMI_MODEL,
@@ -14246,6 +14303,7 @@ async function runCandidateEvolution(options) {
14246
14303
  getChatGptAuthProfile,
14247
14304
  getCurrentToolCallContext,
14248
14305
  isChatGptModelId,
14306
+ isExperimentalChatGptModelId,
14249
14307
  isFireworksModelId,
14250
14308
  isGeminiImageModelId,
14251
14309
  isGeminiModelId,