prompty 0.1.37__py3-none-any.whl → 0.1.39__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 +34 -4
- prompty/core.py +2 -5
- prompty/tracer.py +23 -3
- {prompty-0.1.37.dist-info → prompty-0.1.39.dist-info}/METADATA +1 -1
- {prompty-0.1.37.dist-info → prompty-0.1.39.dist-info}/RECORD +8 -8
- {prompty-0.1.37.dist-info → prompty-0.1.39.dist-info}/WHEEL +0 -0
- {prompty-0.1.37.dist-info → prompty-0.1.39.dist-info}/entry_points.txt +0 -0
- {prompty-0.1.37.dist-info → prompty-0.1.39.dist-info}/licenses/LICENSE +0 -0
prompty/azure/executor.py
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
import json
|
1
2
|
import azure.identity
|
2
3
|
import importlib.metadata
|
3
4
|
from typing import AsyncIterator, Iterator
|
4
|
-
from openai import AzureOpenAI, AsyncAzureOpenAI
|
5
|
+
from openai import APIResponse, AzureOpenAI, AsyncAzureOpenAI
|
5
6
|
|
6
|
-
from prompty.tracer import Tracer
|
7
|
+
from prompty.tracer import Tracer, sanitize
|
7
8
|
from ..core import AsyncPromptyStream, Prompty, PromptyStream
|
9
|
+
from openai.types.chat.chat_completion import ChatCompletion
|
8
10
|
from ..invoker import Invoker, InvokerFactory
|
9
11
|
|
10
12
|
VERSION = importlib.metadata.version("prompty")
|
@@ -86,7 +88,21 @@ class AzureOpenAIExecutor(Invoker):
|
|
86
88
|
**self.parameters,
|
87
89
|
}
|
88
90
|
trace("inputs", args)
|
89
|
-
|
91
|
+
|
92
|
+
if "stream" in args and args["stream"] == True:
|
93
|
+
response = client.chat.completions.create(**args)
|
94
|
+
else:
|
95
|
+
raw: APIResponse = client.chat.completions.with_raw_response.create(
|
96
|
+
**args
|
97
|
+
)
|
98
|
+
response = ChatCompletion.model_validate_json(raw.text)
|
99
|
+
|
100
|
+
for k, v in raw.headers.raw:
|
101
|
+
trace(k.decode("utf-8"), v.decode("utf-8"))
|
102
|
+
|
103
|
+
trace("request_id", raw.request_id)
|
104
|
+
trace("retries_taken", raw.retries_taken)
|
105
|
+
|
90
106
|
trace("result", response)
|
91
107
|
|
92
108
|
elif self.api == "completion":
|
@@ -171,7 +187,20 @@ class AzureOpenAIExecutor(Invoker):
|
|
171
187
|
**self.parameters,
|
172
188
|
}
|
173
189
|
trace("inputs", args)
|
174
|
-
|
190
|
+
|
191
|
+
if "stream" in args and args["stream"] == True:
|
192
|
+
response = await client.chat.completions.create(**args)
|
193
|
+
else:
|
194
|
+
raw: APIResponse = await client.chat.completions.with_raw_response.create(
|
195
|
+
**args
|
196
|
+
)
|
197
|
+
response = ChatCompletion.model_validate_json(raw.text)
|
198
|
+
for k, v in raw.headers.raw:
|
199
|
+
trace(k.decode("utf-8"), v.decode("utf-8"))
|
200
|
+
|
201
|
+
trace("request_id", raw.request_id)
|
202
|
+
trace("retries_taken", raw.retries_taken)
|
203
|
+
|
175
204
|
trace("result", response)
|
176
205
|
|
177
206
|
elif self.api == "completion":
|
@@ -182,6 +211,7 @@ class AzureOpenAIExecutor(Invoker):
|
|
182
211
|
**self.parameters,
|
183
212
|
}
|
184
213
|
trace("inputs", args)
|
214
|
+
|
185
215
|
response = await client.completions.create(**args)
|
186
216
|
trace("result", response)
|
187
217
|
|
prompty/core.py
CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
3
3
|
import os
|
4
4
|
from pathlib import Path
|
5
5
|
|
6
|
-
from .tracer import Tracer, to_dict
|
6
|
+
from .tracer import Tracer, to_dict, sanitize
|
7
7
|
from pydantic import BaseModel, Field, FilePath
|
8
8
|
from typing import AsyncIterator, Iterator, List, Literal, Dict, Callable, Set, Tuple
|
9
9
|
|
@@ -88,10 +88,7 @@ class ModelSettings(BaseModel):
|
|
88
88
|
serialize_as_any=serialize_as_any,
|
89
89
|
)
|
90
90
|
|
91
|
-
d["configuration"] = {
|
92
|
-
k: "*" * len(v) if "key" in k.lower() or "secret" in k.lower() else v
|
93
|
-
for k, v in d["configuration"].items()
|
94
|
-
}
|
91
|
+
d["configuration"] = {k: sanitize(k, v) for k, v in d["configuration"].items()}
|
95
92
|
return d
|
96
93
|
|
97
94
|
|
prompty/tracer.py
CHANGED
@@ -16,9 +16,9 @@ from typing import Any, Callable, Dict, Iterator, List
|
|
16
16
|
# clean up key value pairs for sensitive values
|
17
17
|
def sanitize(key: str, value: Any) -> Any:
|
18
18
|
if isinstance(value, str) and any(
|
19
|
-
[s in key.lower() for s in ["key", "
|
19
|
+
[s in key.lower() for s in ["key", "secret", "password", "credential"]]
|
20
20
|
):
|
21
|
-
return
|
21
|
+
return 10 * "*"
|
22
22
|
elif isinstance(value, dict):
|
23
23
|
return {k: sanitize(k, v) for k, v in value.items()}
|
24
24
|
else:
|
@@ -134,7 +134,17 @@ def _trace_sync(
|
|
134
134
|
@wraps(func)
|
135
135
|
def wrapper(*args, **kwargs):
|
136
136
|
name, signature = _name(func, args)
|
137
|
+
altname: str = None
|
138
|
+
# special case
|
139
|
+
if "name" in okwargs:
|
140
|
+
altname = name
|
141
|
+
name = okwargs["name"]
|
142
|
+
del okwargs["name"]
|
143
|
+
|
137
144
|
with Tracer.start(name) as trace:
|
145
|
+
if altname != None:
|
146
|
+
trace("function", altname)
|
147
|
+
|
138
148
|
trace("signature", signature)
|
139
149
|
|
140
150
|
# support arbitrary keyword
|
@@ -178,10 +188,20 @@ def _trace_async(
|
|
178
188
|
@wraps(func)
|
179
189
|
async def wrapper(*args, **kwargs):
|
180
190
|
name, signature = _name(func, args)
|
191
|
+
altname: str = None
|
192
|
+
# special case
|
193
|
+
if "name" in okwargs:
|
194
|
+
altname = name
|
195
|
+
name = okwargs["name"]
|
196
|
+
del okwargs["name"]
|
197
|
+
|
181
198
|
with Tracer.start(name) as trace:
|
199
|
+
if altname != None:
|
200
|
+
trace("function", altname)
|
201
|
+
|
182
202
|
trace("signature", signature)
|
183
203
|
|
184
|
-
# support arbitrary keyword
|
204
|
+
# support arbitrary keyword
|
185
205
|
# arguments for trace decorator
|
186
206
|
for k, v in okwargs.items():
|
187
207
|
trace(k, to_dict(v))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: prompty
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.39
|
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
|
License: MIT
|
@@ -1,15 +1,15 @@
|
|
1
|
-
prompty-0.1.
|
2
|
-
prompty-0.1.
|
3
|
-
prompty-0.1.
|
4
|
-
prompty-0.1.
|
1
|
+
prompty-0.1.39.dist-info/METADATA,sha256=MIUpA37K8Wo4wUD7xtK6oIeLFJj5uuZT-5rM18LbI5w,9164
|
2
|
+
prompty-0.1.39.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
|
3
|
+
prompty-0.1.39.dist-info/entry_points.txt,sha256=a3i7Kvf--3DOkkv9VQpstwaNKgsnXwDGaPL18lPpKeI,60
|
4
|
+
prompty-0.1.39.dist-info/licenses/LICENSE,sha256=KWSC4z9cfML_t0xThoQYjzTdcZQj86Y_mhXdatzU-KM,1052
|
5
5
|
prompty/__init__.py,sha256=HCAvInBgNcIDO54rR4-RDIF4KUmGVQ2TRam_dS7xHEk,16561
|
6
6
|
prompty/azure/__init__.py,sha256=WI8qeNWfxqggj21bznL-mxGUS-v67bUrunX0Lf2hsI8,295
|
7
|
-
prompty/azure/executor.py,sha256=
|
7
|
+
prompty/azure/executor.py,sha256=LZG0U5AZB4H6CDfZxlsvcUnmq0LnTxMEFgLd9nzHAgc,9126
|
8
8
|
prompty/azure/processor.py,sha256=-CWc_1h4xdb0nyHwUkaI40NtzTxxenCXkgjJTh76AOk,5079
|
9
9
|
prompty/azure_beta/__init__.py,sha256=QF4qcILpsryBLl1nvc1AhRzkKI2uqc6OAU_fA3LISNE,361
|
10
10
|
prompty/azure_beta/executor.py,sha256=PIPfeOTLk9YEM80adktL2zxpa51gO4itlQzUDoq0QVg,9896
|
11
11
|
prompty/cli.py,sha256=k8Rxm41fMFNvmnsX737UiN6v-7756tpoJPN4rPXMNcU,3726
|
12
|
-
prompty/core.py,sha256=
|
12
|
+
prompty/core.py,sha256=haX415_MciCn6K0zU4nZ394ZaJemZe9-iOsdRbe9G6A,12985
|
13
13
|
prompty/invoker.py,sha256=O77E5iQ1552wQXxL8FhZGERbCi_0O3mDTd5Ozqw-O-E,8593
|
14
14
|
prompty/openai/__init__.py,sha256=hbBhgCwB_uSq-1NWL02yiOiNkyi39-G-AyVlTSgKTkU,276
|
15
15
|
prompty/openai/executor.py,sha256=qkFSMA-pWlA1c602Dx5aR1cFEOnYsUUp_E7P3zFhSPs,3644
|
@@ -19,6 +19,6 @@ prompty/renderers.py,sha256=80HNtCp3osgaLfhKxkG4j1kiRhJ727ITzT_yL5JLjEQ,1104
|
|
19
19
|
prompty/serverless/__init__.py,sha256=xoXOTRXO8C631swNKaa-ek5_R3X-87bJpTm0z_Rsg6A,282
|
20
20
|
prompty/serverless/executor.py,sha256=PUDJsYcJLQx9JSTh-R3HdJd0ehEC6w2Ch5OEqz52uVI,8395
|
21
21
|
prompty/serverless/processor.py,sha256=ZSL9y8JC-G4qbtWOSbQAqEcFMWEaLskyOr5VjLthelU,3660
|
22
|
-
prompty/tracer.py,sha256=
|
22
|
+
prompty/tracer.py,sha256=VcrXkM71VO45xWY2b7H2AdCp5bSsCtcAv1m00ycf7XM,11678
|
23
23
|
prompty/utils.py,sha256=jm7HEzOGk3zz8d5aquXK3zWIQWuDpBpJTzlz5sswtdg,2836
|
24
|
-
prompty-0.1.
|
24
|
+
prompty-0.1.39.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|