1- from rlm .clients .base_lm import BaseLM
2- from rlm .core .types import UsageSummary , ModelUsageSummary
3- from typing import Dict , Any , Optional , List
41from collections import defaultdict
2+ from typing import Any
3+
54import anthropic
65
6+ from rlm .clients .base_lm import BaseLM
7+ from rlm .core .types import ModelUsageSummary , UsageSummary
8+
79
810class AnthropicClient (BaseLM ):
911 """
@@ -13,7 +15,7 @@ class AnthropicClient(BaseLM):
1315 def __init__ (
1416 self ,
1517 api_key : str ,
16- model_name : Optional [ str ] = None ,
18+ model_name : str | None = None ,
1719 max_tokens : int = 32768 ,
1820 ** kwargs ,
1921 ):
@@ -24,14 +26,12 @@ def __init__(
2426 self .max_tokens = max_tokens
2527
2628 # Per-model usage tracking
27- self .model_call_counts : Dict [str , int ] = defaultdict (int )
28- self .model_input_tokens : Dict [str , int ] = defaultdict (int )
29- self .model_output_tokens : Dict [str , int ] = defaultdict (int )
30- self .model_total_tokens : Dict [str , int ] = defaultdict (int )
29+ self .model_call_counts : dict [str , int ] = defaultdict (int )
30+ self .model_input_tokens : dict [str , int ] = defaultdict (int )
31+ self .model_output_tokens : dict [str , int ] = defaultdict (int )
32+ self .model_total_tokens : dict [str , int ] = defaultdict (int )
3133
32- def completion (
33- self , prompt : str | List [Dict [str , Any ]], model : Optional [str ] = None
34- ) -> str :
34+ def completion (self , prompt : str | list [dict [str , Any ]], model : str | None = None ) -> str :
3535 messages , system = self ._prepare_messages (prompt )
3636
3737 model = model or self .model_name
@@ -47,7 +47,7 @@ def completion(
4747 return response .content [0 ].text
4848
4949 async def acompletion (
50- self , prompt : str | List [ Dict [str , Any ]], model : Optional [ str ] = None
50+ self , prompt : str | list [ dict [str , Any ]], model : str | None = None
5151 ) -> str :
5252 messages , system = self ._prepare_messages (prompt )
5353
@@ -64,16 +64,14 @@ async def acompletion(
6464 return response .content [0 ].text
6565
6666 def _prepare_messages (
67- self , prompt : str | List [ Dict [str , Any ]]
68- ) -> tuple [List [ Dict [str , Any ]], Optional [ str ] ]:
67+ self , prompt : str | list [ dict [str , Any ]]
68+ ) -> tuple [list [ dict [str , Any ]], str | None ]:
6969 """Prepare messages and extract system prompt for Anthropic API."""
7070 system = None
7171
7272 if isinstance (prompt , str ):
7373 messages = [{"role" : "user" , "content" : prompt }]
74- elif isinstance (prompt , list ) and all (
75- isinstance (item , dict ) for item in prompt
76- ):
74+ elif isinstance (prompt , list ) and all (isinstance (item , dict ) for item in prompt ):
7775 # Extract system message if present (Anthropic handles system separately)
7876 messages = []
7977 for msg in prompt :
@@ -90,9 +88,7 @@ def _track_cost(self, response: anthropic.types.Message, model: str):
9088 self .model_call_counts [model ] += 1
9189 self .model_input_tokens [model ] += response .usage .input_tokens
9290 self .model_output_tokens [model ] += response .usage .output_tokens
93- self .model_total_tokens [model ] += (
94- response .usage .input_tokens + response .usage .output_tokens
95- )
91+ self .model_total_tokens [model ] += response .usage .input_tokens + response .usage .output_tokens
9692
9793 # Track last call for handler to read
9894 self .last_prompt_tokens = response .usage .input_tokens
0 commit comments