prompty 0.1.17__py2.py3-none-any.whl → 0.1.19__py2.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.
prompty/azure/executor.py CHANGED
@@ -2,6 +2,8 @@ import azure.identity
2
2
  import importlib.metadata
3
3
  from typing import Iterator
4
4
  from openai import AzureOpenAI
5
+
6
+ from prompty.tracer import Tracer
5
7
  from ..core import Invoker, InvokerFactory, Prompty, PromptyStream
6
8
 
7
9
  VERSION = importlib.metadata.version("prompty")
@@ -14,18 +16,18 @@ class AzureOpenAIExecutor(Invoker):
14
16
 
15
17
  def __init__(self, prompty: Prompty) -> None:
16
18
  super().__init__(prompty)
17
- kwargs = {
19
+ self.kwargs = {
18
20
  key: value
19
21
  for key, value in self.prompty.model.configuration.items()
20
22
  if key != "type"
21
23
  }
22
24
 
23
25
  # no key, use default credentials
24
- if "api_key" not in kwargs:
26
+ if "api_key" not in self.kwargs:
25
27
  # managed identity if client id
26
- if "client_id" in kwargs:
28
+ if "client_id" in self.kwargs:
27
29
  default_credential = azure.identity.ManagedIdentityCredential(
28
- client_id=kwargs.pop("client_id"),
30
+ client_id=self.kwargs.pop("client_id"),
29
31
  )
30
32
  # default credential
31
33
  else:
@@ -33,20 +35,12 @@ class AzureOpenAIExecutor(Invoker):
33
35
  exclude_shared_token_cache_credential=True
34
36
  )
35
37
 
36
- kwargs["azure_ad_token_provider"] = (
38
+ self.kwargs["azure_ad_token_provider"] = (
37
39
  azure.identity.get_bearer_token_provider(
38
40
  default_credential, "https://cognitiveservices.azure.com/.default"
39
41
  )
40
42
  )
41
43
 
42
- self.client = AzureOpenAI(
43
- default_headers={
44
- "User-Agent": f"prompty/{VERSION}",
45
- "x-ms-useragent": f"prompty/{VERSION}",
46
- },
47
- **kwargs,
48
- )
49
-
50
44
  self.api = self.prompty.model.api
51
45
  self.deployment = self.prompty.model.configuration["azure_deployment"]
52
46
  self.parameters = self.prompty.model.parameters
@@ -64,29 +58,60 @@ class AzureOpenAIExecutor(Invoker):
64
58
  any
65
59
  The response from the Azure OpenAI API
66
60
  """
67
- if self.api == "chat":
68
- response = self.client.chat.completions.create(
69
- model=self.deployment,
70
- messages=data if isinstance(data, list) else [data],
71
- **self.parameters,
72
- )
73
61
 
74
- elif self.api == "completion":
75
- response = self.client.completions.create(
76
- prompt=data.item,
77
- model=self.deployment,
78
- **self.parameters,
62
+ with Tracer.start("AzureOpenAI") as trace:
63
+ trace("type", "LLM")
64
+ trace("signature", "AzureOpenAI.ctor")
65
+ trace("description", "Azure OpenAI Constructor")
66
+ trace("inputs", self.kwargs)
67
+ client = AzureOpenAI(
68
+ default_headers={
69
+ "User-Agent": f"prompty/{VERSION}",
70
+ "x-ms-useragent": f"prompty/{VERSION}",
71
+ },
72
+ **self.kwargs,
79
73
  )
74
+ trace("result", client)
80
75
 
81
- elif self.api == "embedding":
82
- response = self.client.embeddings.create(
83
- input=data if isinstance(data, list) else [data],
84
- model=self.deployment,
85
- **self.parameters,
86
- )
76
+ with Tracer.start("create") as trace:
77
+ trace("type", "LLM")
78
+ trace("description", "Azure OpenAI Client")
79
+
80
+ if self.api == "chat":
81
+ trace("signature", "AzureOpenAI.chat.completions.create")
82
+ args = {
83
+ "model": self.deployment,
84
+ "messages": data if isinstance(data, list) else [data],
85
+ **self.parameters,
86
+ }
87
+ trace("inputs", args)
88
+ response = client.chat.completions.create(**args)
89
+ trace("result", response)
90
+
91
+ elif self.api == "completion":
92
+ trace("signature", "AzureOpenAI.completions.create")
93
+ args = {
94
+ "prompt": data.item,
95
+ "model": self.deployment,
96
+ **self.parameters,
97
+ }
98
+ trace("inputs", args)
99
+ response = client.completions.create(**args)
100
+ trace("result", response)
101
+
102
+ elif self.api == "embedding":
103
+ trace("signature", "AzureOpenAI.embeddings.create")
104
+ args = {
105
+ "input": data if isinstance(data, list) else [data],
106
+ "model": self.deployment,
107
+ **self.parameters,
108
+ }
109
+ trace("inputs", args)
110
+ response = client.embeddings.create(**args)
111
+ trace("result", response)
87
112
 
88
- elif self.api == "image":
89
- raise NotImplementedError("Azure OpenAI Image API is not implemented yet")
113
+ elif self.api == "image":
114
+ raise NotImplementedError("Azure OpenAI Image API is not implemented yet")
90
115
 
91
116
  # stream response
92
117
  if isinstance(response, Iterator):
prompty/core.py CHANGED
@@ -529,7 +529,9 @@ class PromptyStream(Iterator):
529
529
  # StopIteration is raised
530
530
  # contents are exhausted
531
531
  if len(self.items) > 0:
532
- with Tracer.start(f"{self.name}.PromptyStream") as trace:
532
+ with Tracer.start("PromptyStream") as trace:
533
+ trace("signature", f"{self.name}.PromptyStream")
534
+ trace("inputs", "None")
533
535
  trace("result", [to_dict(s) for s in self.items])
534
536
 
535
537
  raise StopIteration
@@ -1,6 +1,8 @@
1
1
  import importlib.metadata
2
2
  from openai import OpenAI
3
3
  from typing import Iterator
4
+
5
+ from prompty.tracer import Tracer
4
6
  from ..core import Invoker, InvokerFactory, Prompty, PromptyStream
5
7
 
6
8
  VERSION = importlib.metadata.version("prompty")
@@ -12,20 +14,12 @@ class OpenAIExecutor(Invoker):
12
14
 
13
15
  def __init__(self, prompty: Prompty) -> None:
14
16
  super().__init__(prompty)
15
- kwargs = {
17
+ self.kwargs = {
16
18
  key: value
17
19
  for key, value in self.prompty.model.configuration.items()
18
20
  if key != "type"
19
21
  }
20
22
 
21
- self.client = OpenAI(
22
- default_headers={
23
- "User-Agent": f"prompty/{VERSION}",
24
- "x-ms-useragent": f"prompty/{VERSION}",
25
- },
26
- **kwargs,
27
- )
28
-
29
23
  self.api = self.prompty.model.api
30
24
  self.deployment = self.prompty.model.configuration["azure_deployment"]
31
25
  self.parameters = self.prompty.model.parameters
@@ -43,32 +37,62 @@ class OpenAIExecutor(Invoker):
43
37
  any
44
38
  The response from the OpenAI API
45
39
  """
46
- if self.api == "chat":
47
- response = self.client.chat.completions.create(
48
- model=self.deployment,
49
- messages=data if isinstance(data, list) else [data],
50
- **self.parameters,
40
+ with Tracer.start("OpenAI") as trace:
41
+ trace("type", "LLM")
42
+ trace("signature", "OpenAI.ctor")
43
+ trace("description", "OpenAI Constructor")
44
+ trace("inputs", self.kwargs)
45
+ client = OpenAI(
46
+ default_headers={
47
+ "User-Agent": f"prompty/{VERSION}",
48
+ "x-ms-useragent": f"prompty/{VERSION}",
49
+ },
50
+ **self.kwargs,
51
51
  )
52
+ trace("result", client)
52
53
 
53
- elif self.api == "completion":
54
- response = self.client.completions.create(
55
- prompt=data.item,
56
- model=self.deployment,
57
- **self.parameters,
58
- )
54
+ with Tracer.start("create") as trace:
55
+ trace("type", "LLM")
56
+ trace("description", "OpenAI Prompty Execution Invoker")
59
57
 
60
- elif self.api == "embedding":
61
- response = self.client.embeddings.create(
62
- input=data if isinstance(data, list) else [data],
63
- model=self.deployment,
64
- **self.parameters,
65
- )
58
+ if self.api == "chat":
59
+ trace("signature", "OpenAI.chat.completions.create")
60
+ args = {
61
+ "model": self.deployment,
62
+ "messages": data if isinstance(data, list) else [data],
63
+ **self.parameters,
64
+ }
65
+ trace("inputs", args)
66
+ response = client.chat.completions.create(**args)
67
+
68
+ elif self.api == "completion":
69
+ trace("signature", "OpenAI.completions.create")
70
+ args = {
71
+ "prompt": data.item,
72
+ "model": self.deployment,
73
+ **self.parameters,
74
+ }
75
+ trace("inputs", args)
76
+ response = client.completions.create(**args)
77
+
78
+ elif self.api == "embedding":
79
+ trace("signature", "OpenAI.embeddings.create")
80
+ args = {
81
+ "input": data if isinstance(data, list) else [data],
82
+ "model": self.deployment,
83
+ **self.parameters,
84
+ }
85
+ trace("inputs", args)
86
+ response = client.embeddings.create(**args)
66
87
 
67
- elif self.api == "image":
68
- raise NotImplementedError("OpenAI Image API is not implemented yet")
88
+ elif self.api == "image":
89
+ raise NotImplementedError("OpenAI Image API is not implemented yet")
69
90
 
70
- # stream response
71
- if isinstance(response, Iterator):
72
- return PromptyStream("OpenAIExecutor", response)
73
- else:
74
- return response
91
+ # stream response
92
+ if isinstance(response, Iterator):
93
+ stream = PromptyStream("AzureOpenAIExecutor", response)
94
+ trace("result", stream)
95
+ return stream
96
+ else:
97
+ trace("result", response)
98
+ return response
@@ -9,6 +9,8 @@ from azure.ai.inference.models import (
9
9
  StreamingChatCompletions,
10
10
  AsyncStreamingChatCompletions,
11
11
  )
12
+
13
+ from prompty.tracer import Tracer
12
14
  from ..core import Invoker, InvokerFactory, Prompty, PromptyStream, AsyncPromptyStream
13
15
 
14
16
  VERSION = importlib.metadata.version("prompty")
@@ -29,6 +31,22 @@ class ServerlessExecutor(Invoker):
29
31
  # api type
30
32
  self.api = self.prompty.model.api
31
33
 
34
+ def _response(self, response: any) -> any:
35
+ # stream response
36
+ if isinstance(response, Iterator):
37
+ if isinstance(response, StreamingChatCompletions):
38
+ stream = PromptyStream("ServerlessExecutor", response)
39
+ return stream
40
+ elif isinstance(response, AsyncStreamingChatCompletions):
41
+ stream = AsyncPromptyStream("ServerlessExecutor", response)
42
+ return stream
43
+ else:
44
+ stream = PromptyStream("ServerlessExecutor", response)
45
+
46
+ return stream
47
+ else:
48
+ return response
49
+
32
50
  def invoke(self, data: any) -> any:
33
51
  """Invoke the Serverless SDK
34
52
 
@@ -42,16 +60,38 @@ class ServerlessExecutor(Invoker):
42
60
  any
43
61
  The response from the Serverless SDK
44
62
  """
63
+
64
+ cargs = {
65
+ "endpoint": self.endpoint,
66
+ "credential": AzureKeyCredential(self.key),
67
+ }
68
+
45
69
  if self.api == "chat":
46
- response = ChatCompletionsClient(
47
- endpoint=self.endpoint,
48
- credential=AzureKeyCredential(self.key),
49
- user_agent=f"prompty/{VERSION}"
50
- ).complete(
51
- model=self.model,
52
- messages=data if isinstance(data, list) else [data],
53
- **self.prompty.model.parameters,
54
- )
70
+ with Tracer.start("ChatCompletionsClient") as trace:
71
+ trace("type", "LLM")
72
+ trace("signature", "azure.ai.inference.ChatCompletionsClient.ctor")
73
+ trace("description", "Azure Unified Inference SDK Chat Completions Client")
74
+ trace("inputs", cargs)
75
+ client = ChatCompletionsClient(
76
+ user_agent=f"prompty/{VERSION}",
77
+ **cargs,
78
+ )
79
+ trace("result", client)
80
+
81
+ with Tracer.start("complete") as trace:
82
+ trace("type", "LLM")
83
+ trace("signature", "azure.ai.inference.ChatCompletionsClient.complete")
84
+ trace("description", "Azure Unified Inference SDK Chat Completions Client")
85
+ eargs = {
86
+ "model": self.model,
87
+ "messages": data if isinstance(data, list) else [data],
88
+ **self.prompty.model.parameters,
89
+ }
90
+ trace("inputs", eargs)
91
+ r = client.complete(**eargs)
92
+ trace("result", r)
93
+
94
+ response = self._response(r)
55
95
 
56
96
  elif self.api == "completion":
57
97
  raise NotImplementedError(
@@ -59,26 +99,33 @@ class ServerlessExecutor(Invoker):
59
99
  )
60
100
 
61
101
  elif self.api == "embedding":
62
- response = EmbeddingsClient(
63
- endpoint=self.endpoint,
64
- credential=AzureKeyCredential(self.key),
65
- user_agent=f"prompty/{VERSION}",
66
- ).complete(
67
- model=self.model,
68
- input=data if isinstance(data, list) else [data],
69
- **self.prompty.model.parameters,
70
- )
102
+ with Tracer.start("EmbeddingsClient") as trace:
103
+ trace("type", "LLM")
104
+ trace("signature", "azure.ai.inference.EmbeddingsClient.ctor")
105
+ trace("description", "Azure Unified Inference SDK Embeddings Client")
106
+ trace("inputs", cargs)
107
+ client = EmbeddingsClient(
108
+ user_agent=f"prompty/{VERSION}",
109
+ **cargs,
110
+ )
111
+ trace("result", client)
112
+
113
+ with Tracer.start("complete") as trace:
114
+ trace("type", "LLM")
115
+ trace("signature", "azure.ai.inference.ChatCompletionsClient.complete")
116
+ trace("description", "Azure Unified Inference SDK Chat Completions Client")
117
+ eargs = {
118
+ "model": self.model,
119
+ "input": data if isinstance(data, list) else [data],
120
+ **self.prompty.model.parameters,
121
+ }
122
+ trace("inputs", eargs)
123
+ r = client.complete(**eargs)
124
+ trace("result", r)
125
+
126
+ response = self._response(r)
71
127
 
72
128
  elif self.api == "image":
73
129
  raise NotImplementedError("Azure OpenAI Image API is not implemented yet")
74
130
 
75
- # stream response
76
- if isinstance(response, Iterator):
77
- if isinstance(response, StreamingChatCompletions):
78
- return PromptyStream("ServerlessExecutor", response)
79
- elif isinstance(response, AsyncStreamingChatCompletions):
80
- return AsyncPromptyStream("ServerlessExecutor", response)
81
- return PromptyStream("ServerlessExecutor", response)
82
- else:
83
-
84
- return response
131
+ return response
prompty/tracer.py CHANGED
@@ -11,6 +11,18 @@ from functools import wraps, partial
11
11
  from typing import Any, Callable, Dict, Iterator, List
12
12
 
13
13
 
14
+ # clean up key value pairs for sensitive values
15
+ def sanitize(key: str, value: Any) -> Any:
16
+ if isinstance(value, str) and any(
17
+ [s in key.lower() for s in ["key", "token", "secret", "password", "credential"]]
18
+ ):
19
+ return len(str(value)) * "*"
20
+ elif isinstance(value, dict):
21
+ return {k: sanitize(k, v) for k, v in value.items()}
22
+ else:
23
+ return value
24
+
25
+
14
26
  class Tracer:
15
27
  _tracers: Dict[str, Callable[[str], Iterator[Callable[[str, Any], None]]]] = {}
16
28
 
@@ -31,7 +43,11 @@ class Tracer:
31
43
  traces = [
32
44
  stack.enter_context(tracer(name)) for tracer in cls._tracers.values()
33
45
  ]
34
- yield lambda key, value: [trace(key, value) for trace in traces]
46
+ yield lambda key, value: [
47
+ # normalize and sanitize any trace values
48
+ trace(key, sanitize(key, to_dict(value)))
49
+ for trace in traces
50
+ ]
35
51
 
36
52
 
37
53
  def to_dict(obj: Any) -> Dict[str, Any]:
@@ -94,7 +110,9 @@ def _results(result: Any) -> dict:
94
110
  return to_dict(result) if result is not None else "None"
95
111
 
96
112
 
97
- def _trace_sync(func: Callable = None, *, description: str = None) -> Callable:
113
+ def _trace_sync(
114
+ func: Callable = None, *, description: str = None, type: str = None
115
+ ) -> Callable:
98
116
  description = description or ""
99
117
 
100
118
  @wraps(func)
@@ -105,18 +123,36 @@ def _trace_sync(func: Callable = None, *, description: str = None) -> Callable:
105
123
  if description and description != "":
106
124
  trace("description", description)
107
125
 
126
+ if type and type != "":
127
+ trace("type", type)
128
+
108
129
  inputs = _inputs(func, args, kwargs)
109
130
  trace("inputs", inputs)
110
131
 
111
- result = func(*args, **kwargs)
112
- trace("result", _results(result))
132
+ try:
133
+ result = func(*args, **kwargs)
134
+ trace("result", _results(result))
135
+ except Exception as e:
136
+ trace(
137
+ "result",
138
+ {
139
+ "exception": {
140
+ "type": type(e).__name__,
141
+ "message": str(e),
142
+ "args": to_dict(e.args),
143
+ }
144
+ },
145
+ )
146
+ raise e
113
147
 
114
148
  return result
115
149
 
116
150
  return wrapper
117
151
 
118
152
 
119
- def _trace_async(func: Callable = None, *, description: str = None) -> Callable:
153
+ def _trace_async(
154
+ func: Callable = None, *, description: str = None, type: str = None
155
+ ) -> Callable:
120
156
  description = description or ""
121
157
 
122
158
  @wraps(func)
@@ -127,24 +163,41 @@ def _trace_async(func: Callable = None, *, description: str = None) -> Callable:
127
163
  if description and description != "":
128
164
  trace("description", description)
129
165
 
166
+ if type and type != "":
167
+ trace("type", type)
168
+
130
169
  inputs = _inputs(func, args, kwargs)
131
170
  trace("inputs", inputs)
132
-
133
- result = await func(*args, **kwargs)
134
- trace("result", _results(result))
171
+ try:
172
+ result = await func(*args, **kwargs)
173
+ trace("result", _results(result))
174
+ except Exception as e:
175
+ trace(
176
+ "result",
177
+ {
178
+ "exception": {
179
+ "type": type(e).__name__,
180
+ "message": str(e),
181
+ "args": to_dict(e.args),
182
+ }
183
+ },
184
+ )
185
+ raise e
135
186
 
136
187
  return result
137
188
 
138
189
  return wrapper
139
190
 
140
191
 
141
- def trace(func: Callable = None, *, description: str = None) -> Callable:
192
+ def trace(
193
+ func: Callable = None, *, description: str = None, type: str = None
194
+ ) -> Callable:
142
195
  if func is None:
143
- return partial(trace, description=description)
196
+ return partial(trace, description=description, type=type)
144
197
 
145
198
  wrapped_method = _trace_async if inspect.iscoroutinefunction(func) else _trace_sync
146
199
 
147
- return wrapped_method(func, description=description)
200
+ return wrapped_method(func, description=description, type=type)
148
201
 
149
202
 
150
203
  class PromptyTracer:
@@ -255,6 +308,8 @@ class PromptyTracer:
255
308
  def console_tracer(name: str) -> Iterator[Callable[[str, Any], None]]:
256
309
  try:
257
310
  print(f"Starting {name}")
258
- yield lambda key, value: print(f"{key}:\n{json.dumps(value, indent=4)}")
311
+ yield lambda key, value: print(
312
+ f"{key}:\n{json.dumps(to_dict(value), indent=4)}"
313
+ )
259
314
  finally:
260
315
  print(f"Ending {name}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prompty
3
- Version: 0.1.17
3
+ Version: 0.1.19
4
4
  Summary: Prompty is a new asset class and format for LLM prompts that aims to provide observability, understandability, and portability for developers. It includes spec, tooling, and a runtime. This Prompty runtime supports Python
5
5
  Author-Email: Seth Juarez <seth.juarez@microsoft.com>
6
6
  Requires-Dist: pyyaml>=6.0.1
@@ -1,20 +1,20 @@
1
- prompty-0.1.17.dist-info/METADATA,sha256=Dxi-bayoYlgrg2ldnCK54K5sDT9KXKctpMDRPJ8_0Bw,8916
2
- prompty-0.1.17.dist-info/WHEEL,sha256=CuZGaXTwoRLAOVv0AcE3bCTxO5ejVuBEJkUBe9C-kvk,94
3
- prompty-0.1.17.dist-info/entry_points.txt,sha256=9y1lKPWUpPWRJzUslcVH-gMwbNoa2PzjyoZsKYLQqyw,45
4
- prompty-0.1.17.dist-info/licenses/LICENSE,sha256=KWSC4z9cfML_t0xThoQYjzTdcZQj86Y_mhXdatzU-KM,1052
1
+ prompty-0.1.19.dist-info/METADATA,sha256=PnyGMOsBjZ6U9t76hJ3xQNFUULeE1nr7ef8MWz9SJgA,8916
2
+ prompty-0.1.19.dist-info/WHEEL,sha256=CuZGaXTwoRLAOVv0AcE3bCTxO5ejVuBEJkUBe9C-kvk,94
3
+ prompty-0.1.19.dist-info/entry_points.txt,sha256=9y1lKPWUpPWRJzUslcVH-gMwbNoa2PzjyoZsKYLQqyw,45
4
+ prompty-0.1.19.dist-info/licenses/LICENSE,sha256=KWSC4z9cfML_t0xThoQYjzTdcZQj86Y_mhXdatzU-KM,1052
5
5
  prompty/__init__.py,sha256=XTUgJ3xT7HYJieuWW5PBItey0BWneg3G7iBBjIeNJZU,11628
6
6
  prompty/azure/__init__.py,sha256=ptGajCh68s_tugPv45Y4GJCyBToNFCExUzUh9yIBIfo,292
7
- prompty/azure/executor.py,sha256=x2ng2EbYUxbingjy8w27TFGWezs4QC0LHh_S0F0-E1U,3082
7
+ prompty/azure/executor.py,sha256=M52n_hxxT57-_VdGYK-pXoELT0CDwnJaxN3xNNabgp8,4210
8
8
  prompty/azure/processor.py,sha256=e9CcKG665zvCLPeJfS91FM6c_W_6YY0mVENxinCo19A,2253
9
9
  prompty/cli.py,sha256=k8Rxm41fMFNvmnsX737UiN6v-7756tpoJPN4rPXMNcU,3726
10
- prompty/core.py,sha256=O_Kvj7XjaNG50_mWzpxf5xVOEOWGYBkwBXqPA__5kz0,17126
10
+ prompty/core.py,sha256=VzhOp2tulAKAF0I_5ULlII6QZ0thN1FRtPqPhwDpjPY,17226
11
11
  prompty/openai/__init__.py,sha256=16LxFrG_qGMg_Nx_BTMkCZupPEADsi8Gj234uFiXoZo,273
12
- prompty/openai/executor.py,sha256=5LXME0ACvbX3PSpSfh9ohDGWB50ZYBXLZG238wQiVGc,2212
12
+ prompty/openai/executor.py,sha256=tpX2vkPIJKM4XqEU0KzahgALcR_IBRrY_ca-woST-uc,3314
13
13
  prompty/openai/processor.py,sha256=Cw-_O_r9B5QqiCsfIglI5lcJgKCStkse2iIDbPWxfhg,2169
14
14
  prompty/parsers.py,sha256=4mmIn4SVNs8B0R1BufanqUJk8v4r0OEEo8yx6UOxQpA,4670
15
15
  prompty/renderers.py,sha256=RSHFQFx7AtKLUfsMLCXR0a56Mb7DL1NJNgjUqgg3IqU,776
16
16
  prompty/serverless/__init__.py,sha256=NPqoFATEMQ96G8OQkVcGxUWU4llIQCwxfJePPo8YFY8,279
17
- prompty/serverless/executor.py,sha256=fYCMV01iLBLpH2SQ9nxmrvY9ijAGpZezwkobZwUjSVQ,2781
17
+ prompty/serverless/executor.py,sha256=jbTnYE2aq8oS5PWcZ96NhhjL-gU1a_tlUoB449QqHaY,4648
18
18
  prompty/serverless/processor.py,sha256=pft1XGbPzo0MzQMbAt1VxsLsvRrjQO3B8MXEE2PfSA0,1982
19
- prompty/tracer.py,sha256=dwASxJsVnoUNIKLuBHtZAhD0JctbTCImBP5mjVGCnPo,8809
20
- prompty-0.1.17.dist-info/RECORD,,
19
+ prompty/tracer.py,sha256=dtF7rlJVNkl30m5ZE_9nROGW6Nmm8vGSSWS6p3M3MXI,10436
20
+ prompty-0.1.19.dist-info/RECORD,,