lollms-client 1.3.4__py3-none-any.whl → 1.3.7__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.

Potentially problematic release.


This version of lollms-client might be problematic. Click here for more details.

@@ -0,0 +1,314 @@
1
+ import uvicorn
2
+ from fastapi import FastAPI, APIRouter, HTTPException
3
+ from pydantic import BaseModel
4
+ import argparse
5
+ import sys
6
+ from pathlib import Path
7
+ import asyncio
8
+ import traceback
9
+ import os
10
+ from typing import Optional, List
11
+ import io
12
+ import wave
13
+ import numpy as np
14
+ import tempfile
15
+
16
+ # --- XTTS Implementation ---
17
+ try:
18
+ print("Server: Loading XTTS dependencies...")
19
+ import torch
20
+ import torchaudio
21
+ from TTS.api import TTS
22
+ print("Server: XTTS dependencies loaded successfully")
23
+
24
+ # Check for CUDA availability
25
+ device = "cuda" if torch.cuda.is_available() else "cpu"
26
+ print(f"Server: Using device: {device}")
27
+
28
+ xtts_available = True
29
+
30
+ except Exception as e:
31
+ print(f"Server: Failed to load XTTS dependencies: {e}")
32
+ print(f"Server: Traceback:\n{traceback.format_exc()}")
33
+ xtts_available = False
34
+
35
+ # --- API Models ---
36
+ class GenerationRequest(BaseModel):
37
+ text: str
38
+ voice: Optional[str] = None
39
+ language: Optional[str] = "en"
40
+ speaker_wav: Optional[str] = None
41
+
42
+ class XTTSServer:
43
+ def __init__(self):
44
+ self.model = None
45
+ self.model_loaded = False
46
+ self.model_loading = False # Flag to prevent concurrent loading
47
+ self.available_voices = self._load_available_voices()
48
+ self.available_models = ["xtts_v2"]
49
+
50
+ # Don't initialize model here - do it lazily on first request
51
+ print("Server: XTTS server initialized (model will be loaded on first request)")
52
+
53
+ async def _ensure_model_loaded(self):
54
+ """Ensure the XTTS model is loaded (lazy loading)"""
55
+ if self.model_loaded:
56
+ return
57
+
58
+ if self.model_loading:
59
+ # Another request is already loading the model, wait for it
60
+ while self.model_loading and not self.model_loaded:
61
+ await asyncio.sleep(0.1)
62
+ return
63
+
64
+ if not xtts_available:
65
+ raise RuntimeError("XTTS library not available")
66
+
67
+ try:
68
+ self.model_loading = True
69
+ print("Server: Loading XTTS model for the first time (this may take a few minutes)...")
70
+
71
+ # Initialize XTTS model
72
+ self.model = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to(device)
73
+
74
+ self.model_loaded = True
75
+ print("Server: XTTS model loaded successfully")
76
+
77
+ except Exception as e:
78
+ print(f"Server: Error loading XTTS model: {e}")
79
+ print(f"Server: Traceback:\n{traceback.format_exc()}")
80
+ self.model_loaded = False
81
+ raise
82
+ finally:
83
+ self.model_loading = False
84
+
85
+ def _load_available_voices(self) -> List[str]:
86
+ """Load and return available voices"""
87
+ try:
88
+ # Look for voice files in voices directory
89
+ voices_dir = Path(__file__).parent / "voices"
90
+ voices = []
91
+
92
+ if voices_dir.exists():
93
+ # Look for WAV files in voices directory
94
+ for voice_file in voices_dir.glob("*.wav"):
95
+ voices.append(voice_file.stem)
96
+
97
+ # If no custom voices found, provide some default names
98
+ if not voices:
99
+ voices = ["default", "female", "male"]
100
+
101
+ return voices
102
+
103
+ except Exception as e:
104
+ print(f"Server: Error loading voices: {e}")
105
+ return ["default"]
106
+
107
+ async def generate_audio(self, text: str, voice: Optional[str] = None,
108
+ language: str = "en", speaker_wav: Optional[str] = None) -> bytes:
109
+ """Generate audio from text using XTTS"""
110
+ # Ensure model is loaded before proceeding
111
+ await self._ensure_model_loaded()
112
+
113
+ if not self.model_loaded or self.model is None:
114
+ raise RuntimeError("XTTS model failed to load")
115
+
116
+ try:
117
+ print(f"Server: Generating audio for: '{text[:50]}{'...' if len(text) > 50 else ''}'")
118
+ print(f"Server: Using voice: {voice}, language: {language}")
119
+
120
+ # Handle voice/speaker selection
121
+ speaker_wav_path = None
122
+
123
+ # First priority: use provided speaker_wav parameter
124
+ if speaker_wav:
125
+ speaker_wav_path = speaker_wav
126
+ print(f"Server: Using provided speaker_wav: {speaker_wav_path}")
127
+
128
+ # Second priority: check if voice parameter is a file path
129
+ elif voice and voice != "default":
130
+ if os.path.exists(voice):
131
+ # Voice parameter is a full file path
132
+ speaker_wav_path = voice
133
+ print(f"Server: Using voice as file path: {speaker_wav_path}")
134
+ else:
135
+ # Look for voice file in voices directory
136
+ voices_dir = Path(__file__).parent / "voices"
137
+ potential_voice_path = voices_dir / f"{voice}.wav"
138
+ if potential_voice_path.exists():
139
+ speaker_wav_path = str(potential_voice_path)
140
+ print(f"Server: Using custom voice file: {speaker_wav_path}")
141
+ else:
142
+ print(f"Server: Voice '{voice}' not found in voices directory")
143
+
144
+ # Create a temporary file for output
145
+ with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as temp_file:
146
+ temp_output_path = temp_file.name
147
+
148
+ try:
149
+ # Generate audio using XTTS
150
+ if speaker_wav_path and os.path.exists(speaker_wav_path):
151
+ print(f"Server: Generating with speaker reference: {speaker_wav_path}")
152
+ self.model.tts_to_file(
153
+ text=text,
154
+ speaker_wav=speaker_wav_path,
155
+ language=language,
156
+ file_path=temp_output_path
157
+ )
158
+ else:
159
+ print("Server: No valid speaker reference found, trying default")
160
+ # For XTTS without speaker reference, try to find a default
161
+ default_speaker = self._get_default_speaker_file()
162
+ if default_speaker and os.path.exists(default_speaker):
163
+ print(f"Server: Using default speaker: {default_speaker}")
164
+ self.model.tts_to_file(
165
+ text=text,
166
+ speaker_wav=default_speaker,
167
+ language=language,
168
+ file_path=temp_output_path
169
+ )
170
+ else:
171
+ # Create a more helpful error message
172
+ available_voices = self._get_all_available_voice_files()
173
+ error_msg = f"No speaker reference available. XTTS requires a speaker reference file.\n"
174
+ error_msg += f"Attempted to use: {speaker_wav_path if speaker_wav_path else 'None'}\n"
175
+ error_msg += f"Available voice files: {available_voices}"
176
+ raise RuntimeError(error_msg)
177
+
178
+ # Read the generated audio file
179
+ with open(temp_output_path, 'rb') as f:
180
+ audio_bytes = f.read()
181
+
182
+ print(f"Server: Generated {len(audio_bytes)} bytes of audio")
183
+ return audio_bytes
184
+
185
+ finally:
186
+ # Clean up temporary file
187
+ if os.path.exists(temp_output_path):
188
+ os.unlink(temp_output_path)
189
+
190
+ except Exception as e:
191
+ print(f"Server: Error generating audio: {e}")
192
+ print(f"Server: Traceback:\n{traceback.format_exc()}")
193
+ raise
194
+
195
+ def _get_all_available_voice_files(self) -> List[str]:
196
+ """Get list of all available voice files for debugging"""
197
+ voices_dir = Path(__file__).parent / "voices"
198
+ voice_files = []
199
+
200
+ if voices_dir.exists():
201
+ voice_files = [str(f) for f in voices_dir.glob("*.wav")]
202
+
203
+ return voice_files
204
+
205
+ def _get_default_speaker_file(self) -> Optional[str]:
206
+ """Get path to default speaker file"""
207
+ voices_dir = Path(__file__).parent / "voices"
208
+
209
+ # Look for a default speaker file
210
+ for filename in ["default.wav", "speaker.wav", "reference.wav"]:
211
+ potential_path = voices_dir / filename
212
+ if potential_path.exists():
213
+ return str(potential_path)
214
+
215
+ # If no default found, look for any wav file
216
+ wav_files = list(voices_dir.glob("*.wav"))
217
+ if wav_files:
218
+ return str(wav_files[0])
219
+
220
+ return None
221
+
222
+ def list_voices(self) -> List[str]:
223
+ """Return list of available voices"""
224
+ return self.available_voices
225
+
226
+ def list_models(self) -> List[str]:
227
+ """Return list of available models"""
228
+ return self.available_models
229
+
230
+ # --- Globals ---
231
+ app = FastAPI(title="XTTS Server")
232
+ router = APIRouter()
233
+ xtts_server = XTTSServer()
234
+ model_lock = asyncio.Lock() # Ensure thread-safe access
235
+
236
+ # --- API Endpoints ---
237
+ @router.post("/generate_audio")
238
+ async def generate_audio(request: GenerationRequest):
239
+ async with model_lock:
240
+ try:
241
+ audio_bytes = await xtts_server.generate_audio(
242
+ text=request.text,
243
+ voice=request.voice,
244
+ language=request.language,
245
+ speaker_wav=request.speaker_wav
246
+ )
247
+ from fastapi.responses import Response
248
+ return Response(content=audio_bytes, media_type="audio/wav")
249
+ except Exception as e:
250
+ print(f"Server: ERROR in generate_audio endpoint: {e}")
251
+ print(f"Server: ERROR traceback:\n{traceback.format_exc()}")
252
+ raise HTTPException(status_code=500, detail=str(e))
253
+
254
+ @router.get("/list_voices")
255
+ async def list_voices():
256
+ try:
257
+ voices = xtts_server.list_voices()
258
+ print(f"Server: Returning {len(voices)} voices: {voices}")
259
+ return {"voices": voices}
260
+ except Exception as e:
261
+ print(f"Server: ERROR in list_voices endpoint: {e}")
262
+ print(f"Server: ERROR traceback:\n{traceback.format_exc()}")
263
+ raise HTTPException(status_code=500, detail=str(e))
264
+
265
+ @router.get("/list_models")
266
+ async def list_models():
267
+ try:
268
+ models = xtts_server.list_models()
269
+ print(f"Server: Returning {len(models)} models: {models}")
270
+ return {"models": models}
271
+ except Exception as e:
272
+ print(f"Server: ERROR in list_models endpoint: {e}")
273
+ print(f"Server: ERROR traceback:\n{traceback.format_exc()}")
274
+ raise HTTPException(status_code=500, detail=str(e))
275
+
276
+ @router.get("/status")
277
+ async def status():
278
+ return {
279
+ "status": "running",
280
+ "xtts_available": xtts_available,
281
+ "model_loaded": xtts_server.model_loaded,
282
+ "model_loading": xtts_server.model_loading,
283
+ "voices_count": len(xtts_server.available_voices),
284
+ "device": torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU"
285
+ }
286
+
287
+ # Add a health check endpoint that responds immediately
288
+ @router.get("/health")
289
+ async def health_check():
290
+ return {"status": "healthy", "ready": True}
291
+
292
+ app.include_router(router)
293
+
294
+ # --- Server Startup ---
295
+ if __name__ == '__main__':
296
+ parser = argparse.ArgumentParser(description="XTTS TTS Server")
297
+ parser.add_argument("--host", type=str, default="localhost", help="Host to bind the server to.")
298
+ parser.add_argument("--port", type=int, default="8081", help="Port to bind the server to.")
299
+
300
+ args = parser.parse_args()
301
+
302
+ print(f"Server: Starting XTTS server on {args.host}:{args.port}")
303
+ print(f"Server: XTTS available: {xtts_available}")
304
+ print(f"Server: Model will be loaded on first audio generation request")
305
+ print(f"Server: Available voices: {len(xtts_server.available_voices)}")
306
+ if xtts_available:
307
+ print(f"Server: Device: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'CPU'}")
308
+
309
+ # Create voices directory if it doesn't exist
310
+ voices_dir = Path(__file__).parent / "voices"
311
+ voices_dir.mkdir(exist_ok=True)
312
+ print(f"Server: Voices directory: {voices_dir}")
313
+
314
+ uvicorn.run(app, host=args.host, port=args.port)
@@ -0,0 +1,67 @@
1
+ # File: lollms_client/tts_bindings/xtts/server/setup_voices.py
2
+ #!/usr/bin/env python3
3
+ """
4
+ Helper script to set up XTTS voices directory with sample speaker files
5
+ """
6
+
7
+ import os
8
+ import urllib.request
9
+ from pathlib import Path
10
+
11
+ def download_sample_voices():
12
+ """Download some sample voice files for XTTS"""
13
+
14
+ voices_dir = Path(__file__).parent / "voices"
15
+ voices_dir.mkdir(exist_ok=True)
16
+
17
+ print(f"Setting up voices in: {voices_dir}")
18
+
19
+ # You can add URLs to sample speaker voice files here
20
+ # For now, let's create instructions for users
21
+
22
+ readme_content = """
23
+ # XTTS Voices Directory
24
+
25
+ Place your speaker reference WAV files in this directory.
26
+
27
+ ## How to add voices:
28
+
29
+ 1. Record or find WAV files of speakers you want to clone (5-30 seconds recommended)
30
+ 2. Name them descriptively (e.g., "john.wav", "sarah.wav", "narrator.wav")
31
+ 3. Place them in this directory
32
+ 4. The voice name will be the filename without extension
33
+
34
+ ## Requirements for voice files:
35
+ - WAV format
36
+ - 22050 Hz sample rate (recommended)
37
+ - Mono or stereo
38
+ - Good quality, clear speech
39
+ - 5-30 seconds duration
40
+ - Single speaker
41
+
42
+ ## Example usage:
43
+ ```python
44
+ # Use a custom voice file named "john.wav"
45
+ audio = tts.generate_audio("Hello world", voice="john")
46
+ ```
47
+
48
+ ## Getting sample voices:
49
+ You can:
50
+ 1. Record your own voice
51
+ 2. Use text-to-speech to create reference voices
52
+ 3. Extract audio clips from videos/podcasts (respect copyright)
53
+ 4. Use royalty-free voice samples
54
+
55
+ Note: XTTS works by cloning the voice characteristics from the reference file.
56
+ """
57
+
58
+ readme_path = voices_dir / "README.md"
59
+ with open(readme_path, 'w') as f:
60
+ f.write(readme_content)
61
+
62
+ print("✓ Created voices directory and README")
63
+ print(f"📁 Add your WAV voice files to: {voices_dir}")
64
+ print("📖 See README.md for detailed instructions")
65
+
66
+ if __name__ == "__main__":
67
+ download_sample_voices()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lollms_client
3
- Version: 1.3.4
3
+ Version: 1.3.7
4
4
  Summary: A client library for LoLLMs generate endpoint
5
5
  Author-email: ParisNeo <parisneoai@gmail.com>
6
6
  License: Apache Software License
@@ -1,10 +1,10 @@
1
- lollms_client/__init__.py,sha256=bgTFpgnMg3q6-llOTdgn0sDJ33axbhZ5dhUez4Ka-ho,1146
1
+ lollms_client/__init__.py,sha256=DfF1ngnJNGLJVePtxUV6K5l0g7eh8fdHrnDokKuvJCw,1146
2
2
  lollms_client/lollms_agentic.py,sha256=pQiMEuB_XkG29-SW6u4KTaMFPr6eKqacInggcCuCW3k,13914
3
3
  lollms_client/lollms_config.py,sha256=goEseDwDxYJf3WkYJ4IrLXwg3Tfw73CXV2Avg45M_hE,21876
4
- lollms_client/lollms_core.py,sha256=h-rU9L0flqM5pYcVay5VJs7QSos6FrLqQ7rGB1By4Hg,176514
5
- lollms_client/lollms_discussion.py,sha256=4vOnXJp4nLDtL2gRmnkTB4-mjYyIHsgp35pRSJPeT9U,117527
4
+ lollms_client/lollms_core.py,sha256=LS28j1Kh24NB80vJ4CI6HUsMjRp9I-8XCW7X8n8sNeQ,180837
5
+ lollms_client/lollms_discussion.py,sha256=87BHKOqCslm8W1CKq_xwnoyvH6K3im5U8WFeiLTWseE,117600
6
6
  lollms_client/lollms_js_analyzer.py,sha256=01zUvuO2F_lnUe_0NLxe1MF5aHE1hO8RZi48mNPv-aw,8361
7
- lollms_client/lollms_llm_binding.py,sha256=5-Vknm0YILPd6ZiwZynsXMfns__Yd_1tDDc2fciRiiA,25020
7
+ lollms_client/lollms_llm_binding.py,sha256=Dj1PI2bQBYv_JgPxCIaIC7DMUvWdFJGwXFdsP5hdGBg,25014
8
8
  lollms_client/lollms_mcp_binding.py,sha256=psb27A23VFWDfZsR2WUbQXQxiZDW5yfOak6ZtbMfszI,10222
9
9
  lollms_client/lollms_mcp_security.py,sha256=FhVTDhSBjksGEZnopVnjFmEF5dv7D8bBTqoaj4BiF0E,3562
10
10
  lollms_client/lollms_personality.py,sha256=O-9nqZhazcITOkxjT24ENTxTmIoZLgqIsQ9WtWs0Id0,8719
@@ -12,7 +12,7 @@ lollms_client/lollms_python_analyzer.py,sha256=7gf1fdYgXCOkPUkBAPNmr6S-66hMH4_Ko
12
12
  lollms_client/lollms_stt_binding.py,sha256=jAUhLouEhh2hmm1bK76ianfw_6B59EHfY3FmLv6DU-g,5111
13
13
  lollms_client/lollms_tti_binding.py,sha256=B38nzBCSPV9jVRZa-x8W7l9nJEW0RyS1MMJoueb8kt0,8519
14
14
  lollms_client/lollms_ttm_binding.py,sha256=FjVVSNXOZXK1qvcKEfxdiX6l2b4XdGOSNnZ0utAsbDg,4167
15
- lollms_client/lollms_tts_binding.py,sha256=5cJYECj8PYLJAyB6SEH7_fhHYK3Om-Y3arkygCnZ24o,4342
15
+ lollms_client/lollms_tts_binding.py,sha256=4qw94lc9M8lsh2q1u3FF0RuxTY__kukYg266ai3or-Y,5126
16
16
  lollms_client/lollms_ttv_binding.py,sha256=KkTaHLBhEEdt4sSVBlbwr5i_g_TlhcrwrT-7DjOsjWQ,4131
17
17
  lollms_client/lollms_types.py,sha256=0iSH1QHRRD-ddBqoL9EEKJ8wWCuwDUlN_FrfbCdg7Lw,3522
18
18
  lollms_client/lollms_utilities.py,sha256=3DAsII2X9uhRzRL-D0QlALcEdRg82y7OIL4yHVF32gY,19446
@@ -25,8 +25,8 @@ lollms_client/llm_bindings/grok/__init__.py,sha256=tVIIl2uXpBYD7ia3k8JqYM8uvAVYl
25
25
  lollms_client/llm_bindings/groq/__init__.py,sha256=EGrMh9vuCoM4pskDw8ydfsAWYgEb423e9HBwqdO2JQc,12120
26
26
  lollms_client/llm_bindings/hugging_face_inference_api/__init__.py,sha256=SFcj5XQTDmN9eR4of82IgQa9iRYZaGlF6rMlF5S5wWg,13938
27
27
  lollms_client/llm_bindings/litellm/__init__.py,sha256=lRH4VfZMUG5JCCj6a7hk2PTfSyDowAu-ujLOM-XPl-8,12756
28
- lollms_client/llm_bindings/llamacpp/__init__.py,sha256=4CbNYpfquVEgfsxuLsxQta_dZRSpbSBL-VWhyDMdBAc,59379
29
- lollms_client/llm_bindings/lollms/__init__.py,sha256=7DgTGHtrFjhRnjx0YYlNTip2p5TSV-_4GN00ekEUd3g,24855
28
+ lollms_client/llm_bindings/llamacpp/__init__.py,sha256=llPF85AzYgMp7Cpo_4OvEHKlxIAgI6F95NB3SqskD9E,62480
29
+ lollms_client/llm_bindings/lollms/__init__.py,sha256=XFQKtTJnkW8OwF1IoyzHqAZ8JAJ0PnAUKDdeOLGcbrE,24310
30
30
  lollms_client/llm_bindings/lollms_webui/__init__.py,sha256=iuDfhZZoLC-PDEPLHrcjk5-962S5c7OeCI7PMdJxI_A,17753
31
31
  lollms_client/llm_bindings/mistral/__init__.py,sha256=cddz9xIj8NRFLKHe2JMxzstpUrNIu5s9juci3mhiHfo,14133
32
32
  lollms_client/llm_bindings/ollama/__init__.py,sha256=a6cgzXPuo8ZLhIZHJFy8QF0n5ZTk0X4OC1JSyXG1enk,46013
@@ -58,14 +58,21 @@ lollms_client/ttm_bindings/audiocraft/__init__.py,sha256=a0k6wTrHth6GaVOiNnVboeF
58
58
  lollms_client/ttm_bindings/bark/__init__.py,sha256=Pr3ou2a-7hNYDqbkxrAbghZpO5HvGUhz7e-7VGXIHHA,18976
59
59
  lollms_client/ttm_bindings/lollms/__init__.py,sha256=DU3WLmJaWNM1NAMtJsnaFo4Y9wlfc675M8aUiaLnojA,3143
60
60
  lollms_client/tts_bindings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- lollms_client/tts_bindings/bark/__init__.py,sha256=cpnmr6rmXcNdy4ib_5UHAbUP5oGoMJwB931_vU6VI14,19480
61
+ lollms_client/tts_bindings/bark/__init__.py,sha256=Fqjz5r1aYwggbEfBSHyHB26V8OmbfUlxqH9a9i6HzfQ,4634
62
+ lollms_client/tts_bindings/bark/server/install_bark.py,sha256=y9VhplwOqPwCVx_ex2MzkkBKMaUtzwPiUKg93_1LJzo,2221
63
+ lollms_client/tts_bindings/bark/server/main.py,sha256=jUpjFzbndq4kl8KPykRHG0DdVhUjrAn2GOt6iMt-lIY,12922
62
64
  lollms_client/tts_bindings/lollms/__init__.py,sha256=8x2_T9XscvISw2TiaLoFxvrS7TIsVLdqbwSc04cX-wc,7164
63
- lollms_client/tts_bindings/piper_tts/__init__.py,sha256=0IEWG4zH3_sOkSb9WbZzkeV5Lvhgp5Gs2-2GN51MTjA,18930
64
- lollms_client/tts_bindings/xtts/__init__.py,sha256=FgcdUH06X6ZR806WQe5ixaYx0QoxtAcOgYo87a2qxYc,18266
65
+ lollms_client/tts_bindings/piper_tts/__init__.py,sha256=FbMw_m2QOn2ny7r5El_s6jByS1dpiuUp7MADudl4VLQ,4855
66
+ lollms_client/tts_bindings/piper_tts/server/install_piper.py,sha256=g71Ne2T18wAytOPipfQ9DNeTAOD9PrII5qC-vr9DtLA,3256
67
+ lollms_client/tts_bindings/piper_tts/server/main.py,sha256=DMozfSR1aCbrlmOXltRFjtXhYhXajsGcNKQjsWgRwZk,17402
68
+ lollms_client/tts_bindings/piper_tts/server/setup_voices.py,sha256=UdHaPa5aNcw8dR-aRGkZr2OfSFFejH79lXgfwT0P3ss,1964
69
+ lollms_client/tts_bindings/xtts/__init__.py,sha256=i1bU6D7wDnWOSf7TRrw_bqeAF6Y8eFp-JIW8z_lWuQM,4211
70
+ lollms_client/tts_bindings/xtts/server/main.py,sha256=T-Kn5NM-u1FJMygeV8rOoZKlqnYHZM30TsnbyZNDzxo,12794
71
+ lollms_client/tts_bindings/xtts/server/setup_voices.py,sha256=UdHaPa5aNcw8dR-aRGkZr2OfSFFejH79lXgfwT0P3ss,1964
65
72
  lollms_client/ttv_bindings/__init__.py,sha256=UZ8o2izQOJLQgtZ1D1cXoNST7rzqW22rL2Vufc7ddRc,3141
66
73
  lollms_client/ttv_bindings/lollms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
- lollms_client-1.3.4.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
68
- lollms_client-1.3.4.dist-info/METADATA,sha256=-kvBYsZuAAUsVlNnSg8NtzR5yOXiL5xiZRATEQvgMGg,58549
69
- lollms_client-1.3.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
70
- lollms_client-1.3.4.dist-info/top_level.txt,sha256=Bk_kz-ri6Arwsk7YG-T5VsRorV66uVhcHGvb_g2WqgE,14
71
- lollms_client-1.3.4.dist-info/RECORD,,
74
+ lollms_client-1.3.7.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
75
+ lollms_client-1.3.7.dist-info/METADATA,sha256=8jA3bx0wtTJgA2bPxOviSDoY7MTl_aYnEwhzEgvD_7w,58549
76
+ lollms_client-1.3.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
+ lollms_client-1.3.7.dist-info/top_level.txt,sha256=Bk_kz-ri6Arwsk7YG-T5VsRorV66uVhcHGvb_g2WqgE,14
78
+ lollms_client-1.3.7.dist-info/RECORD,,