This commit is contained in:
reanon
2025-10-15 19:55:45 +02:00
parent 8b757bf89f
commit 9cea50ec49
9 changed files with 37 additions and 15 deletions
+8 -5
View File
@@ -196,10 +196,11 @@ function setAnthropicBetaHeader(req: Request) {
betaHeaders.push("extended-cache-ttl-2025-04-11");
}
// Add 1M context beta header for Claude Sonnet 4/Opus 4 if context > 200k tokens
// Add 1M context beta header for Claude Sonnet 4/Opus 4/Haiku 4.5 if context > 200k tokens
const supportsBigContext =
model?.includes("claude-sonnet-4") ||
model?.includes("claude-opus-4");
model?.includes("claude-opus-4") ||
model?.includes("claude-haiku-4");
if (supportsBigContext && req.promptTokens && req.outputTokens) {
const contextTokens = req.promptTokens + req.outputTokens;
if (contextTokens > 200000) {
@@ -226,7 +227,7 @@ function addWebSearchTool(req: Request) {
// Check if this is a Claude model that supports web search and if web search is enabled
const isClaude35 = req.body.model?.includes("claude-3-5") || req.body.model?.includes("claude-3.5");
const isClaude37 = req.body.model?.includes("claude-3-7") || req.body.model?.includes("claude-3.7");
const isClaude4 = req.body.model?.includes("claude-sonnet-4") || req.body.model?.includes("claude-opus-4");
const isClaude4 = req.body.model?.includes("claude-sonnet-4") || req.body.model?.includes("claude-opus-4") || req.body.model?.includes("claude-haiku-4");
const useWebSearch = (isClaude35 || isClaude37 || isClaude4) && Boolean(req.body.enable_web_search);
if (useWebSearch) {
@@ -328,7 +329,8 @@ const preprocessAnthropicTextRequest: RequestHandler = (req, res, next) => {
const model = req.body.model;
const isClaude4Model =
model?.includes("claude-sonnet-4") ||
model?.includes("claude-opus-4");
model?.includes("claude-opus-4") ||
model?.includes("claude-haiku-4");
if (model?.startsWith("claude-3") || isClaude4Model) {
textToChatPreprocessor(req, res, next);
} else {
@@ -363,7 +365,8 @@ const preprocessOpenAICompatRequest: RequestHandler = (req, res, next) => {
const model = req.body.model;
const isClaude4 =
model?.includes("claude-sonnet-4") ||
model?.includes("claude-opus-4");
model?.includes("claude-opus-4") ||
model?.includes("claude-haiku-4");
if (model?.includes("claude-3") || isClaude4) {
oaiToChatPreprocessor(req, res, next);
} else {
+8 -3
View File
@@ -104,7 +104,8 @@ const preprocessAwsTextRequest: RequestHandler = (req, res, next) => {
const model = req.body.model;
const isClaude4Model =
model?.includes("claude-sonnet-4") ||
model?.includes("claude-opus-4");
model?.includes("claude-opus-4") ||
model?.includes("claude-haiku-4");
if (model?.includes("claude-3") || isClaude4Model) {
textToChatPreprocessor(req, res, next);
} else {
@@ -130,7 +131,8 @@ const preprocessOpenAICompatRequest: RequestHandler = (req, res, next) => {
const model = req.body.model;
const isClaude4Model =
model?.includes("claude-sonnet-4") ||
model?.includes("claude-opus-4");
model?.includes("claude-opus-4") ||
model?.includes("claude-haiku-4");
if (model?.includes("claude-3") || isClaude4Model) {
oaiToAwsChatPreprocessor(req, res, next);
} else {
@@ -345,10 +347,13 @@ function maybeReassignModel(req: Request) {
// Mapping "claude-4.5-..." variants to their actual AWS Bedrock IDs
// as defined in src/shared/claude-models.ts.
switch (name) {
case "haiku":
req.body.model = "anthropic.claude-haiku-4-5-20251001-v1:0";
return;
case "sonnet":
req.body.model = "anthropic.claude-sonnet-4-5-20250929-v1:0";
return;
// No opus or haiku variants for 4.5 yet
// No opus variant for 4.5 yet
}
break;
}
+4
View File
@@ -34,6 +34,7 @@ const getModelsResponse = () => {
"claude-opus-4@20250514",
"claude-opus-4-1@20250805",
"claude-sonnet-4-5@20250929",
"claude-haiku-4-5@20251001",
];
const models = variants.map((id) => ({
@@ -252,6 +253,9 @@ function maybeReassignModel(req: Request) {
case "4.5":
switch (flavor) {
case "haiku":
req.body.model = "claude-haiku-4-5@20251001";
return;
case "sonnet":
req.body.model = "claude-sonnet-4-5@20250929";
return;
@@ -123,13 +123,13 @@ export const validateContextSize: RequestPreprocessor = async (req) => {
modelMax = 200000;
} else if (model.match(/^claude-3/)) {
modelMax = 200000;
} else if (model.match(/^claude-(?:sonnet|opus)-4(?:-5)?/)) {
} else if (model.match(/^claude-(?:sonnet|opus|haiku)-4(?:-5)?/)) {
modelMax = 1000000;
} else if (model.match(/^gemini-/)) {
modelMax = 1024000;
} else if (model.match(/^anthropic\.claude-3/)) {
modelMax = 200000;
} else if (model.match(/^anthropic\.claude-(?:sonnet|opus)-4(?:-5)?/)) {
} else if (model.match(/^anthropic\.claude-(?:sonnet|opus|haiku)-4(?:-5)?/)) {
modelMax = 1000000;
} else if (model.match(/^anthropic\.claude-v2:\d/)) {
modelMax = 200000;
+3 -1
View File
@@ -534,7 +534,9 @@ function addKeyToAggregates(k: KeyPoolKey) {
addToFamily(`aws-claude__awsSonnet3_5`, 1);
} else if (id.includes("claude-3-7-sonnet")) {
addToFamily(`aws-claude__awsSonnet3_7`, 1);
} else if (id.includes("claude-3-haiku")) {
} else if (id.includes("claude-3-haiku") || id.includes("claude-3-5-haiku")) {
addToFamily(`aws-claude__awsHaiku`, 1);
} else if (id.includes("haiku-4-5")) {
addToFamily(`aws-claude__awsHaiku`, 1);
} else if (id.includes("sonnet-4-5")) {
addToFamily(`aws-claude__awsSonnet4_5`, 1);
+4 -1
View File
@@ -73,7 +73,10 @@ function isClaude41OpusModel(model: string): boolean {
if (model.includes("claude-opus-4-1")) return true;
// sonnet45
if (model.includes("claude-sonnet-4-5")) return true
if (model.includes("claude-sonnet-4-5")) return true;
// haiku45
if (model.includes("claude-haiku-4-5")) return true;
return false;
}
+3
View File
@@ -28,6 +28,9 @@ export const claudeModels: ClaudeModelMapping[] = [
{ awsId: "anthropic.claude-sonnet-4-5-20250929-v1:0", anthropicId: "claude-sonnet-4-5-20250929", displayName: "Claude 4.5 Sonnet" },
{ awsId: "anthropic.claude-sonnet-4-5-20250929-v1:0", anthropicId: "claude-sonnet-4-5", displayName: "Claude 4.5 Sonnet" },
{ awsId: "anthropic.claude-sonnet-4-5-20250929-v1:0", anthropicId: "claude-sonnet-4-5-latest", displayName: "Claude 4.5 Sonnet (Latest)" },
{ awsId: "anthropic.claude-haiku-4-5-20251001-v1:0", anthropicId: "claude-haiku-4-5-20251001", displayName: "Claude 4.5 Haiku" },
{ awsId: "anthropic.claude-haiku-4-5-20251001-v1:0", anthropicId: "claude-haiku-4-5", displayName: "Claude 4.5 Haiku" },
{ awsId: "anthropic.claude-haiku-4-5-20251001-v1:0", anthropicId: "claude-haiku-4-5-latest", displayName: "Claude 4.5 Haiku (Latest)" },
];
export function findByAwsId(awsId: string): ClaudeModelMapping | undefined {
+1
View File
@@ -29,6 +29,7 @@ const KNOWN_MODEL_IDS: ModuleAliasTuple[] = [
["anthropic.claude-opus-4-20250514-v1:0"],
["anthropic.claude-opus-4-1-20250805-v1:0"],
["anthropic.claude-sonnet-4-5-20250929-v1:0"],
["anthropic.claude-haiku-4-5-20251001-v1:0"],
["mistral.mistral-7b-instruct-v0:2"],
["mistral.mixtral-8x7b-instruct-v0:1"],
["mistral.mistral-large-2402-v1:0"],
+4 -3
View File
@@ -45,17 +45,18 @@ export class GcpKeyChecker extends KeyCheckerBase<GcpKey> {
this.invokeModel("claude-opus-4-1@20250805", key, true),
this.invokeModel("claude-3-5-sonnet-v2@20241022", key, true),
this.invokeModel("claude-sonnet-4-5@20250929", key, true),
this.invokeModel("claude-haiku-4-5@20251001", key, true),
];
const [sonnet, haiku, opus3, opus41, sonnet35, sonnet45] = await Promise.all(checks);
const [sonnet, haiku, opus3, opus41, sonnet35, sonnet45, haiku45] = await Promise.all(checks);
this.log.debug(
{ key: key.hash, sonnet, haiku, opus3, opus41, sonnet35, sonnet45 },
{ key: key.hash, sonnet, haiku, opus3, opus41, sonnet35, sonnet45, haiku45 },
"GCP model initial tests complete."
);
const families: GcpModelFamily[] = [];
if (sonnet || sonnet35 || sonnet45 || haiku) families.push("gcp-claude");
if (sonnet || sonnet35 || sonnet45 || haiku || haiku45) families.push("gcp-claude");
if (opus3 || opus41) families.push("gcp-claude-opus");
if (families.length === 0) {