@jaypie/llm 1.2.31 → 1.2.32

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.
@@ -13,6 +13,10 @@ import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
13
13
  export declare class OpenAiAdapter extends BaseProviderAdapter {
14
14
  readonly name: "openai";
15
15
  readonly defaultModel: "gpt-5.4";
16
+ private runtimeNoTemperatureModels;
17
+ rememberModelRejectsTemperature(model: string): void;
18
+ clearRuntimeNoTemperatureModels(): void;
19
+ private supportsTemperature;
16
20
  buildRequest(request: OperateRequest): unknown;
17
21
  formatTools(toolkit: Toolkit, _outputSchema?: JsonObject): ProviderToolDefinition[];
18
22
  formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
package/dist/esm/index.js CHANGED
@@ -1197,11 +1197,11 @@ const NOT_RETRYABLE_ERROR_NAMES = [
1197
1197
  // Patterns (not exact names) so dated variants and future releases are covered
1198
1198
  // without code changes — Anthropic is trending toward removing temperature on
1199
1199
  // newer Claude models.
1200
- const MODELS_WITHOUT_TEMPERATURE = [
1200
+ const MODELS_WITHOUT_TEMPERATURE$1 = [
1201
1201
  /^claude-opus-4-[789]/,
1202
1202
  /^claude-opus-[5-9]/,
1203
1203
  ];
1204
- function isTemperatureDeprecationError(error) {
1204
+ function isTemperatureDeprecationError$1(error) {
1205
1205
  if (!error || typeof error !== "object")
1206
1206
  return false;
1207
1207
  const err = error;
@@ -1271,7 +1271,7 @@ class AnthropicAdapter extends BaseProviderAdapter {
1271
1271
  supportsTemperature(model) {
1272
1272
  if (this.runtimeNoTemperatureModels.has(model))
1273
1273
  return false;
1274
- return !MODELS_WITHOUT_TEMPERATURE.some((pattern) => pattern.test(model));
1274
+ return !MODELS_WITHOUT_TEMPERATURE$1.some((pattern) => pattern.test(model));
1275
1275
  }
1276
1276
  supportsStructuredOutput(model) {
1277
1277
  return !this.runtimeNoStructuredOutputModels.has(model);
@@ -1449,7 +1449,7 @@ class AnthropicAdapter extends BaseProviderAdapter {
1449
1449
  return undefined;
1450
1450
  // If the model rejected `temperature`, cache it and retry without the param
1451
1451
  if (anthropicRequest.temperature !== undefined &&
1452
- isTemperatureDeprecationError(error)) {
1452
+ isTemperatureDeprecationError$1(error)) {
1453
1453
  this.rememberModelRejectsTemperature(anthropicRequest.model);
1454
1454
  const retryRequest = { ...anthropicRequest };
1455
1455
  delete retryRequest.temperature;
@@ -1510,7 +1510,7 @@ class AnthropicAdapter extends BaseProviderAdapter {
1510
1510
  }
1511
1511
  catch (error) {
1512
1512
  if (streamRequest.temperature !== undefined &&
1513
- isTemperatureDeprecationError(error)) {
1513
+ isTemperatureDeprecationError$1(error)) {
1514
1514
  this.rememberModelRejectsTemperature(streamRequest.model);
1515
1515
  streamRequest = {
1516
1516
  ...streamRequest,
@@ -2661,6 +2661,27 @@ const NOT_RETRYABLE_ERROR_TYPES = [
2661
2661
  RateLimitError,
2662
2662
  UnprocessableEntityError,
2663
2663
  ];
2664
+ // Models known not to accept `temperature`.
2665
+ // Patterns (not exact names) so dated variants and future releases are covered
2666
+ // without code changes — OpenAI is removing temperature on newer reasoning
2667
+ // models.
2668
+ const MODELS_WITHOUT_TEMPERATURE = [
2669
+ /^gpt-5\.5/, // gpt-5.5 series deprecated temperature
2670
+ /^o\d/, // o-series reasoning models (o1, o3, o4, ...)
2671
+ ];
2672
+ function isTemperatureDeprecationError(error) {
2673
+ if (!error || typeof error !== "object")
2674
+ return false;
2675
+ if (!(error instanceof BadRequestError) &&
2676
+ error.status !== 400) {
2677
+ return false;
2678
+ }
2679
+ const messages = [
2680
+ error.message,
2681
+ error.error?.message,
2682
+ ].filter((m) => typeof m === "string");
2683
+ return messages.some((m) => m.toLowerCase().includes("temperature"));
2684
+ }
2664
2685
  //
2665
2686
  //
2666
2687
  // Main
@@ -2675,6 +2696,20 @@ class OpenAiAdapter extends BaseProviderAdapter {
2675
2696
  super(...arguments);
2676
2697
  this.name = PROVIDER.OPENAI.NAME;
2677
2698
  this.defaultModel = PROVIDER.OPENAI.MODEL.DEFAULT;
2699
+ // Session-level cache of models observed to reject `temperature` at runtime.
2700
+ // Populated by executeRequest on 400 errors so repeat calls skip the param.
2701
+ this.runtimeNoTemperatureModels = new Set();
2702
+ }
2703
+ rememberModelRejectsTemperature(model) {
2704
+ this.runtimeNoTemperatureModels.add(model);
2705
+ }
2706
+ clearRuntimeNoTemperatureModels() {
2707
+ this.runtimeNoTemperatureModels.clear();
2708
+ }
2709
+ supportsTemperature(model) {
2710
+ if (this.runtimeNoTemperatureModels.has(model))
2711
+ return false;
2712
+ return !MODELS_WITHOUT_TEMPERATURE.some((pattern) => pattern.test(model));
2678
2713
  }
2679
2714
  //
2680
2715
  // Request Building
@@ -2718,6 +2753,11 @@ class OpenAiAdapter extends BaseProviderAdapter {
2718
2753
  if (request.temperature !== undefined) {
2719
2754
  openaiRequest.temperature = request.temperature;
2720
2755
  }
2756
+ // Strip temperature for models that don't support it (denylist + runtime cache)
2757
+ if (openaiRequest.temperature !== undefined &&
2758
+ !this.supportsTemperature(openaiRequest.model)) {
2759
+ delete openaiRequest.temperature;
2760
+ }
2721
2761
  return openaiRequest;
2722
2762
  }
2723
2763
  formatTools(toolkit, _outputSchema) {
@@ -2767,14 +2807,21 @@ class OpenAiAdapter extends BaseProviderAdapter {
2767
2807
  //
2768
2808
  async executeRequest(client, request, signal) {
2769
2809
  const openai = client;
2810
+ const openaiRequest = request;
2770
2811
  try {
2771
- return await openai.responses.create(
2772
- // @ts-expect-error OpenAI SDK types don't match our request format exactly
2773
- request, signal ? { signal } : undefined);
2812
+ return await openai.responses.create(openaiRequest, signal ? { signal } : undefined);
2774
2813
  }
2775
2814
  catch (error) {
2776
2815
  if (signal?.aborted)
2777
2816
  return undefined;
2817
+ // If the model rejected `temperature`, cache it and retry without the param
2818
+ if (openaiRequest.temperature !== undefined &&
2819
+ isTemperatureDeprecationError(error)) {
2820
+ this.rememberModelRejectsTemperature(openaiRequest.model);
2821
+ const retryRequest = { ...openaiRequest };
2822
+ delete retryRequest.temperature;
2823
+ return await openai.responses.create(retryRequest, signal ? { signal } : undefined);
2824
+ }
2778
2825
  throw error;
2779
2826
  }
2780
2827
  }