tamar-model-client 0.1.25__tar.gz → 0.1.27__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 (39) hide show
  1. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/PKG-INFO +1 -1
  2. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/setup.py +1 -1
  3. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/async_client.py +55 -17
  4. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/core/__init__.py +4 -0
  5. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/core/base_client.py +7 -2
  6. tamar_model_client-0.1.27/tamar_model_client/core/request_id_manager.py +112 -0
  7. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/exceptions.py +1 -1
  8. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/sync_client.py +55 -17
  9. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/PKG-INFO +1 -1
  10. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/SOURCES.txt +1 -0
  11. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tests/test_google_azure_final.py +2 -2
  12. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/README.md +0 -0
  13. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/setup.cfg +0 -0
  14. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/__init__.py +0 -0
  15. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/auth.py +0 -0
  16. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/circuit_breaker.py +0 -0
  17. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/core/http_fallback.py +0 -0
  18. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/core/logging_setup.py +0 -0
  19. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/core/request_builder.py +0 -0
  20. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/core/response_handler.py +0 -0
  21. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/core/utils.py +0 -0
  22. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/enums/__init__.py +0 -0
  23. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/enums/channel.py +0 -0
  24. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/enums/invoke.py +0 -0
  25. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/enums/providers.py +0 -0
  26. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/error_handler.py +0 -0
  27. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/generated/__init__.py +0 -0
  28. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/generated/model_service_pb2.py +0 -0
  29. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/generated/model_service_pb2_grpc.py +0 -0
  30. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/json_formatter.py +0 -0
  31. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/logging_icons.py +0 -0
  32. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/schemas/__init__.py +0 -0
  33. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/schemas/inputs.py +0 -0
  34. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/schemas/outputs.py +0 -0
  35. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client/utils.py +0 -0
  36. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/dependency_links.txt +0 -0
  37. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/requires.txt +0 -0
  38. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/top_level.txt +0 -0
  39. {tamar_model_client-0.1.25 → tamar_model_client-0.1.27}/tests/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tamar-model-client
3
- Version: 0.1.25
3
+ Version: 0.1.27
4
4
  Summary: A Python SDK for interacting with the Model Manager gRPC service
5
5
  Home-page: http://gitlab.tamaredge.top/project-tap/AgentOS/model-manager-client
6
6
  Author: Oscar Ou
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="tamar-model-client",
5
- version="0.1.25",
5
+ version="0.1.27",
6
6
  description="A Python SDK for interacting with the Model Manager gRPC service",
7
7
  author="Oscar Ou",
8
8
  author_email="oscar.ou@tamaredge.ai",
@@ -33,7 +33,9 @@ from .core import (
33
33
  generate_request_id,
34
34
  set_request_id,
35
35
  get_protected_logger,
36
- MAX_MESSAGE_LENGTH, get_request_id
36
+ MAX_MESSAGE_LENGTH,
37
+ get_request_id,
38
+ RequestIdManager
37
39
  )
38
40
  from .core.base_client import BaseClient
39
41
  from .core.request_builder import RequestBuilder
@@ -102,6 +104,9 @@ class AsyncTamarModelClient(BaseClient, AsyncHttpFallbackMixin):
102
104
  self._last_channel_error_time = None
103
105
  self._channel_lock = asyncio.Lock() # 异步锁
104
106
 
107
+ # === Request ID 管理 ===
108
+ self._request_id_manager = RequestIdManager()
109
+
105
110
  # === 增强的重试处理器 ===
106
111
  self.retry_handler = EnhancedRetryHandler(
107
112
  max_retries=self.max_retries,
@@ -744,10 +749,22 @@ class AsyncTamarModelClient(BaseClient, AsyncHttpFallbackMixin):
744
749
  "user_id": model_request.user_context.user_id or ""
745
750
  }
746
751
 
747
- if not request_id:
752
+ # 处理 request_id
753
+ origin_request_id = None
754
+ if request_id:
755
+ # 用户提供了 request_id,生成组合 ID
756
+ request_id, origin_request_id = self._request_id_manager.get_composite_id(request_id)
757
+ else:
758
+ # 没有提供,生成新的
748
759
  request_id = generate_request_id()
760
+
749
761
  set_request_id(request_id)
750
- metadata = self._build_auth_metadata(request_id)
762
+ metadata = self._build_auth_metadata(request_id, origin_request_id)
763
+
764
+ # 构建日志数据
765
+ log_data = ResponseHandler.build_log_data(model_request)
766
+ if origin_request_id:
767
+ log_data['origin_request_id'] = origin_request_id
751
768
 
752
769
  # 记录开始日志
753
770
  start_time = time.time()
@@ -756,7 +773,7 @@ class AsyncTamarModelClient(BaseClient, AsyncHttpFallbackMixin):
756
773
  extra={
757
774
  "log_type": "request",
758
775
  "uri": f"/invoke/{model_request.provider.value}/{model_request.invoke_type.value}",
759
- "data": ResponseHandler.build_log_data(model_request)
776
+ "data": log_data
760
777
  })
761
778
 
762
779
  try:
@@ -794,13 +811,19 @@ class AsyncTamarModelClient(BaseClient, AsyncHttpFallbackMixin):
794
811
  # 记录非流式响应的成功日志
795
812
  duration = time.time() - start_time
796
813
  content_length = len(result.content) if result.content else 0
814
+
815
+ # 构建响应日志数据
816
+ response_log_data = ResponseHandler.build_log_data(model_request, result)
817
+ if origin_request_id:
818
+ response_log_data['origin_request_id'] = origin_request_id
819
+
797
820
  logger.info(
798
821
  f"✅ Request completed | content_length: {content_length}",
799
822
  extra={
800
823
  "log_type": "response",
801
824
  "uri": f"/invoke/{model_request.provider.value}/{model_request.invoke_type.value}",
802
825
  "duration": duration,
803
- "data": ResponseHandler.build_log_data(model_request, result)
826
+ "data": response_log_data
804
827
  }
805
828
  )
806
829
 
@@ -813,15 +836,18 @@ class AsyncTamarModelClient(BaseClient, AsyncHttpFallbackMixin):
813
836
  except (ConnectionError, grpc.RpcError) as e:
814
837
  duration = time.time() - start_time
815
838
  error_message = f"❌ Invoke gRPC failed: {str(e)}"
839
+
840
+ # 构建错误日志数据
841
+ error_log_data = ResponseHandler.build_log_data(model_request, error=e)
842
+ if origin_request_id:
843
+ error_log_data['origin_request_id'] = origin_request_id
844
+
816
845
  logger.error(error_message, exc_info=True,
817
846
  extra={
818
847
  "log_type": "response",
819
848
  "uri": f"/invoke/{model_request.provider.value}/{model_request.invoke_type.value}",
820
849
  "duration": duration,
821
- "data": ResponseHandler.build_log_data(
822
- model_request,
823
- error=e
824
- )
850
+ "data": error_log_data
825
851
  })
826
852
 
827
853
  # 记录 channel 错误
@@ -875,10 +901,27 @@ class AsyncTamarModelClient(BaseClient, AsyncHttpFallbackMixin):
875
901
  "user_id": batch_request_model.user_context.user_id or ""
876
902
  }
877
903
 
878
- if not request_id:
904
+ # 处理 request_id
905
+ origin_request_id = None
906
+ if request_id:
907
+ # 用户提供了 request_id,生成组合 ID
908
+ request_id, origin_request_id = self._request_id_manager.get_composite_id(request_id)
909
+ else:
910
+ # 没有提供,生成新的
879
911
  request_id = generate_request_id()
912
+
880
913
  set_request_id(request_id)
881
- metadata = self._build_auth_metadata(request_id)
914
+ metadata = self._build_auth_metadata(request_id, origin_request_id)
915
+
916
+ # 构建日志数据
917
+ batch_log_data = {
918
+ "batch_size": len(batch_request_model.items),
919
+ "org_id": batch_request_model.user_context.org_id,
920
+ "user_id": batch_request_model.user_context.user_id,
921
+ "client_type": batch_request_model.user_context.client_type
922
+ }
923
+ if origin_request_id:
924
+ batch_log_data['origin_request_id'] = origin_request_id
882
925
 
883
926
  # 记录开始日志
884
927
  start_time = time.time()
@@ -887,12 +930,7 @@ class AsyncTamarModelClient(BaseClient, AsyncHttpFallbackMixin):
887
930
  extra={
888
931
  "log_type": "request",
889
932
  "uri": "/batch_invoke",
890
- "data": {
891
- "batch_size": len(batch_request_model.items),
892
- "org_id": batch_request_model.user_context.org_id,
893
- "user_id": batch_request_model.user_context.user_id,
894
- "client_type": batch_request_model.user_context.client_type
895
- }
933
+ "data": batch_log_data
896
934
  })
897
935
 
898
936
  try:
@@ -22,6 +22,8 @@ from .logging_setup import (
22
22
  MAX_MESSAGE_LENGTH
23
23
  )
24
24
 
25
+ from .request_id_manager import RequestIdManager
26
+
25
27
  __all__ = [
26
28
  # Utils
27
29
  'is_effective_value',
@@ -37,4 +39,6 @@ __all__ = [
37
39
  'get_protected_logger',
38
40
  'reset_logger_config',
39
41
  'MAX_MESSAGE_LENGTH',
42
+ # Request ID Management
43
+ 'RequestIdManager',
40
44
  ]
@@ -74,7 +74,7 @@ class BaseClient(ABC):
74
74
 
75
75
  # === 重试配置 ===
76
76
  self.max_retries = max_retries if max_retries is not None else int(
77
- os.getenv("MODEL_MANAGER_SERVER_GRPC_MAX_RETRIES", 3))
77
+ os.getenv("MODEL_MANAGER_SERVER_GRPC_MAX_RETRIES", 6))
78
78
  self.retry_delay = retry_delay if retry_delay is not None else float(
79
79
  os.getenv("MODEL_MANAGER_SERVER_GRPC_RETRY_DELAY", 1.0))
80
80
 
@@ -131,7 +131,7 @@ class BaseClient(ABC):
131
131
 
132
132
  return options
133
133
 
134
- def _build_auth_metadata(self, request_id: str) -> list:
134
+ def _build_auth_metadata(self, request_id: str, origin_request_id: Optional[str] = None) -> list:
135
135
  """
136
136
  构建认证元数据
137
137
 
@@ -140,12 +140,17 @@ class BaseClient(ABC):
140
140
 
141
141
  Args:
142
142
  request_id: 当前请求的唯一标识符
143
+ origin_request_id: 原始请求ID(可选)
143
144
 
144
145
  Returns:
145
146
  list: gRPC元数据列表,包含请求ID和认证令牌
146
147
  """
147
148
  metadata = [("x-request-id", request_id)] # 将 request_id 添加到 headers
148
149
 
150
+ # 如果有原始请求ID,也添加到 headers
151
+ if origin_request_id:
152
+ metadata.append(("x-origin-request-id", origin_request_id))
153
+
149
154
  if self.jwt_handler:
150
155
  self.jwt_token = self.jwt_handler.encode_token(
151
156
  self.default_payload,
@@ -0,0 +1,112 @@
1
+ """
2
+ Request ID 管理器
3
+
4
+ 管理 request_id 的生成和追踪,支持为同一个原始 request_id 生成带序号的组合 ID。
5
+ """
6
+
7
+ import threading
8
+ import time
9
+ from typing import Dict, Tuple, Optional
10
+
11
+
12
+ class RequestIdManager:
13
+ """
14
+ 管理 request_id 的生成和追踪
15
+
16
+ 为同一个原始 request_id 生成带序号的组合 ID,如:
17
+ - 原始 ID: abc-123
18
+ - 第一次调用: abc-123-1
19
+ - 第二次调用: abc-123-2
20
+
21
+ 包含自动清理机制,避免内存泄漏。
22
+ """
23
+
24
+ def __init__(self, ttl_seconds: int = 3600):
25
+ """
26
+ 初始化 RequestIdManager
27
+
28
+ Args:
29
+ ttl_seconds: 计数器的生存时间(秒),默认 1 小时
30
+ """
31
+ self._counters: Dict[str, Dict[str, any]] = {} # {origin_id: {'count': int, 'last_used': float}}
32
+ self._lock = threading.Lock()
33
+ self._ttl = ttl_seconds
34
+ self._last_cleanup = time.time()
35
+ self._cleanup_interval = 300 # 每 5 分钟执行一次清理
36
+
37
+ def get_composite_id(self, origin_id: str) -> Tuple[str, str]:
38
+ """
39
+ 获取组合的 request_id
40
+
41
+ Args:
42
+ origin_id: 原始的 request_id
43
+
44
+ Returns:
45
+ tuple: (composite_request_id, origin_request_id)
46
+ - composite_request_id: 带序号的组合 ID,如 "abc-123-1"
47
+ - origin_request_id: 原始 ID,如 "abc-123"
48
+ """
49
+ with self._lock:
50
+ current_time = time.time()
51
+
52
+ # 定期清理过期的计数器
53
+ if current_time - self._last_cleanup > self._cleanup_interval:
54
+ self._cleanup_expired(current_time)
55
+ self._last_cleanup = current_time
56
+
57
+ # 获取或初始化计数器
58
+ if origin_id not in self._counters:
59
+ self._counters[origin_id] = {
60
+ 'count': 0,
61
+ 'last_used': current_time
62
+ }
63
+
64
+ # 递增计数
65
+ self._counters[origin_id]['count'] += 1
66
+ self._counters[origin_id]['last_used'] = current_time
67
+
68
+ composite_id = f"{origin_id}-{self._counters[origin_id]['count']}"
69
+ return composite_id, origin_id
70
+
71
+ def _cleanup_expired(self, current_time: float):
72
+ """
73
+ 清理过期的计数器
74
+
75
+ Args:
76
+ current_time: 当前时间戳
77
+ """
78
+ expired_ids = [
79
+ origin_id for origin_id, info in self._counters.items()
80
+ if current_time - info['last_used'] > self._ttl
81
+ ]
82
+
83
+ for origin_id in expired_ids:
84
+ del self._counters[origin_id]
85
+
86
+ # 如果计数器数量过多,保留最近使用的一半
87
+ if len(self._counters) > 1000:
88
+ sorted_items = sorted(
89
+ self._counters.items(),
90
+ key=lambda x: x[1]['last_used'],
91
+ reverse=True
92
+ )[:500]
93
+ self._counters = dict(sorted_items)
94
+
95
+ def get_stats(self) -> Dict[str, any]:
96
+ """
97
+ 获取统计信息
98
+
99
+ Returns:
100
+ dict: 包含计数器数量等统计信息
101
+ """
102
+ with self._lock:
103
+ return {
104
+ 'total_counters': len(self._counters),
105
+ 'ttl_seconds': self._ttl,
106
+ 'cleanup_interval': self._cleanup_interval
107
+ }
108
+
109
+ def clear(self):
110
+ """清空所有计数器"""
111
+ with self._lock:
112
+ self._counters.clear()
@@ -77,7 +77,7 @@ RETRY_POLICY = {
77
77
  grpc.StatusCode.CANCELLED: {
78
78
  'retryable': True,
79
79
  'backoff': 'linear', # 线性退避,网络问题通常不需要指数退避
80
- 'max_attempts': 2, # 最大重试次数(不包括初始请求),总共会尝试3
80
+ 'max_attempts': 5, # 最大重试次数(不包括初始请求),总共会尝试6
81
81
  'check_details': False # 不检查详细信息,统一重试
82
82
  },
83
83
  grpc.StatusCode.ABORTED: {
@@ -32,7 +32,9 @@ from .core import (
32
32
  generate_request_id,
33
33
  set_request_id,
34
34
  get_protected_logger,
35
- MAX_MESSAGE_LENGTH, get_request_id
35
+ MAX_MESSAGE_LENGTH,
36
+ get_request_id,
37
+ RequestIdManager
36
38
  )
37
39
  from .core.base_client import BaseClient
38
40
  from .core.request_builder import RequestBuilder
@@ -99,6 +101,9 @@ class TamarModelClient(BaseClient, HttpFallbackMixin):
99
101
  self._channel_error_count = 0
100
102
  self._last_channel_error_time = None
101
103
  self._channel_lock = threading.Lock() # 线程安全的channel操作
104
+
105
+ # === Request ID 管理 ===
106
+ self._request_id_manager = RequestIdManager()
102
107
 
103
108
  def close(self):
104
109
  """
@@ -808,10 +813,22 @@ class TamarModelClient(BaseClient, HttpFallbackMixin):
808
813
  "user_id": model_request.user_context.user_id or ""
809
814
  }
810
815
 
811
- if not request_id:
816
+ # 处理 request_id
817
+ origin_request_id = None
818
+ if request_id:
819
+ # 用户提供了 request_id,生成组合 ID
820
+ request_id, origin_request_id = self._request_id_manager.get_composite_id(request_id)
821
+ else:
822
+ # 没有提供,生成新的
812
823
  request_id = generate_request_id()
824
+
813
825
  set_request_id(request_id)
814
- metadata = self._build_auth_metadata(request_id)
826
+ metadata = self._build_auth_metadata(request_id, origin_request_id)
827
+
828
+ # 构建日志数据
829
+ log_data = ResponseHandler.build_log_data(model_request)
830
+ if origin_request_id:
831
+ log_data['origin_request_id'] = origin_request_id
815
832
 
816
833
  # 记录开始日志
817
834
  start_time = time.time()
@@ -820,7 +837,7 @@ class TamarModelClient(BaseClient, HttpFallbackMixin):
820
837
  extra={
821
838
  "log_type": "request",
822
839
  "uri": f"/invoke/{model_request.provider.value}/{model_request.invoke_type.value}",
823
- "data": ResponseHandler.build_log_data(model_request)
840
+ "data": log_data
824
841
  })
825
842
 
826
843
  try:
@@ -862,13 +879,19 @@ class TamarModelClient(BaseClient, HttpFallbackMixin):
862
879
  # 记录非流式响应的成功日志
863
880
  duration = time.time() - start_time
864
881
  content_length = len(result.content) if result.content else 0
882
+
883
+ # 构建响应日志数据
884
+ response_log_data = ResponseHandler.build_log_data(model_request, result)
885
+ if origin_request_id:
886
+ response_log_data['origin_request_id'] = origin_request_id
887
+
865
888
  logger.info(
866
889
  f"✅ Request completed | content_length: {content_length}",
867
890
  extra={
868
891
  "log_type": "response",
869
892
  "uri": f"/invoke/{model_request.provider.value}/{model_request.invoke_type.value}",
870
893
  "duration": duration,
871
- "data": ResponseHandler.build_log_data(model_request, result)
894
+ "data": response_log_data
872
895
  }
873
896
  )
874
897
 
@@ -881,15 +904,18 @@ class TamarModelClient(BaseClient, HttpFallbackMixin):
881
904
  except (ConnectionError, grpc.RpcError) as e:
882
905
  duration = time.time() - start_time
883
906
  error_message = f"❌ Invoke gRPC failed: {str(e)}"
907
+
908
+ # 构建错误日志数据
909
+ error_log_data = ResponseHandler.build_log_data(model_request, error=e)
910
+ if origin_request_id:
911
+ error_log_data['origin_request_id'] = origin_request_id
912
+
884
913
  logger.error(error_message, exc_info=True,
885
914
  extra={
886
915
  "log_type": "response",
887
916
  "uri": f"/invoke/{model_request.provider.value}/{model_request.invoke_type.value}",
888
917
  "duration": duration,
889
- "data": ResponseHandler.build_log_data(
890
- model_request,
891
- error=e
892
- )
918
+ "data": error_log_data
893
919
  })
894
920
 
895
921
  # 记录 channel 错误
@@ -943,10 +969,27 @@ class TamarModelClient(BaseClient, HttpFallbackMixin):
943
969
  "user_id": batch_request_model.user_context.user_id or ""
944
970
  }
945
971
 
946
- if not request_id:
972
+ # 处理 request_id
973
+ origin_request_id = None
974
+ if request_id:
975
+ # 用户提供了 request_id,生成组合 ID
976
+ request_id, origin_request_id = self._request_id_manager.get_composite_id(request_id)
977
+ else:
978
+ # 没有提供,生成新的
947
979
  request_id = generate_request_id()
980
+
948
981
  set_request_id(request_id)
949
- metadata = self._build_auth_metadata(request_id)
982
+ metadata = self._build_auth_metadata(request_id, origin_request_id)
983
+
984
+ # 构建日志数据
985
+ batch_log_data = {
986
+ "batch_size": len(batch_request_model.items),
987
+ "org_id": batch_request_model.user_context.org_id,
988
+ "user_id": batch_request_model.user_context.user_id,
989
+ "client_type": batch_request_model.user_context.client_type
990
+ }
991
+ if origin_request_id:
992
+ batch_log_data['origin_request_id'] = origin_request_id
950
993
 
951
994
  # 记录开始日志
952
995
  start_time = time.time()
@@ -955,12 +998,7 @@ class TamarModelClient(BaseClient, HttpFallbackMixin):
955
998
  extra={
956
999
  "log_type": "request",
957
1000
  "uri": "/batch_invoke",
958
- "data": {
959
- "batch_size": len(batch_request_model.items),
960
- "org_id": batch_request_model.user_context.org_id,
961
- "user_id": batch_request_model.user_context.user_id,
962
- "client_type": batch_request_model.user_context.client_type
963
- }
1001
+ "data": batch_log_data
964
1002
  })
965
1003
 
966
1004
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tamar-model-client
3
- Version: 0.1.25
3
+ Version: 0.1.27
4
4
  Summary: A Python SDK for interacting with the Model Manager gRPC service
5
5
  Home-page: http://gitlab.tamaredge.top/project-tap/AgentOS/model-manager-client
6
6
  Author: Oscar Ou
@@ -20,6 +20,7 @@ tamar_model_client/core/base_client.py
20
20
  tamar_model_client/core/http_fallback.py
21
21
  tamar_model_client/core/logging_setup.py
22
22
  tamar_model_client/core/request_builder.py
23
+ tamar_model_client/core/request_id_manager.py
23
24
  tamar_model_client/core/response_handler.py
24
25
  tamar_model_client/core/utils.py
25
26
  tamar_model_client/enums/__init__.py
@@ -645,10 +645,10 @@ async def main():
645
645
  # await asyncio.wait_for(test_batch_requests(), timeout=120.0)
646
646
 
647
647
  # 同步并发测试
648
- test_concurrent_requests(150) # 测试150个并发请求
648
+ test_concurrent_requests(25) # 测试150个并发请求
649
649
 
650
650
  # 异步并发测试
651
- await test_async_concurrent_requests(150) # 测试150个异步并发请求
651
+ await test_async_concurrent_requests(25) # 测试150个异步并发请求
652
652
 
653
653
  print("\n✅ 测试完成")
654
654