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}