tamar-model-client 0.1.0__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 (24) hide show
  1. tamar_model_client-0.1.0/PKG-INFO +573 -0
  2. tamar_model_client-0.1.0/README.md +540 -0
  3. tamar_model_client-0.1.0/model_manager_client/__init__.py +11 -0
  4. tamar_model_client-0.1.0/model_manager_client/async_client.py +419 -0
  5. tamar_model_client-0.1.0/model_manager_client/auth.py +14 -0
  6. tamar_model_client-0.1.0/model_manager_client/enums/__init__.py +8 -0
  7. tamar_model_client-0.1.0/model_manager_client/enums/channel.py +11 -0
  8. tamar_model_client-0.1.0/model_manager_client/enums/invoke.py +10 -0
  9. tamar_model_client-0.1.0/model_manager_client/enums/providers.py +8 -0
  10. tamar_model_client-0.1.0/model_manager_client/exceptions.py +11 -0
  11. tamar_model_client-0.1.0/model_manager_client/generated/__init__.py +0 -0
  12. tamar_model_client-0.1.0/model_manager_client/generated/model_service_pb2.py +45 -0
  13. tamar_model_client-0.1.0/model_manager_client/generated/model_service_pb2_grpc.py +145 -0
  14. tamar_model_client-0.1.0/model_manager_client/schemas/__init__.py +17 -0
  15. tamar_model_client-0.1.0/model_manager_client/schemas/inputs.py +294 -0
  16. tamar_model_client-0.1.0/model_manager_client/schemas/outputs.py +24 -0
  17. tamar_model_client-0.1.0/model_manager_client/sync_client.py +111 -0
  18. tamar_model_client-0.1.0/setup.cfg +4 -0
  19. tamar_model_client-0.1.0/setup.py +36 -0
  20. tamar_model_client-0.1.0/tamar_model_client.egg-info/PKG-INFO +573 -0
  21. tamar_model_client-0.1.0/tamar_model_client.egg-info/SOURCES.txt +22 -0
  22. tamar_model_client-0.1.0/tamar_model_client.egg-info/dependency_links.txt +1 -0
  23. tamar_model_client-0.1.0/tamar_model_client.egg-info/requires.txt +7 -0
  24. tamar_model_client-0.1.0/tamar_model_client.egg-info/top_level.txt +1 -0
@@ -0,0 +1,573 @@
1
+ Metadata-Version: 2.4
2
+ Name: tamar-model-client
3
+ Version: 0.1.0
4
+ Summary: A Python SDK for interacting with the Model Manager gRPC service
5
+ Home-page: http://gitlab.tamaredge.top/project-tap/AgentOS/model-manager-client
6
+ Author: Oscar Ou
7
+ Author-email: oscar.ou@tamaredge.ai
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.8
10
+ Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Requires-Python: >=3.8
16
+ Description-Content-Type: text/markdown
17
+ Requires-Dist: grpcio
18
+ Requires-Dist: grpcio-tools
19
+ Requires-Dist: pydantic
20
+ Requires-Dist: PyJWT
21
+ Requires-Dist: nest_asyncio
22
+ Requires-Dist: openai
23
+ Requires-Dist: google-genai
24
+ Dynamic: author
25
+ Dynamic: author-email
26
+ Dynamic: classifier
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: requires-dist
31
+ Dynamic: requires-python
32
+ Dynamic: summary
33
+
34
+ # Model Manager Client
35
+
36
+ **Model Manager Client** 是一款高性能的 Python SDK,用于连接 Model Manager gRPC 服务,统一调用多家第三方 AI
37
+ 模型服务商(如OpenAI、Google、Azure OpenAI)。
38
+
39
+ ## ✨ 特性亮点
40
+
41
+ - 🧩 支持 **同步** / **异步**调用,**流式** / **非流式** 响应
42
+ - ⚡ 统一封装 **OpenAI** / **Google** / **Azure OpenAI**,并兼容 **官方SDK** 调用标准
43
+ - 🔗 **gRPC** 高效通信,内置 **JWT** 认证、重试机制
44
+ - 🛡️ **类型安全校验**(基于 Pydantic v2)
45
+ - 📚 **完整异常处理**,API 简单直观,支持批量调用
46
+
47
+ ## 📋 安装
48
+
49
+ ```bash
50
+ pip install model-manager-client
51
+ ```
52
+
53
+ 支持环境:
54
+
55
+ - Python ≥ 3.8
56
+ - Windows / Linux / macOS
57
+
58
+ ## 🏗️ 项目结构概览
59
+
60
+ ```
61
+ model_manager_client/
62
+ ├── generated/ # gRPC 生成的代码
63
+ │ ├── model_service.proto # 协议定义文件
64
+ │ ├── model_service_pb2.py # 生成的 protobuf 代码
65
+ │ └── model_service_pb2_grpc.py # 生成的 gRPC 代码
66
+ ├── schemas/ # 数据模型定义
67
+ │ ├── inputs.py # 输入模型定义
68
+ │ └── outputs.py # 输出模型定义
69
+ ├── enums/ # 枚举类型定义
70
+ │ ├── providers.py # 模型提供商枚举
71
+ │ ├── invoke.py # 调用类型枚举
72
+ │ └── channel.py # 渠道类型枚举
73
+ ├── async_client.py # 异步客户端实现
74
+ ├── sync_client.py # 同步客户端实现
75
+ ├── exceptions.py # 自定义异常
76
+ ├── auth.py # JWT认证处理器
77
+ └── __init__.py # 包初始化
78
+ ```
79
+
80
+ ## 🚀 快速开始
81
+
82
+ ### 客户端初始化
83
+
84
+ ```python
85
+ from model_manager_client import ModelManagerClient, AsyncModelManagerClient
86
+
87
+ # 同步客户端
88
+ client = ModelManagerClient(
89
+ server_address="localhost:50051",
90
+ jwt_token="your-jwt-token"
91
+ )
92
+
93
+ # 异步客户端
94
+ async_client = AsyncModelManagerClient(
95
+ server_address="localhost:50051",
96
+ jwt_secret_key="your-jwt-secret-key" # 使用固定密钥自动生成 JWT
97
+ )
98
+ ```
99
+
100
+ > 💡 建议通过环境变量配置连接信息,减少硬编码风险(见下文)。
101
+
102
+
103
+ ## 🎯 使用示例
104
+
105
+ #### OpenAI 调用示例
106
+
107
+ ```python
108
+ from model_manager_client import ModelManagerClient
109
+ from model_manager_client.schemas import ModelRequest, UserContext
110
+ from model_manager_client.enums import ProviderType, InvokeType, Channel
111
+
112
+ # 创建同步客户端
113
+ client = ModelManagerClient()
114
+
115
+ # OpenAI 调用示例
116
+ request_data = ModelRequest(
117
+ provider=ProviderType.OPENAI, # 选择 OpenAI 作为提供商
118
+ channel=Channel.OPENAI, # 使用 OpenAI 渠道
119
+ invoke_type=InvokeType.CHAT_COMPLETIONS, # 使用 chat completions 调用类型
120
+ model="gpt-4", # 指定具体模型
121
+ messages=[
122
+ {"role": "user", "content": "你好,请介绍一下你自己。"}
123
+ ],
124
+ user_context=UserContext(
125
+ user_id="test_user",
126
+ org_id="test_org",
127
+ client_type="python-sdk"
128
+ ),
129
+ stream=False, # 非流式调用
130
+ temperature=0.7, # 可选参数
131
+ max_tokens=1000, # 可选参数
132
+ )
133
+
134
+ # 发送请求并获取响应
135
+ response = client.invoke(request_data)
136
+ if response.error:
137
+ print(f"错误: {response.error}")
138
+ else:
139
+ print(f"响应: {response.content}")
140
+ if response.usage:
141
+ print(f"Token 使用情况: {response.usage}")
142
+ ```
143
+
144
+ #### Google 调用示例 (AI Studio / Vertex AI)
145
+
146
+ ```python
147
+ from model_manager_client import ModelManagerClient
148
+ from model_manager_client.schemas import ModelRequest, UserContext
149
+ from model_manager_client.enums import ProviderType, InvokeType, Channel
150
+
151
+ # 创建同步客户端
152
+ client = ModelManagerClient()
153
+
154
+ # Google AI Studio 调用示例
155
+ request_data = ModelRequest(
156
+ provider=ProviderType.GOOGLE, # 选择 Google 作为提供商
157
+ channel=Channel.AI_STUDIO, # 使用 AI Studio 渠道
158
+ invoke_type=InvokeType.GENERATION, # 使用生成调用类型
159
+ model="gemini-pro", # 指定具体模型
160
+ contents=[
161
+ {"role": "user", "parts": [{"text": "你好,请介绍一下你自己。"}]}
162
+ ],
163
+ user_context=UserContext(
164
+ user_id="test_user",
165
+ org_id="test_org",
166
+ client_type="python-sdk"
167
+ ),
168
+ temperature=0.7, # 可选参数
169
+ )
170
+
171
+ # 发送请求并获取响应
172
+ response = client.invoke(request_data)
173
+ if response.error:
174
+ print(f"错误: {response.error}")
175
+ else:
176
+ print(f"响应: {response.content}")
177
+ if response.usage:
178
+ print(f"Token 使用情况: {response.usage}")
179
+
180
+ # Google Vertex AI 调用示例
181
+ vertex_request = ModelRequest(
182
+ provider=ProviderType.GOOGLE, # 选择 Google 作为提供商
183
+ channel=Channel.VERTEXAI, # 使用 Vertex AI 渠道
184
+ invoke_type=InvokeType.GENERATION, # 使用生成调用类型
185
+ model="gemini-pro", # 指定具体模型
186
+ contents=[
187
+ {"role": "user", "parts": [{"text": "你好,请介绍一下你自己。"}]}
188
+ ],
189
+ user_context=UserContext(
190
+ user_id="test_user",
191
+ org_id="test_org",
192
+ client_type="python-sdk"
193
+ ),
194
+ temperature=0.7, # 可选参数
195
+ )
196
+
197
+ # 发送请求并获取响应
198
+ vertex_response = client.invoke(vertex_request)
199
+ if vertex_response.error:
200
+ print(f"错误: {vertex_response.error}")
201
+ else:
202
+ print(f"响应: {vertex_response.content}")
203
+ if vertex_response.usage:
204
+ print(f"Token 使用情况: {vertex_response.usage}")
205
+ ```
206
+
207
+ #### Azure OpenAI 调用示例
208
+
209
+ ```python
210
+ from model_manager_client import ModelManagerClient
211
+ from model_manager_client.schemas import ModelRequest, UserContext
212
+ from model_manager_client.enums import ProviderType, InvokeType, Channel
213
+
214
+ # 创建同步客户端
215
+ client = ModelManagerClient()
216
+
217
+ # Azure OpenAI 调用示例
218
+ request_data = ModelRequest(
219
+ provider=ProviderType.AZURE, # 选择 Azure 作为提供商
220
+ channel=Channel.OPENAI, # 使用 OpenAI 渠道
221
+ invoke_type=InvokeType.CHAT_COMPLETIONS, # 使用 chat completions 调用类型
222
+ model="gpt-4o-mini", # 指定具体模型
223
+ messages=[
224
+ {"role": "user", "content": "你好,请介绍一下你自己。"}
225
+ ],
226
+ user_context=UserContext(
227
+ user_id="test_user",
228
+ org_id="test_org",
229
+ client_type="python-sdk"
230
+ ),
231
+ stream=False, # 非流式调用
232
+ temperature=0.7, # 可选参数
233
+ max_tokens=1000, # 可选参数
234
+ )
235
+
236
+ # 发送请求并获取响应
237
+ response = client.invoke(request_data)
238
+ if response.error:
239
+ print(f"错误: {response.error}")
240
+ else:
241
+ print(f"响应: {response.content}")
242
+ if response.usage:
243
+ print(f"Token 使用情况: {response.usage}")
244
+ ```
245
+
246
+ ### 异步调用示例
247
+
248
+ ```python
249
+ import asyncio
250
+ from model_manager_client import AsyncModelManagerClient
251
+ from model_manager_client.schemas import ModelRequest, UserContext
252
+ from model_manager_client.enums import ProviderType, InvokeType, Channel
253
+
254
+
255
+ async def main():
256
+ # 创建异步客户端
257
+ client = AsyncModelManagerClient()
258
+
259
+ # 组装请求参数
260
+ request_data = ModelRequest(
261
+ provider=ProviderType.OPENAI,
262
+ channel=Channel.OPENAI,
263
+ invoke_type=InvokeType.CHAT_COMPLETIONS,
264
+ model="gpt-4o-mini",
265
+ messages=[
266
+ {"role": "user", "content": "你好,请介绍一下你自己。"}
267
+ ],
268
+ user_context=UserContext(
269
+ user_id="test_user",
270
+ org_id="test_org",
271
+ client_type="python-sdk"
272
+ ),
273
+ stream=False,
274
+ temperature=0.7,
275
+ max_tokens=1000,
276
+ )
277
+
278
+ # 发送请求并获取响应
279
+ response = await client.invoke(request_data)
280
+ if response.error:
281
+ print(f"错误: {response.error}")
282
+ else:
283
+ print(f"响应: {response.content}")
284
+ if response.usage:
285
+ print(f"Token 使用情况: {response.usage}")
286
+
287
+
288
+ # 运行异步示例
289
+ asyncio.run(main())
290
+ ```
291
+
292
+ ### 流式调用示例
293
+
294
+ ```python
295
+ import asyncio
296
+ from model_manager_client import AsyncModelManagerClient
297
+ from model_manager_client.schemas import ModelRequest, UserContext
298
+ from model_manager_client.enums import ProviderType, InvokeType, Channel
299
+
300
+
301
+ async def stream_example():
302
+ # 创建异步客户端
303
+ client = AsyncModelManagerClient()
304
+
305
+ # 组装请求参数
306
+ request_data = ModelRequest(
307
+ provider=ProviderType.OPENAI,
308
+ channel=Channel.OPENAI,
309
+ invoke_type=InvokeType.CHAT_COMPLETIONS,
310
+ model="gpt-4",
311
+ messages=[
312
+ {"role": "user", "content": "你好,请介绍一下你自己。"}
313
+ ],
314
+ user_context=UserContext(
315
+ user_id="test_user",
316
+ org_id="test_org",
317
+ client_type="python-sdk"
318
+ ),
319
+ stream=True, # 启用流式输出
320
+ temperature=0.7,
321
+ )
322
+
323
+ # 发送请求并获取流式响应
324
+ async for response in client.invoke(request_data):
325
+ if response.error:
326
+ print(f"错误: {response.error}")
327
+ else:
328
+ print(f"响应片段: {response.content}", end="", flush=True)
329
+ if response.usage:
330
+ print(f"\nToken 使用情况: {response.usage}")
331
+
332
+
333
+ # 运行流式示例
334
+ asyncio.run(stream_example())
335
+ ```
336
+
337
+ ### 批量调用示例
338
+
339
+ 支持批量处理多个模型请求:
340
+
341
+ ```python
342
+ import asyncio
343
+ from model_manager_client import AsyncModelManagerClient
344
+ from model_manager_client.schemas import (
345
+ BatchModelRequest, BatchModelRequestItem,
346
+ UserContext
347
+ )
348
+ from model_manager_client.enums import ProviderType, InvokeType, Channel
349
+
350
+
351
+ async def batch_example():
352
+ # 创建异步客户端
353
+ client = AsyncModelManagerClient()
354
+
355
+ # 组装批量请求参数
356
+ batch_request = BatchModelRequest(
357
+ user_context=UserContext(
358
+ user_id="test_user",
359
+ org_id="test_org",
360
+ client_type="python-sdk"
361
+ ),
362
+ items=[
363
+ BatchModelRequestItem(
364
+ provider=ProviderType.OPENAI,
365
+ channel=Channel.OPENAI,
366
+ invoke_type=InvokeType.CHAT_COMPLETIONS,
367
+ model="gpt-4",
368
+ messages=[
369
+ {"role": "user", "content": "第一个问题:什么是人工智能?"}
370
+ ],
371
+ priority=1,
372
+ custom_id="q1"
373
+ ),
374
+ BatchModelRequestItem(
375
+ provider=ProviderType.GOOGLE,
376
+ channel=Channel.AI_STUDIO,
377
+ invoke_type=InvokeType.GENERATION,
378
+ model="gemini-pro",
379
+ contents=[
380
+ {"role": "user", "parts": [{"text": "第二个问题:什么是机器学习?"}]}
381
+ ],
382
+ priority=2,
383
+ custom_id="q2"
384
+ )
385
+ ]
386
+ )
387
+
388
+ # 发送批量请求并获取响应
389
+ response = await client.invoke_batch(batch_request)
390
+ if response.responses:
391
+ for resp in response.responses:
392
+ print(f"\n问题 {resp.custom_id} 的响应:")
393
+ if resp.error:
394
+ print(f"错误: {resp.error}")
395
+ else:
396
+ print(f"内容: {resp.content}")
397
+ if resp.usage:
398
+ print(f"Token 使用情况: {resp.usage}")
399
+
400
+
401
+ # 运行批量调用示例
402
+ asyncio.run(batch_example())
403
+ ```
404
+
405
+ ### 文件输入示例
406
+
407
+ 支持处理图像等文件输入(需使用支持多模态的模型,如 gpt-4-vision-preview):
408
+
409
+ ```python
410
+ import asyncio
411
+ from model_manager_client import AsyncModelManagerClient
412
+ from model_manager_client.schemas import ModelRequest, UserContext
413
+ from model_manager_client.enums import ProviderType, InvokeType, Channel
414
+
415
+
416
+ async def file_input_example():
417
+ # 创建异步客户端
418
+ client = AsyncModelManagerClient()
419
+
420
+ # 组装请求参数(包含文件输入)
421
+ request_data = ModelRequest(
422
+ provider=ProviderType.OPENAI,
423
+ channel=Channel.OPENAI,
424
+ invoke_type=InvokeType.CHAT_COMPLETIONS,
425
+ model="gpt-4-vision-preview", # 使用支持图像的模型
426
+ messages=[
427
+ {
428
+ "role": "user",
429
+ "content": [
430
+ {
431
+ "type": "image_url",
432
+ "image_url": {
433
+ "url": "https://example.com/image.jpg"
434
+ }
435
+ },
436
+ {
437
+ "type": "text",
438
+ "text": "请描述这张图片。"
439
+ }
440
+ ]
441
+ }
442
+ ],
443
+ user_context=UserContext(
444
+ user_id="test_user",
445
+ org_id="test_org",
446
+ client_type="python-sdk"
447
+ ),
448
+ stream=False
449
+ )
450
+
451
+ # 发送请求并获取响应
452
+ response = await client.invoke(request_data)
453
+ if response.error:
454
+ print(f"错误: {response.error}")
455
+ else:
456
+ print(f"响应: {response.content}")
457
+ if response.usage:
458
+ print(f"Token 使用情况: {response.usage}")
459
+
460
+
461
+ # 运行文件输入示例
462
+ asyncio.run(file_input_example())
463
+ ```
464
+
465
+ ### ⚠️ 注意事项
466
+
467
+ 以下是使用 Model Manager Client 时的重要提示:
468
+
469
+ - **参数处理**
470
+ - 公共参数包括:**服务商 (provider)**、**渠道 (channel)** 和 **调用方法 (invoke_type)**
471
+ - 其中 **channel** 和 **invoke_type** 为可选参数,**建议默认使用系统自动推断**,除非有特殊需求再显式指定
472
+ - 是否流式输出由公共参数 **stream** 控制,其他参数遵循对应服务商官方 SDK 的标准定义
473
+ - **客户端连接管理**
474
+ - gRPC 使用 HTTP/2 长连接,**建议将客户端实例作为单例使用**
475
+ - 若需创建多个实例,**请务必调用** `client.close()` **方法手动关闭连接**,以防止连接堆积或资源泄露。
476
+ - **异常处理**:
477
+ - 所有接口均提供详细的**错误信息** 以及 **请求ID(request_id)**,业务调用时建议纳入对应日志便于后期排错。
478
+
479
+ ## ⚙️ 环境变量配置(推荐)
480
+
481
+ 可以通过 .env 文件或系统环境变量,自动配置连接信息
482
+
483
+ ```bash
484
+ export MODEL_MANAGER_SERVER_ADDRESS="localhost:50051"
485
+ export MODEL_MANAGER_SERVER_JWT_TOKEN="your-jwt-secret"
486
+ export MODEL_MANAGER_SERVER_GRPC_USE_TLS="false"
487
+ export MODEL_MANAGER_SERVER_GRPC_DEFAULT_AUTHORITY="localhost"
488
+ export MODEL_MANAGER_SERVER_GRPC_MAX_RETRIES="5"
489
+ export MODEL_MANAGER_SERVER_GRPC_RETRY_DELAY="1.5"
490
+ ```
491
+
492
+ 或者本地 `.env` 文件
493
+
494
+ ```
495
+ # ========================
496
+ # 🔌 gRPC 通信配置
497
+ # ========================
498
+
499
+ # gRPC 服务端地址(必填)
500
+ MODEL_MANAGER_SERVER_ADDRESS=localhost:50051
501
+
502
+ # 是否启用 TLS 加密通道(true/false,默认 true)
503
+ MODEL_MANAGER_SERVER_GRPC_USE_TLS=true
504
+
505
+ # 当使用 TLS 时指定 authority(域名必须和证书匹配才需要)
506
+ MODEL_MANAGER_SERVER_GRPC_DEFAULT_AUTHORITY=localhost
507
+
508
+
509
+ # ========================
510
+ # 🔐 鉴权配置(JWT)
511
+ # ========================
512
+
513
+ # JWT 签名密钥(用于生成 Token)
514
+ MODEL_MANAGER_SERVER_JWT_SECRET_KEY=your_jwt_secret_key
515
+
516
+
517
+ # ========================
518
+ # 🔁 重试配置(可选)
519
+ # ========================
520
+
521
+ # 最大重试次数(默认 3)
522
+ MODEL_MANAGER_SERVER_GRPC_MAX_RETRIES=3
523
+
524
+ # 初始重试延迟(秒,默认 1.0),指数退避
525
+ MODEL_MANAGER_SERVER_GRPC_RETRY_DELAY=1.0
526
+ ```
527
+
528
+ 加载后,初始化时无需传参:
529
+
530
+ ```python
531
+ from model_manager_client import ModelManagerClient
532
+
533
+ client = ModelManagerClient() # 将使用环境变量中的配置
534
+ ```
535
+
536
+ ## 开发
537
+
538
+ ### 环境设置
539
+
540
+ 1. 创建虚拟环境:
541
+
542
+ ```bash
543
+ python -m venv .venv
544
+ source .venv/bin/activate # Linux/macOS
545
+ # 或
546
+ .venv\Scripts\activate # Windows
547
+ ```
548
+
549
+ 2. 安装开发依赖:
550
+
551
+ ```bash
552
+ pip install -e .
553
+ ```
554
+
555
+ ### 生成 gRPC 代码
556
+
557
+ 运行以下命令生成 gRPC 相关代码:
558
+
559
+ ```bash
560
+ python make_grpc.py
561
+ ```
562
+
563
+ ## 许可证
564
+
565
+ MIT License
566
+
567
+ ## 作者
568
+
569
+ - Oscar Ou (oscar.ou@tamaredge.ai)
570
+
571
+ ## 贡献
572
+
573
+ 欢迎提交 Issue 和 Pull Request!