lollms-client 1.7.10__py3-none-any.whl → 1.8.3__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.
- lollms_client/__init__.py +1 -1
- lollms_client/llm_bindings/claude/__init__.py +0 -1
- lollms_client/llm_bindings/grok/__init__.py +0 -1
- lollms_client/llm_bindings/llama_cpp_server/__init__.py +726 -0
- lollms_client/llm_bindings/ollama/__init__.py +40 -2
- lollms_client/lollms_discussion.py +209 -65
- lollms_client/lollms_llm_binding.py +15 -1
- lollms_client/lollms_mcp_binding.py +15 -3
- lollms_client/lollms_stt_binding.py +16 -2
- lollms_client/lollms_tti_binding.py +16 -2
- lollms_client/lollms_ttm_binding.py +16 -2
- lollms_client/lollms_tts_binding.py +16 -2
- lollms_client/lollms_ttv_binding.py +16 -2
- lollms_client/tti_bindings/diffusers/__init__.py +132 -79
- lollms_client/tti_bindings/diffusers/server/main.py +76 -65
- lollms_client/tti_bindings/open_router/__init__.py +341 -0
- lollms_client/tts_bindings/xtts/__init__.py +1 -1
- {lollms_client-1.7.10.dist-info → lollms_client-1.8.3.dist-info}/METADATA +1 -1
- {lollms_client-1.7.10.dist-info → lollms_client-1.8.3.dist-info}/RECORD +22 -21
- lollms_client/llm_bindings/llamacpp/__init__.py +0 -1155
- {lollms_client-1.7.10.dist-info → lollms_client-1.8.3.dist-info}/WHEEL +0 -0
- {lollms_client-1.7.10.dist-info → lollms_client-1.8.3.dist-info}/licenses/LICENSE +0 -0
- {lollms_client-1.7.10.dist-info → lollms_client-1.8.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
import json
|
|
3
|
+
import base64
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Optional, List, Dict, Any, Union, Callable
|
|
6
|
+
from lollms_client.lollms_tti_binding import LollmsTTIBinding
|
|
7
|
+
from lollms_client.lollms_types import MSG_TYPE
|
|
8
|
+
from ascii_colors import ASCIIColors, trace_exception
|
|
9
|
+
|
|
10
|
+
BindingName = "OpenRouterTTIBinding"
|
|
11
|
+
|
|
12
|
+
class OpenRouterTTIBinding(LollmsTTIBinding):
|
|
13
|
+
def __init__(self, **kwargs):
|
|
14
|
+
# Prioritize 'model_name' but accept 'model' as an alias from config files.
|
|
15
|
+
if 'model' in kwargs and 'model_name' not in kwargs:
|
|
16
|
+
kwargs['model_name'] = kwargs.pop('model')
|
|
17
|
+
|
|
18
|
+
# The manager passes binding_name in kwargs. To avoid "multiple values for keyword argument",
|
|
19
|
+
# we pop it and use the local BindingName constant or the passed value.
|
|
20
|
+
binding_name = kwargs.pop('binding_name', BindingName)
|
|
21
|
+
super().__init__(binding_name=binding_name, **kwargs)
|
|
22
|
+
|
|
23
|
+
self.service_key = kwargs.get("service_key", "")
|
|
24
|
+
# Default to a known stable image-capable model
|
|
25
|
+
self.model_name = kwargs.get("model_name", "google/gemini-2.0-flash-exp:free")
|
|
26
|
+
self.host_address = "https://openrouter.ai/api/v1"
|
|
27
|
+
self.config = kwargs
|
|
28
|
+
|
|
29
|
+
def _get_aspect_ratio(self, width: int, height: int) -> str:
|
|
30
|
+
"""Helper to map width/height to OpenRouter supported aspect ratios."""
|
|
31
|
+
ratio = width / height
|
|
32
|
+
if abs(ratio - 1.0) < 0.1: return "1:1"
|
|
33
|
+
if abs(ratio - 0.66) < 0.1: return "2:3"
|
|
34
|
+
if abs(ratio - 1.5) < 0.1: return "3:2"
|
|
35
|
+
if abs(ratio - 0.75) < 0.1: return "3:4"
|
|
36
|
+
if abs(ratio - 1.33) < 0.1: return "4:3"
|
|
37
|
+
if abs(ratio - 0.8) < 0.1: return "4:5"
|
|
38
|
+
if abs(ratio - 1.25) < 0.1: return "5:4"
|
|
39
|
+
if abs(ratio - 0.56) < 0.1: return "9:16"
|
|
40
|
+
if abs(ratio - 1.77) < 0.1: return "16:9"
|
|
41
|
+
if abs(ratio - 2.33) < 0.1: return "21:9"
|
|
42
|
+
return "1:1"
|
|
43
|
+
|
|
44
|
+
def generate_image(self,
|
|
45
|
+
prompt: str,
|
|
46
|
+
negative_prompt: str = "",
|
|
47
|
+
width: int = 1024,
|
|
48
|
+
height: int = 1024,
|
|
49
|
+
**kwargs) -> bytes:
|
|
50
|
+
"""
|
|
51
|
+
Generates an image using Open Router's /chat/completions endpoint with modalities.
|
|
52
|
+
"""
|
|
53
|
+
model = kwargs.get("model_name", self.model_name)
|
|
54
|
+
|
|
55
|
+
headers = {
|
|
56
|
+
"Authorization": f"Bearer {self.service_key}",
|
|
57
|
+
"Content-Type": "application/json",
|
|
58
|
+
"HTTP-Referer": "https://github.com/ParisNeo/lollms_client",
|
|
59
|
+
"X-Title": "LoLLMS Client"
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# Open Router specific payload using Chat Completions
|
|
63
|
+
payload = {
|
|
64
|
+
"model": model,
|
|
65
|
+
"messages": [
|
|
66
|
+
{
|
|
67
|
+
"role": "user",
|
|
68
|
+
"content": prompt if not negative_prompt else f"{prompt}\n\nNegative prompt: {negative_prompt}"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"modalities": ["image", "text"],
|
|
72
|
+
"stream": False
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
# Add image configuration if relevant
|
|
76
|
+
image_config = {}
|
|
77
|
+
aspect_ratio = kwargs.get("aspect_ratio")
|
|
78
|
+
if not aspect_ratio:
|
|
79
|
+
aspect_ratio = self._get_aspect_ratio(width, height)
|
|
80
|
+
|
|
81
|
+
image_config["aspect_ratio"] = aspect_ratio
|
|
82
|
+
|
|
83
|
+
if "image_size" in kwargs:
|
|
84
|
+
image_config["image_size"] = kwargs["image_size"]
|
|
85
|
+
|
|
86
|
+
payload["image_config"] = image_config
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
ASCIIColors.info(f"Open Router TTI Request: Model={model}, Aspect Ratio={aspect_ratio}")
|
|
90
|
+
response = requests.post(
|
|
91
|
+
f"{self.host_address}/chat/completions",
|
|
92
|
+
headers=headers,
|
|
93
|
+
json=payload,
|
|
94
|
+
timeout=300
|
|
95
|
+
)
|
|
96
|
+
response.raise_for_status()
|
|
97
|
+
|
|
98
|
+
result = response.json()
|
|
99
|
+
if result.get("choices"):
|
|
100
|
+
message = result["choices"][0].get("message", {})
|
|
101
|
+
images = message.get("images", [])
|
|
102
|
+
|
|
103
|
+
if images:
|
|
104
|
+
image_url = images[0]["image_url"]["url"]
|
|
105
|
+
if image_url.startswith("data:image"):
|
|
106
|
+
base64_str = image_url.split(",")[1]
|
|
107
|
+
return base64.b64decode(base64_str)
|
|
108
|
+
else:
|
|
109
|
+
img_res = requests.get(image_url)
|
|
110
|
+
img_res.raise_for_status()
|
|
111
|
+
return img_res.content
|
|
112
|
+
|
|
113
|
+
raise ValueError(f"No image found in Open Router response: {result}")
|
|
114
|
+
|
|
115
|
+
except Exception as e:
|
|
116
|
+
ASCIIColors.error(f"Open Router TTI Error: {e}")
|
|
117
|
+
trace_exception(e)
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
def list_models(self) -> List[Dict[str, Any]]:
|
|
121
|
+
"""
|
|
122
|
+
Lists available models from Open Router and filters for TTI capabilities.
|
|
123
|
+
"""
|
|
124
|
+
try:
|
|
125
|
+
response = requests.get(f"{self.host_address}/models")
|
|
126
|
+
response.raise_for_status()
|
|
127
|
+
models = response.json().get("data", [])
|
|
128
|
+
|
|
129
|
+
filtered_models = []
|
|
130
|
+
# Curated list of keywords that identify Image Generation models on OpenRouter
|
|
131
|
+
tti_keywords = ["flux", "dall-e", "imagen", "stable-diffusion", "midjourney", "riverflow"]
|
|
132
|
+
|
|
133
|
+
for m in models:
|
|
134
|
+
m_id = m.get("id", "").lower()
|
|
135
|
+
description = m.get("description", "").lower()
|
|
136
|
+
# OpenRouter sometimes provides output_modalities in the architecture block
|
|
137
|
+
modality = m.get("architecture", {}).get("modality", "text")
|
|
138
|
+
|
|
139
|
+
# Check if it's explicitly an image model or matches TTI keywords
|
|
140
|
+
is_tti = "image" in modality or \
|
|
141
|
+
any(kw in m_id for kw in tti_keywords) or \
|
|
142
|
+
"generate images" in description or \
|
|
143
|
+
"text-to-image" in description
|
|
144
|
+
|
|
145
|
+
if is_tti:
|
|
146
|
+
filtered_models.append({
|
|
147
|
+
"model_name": m.get("id"),
|
|
148
|
+
"display_name": m.get("name"),
|
|
149
|
+
"description": m.get("description", "Image generation model")
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
# Sort by name for easier navigation
|
|
153
|
+
filtered_models = sorted(filtered_models, key=lambda x: x["display_name"])
|
|
154
|
+
|
|
155
|
+
# Hardcoded fallbacks if API discovery fails or to ensure core models are present
|
|
156
|
+
if not filtered_models:
|
|
157
|
+
return [
|
|
158
|
+
{"model_name": "google/gemini-3-pro-image-preview", "display_name": "Gemini 3.0 Pro image"},
|
|
159
|
+
{"model_name": "black-forest-labs/flux.1-pro", "display_name": "FLUX.1 Pro"},
|
|
160
|
+
{"model_name": "openai/gpt-5-image", "display_name": "gpt-5-image"}
|
|
161
|
+
]
|
|
162
|
+
|
|
163
|
+
return filtered_models
|
|
164
|
+
except Exception as e:
|
|
165
|
+
ASCIIColors.error(f"Failed to list Open Router models: {e}")
|
|
166
|
+
return []
|
|
167
|
+
|
|
168
|
+
def list_services(self, **kwargs) -> List[Dict[str, str]]:
|
|
169
|
+
return [{"name": "Open Router TTI", "id": "open_router"}]
|
|
170
|
+
|
|
171
|
+
def get_settings(self, **kwargs) -> Optional[Dict[str, Any]]:
|
|
172
|
+
return self.config
|
|
173
|
+
|
|
174
|
+
def set_settings(self, settings: Dict[str, Any], **kwargs) -> bool:
|
|
175
|
+
self.config.update(settings)
|
|
176
|
+
if "service_key" in settings:
|
|
177
|
+
self.service_key = settings["service_key"]
|
|
178
|
+
if "model_name" in settings:
|
|
179
|
+
self.model_name = settings["model_name"]
|
|
180
|
+
return True
|
|
181
|
+
|
|
182
|
+
def edit_image(self, images: Union[str, List[str], "Image.Image", List["Image.Image"]], prompt: str, **kwargs) -> bytes:
|
|
183
|
+
|
|
184
|
+
model = kwargs.get("model_name", self.model_name)
|
|
185
|
+
negative_prompt = kwargs.get("negative_prompt", "")
|
|
186
|
+
width = kwargs.get("width", 1024)
|
|
187
|
+
height = kwargs.get("height", 1024)
|
|
188
|
+
|
|
189
|
+
headers = {
|
|
190
|
+
"Authorization": f"Bearer {self.service_key}",
|
|
191
|
+
"Content-Type": "application/json",
|
|
192
|
+
"HTTP-Referer": "https://github.com/ParisNeo/lollms_client",
|
|
193
|
+
"X-Title": "LoLLMS Client"
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
# Convert images to base64 data URLs
|
|
197
|
+
if not isinstance(images, list):
|
|
198
|
+
images = [images]
|
|
199
|
+
|
|
200
|
+
image_contents = []
|
|
201
|
+
for img in images:
|
|
202
|
+
if isinstance(img, str):
|
|
203
|
+
# Check if it's already a data URL
|
|
204
|
+
if img.startswith('data:image'):
|
|
205
|
+
image_contents.append({
|
|
206
|
+
"type": "image_url",
|
|
207
|
+
"image_url": {"url": img}
|
|
208
|
+
})
|
|
209
|
+
# Check if it's a regular URL
|
|
210
|
+
elif img.startswith(('http://', 'https://')):
|
|
211
|
+
image_contents.append({
|
|
212
|
+
"type": "image_url",
|
|
213
|
+
"image_url": {"url": img}
|
|
214
|
+
})
|
|
215
|
+
# Check if it's base64 data without the data URL prefix
|
|
216
|
+
elif len(img) > 100 and not '/' in img[:50] and not '\\' in img[:50]:
|
|
217
|
+
# Assume it's raw base64 data
|
|
218
|
+
image_contents.append({
|
|
219
|
+
"type": "image_url",
|
|
220
|
+
"image_url": {"url": f"data:image/png;base64,{img}"}
|
|
221
|
+
})
|
|
222
|
+
else:
|
|
223
|
+
# Assume it's a local file path
|
|
224
|
+
try:
|
|
225
|
+
with open(img, 'rb') as f:
|
|
226
|
+
img_data = base64.b64encode(f.read()).decode('utf-8')
|
|
227
|
+
image_contents.append({
|
|
228
|
+
"type": "image_url",
|
|
229
|
+
"image_url": {"url": f"data:image/jpeg;base64,{img_data}"}
|
|
230
|
+
})
|
|
231
|
+
except FileNotFoundError:
|
|
232
|
+
ASCIIColors.warning(f"Could not find file: {img[:50]}... treating as base64 data")
|
|
233
|
+
# If file not found, treat as base64
|
|
234
|
+
image_contents.append({
|
|
235
|
+
"type": "image_url",
|
|
236
|
+
"image_url": {"url": f"data:image/png;base64,{img}"}
|
|
237
|
+
})
|
|
238
|
+
else:
|
|
239
|
+
# PIL Image object
|
|
240
|
+
from io import BytesIO
|
|
241
|
+
buffer = BytesIO()
|
|
242
|
+
img.save(buffer, format='PNG')
|
|
243
|
+
img_data = base64.b64encode(buffer.getvalue()).decode('utf-8')
|
|
244
|
+
image_contents.append({
|
|
245
|
+
"type": "image_url",
|
|
246
|
+
"image_url": {"url": f"data:image/png;base64,{img_data}"}
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
# Build message content with images and text
|
|
250
|
+
content = image_contents + [{
|
|
251
|
+
"type": "text",
|
|
252
|
+
"text": prompt if not negative_prompt else f"{prompt}\n\nNegative prompt: {negative_prompt}"
|
|
253
|
+
}]
|
|
254
|
+
|
|
255
|
+
# Open Router specific payload using Chat Completions
|
|
256
|
+
payload = {
|
|
257
|
+
"model": model,
|
|
258
|
+
"messages": [
|
|
259
|
+
{
|
|
260
|
+
"role": "user",
|
|
261
|
+
"content": content
|
|
262
|
+
}
|
|
263
|
+
],
|
|
264
|
+
"modalities": ["image", "text"],
|
|
265
|
+
"stream": False
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
# Add image configuration if relevant
|
|
269
|
+
image_config = {}
|
|
270
|
+
aspect_ratio = kwargs.get("aspect_ratio")
|
|
271
|
+
if not aspect_ratio:
|
|
272
|
+
aspect_ratio = self._get_aspect_ratio(width, height)
|
|
273
|
+
|
|
274
|
+
image_config["aspect_ratio"] = aspect_ratio
|
|
275
|
+
|
|
276
|
+
if "image_size" in kwargs:
|
|
277
|
+
image_config["image_size"] = kwargs["image_size"]
|
|
278
|
+
|
|
279
|
+
payload["image_config"] = image_config
|
|
280
|
+
|
|
281
|
+
try:
|
|
282
|
+
ASCIIColors.info(f"Open Router Image Edit Request: Model={model}, Aspect Ratio={aspect_ratio}, Images={len(images)}")
|
|
283
|
+
response = requests.post(
|
|
284
|
+
f"{self.host_address}/chat/completions",
|
|
285
|
+
headers=headers,
|
|
286
|
+
json=payload,
|
|
287
|
+
timeout=300
|
|
288
|
+
)
|
|
289
|
+
response.raise_for_status()
|
|
290
|
+
|
|
291
|
+
result = response.json()
|
|
292
|
+
if result.get("choices"):
|
|
293
|
+
choice = result["choices"][0]
|
|
294
|
+
|
|
295
|
+
# Check if there's an error in the choice
|
|
296
|
+
if "error" in choice:
|
|
297
|
+
error_info = choice["error"]
|
|
298
|
+
error_msg = error_info.get("message", "Unknown error")
|
|
299
|
+
error_code = error_info.get("code", "unknown")
|
|
300
|
+
raise ValueError(f"API Error ({error_code}): {error_msg}")
|
|
301
|
+
|
|
302
|
+
message = choice.get("message", {})
|
|
303
|
+
|
|
304
|
+
# Check if there are images in the response
|
|
305
|
+
response_images = message.get("images", [])
|
|
306
|
+
if response_images:
|
|
307
|
+
image_url = response_images[0]["image_url"]["url"]
|
|
308
|
+
if image_url.startswith("data:image"):
|
|
309
|
+
base64_str = image_url.split(",")[1]
|
|
310
|
+
return base64.b64decode(base64_str)
|
|
311
|
+
else:
|
|
312
|
+
img_res = requests.get(image_url)
|
|
313
|
+
img_res.raise_for_status()
|
|
314
|
+
return img_res.content
|
|
315
|
+
|
|
316
|
+
# If no images, check if there's a text response (refusal or error)
|
|
317
|
+
content = message.get("content", "")
|
|
318
|
+
if content:
|
|
319
|
+
raise ValueError(f"Model returned text instead of image: {content}")
|
|
320
|
+
|
|
321
|
+
raise ValueError(f"No image found in Open Router response: {result}")
|
|
322
|
+
|
|
323
|
+
except ValueError as ve:
|
|
324
|
+
# Re-raise ValueError with the message for user feedback
|
|
325
|
+
ASCIIColors.error(f"Open Router Image Edit Error: {ve}")
|
|
326
|
+
raise
|
|
327
|
+
except Exception as e:
|
|
328
|
+
ASCIIColors.error(f"Open Router Image Edit Error: {e}")
|
|
329
|
+
trace_exception(e)
|
|
330
|
+
return None
|
|
331
|
+
|
|
332
|
+
if __name__ == "__main__":
|
|
333
|
+
import os
|
|
334
|
+
key = os.getenv("OPENROUTER_API_KEY", "")
|
|
335
|
+
if not key:
|
|
336
|
+
print("Please set OPENROUTER_API_KEY env var.")
|
|
337
|
+
else:
|
|
338
|
+
binding = OpenRouterTTIBinding(service_key=key)
|
|
339
|
+
img = binding.generate_image("A cute robot painting a picture")
|
|
340
|
+
if img:
|
|
341
|
+
with open("output.png", "wb") as f: f.write(img)
|
|
@@ -33,7 +33,7 @@ class XTTSClientBinding(LollmsTTSBinding):
|
|
|
33
33
|
self.config = kwargs
|
|
34
34
|
self.host = kwargs.get("host", "localhost")
|
|
35
35
|
self.port = kwargs.get("port", 9633)
|
|
36
|
-
self.auto_start_server = kwargs.get("auto_start_server",
|
|
36
|
+
self.auto_start_server = kwargs.get("auto_start_server", False)
|
|
37
37
|
self.server_process = None
|
|
38
38
|
self.base_url = f"http://{self.host}:{self.port}"
|
|
39
39
|
self.binding_root = Path(__file__).parent
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
lollms_client/__init__.py,sha256=
|
|
1
|
+
lollms_client/__init__.py,sha256=G1dXpbCXNzhb6PBDpJYgUBVDWKdEvPg59BE8Y91H5Ps,1146
|
|
2
2
|
lollms_client/lollms_agentic.py,sha256=ljalnmeSU-sbzH19-c9TzrJ-HhEeo4mxXmpJGkXj720,14094
|
|
3
3
|
lollms_client/lollms_base_binding.py,sha256=5nVnj7idw9nY1et_qXL9gg8qHvr4kpZF92HUJlvlitE,2019
|
|
4
4
|
lollms_client/lollms_config.py,sha256=goEseDwDxYJf3WkYJ4IrLXwg3Tfw73CXV2Avg45M_hE,21876
|
|
5
5
|
lollms_client/lollms_core.py,sha256=JAyVDYQeyQE6e-p9M8bzyKb1fHWK7lQrapuryds60PU,240436
|
|
6
|
-
lollms_client/lollms_discussion.py,sha256=
|
|
6
|
+
lollms_client/lollms_discussion.py,sha256=AL88Ulblu1mmidSPUA82WUTajBA8on-ZCwBZKjq62bE,130259
|
|
7
7
|
lollms_client/lollms_js_analyzer.py,sha256=01zUvuO2F_lnUe_0NLxe1MF5aHE1hO8RZi48mNPv-aw,8361
|
|
8
|
-
lollms_client/lollms_llm_binding.py,sha256=
|
|
9
|
-
lollms_client/lollms_mcp_binding.py,sha256=
|
|
8
|
+
lollms_client/lollms_llm_binding.py,sha256=J64w21Y_HUNAHKEmjpwAOw-PodM4qCK0l3cQ5w_GJLw,17726
|
|
9
|
+
lollms_client/lollms_mcp_binding.py,sha256=XfAQsBcDzKgbx5ED4z16_Qy_5wJZ0MtgTXJJ68KxAus,7974
|
|
10
10
|
lollms_client/lollms_mcp_security.py,sha256=FhVTDhSBjksGEZnopVnjFmEF5dv7D8bBTqoaj4BiF0E,3562
|
|
11
11
|
lollms_client/lollms_personality.py,sha256=kGuFwmgA9QDLcQlLQ9sKeceMujdEo0Aw28fN5H8MpjI,8847
|
|
12
12
|
lollms_client/lollms_python_analyzer.py,sha256=7gf1fdYgXCOkPUkBAPNmr6S-66hMH4_KonOMsADASxc,10246
|
|
13
|
-
lollms_client/lollms_stt_binding.py,sha256=
|
|
14
|
-
lollms_client/lollms_tti_binding.py,sha256=
|
|
15
|
-
lollms_client/lollms_ttm_binding.py,sha256=
|
|
16
|
-
lollms_client/lollms_tts_binding.py,sha256=
|
|
17
|
-
lollms_client/lollms_ttv_binding.py,sha256=
|
|
13
|
+
lollms_client/lollms_stt_binding.py,sha256=gEUQTwf-K3lySWe1JT_FV1WZ8WrKsBYnZpyKtckAtc4,7116
|
|
14
|
+
lollms_client/lollms_tti_binding.py,sha256=5P5yQCCwdzFa7bdMJfnzIcvA6tvt2sjqFG_i-unBW9g,8256
|
|
15
|
+
lollms_client/lollms_ttm_binding.py,sha256=a_Yk6dnjYUL68VObRrstGNxoaE-FaU8hqeWqJo_NtMA,4108
|
|
16
|
+
lollms_client/lollms_tts_binding.py,sha256=clgD31qHlZXxeDlioeEHqiZ4fyaE8WTXBlGstHmamg4,6088
|
|
17
|
+
lollms_client/lollms_ttv_binding.py,sha256=kX7LyaJk56YHL2KcHFz0AoSotAWauKv2BCHgqkRZ5sg,4106
|
|
18
18
|
lollms_client/lollms_types.py,sha256=FuN7BPhsz9tzCwOkoLt_MvC_t4VkeU3elNA6ooGy_t4,3593
|
|
19
19
|
lollms_client/lollms_utilities.py,sha256=3DAsII2X9uhRzRL-D0QlALcEdRg82y7OIL4yHVF32gY,19446
|
|
20
20
|
lollms_client/assets/models_ctx_sizes.json,sha256=jFDLW4GoT431544QXXyi9fA5tqIBmTrwaIA1_syoZ-Y,14972
|
|
21
21
|
lollms_client/llm_bindings/__init__.py,sha256=9sWGpmWSSj6KQ8H4lKGCjpLYwhnVdL_2N7gXCphPqh4,14
|
|
22
22
|
lollms_client/llm_bindings/azure_openai/__init__.py,sha256=bTb_JdG060RZB5rWLPKyvTUA0I-_XAx2FDWg4y3Eyi8,16503
|
|
23
|
-
lollms_client/llm_bindings/claude/__init__.py,sha256=
|
|
23
|
+
lollms_client/llm_bindings/claude/__init__.py,sha256=_d1bYuUyHIlbnSMo2OIQKObxmeaId_bxwvZJZcRawKs,30179
|
|
24
24
|
lollms_client/llm_bindings/gemini/__init__.py,sha256=CblEpmGTVJDrbRFVNQBuUTMj6j5RpI9h5M3KUjMUKxk,25910
|
|
25
|
-
lollms_client/llm_bindings/grok/__init__.py,sha256=
|
|
25
|
+
lollms_client/llm_bindings/grok/__init__.py,sha256=gxbQYUhT5TN45aiy1JjtceDI5vaH8N9h_uPpNrNnwMg,25506
|
|
26
26
|
lollms_client/llm_bindings/groq/__init__.py,sha256=JQCbvMUOWelHPxKX8PYAtqJgb4UzuTtp_qdMILn8zm8,12122
|
|
27
27
|
lollms_client/llm_bindings/hugging_face_inference_api/__init__.py,sha256=szA1NRa7urNfFG3JrRU0FtJsyde24rciZhGaLlJyKWs,13940
|
|
28
28
|
lollms_client/llm_bindings/litellm/__init__.py,sha256=zVIlYW7DyIWnEIyt1E7m0N7lEL0AHIz2rZ-1vDpvm_0,12757
|
|
29
|
-
lollms_client/llm_bindings/
|
|
29
|
+
lollms_client/llm_bindings/llama_cpp_server/__init__.py,sha256=UsZ7OoBM5GbxOIU_uVPLZnbGm4qTQRVJlQ4kBz2Jqz4,31813
|
|
30
30
|
lollms_client/llm_bindings/lollms/__init__.py,sha256=wRkj-aw7SokjALsD6tjQ8afNASm2Brj3lQQj6Ui2m7M,30025
|
|
31
31
|
lollms_client/llm_bindings/lollms_webui/__init__.py,sha256=nGIGv9sS3hdlNIcxYvOtq1_oSbPWX2RlCvA7bTRmwkE,17754
|
|
32
32
|
lollms_client/llm_bindings/mistral/__init__.py,sha256=S_6skFAhGKNcr5IVWlqoaZ4gfWd94vzIuGcmF3nAeyg,14135
|
|
33
33
|
lollms_client/llm_bindings/novita_ai/__init__.py,sha256=7t6D43hT-SCLgBor08VQTxRJQq27puS5CHRlAeYsczc,21492
|
|
34
|
-
lollms_client/llm_bindings/ollama/__init__.py,sha256=
|
|
34
|
+
lollms_client/llm_bindings/ollama/__init__.py,sha256=u5T03aERRedTcFNeBgbValNZUgjDt0ssvoL866myTTA,60672
|
|
35
35
|
lollms_client/llm_bindings/open_router/__init__.py,sha256=fEVjNW1Q3rpXT659KLkMeaN7mHeas8Q0LxcXoiJvVKM,14917
|
|
36
36
|
lollms_client/llm_bindings/openai/__init__.py,sha256=wno0j62kQ2joDjpeKQLvckxJIJSJCOiFrKTKKc550bw,31342
|
|
37
37
|
lollms_client/llm_bindings/openllm/__init__.py,sha256=N6MAyZtcIpGpLDVhoqyLPFDXGQOzCB_hMldlEMUc7jA,15799
|
|
@@ -53,12 +53,13 @@ lollms_client/stt_bindings/lollms/__init__.py,sha256=9Vmn1sQQZKLGLe7nZnc-0LnNeSY
|
|
|
53
53
|
lollms_client/stt_bindings/whisper/__init__.py,sha256=OCF5ncriFN0ukFz47dJhQoJxQ2NMA7kZ81sVdBtQBKo,19191
|
|
54
54
|
lollms_client/stt_bindings/whispercpp/__init__.py,sha256=5YQKFy3UaN-S-HGZiFCIcuPGTJTELPgqqct1AcTqz-Q,21595
|
|
55
55
|
lollms_client/tti_bindings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
|
-
lollms_client/tti_bindings/diffusers/__init__.py,sha256=
|
|
57
|
-
lollms_client/tti_bindings/diffusers/server/main.py,sha256=
|
|
56
|
+
lollms_client/tti_bindings/diffusers/__init__.py,sha256=2VhT0KF51UrSRLn9s_rihkv-e6hbfIlQY57a5N1WNXI,25633
|
|
57
|
+
lollms_client/tti_bindings/diffusers/server/main.py,sha256=RdHVVSuY5YA5vsa4FqDnhJJUGqRr_sZ3isYFyTLpk34,53018
|
|
58
58
|
lollms_client/tti_bindings/gemini/__init__.py,sha256=_9MifhHOi2uNoW8vqmMIPHvjiF6fJq28Cq3Ckg309tA,13184
|
|
59
59
|
lollms_client/tti_bindings/leonardo_ai/__init__.py,sha256=rO6FFLfXFMqgirDdO2J2lelpYrhyaj_Uhu2NK-gBd7g,6075
|
|
60
60
|
lollms_client/tti_bindings/lollms/__init__.py,sha256=J_EH-A13Zj4G2pEbOjSCT9Hw4oSHGl7n6FEBBQODn20,8983
|
|
61
61
|
lollms_client/tti_bindings/novita_ai/__init__.py,sha256=qBan-YaLvzzjEmEa5_a7lAw-vKbAW-U6hOSckMMGkB8,5021
|
|
62
|
+
lollms_client/tti_bindings/open_router/__init__.py,sha256=DPvQtA7aXjLlMPjywdyB-0V4EuUXgPijU5PUhFRj9lo,14714
|
|
62
63
|
lollms_client/tti_bindings/openai/__init__.py,sha256=1mg2aBOUs4xvfvKgVHlFHNSmGwdFJuFkaRIlK8OjVkg,5199
|
|
63
64
|
lollms_client/tti_bindings/stability_ai/__init__.py,sha256=XpAXhSAAkktEq3L2Ju1hthk8uRWm7ZGl8U0TN3OITK0,8214
|
|
64
65
|
lollms_client/ttm_bindings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -77,13 +78,13 @@ lollms_client/tts_bindings/piper_tts/__init__.py,sha256=Atd1WmtvbJ5XJrh4R8JRr_5p
|
|
|
77
78
|
lollms_client/tts_bindings/piper_tts/server/install_piper.py,sha256=g71Ne2T18wAytOPipfQ9DNeTAOD9PrII5qC-vr9DtLA,3256
|
|
78
79
|
lollms_client/tts_bindings/piper_tts/server/main.py,sha256=DMozfSR1aCbrlmOXltRFjtXhYhXajsGcNKQjsWgRwZk,17402
|
|
79
80
|
lollms_client/tts_bindings/piper_tts/server/setup_voices.py,sha256=UdHaPa5aNcw8dR-aRGkZr2OfSFFejH79lXgfwT0P3ss,1964
|
|
80
|
-
lollms_client/tts_bindings/xtts/__init__.py,sha256
|
|
81
|
+
lollms_client/tts_bindings/xtts/__init__.py,sha256=-jIaXDUWEQ32JzS7I1O6NeS0rmduWBSaN8kJuuXSxBg,8172
|
|
81
82
|
lollms_client/tts_bindings/xtts/server/main.py,sha256=feTAX4eAo2HY6PpcDTrgRMak5AXocO7UIhKPuGuWpxY,12303
|
|
82
83
|
lollms_client/tts_bindings/xtts/server/setup_voices.py,sha256=UdHaPa5aNcw8dR-aRGkZr2OfSFFejH79lXgfwT0P3ss,1964
|
|
83
84
|
lollms_client/ttv_bindings/__init__.py,sha256=UZ8o2izQOJLQgtZ1D1cXoNST7rzqW22rL2Vufc7ddRc,3141
|
|
84
85
|
lollms_client/ttv_bindings/lollms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
85
|
-
lollms_client-1.
|
|
86
|
-
lollms_client-1.
|
|
87
|
-
lollms_client-1.
|
|
88
|
-
lollms_client-1.
|
|
89
|
-
lollms_client-1.
|
|
86
|
+
lollms_client-1.8.3.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
|
|
87
|
+
lollms_client-1.8.3.dist-info/METADATA,sha256=hKrzISSLsFm-fr70JgttcWvgZblCpHo-PVrF4wi_kNI,77176
|
|
88
|
+
lollms_client-1.8.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
89
|
+
lollms_client-1.8.3.dist-info/top_level.txt,sha256=Bk_kz-ri6Arwsk7YG-T5VsRorV66uVhcHGvb_g2WqgE,14
|
|
90
|
+
lollms_client-1.8.3.dist-info/RECORD,,
|