opengradient 0.2.7__py3-none-any.whl → 0.2.8__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.
- opengradient/__init__.py +8 -8
- opengradient/abi/inference.abi +1 -1
- opengradient/cli.py +19 -18
- opengradient/client.py +6 -0
- opengradient/defaults.py +7 -0
- opengradient/utils.py +37 -9
- {opengradient-0.2.7.dist-info → opengradient-0.2.8.dist-info}/METADATA +37 -9
- opengradient-0.2.8.dist-info/RECORD +14 -0
- opengradient-0.2.7.dist-info/RECORD +0 -13
- {opengradient-0.2.7.dist-info → opengradient-0.2.8.dist-info}/LICENSE +0 -0
- {opengradient-0.2.7.dist-info → opengradient-0.2.8.dist-info}/WHEEL +0 -0
- {opengradient-0.2.7.dist-info → opengradient-0.2.8.dist-info}/entry_points.txt +0 -0
- {opengradient-0.2.7.dist-info → opengradient-0.2.8.dist-info}/top_level.txt +0 -0
opengradient/__init__.py
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
from .client import Client
|
|
2
|
-
from .
|
|
3
|
-
from .types import
|
|
2
|
+
from .defaults import *
|
|
3
|
+
from .types import InferenceMode
|
|
4
4
|
|
|
5
|
-
__version__ = "0.2.
|
|
5
|
+
__version__ = "0.2.8"
|
|
6
6
|
|
|
7
7
|
_client = None
|
|
8
8
|
|
|
9
|
-
def init(private_key=
|
|
10
|
-
rpc_url=
|
|
11
|
-
contract_address=
|
|
12
|
-
email=
|
|
13
|
-
password=
|
|
9
|
+
def init(private_key=DEFAULT_PRIVATE_KEY,
|
|
10
|
+
rpc_url=DEFAULT_RPC_URL,
|
|
11
|
+
contract_address=DEFAULT_INFERENCE_CONTRACT_ADDRESS,
|
|
12
|
+
email=DEFAULT_HUB_EMAIL,
|
|
13
|
+
password=DEFAULT_HUB_PASSWORD):
|
|
14
14
|
global _client
|
|
15
15
|
_client = Client(private_key=private_key, rpc_url=rpc_url, contract_address=contract_address, email=email, password=password)
|
|
16
16
|
|
opengradient/abi/inference.abi
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"anonymous":false,"inputs":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"int128","name":"value","type":"int128"},{"internalType":"int128","name":"decimals","type":"int128"}],"internalType":"struct Number[]","name":"values","type":"tuple[]"}],"internalType":"struct
|
|
1
|
+
[{"anonymous":false,"inputs":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"int128","name":"value","type":"int128"},{"internalType":"int128","name":"decimals","type":"int128"}],"internalType":"struct TensorLib.Number[]","name":"values","type":"tuple[]"},{"internalType":"uint32[]","name":"shape","type":"uint32[]"}],"internalType":"struct TensorLib.MultiDimensionalNumberTensor[]","name":"numbers","type":"tuple[]"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string[]","name":"values","type":"string[]"}],"internalType":"struct TensorLib.StringTensor[]","name":"strings","type":"tuple[]"},{"internalType":"bool","name":"is_simulation_result","type":"bool"}],"indexed":false,"internalType":"struct ModelOutput","name":"output","type":"tuple"}],"name":"InferenceResult","type":"event"},{"inputs":[{"internalType":"string","name":"modelId","type":"string"},{"internalType":"enum ModelInferenceMode","name":"inferenceMode","type":"uint8"},{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"int128","name":"value","type":"int128"},{"internalType":"int128","name":"decimals","type":"int128"}],"internalType":"struct TensorLib.Number[]","name":"values","type":"tuple[]"},{"internalType":"uint32[]","name":"shape","type":"uint32[]"}],"internalType":"struct TensorLib.MultiDimensionalNumberTensor[]","name":"numbers","type":"tuple[]"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string[]","name":"values","type":"string[]"}],"internalType":"struct TensorLib.StringTensor[]","name":"strings","type":"tuple[]"}],"internalType":"struct ModelInput","name":"modelInput","type":"tuple"}],"name":"run","outputs":[{"components":[{"components":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"int128","name":"value","type":"int128"},{"internalType":"int128","name":"decimals","type":"int128"}],"internalType":"struct TensorLib.Number[]","name":"values","type":"tuple[]"},{"internalType":"uint32[]","name":"shape","type":"uint32[]"}],"internalType":"struct TensorLib.MultiDimensionalNumberTensor[]","name":"numbers","type":"tuple[]"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string[]","name":"values","type":"string[]"}],"internalType":"struct TensorLib.StringTensor[]","name":"strings","type":"tuple[]"},{"internalType":"bool","name":"is_simulation_result","type":"bool"}],"internalType":"struct ModelOutput","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"}]
|
opengradient/cli.py
CHANGED
|
@@ -5,10 +5,11 @@ import json
|
|
|
5
5
|
import ast
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from .client import Client
|
|
8
|
-
from
|
|
8
|
+
from .defaults import *
|
|
9
|
+
from .types import InferenceMode, ModelInput
|
|
9
10
|
|
|
10
11
|
# Environment variable names
|
|
11
|
-
|
|
12
|
+
PRIVATE_KEY_ENV = 'OPENGRADIENT_PRIVATE_KEY'
|
|
12
13
|
RPC_URL_ENV = 'OPENGRADIENT_RPC_URL'
|
|
13
14
|
CONTRACT_ADDRESS_ENV = 'OPENGRADIENT_CONTRACT_ADDRESS'
|
|
14
15
|
EMAIL_ENV = 'OPENGRADIENT_EMAIL'
|
|
@@ -39,48 +40,48 @@ Dict = DictParamType()
|
|
|
39
40
|
|
|
40
41
|
# Support inference modes
|
|
41
42
|
InferenceModes = {
|
|
42
|
-
"VANILLA":
|
|
43
|
-
"ZKML":
|
|
44
|
-
"TEE":
|
|
43
|
+
"VANILLA": InferenceMode.VANILLA,
|
|
44
|
+
"ZKML": InferenceMode.ZKML,
|
|
45
|
+
"TEE": InferenceMode.TEE,
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
# TODO (Kyle): Once we're farther into development, we should remove the defaults for these options
|
|
48
49
|
@click.group()
|
|
49
|
-
@click.option('--
|
|
50
|
-
envvar=
|
|
50
|
+
@click.option('--private_key',
|
|
51
|
+
envvar=PRIVATE_KEY_ENV,
|
|
51
52
|
help='Your OpenGradient private key',
|
|
52
|
-
default=
|
|
53
|
+
default=DEFAULT_PRIVATE_KEY)
|
|
53
54
|
@click.option('--rpc_url',
|
|
54
55
|
envvar=RPC_URL_ENV,
|
|
55
56
|
help='OpenGradient RPC URL address',
|
|
56
|
-
default=
|
|
57
|
+
default=DEFAULT_RPC_URL)
|
|
57
58
|
@click.option('--contract_address',
|
|
58
59
|
envvar=CONTRACT_ADDRESS_ENV,
|
|
59
60
|
help='OpenGradient inference contract address',
|
|
60
|
-
default=
|
|
61
|
+
default=DEFAULT_INFERENCE_CONTRACT_ADDRESS)
|
|
61
62
|
@click.option('--email',
|
|
62
63
|
envvar=EMAIL_ENV,
|
|
63
64
|
help='Your OpenGradient Hub email address -- not required for inference',
|
|
64
|
-
default=
|
|
65
|
+
default=DEFAULT_HUB_EMAIL)
|
|
65
66
|
@click.option('--password',
|
|
66
67
|
envvar=PASSWORD_ENV,
|
|
67
68
|
help='Your OpenGradient Hub password -- not required for inference',
|
|
68
|
-
default=
|
|
69
|
+
default=DEFAULT_HUB_PASSWORD)
|
|
69
70
|
@click.pass_context
|
|
70
|
-
def cli(ctx,
|
|
71
|
+
def cli(ctx, private_key, rpc_url, contract_address, email, password):
|
|
71
72
|
"""CLI for OpenGradient SDK"""
|
|
72
|
-
if not
|
|
73
|
-
click.echo("Please provide
|
|
73
|
+
if not private_key:
|
|
74
|
+
click.echo("Please provide a private key via flag or setting environment variable OPENGRADIENT_PRIVATE_KEY")
|
|
74
75
|
if not rpc_url:
|
|
75
76
|
click.echo("Please provide a RPC URL via flag or setting environment variable OPENGRADIENT_RPC_URL")
|
|
76
77
|
if not contract_address:
|
|
77
78
|
click.echo("Please provide a contract address via flag or setting environment variable OPENGRADIENT_CONTRACT_ADDRESS")
|
|
78
|
-
if not
|
|
79
|
+
if not private_key or not rpc_url or not contract_address:
|
|
79
80
|
ctx.exit(1)
|
|
80
81
|
return
|
|
81
82
|
|
|
82
83
|
try:
|
|
83
|
-
ctx.obj = Client(private_key=
|
|
84
|
+
ctx.obj = Client(private_key=private_key,
|
|
84
85
|
rpc_url=rpc_url,
|
|
85
86
|
contract_address=contract_address,
|
|
86
87
|
email=email,
|
|
@@ -98,7 +99,7 @@ def client_settings(ctx):
|
|
|
98
99
|
ctx.exit(1)
|
|
99
100
|
|
|
100
101
|
click.echo("Settings for OpenGradient client:")
|
|
101
|
-
click.echo(f"\
|
|
102
|
+
click.echo(f"\tPrivate key ({PRIVATE_KEY_ENV}): {client.private_key}")
|
|
102
103
|
click.echo(f"\tRPC URL ({RPC_URL_ENV}): {client.rpc_url}")
|
|
103
104
|
click.echo(f"\tContract address ({CONTRACT_ADDRESS_ENV}): {client.contract_address}")
|
|
104
105
|
if client.user:
|
opengradient/client.py
CHANGED
|
@@ -43,6 +43,12 @@ class Client:
|
|
|
43
43
|
self.firebase_app = firebase.initialize_app(self.FIREBASE_CONFIG)
|
|
44
44
|
self.auth = self.firebase_app.auth()
|
|
45
45
|
self.user = None
|
|
46
|
+
|
|
47
|
+
logging.debug("Initialized client with parameters:\n"
|
|
48
|
+
"private key: %s\n"
|
|
49
|
+
"RPC URL: %s\n"
|
|
50
|
+
"Contract Address: %s\n",
|
|
51
|
+
private_key, rpc_url, contract_address)
|
|
46
52
|
|
|
47
53
|
abi_path = os.path.join(os.path.dirname(__file__), 'abi', 'inference.abi')
|
|
48
54
|
with open(abi_path, 'r') as abi_file:
|
opengradient/defaults.py
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
|
|
2
|
+
# Default variables
|
|
3
|
+
DEFAULT_PRIVATE_KEY="cd09980ef6e280afc3900d2d6801f9e9c5d858a5deaeeab74a65643f5ff1a4c1"
|
|
4
|
+
DEFAULT_RPC_URL="http://18.218.115.248:8545"
|
|
5
|
+
DEFAULT_INFERENCE_CONTRACT_ADDRESS="0x75D0266DAb643417e9FFD828A1A31C1E039a966c"
|
|
6
|
+
DEFAULT_HUB_EMAIL="test@test.com"
|
|
7
|
+
DEFAULT_HUB_PASSWORD="Test-123"
|
opengradient/utils.py
CHANGED
|
@@ -40,11 +40,10 @@ def convert_to_model_input(inputs: Dict[str, np.ndarray]) -> Tuple[List[Tuple[st
|
|
|
40
40
|
"""
|
|
41
41
|
Expect SDK input to be a dict with the format
|
|
42
42
|
key: tensor name
|
|
43
|
-
value: np.array
|
|
43
|
+
value: np.array / list
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
Return a tuple of (number tensors, string tensors) depending on the input type
|
|
45
|
+
Return a tuple of (number tensors, string tensors) depending on the input type. Each number and string tensor converted
|
|
46
|
+
to a numpy array and flattened and the shape saved.
|
|
48
47
|
"""
|
|
49
48
|
logging.debug("Converting the following input dictionary to ModelInput: %s", inputs)
|
|
50
49
|
number_tensors = []
|
|
@@ -59,19 +58,37 @@ def convert_to_model_input(inputs: Dict[str, np.ndarray]) -> Tuple[List[Tuple[st
|
|
|
59
58
|
logging.debug(f"\tConverting single entry {tensor_data} to a list")
|
|
60
59
|
tensor_data = np.array([tensor_data])
|
|
61
60
|
|
|
61
|
+
# Check if type is np array
|
|
62
|
+
if not isinstance(tensor_data, np.ndarray):
|
|
63
|
+
raise TypeError("Inference input must be list, numpy array, or type (str, int, float): %s" % type(tensor_data))
|
|
64
|
+
|
|
65
|
+
# Flatten list and retain shape
|
|
66
|
+
shape = tensor_data.shape
|
|
67
|
+
flat_data = tensor_data.flatten()
|
|
68
|
+
logging.debug("Shape and flattened data: %s, %s", shape, flat_data)
|
|
69
|
+
|
|
62
70
|
# Parse into number and string tensors
|
|
63
71
|
if issubclass(tensor_data.dtype.type, np.floating):
|
|
64
|
-
|
|
72
|
+
# Convert to fixed-point tuples
|
|
73
|
+
data_type = np.dtype([('value', int), ('decimal', int)])
|
|
74
|
+
converted_tensor_data = np.array([convert_to_fixed_point(i) for i in flat_data], dtype=data_type)
|
|
75
|
+
|
|
76
|
+
input = (tensor_name, converted_tensor_data.tolist(), shape)
|
|
65
77
|
logging.debug("\tFloating tensor input: %s", input)
|
|
66
78
|
|
|
67
79
|
number_tensors.append(input)
|
|
68
80
|
elif issubclass(tensor_data.dtype.type, np.integer):
|
|
69
|
-
|
|
81
|
+
# Convert to fixed-point tuples
|
|
82
|
+
data_type = np.dtype([('value', int), ('decimal', int)])
|
|
83
|
+
converted_tensor_data = np.array([convert_to_fixed_point(int(i)) for i in flat_data], dtype=data_type)
|
|
84
|
+
|
|
85
|
+
input = (tensor_name, converted_tensor_data.tolist(), shape)
|
|
70
86
|
logging.debug("\tInteger tensor input: %s", input)
|
|
71
87
|
|
|
72
88
|
number_tensors.append(input)
|
|
73
89
|
elif issubclass(tensor_data.dtype.type, np.str_):
|
|
74
|
-
|
|
90
|
+
# TODO (Kyle): Add shape into here as well
|
|
91
|
+
input = (tensor_name, [s for s in flat_data])
|
|
75
92
|
logging.debug("\tString tensor input: %s", input)
|
|
76
93
|
|
|
77
94
|
string_tensors.append(input)
|
|
@@ -85,6 +102,15 @@ def convert_to_model_input(inputs: Dict[str, np.ndarray]) -> Tuple[List[Tuple[st
|
|
|
85
102
|
return number_tensors, string_tensors
|
|
86
103
|
|
|
87
104
|
def convert_to_model_output(event_data: AttributeDict) -> Dict[str, np.ndarray]:
|
|
105
|
+
"""
|
|
106
|
+
Converts inference output into a user-readable output.
|
|
107
|
+
Expects the inference node to return a dict with the format:
|
|
108
|
+
key: output_name (str)
|
|
109
|
+
value: (output_array (list), shape (list)) (tuple)
|
|
110
|
+
|
|
111
|
+
We need to reshape each output array using the shape parameter in order to get the array
|
|
112
|
+
back into its original shape.
|
|
113
|
+
"""
|
|
88
114
|
logging.debug(f"Parsing event data: {event_data}")
|
|
89
115
|
|
|
90
116
|
output_dict = {}
|
|
@@ -98,6 +124,7 @@ def convert_to_model_output(event_data: AttributeDict) -> Dict[str, np.ndarray]:
|
|
|
98
124
|
logging.debug(f"Processing number tensor: {tensor}")
|
|
99
125
|
if isinstance(tensor, AttributeDict):
|
|
100
126
|
name = tensor.get('name')
|
|
127
|
+
shape = tensor.get('shape')
|
|
101
128
|
values = []
|
|
102
129
|
# Convert from fixed point back into np.float32
|
|
103
130
|
for v in tensor.get('values', []):
|
|
@@ -105,7 +132,7 @@ def convert_to_model_output(event_data: AttributeDict) -> Dict[str, np.ndarray]:
|
|
|
105
132
|
values.append(convert_to_float32(value=int(v.get('value')), decimals=int(v.get('decimals'))))
|
|
106
133
|
else:
|
|
107
134
|
logging.warning(f"Unexpected number type: {type(v)}")
|
|
108
|
-
output_dict[name] = np.array(values)
|
|
135
|
+
output_dict[name] = np.array(values).reshape(shape)
|
|
109
136
|
else:
|
|
110
137
|
logging.warning(f"Unexpected tensor type: {type(tensor)}")
|
|
111
138
|
|
|
@@ -114,8 +141,9 @@ def convert_to_model_output(event_data: AttributeDict) -> Dict[str, np.ndarray]:
|
|
|
114
141
|
logging.debug(f"Processing string tensor: {tensor}")
|
|
115
142
|
if isinstance(tensor, AttributeDict):
|
|
116
143
|
name = tensor.get('name')
|
|
144
|
+
shape = tensor.get('shape')
|
|
117
145
|
values = tensor.get('values', [])
|
|
118
|
-
output_dict[name] = values
|
|
146
|
+
output_dict[name] = np.array(values).reshape(shape)
|
|
119
147
|
else:
|
|
120
148
|
logging.warning(f"Unexpected tensor type: {type(tensor)}")
|
|
121
149
|
else:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: opengradient
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.8
|
|
4
4
|
Summary: A Python SDK for OpenGradient inference services
|
|
5
5
|
Author-email: OpenGradient <oliver@opengradient.ai>
|
|
6
6
|
License: MIT License
|
|
@@ -140,42 +140,70 @@ Requires-Dist: yarl==1.13.1
|
|
|
140
140
|
Python SDK for OpenGradient inference services.
|
|
141
141
|
|
|
142
142
|
## Installation
|
|
143
|
-
```
|
|
143
|
+
```python
|
|
144
144
|
pip install opengradient
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
## Quick Start
|
|
148
|
-
```
|
|
148
|
+
```python
|
|
149
149
|
import opengradient as og
|
|
150
150
|
og.init(private_key="x", rpc_url="y", contract_address="z")
|
|
151
151
|
```
|
|
152
152
|
|
|
153
153
|
### Sign in with Email
|
|
154
|
-
```
|
|
154
|
+
```python
|
|
155
155
|
og.login(email="you@opengradient.ai", password="xyz")
|
|
156
156
|
```
|
|
157
157
|
|
|
158
158
|
### Create a Model
|
|
159
|
-
```
|
|
159
|
+
```python
|
|
160
160
|
og.create_model(model_name="test-network-model", model_desc="testing upload to sdk")
|
|
161
161
|
```
|
|
162
162
|
|
|
163
163
|
### Create a Version of a Model
|
|
164
|
-
```
|
|
164
|
+
```python
|
|
165
165
|
og.create_version(model_name="test-network-model", notes="test notes")
|
|
166
166
|
```
|
|
167
167
|
|
|
168
168
|
### Upload Files to a Model
|
|
169
|
-
```
|
|
169
|
+
```python
|
|
170
170
|
og.upload(model_path="local_path_to_your_model.onnx", model_name="test-network-model", version="0.01")
|
|
171
171
|
```
|
|
172
172
|
|
|
173
173
|
### Run Inference
|
|
174
|
-
```
|
|
174
|
+
```python
|
|
175
175
|
inference_mode = og.InferenceMode.VANILLA
|
|
176
176
|
inference_cid = og.infer(model_cid, model_inputs, inference_mode)
|
|
177
177
|
```
|
|
178
178
|
|
|
179
|
-
```
|
|
179
|
+
```python
|
|
180
180
|
og.infer(model_id, inference_mode, model_input)
|
|
181
181
|
```
|
|
182
|
+
|
|
183
|
+
## Using the CLI
|
|
184
|
+
|
|
185
|
+
#### Creating a Model
|
|
186
|
+
```bash
|
|
187
|
+
opengradient create_model "<model_name>" "<description>"
|
|
188
|
+
```
|
|
189
|
+
- creating a model automatically initializes version `v0.01`
|
|
190
|
+
|
|
191
|
+
#### Creating a Version
|
|
192
|
+
```bash
|
|
193
|
+
opengradient create_model "<model_name>" "<description>"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
#### Upload a File
|
|
197
|
+
```bash
|
|
198
|
+
opengradient upload "path/to/model.onnx" "<model_name>" "<version>"
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
#### CLI infer using string
|
|
202
|
+
```bash
|
|
203
|
+
opengradient infer QmbUqS93oc4JTLMHwpVxsE39mhNxy6hpf6Py3r9oANr8aZ VANILLA '{"num_input1":[1.0, 2.0, 3.0], "num_input2":10, "str_input1":["hello", "ONNX"], "str_input2":" world"}'
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
#### CLI infer using file path input
|
|
207
|
+
```bash
|
|
208
|
+
opengradient infer QmbUqS93oc4JTLMHwpVxsE39mhNxy6hpf6Py3r9oANr8aZ VANILLA --input_file input.json
|
|
209
|
+
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
opengradient/__init__.py,sha256=gMNHFVZRrzniZ7RrhUm02bJGFQ5U9RR7o7G2klgPQ8g,1576
|
|
2
|
+
opengradient/cli.py,sha256=bM_mROx9xbhtJ2P1uBrdsRSlphkC93zuD5q6mC6E9WA,7430
|
|
3
|
+
opengradient/client.py,sha256=9yhMLlqfRcIOk16P-9OOV2QR9UOfpkZYtaFExJQYxKw,18313
|
|
4
|
+
opengradient/defaults.py,sha256=FDVOXlceTTU1G13KDf1Gg34UYhOU9VUBemqBVu99G5Y,298
|
|
5
|
+
opengradient/exceptions.py,sha256=v4VmUGTvvtjhCZAhR24Ga42z3q-DzR1Y5zSqP_yn2Xk,3366
|
|
6
|
+
opengradient/types.py,sha256=EoJN-DkQrJ2WTUv8OenlrlWJWFY2jPGTl-T8C_OVjp8,1849
|
|
7
|
+
opengradient/utils.py,sha256=F1Nj-GMNFQFxCtbGgWQq1RP4TSurbpQxJV3yKeEo1b0,6482
|
|
8
|
+
opengradient/abi/inference.abi,sha256=u8FsW0s1YeRjUb9eLS1k_qh_5f_cwOdr0bii-tAdxh0,2683
|
|
9
|
+
opengradient-0.2.8.dist-info/LICENSE,sha256=xEcvQ3AxZOtDkrqkys2Mm6Y9diEnaSeQRKvxi-JGnNA,1069
|
|
10
|
+
opengradient-0.2.8.dist-info/METADATA,sha256=99VuVVLSZlCT9tCx697XV75uwaZUBY39WxfETdpB5YQ,6871
|
|
11
|
+
opengradient-0.2.8.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
12
|
+
opengradient-0.2.8.dist-info/entry_points.txt,sha256=yUKTaJx8RXnybkob0J62wVBiCp_1agVbgw9uzsmaeJc,54
|
|
13
|
+
opengradient-0.2.8.dist-info/top_level.txt,sha256=oC1zimVLa2Yi1LQz8c7x-0IQm92milb5ax8gHBHwDqU,13
|
|
14
|
+
opengradient-0.2.8.dist-info/RECORD,,
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
opengradient/__init__.py,sha256=BRxrOg8w_gPDiYpBbDAeEy-XFidmGNU-GvWozFw3vbo,1783
|
|
2
|
-
opengradient/cli.py,sha256=EVb_JNvfaXWEalKKtfRknyw7tXko5qqKkHPwTR-W3cQ,7468
|
|
3
|
-
opengradient/client.py,sha256=XJ5AGB518Mwmfdk1xeHyR51B2KvGvFHEoRjWLsr1x7M,18052
|
|
4
|
-
opengradient/exceptions.py,sha256=v4VmUGTvvtjhCZAhR24Ga42z3q-DzR1Y5zSqP_yn2Xk,3366
|
|
5
|
-
opengradient/types.py,sha256=EoJN-DkQrJ2WTUv8OenlrlWJWFY2jPGTl-T8C_OVjp8,1849
|
|
6
|
-
opengradient/utils.py,sha256=95i5RVn-32MRsn00M21io8QHLtmEAoRbgueMhDh0TVk,5079
|
|
7
|
-
opengradient/abi/inference.abi,sha256=HH2SmCJ_D4O0I-CFsln0vFHd2PU-A-fxgCnUtHg0ZQg,2373
|
|
8
|
-
opengradient-0.2.7.dist-info/LICENSE,sha256=xEcvQ3AxZOtDkrqkys2Mm6Y9diEnaSeQRKvxi-JGnNA,1069
|
|
9
|
-
opengradient-0.2.7.dist-info/METADATA,sha256=AXjww8-Sq9V1hil5VFOYGdOV9A7Yd60ytTGOtu2u1QQ,6085
|
|
10
|
-
opengradient-0.2.7.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
11
|
-
opengradient-0.2.7.dist-info/entry_points.txt,sha256=yUKTaJx8RXnybkob0J62wVBiCp_1agVbgw9uzsmaeJc,54
|
|
12
|
-
opengradient-0.2.7.dist-info/top_level.txt,sha256=oC1zimVLa2Yi1LQz8c7x-0IQm92milb5ax8gHBHwDqU,13
|
|
13
|
-
opengradient-0.2.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|