vellum-ai 0.8.7__py3-none-any.whl → 0.8.10__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.
- vellum/__init__.py +6 -0
- vellum/client.py +8 -2
- vellum/core/client_wrapper.py +1 -1
- vellum/core/pydantic_utilities.py +58 -22
- vellum/core/serialization.py +124 -40
- vellum/resources/ad_hoc/client.py +6 -2
- vellum/resources/test_suites/client.py +22 -4
- vellum/types/__init__.py +6 -0
- vellum/types/ad_hoc_expand_meta_request.py +5 -1
- vellum/types/price.py +21 -0
- vellum/types/prompt_deployment_expand_meta_request.py +5 -0
- vellum/types/prompt_execution_meta.py +2 -0
- vellum/types/test_suite_run_metric_json_output.py +25 -0
- vellum/types/test_suite_run_metric_output.py +5 -1
- vellum/types/unit_enum.py +5 -0
- {vellum_ai-0.8.7.dist-info → vellum_ai-0.8.10.dist-info}/METADATA +1 -1
- {vellum_ai-0.8.7.dist-info → vellum_ai-0.8.10.dist-info}/RECORD +19 -16
- {vellum_ai-0.8.7.dist-info → vellum_ai-0.8.10.dist-info}/LICENSE +0 -0
- {vellum_ai-0.8.7.dist-info → vellum_ai-0.8.10.dist-info}/WHEEL +0 -0
vellum/__init__.py
CHANGED
@@ -209,6 +209,7 @@ from .types import (
|
|
209
209
|
PdfSearchResultMetaSource,
|
210
210
|
PdfSearchResultMetaSourceRequest,
|
211
211
|
PlainTextPromptBlockRequest,
|
212
|
+
Price,
|
212
213
|
ProcessingFailureReasonEnum,
|
213
214
|
ProcessingStateEnum,
|
214
215
|
PromptBlockRequest,
|
@@ -333,6 +334,7 @@ from .types import (
|
|
333
334
|
TestSuiteRunExternalExecConfigDataRequest,
|
334
335
|
TestSuiteRunExternalExecConfigRequest,
|
335
336
|
TestSuiteRunMetricErrorOutput,
|
337
|
+
TestSuiteRunMetricJsonOutput,
|
336
338
|
TestSuiteRunMetricNumberOutput,
|
337
339
|
TestSuiteRunMetricOutput,
|
338
340
|
TestSuiteRunMetricStringOutput,
|
@@ -362,6 +364,7 @@ from .types import (
|
|
362
364
|
TokenOverlappingWindowChunkerConfigRequest,
|
363
365
|
TokenOverlappingWindowChunking,
|
364
366
|
TokenOverlappingWindowChunkingRequest,
|
367
|
+
UnitEnum,
|
365
368
|
UploadDocumentResponse,
|
366
369
|
UpsertTestSuiteTestCaseRequest,
|
367
370
|
VariablePromptBlockRequest,
|
@@ -651,6 +654,7 @@ __all__ = [
|
|
651
654
|
"PdfSearchResultMetaSource",
|
652
655
|
"PdfSearchResultMetaSourceRequest",
|
653
656
|
"PlainTextPromptBlockRequest",
|
657
|
+
"Price",
|
654
658
|
"ProcessingFailureReasonEnum",
|
655
659
|
"ProcessingStateEnum",
|
656
660
|
"PromptBlockRequest",
|
@@ -775,6 +779,7 @@ __all__ = [
|
|
775
779
|
"TestSuiteRunExternalExecConfigDataRequest",
|
776
780
|
"TestSuiteRunExternalExecConfigRequest",
|
777
781
|
"TestSuiteRunMetricErrorOutput",
|
782
|
+
"TestSuiteRunMetricJsonOutput",
|
778
783
|
"TestSuiteRunMetricNumberOutput",
|
779
784
|
"TestSuiteRunMetricOutput",
|
780
785
|
"TestSuiteRunMetricStringOutput",
|
@@ -804,6 +809,7 @@ __all__ = [
|
|
804
809
|
"TokenOverlappingWindowChunkerConfigRequest",
|
805
810
|
"TokenOverlappingWindowChunking",
|
806
811
|
"TokenOverlappingWindowChunkingRequest",
|
812
|
+
"UnitEnum",
|
807
813
|
"UploadDocumentResponse",
|
808
814
|
"UpsertTestSuiteTestCaseRequest",
|
809
815
|
"VariablePromptBlockRequest",
|
vellum/client.py
CHANGED
@@ -344,6 +344,7 @@ class Vellum:
|
|
344
344
|
expand_meta=PromptDeploymentExpandMetaRequest(
|
345
345
|
model_name=True,
|
346
346
|
usage=True,
|
347
|
+
cost=True,
|
347
348
|
finish_reason=True,
|
348
349
|
latency=True,
|
349
350
|
deployment_release_tag=True,
|
@@ -891,7 +892,9 @@ class Vellum:
|
|
891
892
|
ChatMessageRequest(
|
892
893
|
text="string",
|
893
894
|
role="SYSTEM",
|
894
|
-
content=StringChatMessageContentRequest(
|
895
|
+
content=StringChatMessageContentRequest(
|
896
|
+
value="string",
|
897
|
+
),
|
895
898
|
source="string",
|
896
899
|
)
|
897
900
|
],
|
@@ -1535,6 +1538,7 @@ class AsyncVellum:
|
|
1535
1538
|
expand_meta=PromptDeploymentExpandMetaRequest(
|
1536
1539
|
model_name=True,
|
1537
1540
|
usage=True,
|
1541
|
+
cost=True,
|
1538
1542
|
finish_reason=True,
|
1539
1543
|
latency=True,
|
1540
1544
|
deployment_release_tag=True,
|
@@ -2114,7 +2118,9 @@ class AsyncVellum:
|
|
2114
2118
|
ChatMessageRequest(
|
2115
2119
|
text="string",
|
2116
2120
|
role="SYSTEM",
|
2117
|
-
content=StringChatMessageContentRequest(
|
2121
|
+
content=StringChatMessageContentRequest(
|
2122
|
+
value="string",
|
2123
|
+
),
|
2118
2124
|
source="string",
|
2119
2125
|
)
|
2120
2126
|
],
|
vellum/core/client_wrapper.py
CHANGED
@@ -17,7 +17,7 @@ class BaseClientWrapper:
|
|
17
17
|
headers: typing.Dict[str, str] = {
|
18
18
|
"X-Fern-Language": "Python",
|
19
19
|
"X-Fern-SDK-Name": "vellum-ai",
|
20
|
-
"X-Fern-SDK-Version": "0.8.
|
20
|
+
"X-Fern-SDK-Version": "0.8.10",
|
21
21
|
}
|
22
22
|
headers["X_API_KEY"] = self.api_key
|
23
23
|
return headers
|
@@ -80,6 +80,8 @@ class UniversalBaseModel(pydantic.BaseModel):
|
|
80
80
|
smart_union = True
|
81
81
|
allow_population_by_field_name = True
|
82
82
|
json_encoders = {dt.datetime: serialize_datetime}
|
83
|
+
# Allow fields begining with `model_` to be used in the model
|
84
|
+
protected_namespaces = ()
|
83
85
|
|
84
86
|
def json(self, **kwargs: typing.Any) -> str:
|
85
87
|
kwargs_with_defaults: typing.Any = {
|
@@ -97,30 +99,64 @@ class UniversalBaseModel(pydantic.BaseModel):
|
|
97
99
|
Override the default dict method to `exclude_unset` by default. This function patches
|
98
100
|
`exclude_unset` to work include fields within non-None default values.
|
99
101
|
"""
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
for
|
104
|
-
|
105
|
-
default = _get_field_default(field)
|
106
|
-
|
107
|
-
# If the default values are non-null act like they've been set
|
108
|
-
# This effectively allows exclude_unset to work like exclude_none where
|
109
|
-
# the latter passes through intentionally set none values.
|
110
|
-
if default != None:
|
111
|
-
_fields_set.add(name)
|
112
|
-
|
113
|
-
kwargs_with_defaults_exclude_unset: typing.Any = {
|
114
|
-
"by_alias": True,
|
115
|
-
"exclude_unset": True,
|
116
|
-
"include": _fields_set,
|
117
|
-
**kwargs,
|
118
|
-
}
|
119
|
-
|
102
|
+
# Note: the logic here is multi-plexed given the levers exposed in Pydantic V1 vs V2
|
103
|
+
# Pydantic V1's .dict can be extremely slow, so we do not want to call it twice.
|
104
|
+
#
|
105
|
+
# We'd ideally do the same for Pydantic V2, but it shells out to a library to serialize models
|
106
|
+
# that we have less control over, and this is less intrusive than custom serializers for now.
|
120
107
|
if IS_PYDANTIC_V2:
|
121
|
-
|
108
|
+
kwargs_with_defaults_exclude_unset: typing.Any = {
|
109
|
+
**kwargs,
|
110
|
+
"by_alias": True,
|
111
|
+
"exclude_unset": True,
|
112
|
+
"exclude_none": False,
|
113
|
+
}
|
114
|
+
kwargs_with_defaults_exclude_none: typing.Any = {
|
115
|
+
**kwargs,
|
116
|
+
"by_alias": True,
|
117
|
+
"exclude_none": True,
|
118
|
+
"exclude_unset": False,
|
119
|
+
}
|
120
|
+
return deep_union_pydantic_dicts(
|
121
|
+
super().model_dump(**kwargs_with_defaults_exclude_unset), # type: ignore # Pydantic v2
|
122
|
+
super().model_dump(**kwargs_with_defaults_exclude_none), # type: ignore # Pydantic v2
|
123
|
+
)
|
124
|
+
|
122
125
|
else:
|
123
|
-
|
126
|
+
_fields_set = self.__fields_set__
|
127
|
+
|
128
|
+
fields = _get_model_fields(self.__class__)
|
129
|
+
for name, field in fields.items():
|
130
|
+
if name not in _fields_set:
|
131
|
+
default = _get_field_default(field)
|
132
|
+
|
133
|
+
# If the default values are non-null act like they've been set
|
134
|
+
# This effectively allows exclude_unset to work like exclude_none where
|
135
|
+
# the latter passes through intentionally set none values.
|
136
|
+
if default != None:
|
137
|
+
_fields_set.add(name)
|
138
|
+
|
139
|
+
kwargs_with_defaults_exclude_unset_include_fields: typing.Any = {
|
140
|
+
"by_alias": True,
|
141
|
+
"exclude_unset": True,
|
142
|
+
"include": _fields_set,
|
143
|
+
**kwargs,
|
144
|
+
}
|
145
|
+
|
146
|
+
return super().dict(**kwargs_with_defaults_exclude_unset_include_fields)
|
147
|
+
|
148
|
+
|
149
|
+
def deep_union_pydantic_dicts(
|
150
|
+
source: typing.Dict[str, typing.Any], destination: typing.Dict[str, typing.Any]
|
151
|
+
) -> typing.Dict[str, typing.Any]:
|
152
|
+
for key, value in source.items():
|
153
|
+
if isinstance(value, dict):
|
154
|
+
node = destination.setdefault(key, {})
|
155
|
+
deep_union_pydantic_dicts(value, node)
|
156
|
+
else:
|
157
|
+
destination[key] = value
|
158
|
+
|
159
|
+
return destination
|
124
160
|
|
125
161
|
|
126
162
|
if IS_PYDANTIC_V2:
|
vellum/core/serialization.py
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# This file was auto-generated by Fern from our API Definition.
|
2
2
|
|
3
3
|
import collections
|
4
|
+
import inspect
|
4
5
|
import typing
|
5
6
|
|
6
7
|
import typing_extensions
|
7
8
|
|
9
|
+
import pydantic
|
10
|
+
|
8
11
|
|
9
12
|
class FieldMetadata:
|
10
13
|
"""
|
@@ -29,6 +32,7 @@ def convert_and_respect_annotation_metadata(
|
|
29
32
|
object_: typing.Any,
|
30
33
|
annotation: typing.Any,
|
31
34
|
inner_type: typing.Optional[typing.Any] = None,
|
35
|
+
direction: typing.Literal["read", "write"],
|
32
36
|
) -> typing.Any:
|
33
37
|
"""
|
34
38
|
Respect the metadata annotations on a field, such as aliasing. This function effectively
|
@@ -56,44 +60,59 @@ def convert_and_respect_annotation_metadata(
|
|
56
60
|
inner_type = annotation
|
57
61
|
|
58
62
|
clean_type = _remove_annotations(inner_type)
|
59
|
-
|
60
|
-
return _convert_typeddict(object_, clean_type)
|
61
|
-
|
63
|
+
# Pydantic models
|
62
64
|
if (
|
63
|
-
|
64
|
-
|
65
|
-
and (
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
inspect.isclass(clean_type)
|
66
|
+
and issubclass(clean_type, pydantic.BaseModel)
|
67
|
+
and isinstance(object_, typing.Mapping)
|
68
|
+
):
|
69
|
+
return _convert_mapping(object_, clean_type, direction)
|
70
|
+
# TypedDicts
|
71
|
+
if typing_extensions.is_typeddict(clean_type) and isinstance(object_, typing.Mapping):
|
72
|
+
return _convert_mapping(object_, clean_type, direction)
|
73
|
+
|
74
|
+
# If you're iterating on a string, do not bother to coerce it to a sequence.
|
75
|
+
if not isinstance(object_, str):
|
76
|
+
if (
|
77
|
+
typing_extensions.get_origin(clean_type) == typing.Set
|
78
|
+
or typing_extensions.get_origin(clean_type) == set
|
79
|
+
or clean_type == typing.Set
|
80
|
+
) and isinstance(object_, typing.Set):
|
81
|
+
inner_type = typing_extensions.get_args(clean_type)[0]
|
82
|
+
return {
|
83
|
+
convert_and_respect_annotation_metadata(
|
84
|
+
object_=item,
|
85
|
+
annotation=annotation,
|
86
|
+
inner_type=inner_type,
|
87
|
+
direction=direction,
|
71
88
|
)
|
72
|
-
|
89
|
+
for item in object_
|
90
|
+
}
|
91
|
+
elif (
|
92
|
+
(
|
93
|
+
typing_extensions.get_origin(clean_type) == typing.List
|
94
|
+
or typing_extensions.get_origin(clean_type) == list
|
95
|
+
or clean_type == typing.List
|
73
96
|
)
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
and isinstance(object_, typing.Set)
|
97
|
+
and isinstance(object_, typing.List)
|
98
|
+
) or (
|
99
|
+
(
|
100
|
+
typing_extensions.get_origin(clean_type) == typing.Sequence
|
101
|
+
or typing_extensions.get_origin(clean_type) == collections.abc.Sequence
|
102
|
+
or clean_type == typing.Sequence
|
81
103
|
)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
104
|
+
and isinstance(object_, typing.Sequence)
|
105
|
+
):
|
106
|
+
inner_type = typing_extensions.get_args(clean_type)[0]
|
107
|
+
return [
|
108
|
+
convert_and_respect_annotation_metadata(
|
109
|
+
object_=item,
|
110
|
+
annotation=annotation,
|
111
|
+
inner_type=inner_type,
|
112
|
+
direction=direction,
|
87
113
|
)
|
88
|
-
|
89
|
-
|
90
|
-
)
|
91
|
-
):
|
92
|
-
inner_type = typing_extensions.get_args(clean_type)[0]
|
93
|
-
return [
|
94
|
-
convert_and_respect_annotation_metadata(object_=item, annotation=annotation, inner_type=inner_type)
|
95
|
-
for item in object_
|
96
|
-
]
|
114
|
+
for item in object_
|
115
|
+
]
|
97
116
|
|
98
117
|
if typing_extensions.get_origin(clean_type) == typing.Union:
|
99
118
|
# We should be able to ~relatively~ safely try to convert keys against all
|
@@ -101,7 +120,12 @@ def convert_and_respect_annotation_metadata(
|
|
101
120
|
# of the same name to a different name from another member
|
102
121
|
# Or if another member aliases a field of the same name that another member does not.
|
103
122
|
for member in typing_extensions.get_args(clean_type):
|
104
|
-
object_ = convert_and_respect_annotation_metadata(
|
123
|
+
object_ = convert_and_respect_annotation_metadata(
|
124
|
+
object_=object_,
|
125
|
+
annotation=annotation,
|
126
|
+
inner_type=member,
|
127
|
+
direction=direction,
|
128
|
+
)
|
105
129
|
return object_
|
106
130
|
|
107
131
|
annotated_type = _get_annotation(annotation)
|
@@ -113,16 +137,34 @@ def convert_and_respect_annotation_metadata(
|
|
113
137
|
return object_
|
114
138
|
|
115
139
|
|
116
|
-
def
|
140
|
+
def _convert_mapping(
|
141
|
+
object_: typing.Mapping[str, object],
|
142
|
+
expected_type: typing.Any,
|
143
|
+
direction: typing.Literal["read", "write"],
|
144
|
+
) -> typing.Mapping[str, object]:
|
117
145
|
converted_object: typing.Dict[str, object] = {}
|
118
146
|
annotations = typing_extensions.get_type_hints(expected_type, include_extras=True)
|
147
|
+
aliases_to_field_names = _get_alias_to_field_name(annotations)
|
119
148
|
for key, value in object_.items():
|
120
|
-
|
149
|
+
if direction == "read" and key in aliases_to_field_names:
|
150
|
+
dealiased_key = aliases_to_field_names.get(key)
|
151
|
+
if dealiased_key is not None:
|
152
|
+
type_ = annotations.get(dealiased_key)
|
153
|
+
else:
|
154
|
+
type_ = annotations.get(key)
|
155
|
+
# Note you can't get the annotation by the field name if you're in read mode, so you must check the aliases map
|
156
|
+
#
|
157
|
+
# So this is effectively saying if we're in write mode, and we don't have a type, or if we're in read mode and we don't have an alias
|
158
|
+
# then we can just pass the value through as is
|
121
159
|
if type_ is None:
|
122
160
|
converted_object[key] = value
|
161
|
+
elif direction == "read" and key not in aliases_to_field_names:
|
162
|
+
converted_object[key] = convert_and_respect_annotation_metadata(
|
163
|
+
object_=value, annotation=type_, direction=direction
|
164
|
+
)
|
123
165
|
else:
|
124
|
-
converted_object[_alias_key(key, type_)] =
|
125
|
-
object_=value, annotation=type_
|
166
|
+
converted_object[_alias_key(key, type_, direction, aliases_to_field_names)] = (
|
167
|
+
convert_and_respect_annotation_metadata(object_=value, annotation=type_, direction=direction)
|
126
168
|
)
|
127
169
|
return converted_object
|
128
170
|
|
@@ -156,7 +198,39 @@ def _remove_annotations(type_: typing.Any) -> typing.Any:
|
|
156
198
|
return type_
|
157
199
|
|
158
200
|
|
159
|
-
def
|
201
|
+
def get_alias_to_field_mapping(type_: typing.Any) -> typing.Dict[str, str]:
|
202
|
+
annotations = typing_extensions.get_type_hints(type_, include_extras=True)
|
203
|
+
return _get_alias_to_field_name(annotations)
|
204
|
+
|
205
|
+
|
206
|
+
def get_field_to_alias_mapping(type_: typing.Any) -> typing.Dict[str, str]:
|
207
|
+
annotations = typing_extensions.get_type_hints(type_, include_extras=True)
|
208
|
+
return _get_field_to_alias_name(annotations)
|
209
|
+
|
210
|
+
|
211
|
+
def _get_alias_to_field_name(
|
212
|
+
field_to_hint: typing.Dict[str, typing.Any],
|
213
|
+
) -> typing.Dict[str, str]:
|
214
|
+
aliases = {}
|
215
|
+
for field, hint in field_to_hint.items():
|
216
|
+
maybe_alias = _get_alias_from_type(hint)
|
217
|
+
if maybe_alias is not None:
|
218
|
+
aliases[maybe_alias] = field
|
219
|
+
return aliases
|
220
|
+
|
221
|
+
|
222
|
+
def _get_field_to_alias_name(
|
223
|
+
field_to_hint: typing.Dict[str, typing.Any],
|
224
|
+
) -> typing.Dict[str, str]:
|
225
|
+
aliases = {}
|
226
|
+
for field, hint in field_to_hint.items():
|
227
|
+
maybe_alias = _get_alias_from_type(hint)
|
228
|
+
if maybe_alias is not None:
|
229
|
+
aliases[field] = maybe_alias
|
230
|
+
return aliases
|
231
|
+
|
232
|
+
|
233
|
+
def _get_alias_from_type(type_: typing.Any) -> typing.Optional[str]:
|
160
234
|
maybe_annotated_type = _get_annotation(type_)
|
161
235
|
|
162
236
|
if maybe_annotated_type is not None:
|
@@ -166,5 +240,15 @@ def _alias_key(key: str, type_: typing.Any) -> str:
|
|
166
240
|
for annotation in annotations:
|
167
241
|
if isinstance(annotation, FieldMetadata) and annotation.alias is not None:
|
168
242
|
return annotation.alias
|
243
|
+
return None
|
244
|
+
|
169
245
|
|
170
|
-
|
246
|
+
def _alias_key(
|
247
|
+
key: str,
|
248
|
+
type_: typing.Any,
|
249
|
+
direction: typing.Literal["read", "write"],
|
250
|
+
aliases_to_field_names: typing.Dict[str, str],
|
251
|
+
) -> str:
|
252
|
+
if direction == "read":
|
253
|
+
return aliases_to_field_names.get(key, key)
|
254
|
+
return _get_alias_from_type(type_=type_) or key
|
@@ -112,7 +112,9 @@ class AdHocClient:
|
|
112
112
|
),
|
113
113
|
id="string",
|
114
114
|
state="ENABLED",
|
115
|
-
cache_config=EphemeralPromptCacheConfigRequest(
|
115
|
+
cache_config=EphemeralPromptCacheConfigRequest(
|
116
|
+
type={"key": "value"},
|
117
|
+
),
|
116
118
|
)
|
117
119
|
],
|
118
120
|
expand_meta=AdHocExpandMetaRequest(
|
@@ -288,7 +290,9 @@ class AsyncAdHocClient:
|
|
288
290
|
),
|
289
291
|
id="string",
|
290
292
|
state="ENABLED",
|
291
|
-
cache_config=EphemeralPromptCacheConfigRequest(
|
293
|
+
cache_config=EphemeralPromptCacheConfigRequest(
|
294
|
+
type={"key": "value"},
|
295
|
+
),
|
292
296
|
)
|
293
297
|
],
|
294
298
|
expand_meta=AdHocExpandMetaRequest(
|
@@ -229,8 +229,18 @@ class TestSuitesClient:
|
|
229
229
|
id="string",
|
230
230
|
data=CreateTestSuiteTestCaseRequest(
|
231
231
|
label="string",
|
232
|
-
input_values=[
|
233
|
-
|
232
|
+
input_values=[
|
233
|
+
NamedTestCaseStringVariableValueRequest(
|
234
|
+
value="string",
|
235
|
+
name="string",
|
236
|
+
)
|
237
|
+
],
|
238
|
+
evaluation_values=[
|
239
|
+
NamedTestCaseStringVariableValueRequest(
|
240
|
+
value="string",
|
241
|
+
name="string",
|
242
|
+
)
|
243
|
+
],
|
234
244
|
external_id="string",
|
235
245
|
),
|
236
246
|
)
|
@@ -548,9 +558,17 @@ class AsyncTestSuitesClient:
|
|
548
558
|
id="string",
|
549
559
|
data=CreateTestSuiteTestCaseRequest(
|
550
560
|
label="string",
|
551
|
-
input_values=[
|
561
|
+
input_values=[
|
562
|
+
NamedTestCaseStringVariableValueRequest(
|
563
|
+
value="string",
|
564
|
+
name="string",
|
565
|
+
)
|
566
|
+
],
|
552
567
|
evaluation_values=[
|
553
|
-
NamedTestCaseStringVariableValueRequest(
|
568
|
+
NamedTestCaseStringVariableValueRequest(
|
569
|
+
value="string",
|
570
|
+
name="string",
|
571
|
+
)
|
554
572
|
],
|
555
573
|
external_id="string",
|
556
574
|
),
|
vellum/types/__init__.py
CHANGED
@@ -216,6 +216,7 @@ from .paginated_test_suite_test_case_list import PaginatedTestSuiteTestCaseList
|
|
216
216
|
from .pdf_search_result_meta_source import PdfSearchResultMetaSource
|
217
217
|
from .pdf_search_result_meta_source_request import PdfSearchResultMetaSourceRequest
|
218
218
|
from .plain_text_prompt_block_request import PlainTextPromptBlockRequest
|
219
|
+
from .price import Price
|
219
220
|
from .processing_failure_reason_enum import ProcessingFailureReasonEnum
|
220
221
|
from .processing_state_enum import ProcessingStateEnum
|
221
222
|
from .prompt_block_request import PromptBlockRequest
|
@@ -342,6 +343,7 @@ from .test_suite_run_external_exec_config_data import TestSuiteRunExternalExecCo
|
|
342
343
|
from .test_suite_run_external_exec_config_data_request import TestSuiteRunExternalExecConfigDataRequest
|
343
344
|
from .test_suite_run_external_exec_config_request import TestSuiteRunExternalExecConfigRequest
|
344
345
|
from .test_suite_run_metric_error_output import TestSuiteRunMetricErrorOutput
|
346
|
+
from .test_suite_run_metric_json_output import TestSuiteRunMetricJsonOutput
|
345
347
|
from .test_suite_run_metric_number_output import TestSuiteRunMetricNumberOutput
|
346
348
|
from .test_suite_run_metric_output import TestSuiteRunMetricOutput
|
347
349
|
from .test_suite_run_metric_string_output import TestSuiteRunMetricStringOutput
|
@@ -373,6 +375,7 @@ from .token_overlapping_window_chunker_config import TokenOverlappingWindowChunk
|
|
373
375
|
from .token_overlapping_window_chunker_config_request import TokenOverlappingWindowChunkerConfigRequest
|
374
376
|
from .token_overlapping_window_chunking import TokenOverlappingWindowChunking
|
375
377
|
from .token_overlapping_window_chunking_request import TokenOverlappingWindowChunkingRequest
|
378
|
+
from .unit_enum import UnitEnum
|
376
379
|
from .upload_document_response import UploadDocumentResponse
|
377
380
|
from .upsert_test_suite_test_case_request import UpsertTestSuiteTestCaseRequest
|
378
381
|
from .variable_prompt_block_request import VariablePromptBlockRequest
|
@@ -635,6 +638,7 @@ __all__ = [
|
|
635
638
|
"PdfSearchResultMetaSource",
|
636
639
|
"PdfSearchResultMetaSourceRequest",
|
637
640
|
"PlainTextPromptBlockRequest",
|
641
|
+
"Price",
|
638
642
|
"ProcessingFailureReasonEnum",
|
639
643
|
"ProcessingStateEnum",
|
640
644
|
"PromptBlockRequest",
|
@@ -759,6 +763,7 @@ __all__ = [
|
|
759
763
|
"TestSuiteRunExternalExecConfigDataRequest",
|
760
764
|
"TestSuiteRunExternalExecConfigRequest",
|
761
765
|
"TestSuiteRunMetricErrorOutput",
|
766
|
+
"TestSuiteRunMetricJsonOutput",
|
762
767
|
"TestSuiteRunMetricNumberOutput",
|
763
768
|
"TestSuiteRunMetricOutput",
|
764
769
|
"TestSuiteRunMetricStringOutput",
|
@@ -788,6 +793,7 @@ __all__ = [
|
|
788
793
|
"TokenOverlappingWindowChunkerConfigRequest",
|
789
794
|
"TokenOverlappingWindowChunking",
|
790
795
|
"TokenOverlappingWindowChunkingRequest",
|
796
|
+
"UnitEnum",
|
791
797
|
"UploadDocumentResponse",
|
792
798
|
"UpsertTestSuiteTestCaseRequest",
|
793
799
|
"VariablePromptBlockRequest",
|
@@ -7,7 +7,11 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
|
7
7
|
|
8
8
|
|
9
9
|
class AdHocExpandMetaRequest(UniversalBaseModel):
|
10
|
-
cost: typing.Optional[bool] = None
|
10
|
+
cost: typing.Optional[bool] = pydantic.Field(default=None)
|
11
|
+
"""
|
12
|
+
If enabled, the response will include model host cost tracking. This may increase latency for some model hosts.
|
13
|
+
"""
|
14
|
+
|
11
15
|
model_name: typing.Optional[bool] = pydantic.Field(default=None)
|
12
16
|
"""
|
13
17
|
If enabled, the response will include the model identifier representing the ML Model invoked by the Prompt.
|
vellum/types/price.py
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
2
|
+
|
3
|
+
from ..core.pydantic_utilities import UniversalBaseModel
|
4
|
+
from .unit_enum import UnitEnum
|
5
|
+
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
6
|
+
import typing
|
7
|
+
import pydantic
|
8
|
+
|
9
|
+
|
10
|
+
class Price(UniversalBaseModel):
|
11
|
+
value: float
|
12
|
+
unit: UnitEnum = "USD"
|
13
|
+
|
14
|
+
if IS_PYDANTIC_V2:
|
15
|
+
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
16
|
+
else:
|
17
|
+
|
18
|
+
class Config:
|
19
|
+
frozen = True
|
20
|
+
smart_union = True
|
21
|
+
extra = pydantic.Extra.allow
|
@@ -17,6 +17,11 @@ class PromptDeploymentExpandMetaRequest(UniversalBaseModel):
|
|
17
17
|
If enabled, the response will include model host usage tracking. This may increase latency for some model hosts.
|
18
18
|
"""
|
19
19
|
|
20
|
+
cost: typing.Optional[bool] = pydantic.Field(default=None)
|
21
|
+
"""
|
22
|
+
If enabled, the response will include model host cost tracking. This may increase latency for some model hosts.
|
23
|
+
"""
|
24
|
+
|
20
25
|
finish_reason: typing.Optional[bool] = pydantic.Field(default=None)
|
21
26
|
"""
|
22
27
|
If enabled, the response will include the reason provided by the model for why the execution finished.
|
@@ -4,6 +4,7 @@ from ..core.pydantic_utilities import UniversalBaseModel
|
|
4
4
|
import typing
|
5
5
|
from .finish_reason_enum import FinishReasonEnum
|
6
6
|
from .ml_model_usage import MlModelUsage
|
7
|
+
from .price import Price
|
7
8
|
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
8
9
|
import pydantic
|
9
10
|
|
@@ -19,6 +20,7 @@ class PromptExecutionMeta(UniversalBaseModel):
|
|
19
20
|
prompt_version_id: typing.Optional[str] = None
|
20
21
|
finish_reason: typing.Optional[FinishReasonEnum] = None
|
21
22
|
usage: typing.Optional[MlModelUsage] = None
|
23
|
+
cost: typing.Optional[Price] = None
|
22
24
|
|
23
25
|
if IS_PYDANTIC_V2:
|
24
26
|
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
2
|
+
|
3
|
+
from ..core.pydantic_utilities import UniversalBaseModel
|
4
|
+
import typing
|
5
|
+
from ..core.pydantic_utilities import IS_PYDANTIC_V2
|
6
|
+
import pydantic
|
7
|
+
|
8
|
+
|
9
|
+
class TestSuiteRunMetricJsonOutput(UniversalBaseModel):
|
10
|
+
"""
|
11
|
+
Output for a test suite run metric that is of type NUMBER
|
12
|
+
"""
|
13
|
+
|
14
|
+
value: typing.Optional[typing.Any] = None
|
15
|
+
type: typing.Literal["JSON"] = "JSON"
|
16
|
+
name: str
|
17
|
+
|
18
|
+
if IS_PYDANTIC_V2:
|
19
|
+
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
|
20
|
+
else:
|
21
|
+
|
22
|
+
class Config:
|
23
|
+
frozen = True
|
24
|
+
smart_union = True
|
25
|
+
extra = pydantic.Extra.allow
|
@@ -3,8 +3,12 @@
|
|
3
3
|
import typing
|
4
4
|
from .test_suite_run_metric_string_output import TestSuiteRunMetricStringOutput
|
5
5
|
from .test_suite_run_metric_number_output import TestSuiteRunMetricNumberOutput
|
6
|
+
from .test_suite_run_metric_json_output import TestSuiteRunMetricJsonOutput
|
6
7
|
from .test_suite_run_metric_error_output import TestSuiteRunMetricErrorOutput
|
7
8
|
|
8
9
|
TestSuiteRunMetricOutput = typing.Union[
|
9
|
-
TestSuiteRunMetricStringOutput,
|
10
|
+
TestSuiteRunMetricStringOutput,
|
11
|
+
TestSuiteRunMetricNumberOutput,
|
12
|
+
TestSuiteRunMetricJsonOutput,
|
13
|
+
TestSuiteRunMetricErrorOutput,
|
10
14
|
]
|
@@ -1,17 +1,17 @@
|
|
1
|
-
vellum/__init__.py,sha256=
|
2
|
-
vellum/client.py,sha256=
|
1
|
+
vellum/__init__.py,sha256=ZjILSZ1gKX9YUZjjOzr0wngRMV7aYaCvuCXgoxt7n2o,30148
|
2
|
+
vellum/client.py,sha256=tsLLtZbwPASP8Cdh1RF19pOuNmZbBKFkUiplU9X190Q,101256
|
3
3
|
vellum/core/__init__.py,sha256=FzSvKbXjuM18Hdk3iGK-jsGY_DfouyRS659thZV5c1Y,1394
|
4
4
|
vellum/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
|
5
|
-
vellum/core/client_wrapper.py,sha256=
|
5
|
+
vellum/core/client_wrapper.py,sha256=M-BpiKCvswDs5lRLcJdm1cAw-R1gKHfMTOJcWjskwVk,1898
|
6
6
|
vellum/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
|
7
7
|
vellum/core/file.py,sha256=vliNmlB7PbDfi4EKiVPNq5QaGXJ4zlDBGupv7Qciy7g,1520
|
8
8
|
vellum/core/http_client.py,sha256=rZSidd9LazCjduvdBhZ7GDs4iGfn-OAfRGsDXB1z8f4,18882
|
9
9
|
vellum/core/jsonable_encoder.py,sha256=qaF1gtgH-kQZb4kJskETwcCsOPUof-NnYVdszHkb-dM,3656
|
10
|
-
vellum/core/pydantic_utilities.py,sha256=
|
10
|
+
vellum/core/pydantic_utilities.py,sha256=h_XylfOhkKxX6ZxL5CVfXylOzR4oc5AjCVC5yTsR4aU,9138
|
11
11
|
vellum/core/query_encoder.py,sha256=ekulqNd0j8TgD7ox-Qbz7liqX8-KP9blvT9DsRCenYM,2144
|
12
12
|
vellum/core/remove_none_from_dict.py,sha256=EU9SGgYidWq7SexuJbNs4-PZ-5Bl3Vppd864mS6vQZw,342
|
13
13
|
vellum/core/request_options.py,sha256=5cCGt5AEGgtP5xifDl4oVQUmSjlIA8FmRItAlJawM18,1417
|
14
|
-
vellum/core/serialization.py,sha256=
|
14
|
+
vellum/core/serialization.py,sha256=5evS9ZBT8F0_GUAfzb6FQvdgw4JKuHFBlEoqZ8Y8-DU,8970
|
15
15
|
vellum/environment.py,sha256=bcAFjoE9XXd7tiysYS90Os669IJmUMZS2JZ_ZQn0Dpg,498
|
16
16
|
vellum/errors/__init__.py,sha256=HZB8vVqzDNx0M2uFJ05S5RcGTH95iVDl4v3rQ4xRqSw,343
|
17
17
|
vellum/errors/bad_request_error.py,sha256=_EbO8mWqN9kFZPvIap8qa1lL_EWkRcsZe1HKV9GDWJY,264
|
@@ -30,7 +30,7 @@ vellum/lib/utils/paginator.py,sha256=yDvgehocYBDclLt5SewZH4hCIyq0yLHdBzkyPCoYPjs
|
|
30
30
|
vellum/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
31
31
|
vellum/resources/__init__.py,sha256=iaTrngunVag3wUnyP3TlA8lG55RUCYw4qgdlZXzhi2Q,806
|
32
32
|
vellum/resources/ad_hoc/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
|
33
|
-
vellum/resources/ad_hoc/client.py,sha256=
|
33
|
+
vellum/resources/ad_hoc/client.py,sha256=7WwFing-VwbfZJbwBRJCkJ3ypXJ7jMSt4kaCVSTW3gk,14006
|
34
34
|
vellum/resources/deployments/__init__.py,sha256=AE0TcFwLrLBljM0ZDX-pPw4Kqt-1f5JDpIok2HS80QI,157
|
35
35
|
vellum/resources/deployments/client.py,sha256=A_x9lFFFNiiwggPcrMfP88vv5F0FuLo39Ek36WEfJpE,28516
|
36
36
|
vellum/resources/deployments/types/__init__.py,sha256=IhwnmoXJ0r_QEhh1b2tBcaAm_x3fWMVuIhYmAapp_ZA,183
|
@@ -48,7 +48,7 @@ vellum/resources/sandboxes/client.py,sha256=RDFDge2gkI6Kpo3VhlRISKS8wHDp7MYh83XV
|
|
48
48
|
vellum/resources/test_suite_runs/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
|
49
49
|
vellum/resources/test_suite_runs/client.py,sha256=laE40piDiurzmO1mwStY0ebsxQpTuETgiCAewtSrNk8,14192
|
50
50
|
vellum/resources/test_suites/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
|
51
|
-
vellum/resources/test_suites/client.py,sha256=
|
51
|
+
vellum/resources/test_suites/client.py,sha256=Sy_mXyAwObTwRSPH9gOO8gNZRfx4MlQVV3TxaAdnVx0,23795
|
52
52
|
vellum/resources/workflow_deployments/__init__.py,sha256=-5BCA0kSmW6WUh4gqLuQtHv4zFdt9lccuDwMU5YvEu4,173
|
53
53
|
vellum/resources/workflow_deployments/client.py,sha256=ezSg3EDA5UszvrT15jx7-RoSO8pXRwAIDlqMCJXkNOY,17393
|
54
54
|
vellum/resources/workflow_deployments/types/__init__.py,sha256=rmS_4dtbgLHGNQJ_pOloygrjl4sNbKZjTEKBxbMyz6E,208
|
@@ -66,9 +66,9 @@ vellum/terraform/ml_model/__init__.py,sha256=I8h1Ru-Rb-Hi_HusK6G7nJQZEKQGsAAHMmw
|
|
66
66
|
vellum/terraform/provider/__init__.py,sha256=-06xKmAmknpohVzw5TD-t1bnUHta8OrQYqvMd04XM-U,12684
|
67
67
|
vellum/terraform/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
68
68
|
vellum/terraform/versions.json,sha256=45c7jjRD5i4w9DJQHs5ZqLLVXRnQwP9Rirq3mWY-xEo,56
|
69
|
-
vellum/types/__init__.py,sha256=
|
69
|
+
vellum/types/__init__.py,sha256=_v6i_DtXNY5yiWC8FnzvVP2T2hpd_G9m2Rgsupfzj3c,46048
|
70
70
|
vellum/types/ad_hoc_execute_prompt_event.py,sha256=bCjujA2XsOgyF3bRZbcEqV2rOIymRgsLoIRtZpB14xg,607
|
71
|
-
vellum/types/ad_hoc_expand_meta_request.py,sha256=
|
71
|
+
vellum/types/ad_hoc_expand_meta_request.py,sha256=hS8PC3hC--OKvRKi2ZFj_RJPQ1bxo2GXno8qJq1kk28,1338
|
72
72
|
vellum/types/ad_hoc_fulfilled_prompt_execution_meta.py,sha256=Bfvf1d_dkmshxRACVM5vcxbH_7AQY23RmrrnPc0ytYY,939
|
73
73
|
vellum/types/ad_hoc_initiated_prompt_execution_meta.py,sha256=gOHP4kmnVCJJkTpfRPOgkFB70mhz5ySg_c2qRffDGWQ,785
|
74
74
|
vellum/types/ad_hoc_rejected_prompt_execution_meta.py,sha256=Yo3TNjemHUfxU9R3EMzAGh-ey9pSClpEX7uGgGZiXDg,849
|
@@ -275,13 +275,14 @@ vellum/types/paginated_test_suite_test_case_list.py,sha256=SANqBECiz9yu6_JxOcNdk
|
|
275
275
|
vellum/types/pdf_search_result_meta_source.py,sha256=EMVhqdN1bwE6Ujdx4VhlmKQtJvitN-57kY8oZPxh9dI,1126
|
276
276
|
vellum/types/pdf_search_result_meta_source_request.py,sha256=nUhaD2Kw1paGC6O_ICVNu3R0e1SVgTshRTkGNgmcjXo,1133
|
277
277
|
vellum/types/plain_text_prompt_block_request.py,sha256=ljdh2OD-xUOAhEF8raHc6WnQDnWdtEY8aSNsEiuC5nY,971
|
278
|
+
vellum/types/price.py,sha256=ewzXDBVLaleuXMVQ-gQ3G1Nl5J2OWOVEMEFfnQIpiTk,610
|
278
279
|
vellum/types/processing_failure_reason_enum.py,sha256=R_KIW7TcQejhc-vLhtNf9SdkYADgoZCn4ch4_RRIvsI,195
|
279
280
|
vellum/types/processing_state_enum.py,sha256=lIEunnCpgYQExm2bGyTb12KyjQ3O7XOx636aWXb_Iwo,190
|
280
281
|
vellum/types/prompt_block_request.py,sha256=A5I5J6bDjmauk5L4CexRXk_VMrGDZRApYZyevMHBPpI,740
|
281
282
|
vellum/types/prompt_block_state.py,sha256=BRAzTYARoSU36IVZGWMeeqhl5fgFMXCyhJ8rCbfB-f0,163
|
282
|
-
vellum/types/prompt_deployment_expand_meta_request.py,sha256=
|
283
|
+
vellum/types/prompt_deployment_expand_meta_request.py,sha256=agsiAaHB6lDoZPlnfJ2nmhB4Ud4EiJJTX05YmduyCPo,1910
|
283
284
|
vellum/types/prompt_deployment_input_request.py,sha256=KrT4-Ew2VvTWXEkYQz2oyHn5EDOgrMW7FzRFaPH3ARg,353
|
284
|
-
vellum/types/prompt_execution_meta.py,sha256=
|
285
|
+
vellum/types/prompt_execution_meta.py,sha256=3hhMZgdAR5mKfnh2e_eVN3oKfT0E9w26khVPrpjn7jk,1141
|
285
286
|
vellum/types/prompt_node_execution_meta.py,sha256=k8zPFTsXl0iuHi-CNXEQcWP5Adbr8xDv1G1EWZ4KJNM,779
|
286
287
|
vellum/types/prompt_node_result.py,sha256=3jewO-nPodoXTq_5RxgwhKfDZrvoPjRZ_vUXLeqiuHY,749
|
287
288
|
vellum/types/prompt_node_result_data.py,sha256=fNOxBfK3ablDBxkUWVVstJMYaGdHGgu27WxP87E6UQ4,872
|
@@ -399,8 +400,9 @@ vellum/types/test_suite_run_external_exec_config_data.py,sha256=tCbioorIkNJYmvaa
|
|
399
400
|
vellum/types/test_suite_run_external_exec_config_data_request.py,sha256=KuNf7pnIVkcvJYFzyDs4TCBU5lWeIweAe9czD3jREzw,847
|
400
401
|
vellum/types/test_suite_run_external_exec_config_request.py,sha256=CwWiz7I1Yx4ETIRW_tr5ZwAnTGKyLlzuefqAExK4_LQ,1114
|
401
402
|
vellum/types/test_suite_run_metric_error_output.py,sha256=trW1KTH4SJafRfDFRyBS7TpzcT88tXkpWEoysij6IXQ,755
|
403
|
+
vellum/types/test_suite_run_metric_json_output.py,sha256=DI3mJR5kpi8Hm2n6tx6buySHPwTkkbBbr8Lkk4k6HH4,738
|
402
404
|
vellum/types/test_suite_run_metric_number_output.py,sha256=8pddeSds6Rrn0xGqyvgPsG1hr1tu6eOiQAp8kkM_aBk,739
|
403
|
-
vellum/types/test_suite_run_metric_output.py,sha256=
|
405
|
+
vellum/types/test_suite_run_metric_output.py,sha256=qxEJ6Ii4XOhJpM3tgn6ctRnldysduEIe8tQFnWBEOvQ,578
|
404
406
|
vellum/types/test_suite_run_metric_string_output.py,sha256=YXerGfpvJdBtKrzgutSqEfG-N6cZoeOL59qZ5k6DwQA,737
|
405
407
|
vellum/types/test_suite_run_read.py,sha256=oBA5_N6tUgc9wTM2I06d_1F7B5ZQcndPFumyZH4J1PM,1222
|
406
408
|
vellum/types/test_suite_run_state.py,sha256=E4f_AfzXBnxhObLLZ12dBzdoYlRm-gaTqkzrZQ_KfCo,197
|
@@ -428,6 +430,7 @@ vellum/types/token_overlapping_window_chunker_config.py,sha256=_8vR9AiZQmb5OA3Oo
|
|
428
430
|
vellum/types/token_overlapping_window_chunker_config_request.py,sha256=O58w5om6EsCgZeqM7n3KSzwo1PqINyHWln46EFW4Inc,738
|
429
431
|
vellum/types/token_overlapping_window_chunking.py,sha256=TghiPKWZg3Eg_UzGI9VmjQgVPZFABrnhfsz4iPLEem8,889
|
430
432
|
vellum/types/token_overlapping_window_chunking_request.py,sha256=IjCs9UDrwBT6tnffdInd3278Lg2L46jXgn0V-sEBwb0,918
|
433
|
+
vellum/types/unit_enum.py,sha256=BKWRVp2WfHtGK4D6TsolhNJHGHfExzrRHkFn8H8QkwQ,113
|
431
434
|
vellum/types/upload_document_response.py,sha256=6_5Cm4yBPq5nD-rEql6GsmrAtSVVtNRczOL5YwsBVMI,649
|
432
435
|
vellum/types/upsert_test_suite_test_case_request.py,sha256=nBL0DR9SksQCLA9MhmwHNEOsmdY7bklXsrtge-ywANI,1812
|
433
436
|
vellum/types/variable_prompt_block_request.py,sha256=XYiA3R_jaMZ2Mq37Lbh7CfBqqj93Yv8ZMVYGheodBdY,990
|
@@ -481,7 +484,7 @@ vellum/types/workflow_result_event_output_data_search_results.py,sha256=U34IK7Zv
|
|
481
484
|
vellum/types/workflow_result_event_output_data_string.py,sha256=tM3kgh6tEhD0dFEb_7UU0-UspeN4pUdINCcCrD64W74,1228
|
482
485
|
vellum/types/workflow_stream_event.py,sha256=Wn3Yzuy9MqWAeo8tEaXDTKDEbJoA8DdYdMVq8EKuhu8,361
|
483
486
|
vellum/version.py,sha256=jq-1PlAYxN9AXuaZqbYk9ak27SgE2lw9Ia5gx1b1gVI,76
|
484
|
-
vellum_ai-0.8.
|
485
|
-
vellum_ai-0.8.
|
486
|
-
vellum_ai-0.8.
|
487
|
-
vellum_ai-0.8.
|
487
|
+
vellum_ai-0.8.10.dist-info/LICENSE,sha256=CcaljEIoOBaU-wItPH4PmM_mDCGpyuUY0Er1BGu5Ti8,1073
|
488
|
+
vellum_ai-0.8.10.dist-info/METADATA,sha256=QHpzDwJPFH8HiKsH-zgInPuvI39uSU4MtqDrQpIJzwI,4395
|
489
|
+
vellum_ai-0.8.10.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
|
490
|
+
vellum_ai-0.8.10.dist-info/RECORD,,
|
File without changes
|
File without changes
|