@jaypie/llm 1.2.25 → 1.2.27

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.
@@ -14,6 +14,10 @@ import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
14
14
  export declare class AnthropicAdapter extends BaseProviderAdapter {
15
15
  readonly name: "anthropic";
16
16
  readonly defaultModel: "claude-sonnet-4-6";
17
+ private runtimeNoTemperatureModels;
18
+ rememberModelRejectsTemperature(model: string): void;
19
+ clearRuntimeNoTemperatureModels(): void;
20
+ private supportsTemperature;
17
21
  buildRequest(request: OperateRequest): Anthropic.MessageCreateParams;
18
22
  formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
19
23
  formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
@@ -5,7 +5,7 @@ export declare const PROVIDER: {
5
5
  };
6
6
  readonly MODEL: {
7
7
  readonly DEFAULT: "claude-sonnet-4-6";
8
- readonly LARGE: "claude-opus-4-6";
8
+ readonly LARGE: "claude-opus-4-7";
9
9
  readonly SMALL: "claude-sonnet-4-6";
10
10
  readonly TINY: "claude-haiku-4-5";
11
11
  };
@@ -51,7 +51,7 @@ export declare const PROVIDER: {
51
51
  readonly OPENROUTER: {
52
52
  readonly MODEL: {
53
53
  readonly DEFAULT: "anthropic/claude-sonnet-4-6";
54
- readonly LARGE: "anthropic/claude-opus-4-6";
54
+ readonly LARGE: "anthropic/claude-opus-4-7";
55
55
  readonly SMALL: "anthropic/claude-sonnet-4-6";
56
56
  readonly TINY: "anthropic/claude-haiku-4-5";
57
57
  };
@@ -98,8 +98,8 @@ export declare const DEFAULT: {
98
98
  };
99
99
  export declare const ALL: {
100
100
  readonly BASE: readonly ["claude-sonnet-4-6", "gemini-3.1-pro-preview", "gpt-5.4", "grok-4.20-0309-reasoning"];
101
- readonly COMBINED: readonly ("claude-sonnet-4-6" | "claude-opus-4-6" | "claude-haiku-4-5" | "gemini-3.1-pro-preview" | "gemini-3-flash-preview" | "gemini-3.1-flash-lite-preview" | "gpt-5.4" | "gpt-5.4-mini" | "gpt-5.4-nano" | "grok-4.20-0309-reasoning" | "grok-4.20-0309-non-reasoning" | "grok-4-1-fast-non-reasoning")[];
102
- readonly LARGE: readonly ["claude-opus-4-6", "gemini-3.1-pro-preview", "gpt-5.4", "grok-4.20-0309-reasoning"];
101
+ readonly COMBINED: readonly ("claude-sonnet-4-6" | "claude-opus-4-7" | "claude-haiku-4-5" | "gemini-3.1-pro-preview" | "gemini-3-flash-preview" | "gemini-3.1-flash-lite-preview" | "gpt-5.4" | "gpt-5.4-mini" | "gpt-5.4-nano" | "grok-4.20-0309-reasoning" | "grok-4.20-0309-non-reasoning" | "grok-4-1-fast-non-reasoning")[];
102
+ readonly LARGE: readonly ["claude-opus-4-7", "gemini-3.1-pro-preview", "gpt-5.4", "grok-4.20-0309-reasoning"];
103
103
  readonly SMALL: readonly ["claude-sonnet-4-6", "gemini-3-flash-preview", "gpt-5.4-mini", "grok-4.20-0309-non-reasoning"];
104
104
  readonly TINY: readonly ["claude-haiku-4-5", "gemini-3.1-flash-lite-preview", "gpt-5.4-nano", "grok-4-1-fast-non-reasoning"];
105
105
  };
package/dist/esm/index.js CHANGED
@@ -15,7 +15,7 @@ const FIRST_CLASS_PROVIDER = {
15
15
  // https://docs.anthropic.com/en/docs/about-claude/models/overview
16
16
  ANTHROPIC: {
17
17
  DEFAULT: "claude-sonnet-4-6",
18
- LARGE: "claude-opus-4-6",
18
+ LARGE: "claude-opus-4-7",
19
19
  SMALL: "claude-sonnet-4-6",
20
20
  TINY: "claude-haiku-4-5",
21
21
  },
@@ -1063,6 +1063,24 @@ const NOT_RETRYABLE_ERROR_NAMES = [
1063
1063
  "NotFoundError",
1064
1064
  "PermissionDeniedError",
1065
1065
  ];
1066
+ // Models known not to accept `temperature`.
1067
+ // Patterns (not exact names) so dated variants and future releases are covered
1068
+ // without code changes — Anthropic is trending toward removing temperature on
1069
+ // newer Claude models.
1070
+ const MODELS_WITHOUT_TEMPERATURE = [
1071
+ /^claude-opus-4-[789]/,
1072
+ /^claude-opus-[5-9]/,
1073
+ ];
1074
+ function isTemperatureDeprecationError(error) {
1075
+ if (!error || typeof error !== "object")
1076
+ return false;
1077
+ const err = error;
1078
+ const name = error?.constructor?.name;
1079
+ if (name !== "BadRequestError" && err.status !== 400)
1080
+ return false;
1081
+ const messages = [err.message, err.error?.message].filter((m) => typeof m === "string");
1082
+ return messages.some((m) => m.toLowerCase().includes("temperature"));
1083
+ }
1066
1084
  //
1067
1085
  //
1068
1086
  // Main
@@ -1077,6 +1095,20 @@ class AnthropicAdapter extends BaseProviderAdapter {
1077
1095
  super(...arguments);
1078
1096
  this.name = PROVIDER.ANTHROPIC.NAME;
1079
1097
  this.defaultModel = PROVIDER.ANTHROPIC.MODEL.DEFAULT;
1098
+ // Session-level cache of models observed to reject `temperature` at runtime.
1099
+ // Populated by executeRequest on 400 errors so repeat calls skip the param.
1100
+ this.runtimeNoTemperatureModels = new Set();
1101
+ }
1102
+ rememberModelRejectsTemperature(model) {
1103
+ this.runtimeNoTemperatureModels.add(model);
1104
+ }
1105
+ clearRuntimeNoTemperatureModels() {
1106
+ this.runtimeNoTemperatureModels.clear();
1107
+ }
1108
+ supportsTemperature(model) {
1109
+ if (this.runtimeNoTemperatureModels.has(model))
1110
+ return false;
1111
+ return !MODELS_WITHOUT_TEMPERATURE.some((pattern) => pattern.test(model));
1080
1112
  }
1081
1113
  //
1082
1114
  // Request Building
@@ -1168,6 +1200,11 @@ class AnthropicAdapter extends BaseProviderAdapter {
1168
1200
  if (request.temperature !== undefined) {
1169
1201
  anthropicRequest.temperature = request.temperature;
1170
1202
  }
1203
+ // Strip temperature for models that don't support it (denylist + runtime cache)
1204
+ if (anthropicRequest.temperature !== undefined &&
1205
+ !this.supportsTemperature(anthropicRequest.model)) {
1206
+ delete anthropicRequest.temperature;
1207
+ }
1171
1208
  return anthropicRequest;
1172
1209
  }
1173
1210
  formatTools(toolkit, outputSchema) {
@@ -1218,22 +1255,48 @@ class AnthropicAdapter extends BaseProviderAdapter {
1218
1255
  //
1219
1256
  async executeRequest(client, request, signal) {
1220
1257
  const anthropic = client;
1258
+ const anthropicRequest = request;
1221
1259
  try {
1222
- return (await anthropic.messages.create(request, signal ? { signal } : undefined));
1260
+ return (await anthropic.messages.create(anthropicRequest, signal ? { signal } : undefined));
1223
1261
  }
1224
1262
  catch (error) {
1225
1263
  if (signal?.aborted)
1226
1264
  return undefined;
1265
+ // If the model rejected `temperature`, cache it and retry without the param
1266
+ if (anthropicRequest.temperature !== undefined &&
1267
+ isTemperatureDeprecationError(error)) {
1268
+ this.rememberModelRejectsTemperature(anthropicRequest.model);
1269
+ const retryRequest = { ...anthropicRequest };
1270
+ delete retryRequest.temperature;
1271
+ return (await anthropic.messages.create(retryRequest, signal ? { signal } : undefined));
1272
+ }
1227
1273
  throw error;
1228
1274
  }
1229
1275
  }
1230
1276
  async *executeStreamRequest(client, request, signal) {
1231
1277
  const anthropic = client;
1232
- const streamRequest = {
1278
+ let streamRequest = {
1233
1279
  ...request,
1234
1280
  stream: true,
1235
1281
  };
1236
- const stream = await anthropic.messages.create(streamRequest, signal ? { signal } : undefined);
1282
+ let stream;
1283
+ try {
1284
+ stream = await anthropic.messages.create(streamRequest, signal ? { signal } : undefined);
1285
+ }
1286
+ catch (error) {
1287
+ if (streamRequest.temperature !== undefined &&
1288
+ isTemperatureDeprecationError(error)) {
1289
+ this.rememberModelRejectsTemperature(streamRequest.model);
1290
+ streamRequest = {
1291
+ ...streamRequest,
1292
+ };
1293
+ delete streamRequest.temperature;
1294
+ stream = await anthropic.messages.create(streamRequest, signal ? { signal } : undefined);
1295
+ }
1296
+ else {
1297
+ throw error;
1298
+ }
1299
+ }
1237
1300
  // Track current tool call being built
1238
1301
  let currentToolCall = null;
1239
1302
  // Track usage for final chunk