fabricatio 0.3.13__tar.gz → 0.3.14.dev0__tar.gz

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.
Files changed (165) hide show
  1. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/PKG-INFO +1 -1
  2. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/minor/hello_fabricatio.py +4 -3
  3. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/pyproject.toml +1 -1
  4. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/__init__.py +2 -7
  5. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/action.py +6 -21
  6. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/generic.py +2 -1
  7. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/kwargs_types.py +1 -46
  8. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/role.py +42 -24
  9. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/utils.py +38 -4
  10. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/event.rs +35 -34
  11. fabricatio-0.3.14.dev0/templates.tar.gz +0 -0
  12. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/uv.lock +10 -10
  13. fabricatio-0.3.13/templates.tar.gz +0 -0
  14. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/.github/workflows/build-package.yaml +0 -0
  15. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/.github/workflows/ruff.yaml +0 -0
  16. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/.github/workflows/tests.yaml +0 -0
  17. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/.gitignore +0 -0
  18. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/.python-version +0 -0
  19. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/Cargo.lock +0 -0
  20. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/Cargo.toml +0 -0
  21. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/LICENSE +0 -0
  22. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/Makefile +0 -0
  23. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/README.md +0 -0
  24. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/correct/correct.py +0 -0
  25. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/correct/correct_loop.py +0 -0
  26. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/extract_and_inject/.gitignore +0 -0
  27. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/extract_and_inject/article_rag.py +0 -0
  28. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/extract_and_inject/ask.py +0 -0
  29. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/extract_and_inject/chunk_article.py +0 -0
  30. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/extract_and_inject/extract_and_inject.py +0 -0
  31. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/extract_article/extract.py +0 -0
  32. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/llm_usages/llm_usage.py +0 -0
  33. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/make_a_rating/rating.py +0 -0
  34. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/make_diary/commits.json +0 -0
  35. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/make_diary/diary.py +0 -0
  36. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/minor/write_a_poem.py +0 -0
  37. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/propose_task/.gitignore +0 -0
  38. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/propose_task/propose.py +0 -0
  39. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/reviewer/censor.py +0 -0
  40. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/reviewer/review.py +0 -0
  41. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/rules/.gitignore +0 -0
  42. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/rules/draft_ruleset.py +0 -0
  43. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/search_bibtex/.gitignore +0 -0
  44. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/search_bibtex/search.py +0 -0
  45. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/simple_chat/chat.py +0 -0
  46. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/simple_rag/simple_rag.py +0 -0
  47. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/task_handle/handle_task.py +0 -0
  48. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/write_article/.gitignore +0 -0
  49. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/write_article/article_rag.py +0 -0
  50. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/write_article/post_process.py +0 -0
  51. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/write_article/write_article.py +0 -0
  52. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/write_outline/.gitignore +0 -0
  53. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/write_outline/write_outline.py +0 -0
  54. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/examples/write_outline/write_outline_corrected.py +0 -0
  55. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/actions/__init__.py +0 -0
  56. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/actions/article.py +0 -0
  57. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/actions/article_rag.py +0 -0
  58. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/actions/fs.py +0 -0
  59. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/actions/output.py +0 -0
  60. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/actions/rag.py +0 -0
  61. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/actions/rules.py +0 -0
  62. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/__init__.py +0 -0
  63. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/advanced_judge.py +0 -0
  64. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/advanced_rag.py +0 -0
  65. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/censor.py +0 -0
  66. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/check.py +0 -0
  67. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/correct.py +0 -0
  68. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/extract.py +0 -0
  69. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/propose.py +0 -0
  70. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/rag.py +0 -0
  71. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/rating.py +0 -0
  72. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/review.py +0 -0
  73. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/capabilities/task.py +0 -0
  74. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/core.py +0 -0
  75. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/decorators.py +0 -0
  76. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/fs/__init__.py +0 -0
  77. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/fs/curd.py +0 -0
  78. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/fs/readers.py +0 -0
  79. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/journal.py +0 -0
  80. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/adv_kwargs_types.py +0 -0
  81. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/__init__.py +0 -0
  82. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/advanced_judge.py +0 -0
  83. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/aricle_rag.py +0 -0
  84. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/article_base.py +0 -0
  85. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/article_essence.py +0 -0
  86. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/article_main.py +0 -0
  87. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/article_outline.py +0 -0
  88. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/article_proposal.py +0 -0
  89. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/patches.py +0 -0
  90. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/problem.py +0 -0
  91. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/rag.py +0 -0
  92. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/extra/rule.py +0 -0
  93. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/task.py +0 -0
  94. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/tool.py +0 -0
  95. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/models/usages.py +0 -0
  96. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/parser.py +0 -0
  97. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/py.typed +0 -0
  98. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/rust.pyi +0 -0
  99. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/toolboxes/__init__.py +0 -0
  100. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/toolboxes/arithmetic.py +0 -0
  101. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/toolboxes/fs.py +0 -0
  102. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/workflows/__init__.py +0 -0
  103. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/workflows/articles.py +0 -0
  104. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/python/fabricatio/workflows/rag.py +0 -0
  105. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/bib_tools.rs +0 -0
  106. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/config.rs +0 -0
  107. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/hash.rs +0 -0
  108. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/hbs_helpers.rs +0 -0
  109. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/language.rs +0 -0
  110. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/lib.rs +0 -0
  111. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/macro_utils/Cargo.toml +0 -0
  112. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/macro_utils/src/lib.rs +0 -0
  113. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/templates.rs +0 -0
  114. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/typst_tools.rs +0 -0
  115. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/src/word_split.rs +0 -0
  116. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/as_prompt.hbs +0 -0
  117. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/binary-exploitation-ctf-solver.hbs +0 -0
  118. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/chap_summary.hbs +0 -0
  119. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/check_string.hbs +0 -0
  120. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/claude-xml.hbs +0 -0
  121. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/clean-up-code.hbs +0 -0
  122. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/co_validation.hbs +0 -0
  123. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/create_json_obj.hbs +0 -0
  124. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/cryptography-ctf-solver.hbs +0 -0
  125. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/dependencies.hbs +0 -0
  126. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/document-the-code.hbs +0 -0
  127. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/draft_rating_criteria.hbs +0 -0
  128. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/draft_rating_manual.hbs +0 -0
  129. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/draft_rating_weights_klee.hbs +0 -0
  130. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/draft_tool_usage_code.hbs +0 -0
  131. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/extract.hbs +0 -0
  132. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/extract_criteria_from_reasons.hbs +0 -0
  133. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/extract_reasons_from_examples.hbs +0 -0
  134. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/find-security-vulnerabilities.hbs +0 -0
  135. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/fix-bugs.hbs +0 -0
  136. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/fix_troubled_obj.hbs +0 -0
  137. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/fix_troubled_string.hbs +0 -0
  138. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/generic_string.hbs +0 -0
  139. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/improve-performance.hbs +0 -0
  140. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/liststr.hbs +0 -0
  141. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/make_choice.hbs +0 -0
  142. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/make_judgment.hbs +0 -0
  143. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/pathstr.hbs +0 -0
  144. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/rate_fine_grind.hbs +0 -0
  145. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/refactor.hbs +0 -0
  146. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/refined_query.hbs +0 -0
  147. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/retrieved_display.hbs +0 -0
  148. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/reverse-engineering-ctf-solver.hbs +0 -0
  149. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/review_string.hbs +0 -0
  150. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/rule_requirement.hbs +0 -0
  151. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/ruleset_requirement_breakdown.hbs +0 -0
  152. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/task_briefing.hbs +0 -0
  153. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/web-ctf-solver.hbs +0 -0
  154. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/write-git-commit.hbs +0 -0
  155. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/write-github-pull-request.hbs +0 -0
  156. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/templates/built-in/write-github-readme.hbs +0 -0
  157. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_config.py +0 -0
  158. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_models/test_action.py +0 -0
  159. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_models/test_advanced.py +0 -0
  160. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_models/test_generic.py +0 -0
  161. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_models/test_problem.py +0 -0
  162. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_models/test_role.py +0 -0
  163. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_models/test_task.py +0 -0
  164. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_models/test_tool.py +0 -0
  165. {fabricatio-0.3.13 → fabricatio-0.3.14.dev0}/tests/test_models/test_usages.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fabricatio
3
- Version: 0.3.13
3
+ Version: 0.3.14.dev0
4
4
  Classifier: License :: OSI Approved :: MIT License
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: Programming Language :: Python :: 3.12
@@ -3,7 +3,7 @@
3
3
  import asyncio
4
4
  from typing import Any
5
5
 
6
- from fabricatio import Action, Role, Task, WorkFlow, logger
6
+ from fabricatio import Action, Role, Task, WorkFlow, logger, Event
7
7
 
8
8
  task = Task(name="say hello")
9
9
 
@@ -21,9 +21,10 @@ class Hello(Action):
21
21
 
22
22
  async def main() -> None:
23
23
  """Main function."""
24
- Role(name="talker", description="talker role", registry={task.pending_label: WorkFlow(name="talk", steps=(Hello,))})
24
+ Role(name="talker", description="talker role",
25
+ registry={Event.quick_instantiate("talk"): WorkFlow(name="talk", steps=(Hello,))})
25
26
 
26
- logger.success(f"Result: {await task.delegate()}")
27
+ logger.success(f"Result: {await task.delegate("talk")}")
27
28
 
28
29
 
29
30
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fabricatio"
3
- version = "0.3.13"
3
+ version = "0.3.14-dev0"
4
4
  description = "A LLM multi-agent framework."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -3,32 +3,27 @@
3
3
  from fabricatio.rust import CONFIG, TEMPLATE_MANAGER, BibManager, Event
4
4
 
5
5
  from fabricatio import actions, capabilities, toolboxes, workflows
6
- from fabricatio.core import env
6
+ from fabricatio import parser
7
7
  from fabricatio.journal import logger
8
8
  from fabricatio.models import extra
9
9
  from fabricatio.models.action import Action, WorkFlow
10
10
  from fabricatio.models.role import Role
11
11
  from fabricatio.models.task import Task
12
12
  from fabricatio.models.tool import ToolBox
13
- from fabricatio.parser import Capture, GenericCapture, JsonCapture, PythonCapture
14
13
 
15
14
  __all__ = [
16
15
  "CONFIG",
17
16
  "TEMPLATE_MANAGER",
18
17
  "Action",
19
18
  "BibManager",
20
- "Capture",
19
+ "parser",
21
20
  "Event",
22
- "GenericCapture",
23
- "JsonCapture",
24
- "PythonCapture",
25
21
  "Role",
26
22
  "Task",
27
23
  "ToolBox",
28
24
  "WorkFlow",
29
25
  "actions",
30
26
  "capabilities",
31
- "env",
32
27
  "extra",
33
28
  "logger",
34
29
  "toolboxes",
@@ -12,14 +12,13 @@ Classes:
12
12
  import traceback
13
13
  from abc import abstractmethod
14
14
  from asyncio import Queue, create_task
15
- from typing import Any, ClassVar, Dict, Self, Sequence, Tuple, Type, Union, final
15
+ from typing import Any, ClassVar, Dict, Self, Sequence, Tuple, Type, Union, final, Generator
16
16
 
17
17
  from pydantic import Field, PrivateAttr
18
18
 
19
19
  from fabricatio.journal import logger
20
20
  from fabricatio.models.generic import WithBriefing
21
21
  from fabricatio.models.task import Task
22
- from fabricatio.models.usages import ToolBoxUsage
23
22
  from fabricatio.utils import override_kwargs
24
23
 
25
24
  OUTPUT_KEY = "task_output"
@@ -106,7 +105,7 @@ class Action(WithBriefing):
106
105
  return self
107
106
 
108
107
 
109
- class WorkFlow(WithBriefing, ToolBoxUsage):
108
+ class WorkFlow(WithBriefing):
110
109
  """Manages sequences of actions to fulfill tasks.
111
110
 
112
111
  Handles context propagation between actions, error handling, and task lifecycle
@@ -148,6 +147,10 @@ class WorkFlow(WithBriefing, ToolBoxUsage):
148
147
  # Convert any action classes to instances
149
148
  self._instances = tuple(step if isinstance(step, Action) else step() for step in self.steps)
150
149
 
150
+ def iter_actions(self) -> Generator[Action, None, None]:
151
+ """Iterate over action instances."""
152
+ yield from self._instances
153
+
151
154
  def inject_personality(self, personality: str) -> Self:
152
155
  """Set personality for actions without existing personality.
153
156
 
@@ -249,24 +252,6 @@ class WorkFlow(WithBriefing, ToolBoxUsage):
249
252
 
250
253
  await self._context.put({self.task_input_key: task, **ctx})
251
254
 
252
- def steps_fallback_to_self(self) -> Self:
253
- """Configure all steps to use this workflow's configuration as fallback.
254
-
255
- Returns:
256
- Self: The workflow instance for method chaining.
257
- """
258
- self.hold_to(self._instances)
259
- return self
260
-
261
- def steps_supply_tools_from_self(self) -> Self:
262
- """Provide this workflow's tools to all steps in the workflow.
263
-
264
- Returns:
265
- Self: The workflow instance for method chaining.
266
- """
267
- self.provide_tools_to(i for i in self._instances if isinstance(i, ToolBoxUsage))
268
- return self
269
-
270
255
  def update_init_context(self, /, **kwargs) -> Self:
271
256
  """Update the initial context with additional key-value pairs.
272
257
 
@@ -7,7 +7,6 @@ from typing import Any, Callable, Dict, Iterable, List, Mapping, Optional, Self,
7
7
 
8
8
  import ujson
9
9
  from fabricatio.rust import CONFIG, TEMPLATE_MANAGER, blake3_hash, detect_language
10
- from litellm.utils import token_counter
11
10
  from pydantic import (
12
11
  BaseModel,
13
12
  ConfigDict,
@@ -666,6 +665,8 @@ class Vectorizable:
666
665
  Raises:
667
666
  ValueError: If the chunk exceeds the maximum sequence length.
668
667
  """
668
+ from litellm.utils import token_counter
669
+
669
670
  max_length = max_length or CONFIG.embedding.max_sequence_length
670
671
  chunk = self._prepare_vectorization_inner()
671
672
  if max_length and (length := token_counter(text=chunk)) > max_length:
@@ -1,9 +1,6 @@
1
1
  """This module contains the types for the keyword arguments of the methods in the models module."""
2
2
 
3
- from typing import Any, Dict, List, Literal, NotRequired, Optional, Required, TypedDict
4
-
5
- from litellm.caching.caching import CacheMode
6
- from litellm.types.caching import CachingSupportedCallTypes
3
+ from typing import Dict, List, Literal, NotRequired, Optional, Required, TypedDict
7
4
 
8
5
 
9
6
  class ChunkKwargs(TypedDict):
@@ -70,7 +67,6 @@ class ValidateKwargs[T](GenerateKwargs, total=False):
70
67
  max_validations: int
71
68
 
72
69
 
73
-
74
70
  class CompositeScoreKwargs(ValidateKwargs[List[Dict[str, float]]], total=False):
75
71
  """Arguments for composite score generation operations.
76
72
 
@@ -125,47 +121,6 @@ class ChooseKwargs[T](ValidateKwargs[T], total=False):
125
121
  k: int
126
122
 
127
123
 
128
- class CacheKwargs(TypedDict, total=False):
129
- """Configuration parameters for the caching system.
130
-
131
- These arguments control the behavior of various caching backends,
132
- including in-memory, Redis, S3, and vector database caching options.
133
- """
134
-
135
- mode: CacheMode # when default_on cache is always on, when default_off cache is opt in
136
- host: str
137
- port: str
138
- password: str
139
- namespace: str
140
- ttl: float
141
- default_in_memory_ttl: float
142
- default_in_redis_ttl: float
143
- similarity_threshold: float
144
- supported_call_types: list[CachingSupportedCallTypes]
145
- # s3 Bucket, boto3 configuration
146
- s3_bucket_name: str
147
- s3_region_name: str
148
- s3_api_version: str
149
- s3_use_ssl: bool
150
- s3_verify: bool | str
151
- s3_endpoint_url: str
152
- s3_aws_access_key_id: str
153
- s3_aws_secret_access_key: str
154
- s3_aws_session_token: str
155
- s3_config: Any
156
- s3_path: str
157
- redis_semantic_cache_use_async: bool
158
- redis_semantic_cache_embedding_model: str
159
- redis_flush_size: int
160
- redis_startup_nodes: list
161
- disk_cache_dir: Any
162
- qdrant_api_base: str
163
- qdrant_api_key: str
164
- qdrant_collection_name: str
165
- qdrant_quantization_config: str
166
- qdrant_semantic_cache_embedding_model: str
167
-
168
-
169
124
  class RerankOptions(TypedDict, total=False):
170
125
  """Optional keyword arguments for the rerank method."""
171
126
 
@@ -1,40 +1,35 @@
1
1
  """Module that contains the Role class for managing workflows and their event registrations."""
2
-
3
- from typing import Any, Self, Set
2
+ from functools import partial
3
+ from typing import Any, Self, Dict
4
4
 
5
5
  from fabricatio.rust import Event
6
6
  from pydantic import Field, ConfigDict
7
7
 
8
- from fabricatio.capabilities.propose import Propose
9
8
  from fabricatio.core import env
10
9
  from fabricatio.journal import logger
11
10
  from fabricatio.models.action import WorkFlow
12
11
  from fabricatio.models.generic import WithBriefing
13
- from fabricatio.models.tool import ToolBox
14
- from fabricatio.models.usages import ToolBoxUsage
12
+ from fabricatio.utils import is_subclass_of_base
13
+
14
+ is_toolbox_usage = partial(is_subclass_of_base, base_module="fabricatio.models.usages",
15
+ base_name="ToolBoxUsage")
16
+ is_scoped_config = partial(is_subclass_of_base, base_module="fabricatio.models.generic",
17
+ base_name="ScopedConfig")
15
18
 
16
19
 
17
- class Role(WithBriefing, Propose, ToolBoxUsage):
20
+ class Role(WithBriefing):
18
21
  """Class that represents a role with a registry of events and workflows.
19
22
 
20
23
  A Role serves as a container for workflows, managing their registration to events
21
24
  and providing them with shared configuration like tools and personality.
22
-
23
- Attributes:
24
- registry: Mapping of events to workflows that handle them
25
- toolboxes: Set of toolboxes available to this role and its workflows
26
25
  """
27
- # fixme: not use arbitrary_types_allowed
28
26
  model_config = ConfigDict(use_attribute_docstrings=True, arbitrary_types_allowed=True)
29
27
  description: str = ""
30
28
  """A brief description of the role's responsibilities and capabilities."""
31
29
 
32
- registry: dict[Event | str, WorkFlow] = Field(default_factory=dict)
30
+ registry: Dict[Event, WorkFlow] = Field(default_factory=dict)
33
31
  """The registry of events and workflows."""
34
32
 
35
- toolboxes: Set[ToolBox] = Field(default_factory=set)
36
- """Collection of tools available to this role."""
37
-
38
33
  def model_post_init(self, __context: Any) -> None:
39
34
  """Initialize the role by resolving configurations and registering workflows.
40
35
 
@@ -51,7 +46,7 @@ class Role(WithBriefing, Propose, ToolBoxUsage):
51
46
  """
52
47
  for event, workflow in self.registry.items():
53
48
  logger.debug(
54
- f"Registering workflow: `{workflow.name}` for event: `{Event.instantiate_from(event).collapse()}`"
49
+ f"Registering workflow: `{workflow.name}` for event: `{event.collapse()}`"
55
50
  )
56
51
  env.on(event, workflow.serve)
57
52
  return self
@@ -67,12 +62,35 @@ class Role(WithBriefing, Propose, ToolBoxUsage):
67
62
  """
68
63
  for workflow in self.registry.values():
69
64
  logger.debug(f"Resolving config for workflow: `{workflow.name}`")
70
- (
71
- workflow.fallback_to(self)
72
- .steps_fallback_to_self()
73
- .inject_personality(self.briefing)
74
- .supply_tools_from(self)
75
- .steps_supply_tools_from_self()
76
- )
77
-
65
+ self._configure_scoped_config(workflow)
66
+ self._configure_toolbox_usage(workflow)
67
+ workflow.inject_personality(self.briefing)
78
68
  return self
69
+
70
+ def _configure_scoped_config(self, workflow) -> None:
71
+ """Configure scoped configuration for workflow and its actions."""
72
+
73
+ if not is_scoped_config(self.__class__):
74
+ return
75
+
76
+ fallback_target = self
77
+ if is_scoped_config(workflow):
78
+ workflow.fallback_to(self)
79
+ fallback_target = workflow
80
+
81
+ for action in (a for a in workflow.iter_actions() if is_scoped_config(a)):
82
+ action.fallback_to(fallback_target)
83
+
84
+ def _configure_toolbox_usage(self, workflow) -> None:
85
+ """Configure toolbox usage for workflow and its actions."""
86
+
87
+ if not is_toolbox_usage(self.__class__):
88
+ return
89
+
90
+ supply_target = self
91
+ if is_toolbox_usage(workflow):
92
+ workflow.supply_tools_from(self)
93
+ supply_target = workflow
94
+
95
+ for action in (a for a in workflow.iter_actions() if is_toolbox_usage(a)):
96
+ action.supply_tools_from(supply_target)
@@ -1,15 +1,46 @@
1
1
  """A collection of utility functions for the fabricatio package."""
2
2
 
3
- from typing import Any, Dict, List, Mapping, Optional, TypedDict, Unpack, overload
4
-
5
- import aiohttp
6
- import requests
3
+ from typing import Any, Dict, List, Mapping, Optional, TypedDict, Unpack, overload, Type, Tuple
7
4
 
8
5
  from fabricatio.decorators import precheck_package
9
6
  from fabricatio.journal import logger
10
7
  from fabricatio.models.kwargs_types import RerankOptions
11
8
 
12
9
 
10
+ def is_subclass_of_base(cls: Type, base_module: str, base_name: str) -> bool:
11
+ """Determines if the given class is a subclass of an unimported base class.
12
+
13
+ Args:
14
+ cls: The class to check
15
+ base_module: The module name of the base class
16
+ base_name: The class name of the base class
17
+
18
+ Returns:
19
+ bool: True if cls is a subclass of the specified base class, False otherwise
20
+ """
21
+ for ancestor in cls.__mro__:
22
+ if ancestor.__module__ == base_module and ancestor.__name__ == base_name:
23
+ return True
24
+ return False
25
+
26
+
27
+ def is_subclass_of_any_base(cls: Type, bases: List[Tuple[str, str]]) -> bool:
28
+ """Determines if the given class is a subclass of the candidate base classes.
29
+
30
+ Args:
31
+ cls: The class to check
32
+ bases: A list of tuples where each tuple contains (module_name, class_name)
33
+
34
+ Returns:
35
+ bool: True if cls is a subclass of the specified base classes, False otherwise
36
+ """
37
+ for ancestor in cls.__mro__:
38
+ for base_module, base_name in bases:
39
+ if ancestor.__module__ == base_module and ancestor.__name__ == base_name:
40
+ return True
41
+ return False
42
+
43
+
13
44
  @precheck_package(
14
45
  "questionary", "'questionary' is required to run this function. Have you installed `fabricatio[qa]`?."
15
46
  )
@@ -164,6 +195,7 @@ class RerankerAPI:
164
195
  ValueError: If input parameters are invalid or the API returns a client-side error.
165
196
  RuntimeError: If the API call fails or returns a server-side error.
166
197
  """
198
+ import requests
167
199
  # Validate inputs
168
200
  if not isinstance(query, str) or not query.strip():
169
201
  raise ValueError("Query must be a non-empty string.")
@@ -219,6 +251,8 @@ class RerankerAPI:
219
251
  ValueError: If input parameters are invalid or the API returns a client-side error.
220
252
  RuntimeError: If the API call fails or returns a server-side error.
221
253
  """
254
+ import aiohttp
255
+
222
256
  # Validate inputs
223
257
  if not isinstance(query, str) or not query.strip():
224
258
  raise ValueError("Query must be a non-empty string.")
@@ -57,18 +57,18 @@ impl Event {
57
57
  ))
58
58
  }
59
59
  }
60
-
61
60
  #[staticmethod]
62
61
  fn quick_instantiate(event: &Bound<'_, PyAny>) -> PyResult<Self> {
63
62
  let mut event = Self::instantiate_from(event)?;
64
- event.push_wildcard();
65
- event.push_pending();
63
+ event.segments.push("*".to_string());
64
+ event.segments.push(TaskStatus::Pending.to_string());
66
65
  Ok(event)
67
66
  }
68
67
 
69
68
  fn derive(&self, event: &Bound<'_, PyAny>) -> PyResult<Self> {
70
69
  let mut new_event = self.clone();
71
- new_event.concat(event)?;
70
+ let sub = Event::instantiate_from(event)?;
71
+ new_event.segments.extend(sub.segments);
72
72
  Ok(new_event)
73
73
  }
74
74
 
@@ -80,10 +80,9 @@ impl Event {
80
80
  self.clone()
81
81
  }
82
82
 
83
- fn push(&mut self, segment: Bound<'_, PyAny>) -> PyResult<Self> {
83
+ fn push<'py>(mut slf: PyRefMut<'py, Self>, segment: Bound<'py, PyAny>) -> PyResult<PyRefMut<'py, Self>> {
84
84
  if let Ok(status) = segment.extract::<TaskStatus>() {
85
- self.segments.push(status.to_string());
86
- Ok(self.clone())
85
+ slf.segments.push(status.to_string());
87
86
  } else if let Ok(string) = segment.extract::<String>() {
88
87
  if string.is_empty() {
89
88
  return Err(PyErr::new::<pyo3::exceptions::PyValueError, _>(
@@ -96,57 +95,59 @@ impl Event {
96
95
  format!("The segment must not contain the delimiter '{}'", delimiter),
97
96
  ));
98
97
  }
99
- self.segments.push(string);
100
- Ok(self.clone())
98
+ slf.segments.push(string);
101
99
  } else {
102
- Err(PyErr::new::<pyo3::exceptions::PyTypeError, _>(
100
+ return Err(PyErr::new::<pyo3::exceptions::PyTypeError, _>(
103
101
  "The segment must be a string or TaskStatus".to_string(),
104
- ))
102
+ ));
105
103
  }
104
+ Ok(slf)
106
105
  }
107
106
 
108
- fn push_wildcard(&mut self) -> Self {
109
- self.segments.push("*".to_string());
110
- self.clone()
107
+ fn push_wildcard<'py>(mut slf: PyRefMut<'py, Self>) -> PyRefMut<'py, Self> {
108
+ slf.segments.push("*".to_string());
109
+ slf
111
110
  }
112
111
 
113
- fn push_pending(&mut self) -> Self {
114
- self.segments.push(TaskStatus::Pending.to_string());
115
- self.clone()
112
+ fn push_pending<'py>(mut slf: PyRefMut<'py, Self>) -> PyRefMut<'py, Self> {
113
+ slf.segments.push(TaskStatus::Pending.to_string());
114
+ slf
116
115
  }
117
116
 
118
- fn push_running(&mut self) -> Self {
119
- self.segments.push(TaskStatus::Running.to_string());
120
- self.clone()
117
+ fn push_running<'py>(mut slf: PyRefMut<'py, Self>) -> PyRefMut<'py, Self> {
118
+ slf.segments.push(TaskStatus::Running.to_string());
119
+ slf
121
120
  }
122
121
 
123
- fn push_finished(&mut self) -> Self {
124
- self.segments.push(TaskStatus::Finished.to_string());
125
- self.clone()
122
+ fn push_finished<'py>(mut slf: PyRefMut<'py, Self>) -> PyRefMut<'py, Self> {
123
+ slf.segments.push(TaskStatus::Finished.to_string());
124
+ slf
126
125
  }
127
126
 
128
- fn push_failed(&mut self) -> Self {
129
- self.segments.push(TaskStatus::Failed.to_string());
130
- self.clone()
127
+ fn push_failed<'py>(mut slf: PyRefMut<'py, Self>) -> PyRefMut<'py, Self> {
128
+ slf.segments.push(TaskStatus::Failed.to_string());
129
+ slf
131
130
  }
132
131
 
133
- fn push_cancelled(&mut self) -> Self {
134
- self.segments.push(TaskStatus::Cancelled.to_string());
135
- self.clone()
132
+ fn push_cancelled<'py>(mut slf: PyRefMut<'py, Self>) -> PyRefMut<'py, Self> {
133
+ slf.segments.push(TaskStatus::Cancelled.to_string());
134
+ slf
136
135
  }
137
136
 
138
137
  fn pop(&mut self) -> Option<String> {
139
138
  self.segments.pop()
140
139
  }
141
140
 
142
- fn clear(&mut self) {
143
- self.segments.clear();
141
+ fn clear(mut slf: PyRefMut<Self>) -> PyRefMut<Self> {
142
+ slf.segments.clear();
143
+ slf
144
144
  }
145
145
 
146
- fn concat(&mut self, event: &Bound<'_, PyAny>) -> PyResult<Self> {
146
+
147
+ fn concat<'py>(mut slf: PyRefMut<'py, Self>, event: &Bound<'_, PyAny>) -> PyResult<PyRefMut<'py, Self>> {
147
148
  let other = Self::instantiate_from(event)?;
148
- self.segments.extend(other.segments);
149
- Ok(self.clone())
149
+ slf.segments.extend(other.segments);
150
+ Ok(slf)
150
151
  }
151
152
 
152
153
 
Binary file
@@ -239,7 +239,7 @@ wheels = [
239
239
 
240
240
  [[package]]
241
241
  name = "fabricatio"
242
- version = "0.3.13"
242
+ version = "0.3.14.dev0"
243
243
  source = { editable = "." }
244
244
  dependencies = [
245
245
  { name = "asyncio" },
@@ -629,7 +629,7 @@ wheels = [
629
629
 
630
630
  [[package]]
631
631
  name = "litellm"
632
- version = "1.67.5"
632
+ version = "1.67.6"
633
633
  source = { registry = "https://mirrors.bfsu.edu.cn/pypi/web/simple" }
634
634
  dependencies = [
635
635
  { name = "aiohttp" },
@@ -644,9 +644,9 @@ dependencies = [
644
644
  { name = "tiktoken" },
645
645
  { name = "tokenizers" },
646
646
  ]
647
- sdist = { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/61/a4/c111de4d64b0201ed43576ebcd9114aa7473c6d9e05bb8d97c93fcf64570/litellm-1.67.5.tar.gz", hash = "sha256:a9c73feed05aba33b3f2879658f57bb3480b43404ae693ebc827f1c157affde5", size = 7276940, upload-time = "2025-04-30T04:27:28.364Z" }
647
+ sdist = { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/ab/26/a07aa0c7a622e89b34dd26ae4c17fda398e1664fefa71379015656744546/litellm-1.67.6.tar.gz", hash = "sha256:8cd23db10463a02bb5a64fb69b243d97879ecf4075fe38740f8c4b93f3f770a6", size = 7308919, upload-time = "2025-05-02T19:26:07.058Z" }
648
648
  wheels = [
649
- { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/99/dc/e4db6b72347446893cab8599b0a043b8883e3380ce5d86a17d4e71aaffbd/litellm-1.67.5-py3-none-any.whl", hash = "sha256:bd3329731a36200539293521d312adf4f05fc4a6312a84baff2ce5a8b1507a43", size = 7639326, upload-time = "2025-04-30T04:27:25.741Z" },
649
+ { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/d5/bf/27fe677b5c6631d40d14620983e521239e7e1360cb7c8ab4111f35971f56/litellm-1.67.6-py3-none-any.whl", hash = "sha256:3c3fb31e9e6e51d8d0eb2da4df1538a3924c2d8e1201775358678f79b1625966", size = 7677070, upload-time = "2025-05-02T19:26:04.005Z" },
650
650
  ]
651
651
 
652
652
  [[package]]
@@ -891,7 +891,7 @@ wheels = [
891
891
 
892
892
  [[package]]
893
893
  name = "openai"
894
- version = "1.76.2"
894
+ version = "1.75.0"
895
895
  source = { registry = "https://mirrors.bfsu.edu.cn/pypi/web/simple" }
896
896
  dependencies = [
897
897
  { name = "anyio" },
@@ -903,9 +903,9 @@ dependencies = [
903
903
  { name = "tqdm" },
904
904
  { name = "typing-extensions" },
905
905
  ]
906
- sdist = { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/d5/48/e767710b07acc1fca1f6b8cacd743102c71b8fdeca603876de0749ec00f1/openai-1.76.2.tar.gz", hash = "sha256:f430c8b848775907405c6eff54621254c96f6444c593c097e0cc3a9f8fdda96f", size = 434922, upload-time = "2025-04-29T20:02:56.294Z" }
906
+ sdist = { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/99/b1/318f5d4c482f19c5fcbcde190801bfaaaec23413cda0b88a29f6897448ff/openai-1.75.0.tar.gz", hash = "sha256:fb3ea907efbdb1bcfd0c44507ad9c961afd7dce3147292b54505ecfd17be8fd1", size = 429492, upload-time = "2025-04-16T16:49:29.25Z" }
907
907
  wheels = [
908
- { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/00/5f/aecb820917e93ca9fcac408e998dc22ee0561c308ed58dc8f328e3f7ef14/openai-1.76.2-py3-none-any.whl", hash = "sha256:9c1d9ad59e6e3bea7205eedc9ca66eeebae18d47b527e505a2b0d2fb1538e26e", size = 661253, upload-time = "2025-04-29T20:02:54.362Z" },
908
+ { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/80/9a/f34f163294345f123673ed03e77c33dee2534f3ac1f9d18120384457304d/openai-1.75.0-py3-none-any.whl", hash = "sha256:fe6f932d2ded3b429ff67cc9ad118c71327db32eb9d32dd723de3acfca337125", size = 646972, upload-time = "2025-04-16T16:49:27.196Z" },
909
909
  ]
910
910
 
911
911
  [[package]]
@@ -1404,11 +1404,11 @@ wheels = [
1404
1404
 
1405
1405
  [[package]]
1406
1406
  name = "setuptools"
1407
- version = "80.1.0"
1407
+ version = "80.2.0"
1408
1408
  source = { registry = "https://mirrors.bfsu.edu.cn/pypi/web/simple" }
1409
- sdist = { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/aa/b2/bd26ed086b842b68c8fe9aac380ad7e5118cf84fa7abd45bb059a88368a8/setuptools-80.1.0.tar.gz", hash = "sha256:2e308396e1d83de287ada2c2fd6e64286008fe6aca5008e0b6a8cb0e2c86eedd", size = 1354038, upload-time = "2025-04-30T17:41:06.171Z" }
1409
+ sdist = { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/24/65/19a02e93da9d9f118ecb311419a353ae68a8e236c057bf164c866daa227f/setuptools-80.2.0.tar.gz", hash = "sha256:16a390b41627e1455567193435e7cafa9101803ffaa2fdd9ecd0af098301981d", size = 1354232, upload-time = "2025-05-03T02:58:17.474Z" }
1410
1410
  wheels = [
1411
- { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/8b/f6/126c9309c8fe93e5d6bb850593cd58d591daf2da45cc78b61e48d8d95879/setuptools-80.1.0-py3-none-any.whl", hash = "sha256:ea0e7655c05b74819f82e76e11a85b31779fee7c4969e82f72bab0664e8317e4", size = 1240689, upload-time = "2025-04-30T17:41:03.789Z" },
1411
+ { url = "https://mirrors.bfsu.edu.cn/pypi/web/packages/51/95/522fb99f76ecf2efe0a372ee02665a3cda1e5653b37514fd05c98f05a9cf/setuptools-80.2.0-py3-none-any.whl", hash = "sha256:5f982284ad5d644764e1985baca205e235651b55f9a7ea8d46878d37104aa5e5", size = 1240763, upload-time = "2025-05-03T02:58:14.874Z" },
1412
1412
  ]
1413
1413
 
1414
1414
  [[package]]
Binary file
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes