Skip to main content

codetether_agent/provider/bedrock/
estimates.rs

1//! Context-window and max-output-token estimates for Bedrock models.
2//!
3//! *Context-window* estimates delegate to the canonical
4//! [`crate::provider::limits::context_window_for_model`] so a single map
5//! covers all providers.  *Max-output* estimates are Bedrock-specific
6//! (they vary by inference-profile, not by model family) and live here.
7//!
8//! # Examples
9//!
10//! ```rust
11//! use codetether_agent::provider::bedrock::{estimate_context_window, estimate_max_output};
12//!
13//! assert_eq!(estimate_context_window("us.anthropic.claude-opus-4-7"), 1_000_000);
14//! assert_eq!(estimate_max_output("us.anthropic.claude-opus-4-7"), 128_000);
15//! assert_eq!(estimate_context_window("amazon.nova-lite-v1:0"), 300_000);
16//! ```
17
18/// Estimate context-window size (input+output combined) for a Bedrock model.
19///
20/// Delegates to [`crate::provider::limits::context_window_for_model`].
21///
22/// # Arguments
23///
24/// * `model_id` — Full or aliased Bedrock model identifier.
25///
26/// # Returns
27///
28/// Estimated token capacity; returns 128 000 for unknown families.
29///
30/// # Examples
31///
32/// ```rust
33/// use codetether_agent::provider::bedrock::estimate_context_window;
34/// assert_eq!(estimate_context_window("anthropic.claude-3-haiku-20240307-v1:0"), 200_000);
35/// assert_eq!(estimate_context_window("unknown.model"), 128_000);
36/// ```
37pub fn estimate_context_window(model_id: &str) -> usize {
38    crate::provider::limits::context_window_for_model(model_id)
39}
40
41/// Estimate max completion-output tokens for a Bedrock model.
42///
43/// # Arguments
44///
45/// * `model_id` — Full or aliased Bedrock model identifier.
46///
47/// # Returns
48///
49/// Estimated maximum completion size in tokens; 4_096 for unknown families.
50///
51/// # Examples
52///
53/// ```rust
54/// use codetether_agent::provider::bedrock::estimate_max_output;
55/// assert_eq!(estimate_max_output("us.anthropic.claude-sonnet-4-6-v1:0"), 128_000);
56/// assert_eq!(estimate_max_output("amazon.nova-pro-v1:0"), 5_000);
57/// ```
58pub fn estimate_max_output(model_id: &str) -> usize {
59    let id = model_id.to_lowercase();
60    if id.contains("claude-opus-4-7") {
61        128_000
62    } else if id.contains("claude-opus-4-6")
63        || id.contains("claude-opus-4-5")
64        || id.contains("claude-opus-4-1")
65        || id.contains("claude-opus-4")
66    {
67        32_000
68    } else if id.contains("claude-sonnet-4-6") {
69        128_000
70    } else if id.contains("claude-sonnet-4-5")
71        || id.contains("claude-sonnet-4")
72        || id.contains("claude-3-7")
73    {
74        64_000
75    } else if id.contains("claude-haiku-4-5") {
76        16_384
77    } else if id.contains("claude") {
78        8_192
79    } else if id.contains("nova") {
80        5_000
81    } else if id.contains("deepseek") || id.contains("llama4") || id.contains("mistral-large-3") {
82        16_384
83    } else if id.contains("llama") {
84        4_096
85    } else if id.contains("mistral")
86        || id.contains("mixtral")
87        || id.contains("qwen")
88        || id.contains("kimi")
89        || id.contains("glm")
90        || id.contains("minimax")
91        || id.contains("gemma")
92        || id.contains("cohere")
93        || id.contains("amazon")
94    {
95        8_192
96    } else {
97        4_096
98    }
99}