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.
@@ -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", True)
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lollms_client
3
- Version: 1.7.10
3
+ Version: 1.8.3
4
4
  Summary: A client library for LoLLMs generate endpoint
5
5
  Author-email: ParisNeo <parisneoai@gmail.com>
6
6
  License: Apache License
@@ -1,37 +1,37 @@
1
- lollms_client/__init__.py,sha256=3yVS8TMBA1psPxDAF-_Uj4eqsBS48uzSFSYfrEQUyXE,1147
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=inOi01jyqWCwkoiu0Z9e4lEYIQGnIaSH2ucYzD7cLP8,124726
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=WOacWKgJJyvVDbZCzPBePyD26AcXqZY1ctkqdR7qz0A,17234
9
- lollms_client/lollms_mcp_binding.py,sha256=UZZwU_V1JpRY7iVwhTp46nCvw3AnopS5TnaI2gSTb1g,7632
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=S08uuDuXbGmBJXuOnBa8vMuSFQj-SqQHYgUZaNpGcoA,6646
14
- lollms_client/lollms_tti_binding.py,sha256=aV5x2RCoLCrKDY3mGd62JqfrArc5Zm1Q-wqx6avkv94,7782
15
- lollms_client/lollms_ttm_binding.py,sha256=VX6waikDVg9WV0btTMKbz2u5kVrftFKZVWEOK-t2qNY,3638
16
- lollms_client/lollms_tts_binding.py,sha256=3lOT04vCnqZVstQGmv86TUq4Fv_EUMAWfPz-kxz1_Xk,5618
17
- lollms_client/lollms_ttv_binding.py,sha256=6lqSZLxBExjXwbv7wtlRh2bd-_4XZPEq7gdDiWG6PTo,3636
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=tb7Ogev0PH9UYgDhod67Zwhxh2-mEsvSW_cZriAgh1Q,30260
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=fqrCfG3M4sagtNvaiRlKV9rgw6fs8PauWhJIjmzbylw,25581
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/llamacpp/__init__.py,sha256=bDlcrfKMDwX7O_d2HST2TwkR3PVcvgQ96-kwWFWz4Ao,63039
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=v7GXpDsTmAw8P54osSriq4uwoBbN3WEw_IoNbWjllAc,57381
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=X0XnmYH9hBLKVdmvODaz1y392F28gOgEfhGbDiDNXHI,21305
57
- lollms_client/tti_bindings/diffusers/server/main.py,sha256=IrL2JpwTy4_cxXk8RWLcA4-1ikaM3rPhKxpUCiRf3e4,52820
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=2h28VPQR6oM4l_sHS2wJ91Ux6RXeMYFL5-saCyoU9XM,8171
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.7.10.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
86
- lollms_client-1.7.10.dist-info/METADATA,sha256=vxkqsuLbmkkCCFzLOLm5Fk_dfYKWoIgrQPHaxNS-b8c,77177
87
- lollms_client-1.7.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
88
- lollms_client-1.7.10.dist-info/top_level.txt,sha256=Bk_kz-ri6Arwsk7YG-T5VsRorV66uVhcHGvb_g2WqgE,14
89
- lollms_client-1.7.10.dist-info/RECORD,,
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,,