tamar-model-client 0.1.26__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.
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/PKG-INFO +1 -1
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/setup.py +1 -1
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/async_client.py +55 -17
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/__init__.py +4 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/base_client.py +6 -1
- tamar_model_client-0.1.27/tamar_model_client/core/request_id_manager.py +112 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/sync_client.py +55 -17
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/PKG-INFO +1 -1
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/SOURCES.txt +1 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tests/test_google_azure_final.py +2 -2
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/README.md +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/setup.cfg +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/__init__.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/auth.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/circuit_breaker.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/http_fallback.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/logging_setup.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/request_builder.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/response_handler.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/utils.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/enums/__init__.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/enums/channel.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/enums/invoke.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/enums/providers.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/error_handler.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/exceptions.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/generated/__init__.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/generated/model_service_pb2.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/generated/model_service_pb2_grpc.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/json_formatter.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/logging_icons.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/schemas/__init__.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/schemas/inputs.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/schemas/outputs.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/utils.py +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/dependency_links.txt +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/requires.txt +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/top_level.txt +0 -0
- {tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tests/__init__.py +0 -0
@@ -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,
|
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
|
-
|
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":
|
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":
|
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":
|
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
|
-
|
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
|
]
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/base_client.py
RENAMED
@@ -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()
|
@@ -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,
|
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
|
-
|
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":
|
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":
|
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":
|
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
|
-
|
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:
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/SOURCES.txt
RENAMED
@@ -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(
|
648
|
+
test_concurrent_requests(25) # 测试150个并发请求
|
649
649
|
|
650
650
|
# 异步并发测试
|
651
|
-
await test_async_concurrent_requests(
|
651
|
+
await test_async_concurrent_requests(25) # 测试150个异步并发请求
|
652
652
|
|
653
653
|
print("\n✅ 测试完成")
|
654
654
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/circuit_breaker.py
RENAMED
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/http_fallback.py
RENAMED
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/logging_setup.py
RENAMED
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/request_builder.py
RENAMED
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/core/response_handler.py
RENAMED
File without changes
|
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/enums/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/enums/providers.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/generated/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/json_formatter.py
RENAMED
File without changes
|
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/schemas/__init__.py
RENAMED
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/schemas/inputs.py
RENAMED
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client/schemas/outputs.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/requires.txt
RENAMED
File without changes
|
{tamar_model_client-0.1.26 → tamar_model_client-0.1.27}/tamar_model_client.egg-info/top_level.txt
RENAMED
File without changes
|
File without changes
|