@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
|
}
|