zrb 1.5.8__py3-none-any.whl → 1.5.10__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.
- zrb/builtin/llm/tool/file.py +1 -3
- zrb/llm_config.py +82 -46
- zrb/task/any_task.py +22 -6
- zrb/task/base/__init__.py +0 -0
- zrb/task/base/context.py +108 -0
- zrb/task/base/dependencies.py +57 -0
- zrb/task/base/execution.py +274 -0
- zrb/task/base/lifecycle.py +182 -0
- zrb/task/base/monitoring.py +134 -0
- zrb/task/base/operators.py +41 -0
- zrb/task/base_task.py +91 -381
- zrb/task/llm/context_enrichment.py +6 -3
- zrb/task/llm/history_summarization.py +10 -7
- zrb/task/llm/prompt.py +64 -3
- zrb/task/llm_task.py +26 -16
- zrb/task/scheduler.py +1 -2
- {zrb-1.5.8.dist-info → zrb-1.5.10.dist-info}/METADATA +2 -2
- {zrb-1.5.8.dist-info → zrb-1.5.10.dist-info}/RECORD +20 -13
- {zrb-1.5.8.dist-info → zrb-1.5.10.dist-info}/WHEEL +0 -0
- {zrb-1.5.8.dist-info → zrb-1.5.10.dist-info}/entry_points.txt +0 -0
zrb/task/llm/prompt.py
CHANGED
@@ -9,12 +9,29 @@ from zrb.task.llm.context import get_default_context # Updated import
|
|
9
9
|
from zrb.util.attr import get_attr, get_str_attr
|
10
10
|
|
11
11
|
|
12
|
-
def
|
12
|
+
def get_persona(
|
13
|
+
ctx: AnyContext,
|
14
|
+
persona_attr: StrAttr | None,
|
15
|
+
render_persona: bool,
|
16
|
+
) -> str:
|
17
|
+
"""Gets the persona, prioritizing task-specific, then default."""
|
18
|
+
persona = get_attr(
|
19
|
+
ctx,
|
20
|
+
persona_attr,
|
21
|
+
None,
|
22
|
+
auto_render=render_persona,
|
23
|
+
)
|
24
|
+
if persona is not None:
|
25
|
+
return persona
|
26
|
+
return default_llm_config.get_default_persona() or ""
|
27
|
+
|
28
|
+
|
29
|
+
def get_base_system_prompt(
|
13
30
|
ctx: AnyContext,
|
14
31
|
system_prompt_attr: StrAttr | None,
|
15
32
|
render_system_prompt: bool,
|
16
33
|
) -> str:
|
17
|
-
"""Gets the system prompt,
|
34
|
+
"""Gets the base system prompt, prioritizing task-specific, then default."""
|
18
35
|
system_prompt = get_attr(
|
19
36
|
ctx,
|
20
37
|
system_prompt_attr,
|
@@ -23,7 +40,51 @@ def get_system_prompt(
|
|
23
40
|
)
|
24
41
|
if system_prompt is not None:
|
25
42
|
return system_prompt
|
26
|
-
return default_llm_config.get_default_system_prompt()
|
43
|
+
return default_llm_config.get_default_system_prompt() or ""
|
44
|
+
|
45
|
+
|
46
|
+
def get_special_instruction_prompt(
|
47
|
+
ctx: AnyContext,
|
48
|
+
special_instruction_prompt_attr: StrAttr | None,
|
49
|
+
render_special_instruction_prompt: bool,
|
50
|
+
) -> str:
|
51
|
+
"""Gets the special instruction prompt, prioritizing task-specific, then default."""
|
52
|
+
special_instruction = get_attr(
|
53
|
+
ctx,
|
54
|
+
special_instruction_prompt_attr,
|
55
|
+
None,
|
56
|
+
auto_render=render_special_instruction_prompt,
|
57
|
+
)
|
58
|
+
if special_instruction is not None:
|
59
|
+
return special_instruction
|
60
|
+
return default_llm_config.get_default_special_instruction_prompt() or ""
|
61
|
+
|
62
|
+
|
63
|
+
def get_combined_system_prompt(
|
64
|
+
ctx: AnyContext,
|
65
|
+
persona_attr: StrAttr | None,
|
66
|
+
render_persona: bool,
|
67
|
+
system_prompt_attr: StrAttr | None,
|
68
|
+
render_system_prompt: bool,
|
69
|
+
special_instruction_prompt_attr: StrAttr | None,
|
70
|
+
render_special_instruction_prompt: bool,
|
71
|
+
) -> str:
|
72
|
+
"""Combines persona, base system prompt, and special instructions."""
|
73
|
+
persona = get_persona(ctx, persona_attr, render_persona)
|
74
|
+
base_system_prompt = get_base_system_prompt(
|
75
|
+
ctx, system_prompt_attr, render_system_prompt
|
76
|
+
)
|
77
|
+
special_instruction = get_special_instruction_prompt(
|
78
|
+
ctx, special_instruction_prompt_attr, render_special_instruction_prompt
|
79
|
+
)
|
80
|
+
parts = []
|
81
|
+
if persona:
|
82
|
+
parts.append(persona)
|
83
|
+
if base_system_prompt:
|
84
|
+
parts.append(base_system_prompt)
|
85
|
+
if special_instruction:
|
86
|
+
parts.append(special_instruction)
|
87
|
+
return "\n\n".join(parts).strip()
|
27
88
|
|
28
89
|
|
29
90
|
def get_user_message(
|
zrb/task/llm_task.py
CHANGED
@@ -15,6 +15,8 @@ from zrb.input.any_input import AnyInput
|
|
15
15
|
from zrb.task.any_task import AnyTask
|
16
16
|
from zrb.task.base_task import BaseTask
|
17
17
|
from zrb.task.llm.agent import get_agent, run_agent_iteration
|
18
|
+
|
19
|
+
# No longer need llm_config here
|
18
20
|
from zrb.task.llm.config import (
|
19
21
|
get_model,
|
20
22
|
get_model_settings,
|
@@ -30,9 +32,9 @@ from zrb.task.llm.history import (
|
|
30
32
|
from zrb.task.llm.history_summarization import maybe_summarize_history
|
31
33
|
from zrb.task.llm.prompt import (
|
32
34
|
build_user_prompt,
|
35
|
+
get_combined_system_prompt,
|
33
36
|
get_context_enrichment_prompt,
|
34
37
|
get_summarization_prompt,
|
35
|
-
get_system_prompt,
|
36
38
|
)
|
37
39
|
from zrb.util.cli.style import stylize_faint
|
38
40
|
from zrb.xcom.xcom import Xcom
|
@@ -62,12 +64,16 @@ class LLMTask(BaseTask):
|
|
62
64
|
ModelSettings | Callable[[AnySharedContext], ModelSettings] | None
|
63
65
|
) = None,
|
64
66
|
agent: Agent | Callable[[AnySharedContext], Agent] | None = None,
|
67
|
+
persona: StrAttr | None = None,
|
68
|
+
render_persona: bool = True,
|
65
69
|
system_prompt: StrAttr | None = None,
|
66
70
|
render_system_prompt: bool = True,
|
71
|
+
special_instruction_prompt: StrAttr | None = None,
|
72
|
+
render_special_instruction_prompt: bool = True,
|
67
73
|
message: StrAttr | None = None,
|
68
74
|
summarization_prompt: StrAttr | None = None,
|
69
75
|
render_summarization_prompt: bool = True,
|
70
|
-
enrich_context: BoolAttr =
|
76
|
+
enrich_context: BoolAttr | None = None,
|
71
77
|
render_enrich_context: bool = True,
|
72
78
|
context_enrichment_prompt: StrAttr | None = None,
|
73
79
|
render_context_enrichment_prompt: bool = True,
|
@@ -78,28 +84,23 @@ class LLMTask(BaseTask):
|
|
78
84
|
list[MCPServer] | Callable[[AnySharedContext], list[MCPServer]]
|
79
85
|
) = [],
|
80
86
|
conversation_history: (
|
81
|
-
ConversationHistoryData
|
82
|
-
| Callable[
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
| list # Allow raw list (old format)
|
87
|
-
) = ConversationHistoryData(), # Default to an empty model instance
|
87
|
+
ConversationHistoryData
|
88
|
+
| Callable[[AnySharedContext], ConversationHistoryData | dict | list]
|
89
|
+
| dict
|
90
|
+
| list
|
91
|
+
) = ConversationHistoryData(),
|
88
92
|
conversation_history_reader: (
|
89
93
|
Callable[[AnySharedContext], ConversationHistoryData | dict | list | None]
|
90
94
|
| None
|
91
|
-
# Allow returning raw dict/list or None
|
92
95
|
) = None,
|
93
96
|
conversation_history_writer: (
|
94
|
-
Callable[[AnySharedContext, ConversationHistoryData], None]
|
95
|
-
| None
|
96
|
-
# Writer expects the model instance
|
97
|
+
Callable[[AnySharedContext, ConversationHistoryData], None] | None
|
97
98
|
) = None,
|
98
99
|
conversation_history_file: StrAttr | None = None,
|
99
100
|
render_history_file: bool = True,
|
100
|
-
summarize_history: BoolAttr =
|
101
|
+
summarize_history: BoolAttr | None = None,
|
101
102
|
render_summarize_history: bool = True,
|
102
|
-
history_summarization_threshold: IntAttr =
|
103
|
+
history_summarization_threshold: IntAttr | None = None,
|
103
104
|
render_history_summarization_threshold: bool = True,
|
104
105
|
execute_condition: bool | str | Callable[[AnySharedContext], bool] = True,
|
105
106
|
retries: int = 2,
|
@@ -147,8 +148,12 @@ class LLMTask(BaseTask):
|
|
147
148
|
self._render_model_api_key = render_model_api_key
|
148
149
|
self._model_settings = model_settings
|
149
150
|
self._agent = agent
|
151
|
+
self._persona = persona
|
152
|
+
self._render_persona = render_persona
|
150
153
|
self._system_prompt = system_prompt
|
151
154
|
self._render_system_prompt = render_system_prompt
|
155
|
+
self._special_instruction_prompt = special_instruction_prompt
|
156
|
+
self._render_special_instruction_prompt = render_special_instruction_prompt
|
152
157
|
self._message = message
|
153
158
|
self._summarization_prompt = summarization_prompt
|
154
159
|
self._render_summarization_prompt = render_summarization_prompt
|
@@ -211,10 +216,15 @@ class LLMTask(BaseTask):
|
|
211
216
|
summarization_prompt_attr=self._summarization_prompt,
|
212
217
|
render_summarization_prompt=self._render_summarization_prompt,
|
213
218
|
)
|
214
|
-
|
219
|
+
# Get the combined system prompt using the new getter
|
220
|
+
system_prompt = get_combined_system_prompt(
|
215
221
|
ctx=ctx,
|
222
|
+
persona_attr=self._persona,
|
223
|
+
render_persona=self._render_persona,
|
216
224
|
system_prompt_attr=self._system_prompt,
|
217
225
|
render_system_prompt=self._render_system_prompt,
|
226
|
+
special_instruction_prompt_attr=self._special_instruction_prompt,
|
227
|
+
render_special_instruction_prompt=self._render_special_instruction_prompt,
|
218
228
|
)
|
219
229
|
# 1. Prepare initial state (read history, get initial context)
|
220
230
|
history_list, conversation_context = await prepare_initial_state(
|
zrb/task/scheduler.py
CHANGED
@@ -12,7 +12,6 @@ from zrb.task.any_task import AnyTask
|
|
12
12
|
from zrb.task.base_trigger import BaseTrigger
|
13
13
|
from zrb.util.attr import get_str_attr
|
14
14
|
from zrb.util.cron import match_cron
|
15
|
-
from zrb.xcom.xcom import Xcom
|
16
15
|
|
17
16
|
|
18
17
|
class Scheduler(BaseTrigger):
|
@@ -77,6 +76,6 @@ class Scheduler(BaseTrigger):
|
|
77
76
|
ctx.print(f"Current time: {now}")
|
78
77
|
if match_cron(cron_pattern, now):
|
79
78
|
ctx.print(f"Matching {now} with pattern: {cron_pattern}")
|
80
|
-
xcom
|
79
|
+
xcom = self.get_exchange_xcom(ctx.session)
|
81
80
|
xcom.push(now)
|
82
81
|
await asyncio.sleep(60)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: zrb
|
3
|
-
Version: 1.5.
|
3
|
+
Version: 1.5.10
|
4
4
|
Summary: Your Automation Powerhouse
|
5
5
|
Home-page: https://github.com/state-alchemists/zrb
|
6
6
|
License: AGPL-3.0-or-later
|
@@ -26,7 +26,7 @@ Requires-Dist: openai (>=1.70.0,<2.0.0) ; extra == "rag" or extra == "all"
|
|
26
26
|
Requires-Dist: pdfplumber (>=0.11.6,<0.12.0) ; extra == "rag" or extra == "all"
|
27
27
|
Requires-Dist: playwright (>=1.51.0,<2.0.0) ; extra == "playwright" or extra == "all"
|
28
28
|
Requires-Dist: psutil (>=7.0.0,<8.0.0)
|
29
|
-
Requires-Dist: pydantic-ai (>=0.
|
29
|
+
Requires-Dist: pydantic-ai (>=0.1.2,<0.2.0)
|
30
30
|
Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
|
31
31
|
Requires-Dist: python-jose[cryptography] (>=3.4.0,<4.0.0)
|
32
32
|
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
@@ -13,7 +13,7 @@ zrb/builtin/llm/llm_chat.py,sha256=XL5HK_o1EejkYS0fJIBI39vApuqYYsGHFSigvXfS7CI,4
|
|
13
13
|
zrb/builtin/llm/previous-session.js,sha256=xMKZvJoAbrwiyHS0OoPrWuaKxWYLoyR5sguePIoCjTY,816
|
14
14
|
zrb/builtin/llm/tool/api.py,sha256=yR9I0ZsI96OeQl9pgwORMASVuXsAL0a89D_iPS4C8Dc,1699
|
15
15
|
zrb/builtin/llm/tool/cli.py,sha256=_CNEmEc6K2Z0i9ppYeM7jGpqaEdT3uxaWQatmxP3jKE,858
|
16
|
-
zrb/builtin/llm/tool/file.py,sha256=
|
16
|
+
zrb/builtin/llm/tool/file.py,sha256=e2-Mh9AeltCJGZrvhuMFMzmgQgsQbaxvSpAzcruIB9o,19222
|
17
17
|
zrb/builtin/llm/tool/rag.py,sha256=45t0o88l7F62oq2P61NnC1hsZJ4h72dZsVQfcsOIUc8,7521
|
18
18
|
zrb/builtin/llm/tool/web.py,sha256=4qzom9xX-JxztIaTWneNfyTRlgweHIxzC1uSEAxJ00A,5507
|
19
19
|
zrb/builtin/md5.py,sha256=0pNlrfZA0wlZlHvFHLgyqN0JZJWGKQIF5oXxO44_OJk,949
|
@@ -239,7 +239,7 @@ zrb/input/option_input.py,sha256=TQB82ko5odgzkULEizBZi0e9TIHEbIgvdP0AR3RhA74,213
|
|
239
239
|
zrb/input/password_input.py,sha256=szBojWxSP9QJecgsgA87OIYwQrY2AQ3USIKdDZY6snU,1465
|
240
240
|
zrb/input/str_input.py,sha256=NevZHX9rf1g8eMatPyy-kUX3DglrVAQpzvVpKAzf7bA,81
|
241
241
|
zrb/input/text_input.py,sha256=shvVbc2U8Is36h23M5lcW8IEwKc9FR-4uEPZZroj3rU,3377
|
242
|
-
zrb/llm_config.py,sha256=
|
242
|
+
zrb/llm_config.py,sha256=sf2cMjD-eSTvOywT1qKVeSftRmxLQ92K3mzho6yP2S8,8952
|
243
243
|
zrb/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
244
244
|
zrb/runner/cli.py,sha256=0mT0oO_yEhc8N4nYCJNujhgLjVykZ0B-kAOFXyAvAqM,6672
|
245
245
|
zrb/runner/common_util.py,sha256=0zhZn1Jdmr194_nsL5_L-Kn9-_NDpMTI2z6_LXUQJ-U,1369
|
@@ -297,8 +297,15 @@ zrb/session_state_logger/any_session_state_logger.py,sha256=OEP7RQD6sPSJP0OY8oDK
|
|
297
297
|
zrb/session_state_logger/file_session_state_logger.py,sha256=1ue7-Bcwg4wlLn2G_7ARR4Rij2zUISj_Y56VBQsCaMQ,3666
|
298
298
|
zrb/session_state_logger/session_state_logger_factory.py,sha256=wXf2DVmeRmx399MFYYty6uNcPZMcf7iayHBYCLGlhfc,189
|
299
299
|
zrb/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
300
|
-
zrb/task/any_task.py,sha256=
|
301
|
-
zrb/task/
|
300
|
+
zrb/task/any_task.py,sha256=zklUjkLRQ62TEvfnOUUYfXChj8Zk4igee3w8V3_rN08,5846
|
301
|
+
zrb/task/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
302
|
+
zrb/task/base/context.py,sha256=73k3fKwup0AJwTTLpay0f_-axJextaxgbTem4w4Bmas,3670
|
303
|
+
zrb/task/base/dependencies.py,sha256=Kcxhn7z4OU9Fc_y-cD1Sc96wgNXs0VDoi8r5cJMu0oY,1952
|
304
|
+
zrb/task/base/execution.py,sha256=lB6cfivk-EM6sZSaPjYs_ufb7jb-A2jLJNhBupwBFgI,11101
|
305
|
+
zrb/task/base/lifecycle.py,sha256=YIugyqRmEKMnc9MTCDEZr9jVhie3Kwt7LTMtAVAN9Ks,7278
|
306
|
+
zrb/task/base/monitoring.py,sha256=UAOEcPiYNtZR4FFxzWCosuOEFE_P3c4GT5vAhQmohqI,5663
|
307
|
+
zrb/task/base/operators.py,sha256=uAMFqpZJsPnCrojgOl1FUDXTS15mtOa_IqiAXltyYRU,1576
|
308
|
+
zrb/task/base_task.py,sha256=3MLPYDzNgjIJiQTxSyKLmvG_FspOl61htuRZG7l34QA,8915
|
302
309
|
zrb/task/base_trigger.py,sha256=jC722rDvodaBLeNaFghkTyv1u0QXrK6BLZUUqcmBJ7Q,4581
|
303
310
|
zrb/task/cmd_task.py,sha256=f1OWajOBmdtx2QcXBr_8s6o82Fp4UTLqCXJqp2gxwzU,10750
|
304
311
|
zrb/task/http_check.py,sha256=Gf5rOB2Se2EdizuN9rp65HpGmfZkGc-clIAlHmPVehs,2565
|
@@ -306,19 +313,19 @@ zrb/task/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
306
313
|
zrb/task/llm/agent.py,sha256=2u1zlX41oBzMKozXWXD3gDEOzOsHNsFpedRcJXbUNHI,5105
|
307
314
|
zrb/task/llm/config.py,sha256=fXasnGb_DVTJIeY--HZ8bf1jd7iCUNttfUDJB5PvHRk,3071
|
308
315
|
zrb/task/llm/context.py,sha256=JAI1DqqiXlDkyL4aEXVyeutU8K5YfdSsWMbzx1rxMZU,3281
|
309
|
-
zrb/task/llm/context_enrichment.py,sha256=
|
316
|
+
zrb/task/llm/context_enrichment.py,sha256=zz2hmJZgXRa6354eTz8fAz3NclGgwD5VciWzD_mFTEM,4641
|
310
317
|
zrb/task/llm/error.py,sha256=YOwnEdFMtqOlaiA83tDHpC6uh2_9r5NeS-inrlb5a8E,3622
|
311
318
|
zrb/task/llm/history.py,sha256=LnrJdXLyo2qz-bNCwLorhoqGmgSiPTUU0bzY63w67-E,9257
|
312
|
-
zrb/task/llm/history_summarization.py,sha256=
|
319
|
+
zrb/task/llm/history_summarization.py,sha256=UaeepcIVMTxJTwqy3V22rpeBXXN04KLvEzOsFtWmyDM,6259
|
313
320
|
zrb/task/llm/print_node.py,sha256=Dkb0xFyEXpNRKFRCM4Md0lfg6K3nI0t8yH3Abh20PjE,4430
|
314
|
-
zrb/task/llm/prompt.py,sha256=
|
321
|
+
zrb/task/llm/prompt.py,sha256=Xql45nZfkB9BXbVVxfKiawtnAVCao2QhaowVdL7qTLg,4627
|
315
322
|
zrb/task/llm/tool_wrapper.py,sha256=gZgoxcuOCgAVDPnLqfJ3ps57ZCVQi7q68z_KnS5Mx1U,3350
|
316
323
|
zrb/task/llm/typing.py,sha256=c8VAuPBw_4A3DxfYdydkgedaP-LU61W9_wj3m3CAX1E,58
|
317
|
-
zrb/task/llm_task.py,sha256=
|
324
|
+
zrb/task/llm_task.py,sha256=uLptMfoRawCCPo8_DSneKd8Uag9WDCXkU0oOvO5Lh0M,14218
|
318
325
|
zrb/task/make_task.py,sha256=PD3b_aYazthS8LHeJsLAhwKDEgdurQZpymJDKeN60u0,2265
|
319
326
|
zrb/task/rsync_task.py,sha256=GSL9144bmp6F0EckT6m-2a1xG25AzrrWYzH4k3SVUKM,6370
|
320
327
|
zrb/task/scaffolder.py,sha256=rME18w1HJUHXgi9eTYXx_T2G4JdqDYzBoNOkdOOo5-o,6806
|
321
|
-
zrb/task/scheduler.py,sha256=
|
328
|
+
zrb/task/scheduler.py,sha256=5xoet0bMjVq0JKwSwwivD1Jo84wwwA2PrL5WaKwJAGA,3110
|
322
329
|
zrb/task/task.py,sha256=KCrCaWYOQQvv1RJsYtHDeo9RBFmlXQ28oKyEFU4Q7pA,73
|
323
330
|
zrb/task/tcp_check.py,sha256=P_QgGqwd5dXDaud3oQRxe_WuxyxG4s7CTY2wDk9Qcu0,2511
|
324
331
|
zrb/task_status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -355,7 +362,7 @@ zrb/util/string/name.py,sha256=8picJfUBXNpdh64GNaHv3om23QHhUZux7DguFLrXHp8,1163
|
|
355
362
|
zrb/util/todo.py,sha256=1nDdwPc22oFoK_1ZTXyf3638Bg6sqE2yp_U4_-frHoc,16015
|
356
363
|
zrb/xcom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
357
364
|
zrb/xcom/xcom.py,sha256=o79rxR9wphnShrcIushA0Qt71d_p3ZTxjNf7x9hJB78,1571
|
358
|
-
zrb-1.5.
|
359
|
-
zrb-1.5.
|
360
|
-
zrb-1.5.
|
361
|
-
zrb-1.5.
|
365
|
+
zrb-1.5.10.dist-info/METADATA,sha256=ukEcYJvB_RA35-S1X5JPJT8v3qq5oN2Y2L2sYp4hiic,8469
|
366
|
+
zrb-1.5.10.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
367
|
+
zrb-1.5.10.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
|
368
|
+
zrb-1.5.10.dist-info/RECORD,,
|
File without changes
|
File without changes
|