From fb65cf9fed251184f50e501f43756b41231b86a3 Mon Sep 17 00:00:00 2001 From: Paul Shippy Date: Wed, 16 Apr 2025 15:13:03 -0700 Subject: [PATCH] Update models to support Claude 3.7 Sonnet in bedrock --- lib/ruby_llm/models.json | 312 ++++++++++++------ lib/ruby_llm/providers/bedrock/models.rb | 9 +- .../ruby_llm/providers/bedrock/models_spec.rb | 104 ++++++ 3 files changed, 325 insertions(+), 100 deletions(-) create mode 100644 spec/ruby_llm/providers/bedrock/models_spec.rb diff --git a/lib/ruby_llm/models.json b/lib/ruby_llm/models.json index ffd245468..7b186b7d2 100644 --- a/lib/ruby_llm/models.json +++ b/lib/ruby_llm/models.json @@ -270,36 +270,6 @@ ] } }, - { - "id": "anthropic.claude-3-7-sonnet-20250219-v1:0", - "created_at": null, - "display_name": "Claude 3.7 Sonnet", - "provider": "bedrock", - "context_window": 200000, - "max_tokens": 4096, - "type": "chat", - "family": "claude3_sonnet", - "supports_vision": true, - "supports_functions": true, - "supports_json_mode": true, - "input_price_per_million": 3.0, - "output_price_per_million": 15.0, - "metadata": { - "provider_name": "Anthropic", - "customizations_supported": [], - "inference_configurations": [ - "INFERENCE_PROFILE" - ], - "response_streaming_supported": true, - "input_modalities": [ - "TEXT", - "IMAGE" - ], - "output_modalities": [ - "TEXT" - ] - } - }, { "id": "anthropic.claude-3-haiku-20240307-v1:0", "created_at": null, @@ -861,7 +831,7 @@ }, { "id": "babbage-002", - "created_at": "2023-08-21T18:16:55+02:00", + "created_at": "2023-08-21T09:16:55-07:00", "display_name": "Babbage 002", "provider": "openai", "context_window": 4096, @@ -905,7 +875,7 @@ }, { "id": "chatgpt-4o-latest", - "created_at": "2024-08-13T04:12:11+02:00", + "created_at": "2024-08-12T19:12:11-07:00", "display_name": "ChatGPT-4o Latest", "provider": "openai", "context_window": 128000, @@ -1066,9 +1036,47 @@ "output_price_per_million": 15.0, "metadata": {} }, + { + "id": "computer-use-preview", + "created_at": "2024-12-19T17:47:57-07:00", + "display_name": "Computer Use Preview", + "provider": "openai", + "context_window": 4096, + "max_tokens": 16384, + "type": "chat", + "family": "other", + "supports_vision": false, + "supports_functions": false, + "supports_json_mode": false, + "input_price_per_million": 0.5, + "output_price_per_million": 1.5, + "metadata": { + "object": "model", + "owned_by": "system" + } + }, + { + "id": "computer-use-preview-2025-03-11", + "created_at": "2025-03-07T12:50:21-07:00", + "display_name": "Computer Use Preview 20250311", + "provider": "openai", + "context_window": 4096, + "max_tokens": 16384, + "type": "chat", + "family": "other", + "supports_vision": false, + "supports_functions": false, + "supports_json_mode": false, + "input_price_per_million": 0.5, + "output_price_per_million": 1.5, + "metadata": { + "object": "model", + "owned_by": "system" + } + }, { "id": "dall-e-2", - "created_at": "2023-11-01T01:22:57+01:00", + "created_at": "2023-10-31T17:22:57-07:00", "display_name": "DALL-E-2", "provider": "openai", "context_window": 4096, @@ -1087,7 +1095,7 @@ }, { "id": "dall-e-3", - "created_at": "2023-10-31T21:46:29+01:00", + "created_at": "2023-10-31T13:46:29-07:00", "display_name": "DALL-E-3", "provider": "openai", "context_window": 4096, @@ -1106,7 +1114,7 @@ }, { "id": "davinci-002", - "created_at": "2023-08-21T18:11:41+02:00", + "created_at": "2023-08-21T09:11:41-07:00", "display_name": "Davinci 002", "provider": "openai", "context_window": 4096, @@ -2199,7 +2207,7 @@ }, { "id": "gpt-3.5-turbo", - "created_at": "2023-02-28T19:56:42+01:00", + "created_at": "2023-02-28T11:56:42-07:00", "display_name": "GPT-3.5 Turbo", "provider": "openai", "context_window": 16385, @@ -2218,7 +2226,7 @@ }, { "id": "gpt-3.5-turbo-0125", - "created_at": "2024-01-23T23:19:18+01:00", + "created_at": "2024-01-23T15:19:18-07:00", "display_name": "GPT-3.5 Turbo 0125", "provider": "openai", "context_window": 16385, @@ -2237,7 +2245,7 @@ }, { "id": "gpt-3.5-turbo-1106", - "created_at": "2023-11-02T22:15:48+01:00", + "created_at": "2023-11-02T14:15:48-07:00", "display_name": "GPT-3.5 Turbo 1106", "provider": "openai", "context_window": 16385, @@ -2256,7 +2264,7 @@ }, { "id": "gpt-3.5-turbo-16k", - "created_at": "2023-05-11T00:35:02+02:00", + "created_at": "2023-05-10T15:35:02-07:00", "display_name": "GPT-3.5 Turbo 16k", "provider": "openai", "context_window": 16385, @@ -2275,7 +2283,7 @@ }, { "id": "gpt-3.5-turbo-instruct", - "created_at": "2023-08-24T20:23:47+02:00", + "created_at": "2023-08-24T11:23:47-07:00", "display_name": "GPT-3.5 Turbo Instruct", "provider": "openai", "context_window": 16385, @@ -2294,7 +2302,7 @@ }, { "id": "gpt-3.5-turbo-instruct-0914", - "created_at": "2023-09-07T23:34:32+02:00", + "created_at": "2023-09-07T14:34:32-07:00", "display_name": "GPT-3.5 Turbo Instruct 0914", "provider": "openai", "context_window": 16385, @@ -2313,7 +2321,7 @@ }, { "id": "gpt-4", - "created_at": "2023-06-27T18:13:31+02:00", + "created_at": "2023-06-27T09:13:31-07:00", "display_name": "GPT-4", "provider": "openai", "context_window": 8192, @@ -2332,7 +2340,7 @@ }, { "id": "gpt-4-0125-preview", - "created_at": "2024-01-23T20:20:12+01:00", + "created_at": "2024-01-23T12:20:12-07:00", "display_name": "GPT-4 0125 Preview", "provider": "openai", "context_window": 4096, @@ -2351,7 +2359,7 @@ }, { "id": "gpt-4-0613", - "created_at": "2023-06-12T18:54:56+02:00", + "created_at": "2023-06-12T09:54:56-07:00", "display_name": "GPT-4 0613", "provider": "openai", "context_window": 4096, @@ -2370,7 +2378,7 @@ }, { "id": "gpt-4-1106-preview", - "created_at": "2023-11-02T21:33:26+01:00", + "created_at": "2023-11-02T13:33:26-07:00", "display_name": "GPT-4 1106 Preview", "provider": "openai", "context_window": 4096, @@ -2389,7 +2397,7 @@ }, { "id": "gpt-4-turbo", - "created_at": "2024-04-06T01:57:21+02:00", + "created_at": "2024-04-05T16:57:21-07:00", "display_name": "GPT-4 Turbo", "provider": "openai", "context_window": 128000, @@ -2408,7 +2416,7 @@ }, { "id": "gpt-4-turbo-2024-04-09", - "created_at": "2024-04-08T20:41:17+02:00", + "created_at": "2024-04-08T11:41:17-07:00", "display_name": "GPT-4 Turbo 20240409", "provider": "openai", "context_window": 128000, @@ -2427,7 +2435,7 @@ }, { "id": "gpt-4-turbo-preview", - "created_at": "2024-01-23T20:22:57+01:00", + "created_at": "2024-01-23T12:22:57-07:00", "display_name": "GPT-4 Turbo Preview", "provider": "openai", "context_window": 128000, @@ -2446,7 +2454,7 @@ }, { "id": "gpt-4.1", - "created_at": "2025-04-10T22:22:22+02:00", + "created_at": "2025-04-10T13:22:22-07:00", "display_name": "GPT-4.1", "provider": "openai", "context_window": 1047576, @@ -2465,7 +2473,7 @@ }, { "id": "gpt-4.1-2025-04-14", - "created_at": "2025-04-10T22:09:06+02:00", + "created_at": "2025-04-10T13:09:06-07:00", "display_name": "GPT-4.1 20250414", "provider": "openai", "context_window": 1047576, @@ -2484,7 +2492,7 @@ }, { "id": "gpt-4.1-mini", - "created_at": "2025-04-10T22:49:33+02:00", + "created_at": "2025-04-10T13:49:33-07:00", "display_name": "GPT-4.1 Mini", "provider": "openai", "context_window": 1047576, @@ -2503,7 +2511,7 @@ }, { "id": "gpt-4.1-mini-2025-04-14", - "created_at": "2025-04-10T22:39:07+02:00", + "created_at": "2025-04-10T13:39:07-07:00", "display_name": "GPT-4.1 Mini 20250414", "provider": "openai", "context_window": 1047576, @@ -2522,7 +2530,7 @@ }, { "id": "gpt-4.1-nano", - "created_at": "2025-04-10T23:48:27+02:00", + "created_at": "2025-04-10T14:48:27-07:00", "display_name": "GPT-4.1 Nano", "provider": "openai", "context_window": 1047576, @@ -2541,7 +2549,7 @@ }, { "id": "gpt-4.1-nano-2025-04-14", - "created_at": "2025-04-10T23:37:05+02:00", + "created_at": "2025-04-10T14:37:05-07:00", "display_name": "GPT-4.1 Nano 20250414", "provider": "openai", "context_window": 1047576, @@ -2560,7 +2568,7 @@ }, { "id": "gpt-4.5-preview", - "created_at": "2025-02-27T03:24:19+01:00", + "created_at": "2025-02-26T19:24:19-07:00", "display_name": "GPT-4.5 Preview", "provider": "openai", "context_window": 128000, @@ -2579,7 +2587,7 @@ }, { "id": "gpt-4.5-preview-2025-02-27", - "created_at": "2025-02-27T03:28:24+01:00", + "created_at": "2025-02-26T19:28:24-07:00", "display_name": "GPT-4.5 Preview 20250227", "provider": "openai", "context_window": 128000, @@ -2598,7 +2606,7 @@ }, { "id": "gpt-4o", - "created_at": "2024-05-10T20:50:49+02:00", + "created_at": "2024-05-10T11:50:49-07:00", "display_name": "GPT-4o", "provider": "openai", "context_window": 128000, @@ -2617,7 +2625,7 @@ }, { "id": "gpt-4o-2024-05-13", - "created_at": "2024-05-10T21:08:52+02:00", + "created_at": "2024-05-10T12:08:52-07:00", "display_name": "GPT-4o 20240513", "provider": "openai", "context_window": 128000, @@ -2636,7 +2644,7 @@ }, { "id": "gpt-4o-2024-08-06", - "created_at": "2024-08-05T01:38:39+02:00", + "created_at": "2024-08-04T16:38:39-07:00", "display_name": "GPT-4o 20240806", "provider": "openai", "context_window": 128000, @@ -2655,7 +2663,7 @@ }, { "id": "gpt-4o-2024-11-20", - "created_at": "2025-02-12T04:39:03+01:00", + "created_at": "2025-02-11T20:39:03-07:00", "display_name": "GPT-4o 20241120", "provider": "openai", "context_window": 128000, @@ -2674,7 +2682,7 @@ }, { "id": "gpt-4o-audio-preview", - "created_at": "2024-09-27T20:07:23+02:00", + "created_at": "2024-09-27T11:07:23-07:00", "display_name": "GPT-4o-Audio Preview", "provider": "openai", "context_window": 128000, @@ -2693,7 +2701,7 @@ }, { "id": "gpt-4o-audio-preview-2024-10-01", - "created_at": "2024-09-27T00:17:22+02:00", + "created_at": "2024-09-26T15:17:22-07:00", "display_name": "GPT-4o-Audio Preview 20241001", "provider": "openai", "context_window": 128000, @@ -2712,7 +2720,7 @@ }, { "id": "gpt-4o-audio-preview-2024-12-17", - "created_at": "2024-12-12T21:10:39+01:00", + "created_at": "2024-12-12T13:10:39-07:00", "display_name": "GPT-4o-Audio Preview 20241217", "provider": "openai", "context_window": 128000, @@ -2731,7 +2739,7 @@ }, { "id": "gpt-4o-mini", - "created_at": "2024-07-17T01:32:21+02:00", + "created_at": "2024-07-16T16:32:21-07:00", "display_name": "GPT-4o-Mini", "provider": "openai", "context_window": 128000, @@ -2750,7 +2758,7 @@ }, { "id": "gpt-4o-mini-2024-07-18", - "created_at": "2024-07-17T01:31:57+02:00", + "created_at": "2024-07-16T16:31:57-07:00", "display_name": "GPT-4o-Mini 20240718", "provider": "openai", "context_window": 128000, @@ -2769,7 +2777,7 @@ }, { "id": "gpt-4o-mini-audio-preview", - "created_at": "2024-12-16T23:17:04+01:00", + "created_at": "2024-12-16T15:17:04-07:00", "display_name": "GPT-4o-Mini Audio Preview", "provider": "openai", "context_window": 128000, @@ -2788,7 +2796,7 @@ }, { "id": "gpt-4o-mini-audio-preview-2024-12-17", - "created_at": "2024-12-13T19:52:00+01:00", + "created_at": "2024-12-13T11:52:00-07:00", "display_name": "GPT-4o-Mini Audio Preview 20241217", "provider": "openai", "context_window": 128000, @@ -2807,7 +2815,7 @@ }, { "id": "gpt-4o-mini-realtime-preview", - "created_at": "2024-12-16T23:16:20+01:00", + "created_at": "2024-12-16T15:16:20-07:00", "display_name": "GPT-4o-Mini Realtime Preview", "provider": "openai", "context_window": 128000, @@ -2826,7 +2834,7 @@ }, { "id": "gpt-4o-mini-realtime-preview-2024-12-17", - "created_at": "2024-12-13T18:56:41+01:00", + "created_at": "2024-12-13T10:56:41-07:00", "display_name": "GPT-4o-Mini Realtime Preview 20241217", "provider": "openai", "context_window": 128000, @@ -2845,7 +2853,7 @@ }, { "id": "gpt-4o-mini-search-preview", - "created_at": "2025-03-08T00:46:01+01:00", + "created_at": "2025-03-07T16:46:01-07:00", "display_name": "GPT-4o-Mini Search Preview", "provider": "openai", "context_window": 4096, @@ -2864,7 +2872,7 @@ }, { "id": "gpt-4o-mini-search-preview-2025-03-11", - "created_at": "2025-03-08T00:40:58+01:00", + "created_at": "2025-03-07T16:40:58-07:00", "display_name": "GPT-4o-Mini Search Preview 20250311", "provider": "openai", "context_window": 4096, @@ -2883,7 +2891,7 @@ }, { "id": "gpt-4o-mini-transcribe", - "created_at": "2025-03-15T20:56:36+01:00", + "created_at": "2025-03-15T12:56:36-07:00", "display_name": "GPT-4o-Mini Transcribe", "provider": "openai", "context_window": 16000, @@ -2902,7 +2910,7 @@ }, { "id": "gpt-4o-mini-tts", - "created_at": "2025-03-19T18:05:59+01:00", + "created_at": "2025-03-19T10:05:59-07:00", "display_name": "GPT-4o-Mini Tts", "provider": "openai", "context_window": null, @@ -2921,7 +2929,7 @@ }, { "id": "gpt-4o-realtime-preview", - "created_at": "2024-09-30T03:33:18+02:00", + "created_at": "2024-09-29T18:33:18-07:00", "display_name": "GPT-4o-Realtime Preview", "provider": "openai", "context_window": 128000, @@ -2940,7 +2948,7 @@ }, { "id": "gpt-4o-realtime-preview-2024-10-01", - "created_at": "2024-09-24T00:49:26+02:00", + "created_at": "2024-09-23T15:49:26-07:00", "display_name": "GPT-4o-Realtime Preview 20241001", "provider": "openai", "context_window": 128000, @@ -2959,7 +2967,7 @@ }, { "id": "gpt-4o-realtime-preview-2024-12-17", - "created_at": "2024-12-11T20:30:30+01:00", + "created_at": "2024-12-11T12:30:30-07:00", "display_name": "GPT-4o-Realtime Preview 20241217", "provider": "openai", "context_window": 128000, @@ -2978,7 +2986,7 @@ }, { "id": "gpt-4o-search-preview", - "created_at": "2025-03-08T00:05:20+01:00", + "created_at": "2025-03-07T16:05:20-07:00", "display_name": "GPT-4o Search Preview", "provider": "openai", "context_window": 128000, @@ -2997,7 +3005,7 @@ }, { "id": "gpt-4o-search-preview-2025-03-11", - "created_at": "2025-03-07T23:56:10+01:00", + "created_at": "2025-03-07T15:56:10-07:00", "display_name": "GPT-4o Search Preview 20250311", "provider": "openai", "context_window": 128000, @@ -3016,7 +3024,7 @@ }, { "id": "gpt-4o-transcribe", - "created_at": "2025-03-15T20:54:23+01:00", + "created_at": "2025-03-15T12:54:23-07:00", "display_name": "GPT-4o-Transcribe", "provider": "openai", "context_window": 128000, @@ -3084,7 +3092,7 @@ }, { "id": "o1", - "created_at": "2024-12-16T20:03:36+01:00", + "created_at": "2024-12-16T12:03:36-07:00", "display_name": "O1", "provider": "openai", "context_window": 200000, @@ -3103,7 +3111,7 @@ }, { "id": "o1-2024-12-17", - "created_at": "2024-12-16T06:29:36+01:00", + "created_at": "2024-12-15T22:29:36-07:00", "display_name": "O1-20241217", "provider": "openai", "context_window": 200000, @@ -3122,7 +3130,7 @@ }, { "id": "o1-mini", - "created_at": "2024-09-06T20:56:48+02:00", + "created_at": "2024-09-06T11:56:48-07:00", "display_name": "O1-Mini", "provider": "openai", "context_window": 128000, @@ -3141,7 +3149,7 @@ }, { "id": "o1-mini-2024-09-12", - "created_at": "2024-09-06T20:56:19+02:00", + "created_at": "2024-09-06T11:56:19-07:00", "display_name": "O1-Mini 20240912", "provider": "openai", "context_window": 128000, @@ -3160,7 +3168,7 @@ }, { "id": "o1-preview", - "created_at": "2024-09-06T20:54:57+02:00", + "created_at": "2024-09-06T11:54:57-07:00", "display_name": "O1-Preview", "provider": "openai", "context_window": 200000, @@ -3179,7 +3187,7 @@ }, { "id": "o1-preview-2024-09-12", - "created_at": "2024-09-06T20:54:25+02:00", + "created_at": "2024-09-06T11:54:25-07:00", "display_name": "O1-Preview 20240912", "provider": "openai", "context_window": 200000, @@ -3198,7 +3206,7 @@ }, { "id": "o1-pro", - "created_at": "2025-03-17T23:49:51+01:00", + "created_at": "2025-03-17T15:49:51-07:00", "display_name": "O1-Pro", "provider": "openai", "context_window": 200000, @@ -3217,7 +3225,7 @@ }, { "id": "o1-pro-2025-03-19", - "created_at": "2025-03-17T23:45:04+01:00", + "created_at": "2025-03-17T15:45:04-07:00", "display_name": "O1-Pro 20250319", "provider": "openai", "context_window": 200000, @@ -3234,9 +3242,47 @@ "owned_by": "system" } }, + { + "id": "o3", + "created_at": "2025-04-09T12:01:48-07:00", + "display_name": "O3", + "provider": "openai", + "context_window": 4096, + "max_tokens": 16384, + "type": "chat", + "family": "other", + "supports_vision": false, + "supports_functions": false, + "supports_json_mode": false, + "input_price_per_million": 0.5, + "output_price_per_million": 1.5, + "metadata": { + "object": "model", + "owned_by": "system" + } + }, + { + "id": "o3-2025-04-16", + "created_at": "2025-04-08T10:28:21-07:00", + "display_name": "O3-20250416", + "provider": "openai", + "context_window": 4096, + "max_tokens": 16384, + "type": "chat", + "family": "other", + "supports_vision": false, + "supports_functions": false, + "supports_json_mode": false, + "input_price_per_million": 0.5, + "output_price_per_million": 1.5, + "metadata": { + "object": "model", + "owned_by": "system" + } + }, { "id": "o3-mini", - "created_at": "2025-01-17T21:39:43+01:00", + "created_at": "2025-01-17T13:39:43-07:00", "display_name": "O3-Mini", "provider": "openai", "context_window": 200000, @@ -3255,7 +3301,7 @@ }, { "id": "o3-mini-2025-01-31", - "created_at": "2025-01-27T21:36:40+01:00", + "created_at": "2025-01-27T13:36:40-07:00", "display_name": "O3-Mini 20250131", "provider": "openai", "context_window": 200000, @@ -3272,9 +3318,47 @@ "owned_by": "system" } }, + { + "id": "o4-mini", + "created_at": "2025-04-09T12:02:31-07:00", + "display_name": "O4 Mini", + "provider": "openai", + "context_window": 4096, + "max_tokens": 16384, + "type": "chat", + "family": "other", + "supports_vision": false, + "supports_functions": false, + "supports_json_mode": false, + "input_price_per_million": 0.5, + "output_price_per_million": 1.5, + "metadata": { + "object": "model", + "owned_by": "system" + } + }, + { + "id": "o4-mini-2025-04-16", + "created_at": "2025-04-08T10:31:46-07:00", + "display_name": "O4 Mini 20250416", + "provider": "openai", + "context_window": 4096, + "max_tokens": 16384, + "type": "chat", + "family": "other", + "supports_vision": false, + "supports_functions": false, + "supports_json_mode": false, + "input_price_per_million": 0.5, + "output_price_per_million": 1.5, + "metadata": { + "object": "model", + "owned_by": "system" + } + }, { "id": "omni-moderation-2024-09-26", - "created_at": "2024-11-27T20:07:46+01:00", + "created_at": "2024-11-27T12:07:46-07:00", "display_name": "Omni Moderation 20240926", "provider": "openai", "context_window": null, @@ -3293,7 +3377,7 @@ }, { "id": "omni-moderation-latest", - "created_at": "2024-11-15T17:47:45+01:00", + "created_at": "2024-11-15T09:47:45-07:00", "display_name": "Omni Moderation Latest", "provider": "openai", "context_window": null, @@ -3362,7 +3446,7 @@ }, { "id": "text-embedding-3-large", - "created_at": "2024-01-22T20:53:00+01:00", + "created_at": "2024-01-22T12:53:00-07:00", "display_name": "text-embedding- 3 Large", "provider": "openai", "context_window": null, @@ -3381,7 +3465,7 @@ }, { "id": "text-embedding-3-small", - "created_at": "2024-01-22T19:43:17+01:00", + "created_at": "2024-01-22T11:43:17-07:00", "display_name": "text-embedding- 3 Small", "provider": "openai", "context_window": null, @@ -3400,7 +3484,7 @@ }, { "id": "text-embedding-ada-002", - "created_at": "2022-12-16T20:01:39+01:00", + "created_at": "2022-12-16T12:01:39-07:00", "display_name": "text-embedding- Ada 002", "provider": "openai", "context_window": null, @@ -3419,7 +3503,7 @@ }, { "id": "tts-1", - "created_at": "2023-04-19T23:49:11+02:00", + "created_at": "2023-04-19T14:49:11-07:00", "display_name": "TTS-1", "provider": "openai", "context_window": null, @@ -3438,7 +3522,7 @@ }, { "id": "tts-1-1106", - "created_at": "2023-11-04T00:14:01+01:00", + "created_at": "2023-11-03T16:14:01-07:00", "display_name": "TTS-1 1106", "provider": "openai", "context_window": null, @@ -3457,7 +3541,7 @@ }, { "id": "tts-1-hd", - "created_at": "2023-11-03T22:13:35+01:00", + "created_at": "2023-11-03T14:13:35-07:00", "display_name": "TTS-1 HD", "provider": "openai", "context_window": null, @@ -3476,7 +3560,7 @@ }, { "id": "tts-1-hd-1106", - "created_at": "2023-11-04T00:18:53+01:00", + "created_at": "2023-11-03T16:18:53-07:00", "display_name": "TTS-1 HD 1106", "provider": "openai", "context_window": null, @@ -3493,6 +3577,36 @@ "owned_by": "system" } }, + { + "id": "us.anthropic.claude-3-7-sonnet-20250219-v1:0", + "created_at": null, + "display_name": "Claude 3.7 Sonnet", + "provider": "bedrock", + "context_window": 200000, + "max_tokens": 4096, + "type": "chat", + "family": "claude3_sonnet", + "supports_vision": true, + "supports_functions": true, + "supports_json_mode": true, + "input_price_per_million": 3.0, + "output_price_per_million": 15.0, + "metadata": { + "provider_name": "Anthropic", + "customizations_supported": [], + "inference_configurations": [ + "INFERENCE_PROFILE" + ], + "response_streaming_supported": true, + "input_modalities": [ + "TEXT", + "IMAGE" + ], + "output_modalities": [ + "TEXT" + ] + } + }, { "id": "veo-2.0-generate-001", "created_at": null, @@ -3519,7 +3633,7 @@ }, { "id": "whisper-1", - "created_at": "2023-02-27T22:13:04+01:00", + "created_at": "2023-02-27T14:13:04-07:00", "display_name": "Whisper 1", "provider": "openai", "context_window": null, diff --git a/lib/ruby_llm/providers/bedrock/models.rb b/lib/ruby_llm/providers/bedrock/models.rb index c075dc792..6a542044b 100644 --- a/lib/ruby_llm/providers/bedrock/models.rb +++ b/lib/ruby_llm/providers/bedrock/models.rb @@ -42,13 +42,20 @@ def create_model_info(model, slug, capabilities) def base_model_attributes(model_id, model, slug) { - id: model_id, + id: model_id_with_prefix(model_id, model), created_at: nil, display_name: model['modelName'] || capabilities.format_display_name(model_id), provider: slug } end + def model_id_with_prefix(model_id, model) + return model_id unless model['inferenceTypesSupported']&.include?('INFERENCE_PROFILE') + return model_id if model['inferenceTypesSupported']&.include?('ON_DEMAND') + + "us.#{model_id}" + end + def capability_attributes(model_id, capabilities) { context_window: capabilities.context_window_for(model_id), diff --git a/spec/ruby_llm/providers/bedrock/models_spec.rb b/spec/ruby_llm/providers/bedrock/models_spec.rb new file mode 100644 index 000000000..961b52e40 --- /dev/null +++ b/spec/ruby_llm/providers/bedrock/models_spec.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe RubyLLM::Providers::Bedrock::Models do + let(:slug) { 'bedrock' } + let(:capabilities) { class_double(RubyLLM::Providers::Bedrock::Capabilities) } + + before do + allow(capabilities).to receive_messages( + context_window_for: 4096, + max_tokens_for: 4096, + model_type: :chat, + model_family: :claude, + supports_vision?: false, + supports_functions?: false, + supports_json_mode?: false, + input_price_for: 0.0, + output_price_for: 0.0, + format_display_name: 'Test Model' + ) + end + + describe '.create_model_info' do + context 'when model supports INFERENCE_PROFILE only' do + let(:model_data) do + { + 'modelId' => 'anthropic.claude-3-7-sonnet-20250219-v1:0', + 'modelName' => 'Claude 3.7 Sonnet', + 'providerName' => 'Anthropic', + 'inferenceTypesSupported' => ['INFERENCE_PROFILE'], + 'inputModalities' => %w[TEXT IMAGE], + 'outputModalities' => ['TEXT'], + 'responseStreamingSupported' => true, + 'customizationsSupported' => [] + } + end + + it 'adds us. prefix to model ID' do + model_info = described_class.create_model_info(model_data, slug, capabilities) + expect(model_info.id).to eq('us.anthropic.claude-3-7-sonnet-20250219-v1:0') + end + end + + context 'when model supports ON_DEMAND' do + let(:model_data) do + { + 'modelId' => 'anthropic.claude-3-5-sonnet-20240620-v1:0', + 'modelName' => 'Claude 3.5 Sonnet', + 'providerName' => 'Anthropic', + 'inferenceTypesSupported' => ['ON_DEMAND'], + 'inputModalities' => %w[TEXT IMAGE], + 'outputModalities' => ['TEXT'], + 'responseStreamingSupported' => true, + 'customizationsSupported' => [] + } + end + + it 'does not add us. prefix to model ID' do + model_info = described_class.create_model_info(model_data, slug, capabilities) + expect(model_info.id).to eq('anthropic.claude-3-5-sonnet-20240620-v1:0') + end + end + + context 'when model supports both INFERENCE_PROFILE and ON_DEMAND' do + let(:model_data) do + { + 'modelId' => 'anthropic.claude-3-5-sonnet-20240620-v1:0', + 'modelName' => 'Claude 3.5 Sonnet', + 'providerName' => 'Anthropic', + 'inferenceTypesSupported' => %w[ON_DEMAND INFERENCE_PROFILE], + 'inputModalities' => %w[TEXT IMAGE], + 'outputModalities' => ['TEXT'], + 'responseStreamingSupported' => true, + 'customizationsSupported' => [] + } + end + + it 'does not add us. prefix to model ID' do + model_info = described_class.create_model_info(model_data, slug, capabilities) + expect(model_info.id).to eq('anthropic.claude-3-5-sonnet-20240620-v1:0') + end + end + + context 'when inferenceTypesSupported is nil' do + let(:model_data) do + { + 'modelId' => 'anthropic.claude-3-5-sonnet-20240620-v1:0', + 'modelName' => 'Claude 3.5 Sonnet', + 'providerName' => 'Anthropic', + 'inputModalities' => %w[TEXT IMAGE], + 'outputModalities' => ['TEXT'], + 'responseStreamingSupported' => true, + 'customizationsSupported' => [] + } + end + + it 'does not add us. prefix to model ID' do + model_info = described_class.create_model_info(model_data, slug, capabilities) + expect(model_info.id).to eq('anthropic.claude-3-5-sonnet-20240620-v1:0') + end + end + end +end