lm-deluge 0.0.12__py3-none-any.whl → 0.0.13__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 lm-deluge might be problematic. Click here for more details.

lm_deluge/tracker.py CHANGED
@@ -1,21 +1,109 @@
1
+ import asyncio
1
2
  import time
2
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, field
4
+
5
+ from rich.console import Console, Group
6
+ from rich.live import Live
7
+ from rich.progress import (
8
+ BarColumn,
9
+ MofNCompleteColumn,
10
+ Progress,
11
+ SpinnerColumn,
12
+ TextColumn,
13
+ )
14
+ from rich.text import Text
15
+ from tqdm import tqdm
16
+
17
+ SECONDS_TO_PAUSE_AFTER_RATE_LIMIT_ERROR = 5
3
18
 
4
19
 
5
20
  @dataclass
6
21
  class StatusTracker:
22
+ max_requests_per_minute: int
23
+ max_tokens_per_minute: int
24
+ max_concurrent_requests: int
7
25
  num_tasks_started: int = 0
8
26
  num_tasks_in_progress: int = 0
9
27
  num_tasks_succeeded: int = 0
10
28
  num_tasks_failed: int = 0
11
29
  num_rate_limit_errors: int = 0
12
30
  time_of_last_rate_limit_error: int | float = 0
13
- total_requests = 0
31
+ total_requests: int = 0
32
+ retry_queue: asyncio.Queue = field(default_factory=asyncio.Queue)
33
+
34
+ # Progress bar configuration
35
+ use_progress_bar: bool = True
36
+ progress_bar_total: int | None = None
37
+ progress_bar_disable: bool = False
38
+ _pbar: tqdm | None = None
39
+
40
+ # Rich display configuration
41
+ use_rich: bool = True
42
+ _rich_console: Console | None = None
43
+ _rich_live: object | None = None
44
+ _rich_progress: object | None = None
45
+ _rich_task_id: object | None = None
46
+ _rich_display_task: asyncio.Task | None = None
47
+ _rich_stop_event: asyncio.Event | None = None
48
+
49
+ def __post_init__(self):
50
+ self.available_request_capacity = self.max_requests_per_minute
51
+ self.available_token_capacity = self.max_tokens_per_minute
52
+ self.last_update_time = time.time() - 1
53
+ self.last_pbar_update_time = time.time() - 1
54
+ self.limiting_factor = None
14
55
 
15
56
  @property
16
57
  def time_since_rate_limit_error(self):
17
58
  return time.time() - self.time_of_last_rate_limit_error
18
59
 
60
+ @property
61
+ def seconds_to_pause(self):
62
+ return max(
63
+ 0,
64
+ SECONDS_TO_PAUSE_AFTER_RATE_LIMIT_ERROR - self.time_since_rate_limit_error,
65
+ )
66
+
67
+ def set_limiting_factor(self, factor):
68
+ self.limiting_factor = factor
69
+
70
+ def check_capacity(self, num_tokens: int):
71
+ request_available = self.available_request_capacity >= 1
72
+ tokens_available = self.available_token_capacity >= num_tokens
73
+ concurrent_request_available = (
74
+ self.num_tasks_in_progress < self.max_concurrent_requests
75
+ )
76
+ if request_available and tokens_available and concurrent_request_available:
77
+ self.available_request_capacity -= 1
78
+ self.available_token_capacity -= num_tokens
79
+ self.num_tasks_started += 1
80
+ self.num_tasks_in_progress += 1
81
+ self.set_limiting_factor(None)
82
+ return True
83
+ else:
84
+ # update reason why
85
+ if not request_available:
86
+ self.set_limiting_factor("Requests")
87
+ elif not concurrent_request_available:
88
+ self.set_limiting_factor("Concurrent Requests")
89
+ elif not tokens_available:
90
+ self.set_limiting_factor("Tokens")
91
+
92
+ def update_capacity(self):
93
+ current_time = time.time()
94
+ seconds_since_update = current_time - self.last_update_time
95
+ self.available_request_capacity = min(
96
+ self.available_request_capacity
97
+ + self.max_requests_per_minute * seconds_since_update / 60.0,
98
+ self.max_requests_per_minute,
99
+ )
100
+ self.available_token_capacity = min(
101
+ self.available_token_capacity
102
+ + self.max_tokens_per_minute * seconds_since_update / 60.0,
103
+ self.max_tokens_per_minute,
104
+ )
105
+ self.last_update_time = current_time
106
+
19
107
  def start_task(self, task_id):
20
108
  self.num_tasks_started += 1
21
109
  self.num_tasks_in_progress += 1
@@ -27,12 +115,16 @@ class StatusTracker:
27
115
  def task_succeeded(self, task_id):
28
116
  self.num_tasks_in_progress -= 1
29
117
  self.num_tasks_succeeded += 1
118
+ self.increment_pbar()
30
119
 
31
120
  def task_failed(self, task_id):
32
121
  self.num_tasks_in_progress -= 1
33
122
  self.num_tasks_failed += 1
34
123
 
35
124
  def log_final_status(self):
125
+ # Close progress bar before printing final status
126
+ self.close_progress_bar()
127
+
36
128
  if self.num_tasks_failed > 0:
37
129
  print(
38
130
  f"{self.num_tasks_failed} / {self.num_tasks_started} requests failed."
@@ -41,3 +133,121 @@ class StatusTracker:
41
133
  print(
42
134
  f"{self.num_rate_limit_errors} rate limit errors received. Consider running at a lower rate."
43
135
  )
136
+
137
+ @property
138
+ def pbar(self) -> tqdm | None:
139
+ """Backward compatibility property to access progress bar."""
140
+ return self._pbar
141
+
142
+ def init_progress_bar(self, total: int | None = None, disable: bool | None = None):
143
+ """Initialize progress bar if enabled."""
144
+ if not self.use_progress_bar:
145
+ return
146
+
147
+ if self.use_rich:
148
+ self._init_rich_display(total, disable)
149
+ else:
150
+ # Use provided values or fall back to instance defaults
151
+ pbar_total = total if total is not None else self.progress_bar_total
152
+ pbar_disable = disable if disable is not None else self.progress_bar_disable
153
+ self._pbar = tqdm(total=pbar_total, disable=pbar_disable)
154
+ self.update_pbar()
155
+
156
+ def close_progress_bar(self):
157
+ """Close progress bar if it exists."""
158
+ if self.use_rich and self._rich_stop_event:
159
+ self._close_rich_display()
160
+ elif self._pbar is not None:
161
+ self._pbar.close()
162
+ self._pbar = None
163
+
164
+ def _init_rich_display(self, total: int | None = None, disable: bool | None = None):
165
+ """Initialize Rich display components."""
166
+ if disable:
167
+ return
168
+
169
+ pbar_total = total if total is not None else self.progress_bar_total
170
+ if pbar_total is None:
171
+ pbar_total = 100 # Default fallback
172
+
173
+ self._rich_console = Console()
174
+ self._rich_stop_event = asyncio.Event()
175
+
176
+ # Start the display updater task
177
+ self._rich_display_task = asyncio.create_task(
178
+ self._rich_display_updater(pbar_total)
179
+ )
180
+
181
+ async def _rich_display_updater(self, total: int):
182
+ """Update Rich display independently."""
183
+ if not self._rich_console or self._rich_stop_event is None:
184
+ return
185
+
186
+ # Create progress bar without console so we can use it in Live
187
+ progress = Progress(
188
+ SpinnerColumn(),
189
+ TextColumn("Processing requests..."),
190
+ BarColumn(),
191
+ MofNCompleteColumn(),
192
+ )
193
+ main_task = progress.add_task("requests", total=total)
194
+
195
+ # Use Live to combine progress + text
196
+
197
+ with Live(console=self._rich_console, refresh_per_second=10) as live:
198
+ while not self._rich_stop_event.is_set():
199
+ completed = self.num_tasks_succeeded
200
+ progress.update(main_task, completed=completed)
201
+
202
+ # Create capacity info text
203
+ tokens_info = f"TPM Capacity: {self.available_token_capacity / 1000:.1f}k/{self.max_tokens_per_minute / 1000:.1f}k"
204
+ reqs_info = f"RPM Capacity: {int(self.available_request_capacity)}/{self.max_requests_per_minute}"
205
+ in_progress = f"In Progress: {int(self.num_tasks_in_progress)}"
206
+ capacity_text = Text(f"{in_progress} • {tokens_info} • {reqs_info}")
207
+
208
+ # Group progress bar and text
209
+ display = Group(progress, capacity_text)
210
+ live.update(display)
211
+
212
+ await asyncio.sleep(0.1)
213
+
214
+ def _close_rich_display(self):
215
+ """Clean up Rich display."""
216
+ if self._rich_stop_event:
217
+ self._rich_stop_event.set()
218
+ if self._rich_display_task and not self._rich_display_task.done():
219
+ self._rich_display_task.cancel()
220
+
221
+ self._rich_console = None
222
+ self._rich_live = None
223
+ self._rich_display_task = None
224
+ self._rich_stop_event = None
225
+
226
+ def update_pbar(self, n: int = 0):
227
+ """Update progress bar status and optionally increment.
228
+
229
+ Args:
230
+ n: Number of items to increment (0 means just update postfix)
231
+ """
232
+ current_time = time.time()
233
+ if self._pbar and (current_time - self.last_pbar_update_time > 1):
234
+ self.last_pbar_update_time = current_time
235
+ self._pbar.set_postfix(
236
+ {
237
+ "Token Capacity": f"{self.available_token_capacity / 1_000:.1f}k",
238
+ "Req. Capacity": f"{int(self.available_request_capacity)}",
239
+ "Reqs. in Progress": self.num_tasks_in_progress,
240
+ "Limiting Factor": self.limiting_factor,
241
+ }
242
+ )
243
+
244
+ if n > 0 and self._pbar:
245
+ self._pbar.update(n)
246
+
247
+ def increment_pbar(self):
248
+ """Increment progress bar by 1."""
249
+ if self.use_rich:
250
+ # Rich display is updated automatically by the display updater
251
+ pass
252
+ elif self._pbar:
253
+ self._pbar.update(1)
lm_deluge/util/json.py CHANGED
@@ -1,5 +1,6 @@
1
- import re
2
1
  import json
2
+ import re
3
+
3
4
  import json5
4
5
 
5
6
 
@@ -166,3 +167,19 @@ def load_json(
166
167
  pass
167
168
 
168
169
  raise ValueError(f"Invalid JSON string: {json_string}")
170
+
171
+
172
+ def try_load_json(
173
+ json_string: str | None,
174
+ allow_json5: bool = True,
175
+ allow_partial: bool = False,
176
+ allow_healing: bool = True,
177
+ ):
178
+ """
179
+ Like the above, except it returns None instead of raising an error.
180
+ """
181
+ try:
182
+ return load_json(json_string, allow_json5, allow_partial, allow_healing)
183
+ except Exception as e:
184
+ print(f"Failed to load json: {e}. Returning None.")
185
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lm_deluge
3
- Version: 0.0.12
3
+ Version: 0.0.13
4
4
  Summary: Python utility for using LLM API models.
5
5
  Author-email: Benjamin Anderson <ben@trytaylor.ai>
6
6
  Requires-Python: >=3.10
@@ -22,8 +22,7 @@ Requires-Dist: lxml
22
22
  Requires-Dist: pdf2image
23
23
  Requires-Dist: pillow
24
24
  Requires-Dist: fastmcp>=2.4
25
- Requires-Dist: fasttext-wheel
26
- Requires-Dist: fasttext-langdetect
25
+ Requires-Dist: rich
27
26
  Dynamic: license-file
28
27
 
29
28
  # lm-deluge
@@ -35,6 +34,7 @@ Dynamic: license-file
35
34
  - **Spray across models/providers** – Configure a client with multiple models from any provider(s), and sampling weights. The client samples a model for each request.
36
35
  - **Tool Use** – Unified API for defining tools for all providers, and creating tools automatically from python functions.
37
36
  - **MCP Support** – Instantiate a `Tool` from a local or remote MCP server so that any LLM can use it, whether or not that provider natively supports MCP.
37
+ - **Computer Use** – We support Claude Computer Use via the computer_use argument to process_prompts_sync/async. It works with Anthropic's API; Bedrock's API is broken right now and rejects the tool definitions, but in principle this will work there too when Bedrock gets their sh*t together.
38
38
  - **Caching** – Save completions in a local or distributed cache to avoid repeated LLM calls to process the same input.
39
39
  - **Convenient message constructor** – No more looking up how to build an Anthropic messages list with images. Our `Conversation` and `Message` classes work great with our client or with the `openai` and `anthropic` packages.
40
40
  - **Sync and async APIs** – Use the client from sync or async code.
@@ -233,11 +233,11 @@ asyncio.run(main())
233
233
 
234
234
  ## Available Models
235
235
 
236
- We support all models in `src/lm_deluge/models.py`. An older version of this client supported Bedrock and Vertex. We plan to re-implement Bedrock support (our previous support was spotty and we need to figure out cross-region inference in order to support the newest Claude models). Vertex support is not currently planned, since Google allows you to connect your Vertex account to AI Studio, and Vertex authentication is a huge pain (requires service account credentials, etc.)
236
+ We support all models in `src/lm_deluge/models.py`. Vertex support is not planned in the short term, since Google allows you to connect your Vertex account to AI Studio, and Vertex authentication is a huge pain (requires service account credentials, etc.)
237
237
 
238
238
  ## Feature Support
239
239
 
240
- We support structured outputs via `json_mode` parameter provided to `SamplingParams`. Structured outputs with a schema are planned. Reasoning models are supported via the `reasoning_effort` parameter, which is translated to a thinking budget for Claude/Gemini. Image models are supported. We don't support tool use yet, but support is planned (keep an eye out for a unified tool definition spec that works for all models!). We support logprobs for OpenAI models that return them via the `logprobs` argument to the `LLMClient`.
240
+ We support structured outputs via `json_mode` parameter provided to `SamplingParams`. Structured outputs with a schema are planned. Reasoning models are supported via the `reasoning_effort` parameter, which is translated to a thinking budget for Claude/Gemini. Image models are supported. We support tool use as documented above. We support logprobs for OpenAI models that return them.
241
241
 
242
242
  ## Built‑in tools
243
243
 
@@ -0,0 +1,42 @@
1
+ lm_deluge/__init__.py,sha256=XR_EuBvJM4LggqfWdsrdQij1-UIGAFwyvHW9Rp8tnQA,280
2
+ lm_deluge/agent.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ lm_deluge/batches.py,sha256=dI5G9uvmoDU9hMohrkEhlIDyJPsmsVwZPwxx6qETxxk,17728
4
+ lm_deluge/cache.py,sha256=VB1kv8rM2t5XWPR60uhszFcxLDnVKOe1oA5hYjVDjIo,4375
5
+ lm_deluge/client.py,sha256=nkYO_wsGgUkFfqfb_8JrDzcU39RL9FfplKEK6zrncAo,20564
6
+ lm_deluge/config.py,sha256=E47daVMvqMicoY2CDcgUnN5nVGDLAQejR358B-pRHZk,923
7
+ lm_deluge/embed.py,sha256=CO-TOlC5kOTAM8lcnicoG4u4K664vCBwHF1vHa-nAGg,13382
8
+ lm_deluge/errors.py,sha256=oHjt7YnxWbh-eXMScIzov4NvpJMo0-2r5J6Wh5DQ1tk,209
9
+ lm_deluge/gemini_limits.py,sha256=V9mpS9JtXYz7AY6OuKyQp5TuIMRH1BVv9YrSNmGmHNA,1569
10
+ lm_deluge/image.py,sha256=hFbRajqEVQbkirAfOxsTPkeq-27Zl-so4AWBFeUbpBI,7161
11
+ lm_deluge/models.py,sha256=gW9ZhKYjwC-ZF-SzWqagFUE_7Mqerdtt_T5NxGo040E,46583
12
+ lm_deluge/prompt.py,sha256=dKaV4gI9yLB0w0Ukdz14kGl34yMm5JNm6Sc-24WQPcg,32202
13
+ lm_deluge/rerank.py,sha256=-NBAJdHz9OB-SWWJnHzkFmeVO4wR6lFV7Vw-SxG7aVo,11457
14
+ lm_deluge/tool.py,sha256=C2zwU9-7fldfYT0TZDoVVGGSC6dN_It9GSxnfkN6Z_w,9822
15
+ lm_deluge/tracker.py,sha256=Un2uthRNZk3dl2fODvvR6CCyFW3IKWfR0GjvpB_dxoM,9095
16
+ lm_deluge/usage.py,sha256=oS-rmF3ZJ1RMtR7WI6BB2uVOAjJg0scvGF3zZRahWVg,4449
17
+ lm_deluge/api_requests/__init__.py,sha256=_aSpD6CJL9g6OpLPoChXiHjl4MH_OlGcKgfZaW8cgLM,71
18
+ lm_deluge/api_requests/anthropic.py,sha256=itKPu1cqCYcrr4fkLarlvSYr6tqLEAGVLGXEG05QXWM,8345
19
+ lm_deluge/api_requests/base.py,sha256=ixI326EtRadoVCbmvIddzzzIp6E_zPfPOIfDEnucZrc,18060
20
+ lm_deluge/api_requests/bedrock.py,sha256=yh4-zMrjlQfmxoBbrc2WYJ8gEqVkTP_-tMR7-XbTAtQ,11753
21
+ lm_deluge/api_requests/common.py,sha256=pcOpODL4heoaNLjbA6_ogkrOAbUSKY3F37D2EyMLW10,359
22
+ lm_deluge/api_requests/mistral.py,sha256=PkuoKbOJAB6DOK_NvzbxpWPAktfvonf69QjC0tVCYuE,5366
23
+ lm_deluge/api_requests/openai.py,sha256=fj-ioXeK6-OGl9VIFpVy6XJRYOvf6TgMv7eu5mkC8RE,16482
24
+ lm_deluge/api_requests/deprecated/bedrock.py,sha256=WrcIShCoO8JCUSlFOCHxg6KQCNTZfw3TpYTvSpYk4mA,11320
25
+ lm_deluge/api_requests/deprecated/cohere.py,sha256=KgDScD6_bWhAzOY5BHZQKSA3kurt4KGENqC4wLsGmcU,5142
26
+ lm_deluge/api_requests/deprecated/deepseek.py,sha256=FEApI93VAWDwuaqTooIyKMgONYqRhdUmiAPBRme-IYs,4582
27
+ lm_deluge/api_requests/deprecated/mistral.py,sha256=pOfOZUM4U35I3Plch84SnAFpDAzouHcSNNMtgxRvjy4,4709
28
+ lm_deluge/api_requests/deprecated/vertex.py,sha256=ygXz2RjdXErPCSBbiHLEWbf5_sSTIi31WoX0UaoYzRI,15275
29
+ lm_deluge/computer_use/anthropic_tools.py,sha256=p1CgHw1htX0PTdDW9Tni9N1azVMCoyA_ei-fMT6HHis,2478
30
+ lm_deluge/llm_tools/__init__.py,sha256=TbZTETq9i_9yYskFWQKOG4pGh5ZiyE_D-h3RArfhGp4,231
31
+ lm_deluge/llm_tools/extract.py,sha256=-GtyqJUxKvB567tk_NnCMklazz18xZBCPlAjYHTVUWg,3649
32
+ lm_deluge/llm_tools/score.py,sha256=9oGA3-k2U5buHQXkXaEI9M4Wb5yysNhTLsPbGeghAlQ,2580
33
+ lm_deluge/llm_tools/translate.py,sha256=iXyYvQZ8bC44FWhBk4qpdqjKM1WFF7Shq-H2PxhPgg4,1452
34
+ lm_deluge/util/json.py,sha256=_4Oar2Cmz2L1DK3EtPLPDxD6rsYHxjROmV8ZpmMjQ-4,5822
35
+ lm_deluge/util/logprobs.py,sha256=UkBZakOxWluaLqHrjARu7xnJ0uCHVfLGHJdnYlEcutk,11768
36
+ lm_deluge/util/validation.py,sha256=hz5dDb3ebvZrZhnaWxOxbNSVMI6nmaOODBkk0htAUhs,1575
37
+ lm_deluge/util/xml.py,sha256=Ft4zajoYBJR3HHCt2oHwGfymGLdvp_gegVmJ-Wqk4Ck,10547
38
+ lm_deluge-0.0.13.dist-info/licenses/LICENSE,sha256=uNNXGXPCw2TC7CUs7SEBkA-Mz6QBQFWUUEWDMgEs1dU,1058
39
+ lm_deluge-0.0.13.dist-info/METADATA,sha256=GEkP9_w0VcPOGEKad9Yh24WOhiW4TQvC2pX4wK1x0jk,11549
40
+ lm_deluge-0.0.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
+ lm_deluge-0.0.13.dist-info/top_level.txt,sha256=hqU-TJX93yBwpgkDtYcXyLr3t7TLSCCZ_reytJjwBaE,10
42
+ lm_deluge-0.0.13.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.8.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,39 +0,0 @@
1
- lm_deluge/__init__.py,sha256=rndOr4Rcfnpttz-onWU3vVEm-MM0WDFgz6KexKPAx0k,222
2
- lm_deluge/cache.py,sha256=VB1kv8rM2t5XWPR60uhszFcxLDnVKOe1oA5hYjVDjIo,4375
3
- lm_deluge/client.py,sha256=yIC86BlH31oW1umrXnuOxaCGMGCbNVvGWXdz2yc6n1g,29296
4
- lm_deluge/embed.py,sha256=m-X8UK4gV9KKD7Wv3yarAceMQaj7gR1JwzD_sB0MOQY,13183
5
- lm_deluge/errors.py,sha256=oHjt7YnxWbh-eXMScIzov4NvpJMo0-2r5J6Wh5DQ1tk,209
6
- lm_deluge/gemini_limits.py,sha256=V9mpS9JtXYz7AY6OuKyQp5TuIMRH1BVv9YrSNmGmHNA,1569
7
- lm_deluge/image.py,sha256=hFbRajqEVQbkirAfOxsTPkeq-27Zl-so4AWBFeUbpBI,7161
8
- lm_deluge/models.py,sha256=oYrt0x0iVfTwoHjP-l1WWennzEDGwnZczj6ds6a6-xc,45406
9
- lm_deluge/prompt.py,sha256=O46eLd6e68_7mGHkCMwLitnsxE4NUvrd1X9vtb_Y7qc,28787
10
- lm_deluge/rerank.py,sha256=tW1c3gQCAqaF8Ez-r-4qxYAcdKqxnLMxwHApKOUKwk4,11289
11
- lm_deluge/sampling_params.py,sha256=E2kewh1vz-1Qcy5xNBCzihfGgT_GcHYMfzaWb3FLiXs,739
12
- lm_deluge/tool.py,sha256=5nFbHchv12C1jkL8nkEh6v9WfxpC0O6rALP25z60WsI,9476
13
- lm_deluge/tracker.py,sha256=Dk99scN_NeDEO0gkLO5efXiZq11Ga-k6cerUHWN7IWY,1292
14
- lm_deluge/usage.py,sha256=oS-rmF3ZJ1RMtR7WI6BB2uVOAjJg0scvGF3zZRahWVg,4449
15
- lm_deluge/api_requests/__init__.py,sha256=_aSpD6CJL9g6OpLPoChXiHjl4MH_OlGcKgfZaW8cgLM,71
16
- lm_deluge/api_requests/anthropic.py,sha256=F1bDb1Pyzwq08LSd4K4Pu6bugi7IFpUf4tZNWySgdx0,7646
17
- lm_deluge/api_requests/base.py,sha256=h7AdWwd9sjZnBb2ETZmzC64E9fNYGp2vrOHGXXo8W2g,16803
18
- lm_deluge/api_requests/bedrock.py,sha256=vf1pkVv4wBqZX7iiBHqHzDEHTlYNEG07rfQr9XE8Pr0,10832
19
- lm_deluge/api_requests/common.py,sha256=U0mX_wC3Tzg2-1u9nYUCTQqYzuYJqvLrICCNW_dbbJM,287
20
- lm_deluge/api_requests/mistral.py,sha256=DvyriHbUApNOEdyiyyn-_HJnTY3tpKty18uqJ8u6n5Y,5640
21
- lm_deluge/api_requests/openai.py,sha256=RjSq6LyDt9g7FASjBJd1JzyD09xz6D-abNO8wiELR1M,7552
22
- lm_deluge/api_requests/deprecated/bedrock.py,sha256=WrcIShCoO8JCUSlFOCHxg6KQCNTZfw3TpYTvSpYk4mA,11320
23
- lm_deluge/api_requests/deprecated/cohere.py,sha256=KgDScD6_bWhAzOY5BHZQKSA3kurt4KGENqC4wLsGmcU,5142
24
- lm_deluge/api_requests/deprecated/deepseek.py,sha256=FEApI93VAWDwuaqTooIyKMgONYqRhdUmiAPBRme-IYs,4582
25
- lm_deluge/api_requests/deprecated/mistral.py,sha256=pOfOZUM4U35I3Plch84SnAFpDAzouHcSNNMtgxRvjy4,4709
26
- lm_deluge/api_requests/deprecated/vertex.py,sha256=ygXz2RjdXErPCSBbiHLEWbf5_sSTIi31WoX0UaoYzRI,15275
27
- lm_deluge/llm_tools/__init__.py,sha256=TbZTETq9i_9yYskFWQKOG4pGh5ZiyE_D-h3RArfhGp4,231
28
- lm_deluge/llm_tools/extract.py,sha256=-GtyqJUxKvB567tk_NnCMklazz18xZBCPlAjYHTVUWg,3649
29
- lm_deluge/llm_tools/score.py,sha256=9oGA3-k2U5buHQXkXaEI9M4Wb5yysNhTLsPbGeghAlQ,2580
30
- lm_deluge/llm_tools/translate.py,sha256=iXyYvQZ8bC44FWhBk4qpdqjKM1WFF7Shq-H2PxhPgg4,1452
31
- lm_deluge/util/json.py,sha256=dCeG9j1D17rXmQJbKJH79X0CGof4Wlqd55TDg4D6ky8,5388
32
- lm_deluge/util/logprobs.py,sha256=UkBZakOxWluaLqHrjARu7xnJ0uCHVfLGHJdnYlEcutk,11768
33
- lm_deluge/util/validation.py,sha256=hz5dDb3ebvZrZhnaWxOxbNSVMI6nmaOODBkk0htAUhs,1575
34
- lm_deluge/util/xml.py,sha256=Ft4zajoYBJR3HHCt2oHwGfymGLdvp_gegVmJ-Wqk4Ck,10547
35
- lm_deluge-0.0.12.dist-info/licenses/LICENSE,sha256=uNNXGXPCw2TC7CUs7SEBkA-Mz6QBQFWUUEWDMgEs1dU,1058
36
- lm_deluge-0.0.12.dist-info/METADATA,sha256=lpl7mGKp096-Ccp6kgd57vuvZOGXs8ska41z_RfvNls,11663
37
- lm_deluge-0.0.12.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
38
- lm_deluge-0.0.12.dist-info/top_level.txt,sha256=hqU-TJX93yBwpgkDtYcXyLr3t7TLSCCZ_reytJjwBaE,10
39
- lm_deluge-0.0.12.dist-info/RECORD,,