@ljoukov/llm 7.0.10 → 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
@@ -321,16 +321,27 @@ function getGeminiImagePricing(modelId) {
321
321
  }
322
322
 
323
323
  // src/openai/models.ts
324
- var OPENAI_MODEL_IDS = ["gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano"];
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
+ ];
325
331
  function isOpenAiModelId(value) {
326
332
  return OPENAI_MODEL_IDS.includes(value);
327
333
  }
328
334
  var CHATGPT_MODEL_IDS = [
335
+ "chatgpt-gpt-5.5",
336
+ "chatgpt-gpt-5.5-fast",
329
337
  "chatgpt-gpt-5.4",
330
338
  "chatgpt-gpt-5.4-fast",
331
339
  "chatgpt-gpt-5.4-mini",
332
340
  "chatgpt-gpt-5.3-codex-spark"
333
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"];
334
345
  var EXPERIMENTAL_CHATGPT_MODEL_PREFIX = "experimental-chatgpt-";
335
346
  function isExperimentalChatGptModelId(value) {
336
347
  return value.startsWith(EXPERIMENTAL_CHATGPT_MODEL_PREFIX) && value.length > EXPERIMENTAL_CHATGPT_MODEL_PREFIX.length;
@@ -338,6 +349,15 @@ function isExperimentalChatGptModelId(value) {
338
349
  function isChatGptModelId(value) {
339
350
  return CHATGPT_MODEL_IDS.includes(value) || isExperimentalChatGptModelId(value);
340
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
+ }
341
361
  function stripChatGptPrefix(model) {
342
362
  if (isExperimentalChatGptModelId(model)) {
343
363
  return model.slice(EXPERIMENTAL_CHATGPT_MODEL_PREFIX.length);
@@ -345,18 +365,16 @@ function stripChatGptPrefix(model) {
345
365
  return model.slice("chatgpt-".length);
346
366
  }
347
367
  function resolveChatGptProviderModel(model) {
348
- switch (model) {
349
- case "chatgpt-gpt-5.4-fast":
350
- return "gpt-5.4";
351
- default:
352
- return stripChatGptPrefix(model);
353
- }
368
+ const providerModel = stripChatGptPrefix(model);
369
+ return CHATGPT_PRIORITY_MODEL_IDS.includes(model) ? stripFastSuffix(providerModel) : providerModel;
354
370
  }
355
371
  function resolveChatGptServiceTier(model) {
356
- return model === "chatgpt-gpt-5.4-fast" ? "priority" : void 0;
372
+ return CHATGPT_PRIORITY_MODEL_IDS.includes(model) ? "priority" : void 0;
357
373
  }
358
374
 
359
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"];
360
378
  var OPENAI_GPT_54_FAST_MODEL_IDS = ["gpt-5.4-fast", "chatgpt-gpt-5.4-fast"];
361
379
  var OPENAI_GPT_54_MINI_MODEL_IDS = ["gpt-5.4-mini", "chatgpt-gpt-5.4-mini"];
362
380
  var OPENAI_GPT_54_NANO_MODEL_IDS = ["gpt-5.4-nano"];
@@ -365,6 +383,16 @@ var OPENAI_GPT_53_CODEX_SPARK_MODEL_IDS = [
365
383
  "chatgpt-gpt-5.3-codex-spark"
366
384
  ];
367
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
+ };
368
396
  var OPENAI_GPT_54_PRICING = {
369
397
  inputRate: 2.5 / 1e6,
370
398
  cachedRate: 0.25 / 1e6,
@@ -389,6 +417,12 @@ function getOpenAiPricing(modelId) {
389
417
  if (isExperimentalChatGptModelId(modelId)) {
390
418
  return OPENAI_GPT_54_PRICING;
391
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
+ }
392
426
  if (OPENAI_GPT_54_FAST_MODEL_IDS.includes(modelId)) {
393
427
  return OPENAI_GPT_54_PRIORITY_PRICING;
394
428
  }
@@ -5070,7 +5104,11 @@ function resolveProvider(model) {
5070
5104
  }
5071
5105
  }
5072
5106
  if (isOpenAiModelId(model)) {
5073
- return { provider: "openai", model };
5107
+ return {
5108
+ provider: "openai",
5109
+ model: resolveOpenAiProviderModel(model),
5110
+ serviceTier: resolveOpenAiServiceTier(model)
5111
+ };
5074
5112
  }
5075
5113
  throw new Error(`Unsupported text model: ${model}`);
5076
5114
  }
@@ -7844,6 +7882,7 @@ async function runTextCall(params) {
7844
7882
  {
7845
7883
  model: modelForProvider,
7846
7884
  input: openAiInput,
7885
+ ...providerInfo.serviceTier ? { service_tier: providerInfo.serviceTier } : {},
7847
7886
  reasoning,
7848
7887
  text: openAiTextConfig,
7849
7888
  ...openAiTools ? { tools: openAiTools } : {},
@@ -8729,6 +8768,7 @@ async function runToolLoop(request) {
8729
8768
  const stepRequestPayload = {
8730
8769
  model: providerInfo.model,
8731
8770
  input: preparedInput,
8771
+ ...providerInfo.serviceTier ? { service_tier: providerInfo.serviceTier } : {},
8732
8772
  ...previousResponseId ? { previous_response_id: previousResponseId } : {},
8733
8773
  ...openAiTools.length > 0 ? { tools: openAiTools } : {},
8734
8774
  ...openAiTools.length > 0 ? { parallel_tool_calls: true } : {},
@@ -8757,6 +8797,7 @@ async function runToolLoop(request) {
8757
8797
  {
8758
8798
  model: providerInfo.model,
8759
8799
  input: preparedInput,
8800
+ ...providerInfo.serviceTier ? { service_tier: providerInfo.serviceTier } : {},
8760
8801
  ...previousResponseId ? { previous_response_id: previousResponseId } : {},
8761
8802
  ...openAiTools.length > 0 ? { tools: openAiTools } : {},
8762
8803
  ...openAiTools.length > 0 ? { parallel_tool_calls: true } : {},
@@ -12768,7 +12809,7 @@ function isCodexModel(model) {
12768
12809
  return true;
12769
12810
  }
12770
12811
  const normalized = model.startsWith("chatgpt-") ? model.slice("chatgpt-".length) : model;
12771
- 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";
12772
12813
  }
12773
12814
  function isGeminiModel(model) {
12774
12815
  return model.startsWith("gemini-");