opengradient 0.3.17__tar.gz → 0.3.18__tar.gz
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-0.3.17 → opengradient-0.3.18}/PKG-INFO +4 -2
- {opengradient-0.3.17 → opengradient-0.3.18}/pyproject.toml +2 -1
- opengradient-0.3.18/src/opengradient/__init__.py +267 -0
- opengradient-0.3.18/src/opengradient/llm/__init__.py +38 -0
- opengradient-0.3.18/src/opengradient/llm/og_openai.py +121 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/types.py +4 -0
- opengradient-0.3.17/src/opengradient/__init__.py +0 -127
- opengradient-0.3.17/src/opengradient/llm/__init__.py +0 -5
- {opengradient-0.3.17 → opengradient-0.3.18}/.gitignore +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/LICENSE +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/README.md +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/abi/inference.abi +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/account.py +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/cli.py +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/client.py +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/defaults.py +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/exceptions.py +0 -0
- /opengradient-0.3.17/src/opengradient/llm/chat.py → /opengradient-0.3.18/src/opengradient/llm/og_langchain.py +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/proto/__init__.py +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/proto/infer.proto +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/proto/infer_pb2.py +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/proto/infer_pb2_grpc.py +0 -0
- {opengradient-0.3.17 → opengradient-0.3.18}/src/opengradient/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: opengradient
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.18
|
|
4
4
|
Summary: Python SDK for OpenGradient decentralized model management & inference services
|
|
5
5
|
Project-URL: Homepage, https://opengradient.ai
|
|
6
6
|
Author-email: OpenGradient <oliver@opengradient.ai>
|
|
@@ -25,6 +25,7 @@ License: MIT License
|
|
|
25
25
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
26
26
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
27
|
SOFTWARE.
|
|
28
|
+
License-File: LICENSE
|
|
28
29
|
Classifier: Development Status :: 3 - Alpha
|
|
29
30
|
Classifier: Intended Audience :: Developers
|
|
30
31
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -85,6 +86,7 @@ Requires-Dist: langchain==0.3.7
|
|
|
85
86
|
Requires-Dist: more-itertools==10.5.0
|
|
86
87
|
Requires-Dist: msgpack==1.1.0
|
|
87
88
|
Requires-Dist: multidict==6.1.0
|
|
89
|
+
Requires-Dist: openai==1.58.1
|
|
88
90
|
Requires-Dist: packaging==24.1
|
|
89
91
|
Requires-Dist: pandas==2.2.3
|
|
90
92
|
Requires-Dist: parsimonious==0.10.0
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "opengradient"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.18"
|
|
8
8
|
description = "Python SDK for OpenGradient decentralized model management & inference services"
|
|
9
9
|
authors = [{name = "OpenGradient", email = "oliver@opengradient.ai"}]
|
|
10
10
|
license = {file = "LICENSE"}
|
|
@@ -73,6 +73,7 @@ dependencies = [
|
|
|
73
73
|
"more-itertools==10.5.0",
|
|
74
74
|
"msgpack==1.1.0",
|
|
75
75
|
"multidict==6.1.0",
|
|
76
|
+
"openai==1.58.1",
|
|
76
77
|
"packaging==24.1",
|
|
77
78
|
"pandas==2.2.3",
|
|
78
79
|
"parsimonious==0.10.0",
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"""
|
|
2
|
+
OpenGradient Python SDK for interacting with AI models and infrastructure.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Dict, List, Optional, Tuple
|
|
6
|
+
|
|
7
|
+
from .client import Client
|
|
8
|
+
from .defaults import DEFAULT_INFERENCE_CONTRACT_ADDRESS, DEFAULT_RPC_URL
|
|
9
|
+
from .types import InferenceMode, LlmInferenceMode, LLM, TEE_LLM
|
|
10
|
+
from . import llm
|
|
11
|
+
|
|
12
|
+
__version__ = "0.3.18"
|
|
13
|
+
|
|
14
|
+
_client = None
|
|
15
|
+
|
|
16
|
+
def init(email: str,
|
|
17
|
+
password: str,
|
|
18
|
+
private_key: str,
|
|
19
|
+
rpc_url=DEFAULT_RPC_URL,
|
|
20
|
+
contract_address=DEFAULT_INFERENCE_CONTRACT_ADDRESS):
|
|
21
|
+
"""Initialize the OpenGradient SDK with authentication and network settings.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
email: User's email address for authentication
|
|
25
|
+
password: User's password for authentication
|
|
26
|
+
private_key: Ethereum private key for blockchain transactions
|
|
27
|
+
rpc_url: Optional RPC URL for the blockchain network, defaults to mainnet
|
|
28
|
+
contract_address: Optional inference contract address
|
|
29
|
+
"""
|
|
30
|
+
global _client
|
|
31
|
+
_client = Client(private_key=private_key, rpc_url=rpc_url, contract_address=contract_address, email=email, password=password)
|
|
32
|
+
|
|
33
|
+
def upload(model_path, model_name, version):
|
|
34
|
+
"""Upload a model file to OpenGradient.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
model_path: Path to the model file on local filesystem
|
|
38
|
+
model_name: Name of the model repository
|
|
39
|
+
version: Version string for this model upload
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
dict: Upload response containing file metadata
|
|
43
|
+
|
|
44
|
+
Raises:
|
|
45
|
+
RuntimeError: If SDK is not initialized
|
|
46
|
+
"""
|
|
47
|
+
if _client is None:
|
|
48
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
49
|
+
return _client.upload(model_path, model_name, version)
|
|
50
|
+
|
|
51
|
+
def create_model(model_name: str, model_desc: str, model_path: str = None):
|
|
52
|
+
"""Create a new model repository.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
model_name: Name for the new model repository
|
|
56
|
+
model_desc: Description of the model
|
|
57
|
+
model_path: Optional path to model file to upload immediately
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
dict: Creation response with model metadata and optional upload results
|
|
61
|
+
|
|
62
|
+
Raises:
|
|
63
|
+
RuntimeError: If SDK is not initialized
|
|
64
|
+
"""
|
|
65
|
+
if _client is None:
|
|
66
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
67
|
+
|
|
68
|
+
result = _client.create_model(model_name, model_desc)
|
|
69
|
+
|
|
70
|
+
if model_path:
|
|
71
|
+
version = "0.01"
|
|
72
|
+
upload_result = _client.upload(model_path, model_name, version)
|
|
73
|
+
result["upload"] = upload_result
|
|
74
|
+
|
|
75
|
+
return result
|
|
76
|
+
|
|
77
|
+
def create_version(model_name, notes=None, is_major=False):
|
|
78
|
+
"""Create a new version for an existing model.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
model_name: Name of the model repository
|
|
82
|
+
notes: Optional release notes for this version
|
|
83
|
+
is_major: If True, creates a major version bump instead of minor
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
dict: Version creation response with version metadata
|
|
87
|
+
|
|
88
|
+
Raises:
|
|
89
|
+
RuntimeError: If SDK is not initialized
|
|
90
|
+
"""
|
|
91
|
+
if _client is None:
|
|
92
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
93
|
+
return _client.create_version(model_name, notes, is_major)
|
|
94
|
+
|
|
95
|
+
def infer(model_cid, inference_mode, model_input, max_retries: Optional[int] = None):
|
|
96
|
+
"""Run inference on a model.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
model_cid: CID of the model to use
|
|
100
|
+
inference_mode: Mode of inference (e.g. VANILLA)
|
|
101
|
+
model_input: Input data for the model
|
|
102
|
+
max_retries: Maximum number of retries for failed transactions
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Tuple[str, Any]: Transaction hash and model output
|
|
106
|
+
|
|
107
|
+
Raises:
|
|
108
|
+
RuntimeError: If SDK is not initialized
|
|
109
|
+
"""
|
|
110
|
+
if _client is None:
|
|
111
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
112
|
+
return _client.infer(model_cid, inference_mode, model_input, max_retries=max_retries)
|
|
113
|
+
|
|
114
|
+
def llm_completion(model_cid: LLM,
|
|
115
|
+
prompt: str,
|
|
116
|
+
inference_mode: str = LlmInferenceMode.VANILLA,
|
|
117
|
+
max_tokens: int = 100,
|
|
118
|
+
stop_sequence: Optional[List[str]] = None,
|
|
119
|
+
temperature: float = 0.0,
|
|
120
|
+
max_retries: Optional[int] = None) -> Tuple[str, str]:
|
|
121
|
+
"""Generate text completion using an LLM.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
model_cid: CID of the LLM model to use
|
|
125
|
+
prompt: Text prompt for completion
|
|
126
|
+
inference_mode: Mode of inference, defaults to VANILLA
|
|
127
|
+
max_tokens: Maximum tokens to generate
|
|
128
|
+
stop_sequence: Optional list of sequences where generation should stop
|
|
129
|
+
temperature: Sampling temperature (0.0 = deterministic, 1.0 = creative)
|
|
130
|
+
max_retries: Maximum number of retries for failed transactions
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Tuple[str, str]: Transaction hash and generated text
|
|
134
|
+
|
|
135
|
+
Raises:
|
|
136
|
+
RuntimeError: If SDK is not initialized
|
|
137
|
+
"""
|
|
138
|
+
if _client is None:
|
|
139
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
140
|
+
return _client.llm_completion(model_cid=model_cid,
|
|
141
|
+
inference_mode=inference_mode,
|
|
142
|
+
prompt=prompt,
|
|
143
|
+
max_tokens=max_tokens,
|
|
144
|
+
stop_sequence=stop_sequence,
|
|
145
|
+
temperature=temperature,
|
|
146
|
+
max_retries=max_retries)
|
|
147
|
+
|
|
148
|
+
def llm_chat(model_cid: LLM,
|
|
149
|
+
messages: List[Dict],
|
|
150
|
+
inference_mode: str = LlmInferenceMode.VANILLA,
|
|
151
|
+
max_tokens: int = 100,
|
|
152
|
+
stop_sequence: Optional[List[str]] = None,
|
|
153
|
+
temperature: float = 0.0,
|
|
154
|
+
tools: Optional[List[Dict]] = None,
|
|
155
|
+
tool_choice: Optional[str] = None,
|
|
156
|
+
max_retries: Optional[int] = None) -> Tuple[str, str, Dict]:
|
|
157
|
+
"""Have a chat conversation with an LLM.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
model_cid: CID of the LLM model to use
|
|
161
|
+
messages: List of chat messages, each with 'role' and 'content'
|
|
162
|
+
inference_mode: Mode of inference, defaults to VANILLA
|
|
163
|
+
max_tokens: Maximum tokens to generate
|
|
164
|
+
stop_sequence: Optional list of sequences where generation should stop
|
|
165
|
+
temperature: Sampling temperature (0.0 = deterministic, 1.0 = creative)
|
|
166
|
+
tools: Optional list of tools the model can use
|
|
167
|
+
tool_choice: Optional specific tool to use
|
|
168
|
+
max_retries: Maximum number of retries for failed transactions
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
Tuple[str, str, Dict]: Transaction hash, model response, and metadata
|
|
172
|
+
|
|
173
|
+
Raises:
|
|
174
|
+
RuntimeError: If SDK is not initialized
|
|
175
|
+
"""
|
|
176
|
+
if _client is None:
|
|
177
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
178
|
+
return _client.llm_chat(model_cid=model_cid,
|
|
179
|
+
inference_mode=inference_mode,
|
|
180
|
+
messages=messages,
|
|
181
|
+
max_tokens=max_tokens,
|
|
182
|
+
stop_sequence=stop_sequence,
|
|
183
|
+
temperature=temperature,
|
|
184
|
+
tools=tools,
|
|
185
|
+
tool_choice=tool_choice,
|
|
186
|
+
max_retries=max_retries)
|
|
187
|
+
|
|
188
|
+
def login(email: str, password: str):
|
|
189
|
+
"""Login to OpenGradient.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
email: User's email address
|
|
193
|
+
password: User's password
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
dict: Login response with authentication tokens
|
|
197
|
+
|
|
198
|
+
Raises:
|
|
199
|
+
RuntimeError: If SDK is not initialized
|
|
200
|
+
"""
|
|
201
|
+
if _client is None:
|
|
202
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
203
|
+
return _client.login(email, password)
|
|
204
|
+
|
|
205
|
+
def list_files(model_name: str, version: str) -> List[Dict]:
|
|
206
|
+
"""List files in a model repository version.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
model_name: Name of the model repository
|
|
210
|
+
version: Version string to list files from
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
List[Dict]: List of file metadata dictionaries
|
|
214
|
+
|
|
215
|
+
Raises:
|
|
216
|
+
RuntimeError: If SDK is not initialized
|
|
217
|
+
"""
|
|
218
|
+
if _client is None:
|
|
219
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
220
|
+
return _client.list_files(model_name, version)
|
|
221
|
+
|
|
222
|
+
def generate_image(model: str, prompt: str, height: Optional[int] = None, width: Optional[int] = None) -> bytes:
|
|
223
|
+
"""Generate an image from a text prompt.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
model: Model identifier (e.g. "stabilityai/stable-diffusion-xl-base-1.0")
|
|
227
|
+
prompt: Text description of the desired image
|
|
228
|
+
height: Optional height of the generated image in pixels
|
|
229
|
+
width: Optional width of the generated image in pixels
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
bytes: Raw image data as bytes
|
|
233
|
+
|
|
234
|
+
Raises:
|
|
235
|
+
RuntimeError: If SDK is not initialized
|
|
236
|
+
OpenGradientError: If image generation fails
|
|
237
|
+
"""
|
|
238
|
+
if _client is None:
|
|
239
|
+
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
240
|
+
return _client.generate_image(model, prompt, height=height, width=width)
|
|
241
|
+
|
|
242
|
+
__all__ = [
|
|
243
|
+
'generate_image',
|
|
244
|
+
'list_files'
|
|
245
|
+
'login',
|
|
246
|
+
'llm_chat',
|
|
247
|
+
'llm_completion',
|
|
248
|
+
'infer',
|
|
249
|
+
'create_version',
|
|
250
|
+
'create_model',
|
|
251
|
+
'upload',
|
|
252
|
+
'init',
|
|
253
|
+
'LLM',
|
|
254
|
+
'TEE_LLM'
|
|
255
|
+
]
|
|
256
|
+
|
|
257
|
+
__pdoc__ = {
|
|
258
|
+
'account': False,
|
|
259
|
+
'cli': False,
|
|
260
|
+
'client': False,
|
|
261
|
+
'defaults': False,
|
|
262
|
+
'exceptions': False,
|
|
263
|
+
'llm': True,
|
|
264
|
+
'proto': False,
|
|
265
|
+
'types': False,
|
|
266
|
+
'utils': False
|
|
267
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""
|
|
2
|
+
OpenGradient LLM Adapters
|
|
3
|
+
|
|
4
|
+
This module provides adapter interfaces to use OpenGradient LLMs with popular AI frameworks
|
|
5
|
+
like LangChain and OpenAI. These adapters allow seamless integration of OpenGradient models
|
|
6
|
+
into existing applications and agent frameworks.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .og_langchain import *
|
|
10
|
+
from .og_openai import *
|
|
11
|
+
|
|
12
|
+
def langchain_adapter(private_key: str, model_cid: str, max_tokens: int = 300) -> OpenGradientChatModel:
|
|
13
|
+
"""
|
|
14
|
+
Returns an OpenGradient LLM that implements LangChain's LLM interface
|
|
15
|
+
and can be plugged into LangChain agents.
|
|
16
|
+
"""
|
|
17
|
+
return OpenGradientChatModel(
|
|
18
|
+
private_key=private_key,
|
|
19
|
+
model_cid=model_cid,
|
|
20
|
+
max_tokens=max_tokens)
|
|
21
|
+
|
|
22
|
+
def openai_adapter(private_key: str) -> OpenGradientOpenAIClient:
|
|
23
|
+
"""
|
|
24
|
+
Returns an generic OpenAI LLM client that can be plugged into Swarm and can
|
|
25
|
+
be used with any LLM model on OpenGradient. The LLM is usually defined in the
|
|
26
|
+
agent.
|
|
27
|
+
"""
|
|
28
|
+
return OpenGradientOpenAIClient(private_key=private_key)
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
'langchain_adapter',
|
|
32
|
+
'openai_adapter',
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
__pdoc__ = {
|
|
36
|
+
'og_langchain': False,
|
|
37
|
+
'og_openai': False
|
|
38
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
from openai.types.chat import ChatCompletion
|
|
2
|
+
import opengradient as og
|
|
3
|
+
from opengradient.defaults import DEFAULT_RPC_URL, DEFAULT_INFERENCE_CONTRACT_ADDRESS
|
|
4
|
+
|
|
5
|
+
from typing import List
|
|
6
|
+
import time
|
|
7
|
+
import json
|
|
8
|
+
import uuid
|
|
9
|
+
|
|
10
|
+
class OGCompletions(object):
|
|
11
|
+
client: og.Client
|
|
12
|
+
|
|
13
|
+
def __init__(self, client: og.Client):
|
|
14
|
+
self.client = client
|
|
15
|
+
|
|
16
|
+
def create(
|
|
17
|
+
self,
|
|
18
|
+
model: str,
|
|
19
|
+
messages: List[object],
|
|
20
|
+
tools: List[object],
|
|
21
|
+
tool_choice: str,
|
|
22
|
+
stream: bool = False,
|
|
23
|
+
parallel_tool_calls: bool = False) -> ChatCompletion:
|
|
24
|
+
|
|
25
|
+
# convert OpenAI message format so it's compatible with the SDK
|
|
26
|
+
sdk_messages = OGCompletions.convert_to_abi_compatible(messages)
|
|
27
|
+
|
|
28
|
+
_, finish_reason, chat_completion = self.client.llm_chat(
|
|
29
|
+
model_cid=model,
|
|
30
|
+
messages=sdk_messages,
|
|
31
|
+
max_tokens=200,
|
|
32
|
+
tools=tools,
|
|
33
|
+
tool_choice=tool_choice,
|
|
34
|
+
temperature=0.25,
|
|
35
|
+
inference_mode=og.LlmInferenceMode.VANILLA
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
choice = {
|
|
39
|
+
'index': 0, # Add missing index field
|
|
40
|
+
'finish_reason': finish_reason,
|
|
41
|
+
'message': {
|
|
42
|
+
'role': chat_completion['role'],
|
|
43
|
+
'content': chat_completion['content'],
|
|
44
|
+
'tool_calls': [
|
|
45
|
+
{
|
|
46
|
+
'id': tool_call['id'],
|
|
47
|
+
'type': 'function', # Add missing type field
|
|
48
|
+
'function': { # Add missing function field
|
|
49
|
+
'name': tool_call['name'],
|
|
50
|
+
'arguments': tool_call['arguments']
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
for tool_call in chat_completion.get('tool_calls', [])
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return ChatCompletion(
|
|
59
|
+
id=str(uuid.uuid4()),
|
|
60
|
+
created=int(time.time()),
|
|
61
|
+
model=model,
|
|
62
|
+
object='chat.completion',
|
|
63
|
+
choices=[choice]
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
@staticmethod
|
|
68
|
+
def convert_to_abi_compatible(messages):
|
|
69
|
+
sdk_messages = []
|
|
70
|
+
|
|
71
|
+
for message in messages:
|
|
72
|
+
role = message['role']
|
|
73
|
+
sdk_message = {
|
|
74
|
+
'role': role
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if role == 'system':
|
|
78
|
+
sdk_message['content'] = message['content']
|
|
79
|
+
elif role == 'user':
|
|
80
|
+
sdk_message['content'] = message['content']
|
|
81
|
+
elif role == 'tool':
|
|
82
|
+
sdk_message['content'] = message['content']
|
|
83
|
+
sdk_message['tool_call_id'] = message['tool_call_id']
|
|
84
|
+
elif role == 'assistant':
|
|
85
|
+
flattened_calls = []
|
|
86
|
+
for tool_call in message['tool_calls']:
|
|
87
|
+
# OpenAI format
|
|
88
|
+
flattened_call = {
|
|
89
|
+
'id': tool_call['id'],
|
|
90
|
+
'name': tool_call['function']['name'],
|
|
91
|
+
'arguments': tool_call['function']['arguments']
|
|
92
|
+
}
|
|
93
|
+
flattened_calls.append(flattened_call)
|
|
94
|
+
|
|
95
|
+
sdk_message['tool_calls'] = flattened_calls
|
|
96
|
+
sdk_message['content'] = message['content']
|
|
97
|
+
|
|
98
|
+
sdk_messages.append(sdk_message)
|
|
99
|
+
|
|
100
|
+
return sdk_messages
|
|
101
|
+
|
|
102
|
+
class OGChat(object):
|
|
103
|
+
completions: OGCompletions
|
|
104
|
+
|
|
105
|
+
def __init__(self, client: og.Client):
|
|
106
|
+
self.completions = OGCompletions(client)
|
|
107
|
+
|
|
108
|
+
class OpenGradientOpenAIClient(object):
|
|
109
|
+
"""OpenAI client implementation"""
|
|
110
|
+
client: og.Client
|
|
111
|
+
chat: OGChat
|
|
112
|
+
|
|
113
|
+
def __init__(self, private_key: str):
|
|
114
|
+
self.client = og.Client(
|
|
115
|
+
private_key=private_key,
|
|
116
|
+
rpc_url=DEFAULT_RPC_URL,
|
|
117
|
+
contract_address=DEFAULT_INFERENCE_CONTRACT_ADDRESS,
|
|
118
|
+
email=None,
|
|
119
|
+
password=None
|
|
120
|
+
)
|
|
121
|
+
self.chat = OGChat(self.client)
|
|
@@ -79,6 +79,8 @@ class Abi:
|
|
|
79
79
|
return result
|
|
80
80
|
|
|
81
81
|
class LLM(str, Enum):
|
|
82
|
+
"""Enum for available LLM models"""
|
|
83
|
+
|
|
82
84
|
META_LLAMA_3_8B_INSTRUCT = "meta-llama/Meta-Llama-3-8B-Instruct"
|
|
83
85
|
LLAMA_3_2_3B_INSTRUCT = "meta-llama/Llama-3.2-3B-Instruct"
|
|
84
86
|
MISTRAL_7B_INSTRUCT_V3 = "mistralai/Mistral-7B-Instruct-v0.3"
|
|
@@ -86,4 +88,6 @@ class LLM(str, Enum):
|
|
|
86
88
|
META_LLAMA_3_1_70B_INSTRUCT = "meta-llama/Llama-3.1-70B-Instruct"
|
|
87
89
|
|
|
88
90
|
class TEE_LLM(str, Enum):
|
|
91
|
+
"""Enum for LLM models available for TEE execution"""
|
|
92
|
+
|
|
89
93
|
META_LLAMA_3_1_70B_INSTRUCT = "meta-llama/Llama-3.1-70B-Instruct"
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
from typing import Dict, List, Optional, Tuple
|
|
2
|
-
|
|
3
|
-
from .client import Client
|
|
4
|
-
from .defaults import DEFAULT_INFERENCE_CONTRACT_ADDRESS, DEFAULT_RPC_URL
|
|
5
|
-
from .types import InferenceMode, LlmInferenceMode, LLM, TEE_LLM
|
|
6
|
-
from . import llm
|
|
7
|
-
|
|
8
|
-
__version__ = "0.3.17"
|
|
9
|
-
|
|
10
|
-
_client = None
|
|
11
|
-
|
|
12
|
-
def init(email: str,
|
|
13
|
-
password: str,
|
|
14
|
-
private_key: str,
|
|
15
|
-
rpc_url=DEFAULT_RPC_URL,
|
|
16
|
-
contract_address=DEFAULT_INFERENCE_CONTRACT_ADDRESS):
|
|
17
|
-
global _client
|
|
18
|
-
_client = Client(private_key=private_key, rpc_url=rpc_url, contract_address=contract_address, email=email, password=password)
|
|
19
|
-
|
|
20
|
-
def upload(model_path, model_name, version):
|
|
21
|
-
if _client is None:
|
|
22
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
23
|
-
return _client.upload(model_path, model_name, version)
|
|
24
|
-
|
|
25
|
-
def create_model(model_name: str, model_desc: str, model_path: str = None):
|
|
26
|
-
if _client is None:
|
|
27
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
28
|
-
|
|
29
|
-
result = _client.create_model(model_name, model_desc)
|
|
30
|
-
|
|
31
|
-
if model_path:
|
|
32
|
-
version = "0.01"
|
|
33
|
-
upload_result = _client.upload(model_path, model_name, version)
|
|
34
|
-
result["upload"] = upload_result
|
|
35
|
-
|
|
36
|
-
return result
|
|
37
|
-
|
|
38
|
-
def create_version(model_name, notes=None, is_major=False):
|
|
39
|
-
if _client is None:
|
|
40
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
41
|
-
return _client.create_version(model_name, notes, is_major)
|
|
42
|
-
|
|
43
|
-
def infer(model_cid, inference_mode, model_input, max_retries: Optional[int] = None):
|
|
44
|
-
"""
|
|
45
|
-
Perform inference on a model.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
model_cid: Model CID to use for inference
|
|
49
|
-
inference_mode: Mode of inference (e.g. VANILLA)
|
|
50
|
-
model_input: Input data for the model
|
|
51
|
-
max_retries: Optional maximum number of retry attempts for transaction errors
|
|
52
|
-
|
|
53
|
-
Returns:
|
|
54
|
-
Tuple of (transaction hash, model output)
|
|
55
|
-
"""
|
|
56
|
-
if _client is None:
|
|
57
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
58
|
-
return _client.infer(model_cid, inference_mode, model_input, max_retries=max_retries)
|
|
59
|
-
|
|
60
|
-
def llm_completion(model_cid: LLM,
|
|
61
|
-
prompt: str,
|
|
62
|
-
inference_mode: str = LlmInferenceMode.VANILLA,
|
|
63
|
-
max_tokens: int = 100,
|
|
64
|
-
stop_sequence: Optional[List[str]] = None,
|
|
65
|
-
temperature: float = 0.0,
|
|
66
|
-
max_retries: Optional[int] = None) -> Tuple[str, str]:
|
|
67
|
-
if _client is None:
|
|
68
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
69
|
-
return _client.llm_completion(model_cid=model_cid,
|
|
70
|
-
inference_mode=inference_mode,
|
|
71
|
-
prompt=prompt,
|
|
72
|
-
max_tokens=max_tokens,
|
|
73
|
-
stop_sequence=stop_sequence,
|
|
74
|
-
temperature=temperature,
|
|
75
|
-
max_retries=max_retries)
|
|
76
|
-
|
|
77
|
-
def llm_chat(model_cid: LLM,
|
|
78
|
-
messages: List[Dict],
|
|
79
|
-
inference_mode: str = LlmInferenceMode.VANILLA,
|
|
80
|
-
max_tokens: int = 100,
|
|
81
|
-
stop_sequence: Optional[List[str]] = None,
|
|
82
|
-
temperature: float = 0.0,
|
|
83
|
-
tools: Optional[List[Dict]] = None,
|
|
84
|
-
tool_choice: Optional[str] = None,
|
|
85
|
-
max_retries: Optional[int] = None) -> Tuple[str, str, Dict]:
|
|
86
|
-
if _client is None:
|
|
87
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
88
|
-
return _client.llm_chat(model_cid=model_cid,
|
|
89
|
-
inference_mode=inference_mode,
|
|
90
|
-
messages=messages,
|
|
91
|
-
max_tokens=max_tokens,
|
|
92
|
-
stop_sequence=stop_sequence,
|
|
93
|
-
temperature=temperature,
|
|
94
|
-
tools=tools,
|
|
95
|
-
tool_choice=tool_choice,
|
|
96
|
-
max_retries=max_retries)
|
|
97
|
-
|
|
98
|
-
def login(email: str, password: str):
|
|
99
|
-
if _client is None:
|
|
100
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
101
|
-
return _client.login(email, password)
|
|
102
|
-
|
|
103
|
-
def list_files(model_name: str, version: str) -> List[Dict]:
|
|
104
|
-
if _client is None:
|
|
105
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
106
|
-
return _client.list_files(model_name, version)
|
|
107
|
-
|
|
108
|
-
def generate_image(model: str, prompt: str, height: Optional[int] = None, width: Optional[int] = None) -> bytes:
|
|
109
|
-
"""
|
|
110
|
-
Generate an image using the specified model and prompt.
|
|
111
|
-
|
|
112
|
-
Args:
|
|
113
|
-
model (str): The model identifier (e.g. "stabilityai/stable-diffusion-xl-base-1.0")
|
|
114
|
-
prompt (str): The text prompt to generate the image from
|
|
115
|
-
height (Optional[int]): Height of the generated image. Default is None.
|
|
116
|
-
width (Optional[int]): Width of the generated image. Default is None.
|
|
117
|
-
|
|
118
|
-
Returns:
|
|
119
|
-
bytes: The raw image data bytes
|
|
120
|
-
|
|
121
|
-
Raises:
|
|
122
|
-
RuntimeError: If the client is not initialized
|
|
123
|
-
OpenGradientError: If the image generation fails
|
|
124
|
-
"""
|
|
125
|
-
if _client is None:
|
|
126
|
-
raise RuntimeError("OpenGradient client not initialized. Call og.init() first.")
|
|
127
|
-
return _client.generate_image(model, prompt, height=height, width=width)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|