tamar-model-client 0.1.15__tar.gz → 0.1.16__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.15 → tamar_model_client-0.1.16}/PKG-INFO +9 -9
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/README.md +8 -8
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/setup.py +1 -1
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/async_client.py +37 -8
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/sync_client.py +9 -12
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/PKG-INFO +9 -9
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/setup.cfg +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/__init__.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/auth.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/enums/__init__.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/enums/channel.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/enums/invoke.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/enums/providers.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/exceptions.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/generated/__init__.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/generated/model_service_pb2.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/generated/model_service_pb2_grpc.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/schemas/__init__.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/schemas/inputs.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/schemas/outputs.py +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/SOURCES.txt +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/dependency_links.txt +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/requires.txt +0 -0
- {tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: tamar-model-client
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.16
|
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
|
@@ -273,13 +273,13 @@ async def main():
|
|
273
273
|
)
|
274
274
|
|
275
275
|
# 发送请求并获取响应
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
276
|
+
async for r in await client.invoke(model_request):
|
277
|
+
if r.error:
|
278
|
+
print(f"错误: {r.error}")
|
279
|
+
else:
|
280
|
+
print(f"响应: {r.content}")
|
281
|
+
if r.usage:
|
282
|
+
print(f"Token 使用情况: {r.usage}")
|
283
283
|
|
284
284
|
|
285
285
|
# 运行异步示例
|
@@ -531,7 +531,7 @@ python make_grpc.py
|
|
531
531
|
### 部署到 pip
|
532
532
|
```bash
|
533
533
|
python setup.py sdist bdist_wheel
|
534
|
-
twine
|
534
|
+
twine upload dist/*
|
535
535
|
|
536
536
|
```
|
537
537
|
|
@@ -243,13 +243,13 @@ async def main():
|
|
243
243
|
)
|
244
244
|
|
245
245
|
# 发送请求并获取响应
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
246
|
+
async for r in await client.invoke(model_request):
|
247
|
+
if r.error:
|
248
|
+
print(f"错误: {r.error}")
|
249
|
+
else:
|
250
|
+
print(f"响应: {r.content}")
|
251
|
+
if r.usage:
|
252
|
+
print(f"Token 使用情况: {r.usage}")
|
253
253
|
|
254
254
|
|
255
255
|
# 运行异步示例
|
@@ -501,7 +501,7 @@ python make_grpc.py
|
|
501
501
|
### 部署到 pip
|
502
502
|
```bash
|
503
503
|
python setup.py sdist bdist_wheel
|
504
|
-
twine
|
504
|
+
twine upload dist/*
|
505
505
|
|
506
506
|
```
|
507
507
|
|
@@ -203,6 +203,37 @@ class AsyncTamarModelClient:
|
|
203
203
|
logger.error(f"❌ Non-retryable gRPC error: {e}", exc_info=True)
|
204
204
|
raise
|
205
205
|
|
206
|
+
async def _retry_request_stream(self, func, *args, **kwargs):
|
207
|
+
retry_count = 0
|
208
|
+
while retry_count < self.max_retries:
|
209
|
+
try:
|
210
|
+
return func(*args, **kwargs)
|
211
|
+
except (grpc.aio.AioRpcError, grpc.RpcError) as e:
|
212
|
+
# 对于取消的情况进行指数退避重试
|
213
|
+
if isinstance(e, grpc.aio.AioRpcError) and e.code() == grpc.StatusCode.CANCELLED:
|
214
|
+
retry_count += 1
|
215
|
+
logger.warning(f"❌ RPC cancelled, retrying {retry_count}/{self.max_retries}...")
|
216
|
+
if retry_count < self.max_retries:
|
217
|
+
delay = self.retry_delay * (2 ** (retry_count - 1))
|
218
|
+
await asyncio.sleep(delay)
|
219
|
+
else:
|
220
|
+
logger.error("❌ Max retry reached for CANCELLED")
|
221
|
+
raise
|
222
|
+
# 针对其他 RPC 错误类型,如暂时的连接问题、服务器超时等
|
223
|
+
elif isinstance(e, grpc.RpcError) and e.code() in {grpc.StatusCode.UNAVAILABLE,
|
224
|
+
grpc.StatusCode.DEADLINE_EXCEEDED}:
|
225
|
+
retry_count += 1
|
226
|
+
logger.warning(f"❌ gRPC error {e.code()}, retrying {retry_count}/{self.max_retries}...")
|
227
|
+
if retry_count < self.max_retries:
|
228
|
+
delay = self.retry_delay * (2 ** (retry_count - 1))
|
229
|
+
await asyncio.sleep(delay)
|
230
|
+
else:
|
231
|
+
logger.error(f"❌ Max retry reached for {e.code()}")
|
232
|
+
raise
|
233
|
+
else:
|
234
|
+
logger.error(f"❌ Non-retryable gRPC error: {e}", exc_info=True)
|
235
|
+
raise
|
236
|
+
|
206
237
|
def _build_auth_metadata(self, request_id: str) -> list:
|
207
238
|
# if not self.jwt_token and self.jwt_handler:
|
208
239
|
# 更改为每次请求都生成一次token
|
@@ -263,25 +294,23 @@ class AsyncTamarModelClient:
|
|
263
294
|
logger.info(f"🚀 Retrying connection (attempt {retry_count}/{self.max_retries}) after {delay:.2f}s delay...")
|
264
295
|
await asyncio.sleep(delay)
|
265
296
|
|
266
|
-
async def
|
267
|
-
|
268
|
-
async for response in self.stub.Invoke(model_request, metadata=metadata, timeout=invoke_timeout):
|
297
|
+
async def _stream(self, request, metadata, invoke_timeout) -> AsyncIterator[ModelResponse]:
|
298
|
+
async for response in self.stub.Invoke(request, metadata=metadata, timeout=invoke_timeout):
|
269
299
|
yield ModelResponse(
|
270
300
|
content=response.content,
|
271
301
|
usage=json.loads(response.usage) if response.usage else None,
|
272
|
-
raw_response=json.loads(response.raw_response) if response.raw_response else None,
|
273
302
|
error=response.error or None,
|
303
|
+
raw_response=json.loads(response.raw_response) if response.raw_response else None,
|
304
|
+
request_id=response.request_id if response.request_id else None,
|
274
305
|
)
|
275
306
|
|
276
|
-
async def _stream(self, model_request, metadata, invoke_timeout) -> AsyncIterator[ModelResponse]:
|
277
|
-
return await self._retry_request(self._stream_inner, model_request, metadata, invoke_timeout)
|
278
|
-
|
279
307
|
async def _invoke_request(self, request, metadata, invoke_timeout):
|
280
308
|
async for response in self.stub.Invoke(request, metadata=metadata, timeout=invoke_timeout):
|
281
309
|
return ModelResponse(
|
282
310
|
content=response.content,
|
283
311
|
usage=json.loads(response.usage) if response.usage else None,
|
284
312
|
error=response.error or None,
|
313
|
+
raw_response=json.loads(response.raw_response) if response.raw_response else None,
|
285
314
|
request_id=response.request_id if response.request_id else None,
|
286
315
|
)
|
287
316
|
|
@@ -373,7 +402,7 @@ class AsyncTamarModelClient:
|
|
373
402
|
try:
|
374
403
|
invoke_timeout = timeout or self.default_invoke_timeout
|
375
404
|
if model_request.stream:
|
376
|
-
return await self._stream
|
405
|
+
return await self._retry_request_stream(self._stream, request, metadata, invoke_timeout)
|
377
406
|
else:
|
378
407
|
return await self._retry_request(self._invoke_request, request, metadata, invoke_timeout)
|
379
408
|
except grpc.RpcError as e:
|
@@ -247,20 +247,16 @@ class TamarModelClient:
|
|
247
247
|
logger.info(f"🚀 Retrying connection (attempt {retry_count}/{self.max_retries}) after {delay:.2f}s delay...")
|
248
248
|
time.sleep(delay) # Blocking sleep in sync version
|
249
249
|
|
250
|
-
def
|
251
|
-
|
252
|
-
response = self.stub.Invoke(model_request, metadata=metadata, timeout=invoke_timeout)
|
253
|
-
for res in response:
|
250
|
+
def _stream(self, request, metadata, invoke_timeout) -> Iterator[ModelResponse]:
|
251
|
+
for response in self.stub.Invoke(request, metadata=metadata, timeout=invoke_timeout):
|
254
252
|
yield ModelResponse(
|
255
|
-
content=
|
256
|
-
usage=json.loads(
|
257
|
-
|
258
|
-
|
253
|
+
content=response.content,
|
254
|
+
usage=json.loads(response.usage) if response.usage else None,
|
255
|
+
error=response.error or None,
|
256
|
+
raw_response=json.loads(response.raw_response) if response.raw_response else None,
|
257
|
+
request_id=response.request_id if response.request_id else None,
|
259
258
|
)
|
260
259
|
|
261
|
-
def _stream(self, model_request, metadata, invoke_timeout) -> Iterator[ModelResponse]:
|
262
|
-
return self._retry_request(self._stream_inner, model_request, metadata, invoke_timeout)
|
263
|
-
|
264
260
|
def _invoke_request(self, request, metadata, invoke_timeout):
|
265
261
|
response = self.stub.Invoke(request, metadata=metadata, timeout=invoke_timeout)
|
266
262
|
for response in response:
|
@@ -268,6 +264,7 @@ class TamarModelClient:
|
|
268
264
|
content=response.content,
|
269
265
|
usage=json.loads(response.usage) if response.usage else None,
|
270
266
|
error=response.error or None,
|
267
|
+
raw_response=json.loads(response.raw_response) if response.raw_response else None,
|
271
268
|
request_id=response.request_id if response.request_id else None,
|
272
269
|
)
|
273
270
|
|
@@ -358,7 +355,7 @@ class TamarModelClient:
|
|
358
355
|
try:
|
359
356
|
invoke_timeout = timeout or self.default_invoke_timeout
|
360
357
|
if model_request.stream:
|
361
|
-
return self._stream
|
358
|
+
return self._retry_request(self._stream, request, metadata, invoke_timeout)
|
362
359
|
else:
|
363
360
|
return self._retry_request(self._invoke_request, request, metadata, invoke_timeout)
|
364
361
|
except grpc.RpcError as e:
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: tamar-model-client
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.16
|
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
|
@@ -273,13 +273,13 @@ async def main():
|
|
273
273
|
)
|
274
274
|
|
275
275
|
# 发送请求并获取响应
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
276
|
+
async for r in await client.invoke(model_request):
|
277
|
+
if r.error:
|
278
|
+
print(f"错误: {r.error}")
|
279
|
+
else:
|
280
|
+
print(f"响应: {r.content}")
|
281
|
+
if r.usage:
|
282
|
+
print(f"Token 使用情况: {r.usage}")
|
283
283
|
|
284
284
|
|
285
285
|
# 运行异步示例
|
@@ -531,7 +531,7 @@ python make_grpc.py
|
|
531
531
|
### 部署到 pip
|
532
532
|
```bash
|
533
533
|
python setup.py sdist bdist_wheel
|
534
|
-
twine
|
534
|
+
twine upload dist/*
|
535
535
|
|
536
536
|
```
|
537
537
|
|
File without changes
|
File without changes
|
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/enums/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/enums/providers.py
RENAMED
File without changes
|
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/generated/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/schemas/__init__.py
RENAMED
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/schemas/inputs.py
RENAMED
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client/schemas/outputs.py
RENAMED
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/requires.txt
RENAMED
File without changes
|
{tamar_model_client-0.1.15 → tamar_model_client-0.1.16}/tamar_model_client.egg-info/top_level.txt
RENAMED
File without changes
|