lm-deluge 0.0.76__py3-none-any.whl → 0.0.79__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.
lm_deluge/prompt.py CHANGED
@@ -61,6 +61,8 @@ class ToolCall:
61
61
  built_in: bool = False
62
62
  built_in_type: str | None = None
63
63
  extra_body: dict | None = None
64
+ # for gemini 3 - thought signatures to maintain reasoning context
65
+ thought_signature: str | None = None
64
66
 
65
67
  @property
66
68
  def fingerprint(self) -> str:
@@ -93,7 +95,10 @@ class ToolCall:
93
95
  }
94
96
 
95
97
  def gemini(self) -> dict:
96
- return {"functionCall": {"name": self.name, "args": self.arguments}}
98
+ result = {"functionCall": {"name": self.name, "args": self.arguments}}
99
+ if self.thought_signature is not None:
100
+ result["thoughtSignature"] = self.thought_signature # type: ignore
101
+ return result
97
102
 
98
103
  def mistral(self) -> dict:
99
104
  return {
@@ -253,6 +258,8 @@ class Thinking:
253
258
  type: str = field(init=False, default="thinking")
254
259
  # for openai - to keep conversation chain
255
260
  raw_payload: dict | None = None
261
+ # for gemini 3 - thought signatures to maintain reasoning context
262
+ thought_signature: str | None = None
256
263
 
257
264
  @property
258
265
  def fingerprint(self) -> str:
@@ -270,7 +277,10 @@ class Thinking:
270
277
  return {"type": "thinking", "thinking": self.content}
271
278
 
272
279
  def gemini(self) -> dict:
273
- return {"text": f"[Thinking: {self.content}]"}
280
+ result = {"text": f"[Thinking: {self.content}]"}
281
+ if self.thought_signature is not None:
282
+ result["thoughtSignature"] = self.thought_signature
283
+ return result
274
284
 
275
285
  def mistral(self) -> dict:
276
286
  return {"type": "text", "text": f"[Thinking: {self.content}]"}
@@ -374,14 +384,15 @@ class Message:
374
384
  size = p.size
375
385
  content_blocks.append({"type": "file", "tag": f"<File ({size} bytes)>"})
376
386
  elif isinstance(p, ToolCall):
377
- content_blocks.append(
378
- {
379
- "type": "tool_call",
380
- "id": p.id,
381
- "name": p.name,
382
- "arguments": _json_safe(p.arguments),
383
- }
384
- )
387
+ tool_call_block = {
388
+ "type": "tool_call",
389
+ "id": p.id,
390
+ "name": p.name,
391
+ "arguments": _json_safe(p.arguments),
392
+ }
393
+ if p.thought_signature is not None:
394
+ tool_call_block["thought_signature"] = p.thought_signature
395
+ content_blocks.append(tool_call_block)
385
396
  elif isinstance(p, ToolResult):
386
397
  content_blocks.append(
387
398
  {
@@ -391,7 +402,10 @@ class Message:
391
402
  }
392
403
  )
393
404
  elif isinstance(p, Thinking):
394
- content_blocks.append({"type": "thinking", "content": p.content})
405
+ thinking_block = {"type": "thinking", "content": p.content}
406
+ if p.thought_signature is not None:
407
+ thinking_block["thought_signature"] = p.thought_signature
408
+ content_blocks.append(thinking_block)
395
409
 
396
410
  return {"role": self.role, "content": content_blocks}
397
411
 
@@ -415,14 +429,24 @@ class Message:
415
429
  parts.append(Text(p["tag"]))
416
430
  elif p["type"] == "tool_call":
417
431
  parts.append(
418
- ToolCall(id=p["id"], name=p["name"], arguments=p["arguments"])
432
+ ToolCall(
433
+ id=p["id"],
434
+ name=p["name"],
435
+ arguments=p["arguments"],
436
+ thought_signature=p.get("thought_signature"),
437
+ )
419
438
  )
420
439
  elif p["type"] == "tool_result":
421
440
  parts.append(
422
441
  ToolResult(tool_call_id=p["tool_call_id"], result=p["result"])
423
442
  )
424
443
  elif p["type"] == "thinking":
425
- parts.append(Thinking(content=p["content"]))
444
+ parts.append(
445
+ Thinking(
446
+ content=p["content"],
447
+ thought_signature=p.get("thought_signature"),
448
+ )
449
+ )
426
450
  else:
427
451
  raise ValueError(f"Unknown part type {p['type']!r}")
428
452
 
@@ -1546,14 +1570,15 @@ class Conversation:
1546
1570
  {"type": "file", "tag": f"<File ({size} bytes)>"}
1547
1571
  )
1548
1572
  elif isinstance(p, ToolCall):
1549
- content_blocks.append(
1550
- {
1551
- "type": "tool_call",
1552
- "id": p.id,
1553
- "name": p.name,
1554
- "arguments": p.arguments,
1555
- }
1556
- )
1573
+ tool_call_block = {
1574
+ "type": "tool_call",
1575
+ "id": p.id,
1576
+ "name": p.name,
1577
+ "arguments": p.arguments,
1578
+ }
1579
+ if p.thought_signature is not None:
1580
+ tool_call_block["thought_signature"] = p.thought_signature
1581
+ content_blocks.append(tool_call_block)
1557
1582
  elif isinstance(p, ToolResult):
1558
1583
  content_blocks.append(
1559
1584
  {
@@ -1565,7 +1590,10 @@ class Conversation:
1565
1590
  }
1566
1591
  )
1567
1592
  elif isinstance(p, Thinking):
1568
- content_blocks.append({"type": "thinking", "content": p.content})
1593
+ thinking_block = {"type": "thinking", "content": p.content}
1594
+ if p.thought_signature is not None:
1595
+ thinking_block["thought_signature"] = p.thought_signature
1596
+ content_blocks.append(thinking_block)
1569
1597
  serialized.append({"role": msg.role, "content": content_blocks})
1570
1598
 
1571
1599
  return {"messages": serialized}
@@ -1590,14 +1618,24 @@ class Conversation:
1590
1618
  parts.append(Text(p["tag"]))
1591
1619
  elif p["type"] == "tool_call":
1592
1620
  parts.append(
1593
- ToolCall(id=p["id"], name=p["name"], arguments=p["arguments"])
1621
+ ToolCall(
1622
+ id=p["id"],
1623
+ name=p["name"],
1624
+ arguments=p["arguments"],
1625
+ thought_signature=p.get("thought_signature"),
1626
+ )
1594
1627
  )
1595
1628
  elif p["type"] == "tool_result":
1596
1629
  parts.append(
1597
1630
  ToolResult(tool_call_id=p["tool_call_id"], result=p["result"])
1598
1631
  )
1599
1632
  elif p["type"] == "thinking":
1600
- parts.append(Thinking(content=p["content"]))
1633
+ parts.append(
1634
+ Thinking(
1635
+ content=p["content"],
1636
+ thought_signature=p.get("thought_signature"),
1637
+ )
1638
+ )
1601
1639
  else:
1602
1640
  raise ValueError(f"Unknown part type {p['type']!r}")
1603
1641
 
lm_deluge/warnings.py CHANGED
@@ -9,6 +9,8 @@ WARNINGS: dict[str, str] = {
9
9
  "WARN_LOGPROBS_UNSUPPORTED": "Ignoring logprobs param for non-logprobs model: {model_name}",
10
10
  "WARN_MINIMAL_TO_LOW": "'minimal' reasoning effort only allowed for gpt-5 models. Setting to 'low' for {model_name}.",
11
11
  "WARN_MINIMAL_TO_NONE": "GPT-5.1 models don't support 'minimal' reasoning effort. Converting to 'none' for {model_name}.",
12
+ "WARN_MEDIA_RESOLUTION_UNSUPPORTED": "media_resolution parameter is only supported for Gemini 3 models, ignoring for {model_name}.",
13
+ "WARN_GEMINI3_MISSING_SIGNATURE": "Gemini 3 thought signature missing in {part_type}, injecting dummy signature 'context_engineering_is_the_way_to_go' to avoid API error.",
12
14
  }
13
15
 
14
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lm_deluge
3
- Version: 0.0.76
3
+ Version: 0.0.79
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
@@ -52,7 +52,7 @@ Dynamic: license-file
52
52
  pip install lm-deluge
53
53
  ```
54
54
 
55
- The package relies on environment variables for API keys. Typical variables include `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `COHERE_API_KEY`, `META_API_KEY`, and `GOOGLE_API_KEY`. `LLMClient` will automatically load the `.env` file when imported; we recommend using that to set the environment variables. For Bedrock, you'll need to set `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.
55
+ The package relies on environment variables for API keys. Typical variables include `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `COHERE_API_KEY`, `META_API_KEY`, and `GEMINI_API_KEY`. `LLMClient` will automatically load the `.env` file when imported; we recommend using that to set the environment variables. For Bedrock, you'll need to set `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.
56
56
 
57
57
  ## Quickstart
58
58
 
@@ -61,9 +61,9 @@ The package relies on environment variables for API keys. Typical variables incl
61
61
  ```python
62
62
  from lm_deluge import LLMClient
63
63
 
64
- client = LLMClient("gpt-4o-mini")
64
+ client = LLMClient("gpt-4.1-mini")
65
65
  resps = client.process_prompts_sync(["Hello, world!"])
66
- print(resp[0].completion)
66
+ print(resps[0].completion)
67
67
  ```
68
68
 
69
69
  ## Spraying Across Models
@@ -74,13 +74,13 @@ To distribute your requests across models, just provide a list of more than one
74
74
  from lm_deluge import LLMClient
75
75
 
76
76
  client = LLMClient(
77
- ["gpt-4o-mini", "claude-3-haiku"],
77
+ ["gpt-4.1-mini", "claude-4.5-haiku"],
78
78
  max_requests_per_minute=10_000
79
79
  )
80
80
  resps = client.process_prompts_sync(
81
81
  ["Hello, ChatGPT!", "Hello, Claude!"]
82
82
  )
83
- print(resp[0].completion)
83
+ print(resps[0].completion)
84
84
  ```
85
85
 
86
86
  ## Configuration
@@ -181,7 +181,7 @@ def get_weather(city: str) -> str:
181
181
  return f"The weather in {city} is sunny and 72°F"
182
182
 
183
183
  tool = Tool.from_function(get_weather)
184
- client = LLMClient("claude-3-haiku")
184
+ client = LLMClient("claude-4.5-haiku")
185
185
  resps = client.process_prompts_sync(
186
186
  ["What's the weather in Paris?"],
187
187
  tools=[tool]
@@ -255,7 +255,7 @@ conv = (
255
255
  )
256
256
 
257
257
  # Use prompt caching to cache system message and tools
258
- client = LLMClient("claude-3-5-sonnet")
258
+ client = LLMClient("claude-4.5-sonnet")
259
259
  resps = client.process_prompts_sync(
260
260
  [conv],
261
261
  cache="system_and_tools" # Cache system message and any tools
@@ -301,5 +301,6 @@ The `lm_deluge.llm_tools` package exposes a few helper functions:
301
301
  - `extract` – structure text or images into a Pydantic model based on a schema.
302
302
  - `translate` – translate a list of strings to English.
303
303
  - `score_llm` – simple yes/no style scoring with optional log probability output.
304
+ - `FilesystemManager` – expose a sandboxed read/write filesystem tool (with optional regex search and `apply_patch` support) that agents can call without touching the host machine.
304
305
 
305
306
  Experimental embeddings (`embed.embed_parallel_async`) and document reranking (`rerank.rerank_parallel_async`) clients are also provided.
@@ -2,27 +2,27 @@ lm_deluge/__init__.py,sha256=zF5lAitfgJ8A28IXJ5BE9OUCqGOqSnGOWn3ZIlizNyY,822
2
2
  lm_deluge/batches.py,sha256=Km6QM5_7BlF2qEyo4WPlhkaZkpzrLqf50AaveHXQOoY,25127
3
3
  lm_deluge/cache.py,sha256=xO2AIYvP3tUpTMKQjwQQYfGRJSRi6e7sMlRhLjsS-u4,4873
4
4
  lm_deluge/cli.py,sha256=Ilww5gOw3J5v0NReq_Ra4hhxU4BCIJBl1oTGxJZKedc,12065
5
- lm_deluge/client.py,sha256=RoxIeuM-LjaKl9fPXfs7rf2NyOuUNBLbTjVPkcIRfYA,44776
6
- lm_deluge/config.py,sha256=d7lS6i5-J23nM-UPjJ_gFcsmfgI8aPVwqw_IGGb1x3I,975
5
+ lm_deluge/client.py,sha256=ZwDD4qkPFJsPxDMCijD6lz2s5ULL-hW58tGFN00BmSI,44796
6
+ lm_deluge/config.py,sha256=7pTfqlg4qHf68qpckr21deVtCuao9b0ypiXT2k-nHUE,1210
7
7
  lm_deluge/embed.py,sha256=CO-TOlC5kOTAM8lcnicoG4u4K664vCBwHF1vHa-nAGg,13382
8
8
  lm_deluge/errors.py,sha256=oHjt7YnxWbh-eXMScIzov4NvpJMo0-2r5J6Wh5DQ1tk,209
9
9
  lm_deluge/file.py,sha256=PTmlJQ-IaYcYUFun9V0bJ1NPVP84edJrR0hvCMWFylY,19697
10
10
  lm_deluge/image.py,sha256=5AMXmn2x47yXeYNfMSMAOWcnlrOxxOel-4L8QCJwU70,8928
11
11
  lm_deluge/mock_openai.py,sha256=-u4kxSzwoxDt_2fLh5LaiqETnu0Jg_VDL7TWAAYHGNw,21762
12
- lm_deluge/prompt.py,sha256=_6xkMuEKJEizRNbjQ5gbZesoE_vtwQe2wJHdm-E6vP0,64002
12
+ lm_deluge/prompt.py,sha256=JRjLckFQ14r5wfWcYCjFOTGADTz4klwMthctx0GwrtU,65808
13
13
  lm_deluge/request_context.py,sha256=eM_cCXZsrVb5FF3VQl6u1dZeZrWv00wW42Cr_Fjs5oA,2752
14
14
  lm_deluge/rerank.py,sha256=-NBAJdHz9OB-SWWJnHzkFmeVO4wR6lFV7Vw-SxG7aVo,11457
15
15
  lm_deluge/tool.py,sha256=ipgNy4OpfH3CA9OPQq5zfn1xO8H08GMvDynB8ZPQ5mA,30617
16
16
  lm_deluge/tracker.py,sha256=aeS9GUJpgOSQRVXAnGDvlMO8qYpSxpTNLYj2hrMg0m8,14757
17
17
  lm_deluge/usage.py,sha256=xz9tAw2hqaJvv9aAVhnQ6N1Arn7fS8Shb28VwCW26wI,5136
18
- lm_deluge/warnings.py,sha256=xXXYXEfaaSVr__16BKOEEWLdfZi1L-2ylzTrXTRyO18,1748
18
+ lm_deluge/warnings.py,sha256=bAG9UXPnppk_oWGIsWpY3k5lWin4tganYFw0U7OEvJQ,2062
19
19
  lm_deluge/api_requests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
20
20
  lm_deluge/api_requests/anthropic.py,sha256=OvkciXTHyrG1cFyC1vv6nYyCFTqtMgt1r15Q-pbHiUQ,10411
21
21
  lm_deluge/api_requests/base.py,sha256=mXEM85mcU_5LD-ugELpCl28tv-tpHKcaxerTIVLQZVo,10436
22
22
  lm_deluge/api_requests/bedrock.py,sha256=mY1xTvgfCLyqLlfFFmu_baKgkVq1Df1_MJXeN_G1jWQ,15597
23
23
  lm_deluge/api_requests/chat_reasoning.py,sha256=sJvstvKFqsSBUjYcwxzGt2_FH4cEp3Z6gKcBPyPjGwk,236
24
24
  lm_deluge/api_requests/common.py,sha256=BZ3vRO5TB669_UsNKugkkuFSzoLHOYJIKt4nV4sf4vc,422
25
- lm_deluge/api_requests/gemini.py,sha256=4uD7fQl0yWyAvYkPNi3oO1InBnvYfo5_QR6k-va-2GI,7838
25
+ lm_deluge/api_requests/gemini.py,sha256=gHmIfEY48B-MYlJYxYc8hT8ojmK16XSETcvfljRKAH0,10813
26
26
  lm_deluge/api_requests/mistral.py,sha256=8JZP2CDf1XZfaPcTk0WS4q-VfYYj58ptpoH8LD3MQG4,4528
27
27
  lm_deluge/api_requests/openai.py,sha256=E0oakhcb2T5Swfn6ATMjRZKuLyRrx4Zj5SREo1JILfc,28841
28
28
  lm_deluge/api_requests/response.py,sha256=vG194gAH5p7ulpNy4qy5Pryfb1p3ZV21-YGoj__ru3E,7436
@@ -40,9 +40,10 @@ lm_deluge/built_in_tools/anthropic/editor.py,sha256=DyC_DrHVTm1khU9QDL39vBuhu4tO
40
40
  lm_deluge/llm_tools/__init__.py,sha256=fMBsM6cGNxmv0YHZHZ79DGrfn3XYmiucvfgtxS47Ii8,433
41
41
  lm_deluge/llm_tools/classify.py,sha256=OdMwV5u4XoPlVhjOHX0sng5KPBIKFJmQeOE2fmnPgLU,21
42
42
  lm_deluge/llm_tools/extract.py,sha256=p61JW8yv5gQxPp4P8Hkm90ERgfD_Ek5IABzjIIlX-M0,4631
43
- lm_deluge/llm_tools/filesystem.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
+ lm_deluge/llm_tools/filesystem.py,sha256=Uy0lQ2Ecx5Cvqv0Sr3r_PEw8gBGZ21VAov5dg2knKfk,27942
44
44
  lm_deluge/llm_tools/locate.py,sha256=lYNbKTmy9dTvj0lEQkOQ7yrxyqsgYzjD0C_byJKI_4w,6271
45
45
  lm_deluge/llm_tools/ocr.py,sha256=7fDlvs6uUOvbxMasvGGNJx5Fj6biM6z3lijKZaGN26k,23
46
+ lm_deluge/llm_tools/sandbox.py,sha256=7bc4r0ApY4WfdzNrfKfO4Omoz9rR1rr86qp-OwtqlyY,18399
46
47
  lm_deluge/llm_tools/score.py,sha256=9oGA3-k2U5buHQXkXaEI9M4Wb5yysNhTLsPbGeghAlQ,2580
47
48
  lm_deluge/llm_tools/subagents.py,sha256=srJ7On7YR0Y8WuNvf5TJl_7IUfEtG3zlxZeLgmn_-NI,8484
48
49
  lm_deluge/llm_tools/todos.py,sha256=doKJZWLZlh4J_k6HkdwonWHfZTZaxEI9_XHAoNFnfQo,14906
@@ -54,7 +55,7 @@ lm_deluge/models/cerebras.py,sha256=u2FMXJF6xMr0euDRKLKMo_NVTOcvSrrEpehbHr8sSeE,
54
55
  lm_deluge/models/cohere.py,sha256=iXjYtM6jy_YL73Op8OfNsrMNopwae9y-Sw-4vF9cEBw,3406
55
56
  lm_deluge/models/deepseek.py,sha256=6_jDEprNNYis5I5MDQNloRes9h1P6pMYHXxOd2UZMgg,941
56
57
  lm_deluge/models/fireworks.py,sha256=yvt2Ggzye4aUqCqY74ta67Vu7FrQaLFjdFtN4P7D-dc,638
57
- lm_deluge/models/google.py,sha256=Hr2MolQoaeY85pKCGO7k7OH_1nQJdrwMgrJbfz5bI8w,5387
58
+ lm_deluge/models/google.py,sha256=fARfBMHDwhPJ48SGcYg3sHQDQ0Mm0yPQ-9s6iVYne8M,6011
58
59
  lm_deluge/models/grok.py,sha256=TDzr8yfTaHbdJhwMA-Du6L-efaKFJhjTQViuVElCCHI,2566
59
60
  lm_deluge/models/groq.py,sha256=Mi5WE1xOBGoZlymD0UN6kzhH_NOmfJYU4N2l-TO0Z8Q,2552
60
61
  lm_deluge/models/kimi.py,sha256=1voigLdNO2CxpWv0KDpQPP3Wolx5WrqgAlYL9ObJFuQ,1117
@@ -62,7 +63,7 @@ lm_deluge/models/meta.py,sha256=BBgnscL1gMcIdPbRqrlDl_q9YAYGSrkw9JkAIabXtLs,1883
62
63
  lm_deluge/models/minimax.py,sha256=rwW9gNotAYfDVtMlqmSYegN6GoZM_9DSNNZU2yPOmaU,275
63
64
  lm_deluge/models/mistral.py,sha256=x67o5gckBGmPcIGdVbS26XZAYFKBYM4tsxEAahGp8bk,4323
64
65
  lm_deluge/models/openai.py,sha256=t6fcXo0YXgPQ6YiftZJP8gPw8FOBqoVapSavMVmtaOw,12411
65
- lm_deluge/models/openrouter.py,sha256=O-Po4tmHjAqFIVU96TUL0QnK01R4e2yDN7Z4sYJ-CuE,2120
66
+ lm_deluge/models/openrouter.py,sha256=aT3AGBaZ0ShY2-ncGHbc8UEm00l78GqkXy9Pq67SITQ,2469
66
67
  lm_deluge/models/together.py,sha256=AjKhPsazqBgqyLwHkNQW07COM1n_oSrYQRp2BFVvn9o,4381
67
68
  lm_deluge/presets/cerebras.py,sha256=MDkqj15qQRrj8wxSCDNNe_Cs7h1WN1UjV6lTmSY1olQ,479
68
69
  lm_deluge/presets/meta.py,sha256=QrreLAVgYS6VIC_NQth1vgGAYuxY38jFQQZSe6ot7C8,364
@@ -73,8 +74,8 @@ lm_deluge/util/schema.py,sha256=q6uwhA4s1lM2dHT1Kwc46E7OY1VecMOtTEI0PTFn6tA,1320
73
74
  lm_deluge/util/spatial.py,sha256=BsF_UKhE-x0xBirc-bV1xSKZRTUhsOBdGqsMKme20C8,4099
74
75
  lm_deluge/util/validation.py,sha256=hz5dDb3ebvZrZhnaWxOxbNSVMI6nmaOODBkk0htAUhs,1575
75
76
  lm_deluge/util/xml.py,sha256=Ft4zajoYBJR3HHCt2oHwGfymGLdvp_gegVmJ-Wqk4Ck,10547
76
- lm_deluge-0.0.76.dist-info/licenses/LICENSE,sha256=uNNXGXPCw2TC7CUs7SEBkA-Mz6QBQFWUUEWDMgEs1dU,1058
77
- lm_deluge-0.0.76.dist-info/METADATA,sha256=JEc89Sw-9vDaMHZAPBpBJAyk11WAnGNZMs0JBQU3GZ0,13514
78
- lm_deluge-0.0.76.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
79
- lm_deluge-0.0.76.dist-info/top_level.txt,sha256=hqU-TJX93yBwpgkDtYcXyLr3t7TLSCCZ_reytJjwBaE,10
80
- lm_deluge-0.0.76.dist-info/RECORD,,
77
+ lm_deluge-0.0.79.dist-info/licenses/LICENSE,sha256=uNNXGXPCw2TC7CUs7SEBkA-Mz6QBQFWUUEWDMgEs1dU,1058
78
+ lm_deluge-0.0.79.dist-info/METADATA,sha256=wqNdfbJ_BIJT-uZMOvwX9RWgqqzUFM4rZ_a4KblAFus,13705
79
+ lm_deluge-0.0.79.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
80
+ lm_deluge-0.0.79.dist-info/top_level.txt,sha256=hqU-TJX93yBwpgkDtYcXyLr3t7TLSCCZ_reytJjwBaE,10
81
+ lm_deluge-0.0.79.dist-info/RECORD,,