mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-25 00:51:28 +02:00
The release-date normalizer matched a bare "-YYYYMMDD" suffix on any id. Pricing looks every model up through it regardless of surface, and an operator can register a custom model under any id at all, so a custom "internal-llm-20250101" would silently inherit the rate registered for "internal-llm". Anchor the pattern on "claude" so it still covers the vendor-prefixed Bedrock forms while leaving every other vendor's id untouched.
63 lines
2.6 KiB
Go
63 lines
2.6 KiB
Go
package llm
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestNormalizeBedrockModel(t *testing.T) {
|
|
cases := map[string]string{
|
|
"eu.anthropic.claude-sonnet-4-5-20250929-v1:0": "anthropic.claude-sonnet-4-5",
|
|
"us.anthropic.claude-haiku-4-5": "anthropic.claude-haiku-4-5",
|
|
"us.anthropic.claude-opus-4-8-20250101-v1:0": "anthropic.claude-opus-4-8",
|
|
"apac.anthropic.claude-haiku-4-5-v1:0": "anthropic.claude-haiku-4-5",
|
|
"amazon.nova-2-lite-v1:0": "amazon.nova-2-lite",
|
|
"anthropic.claude-sonnet-4-5-20250929-v1:0": "anthropic.claude-sonnet-4-5",
|
|
"meta.llama3-3-70b-instruct-v1:0": "meta.llama3-3-70b-instruct",
|
|
"amazon.nova-pro-v1:0": "amazon.nova-pro",
|
|
// Inference-profile ARN — model id lives in the last path segment.
|
|
"arn:aws:bedrock:eu-central-1:123456789012:inference-profile/eu.anthropic.claude-sonnet-4-5-20250929-v1:0": "anthropic.claude-sonnet-4-5",
|
|
}
|
|
for in, want := range cases {
|
|
require.Equal(t, want, NormalizeBedrockModel(in), "normalize %q", in)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeVertexModel(t *testing.T) {
|
|
cases := map[string]string{
|
|
"claude-sonnet-4-5@20250929": "claude-sonnet-4-5",
|
|
"claude-haiku-4-5": "claude-haiku-4-5",
|
|
"gpt-4o@2024-08-06": "gpt-4o",
|
|
}
|
|
for in, want := range cases {
|
|
require.Equal(t, want, NormalizeVertexModel(in), "normalize %q", in)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeAnthropicModel(t *testing.T) {
|
|
cases := map[string]string{
|
|
"claude-sonnet-4-5-20250929": "claude-sonnet-4-5",
|
|
"claude-3-5-haiku-20241022": "claude-3-5-haiku",
|
|
"claude-sonnet-5": "claude-sonnet-5",
|
|
"claude-opus-4-8": "claude-opus-4-8",
|
|
"anthropic.claude-haiku-4-5": "anthropic.claude-haiku-4-5",
|
|
"anthropic.claude-sonnet-4-5-20250929": "anthropic.claude-sonnet-4-5",
|
|
"us.anthropic.claude-opus-4-8-20250101": "us.anthropic.claude-opus-4-8",
|
|
// Non-Claude ids must survive untouched even when they end in eight
|
|
// consecutive digits: an operator can register a custom model under
|
|
// any id, and pricing looks every one of them up through this helper.
|
|
"gpt-4o": "gpt-4o",
|
|
"gpt-4o-2024-08-06": "gpt-4o-2024-08-06",
|
|
"gpt-4o-20240806": "gpt-4o-20240806",
|
|
"internal-llm-20250101": "internal-llm-20250101",
|
|
"deepseek-r1-20250120": "deepseek-r1-20250120",
|
|
"Qwen/Qwen2.5-20250101": "Qwen/Qwen2.5-20250101",
|
|
"gemini-2-5-pro-20250101": "gemini-2-5-pro-20250101",
|
|
"": "",
|
|
}
|
|
for in, want := range cases {
|
|
require.Equal(t, want, NormalizeAnthropicModel(in), "normalize %q", in)
|
|
}
|
|
}
|