payi 0.1.0a96__py3-none-any.whl → 0.1.0a97__py3-none-any.whl
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.
Potentially problematic release.
This version of payi might be problematic. Click here for more details.
- payi/_version.py +1 -1
- payi/lib/VertexRequest.py +32 -6
- payi/lib/instrument.py +120 -37
- {payi-0.1.0a96.dist-info → payi-0.1.0a97.dist-info}/METADATA +1 -1
- {payi-0.1.0a96.dist-info → payi-0.1.0a97.dist-info}/RECORD +7 -7
- {payi-0.1.0a96.dist-info → payi-0.1.0a97.dist-info}/WHEEL +0 -0
- {payi-0.1.0a96.dist-info → payi-0.1.0a97.dist-info}/licenses/LICENSE +0 -0
payi/_version.py
CHANGED
payi/lib/VertexRequest.py
CHANGED
|
@@ -10,6 +10,8 @@ from .instrument import _ChunkResult, _StreamingType, _ProviderRequest, _PayiIns
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class _VertexRequest(_ProviderRequest): # type: ignore
|
|
13
|
+
KNOWN_MODALITIES = ("VIDEO", "AUDIO", "TEXT", "VISION", "IMAGE")
|
|
14
|
+
|
|
13
15
|
def __init__(self, instrumentor: _PayiInstrumentor):
|
|
14
16
|
super().__init__(
|
|
15
17
|
instrumentor=instrumentor,
|
|
@@ -154,6 +156,7 @@ class _VertexRequest(_ProviderRequest): # type: ignore
|
|
|
154
156
|
|
|
155
157
|
prompt_tokens_details: list[dict[str, Any]] = usage.get("prompt_tokens_details", [])
|
|
156
158
|
candidates_tokens_details: list[dict[str, Any]] = usage.get("candidates_tokens_details", [])
|
|
159
|
+
cache_tokens_details: list[dict[str, Any]] = usage.get("cache_tokens_details", [])
|
|
157
160
|
|
|
158
161
|
if not model:
|
|
159
162
|
model = ""
|
|
@@ -214,27 +217,50 @@ class _VertexRequest(_ProviderRequest): # type: ignore
|
|
|
214
217
|
if is_large_context_token_model(model, input):
|
|
215
218
|
large_context = "_large_context"
|
|
216
219
|
|
|
220
|
+
cache_details: dict[str, int] = {}
|
|
221
|
+
|
|
222
|
+
for details in cache_tokens_details:
|
|
223
|
+
modality = details.get("modality", "")
|
|
224
|
+
if not modality:
|
|
225
|
+
continue
|
|
226
|
+
|
|
227
|
+
modality_token_count = details.get("token_count", 0)
|
|
228
|
+
|
|
229
|
+
if modality == "IMAGE":
|
|
230
|
+
modality = "VISION"
|
|
231
|
+
|
|
232
|
+
if modality in _VertexRequest.KNOWN_MODALITIES:
|
|
233
|
+
cache_details[modality] = modality_token_count
|
|
234
|
+
add_units(self, modality.lower() + "_cache_read" + large_context, input=modality_token_count)
|
|
235
|
+
|
|
217
236
|
for details in prompt_tokens_details:
|
|
218
237
|
modality = details.get("modality", "")
|
|
219
238
|
if not modality:
|
|
220
239
|
continue
|
|
221
240
|
|
|
222
241
|
modality_token_count = details.get("token_count", 0)
|
|
242
|
+
|
|
223
243
|
if modality == "IMAGE":
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
244
|
+
modality = "VISION"
|
|
245
|
+
|
|
246
|
+
if modality in _VertexRequest.KNOWN_MODALITIES:
|
|
247
|
+
# Subtract cache_details value if modality is present, floor at zero
|
|
248
|
+
if modality in cache_details:
|
|
249
|
+
modality_token_count = max(0, modality_token_count - cache_details[modality])
|
|
250
|
+
|
|
251
|
+
add_units(self, modality.lower() + large_context, input=modality_token_count)
|
|
252
|
+
|
|
227
253
|
for details in candidates_tokens_details:
|
|
228
254
|
modality = details.get("modality", "")
|
|
229
255
|
if not modality:
|
|
230
256
|
continue
|
|
231
257
|
|
|
232
258
|
modality_token_count = details.get("token_count", 0)
|
|
233
|
-
if modality in
|
|
234
|
-
add_units(self, modality.lower()+large_context, output=modality_token_count)
|
|
259
|
+
if modality in _VertexRequest.KNOWN_MODALITIES:
|
|
260
|
+
add_units(self, modality.lower() + large_context, output=modality_token_count)
|
|
235
261
|
|
|
236
262
|
if thinking_token_count > 0:
|
|
237
|
-
add_units(self, "reasoning"+large_context, output=thinking_token_count)
|
|
263
|
+
add_units(self, "reasoning" + large_context, output=thinking_token_count)
|
|
238
264
|
|
|
239
265
|
if not self._ingest["units"]:
|
|
240
266
|
input = usage.get("prompt_token_count", 0)
|
payi/lib/instrument.py
CHANGED
|
@@ -15,11 +15,13 @@ from dataclasses import dataclass
|
|
|
15
15
|
import nest_asyncio # type: ignore
|
|
16
16
|
from wrapt import ObjectProxy # type: ignore
|
|
17
17
|
|
|
18
|
-
from payi import Payi, AsyncPayi, APIConnectionError, __version__ as _payi_version
|
|
18
|
+
from payi import Payi, AsyncPayi, APIStatusError, APIConnectionError, __version__ as _payi_version
|
|
19
19
|
from payi.types import IngestUnitsParams
|
|
20
20
|
from payi.lib.helpers import PayiHeaderNames
|
|
21
|
+
from payi.types.shared import XproxyResult
|
|
21
22
|
from payi.types.ingest_response import IngestResponse
|
|
22
23
|
from payi.types.ingest_units_params import Units, ProviderResponseFunctionCall
|
|
24
|
+
from payi.types.shared.xproxy_error import XproxyError
|
|
23
25
|
from payi.types.pay_i_common_models_api_router_header_info_param import PayICommonModelsAPIRouterHeaderInfoParam
|
|
24
26
|
|
|
25
27
|
from .helpers import PayiCategories
|
|
@@ -146,6 +148,19 @@ class PayiInstrumentConfig(TypedDict, total=False):
|
|
|
146
148
|
user_id: Optional[str]
|
|
147
149
|
request_tags: Optional["list[str]"]
|
|
148
150
|
|
|
151
|
+
class PayiContext(TypedDict, total=False):
|
|
152
|
+
use_case_name: Optional[str]
|
|
153
|
+
use_case_id: Optional[str]
|
|
154
|
+
use_case_version: Optional[int]
|
|
155
|
+
use_case_step: Optional[str]
|
|
156
|
+
limit_ids: Optional['list[str]']
|
|
157
|
+
user_id: Optional[str]
|
|
158
|
+
request_tags: Optional["list[str]"]
|
|
159
|
+
price_as_category: Optional[str]
|
|
160
|
+
price_as_resource: Optional[str]
|
|
161
|
+
resource_scope: Optional[str]
|
|
162
|
+
last_result: Optional[Union[XproxyResult, XproxyError]]
|
|
163
|
+
|
|
149
164
|
class _Context(TypedDict, total=False):
|
|
150
165
|
proxy: Optional[bool]
|
|
151
166
|
use_case_name: Optional[str]
|
|
@@ -169,7 +184,7 @@ class _StreamingType(Enum):
|
|
|
169
184
|
iterator = 1
|
|
170
185
|
stream_manager = 2
|
|
171
186
|
|
|
172
|
-
class
|
|
187
|
+
class _InternalTrackContext:
|
|
173
188
|
def __init__(
|
|
174
189
|
self,
|
|
175
190
|
context: _Context,
|
|
@@ -235,6 +250,8 @@ class _PayiInstrumentor:
|
|
|
235
250
|
|
|
236
251
|
self._instrument_inline_data: bool = global_config.get("instrument_inline_data", False)
|
|
237
252
|
|
|
253
|
+
self._last_result: Optional[Union[XproxyResult, XproxyError]] = None
|
|
254
|
+
|
|
238
255
|
global_instrumentation = global_config.pop("global_instrumentation", True)
|
|
239
256
|
|
|
240
257
|
if instruments is None or "*" in instruments:
|
|
@@ -354,7 +371,7 @@ class _PayiInstrumentor:
|
|
|
354
371
|
|
|
355
372
|
return log_ingest_units
|
|
356
373
|
|
|
357
|
-
def _process_ingest_units(self, request: _ProviderRequest, log_data: 'dict[str, str]') ->
|
|
374
|
+
def _process_ingest_units(self, request: _ProviderRequest, log_data: 'dict[str, str]') -> None:
|
|
358
375
|
ingest_units = request._ingest
|
|
359
376
|
|
|
360
377
|
if request._function_call_builder:
|
|
@@ -394,8 +411,6 @@ class _PayiInstrumentor:
|
|
|
394
411
|
if stack_trace is not None:
|
|
395
412
|
log_data["stack_trace"] = stack_trace
|
|
396
413
|
|
|
397
|
-
return True
|
|
398
|
-
|
|
399
414
|
def _process_ingest_units_response(self, ingest_response: IngestResponse) -> None:
|
|
400
415
|
if ingest_response.xproxy_result.limits:
|
|
401
416
|
for limit_id, state in ingest_response.xproxy_result.limits.items():
|
|
@@ -413,7 +428,7 @@ class _PayiInstrumentor:
|
|
|
413
428
|
if removeBlockedId:
|
|
414
429
|
self._blocked_limits.discard(limit_id)
|
|
415
430
|
|
|
416
|
-
def _process_ingest_connection_error(self, e: APIConnectionError, ingest_units: IngestUnitsParams) ->
|
|
431
|
+
def _process_ingest_connection_error(self, e: APIConnectionError, ingest_units: IngestUnitsParams) -> XproxyError:
|
|
417
432
|
now = time.time()
|
|
418
433
|
|
|
419
434
|
if (now - self._api_connection_error_last_log_time) > self._api_connection_error_window:
|
|
@@ -430,7 +445,9 @@ class _PayiInstrumentor:
|
|
|
430
445
|
# Suppress and count
|
|
431
446
|
self._api_connection_error_count += 1
|
|
432
447
|
|
|
433
|
-
|
|
448
|
+
return XproxyError(code="api_connection_error", message=str(e))
|
|
449
|
+
|
|
450
|
+
async def _aingest_units_worker(self, request: _ProviderRequest) -> Optional[Union[XproxyResult, XproxyError]]:
|
|
434
451
|
ingest_response: Optional[IngestResponse] = None
|
|
435
452
|
ingest_units = request._ingest
|
|
436
453
|
|
|
@@ -438,9 +455,8 @@ class _PayiInstrumentor:
|
|
|
438
455
|
|
|
439
456
|
# return early if there are no units to ingest and on a successul ingest request
|
|
440
457
|
log_data: 'dict[str,str]' = {}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
return None
|
|
458
|
+
|
|
459
|
+
self._process_ingest_units(request, log_data)
|
|
444
460
|
|
|
445
461
|
try:
|
|
446
462
|
if self._logger.isEnabledFor(logging.DEBUG):
|
|
@@ -452,7 +468,7 @@ class _PayiInstrumentor:
|
|
|
452
468
|
ingest_response = self._payi.ingest.units(**ingest_units)
|
|
453
469
|
else:
|
|
454
470
|
self._logger.error("No payi instance to ingest units")
|
|
455
|
-
return
|
|
471
|
+
return XproxyError(code="configuration_error", message="No Payi or AsyncPayi instance configured for ingesting units")
|
|
456
472
|
|
|
457
473
|
self._logger.debug(f"_aingest_units: success ({ingest_response})")
|
|
458
474
|
|
|
@@ -463,15 +479,21 @@ class _PayiInstrumentor:
|
|
|
463
479
|
request_id = ingest_response.xproxy_result.request_id
|
|
464
480
|
self._prompt_and_response_logger(request_id, log_data) # type: ignore
|
|
465
481
|
|
|
466
|
-
return ingest_response
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
482
|
+
return ingest_response.xproxy_result
|
|
483
|
+
|
|
484
|
+
except APIConnectionError as api_ex:
|
|
485
|
+
return self._process_ingest_connection_error(api_ex, ingest_units)
|
|
486
|
+
|
|
487
|
+
except APIStatusError as api_status_ex:
|
|
488
|
+
return self._process_api_status_error(api_status_ex)
|
|
489
|
+
|
|
490
|
+
except Exception as ex:
|
|
491
|
+
self._logger.error(f"Error Pay-i async ingesting: exception {ex}, request {ingest_units}")
|
|
492
|
+
return XproxyError(code="unknown_error", message=str(ex))
|
|
474
493
|
|
|
494
|
+
async def _aingest_units(self, request: _ProviderRequest) -> Optional[Union[XproxyResult, XproxyError]]:
|
|
495
|
+
return self.set_xproxy_result(await self._aingest_units_worker(request))
|
|
496
|
+
|
|
475
497
|
def _call_async_use_case_definition_create(self, use_case_name: str, use_case_description: str) -> None:
|
|
476
498
|
if not self._apayi:
|
|
477
499
|
return
|
|
@@ -491,7 +513,7 @@ class _PayiInstrumentor:
|
|
|
491
513
|
except Exception as e:
|
|
492
514
|
self._logger.error(f"Error calling async use_cases.definitions.create synchronously: {e}")
|
|
493
515
|
|
|
494
|
-
def _call_aingest_sync(self, request: _ProviderRequest) -> Optional[
|
|
516
|
+
def _call_aingest_sync(self, request: _ProviderRequest) -> Optional[Union[XproxyResult, XproxyError]]:
|
|
495
517
|
try:
|
|
496
518
|
loop = asyncio.get_running_loop()
|
|
497
519
|
except RuntimeError:
|
|
@@ -500,7 +522,7 @@ class _PayiInstrumentor:
|
|
|
500
522
|
try:
|
|
501
523
|
if loop and loop.is_running():
|
|
502
524
|
nest_asyncio.apply(loop) # type: ignore
|
|
503
|
-
return asyncio.run(self._aingest_units(request))
|
|
525
|
+
return asyncio.run(self._aingest_units(request))
|
|
504
526
|
else:
|
|
505
527
|
# When there's no running loop, create a new one
|
|
506
528
|
return asyncio.run(self._aingest_units(request))
|
|
@@ -508,7 +530,41 @@ class _PayiInstrumentor:
|
|
|
508
530
|
self._logger.error(f"Error calling aingest_units synchronously: {e}")
|
|
509
531
|
return None
|
|
510
532
|
|
|
511
|
-
def
|
|
533
|
+
def _process_api_status_error(self, e: APIStatusError) -> Optional[XproxyError]:
|
|
534
|
+
try:
|
|
535
|
+
body_dict: dict[str, Any] = {}
|
|
536
|
+
|
|
537
|
+
# Try to get the response body as JSON
|
|
538
|
+
body = e.body
|
|
539
|
+
if body is None:
|
|
540
|
+
self._logger.error("APIStatusError response has no body attribute")
|
|
541
|
+
return XproxyError(code="unknown_error", message=str(e))
|
|
542
|
+
|
|
543
|
+
# If body is bytes, decode to string
|
|
544
|
+
if isinstance(body, bytes):
|
|
545
|
+
body = body.decode("utf-8")
|
|
546
|
+
if isinstance(body, dict):
|
|
547
|
+
body_dict = body # type: ignore
|
|
548
|
+
else:
|
|
549
|
+
body = str(body)
|
|
550
|
+
|
|
551
|
+
if not body_dict:
|
|
552
|
+
try:
|
|
553
|
+
body_dict = json.loads(body) # type: ignore
|
|
554
|
+
except Exception as json_ex:
|
|
555
|
+
self._logger.error(f"Failed to parse response body as JSON: {json_ex}")
|
|
556
|
+
return XproxyError(code="invalid_json", message=str(e))
|
|
557
|
+
|
|
558
|
+
xproxy_error = body_dict.get("xproxy_error", {})
|
|
559
|
+
code = xproxy_error.get("code", "unknown_error")
|
|
560
|
+
message = xproxy_error.get("message", str(e))
|
|
561
|
+
return XproxyError(code=code, message=message)
|
|
562
|
+
|
|
563
|
+
except Exception as ex:
|
|
564
|
+
self._logger.error(f"Exception in _process_api_status_error: {ex}")
|
|
565
|
+
return XproxyError(code="exception", message=str(ex))
|
|
566
|
+
|
|
567
|
+
def _ingest_units_worker(self, request: _ProviderRequest) -> Optional[Union[XproxyResult, XproxyError]]:
|
|
512
568
|
ingest_response: Optional[IngestResponse] = None
|
|
513
569
|
ingest_units = request._ingest
|
|
514
570
|
|
|
@@ -516,9 +572,8 @@ class _PayiInstrumentor:
|
|
|
516
572
|
|
|
517
573
|
# return early if there are no units to ingest and on a successul ingest request
|
|
518
574
|
log_data: 'dict[str,str]' = {}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
return None
|
|
575
|
+
|
|
576
|
+
self._process_ingest_units(request, log_data)
|
|
522
577
|
|
|
523
578
|
try:
|
|
524
579
|
if self._payi:
|
|
@@ -534,22 +589,28 @@ class _PayiInstrumentor:
|
|
|
534
589
|
request_id = ingest_response.xproxy_result.request_id
|
|
535
590
|
self._prompt_and_response_logger(request_id, log_data) # type: ignore
|
|
536
591
|
|
|
537
|
-
return ingest_response
|
|
592
|
+
return ingest_response.xproxy_result
|
|
538
593
|
elif self._apayi:
|
|
539
594
|
# task runs async. aingest_units will invoke the callback and post process
|
|
540
|
-
|
|
541
|
-
self._logger.debug(f"_ingest_units: apayi success ({
|
|
542
|
-
return
|
|
595
|
+
sync_response = self._call_aingest_sync(request)
|
|
596
|
+
self._logger.debug(f"_ingest_units: apayi success ({sync_response})")
|
|
597
|
+
return sync_response
|
|
543
598
|
else:
|
|
544
599
|
self._logger.error("No payi instance to ingest units")
|
|
600
|
+
return XproxyError(code="configuration_error", message="No Payi or AsyncPayi instance configured for ingesting units")
|
|
545
601
|
|
|
546
|
-
except
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
602
|
+
except APIConnectionError as api_ex:
|
|
603
|
+
return self._process_ingest_connection_error(api_ex, ingest_units)
|
|
604
|
+
|
|
605
|
+
except APIStatusError as api_status_ex:
|
|
606
|
+
return self._process_api_status_error(api_status_ex)
|
|
607
|
+
|
|
608
|
+
except Exception as ex:
|
|
609
|
+
self._logger.error(f"Error Pay-i async ingesting: exception {ex}, request {ingest_units}")
|
|
610
|
+
return XproxyError(code="unknown_error", message=str(ex))
|
|
551
611
|
|
|
552
|
-
|
|
612
|
+
def _ingest_units(self, request: _ProviderRequest) -> Optional[Union[XproxyResult, XproxyError]]:
|
|
613
|
+
return self.set_xproxy_result(self._ingest_units_worker(request))
|
|
553
614
|
|
|
554
615
|
def _setup_call_func(
|
|
555
616
|
self
|
|
@@ -1040,6 +1101,10 @@ class _PayiInstrumentor:
|
|
|
1040
1101
|
|
|
1041
1102
|
return extra_headers
|
|
1042
1103
|
|
|
1104
|
+
def set_xproxy_result(self, response: Optional[Union[XproxyResult, XproxyError]]) -> Optional[Union[XproxyResult, XproxyError]]:
|
|
1105
|
+
self._last_result = response
|
|
1106
|
+
return response
|
|
1107
|
+
|
|
1043
1108
|
@staticmethod
|
|
1044
1109
|
def _update_extra_headers(
|
|
1045
1110
|
context: _Context,
|
|
@@ -1617,7 +1682,7 @@ def track_context(
|
|
|
1617
1682
|
price_as_resource: Optional[str] = None,
|
|
1618
1683
|
resource_scope: Optional[str] = None,
|
|
1619
1684
|
proxy: Optional[bool] = None,
|
|
1620
|
-
) ->
|
|
1685
|
+
) -> _InternalTrackContext:
|
|
1621
1686
|
# Create a new context for tracking
|
|
1622
1687
|
context: _Context = {}
|
|
1623
1688
|
|
|
@@ -1637,4 +1702,22 @@ def track_context(
|
|
|
1637
1702
|
context["price_as_resource"] = price_as_resource
|
|
1638
1703
|
context["resource_scope"] = resource_scope
|
|
1639
1704
|
|
|
1640
|
-
return
|
|
1705
|
+
return _InternalTrackContext(context)
|
|
1706
|
+
|
|
1707
|
+
def get_context() -> PayiContext:
|
|
1708
|
+
"""
|
|
1709
|
+
Returns the current tracking context from calls to @track and with track_context().
|
|
1710
|
+
If no context is active, returns an empty context.
|
|
1711
|
+
"""
|
|
1712
|
+
if not _instrumentor:
|
|
1713
|
+
return PayiContext()
|
|
1714
|
+
internal_context = _instrumentor.get_context() or {}
|
|
1715
|
+
|
|
1716
|
+
context_dict = {
|
|
1717
|
+
key: value
|
|
1718
|
+
for key, value in internal_context.items()
|
|
1719
|
+
if key in PayiContext.__annotations__ and value is not None
|
|
1720
|
+
}
|
|
1721
|
+
if _instrumentor._last_result:
|
|
1722
|
+
context_dict["last_result"] = _instrumentor._last_result
|
|
1723
|
+
return PayiContext(**dict(context_dict)) # type: ignore
|
|
@@ -11,7 +11,7 @@ payi/_resource.py,sha256=j2jIkTr8OIC8sU6-05nxSaCyj4MaFlbZrwlyg4_xJos,1088
|
|
|
11
11
|
payi/_response.py,sha256=rh9oJAvCKcPwQFm4iqH_iVrmK8bNx--YP_A2a4kN1OU,28776
|
|
12
12
|
payi/_streaming.py,sha256=Z_wIyo206T6Jqh2rolFg2VXZgX24PahLmpURp0-NssU,10092
|
|
13
13
|
payi/_types.py,sha256=7jE5MoQQFVoVxw5vVzvZ2Ao0kcjfNOGsBgyJfLBEnMo,6195
|
|
14
|
-
payi/_version.py,sha256=
|
|
14
|
+
payi/_version.py,sha256=ox8PPHdQJ81G2cAApozsYaqcHPCKCgrcbVajDxPBCJU,165
|
|
15
15
|
payi/pagination.py,sha256=k2356QGPOUSjRF2vHpwLBdF6P-2vnQzFfRIJQAHGQ7A,1258
|
|
16
16
|
payi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
17
|
payi/_utils/__init__.py,sha256=PNZ_QJuzZEgyYXqkO1HVhGkj5IU9bglVUcw7H-Knjzw,2062
|
|
@@ -31,9 +31,9 @@ payi/lib/GoogleGenAiInstrumentor.py,sha256=DLbmlwmyOwooe7FuBkEAO_Z3xjPKpvQyO4VwL
|
|
|
31
31
|
payi/lib/OpenAIInstrumentor.py,sha256=6HENrdN6kLMUwC00wNSdeGeK4fUDBWo2dCbVC9koi0c,22581
|
|
32
32
|
payi/lib/Stopwatch.py,sha256=7OJlxvr2Jyb6Zr1LYCYKczRB7rDVKkIR7gc4YoleNdE,764
|
|
33
33
|
payi/lib/VertexInstrumentor.py,sha256=q-oYr3YuwPc95xYn6KhjvKs5ZweGRg6mOIkxSTz-lic,7081
|
|
34
|
-
payi/lib/VertexRequest.py,sha256=
|
|
34
|
+
payi/lib/VertexRequest.py,sha256=dmL0J2UcYFTEX1m9yoxAbF4cMzHcFiKKKZz7-ltSC88,11521
|
|
35
35
|
payi/lib/helpers.py,sha256=FPzNSSHGf9bgD6CanB7yVx_U8t4lm2c0jlZKrsziYlc,4242
|
|
36
|
-
payi/lib/instrument.py,sha256=
|
|
36
|
+
payi/lib/instrument.py,sha256=SJNh4IPZHMsHr7W9SzJvajYtDz36TR6W1srlAim4IHU,68486
|
|
37
37
|
payi/resources/__init__.py,sha256=B2bn1ZfCf6TbHlzZvy5TpFPtALnFcBRPYVKQH3S5qfQ,2457
|
|
38
38
|
payi/resources/ingest.py,sha256=awE7xDdKOUL2Yhcrhcc11hSNycBlj8QRlahptjana5Q,23040
|
|
39
39
|
payi/resources/categories/__init__.py,sha256=WeotN_d-0Ri8ohsrNPbve7RyViD9_N0NA9DrV3WYg3w,1701
|
|
@@ -132,7 +132,7 @@ payi/types/use_cases/definitions/kpi_retrieve_response.py,sha256=uQXliSvS3k-yDYw
|
|
|
132
132
|
payi/types/use_cases/definitions/kpi_update_params.py,sha256=jbawdWAdMnsTWVH0qfQGb8W7_TXe3lq4zjSRu44d8p8,373
|
|
133
133
|
payi/types/use_cases/definitions/kpi_update_response.py,sha256=zLyEoT0S8d7XHsnXZYT8tM7yDw0Aze0Mk-_Z6QeMtc8,459
|
|
134
134
|
payi/types/use_cases/definitions/limit_config_create_params.py,sha256=pzQza_16N3z8cFNEKr6gPbFvuGFrwNuGxAYb--Kbo2M,449
|
|
135
|
-
payi-0.1.
|
|
136
|
-
payi-0.1.
|
|
137
|
-
payi-0.1.
|
|
138
|
-
payi-0.1.
|
|
135
|
+
payi-0.1.0a97.dist-info/METADATA,sha256=FWpOf7rI_UTcstFDNyRlr6xoYwwVJ7GpWsFkJH9A0dY,16333
|
|
136
|
+
payi-0.1.0a97.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
|
|
137
|
+
payi-0.1.0a97.dist-info/licenses/LICENSE,sha256=CQt03aM-P4a3Yg5qBg3JSLVoQS3smMyvx7tYg_6V7Gk,11334
|
|
138
|
+
payi-0.1.0a97.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|