payi 0.1.0a45__py3-none-any.whl → 0.1.0a47__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/OpenAIInstrumentor.py +59 -5
- payi/lib/helpers.py +14 -6
- payi/lib/instrument.py +50 -30
- {payi-0.1.0a45.dist-info → payi-0.1.0a47.dist-info}/METADATA +1 -1
- {payi-0.1.0a45.dist-info → payi-0.1.0a47.dist-info}/RECORD +8 -8
- {payi-0.1.0a45.dist-info → payi-0.1.0a47.dist-info}/WHEEL +0 -0
- {payi-0.1.0a45.dist-info → payi-0.1.0a47.dist-info}/licenses/LICENSE +0 -0
payi/_version.py
CHANGED
payi/lib/OpenAIInstrumentor.py
CHANGED
|
@@ -23,7 +23,7 @@ class OpenAiInstrumentor:
|
|
|
23
23
|
def instrument(instrumentor: PayiInstrumentor) -> None:
|
|
24
24
|
try:
|
|
25
25
|
from openai import OpenAI # type: ignore # noqa: F401 I001
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
wrap_function_wrapper(
|
|
28
28
|
"openai.resources.chat.completions",
|
|
29
29
|
"Completions.create",
|
|
@@ -36,11 +36,63 @@ class OpenAiInstrumentor:
|
|
|
36
36
|
achat_wrapper(instrumentor),
|
|
37
37
|
)
|
|
38
38
|
|
|
39
|
+
wrap_function_wrapper(
|
|
40
|
+
"openai.resources.embeddings",
|
|
41
|
+
"Embeddings.create",
|
|
42
|
+
embeddings_wrapper(instrumentor),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
wrap_function_wrapper(
|
|
46
|
+
"openai.resources.embeddings",
|
|
47
|
+
"AsyncEmbeddings.create",
|
|
48
|
+
aembeddings_wrapper(instrumentor),
|
|
49
|
+
)
|
|
50
|
+
|
|
39
51
|
except Exception as e:
|
|
40
52
|
logging.debug(f"Error instrumenting openai: {e}")
|
|
41
53
|
return
|
|
42
54
|
|
|
43
55
|
|
|
56
|
+
@PayiInstrumentor.payi_wrapper
|
|
57
|
+
def embeddings_wrapper(
|
|
58
|
+
instrumentor: PayiInstrumentor,
|
|
59
|
+
wrapped: Any,
|
|
60
|
+
instance: Any,
|
|
61
|
+
*args: Any,
|
|
62
|
+
**kwargs: Any,
|
|
63
|
+
) -> Any:
|
|
64
|
+
return instrumentor.chat_wrapper(
|
|
65
|
+
"system.openai",
|
|
66
|
+
None, # process_chat_chunk,
|
|
67
|
+
None, # process_chat_request,
|
|
68
|
+
process_ebmeddings_synchronous_response,
|
|
69
|
+
IsStreaming.false,
|
|
70
|
+
wrapped,
|
|
71
|
+
instance,
|
|
72
|
+
args,
|
|
73
|
+
kwargs,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@PayiInstrumentor.payi_wrapper
|
|
77
|
+
async def aembeddings_wrapper(
|
|
78
|
+
instrumentor: PayiInstrumentor,
|
|
79
|
+
wrapped: Any,
|
|
80
|
+
instance: Any,
|
|
81
|
+
*args: Any,
|
|
82
|
+
**kwargs: Any,
|
|
83
|
+
) -> Any:
|
|
84
|
+
return await instrumentor.achat_wrapper(
|
|
85
|
+
"system.openai",
|
|
86
|
+
None, # process_chat_chunk,
|
|
87
|
+
None, # process_chat_request,
|
|
88
|
+
process_ebmeddings_synchronous_response,
|
|
89
|
+
IsStreaming.false,
|
|
90
|
+
wrapped,
|
|
91
|
+
instance,
|
|
92
|
+
args,
|
|
93
|
+
kwargs,
|
|
94
|
+
)
|
|
95
|
+
|
|
44
96
|
@PayiInstrumentor.payi_wrapper
|
|
45
97
|
def chat_wrapper(
|
|
46
98
|
instrumentor: PayiInstrumentor,
|
|
@@ -52,7 +104,7 @@ def chat_wrapper(
|
|
|
52
104
|
return instrumentor.chat_wrapper(
|
|
53
105
|
"system.openai",
|
|
54
106
|
process_chat_chunk,
|
|
55
|
-
|
|
107
|
+
process_chat_request,
|
|
56
108
|
process_chat_synchronous_response,
|
|
57
109
|
IsStreaming.kwargs,
|
|
58
110
|
wrapped,
|
|
@@ -72,7 +124,7 @@ async def achat_wrapper(
|
|
|
72
124
|
return await instrumentor.achat_wrapper(
|
|
73
125
|
"system.openai",
|
|
74
126
|
process_chat_chunk,
|
|
75
|
-
|
|
127
|
+
process_chat_request,
|
|
76
128
|
process_chat_synchronous_response,
|
|
77
129
|
IsStreaming.kwargs,
|
|
78
130
|
wrapped,
|
|
@@ -81,11 +133,13 @@ async def achat_wrapper(
|
|
|
81
133
|
kwargs,
|
|
82
134
|
)
|
|
83
135
|
|
|
136
|
+
def process_ebmeddings_synchronous_response(response: str, ingest: IngestUnitsParams, log_prompt_and_response: bool, **kwargs: Any) -> Any: # noqa: ARG001
|
|
137
|
+
return process_chat_synchronous_response(response, ingest, log_prompt_and_response, **kwargs)
|
|
84
138
|
|
|
85
139
|
def process_chat_synchronous_response(response: str, ingest: IngestUnitsParams, log_prompt_and_response: bool, **kwargs: Any) -> Any: # noqa: ARG001
|
|
86
140
|
response_dict = model_to_dict(response)
|
|
87
141
|
|
|
88
|
-
add_usage_units(response_dict
|
|
142
|
+
add_usage_units(response_dict.get("usage", {}), ingest["units"])
|
|
89
143
|
|
|
90
144
|
if log_prompt_and_response:
|
|
91
145
|
ingest["provider_response_json"] = [json.dumps(response_dict)]
|
|
@@ -136,7 +190,7 @@ def has_image_and_get_texts(encoding: tiktoken.Encoding, content: Union[str, 'li
|
|
|
136
190
|
token_count = sum(len(encoding.encode(item.get("text", ""))) for item in content if item.get("type") == "text")
|
|
137
191
|
return has_image, token_count
|
|
138
192
|
|
|
139
|
-
def
|
|
193
|
+
def process_chat_request(ingest: IngestUnitsParams, *args: Any, **kwargs: Any) -> None: # noqa: ARG001
|
|
140
194
|
messages = kwargs.get("messages")
|
|
141
195
|
if not messages or len(messages) == 0:
|
|
142
196
|
return
|
payi/lib/helpers.py
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
# Step 1: Define the new methods outside of the Payi class definition
|
|
2
1
|
from typing import Dict, List, Union
|
|
3
2
|
|
|
4
3
|
|
|
4
|
+
class PayiHeaderNames:
|
|
5
|
+
limit_ids:str = "xProxy-Limit-IDs"
|
|
6
|
+
request_tags:str = "xProxy-Request-Tags"
|
|
7
|
+
experience_id:str = "xProxy-Experience-ID"
|
|
8
|
+
experience_name:str = "xProxy-Experience-Name"
|
|
9
|
+
user_id:str = "xProxy-User-ID"
|
|
10
|
+
route_as_resource:str = "xProxy-RouteAs-Resource"
|
|
11
|
+
provider_base_uri = "xProxy-Provider-BaseUri"
|
|
12
|
+
|
|
5
13
|
def create_limit_header_from_ids(limit_ids: List[str]) -> Dict[str, str]:
|
|
6
14
|
if not isinstance(limit_ids, list): # type: ignore
|
|
7
15
|
raise TypeError("limit_ids must be a list")
|
|
8
16
|
|
|
9
17
|
valid_ids = [id.strip() for id in limit_ids if isinstance(id, str) and id.strip()] # type: ignore
|
|
10
18
|
|
|
11
|
-
return {
|
|
19
|
+
return { PayiHeaderNames.limit_ids: ",".join(valid_ids) } if valid_ids else {}
|
|
12
20
|
|
|
13
21
|
|
|
14
22
|
def create_request_header_from_tags(request_tags: List[str]) -> Dict[str, str]:
|
|
@@ -17,7 +25,7 @@ def create_request_header_from_tags(request_tags: List[str]) -> Dict[str, str]:
|
|
|
17
25
|
|
|
18
26
|
valid_tags = [tag.strip() for tag in request_tags if isinstance(tag, str) and tag.strip()] # type: ignore
|
|
19
27
|
|
|
20
|
-
return {
|
|
28
|
+
return { PayiHeaderNames.request_tags: ",".join(valid_tags) } if valid_tags else {}
|
|
21
29
|
|
|
22
30
|
|
|
23
31
|
def create_headers(
|
|
@@ -34,10 +42,10 @@ def create_headers(
|
|
|
34
42
|
if request_tags:
|
|
35
43
|
headers.update(create_request_header_from_tags(request_tags))
|
|
36
44
|
if user_id:
|
|
37
|
-
headers.update({
|
|
45
|
+
headers.update({ PayiHeaderNames.user_id: user_id})
|
|
38
46
|
if experience_id:
|
|
39
|
-
headers.update({
|
|
47
|
+
headers.update({ PayiHeaderNames.experience_id: experience_id})
|
|
40
48
|
if experience_name:
|
|
41
|
-
headers.update({
|
|
49
|
+
headers.update({ PayiHeaderNames.experience_name: experience_name})
|
|
42
50
|
|
|
43
51
|
return headers
|
payi/lib/instrument.py
CHANGED
|
@@ -5,13 +5,14 @@ import inspect
|
|
|
5
5
|
import logging
|
|
6
6
|
import traceback
|
|
7
7
|
from enum import Enum
|
|
8
|
-
from typing import Any, Set, Union, Callable, Optional
|
|
8
|
+
from typing import Any, Set, Union, Callable, Optional, TypedDict
|
|
9
9
|
|
|
10
10
|
import nest_asyncio # type: ignore
|
|
11
11
|
from wrapt import ObjectProxy # type: ignore
|
|
12
12
|
|
|
13
13
|
from payi import Payi, AsyncPayi
|
|
14
14
|
from payi.types import IngestUnitsParams
|
|
15
|
+
from payi.lib.helpers import PayiHeaderNames
|
|
15
16
|
from payi.types.ingest_response import IngestResponse
|
|
16
17
|
from payi.types.ingest_units_params import Units
|
|
17
18
|
from payi.types.pay_i_common_models_api_router_header_info_param import PayICommonModelsAPIRouterHeaderInfoParam
|
|
@@ -20,6 +21,14 @@ from .Stopwatch import Stopwatch
|
|
|
20
21
|
from .Instruments import Instruments
|
|
21
22
|
|
|
22
23
|
|
|
24
|
+
class Context(TypedDict, total=False):
|
|
25
|
+
proxy: bool
|
|
26
|
+
experience_name: Optional[str]
|
|
27
|
+
experience_id: Optional[str]
|
|
28
|
+
limit_ids: Optional['list[str]']
|
|
29
|
+
request_tags: Optional['list[str]']
|
|
30
|
+
user_id: Optional[str]
|
|
31
|
+
|
|
23
32
|
class IsStreaming(Enum):
|
|
24
33
|
false = 0
|
|
25
34
|
true = 1
|
|
@@ -40,7 +49,7 @@ class PayiInstrumentor:
|
|
|
40
49
|
):
|
|
41
50
|
self._payi: Optional[Payi] = payi
|
|
42
51
|
self._apayi: Optional[AsyncPayi] = apayi
|
|
43
|
-
self._context_stack: list[
|
|
52
|
+
self._context_stack: list[Context] = [] # Stack of context dictionaries
|
|
44
53
|
self._log_prompt_and_response: bool = log_prompt_and_response
|
|
45
54
|
self._prompt_and_response_logger: Optional[Callable[[str, dict[str, str]], None]] = prompt_and_response_logger
|
|
46
55
|
|
|
@@ -212,22 +221,23 @@ class PayiInstrumentor:
|
|
|
212
221
|
|
|
213
222
|
def _setup_call_func(
|
|
214
223
|
self
|
|
215
|
-
) -> 'tuple[
|
|
224
|
+
) -> 'tuple[Context, Optional[str], Optional[str]]':
|
|
225
|
+
context: Context = {}
|
|
226
|
+
|
|
216
227
|
if len(self._context_stack) > 0:
|
|
217
228
|
# copy current context into the upcoming context
|
|
218
229
|
context = self._context_stack[-1].copy()
|
|
219
|
-
context.pop("proxy"
|
|
220
|
-
previous_experience_name = context
|
|
221
|
-
previous_experience_id = context
|
|
230
|
+
context.pop("proxy")
|
|
231
|
+
previous_experience_name = context.get("experience_name", None)
|
|
232
|
+
previous_experience_id = context.get("experience_id", None)
|
|
222
233
|
else:
|
|
223
|
-
context = {}
|
|
224
234
|
previous_experience_name = None
|
|
225
235
|
previous_experience_id = None
|
|
226
236
|
return (context, previous_experience_name, previous_experience_id)
|
|
227
237
|
|
|
228
238
|
def _init_context(
|
|
229
239
|
self,
|
|
230
|
-
context:
|
|
240
|
+
context: Context,
|
|
231
241
|
previous_experience_name: Optional[str],
|
|
232
242
|
previous_experience_id: Optional[str],
|
|
233
243
|
proxy: bool,
|
|
@@ -329,12 +339,12 @@ class PayiInstrumentor:
|
|
|
329
339
|
if self._context_stack:
|
|
330
340
|
self._context_stack.pop()
|
|
331
341
|
|
|
332
|
-
def set_context(self, context:
|
|
342
|
+
def set_context(self, context: Context) -> None:
|
|
333
343
|
# Update the current top of the stack with the provided context
|
|
334
344
|
if self._context_stack:
|
|
335
345
|
self._context_stack[-1].update(context)
|
|
336
346
|
|
|
337
|
-
def get_context(self) -> Optional[
|
|
347
|
+
def get_context(self) -> Optional[Context]:
|
|
338
348
|
# Return the current top of the stack
|
|
339
349
|
return self._context_stack[-1] if self._context_stack else None
|
|
340
350
|
|
|
@@ -345,11 +355,11 @@ class PayiInstrumentor:
|
|
|
345
355
|
ingest_extra_headers: "dict[str, str]", # do not coflict potential kwargs["extra_headers"]
|
|
346
356
|
**kwargs: Any,
|
|
347
357
|
) -> None:
|
|
348
|
-
limit_ids = ingest_extra_headers.pop(
|
|
349
|
-
request_tags = ingest_extra_headers.pop(
|
|
350
|
-
experience_name = ingest_extra_headers.pop(
|
|
351
|
-
experience_id = ingest_extra_headers.pop(
|
|
352
|
-
user_id = ingest_extra_headers.pop(
|
|
358
|
+
limit_ids = ingest_extra_headers.pop(PayiHeaderNames.limit_ids, None)
|
|
359
|
+
request_tags = ingest_extra_headers.pop(PayiHeaderNames.request_tags, None)
|
|
360
|
+
experience_name = ingest_extra_headers.pop(PayiHeaderNames.experience_name, None)
|
|
361
|
+
experience_id = ingest_extra_headers.pop(PayiHeaderNames.experience_id, None)
|
|
362
|
+
user_id = ingest_extra_headers.pop(PayiHeaderNames.user_id, None)
|
|
353
363
|
|
|
354
364
|
if limit_ids:
|
|
355
365
|
ingest["limit_ids"] = limit_ids.split(",")
|
|
@@ -414,7 +424,7 @@ class PayiInstrumentor:
|
|
|
414
424
|
from .OpenAIInstrumentor import OpenAiInstrumentor # noqa: I001
|
|
415
425
|
|
|
416
426
|
if OpenAiInstrumentor.is_azure(instance):
|
|
417
|
-
resource = extra_headers.pop(
|
|
427
|
+
resource = extra_headers.pop(PayiHeaderNames.route_as_resource, None)
|
|
418
428
|
if not resource:
|
|
419
429
|
logging.error("Azure OpenAI route as resource not found, not ingesting")
|
|
420
430
|
return await wrapped(*args, **kwargs)
|
|
@@ -532,7 +542,7 @@ class PayiInstrumentor:
|
|
|
532
542
|
if category == "system.openai" and instance and hasattr(instance, "_client"):
|
|
533
543
|
from .OpenAIInstrumentor import OpenAiInstrumentor
|
|
534
544
|
if OpenAiInstrumentor.is_azure(instance):
|
|
535
|
-
resource = extra_headers.pop(
|
|
545
|
+
resource = extra_headers.pop(PayiHeaderNames.route_as_resource, None)
|
|
536
546
|
if not resource:
|
|
537
547
|
logging.error("Azure OpenAI route as resource not found, not ingesting")
|
|
538
548
|
return wrapped(*args, **kwargs)
|
|
@@ -614,7 +624,7 @@ class PayiInstrumentor:
|
|
|
614
624
|
|
|
615
625
|
@staticmethod
|
|
616
626
|
def _update_headers(
|
|
617
|
-
context:
|
|
627
|
+
context: Context,
|
|
618
628
|
extra_headers: "dict[str, str]",
|
|
619
629
|
) -> None:
|
|
620
630
|
limit_ids: Optional[list[str]] = context.get("limit_ids")
|
|
@@ -625,38 +635,48 @@ class PayiInstrumentor:
|
|
|
625
635
|
|
|
626
636
|
# Merge limits from the decorator and extra headers
|
|
627
637
|
if limit_ids is not None:
|
|
628
|
-
existing_limit_ids = extra_headers.get(
|
|
638
|
+
existing_limit_ids = extra_headers.get(PayiHeaderNames.limit_ids, None)
|
|
629
639
|
|
|
630
640
|
if not existing_limit_ids:
|
|
631
|
-
extra_headers[
|
|
641
|
+
extra_headers[PayiHeaderNames.limit_ids] = ",".join(limit_ids)
|
|
632
642
|
else:
|
|
633
643
|
existing_ids = existing_limit_ids.split(',')
|
|
634
644
|
combined_ids = list(set(existing_ids + limit_ids))
|
|
635
|
-
extra_headers[
|
|
645
|
+
extra_headers[PayiHeaderNames.limit_ids] = ",".join(combined_ids)
|
|
636
646
|
|
|
637
647
|
# Merge request from the decorator and extra headers
|
|
638
648
|
if request_tags is not None:
|
|
639
|
-
existing_request_tags = extra_headers.get(
|
|
649
|
+
existing_request_tags = extra_headers.get(PayiHeaderNames.request_tags, None)
|
|
640
650
|
|
|
641
651
|
if not existing_request_tags:
|
|
642
|
-
extra_headers[
|
|
652
|
+
extra_headers[PayiHeaderNames.request_tags] = ",".join(request_tags)
|
|
643
653
|
else:
|
|
644
654
|
existing_tags = existing_request_tags.split(',')
|
|
645
655
|
combined_tags = list(set(existing_tags + request_tags))
|
|
646
|
-
extra_headers[
|
|
656
|
+
extra_headers[PayiHeaderNames.request_tags] = ",".join(combined_tags)
|
|
647
657
|
|
|
648
658
|
# inner extra_headers user_id takes precedence over outer decorator user_id
|
|
649
|
-
if user_id is not None and extra_headers.get(
|
|
650
|
-
extra_headers[
|
|
659
|
+
if user_id is not None and extra_headers.get(PayiHeaderNames.user_id, None) is None:
|
|
660
|
+
extra_headers[PayiHeaderNames.user_id] = user_id
|
|
651
661
|
|
|
652
662
|
# inner extra_headers experience_name and experience_id take precedence over outer decorator experience_name and experience_id
|
|
653
663
|
# if either inner value is specified, ignore outer decorator values
|
|
654
|
-
if
|
|
655
|
-
if experience_name is not None:
|
|
656
|
-
extra_headers["xProxy-Experience-Name"] = experience_name
|
|
664
|
+
if PayiHeaderNames.experience_name not in extra_headers and PayiHeaderNames.experience_id not in extra_headers:
|
|
657
665
|
|
|
666
|
+
# use both decorator values
|
|
667
|
+
if experience_name is not None:
|
|
668
|
+
extra_headers[PayiHeaderNames.experience_name] = experience_name
|
|
658
669
|
if experience_id is not None:
|
|
659
|
-
extra_headers[
|
|
670
|
+
extra_headers[PayiHeaderNames.experience_id] = experience_id
|
|
671
|
+
|
|
672
|
+
elif PayiHeaderNames.experience_id in extra_headers and PayiHeaderNames.experience_name not in extra_headers:
|
|
673
|
+
# use the decorator experience name and the inner experience id
|
|
674
|
+
if experience_name is not None:
|
|
675
|
+
extra_headers[PayiHeaderNames.experience_name] = experience_name
|
|
676
|
+
|
|
677
|
+
else:
|
|
678
|
+
# use the inner experience name and id as-is
|
|
679
|
+
...
|
|
660
680
|
|
|
661
681
|
@staticmethod
|
|
662
682
|
def update_for_vision(input: int, units: 'dict[str, Units]') -> int:
|
|
@@ -11,7 +11,7 @@ payi/_resource.py,sha256=j2jIkTr8OIC8sU6-05nxSaCyj4MaFlbZrwlyg4_xJos,1088
|
|
|
11
11
|
payi/_response.py,sha256=CfrNS_3wbL8o9dRyRVfZQ5E1GUlA4CUIUEK8olmfGqE,28777
|
|
12
12
|
payi/_streaming.py,sha256=Z_wIyo206T6Jqh2rolFg2VXZgX24PahLmpURp0-NssU,10092
|
|
13
13
|
payi/_types.py,sha256=2mbMK86K3W1aMTW7sOGQ-VND6-A2IuXKm8p4sYFztBU,6141
|
|
14
|
-
payi/_version.py,sha256=
|
|
14
|
+
payi/_version.py,sha256=N00y7kbKrJJbJK9vgyPPQGaIBsqFwinsS7Hu5oSU3j4,165
|
|
15
15
|
payi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
16
|
payi/_utils/__init__.py,sha256=PNZ_QJuzZEgyYXqkO1HVhGkj5IU9bglVUcw7H-Knjzw,2062
|
|
17
17
|
payi/_utils/_logs.py,sha256=fmnf5D9TOgkgZKfgYmSa3PiUc3SZgkchn6CzJUeo0SQ,768
|
|
@@ -26,10 +26,10 @@ payi/lib/.keep,sha256=wuNrz-5SXo3jJaJOJgz4vFHM41YH_g20F5cRQo0vLes,224
|
|
|
26
26
|
payi/lib/AnthropicInstrumentor.py,sha256=1dJTFs5WfPxbIjWcYV2tP3kiYc4g3WyyyR4XWQ-WI_g,5300
|
|
27
27
|
payi/lib/BedrockInstrumentor.py,sha256=B5deT8TcUvOsRdIewbbHtsxTS7_oHJ05ZUIdFziWf8E,10082
|
|
28
28
|
payi/lib/Instruments.py,sha256=bapmVS9jbHtFknXCKDzsFFWvf5XLtzEpdlvI7iEWY-o,147
|
|
29
|
-
payi/lib/OpenAIInstrumentor.py,sha256=
|
|
29
|
+
payi/lib/OpenAIInstrumentor.py,sha256=rxu5wOUBZaGwFjUoUhk5UDeTcYSmmO6BVgnXL4yYb08,6613
|
|
30
30
|
payi/lib/Stopwatch.py,sha256=7OJlxvr2Jyb6Zr1LYCYKczRB7rDVKkIR7gc4YoleNdE,764
|
|
31
|
-
payi/lib/helpers.py,sha256=
|
|
32
|
-
payi/lib/instrument.py,sha256=
|
|
31
|
+
payi/lib/helpers.py,sha256=RRJ0esC8T-b6n9Bc_WbUHMlucdv_ARhiV3oiAAUg-KU,1915
|
|
32
|
+
payi/lib/instrument.py,sha256=HgKyy7nAWf0X66VuBJtc87J5eokGjnGcm-Hq0IOmgzA,36185
|
|
33
33
|
payi/resources/__init__.py,sha256=isHGXSl9kOrZDduKrX3UenTwrdTpuKJVBjw6NYSBV20,3592
|
|
34
34
|
payi/resources/billing_models.py,sha256=5w3RfGXtGlyq5vbTw6hQrx1UlzRBtlq8ArcFlf5e3TY,20152
|
|
35
35
|
payi/resources/ingest.py,sha256=xdVD0fHGkVpsgqxNTkly_X7UdLyWLNb9_uU8tzWB5Jc,18430
|
|
@@ -113,7 +113,7 @@ payi/types/requests/request_result.py,sha256=phYQiqhwNaR9igP-Fhs34Y-__dlT7L4wq-r
|
|
|
113
113
|
payi/types/shared/__init__.py,sha256=-xz5dxK5LBjLnsi2LpLq5btaGDFp-mSjJ0y2qKy0Yus,264
|
|
114
114
|
payi/types/shared/evaluation_response.py,sha256=ejEToMA57PUu1SldEtJ5z9r4fAO3U0tvdjbsyIoVX1s,214
|
|
115
115
|
payi/types/shared/pay_i_common_models_budget_management_cost_details_base.py,sha256=XmIzJXy4zAi-mfrDvEXiYjO3qF1EvugGUl-Gijj4TA4,268
|
|
116
|
-
payi-0.1.
|
|
117
|
-
payi-0.1.
|
|
118
|
-
payi-0.1.
|
|
119
|
-
payi-0.1.
|
|
116
|
+
payi-0.1.0a47.dist-info/METADATA,sha256=gu1S-z1vRWWMofHT6Qfg2--vi-h5R8aD8g7eAox4-2Y,12660
|
|
117
|
+
payi-0.1.0a47.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
118
|
+
payi-0.1.0a47.dist-info/licenses/LICENSE,sha256=CQt03aM-P4a3Yg5qBg3JSLVoQS3smMyvx7tYg_6V7Gk,11334
|
|
119
|
+
payi-0.1.0a47.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|