vectorvein 0.1.27__tar.gz → 0.1.29__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {vectorvein-0.1.27 → vectorvein-0.1.29}/PKG-INFO +1 -1
  2. {vectorvein-0.1.27 → vectorvein-0.1.29}/pyproject.toml +1 -1
  3. vectorvein-0.1.29/src/vectorvein/chat_clients/__init__.py +522 -0
  4. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/openai_compatible_client.py +4 -4
  5. vectorvein-0.1.29/src/vectorvein/chat_clients/stepfun_client.py +15 -0
  6. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/utils.py +25 -0
  7. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/settings/__init__.py +3 -1
  8. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/types/defaults.py +95 -0
  9. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/types/enums.py +3 -0
  10. vectorvein-0.1.27/src/vectorvein/chat_clients/__init__.py +0 -130
  11. {vectorvein-0.1.27 → vectorvein-0.1.29}/README.md +0 -0
  12. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/__init__.py +0 -0
  13. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/anthropic_client.py +0 -0
  14. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/baichuan_client.py +0 -0
  15. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/base_client.py +0 -0
  16. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/deepseek_client.py +0 -0
  17. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/gemini_client.py +0 -0
  18. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/groq_client.py +0 -0
  19. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/local_client.py +0 -0
  20. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/minimax_client.py +0 -0
  21. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/mistral_client.py +0 -0
  22. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/moonshot_client.py +0 -0
  23. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/openai_client.py +0 -0
  24. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/qwen_client.py +0 -0
  25. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/yi_client.py +0 -0
  26. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/chat_clients/zhipuai_client.py +0 -0
  27. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/types/exception.py +0 -0
  28. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/types/llm_parameters.py +0 -0
  29. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/utilities/media_processing.py +0 -0
  30. {vectorvein-0.1.27 → vectorvein-0.1.29}/src/vectorvein/utilities/retry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vectorvein
3
- Version: 0.1.27
3
+ Version: 0.1.29
4
4
  Summary: Default template for PDM package
5
5
  Author-Email: Anderson <andersonby@163.com>
6
6
  License: MIT
@@ -16,7 +16,7 @@ description = "Default template for PDM package"
16
16
  name = "vectorvein"
17
17
  readme = "README.md"
18
18
  requires-python = ">=3.10"
19
- version = "0.1.27"
19
+ version = "0.1.29"
20
20
 
21
21
  [project.license]
22
22
  text = "MIT"
@@ -0,0 +1,522 @@
1
+ # @Author: Bi Ying
2
+ # @Date: 2024-07-26 14:48:55
3
+ import httpx
4
+ from typing import overload, Literal
5
+
6
+ from .base_client import BaseChatClient, BaseAsyncChatClient
7
+
8
+ from .yi_client import YiChatClient, AsyncYiChatClient
9
+ from .groq_client import GroqChatClient, AsyncGroqChatClient
10
+ from .qwen_client import QwenChatClient, AsyncQwenChatClient
11
+ from .local_client import LocalChatClient, AsyncLocalChatClient
12
+ from .gemini_client import GeminiChatClient, AsyncGeminiChatClient
13
+ from .openai_client import OpenAIChatClient, AsyncOpenAIChatClient
14
+ from .zhipuai_client import ZhiPuAIChatClient, AsyncZhiPuAIChatClient
15
+ from .minimax_client import MiniMaxChatClient, AsyncMiniMaxChatClient
16
+ from .mistral_client import MistralChatClient, AsyncMistralChatClient
17
+ from .stepfun_client import StepFunChatClient, AsyncStepFunChatClient
18
+ from .baichuan_client import BaichuanChatClient, AsyncBaichuanChatClient
19
+ from .moonshot_client import MoonshotChatClient, AsyncMoonshotChatClient
20
+ from .deepseek_client import DeepSeekChatClient, AsyncDeepSeekChatClient
21
+
22
+ from ..types import defaults as defs
23
+ from ..types.enums import BackendType, ContextLengthControlType
24
+ from .anthropic_client import AnthropicChatClient, AsyncAnthropicChatClient
25
+ from .utils import format_messages, get_token_counts, get_message_token_counts, ToolCallContentProcessor
26
+
27
+ # 后端映射
28
+ BackendMap = {
29
+ "sync": {
30
+ BackendType.Anthropic: AnthropicChatClient,
31
+ BackendType.DeepSeek: DeepSeekChatClient,
32
+ BackendType.Gemini: GeminiChatClient,
33
+ BackendType.Groq: GroqChatClient,
34
+ BackendType.Local: LocalChatClient,
35
+ BackendType.MiniMax: MiniMaxChatClient,
36
+ BackendType.Mistral: MistralChatClient,
37
+ BackendType.Moonshot: MoonshotChatClient,
38
+ BackendType.OpenAI: OpenAIChatClient,
39
+ BackendType.Qwen: QwenChatClient,
40
+ BackendType.Yi: YiChatClient,
41
+ BackendType.ZhiPuAI: ZhiPuAIChatClient,
42
+ BackendType.Baichuan: BaichuanChatClient,
43
+ BackendType.StepFun: StepFunChatClient,
44
+ },
45
+ "async": {
46
+ BackendType.Anthropic: AsyncAnthropicChatClient,
47
+ BackendType.DeepSeek: AsyncDeepSeekChatClient,
48
+ BackendType.Gemini: AsyncGeminiChatClient,
49
+ BackendType.Groq: AsyncGroqChatClient,
50
+ BackendType.Local: AsyncLocalChatClient,
51
+ BackendType.MiniMax: AsyncMiniMaxChatClient,
52
+ BackendType.Mistral: AsyncMistralChatClient,
53
+ BackendType.Moonshot: AsyncMoonshotChatClient,
54
+ BackendType.OpenAI: AsyncOpenAIChatClient,
55
+ BackendType.Qwen: AsyncQwenChatClient,
56
+ BackendType.Yi: AsyncYiChatClient,
57
+ BackendType.ZhiPuAI: AsyncZhiPuAIChatClient,
58
+ BackendType.Baichuan: AsyncBaichuanChatClient,
59
+ BackendType.StepFun: AsyncStepFunChatClient,
60
+ },
61
+ }
62
+
63
+
64
+ @overload
65
+ def create_chat_client(
66
+ backend: Literal[BackendType.Anthropic],
67
+ model: str | None = None,
68
+ stream: bool = False,
69
+ temperature: float = 0.7,
70
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
71
+ random_endpoint: bool = True,
72
+ endpoint_id: str = "",
73
+ http_client: httpx.Client | None = None,
74
+ **kwargs,
75
+ ) -> AnthropicChatClient: ...
76
+
77
+
78
+ @overload
79
+ def create_chat_client(
80
+ backend: Literal[BackendType.DeepSeek],
81
+ model: str | None = None,
82
+ stream: bool = False,
83
+ temperature: float = 0.7,
84
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
85
+ random_endpoint: bool = True,
86
+ endpoint_id: str = "",
87
+ http_client: httpx.Client | None = None,
88
+ **kwargs,
89
+ ) -> DeepSeekChatClient: ...
90
+
91
+
92
+ @overload
93
+ def create_chat_client(
94
+ backend: Literal[BackendType.Gemini],
95
+ model: str | None = None,
96
+ stream: bool = False,
97
+ temperature: float = 0.7,
98
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
99
+ random_endpoint: bool = True,
100
+ endpoint_id: str = "",
101
+ http_client: httpx.Client | None = None,
102
+ **kwargs,
103
+ ) -> GeminiChatClient: ...
104
+
105
+
106
+ @overload
107
+ def create_chat_client(
108
+ backend: Literal[BackendType.Groq],
109
+ model: str | None = None,
110
+ stream: bool = False,
111
+ temperature: float = 0.7,
112
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
113
+ random_endpoint: bool = True,
114
+ endpoint_id: str = "",
115
+ http_client: httpx.Client | None = None,
116
+ **kwargs,
117
+ ) -> GroqChatClient: ...
118
+
119
+
120
+ @overload
121
+ def create_chat_client(
122
+ backend: Literal[BackendType.Local],
123
+ model: str | None = None,
124
+ stream: bool = False,
125
+ temperature: float = 0.7,
126
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
127
+ random_endpoint: bool = True,
128
+ endpoint_id: str = "",
129
+ http_client: httpx.Client | None = None,
130
+ **kwargs,
131
+ ) -> LocalChatClient: ...
132
+
133
+
134
+ @overload
135
+ def create_chat_client(
136
+ backend: Literal[BackendType.MiniMax],
137
+ model: str | None = None,
138
+ stream: bool = False,
139
+ temperature: float = 0.7,
140
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
141
+ random_endpoint: bool = True,
142
+ endpoint_id: str = "",
143
+ http_client: httpx.Client | None = None,
144
+ **kwargs,
145
+ ) -> MiniMaxChatClient: ...
146
+
147
+
148
+ @overload
149
+ def create_chat_client(
150
+ backend: Literal[BackendType.Mistral],
151
+ model: str | None = None,
152
+ stream: bool = False,
153
+ temperature: float = 0.7,
154
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
155
+ random_endpoint: bool = True,
156
+ endpoint_id: str = "",
157
+ http_client: httpx.Client | None = None,
158
+ **kwargs,
159
+ ) -> MistralChatClient: ...
160
+
161
+
162
+ @overload
163
+ def create_chat_client(
164
+ backend: Literal[BackendType.Moonshot],
165
+ model: str | None = None,
166
+ stream: bool = False,
167
+ temperature: float = 0.7,
168
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
169
+ random_endpoint: bool = True,
170
+ endpoint_id: str = "",
171
+ http_client: httpx.Client | None = None,
172
+ **kwargs,
173
+ ) -> MoonshotChatClient: ...
174
+
175
+
176
+ @overload
177
+ def create_chat_client(
178
+ backend: Literal[BackendType.OpenAI],
179
+ model: str | None = None,
180
+ stream: bool = False,
181
+ temperature: float = 0.7,
182
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
183
+ random_endpoint: bool = True,
184
+ endpoint_id: str = "",
185
+ http_client: httpx.Client | None = None,
186
+ **kwargs,
187
+ ) -> OpenAIChatClient: ...
188
+
189
+
190
+ @overload
191
+ def create_chat_client(
192
+ backend: Literal[BackendType.Qwen],
193
+ model: str | None = None,
194
+ stream: bool = False,
195
+ temperature: float = 0.7,
196
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
197
+ random_endpoint: bool = True,
198
+ endpoint_id: str = "",
199
+ http_client: httpx.Client | None = None,
200
+ **kwargs,
201
+ ) -> QwenChatClient: ...
202
+
203
+
204
+ @overload
205
+ def create_chat_client(
206
+ backend: Literal[BackendType.Yi],
207
+ model: str | None = None,
208
+ stream: bool = False,
209
+ temperature: float = 0.7,
210
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
211
+ random_endpoint: bool = True,
212
+ endpoint_id: str = "",
213
+ http_client: httpx.Client | None = None,
214
+ **kwargs,
215
+ ) -> YiChatClient: ...
216
+
217
+
218
+ @overload
219
+ def create_chat_client(
220
+ backend: Literal[BackendType.ZhiPuAI],
221
+ model: str | None = None,
222
+ stream: bool = False,
223
+ temperature: float = 0.7,
224
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
225
+ random_endpoint: bool = True,
226
+ endpoint_id: str = "",
227
+ http_client: httpx.Client | None = None,
228
+ **kwargs,
229
+ ) -> ZhiPuAIChatClient: ...
230
+
231
+
232
+ @overload
233
+ def create_chat_client(
234
+ backend: Literal[BackendType.Baichuan],
235
+ model: str | None = None,
236
+ stream: bool = False,
237
+ temperature: float = 0.7,
238
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
239
+ random_endpoint: bool = True,
240
+ endpoint_id: str = "",
241
+ http_client: httpx.Client | None = None,
242
+ **kwargs,
243
+ ) -> BaichuanChatClient: ...
244
+
245
+
246
+ @overload
247
+ def create_chat_client(
248
+ backend: Literal[BackendType.StepFun],
249
+ model: str | None = None,
250
+ stream: bool = False,
251
+ temperature: float = 0.7,
252
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
253
+ random_endpoint: bool = True,
254
+ endpoint_id: str = "",
255
+ http_client: httpx.Client | None = None,
256
+ **kwargs,
257
+ ) -> StepFunChatClient: ...
258
+
259
+
260
+ def create_chat_client(
261
+ backend: BackendType,
262
+ model: str | None = None,
263
+ stream: bool = False,
264
+ temperature: float = 0.7,
265
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
266
+ random_endpoint: bool = True,
267
+ endpoint_id: str = "",
268
+ http_client: httpx.Client | None = None,
269
+ **kwargs,
270
+ ) -> BaseChatClient:
271
+ if backend not in BackendMap["sync"]:
272
+ raise ValueError(f"Unsupported backend: {backend}")
273
+
274
+ ClientClass = BackendMap["sync"][backend]
275
+ if model is None:
276
+ model = ClientClass.DEFAULT_MODEL
277
+ return ClientClass(
278
+ model=model,
279
+ stream=stream,
280
+ temperature=temperature,
281
+ context_length_control=context_length_control,
282
+ random_endpoint=random_endpoint,
283
+ endpoint_id=endpoint_id,
284
+ http_client=http_client,
285
+ **kwargs,
286
+ )
287
+
288
+
289
+ @overload
290
+ def create_async_chat_client(
291
+ backend: Literal[BackendType.Anthropic],
292
+ model: str | None = None,
293
+ stream: bool = False,
294
+ temperature: float = 0.7,
295
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
296
+ random_endpoint: bool = True,
297
+ endpoint_id: str = "",
298
+ http_client: httpx.AsyncClient | None = None,
299
+ **kwargs,
300
+ ) -> AsyncAnthropicChatClient: ...
301
+
302
+
303
+ @overload
304
+ def create_async_chat_client(
305
+ backend: Literal[BackendType.DeepSeek],
306
+ model: str | None = None,
307
+ stream: bool = False,
308
+ temperature: float = 0.7,
309
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
310
+ random_endpoint: bool = True,
311
+ endpoint_id: str = "",
312
+ http_client: httpx.AsyncClient | None = None,
313
+ **kwargs,
314
+ ) -> AsyncDeepSeekChatClient: ...
315
+
316
+
317
+ @overload
318
+ def create_async_chat_client(
319
+ backend: Literal[BackendType.Gemini],
320
+ model: str | None = None,
321
+ stream: bool = False,
322
+ temperature: float = 0.7,
323
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
324
+ random_endpoint: bool = True,
325
+ endpoint_id: str = "",
326
+ http_client: httpx.AsyncClient | None = None,
327
+ **kwargs,
328
+ ) -> AsyncGeminiChatClient: ...
329
+
330
+
331
+ @overload
332
+ def create_async_chat_client(
333
+ backend: Literal[BackendType.Groq],
334
+ model: str | None = None,
335
+ stream: bool = False,
336
+ temperature: float = 0.7,
337
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
338
+ random_endpoint: bool = True,
339
+ endpoint_id: str = "",
340
+ http_client: httpx.AsyncClient | None = None,
341
+ **kwargs,
342
+ ) -> AsyncGroqChatClient: ...
343
+
344
+
345
+ @overload
346
+ def create_async_chat_client(
347
+ backend: Literal[BackendType.Local],
348
+ model: str | None = None,
349
+ stream: bool = False,
350
+ temperature: float = 0.7,
351
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
352
+ random_endpoint: bool = True,
353
+ endpoint_id: str = "",
354
+ http_client: httpx.AsyncClient | None = None,
355
+ **kwargs,
356
+ ) -> AsyncLocalChatClient: ...
357
+
358
+
359
+ @overload
360
+ def create_async_chat_client(
361
+ backend: Literal[BackendType.MiniMax],
362
+ model: str | None = None,
363
+ stream: bool = False,
364
+ temperature: float = 0.7,
365
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
366
+ random_endpoint: bool = True,
367
+ endpoint_id: str = "",
368
+ http_client: httpx.AsyncClient | None = None,
369
+ **kwargs,
370
+ ) -> AsyncMiniMaxChatClient: ...
371
+
372
+
373
+ @overload
374
+ def create_async_chat_client(
375
+ backend: Literal[BackendType.Mistral],
376
+ model: str | None = None,
377
+ stream: bool = False,
378
+ temperature: float = 0.7,
379
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
380
+ random_endpoint: bool = True,
381
+ endpoint_id: str = "",
382
+ http_client: httpx.AsyncClient | None = None,
383
+ **kwargs,
384
+ ) -> AsyncMistralChatClient: ...
385
+
386
+
387
+ @overload
388
+ def create_async_chat_client(
389
+ backend: Literal[BackendType.Moonshot],
390
+ model: str | None = None,
391
+ stream: bool = False,
392
+ temperature: float = 0.7,
393
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
394
+ random_endpoint: bool = True,
395
+ endpoint_id: str = "",
396
+ http_client: httpx.AsyncClient | None = None,
397
+ **kwargs,
398
+ ) -> AsyncMoonshotChatClient: ...
399
+
400
+
401
+ @overload
402
+ def create_async_chat_client(
403
+ backend: Literal[BackendType.OpenAI],
404
+ model: str | None = None,
405
+ stream: bool = False,
406
+ temperature: float = 0.7,
407
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
408
+ random_endpoint: bool = True,
409
+ endpoint_id: str = "",
410
+ http_client: httpx.AsyncClient | None = None,
411
+ **kwargs,
412
+ ) -> AsyncOpenAIChatClient: ...
413
+
414
+
415
+ @overload
416
+ def create_async_chat_client(
417
+ backend: Literal[BackendType.Qwen],
418
+ model: str | None = None,
419
+ stream: bool = False,
420
+ temperature: float = 0.7,
421
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
422
+ random_endpoint: bool = True,
423
+ endpoint_id: str = "",
424
+ http_client: httpx.AsyncClient | None = None,
425
+ **kwargs,
426
+ ) -> AsyncQwenChatClient: ...
427
+
428
+
429
+ @overload
430
+ def create_async_chat_client(
431
+ backend: Literal[BackendType.Yi],
432
+ model: str | None = None,
433
+ stream: bool = False,
434
+ temperature: float = 0.7,
435
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
436
+ random_endpoint: bool = True,
437
+ endpoint_id: str = "",
438
+ http_client: httpx.AsyncClient | None = None,
439
+ **kwargs,
440
+ ) -> AsyncYiChatClient: ...
441
+
442
+
443
+ @overload
444
+ def create_async_chat_client(
445
+ backend: Literal[BackendType.ZhiPuAI],
446
+ model: str | None = None,
447
+ stream: bool = False,
448
+ temperature: float = 0.7,
449
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
450
+ random_endpoint: bool = True,
451
+ endpoint_id: str = "",
452
+ http_client: httpx.AsyncClient | None = None,
453
+ **kwargs,
454
+ ) -> AsyncZhiPuAIChatClient: ...
455
+
456
+
457
+ @overload
458
+ def create_async_chat_client(
459
+ backend: Literal[BackendType.Baichuan],
460
+ model: str | None = None,
461
+ stream: bool = False,
462
+ temperature: float = 0.7,
463
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
464
+ random_endpoint: bool = True,
465
+ endpoint_id: str = "",
466
+ http_client: httpx.AsyncClient | None = None,
467
+ **kwargs,
468
+ ) -> AsyncBaichuanChatClient: ...
469
+
470
+
471
+ @overload
472
+ def create_async_chat_client(
473
+ backend: Literal[BackendType.StepFun],
474
+ model: str | None = None,
475
+ stream: bool = False,
476
+ temperature: float = 0.7,
477
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
478
+ random_endpoint: bool = True,
479
+ endpoint_id: str = "",
480
+ http_client: httpx.AsyncClient | None = None,
481
+ **kwargs,
482
+ ) -> AsyncStepFunChatClient: ...
483
+
484
+
485
+ def create_async_chat_client(
486
+ backend: BackendType,
487
+ model: str | None = None,
488
+ stream: bool = False,
489
+ temperature: float = 0.7,
490
+ context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
491
+ random_endpoint: bool = True,
492
+ endpoint_id: str = "",
493
+ http_client: httpx.AsyncClient | None = None,
494
+ **kwargs,
495
+ ) -> BaseAsyncChatClient:
496
+ if backend not in BackendMap["async"]:
497
+ raise ValueError(f"Unsupported backend: {backend}")
498
+
499
+ ClientClass = BackendMap["async"][backend]
500
+ if model is None:
501
+ model = ClientClass.DEFAULT_MODEL
502
+ return ClientClass(
503
+ model=model,
504
+ stream=stream,
505
+ temperature=temperature,
506
+ context_length_control=context_length_control,
507
+ random_endpoint=random_endpoint,
508
+ endpoint_id=endpoint_id,
509
+ http_client=http_client,
510
+ **kwargs,
511
+ )
512
+
513
+
514
+ __all__ = [
515
+ "BackendType",
516
+ "format_messages",
517
+ "get_token_counts",
518
+ "create_chat_client",
519
+ "create_async_chat_client",
520
+ "get_message_token_counts",
521
+ "ToolCallContentProcessor",
522
+ ]
@@ -169,10 +169,10 @@ class OpenAICompatibleChatClient(BaseChatClient):
169
169
  max_output_tokens = self.model_setting.max_output_tokens
170
170
  token_counts = get_message_token_counts(messages=messages, tools=tools, model=self.model_setting.id)
171
171
  if max_output_tokens is not None:
172
- max_tokens = self.model_setting.context_length - token_counts
172
+ max_tokens = self.model_setting.context_length - token_counts - 64
173
173
  max_tokens = min(max(max_tokens, 1), max_output_tokens)
174
174
  else:
175
- max_tokens = self.model_setting.context_length - token_counts
175
+ max_tokens = self.model_setting.context_length - token_counts - 64
176
176
 
177
177
  if response_format and self.model_setting.response_format_available:
178
178
  self.response_format = {"response_format": response_format}
@@ -396,10 +396,10 @@ class AsyncOpenAICompatibleChatClient(BaseAsyncChatClient):
396
396
  max_output_tokens = self.model_setting.max_output_tokens
397
397
  token_counts = get_message_token_counts(messages=messages, tools=tools, model=self.model_setting.id)
398
398
  if max_output_tokens is not None:
399
- max_tokens = self.model_setting.context_length - token_counts
399
+ max_tokens = self.model_setting.context_length - token_counts - 64
400
400
  max_tokens = min(max(max_tokens, 1), max_output_tokens)
401
401
  else:
402
- max_tokens = self.model_setting.context_length - token_counts
402
+ max_tokens = self.model_setting.context_length - token_counts - 64
403
403
 
404
404
  if self.stream:
405
405
  stream_response: AsyncStream[ChatCompletionChunk] = await self.raw_client.chat.completions.create(
@@ -0,0 +1,15 @@
1
+ # @Author: Bi Ying
2
+ # @Date: 2024-07-26 14:48:55
3
+ from ..types.enums import BackendType
4
+ from ..types.defaults import STEPFUN_DEFAULT_MODEL
5
+ from .openai_compatible_client import OpenAICompatibleChatClient, AsyncOpenAICompatibleChatClient
6
+
7
+
8
+ class StepFunChatClient(OpenAICompatibleChatClient):
9
+ DEFAULT_MODEL = STEPFUN_DEFAULT_MODEL
10
+ BACKEND_NAME = BackendType.StepFun
11
+
12
+
13
+ class AsyncStepFunChatClient(AsyncOpenAICompatibleChatClient):
14
+ DEFAULT_MODEL = STEPFUN_DEFAULT_MODEL
15
+ BACKEND_NAME = BackendType.StepFun
@@ -195,6 +195,31 @@ def get_token_counts(text: str | dict, model: str = "") -> int:
195
195
  return len(deepseek_tokenizer.encode(text))
196
196
  elif model.startswith("qwen"):
197
197
  return len(qwen_tokenizer.encode(text))
198
+ elif model.startswith("stepfun"):
199
+ model_setting = settings.moonshot.models[model]
200
+ if len(model_setting.endpoints) == 0:
201
+ return len(chatgpt_encoding.encode(text))
202
+ endpoint_id = model_setting.endpoints[0]
203
+ endpoint = settings.get_endpoint(endpoint_id)
204
+ tokenize_url = "https://api.stepfun.com/v1/token/count"
205
+ headers = {"Content-Type": "application/json", "Authorization": f"Bearer {endpoint.api_key}"}
206
+ request_body = {
207
+ "model": model,
208
+ "messages": [
209
+ {"role": "user", "content": text},
210
+ ],
211
+ }
212
+ _, response = (
213
+ Retry(httpx.post)
214
+ .args(url=tokenize_url, headers=headers, json=request_body, timeout=None)
215
+ .retry_times(5)
216
+ .sleep_time(10)
217
+ .run()
218
+ )
219
+ if response is None:
220
+ return 1000
221
+ result = response.json()
222
+ return result["data"]["total_tokens"]
198
223
  else:
199
224
  return len(chatgpt_encoding.encode(text))
200
225
 
@@ -27,6 +27,7 @@ class Settings(BaseModel):
27
27
  yi: BackendSettings = Field(default_factory=BackendSettings, description="Yi models settings.")
28
28
  zhipuai: BackendSettings = Field(default_factory=BackendSettings, description="Zhipuai models settings.")
29
29
  baichuan: BackendSettings = Field(default_factory=BackendSettings, description="Baichuan models settings.")
30
+ stepfun: BackendSettings = Field(default_factory=BackendSettings, description="StepFun models settings.")
30
31
 
31
32
  def __init__(self, **data):
32
33
  model_types = {
@@ -43,6 +44,7 @@ class Settings(BaseModel):
43
44
  "yi": defs.YI_MODELS,
44
45
  "zhipuai": defs.ZHIPUAI_MODELS,
45
46
  "baichuan": defs.BAICHUAN_MODELS,
47
+ "stepfun": defs.STEPFUN_MODELS,
46
48
  }
47
49
 
48
50
  for model_type, default_models in model_types.items():
@@ -62,7 +64,7 @@ class Settings(BaseModel):
62
64
  for endpoint in self.endpoints:
63
65
  if endpoint.id == endpoint_id:
64
66
  return endpoint
65
- return EndpointSetting()
67
+ raise ValueError(f"Endpoint {endpoint_id} not found.")
66
68
 
67
69
  def get_backend(self, backend: BackendType) -> BackendSettings:
68
70
  return getattr(self, backend.value.lower())
@@ -588,3 +588,98 @@ GEMINI_MODELS = {
588
588
  "native_multimodal": True,
589
589
  },
590
590
  }
591
+
592
+ # 百度文心一言 ERNIE 模型
593
+ ERNIE_DEFAULT_MODEL = "ernie-lite"
594
+ ERNIE_MODELS = {
595
+ "ernie-lite": {
596
+ "id": "ernie-lite",
597
+ "context_length": 6144,
598
+ "max_output_tokens": 2048,
599
+ "function_call_available": False,
600
+ "response_format_available": False,
601
+ },
602
+ "ernie-speed": {
603
+ "id": "ernie-speed",
604
+ "context_length": 126976,
605
+ "max_output_tokens": 4096,
606
+ "function_call_available": False,
607
+ "response_format_available": False,
608
+ },
609
+ "ernie-speed-pro-128k": {
610
+ "id": "ernie-speed-pro-128k",
611
+ "context_length": 126976,
612
+ "max_output_tokens": 4096,
613
+ "function_call_available": False,
614
+ "response_format_available": False,
615
+ },
616
+ "ernie-4.0-8k-latest": {
617
+ "id": "ernie-4.0-8k-latest",
618
+ "context_length": 5120,
619
+ "max_output_tokens": 2048,
620
+ "function_call_available": False,
621
+ "response_format_available": True,
622
+ },
623
+ "ernie-4.0-turbo-8k": {
624
+ "id": "ernie-4.0-turbo-8k",
625
+ "context_length": 5120,
626
+ "max_output_tokens": 2048,
627
+ "function_call_available": False,
628
+ "response_format_available": True,
629
+ },
630
+ }
631
+
632
+
633
+ STEPFUN_DEFAULT_MODEL = "step-1-8k"
634
+ STEPFUN_MODELS = {
635
+ "step-1-8k": {
636
+ "id": "step-1-8k",
637
+ "context_length": 8192,
638
+ "function_call_available": True,
639
+ "response_format_available": True,
640
+ },
641
+ "step-1-32k": {
642
+ "id": "step-1-32k",
643
+ "context_length": 32000,
644
+ "function_call_available": True,
645
+ "response_format_available": True,
646
+ },
647
+ "step-1-128k": {
648
+ "id": "step-1-128k",
649
+ "context_length": 128000,
650
+ "function_call_available": True,
651
+ "response_format_available": True,
652
+ },
653
+ "step-1-256k": {
654
+ "id": "step-1-256k",
655
+ "context_length": 256000,
656
+ "function_call_available": True,
657
+ "response_format_available": True,
658
+ },
659
+ "step-2-16k": {
660
+ "id": "step-2-16k",
661
+ "context_length": 16384,
662
+ "function_call_available": True,
663
+ "response_format_available": True,
664
+ },
665
+ "step-1-flash": {
666
+ "id": "step-1-flash",
667
+ "context_length": 8192,
668
+ "function_call_available": True,
669
+ "response_format_available": True,
670
+ },
671
+ "step-1v-8k": {
672
+ "id": "step-1v-8k",
673
+ "context_length": 8192,
674
+ "function_call_available": False,
675
+ "response_format_available": False,
676
+ "native_multimodal": True,
677
+ },
678
+ "step-1v-32k": {
679
+ "id": "step-1v-32k",
680
+ "context_length": 32768,
681
+ "function_call_available": False,
682
+ "response_format_available": False,
683
+ "native_multimodal": True,
684
+ },
685
+ }
@@ -47,6 +47,9 @@ class BackendType(str, Enum):
47
47
  # Baichuan
48
48
  Baichuan = "baichuan"
49
49
 
50
+ # StepFun
51
+ StepFun = "stepfun"
52
+
50
53
  def __repr__(self):
51
54
  """Get a string representation."""
52
55
  return f'"{self.value}"'
@@ -1,130 +0,0 @@
1
- # @Author: Bi Ying
2
- # @Date: 2024-07-26 14:48:55
3
- import httpx
4
-
5
- from .base_client import BaseChatClient, BaseAsyncChatClient
6
-
7
- from .yi_client import YiChatClient, AsyncYiChatClient
8
- from .groq_client import GroqChatClient, AsyncGroqChatClient
9
- from .qwen_client import QwenChatClient, AsyncQwenChatClient
10
- from .local_client import LocalChatClient, AsyncLocalChatClient
11
- from .gemini_client import GeminiChatClient, AsyncGeminiChatClient
12
- from .openai_client import OpenAIChatClient, AsyncOpenAIChatClient
13
- from .zhipuai_client import ZhiPuAIChatClient, AsyncZhiPuAIChatClient
14
- from .minimax_client import MiniMaxChatClient, AsyncMiniMaxChatClient
15
- from .mistral_client import MistralChatClient, AsyncMistralChatClient
16
- from .baichuan_client import BaichuanChatClient, AsyncBaichuanChatClient
17
- from .moonshot_client import MoonshotChatClient, AsyncMoonshotChatClient
18
- from .deepseek_client import DeepSeekChatClient, AsyncDeepSeekChatClient
19
-
20
- from ..types import defaults as defs
21
- from ..types.enums import BackendType, ContextLengthControlType
22
- from .anthropic_client import AnthropicChatClient, AsyncAnthropicChatClient
23
- from .utils import format_messages, get_token_counts, get_message_token_counts, ToolCallContentProcessor
24
-
25
-
26
- BackendMap = {
27
- "sync": {
28
- BackendType.Anthropic: AnthropicChatClient,
29
- BackendType.DeepSeek: DeepSeekChatClient,
30
- BackendType.Gemini: GeminiChatClient,
31
- BackendType.Groq: GroqChatClient,
32
- BackendType.Local: LocalChatClient,
33
- BackendType.MiniMax: MiniMaxChatClient,
34
- BackendType.Mistral: MistralChatClient,
35
- BackendType.Moonshot: MoonshotChatClient,
36
- BackendType.OpenAI: OpenAIChatClient,
37
- BackendType.Qwen: QwenChatClient,
38
- BackendType.Yi: YiChatClient,
39
- BackendType.ZhiPuAI: ZhiPuAIChatClient,
40
- BackendType.Baichuan: BaichuanChatClient,
41
- },
42
- "async": {
43
- BackendType.Anthropic: AsyncAnthropicChatClient,
44
- BackendType.DeepSeek: AsyncDeepSeekChatClient,
45
- BackendType.Gemini: AsyncGeminiChatClient,
46
- BackendType.Groq: AsyncGroqChatClient,
47
- BackendType.Local: AsyncLocalChatClient,
48
- BackendType.MiniMax: AsyncMiniMaxChatClient,
49
- BackendType.Mistral: AsyncMistralChatClient,
50
- BackendType.Moonshot: AsyncMoonshotChatClient,
51
- BackendType.OpenAI: AsyncOpenAIChatClient,
52
- BackendType.Qwen: AsyncQwenChatClient,
53
- BackendType.Yi: AsyncYiChatClient,
54
- BackendType.ZhiPuAI: AsyncZhiPuAIChatClient,
55
- BackendType.Baichuan: AsyncBaichuanChatClient,
56
- },
57
- }
58
-
59
-
60
- def create_chat_client(
61
- backend: BackendType,
62
- model: str | None = None,
63
- stream: bool = False,
64
- temperature: float = 0.7,
65
- context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
66
- random_endpoint: bool = True,
67
- endpoint_id: str = "",
68
- http_client: httpx.Client | None = None,
69
- **kwargs,
70
- ) -> BaseChatClient:
71
- if backend.lower() not in BackendMap["sync"]:
72
- raise ValueError(f"Unsupported backend: {backend}")
73
- else:
74
- backend_key = backend.lower()
75
-
76
- ClientClass = BackendMap["sync"][backend_key]
77
- if model is None:
78
- model = ClientClass.DEFAULT_MODEL
79
- return BackendMap["sync"][backend_key](
80
- model=model,
81
- stream=stream,
82
- temperature=temperature,
83
- context_length_control=context_length_control,
84
- random_endpoint=random_endpoint,
85
- endpoint_id=endpoint_id,
86
- http_client=http_client,
87
- **kwargs,
88
- )
89
-
90
-
91
- def create_async_chat_client(
92
- backend: BackendType,
93
- model: str | None = None,
94
- stream: bool = False,
95
- temperature: float = 0.7,
96
- context_length_control: ContextLengthControlType = defs.CONTEXT_LENGTH_CONTROL,
97
- random_endpoint: bool = True,
98
- endpoint_id: str = "",
99
- http_client: httpx.AsyncClient | None = None,
100
- **kwargs,
101
- ) -> BaseAsyncChatClient:
102
- if backend.lower() not in BackendMap["async"]:
103
- raise ValueError(f"Unsupported backend: {backend}")
104
- else:
105
- backend_key = backend.lower()
106
-
107
- ClientClass = BackendMap["async"][backend_key]
108
- if model is None:
109
- model = ClientClass.DEFAULT_MODEL
110
- return BackendMap["async"][backend_key](
111
- model=model,
112
- stream=stream,
113
- temperature=temperature,
114
- context_length_control=context_length_control,
115
- random_endpoint=random_endpoint,
116
- endpoint_id=endpoint_id,
117
- http_client=http_client,
118
- **kwargs,
119
- )
120
-
121
-
122
- __all__ = [
123
- "BackendType",
124
- "format_messages",
125
- "get_token_counts",
126
- "create_chat_client",
127
- "create_async_chat_client",
128
- "get_message_token_counts",
129
- "ToolCallContentProcessor",
130
- ]
File without changes