66
77
88class ClaudeClient (BaseClient ):
9- def __init__ (self , api_key : str , api_url : str = "https://api.anthropic.com/v1/messages" , is_openrouter : bool = False ):
9+ def __init__ (self , api_key : str , api_url : str = "https://api.anthropic.com/v1/messages" , provider : str = "anthropic" ):
1010 """初始化 Claude 客户端
1111
1212 Args:
@@ -15,7 +15,7 @@ def __init__(self, api_key: str, api_url: str = "https://api.anthropic.com/v1/me
1515 is_openrouter: 是否使用 OpenRouter API
1616 """
1717 super ().__init__ (api_key , api_url )
18- self .is_openrouter = is_openrouter
18+ self .provider = provider
1919
2020 async def stream_chat (self , messages : list , model : str = "claude-3-5-sonnet-20241022" ) -> AsyncGenerator [tuple [str , str ], None ]:
2121 """流式对话
@@ -29,7 +29,8 @@ async def stream_chat(self, messages: list, model: str = "claude-3-5-sonnet-2024
2929 内容类型: "answer"
3030 内容: 实际的文本内容
3131 """
32- if self .is_openrouter :
32+
33+ if self .provider == "openrouter" :
3334 logger .info ("使用 OpenRouter API 作为 Claude 3.5 Sonnet 供应商 " )
3435 # 转换模型名称为 OpenRouter 格式
3536 model = "anthropic/claude-3.5-sonnet"
@@ -46,7 +47,19 @@ async def stream_chat(self, messages: list, model: str = "claude-3-5-sonnet-2024
4647 "messages" : messages ,
4748 "stream" : True
4849 }
49- else :
50+ elif self .provider == "oneapi" :
51+ logger .info ("使用 OneAPI API 作为 Claude 3.5 Sonnet 供应商 " )
52+ headers = {
53+ "Authorization" : f"Bearer { self .api_key } " ,
54+ "Content-Type" : "application/json"
55+ }
56+
57+ data = {
58+ "model" : model ,
59+ "messages" : messages ,
60+ "stream" : True
61+ }
62+ elif self .provider == "anthropic" :
5063 logger .info ("使用 Anthropic API 作为 Claude 3.5 Sonnet 供应商 " )
5164 headers = {
5265 "x-api-key" : self .api_key ,
@@ -61,6 +74,8 @@ async def stream_chat(self, messages: list, model: str = "claude-3-5-sonnet-2024
6174 "max_tokens" : 8192 ,
6275 "stream" : True
6376 }
77+ else :
78+ raise ValueError (f"不支持的Claude Provider: { self .provider } " )
6479
6580 async for chunk in self ._make_request (headers , data ):
6681 chunk_str = chunk .decode ('utf-8' )
@@ -75,16 +90,18 @@ async def stream_chat(self, messages: list, model: str = "claude-3-5-sonnet-2024
7590
7691 try :
7792 data = json .loads (json_str )
78- if self .is_openrouter :
79- # OpenRouter 格式
93+ if self .provider in ( "openrouter" , "oneapi" ) :
94+ # OpenRouter/OneApi 格式
8095 content = data .get ('choices' , [{}])[0 ].get ('delta' , {}).get ('content' , '' )
8196 if content :
8297 yield "answer" , content
83- else :
98+ elif self . provider == "anthropic" :
8499 # Anthropic 格式
85100 if data .get ('type' ) == 'content_block_delta' :
86101 content = data .get ('delta' , {}).get ('text' , '' )
87102 if content :
88103 yield "answer" , content
104+ else :
105+ raise ValueError (f"不支持的Claude Provider: { self .provider } " )
89106 except json .JSONDecodeError :
90107 continue
0 commit comments