lionagi 0.17.5__tar.gz → 0.17.6__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 (324) hide show
  1. {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/benchmarks.yml +1 -1
  2. {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/ci.yml +2 -2
  3. {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/docs-deploy.yml +1 -1
  4. {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/refresh-bench-baselines.yml +1 -1
  5. {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/release.yml +2 -2
  6. {lionagi-0.17.5 → lionagi-0.17.6}/.gitignore +2 -0
  7. {lionagi-0.17.5 → lionagi-0.17.6}/PKG-INFO +2 -2
  8. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/config.py +26 -0
  9. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/action.py +5 -3
  10. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/file/chunk.py +3 -14
  11. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/file/process.py +10 -92
  12. lionagi-0.17.6/lionagi/libs/schema/breakdown_pydantic_annotation.py +45 -0
  13. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_async_call.py +6 -6
  14. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_fuzzy_match.py +3 -6
  15. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_fuzzy_validate.py +3 -4
  16. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_string_similarity.py +11 -5
  17. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_to_dict.py +19 -19
  18. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/types.py +15 -0
  19. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/operate/operate.py +7 -11
  20. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/parse/parse.py +5 -3
  21. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/element.py +3 -6
  22. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/event.py +1 -1
  23. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/package.py +2 -2
  24. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/instruction.py +9 -1
  25. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/operatives/operative.py +4 -3
  26. lionagi-0.17.6/lionagi/service/broadcaster.py +61 -0
  27. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/api_calling.py +21 -140
  28. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/__init__.py +2 -10
  29. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/_types.py +1 -0
  30. lionagi-0.17.6/lionagi/service/hooks/hooked_event.py +142 -0
  31. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/imodel.py +2 -2
  32. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/session/branch.py +46 -169
  33. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/session/session.py +1 -44
  34. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/file/reader.py +6 -4
  35. lionagi-0.17.6/lionagi/utils.py +247 -0
  36. lionagi-0.17.6/lionagi/version.py +1 -0
  37. {lionagi-0.17.5 → lionagi-0.17.6}/pyproject.toml +2 -2
  38. {lionagi-0.17.5 → lionagi-0.17.6}/uv.lock +13 -10
  39. lionagi-0.17.5/lionagi/libs/file/_utils.py +0 -10
  40. lionagi-0.17.5/lionagi/libs/file/concat.py +0 -121
  41. lionagi-0.17.5/lionagi/libs/file/concat_files.py +0 -85
  42. lionagi-0.17.5/lionagi/libs/file/file_ops.py +0 -118
  43. lionagi-0.17.5/lionagi/libs/file/save.py +0 -103
  44. lionagi-0.17.5/lionagi/ln/concurrency/throttle.py +0 -83
  45. lionagi-0.17.5/lionagi/settings.py +0 -71
  46. lionagi-0.17.5/lionagi/utils.py +0 -578
  47. lionagi-0.17.5/lionagi/version.py +0 -1
  48. {lionagi-0.17.5 → lionagi-0.17.6}/.coveragerc +0 -0
  49. {lionagi-0.17.5 → lionagi-0.17.6}/.env.example +0 -0
  50. {lionagi-0.17.5 → lionagi-0.17.6}/.github/FUNDING.yml +0 -0
  51. {lionagi-0.17.5 → lionagi-0.17.6}/.github/dependabot.yml +0 -0
  52. {lionagi-0.17.5 → lionagi-0.17.6}/.github/workflows/codeql.yml +0 -0
  53. {lionagi-0.17.5 → lionagi-0.17.6}/.pre-commit-config.yaml +0 -0
  54. {lionagi-0.17.5 → lionagi-0.17.6}/.python-version +0 -0
  55. {lionagi-0.17.5 → lionagi-0.17.6}/CODE_OF_CONDUCT.md +0 -0
  56. {lionagi-0.17.5 → lionagi-0.17.6}/CONTRIBUTING.md +0 -0
  57. {lionagi-0.17.5 → lionagi-0.17.6}/LICENSE +0 -0
  58. {lionagi-0.17.5 → lionagi-0.17.6}/README.md +0 -0
  59. {lionagi-0.17.5 → lionagi-0.17.6}/assets/operation_builder.gif +0 -0
  60. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/README.md +0 -0
  61. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/.gitkeep +0 -0
  62. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/concurrency-asyncio.json +0 -0
  63. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/concurrency-trio.json +0 -0
  64. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/fuzzy.json +0 -0
  65. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/ln-asyncio.json +0 -0
  66. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/baselines/ln-trio.json +0 -0
  67. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/ci_compare.py +0 -0
  68. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/concurrency_bench.py +0 -0
  69. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/fuzzy_bench.py +0 -0
  70. {lionagi-0.17.5 → lionagi-0.17.6}/benchmarks/ln_bench.py +0 -0
  71. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/001_branch_converse.ipynb +0 -0
  72. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/002_branch_interact.ipynb +0 -0
  73. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/003_branch_info.ipynb +0 -0
  74. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/004_conversation_patterns.ipynb +0 -0
  75. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/005_react_basics.ipynb +0 -0
  76. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
  77. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/007_fan_out_in.py +0 -0
  78. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/data/002_comedian.json +0 -0
  79. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/data/002_critic.json +0 -0
  80. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/data/006_lion_proof_ch2.md +0 -0
  81. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_claude_code/claude_proxy/README.md +0 -0
  82. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_claude_code/claude_proxy/claude_code_proxy.py +0 -0
  83. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_claude_code/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
  84. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_claude_code/using_claude_code.py +0 -0
  85. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/.mcp.json +0 -0
  86. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/README.md +0 -0
  87. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/react_mcp_with_schema.py +0 -0
  88. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/search_group.py +0 -0
  89. {lionagi-0.17.5 → lionagi-0.17.6}/cookbooks/using_mcp/search_group_config.json +0 -0
  90. {lionagi-0.17.5 → lionagi-0.17.6}/docs/DOCUMENTATION_STANDARDS.md +0 -0
  91. {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/custom-operations.md +0 -0
  92. {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/error-handling.md +0 -0
  93. {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/flow-composition.md +0 -0
  94. {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/index.md +0 -0
  95. {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/observability.md +0 -0
  96. {lionagi-0.17.5 → lionagi-0.17.6}/docs/advanced/performance.md +0 -0
  97. {lionagi-0.17.5 → lionagi-0.17.6}/docs/code-of-conduct.md +0 -0
  98. {lionagi-0.17.5 → lionagi-0.17.6}/docs/comparisons/langgraph.md +0 -0
  99. {lionagi-0.17.5 → lionagi-0.17.6}/docs/contributing.md +0 -0
  100. {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/brainstorming.md +0 -0
  101. {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/claim-extraction.md +0 -0
  102. {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/code-review-crew.md +0 -0
  103. {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/data-persistence.md +0 -0
  104. {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/hr-automation.md +0 -0
  105. {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/index.md +0 -0
  106. {lionagi-0.17.5 → lionagi-0.17.6}/docs/cookbook/research-synthesis.md +0 -0
  107. {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/index.md +0 -0
  108. {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/lionagi-philosophy.md +0 -0
  109. {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/messages-and-memory.md +0 -0
  110. {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/models-and-providers.md +0 -0
  111. {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/operations.md +0 -0
  112. {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/sessions-and-branches.md +0 -0
  113. {lionagi-0.17.5 → lionagi-0.17.6}/docs/core-concepts/tools-and-functions.md +0 -0
  114. {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/claude-code-usage.md +0 -0
  115. {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/index.md +0 -0
  116. {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/orchestration-guide.md +0 -0
  117. {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/pattern-selection.md +0 -0
  118. {lionagi-0.17.5 → lionagi-0.17.6}/docs/for-ai-agents/self-improvement.md +0 -0
  119. {lionagi-0.17.5 → lionagi-0.17.6}/docs/includes/abbreviations.md +0 -0
  120. {lionagi-0.17.5 → lionagi-0.17.6}/docs/index.md +0 -0
  121. {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/databases.md +0 -0
  122. {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/dspy-optimization.md +0 -0
  123. {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/index.md +0 -0
  124. {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/llamaindex-rag.md +0 -0
  125. {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/llm-providers.md +0 -0
  126. {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/mcp-servers.md +0 -0
  127. {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/tools.md +0 -0
  128. {lionagi-0.17.5 → lionagi-0.17.6}/docs/integrations/vector-stores.md +0 -0
  129. {lionagi-0.17.5 → lionagi-0.17.6}/docs/marketing/language-interoperability-manifesto.md +0 -0
  130. {lionagi-0.17.5 → lionagi-0.17.6}/docs/migration/from-autogen.md +0 -0
  131. {lionagi-0.17.5 → lionagi-0.17.6}/docs/migration/from-crewai.md +0 -0
  132. {lionagi-0.17.5 → lionagi-0.17.6}/docs/migration/from-langchain.md +0 -0
  133. {lionagi-0.17.5 → lionagi-0.17.6}/docs/migration/index.md +0 -0
  134. {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/conditional-flows.md +0 -0
  135. {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/fan-out-in.md +0 -0
  136. {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/index.md +0 -0
  137. {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/react-with-rag.md +0 -0
  138. {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/sequential-analysis.md +0 -0
  139. {lionagi-0.17.5 → lionagi-0.17.6}/docs/patterns/tournament-validation.md +0 -0
  140. {lionagi-0.17.5 → lionagi-0.17.6}/docs/problem-statement.md +0 -0
  141. {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/claude-code-integration.md +0 -0
  142. {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/index.md +0 -0
  143. {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/installation.md +0 -0
  144. {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/orchestration-first.md +0 -0
  145. {lionagi-0.17.5 → lionagi-0.17.6}/docs/quickstart/your-first-flow.md +0 -0
  146. {lionagi-0.17.5 → lionagi-0.17.6}/docs/reference/api/index.md +0 -0
  147. {lionagi-0.17.5 → lionagi-0.17.6}/docs/reference/changelog.md +0 -0
  148. {lionagi-0.17.5 → lionagi-0.17.6}/docs/reference/troubleshooting.md +0 -0
  149. {lionagi-0.17.5 → lionagi-0.17.6}/docs/stylesheets/extra.css +0 -0
  150. {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/branches-as-agents.md +0 -0
  151. {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/builder-pattern.md +0 -0
  152. {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/graphs-over-chains.md +0 -0
  153. {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/index.md +0 -0
  154. {lionagi-0.17.5 → lionagi-0.17.6}/docs/thinking-in-lionagi/why-lionagi.md +0 -0
  155. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/__init__.py +0 -0
  156. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/_class_registry.py +0 -0
  157. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/_errors.py +0 -0
  158. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/_types.py +0 -0
  159. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/adapters/__init__.py +0 -0
  160. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/adapters/_utils.py +0 -0
  161. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/adapters/async_postgres_adapter.py +0 -0
  162. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/__init__.py +0 -0
  163. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/base.py +0 -0
  164. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/code.py +0 -0
  165. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/file.py +0 -0
  166. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/instruct.py +0 -0
  167. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/reason.py +0 -0
  168. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/fields/research.py +0 -0
  169. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/__init__.py +0 -0
  170. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/file/__init__.py +0 -0
  171. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/__init__.py +0 -0
  172. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/as_readable.py +0 -0
  173. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/extract_code_block.py +0 -0
  174. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/extract_docstring.py +0 -0
  175. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/function_to_schema.py +0 -0
  176. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
  177. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/validate/__init__.py +0 -0
  178. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/validate/common_field_validators.py +0 -0
  179. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/validate/to_num.py +0 -0
  180. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/libs/validate/validate_boolean.py +0 -0
  181. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/__init__.py +0 -0
  182. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_hash.py +0 -0
  183. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_json_dump.py +0 -0
  184. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_list_call.py +0 -0
  185. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_to_list.py +0 -0
  186. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/_utils.py +0 -0
  187. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/__init__.py +0 -0
  188. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/_compat.py +0 -0
  189. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/cancel.py +0 -0
  190. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/errors.py +0 -0
  191. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/patterns.py +0 -0
  192. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/primitives.py +0 -0
  193. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/resource_tracker.py +0 -0
  194. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/task.py +0 -0
  195. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/concurrency/utils.py +0 -0
  196. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/__init__.py +0 -0
  197. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_extract_json.py +0 -0
  198. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/ln/fuzzy/_fuzzy_json.py +0 -0
  199. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/__init__.py +0 -0
  200. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/field_model.py +0 -0
  201. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/hashable_model.py +0 -0
  202. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/model_params.py +0 -0
  203. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/operable_model.py +0 -0
  204. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/models/schema_model.py +0 -0
  205. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/ReAct/ReAct.py +0 -0
  206. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/ReAct/__init__.py +0 -0
  207. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/ReAct/utils.py +0 -0
  208. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/__init__.py +0 -0
  209. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/_act/__init__.py +0 -0
  210. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/_act/act.py +0 -0
  211. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/_visualize_graph.py +0 -0
  212. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/brainstorm/__init__.py +0 -0
  213. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/brainstorm/brainstorm.py +0 -0
  214. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/brainstorm/prompt.py +0 -0
  215. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/builder.py +0 -0
  216. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/chat/__init__.py +0 -0
  217. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/chat/chat.py +0 -0
  218. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/communicate/__init__.py +0 -0
  219. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/communicate/communicate.py +0 -0
  220. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/flow.py +0 -0
  221. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/instruct/__init__.py +0 -0
  222. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/instruct/instruct.py +0 -0
  223. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/interpret/__init__.py +0 -0
  224. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/interpret/interpret.py +0 -0
  225. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/manager.py +0 -0
  226. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/node.py +0 -0
  227. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/operate/__init__.py +0 -0
  228. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/parse/__init__.py +0 -0
  229. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/plan/__init__.py +0 -0
  230. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/plan/plan.py +0 -0
  231. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/plan/prompt.py +0 -0
  232. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/select/__init__.py +0 -0
  233. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/select/select.py +0 -0
  234. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/select/utils.py +0 -0
  235. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/types.py +0 -0
  236. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/operations/utils.py +0 -0
  237. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/__init__.py +0 -0
  238. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/_concepts.py +0 -0
  239. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/action/__init__.py +0 -0
  240. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/action/function_calling.py +0 -0
  241. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/action/manager.py +0 -0
  242. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/action/tool.py +0 -0
  243. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/contracts.py +0 -0
  244. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/__init__.py +0 -0
  245. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/base.py +0 -0
  246. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/flow.py +0 -0
  247. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/form.py +0 -0
  248. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/forms/report.py +0 -0
  249. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/__init__.py +0 -0
  250. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/log.py +0 -0
  251. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/pile.py +0 -0
  252. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/processor.py +0 -0
  253. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/generic/progression.py +0 -0
  254. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/graph/__init__.py +0 -0
  255. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/graph/edge.py +0 -0
  256. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/graph/graph.py +0 -0
  257. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/graph/node.py +0 -0
  258. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/ids.py +0 -0
  259. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/__init__.py +0 -0
  260. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/exchange.py +0 -0
  261. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/mail.py +0 -0
  262. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/mailbox.py +0 -0
  263. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/mail/manager.py +0 -0
  264. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/__init__.py +0 -0
  265. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/action_request.py +0 -0
  266. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/action_response.py +0 -0
  267. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/assistant_response.py +0 -0
  268. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/base.py +0 -0
  269. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/manager.py +0 -0
  270. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/message.py +0 -0
  271. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/system.py +0 -0
  272. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/README.md +0 -0
  273. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
  274. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
  275. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
  276. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
  277. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
  278. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
  279. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/operatives/__init__.py +0 -0
  280. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/operatives/step.py +0 -0
  281. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/protocols/types.py +0 -0
  282. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/py.typed +0 -0
  283. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/__init__.py +0 -0
  284. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/__init__.py +0 -0
  285. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/endpoint.py +0 -0
  286. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/endpoint_config.py +0 -0
  287. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/header_factory.py +0 -0
  288. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/match_endpoint.py +0 -0
  289. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/mcp/__init__.py +0 -0
  290. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/mcp/wrapper.py +0 -0
  291. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/__init__.py +0 -0
  292. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/anthropic_.py +0 -0
  293. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/claude_code_cli.py +0 -0
  294. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/exa_.py +0 -0
  295. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/nvidia_nim_.py +0 -0
  296. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/oai_.py +0 -0
  297. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/ollama_.py +0 -0
  298. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/perplexity_.py +0 -0
  299. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/connections/providers/types.py +0 -0
  300. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/_utils.py +0 -0
  301. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/hook_event.py +0 -0
  302. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/hooks/hook_registry.py +0 -0
  303. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/manager.py +0 -0
  304. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/rate_limited_processor.py +0 -0
  305. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/resilience.py +0 -0
  306. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/README.md +0 -0
  307. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/__init__.py +0 -0
  308. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/anthropic_models.py +0 -0
  309. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/claude_code.py +0 -0
  310. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/exa_models.py +0 -0
  311. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/openai_model_names.py +0 -0
  312. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/third_party/pplx_models.py +0 -0
  313. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/token_calculator.py +0 -0
  314. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/service/types.py +0 -0
  315. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/session/__init__.py +0 -0
  316. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/session/prompts.py +0 -0
  317. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/__init__.py +0 -0
  318. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/base.py +0 -0
  319. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/file/__init__.py +0 -0
  320. {lionagi-0.17.5 → lionagi-0.17.6}/lionagi/tools/types.py +0 -0
  321. {lionagi-0.17.5 → lionagi-0.17.6}/main.py +0 -0
  322. {lionagi-0.17.5 → lionagi-0.17.6}/mkdocs.yml +0 -0
  323. {lionagi-0.17.5 → lionagi-0.17.6}/scripts/README.md +0 -0
  324. {lionagi-0.17.5 → lionagi-0.17.6}/scripts/update_openai_models.py +0 -0
@@ -22,7 +22,7 @@ jobs:
22
22
  uses: actions/checkout@v4
23
23
 
24
24
  - name: Setup Python ${{ matrix.python-version }}
25
- uses: actions/setup-python@v5
25
+ uses: actions/setup-python@v6
26
26
  with:
27
27
  python-version: ${{ matrix.python-version }}
28
28
 
@@ -18,7 +18,7 @@ jobs:
18
18
  steps:
19
19
  - uses: actions/checkout@v5
20
20
  - name: Set up Python ${{ matrix.python-version }}
21
- uses: actions/setup-python@v5
21
+ uses: actions/setup-python@v6
22
22
  with:
23
23
  python-version: ${{ matrix.python-version }}
24
24
 
@@ -59,7 +59,7 @@ jobs:
59
59
  steps:
60
60
  - uses: actions/checkout@v5
61
61
  - name: Set up Python
62
- uses: actions/setup-python@v5
62
+ uses: actions/setup-python@v6
63
63
  with:
64
64
  python-version: "3.12"
65
65
 
@@ -18,7 +18,7 @@ jobs:
18
18
  fetch-depth: 0
19
19
 
20
20
  - name: Set up Python
21
- uses: actions/setup-python@v5
21
+ uses: actions/setup-python@v6
22
22
  with:
23
23
  python-version: "3.10"
24
24
  cache: "pip"
@@ -16,7 +16,7 @@ jobs:
16
16
  uses: actions/checkout@v4
17
17
 
18
18
  - name: Setup Python 3.12
19
- uses: actions/setup-python@v5
19
+ uses: actions/setup-python@v6
20
20
  with:
21
21
  python-version: '3.12'
22
22
 
@@ -16,7 +16,7 @@ jobs:
16
16
  steps:
17
17
  - uses: actions/checkout@v5
18
18
  - name: Set up Python ${{ matrix.python-version }}
19
- uses: actions/setup-python@v5
19
+ uses: actions/setup-python@v6
20
20
  with:
21
21
  python-version: ${{ matrix.python-version }}
22
22
 
@@ -41,7 +41,7 @@ jobs:
41
41
  steps:
42
42
  - uses: actions/checkout@v5
43
43
  - name: Set up Python
44
- uses: actions/setup-python@v5
44
+ uses: actions/setup-python@v6
45
45
  with:
46
46
  python-version: "3.12"
47
47
 
@@ -174,3 +174,5 @@ cython_debug/
174
174
  .khive/
175
175
  .roo/
176
176
  *logs/
177
+
178
+ performance_results.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.17.5
3
+ Version: 0.17.6
4
4
  Summary: An Intelligence Operating System.
5
5
  Author-email: HaiyangLi <quantocean.li@gmail.com>
6
6
  License: Apache License
@@ -228,7 +228,7 @@ Requires-Dist: json-repair>=0.40.0
228
228
  Requires-Dist: msgspec>=0.18.0
229
229
  Requires-Dist: pydantic-settings>=2.8.0
230
230
  Requires-Dist: pydantic>=2.8.0
231
- Requires-Dist: pydapter>=1.1.1
231
+ Requires-Dist: pydapter[pandas]>=1.1.1
232
232
  Requires-Dist: python-dotenv>=1.1.0
233
233
  Requires-Dist: tiktoken>=0.9.0
234
234
  Provides-Extra: all
@@ -83,6 +83,17 @@ class AppSettings(BaseSettings, frozen=True):
83
83
  LIONAGI_QDRANT_URL: str = "http://localhost:6333"
84
84
  LIONAGI_DEFAULT_QDRANT_COLLECTION: str = "event_logs"
85
85
 
86
+ # Log configuration
87
+ LOG_PERSIST_DIR: str = "./data/logs"
88
+ LOG_SUBFOLDER: str | None = None
89
+ LOG_CAPACITY: int = 50
90
+ LOG_EXTENSION: str = ".json"
91
+ LOG_USE_TIMESTAMP: bool = True
92
+ LOG_HASH_DIGITS: int = 5
93
+ LOG_FILE_PREFIX: str = "log"
94
+ LOG_AUTO_SAVE_ON_EXIT: bool = True
95
+ LOG_CLEAR_AFTER_DUMP: bool = True
96
+
86
97
  # Class variable to store the singleton instance
87
98
  _instance: ClassVar[Any] = None
88
99
 
@@ -119,6 +130,21 @@ class AppSettings(BaseSettings, frozen=True):
119
130
 
120
131
  return str(secret)
121
132
 
133
+ @property
134
+ def LOG_CONFIG(self) -> dict[str, Any]:
135
+ """Get LOG configuration dict compatible with old Settings.Config.LOG format."""
136
+ return {
137
+ "persist_dir": self.LOG_PERSIST_DIR,
138
+ "subfolder": self.LOG_SUBFOLDER,
139
+ "capacity": self.LOG_CAPACITY,
140
+ "extension": self.LOG_EXTENSION,
141
+ "use_timestamp": self.LOG_USE_TIMESTAMP,
142
+ "hash_digits": self.LOG_HASH_DIGITS,
143
+ "file_prefix": self.LOG_FILE_PREFIX,
144
+ "auto_save_on_exit": self.LOG_AUTO_SAVE_ON_EXIT,
145
+ "clear_after_dump": self.LOG_CLEAR_AFTER_DUMP,
146
+ }
147
+
122
148
 
123
149
  # Create a singleton instance
124
150
  settings = AppSettings()
@@ -11,8 +11,8 @@ from lionagi.libs.validate.common_field_validators import (
11
11
  validate_boolean_field,
12
12
  validate_nullable_string_field,
13
13
  )
14
+ from lionagi.ln import extract_json, to_dict, to_list
14
15
  from lionagi.models import FieldModel, HashableModel
15
- from lionagi.utils import to_dict, to_json, to_list
16
16
 
17
17
  __all__ = (
18
18
  "ActionRequestModel",
@@ -27,11 +27,13 @@ def parse_action_request(content: str | dict) -> list[dict]:
27
27
  json_blocks = [content.model_dump()]
28
28
 
29
29
  elif isinstance(content, str):
30
- json_blocks = to_json(content, fuzzy_parse=True)
30
+ json_blocks = extract_json(content, fuzzy_parse=True)
31
31
  if not json_blocks:
32
32
  pattern2 = r"```python\s*(.*?)\s*```"
33
33
  _d = re.findall(pattern2, content, re.DOTALL)
34
- json_blocks = [to_json(match, fuzzy_parse=True) for match in _d]
34
+ json_blocks = [
35
+ extract_json(match, fuzzy_parse=True) for match in _d
36
+ ]
35
37
  json_blocks = to_list(json_blocks, dropna=True)
36
38
 
37
39
  print(json_blocks)
@@ -28,12 +28,6 @@ def chunk_by_chars(
28
28
 
29
29
  Raises:
30
30
  ValueError: If an error occurs during the chunking process.
31
-
32
- Examples:
33
- >>> text = "This is a sample text for chunking."
34
- >>> chunks = chunk_by_chars(text, chunk_size=10, overlap=0.2)
35
- >>> print(chunks)
36
- ['This is a ', 'a sample ', 'le text fo', 'for chunki', 'king.']
37
31
  """
38
32
  try:
39
33
  n_chunks = math.ceil(len(text) / chunk_size)
@@ -112,12 +106,6 @@ def chunk_by_tokens(
112
106
 
113
107
  Raises:
114
108
  ValueError: If an error occurs during the chunking process.
115
-
116
- Examples:
117
- >>> tokens = ["This", "is", "a", "sample", "text", "for", "chunking."]
118
- >>> chunks = chunk_by_tokens(tokens, chunk_size=3, overlap=0.2)
119
- >>> print(chunks)
120
- ['This is a', 'a sample text', 'text for chunking.']
121
109
  """
122
110
  try:
123
111
  n_chunks = math.ceil(len(tokens) / chunk_size)
@@ -166,7 +154,9 @@ def _chunk_token_two_parts(
166
154
  ) -> list[str | list[str]]:
167
155
  """Handle chunking for two parts."""
168
156
  chunks = [tokens[: chunk_size + overlap_size]]
169
- if residue > threshold:
157
+ # When residue == 0, we have perfect division, create the second chunk
158
+ # When residue > threshold, the leftover is big enough for a second chunk
159
+ if residue == 0 or residue > threshold:
170
160
  chunks.append(tokens[chunk_size - overlap_size :])
171
161
  else:
172
162
  return _process_single_chunk(tokens, return_tokens)
@@ -237,7 +227,6 @@ def chunk_content(
237
227
  metadata (Dict[str, Any]): Metadata to be included with each chunk.
238
228
  kwargs for tokenizer, if needed.
239
229
 
240
-
241
230
  Returns:
242
231
  List[Dict[str, Any]]: A list of dictionaries, each representing a chunk with metadata.
243
232
  """
@@ -9,12 +9,9 @@ from pathlib import Path
9
9
  from typing import Any, Literal
10
10
 
11
11
  from lionagi import ln
12
+ from lionagi.utils import is_import_installed
12
13
 
13
- from ._utils import check_docling_available
14
14
  from .chunk import chunk_content
15
- from .save import save_chunks
16
-
17
- _HAS_DOCLING = check_docling_available()
18
15
 
19
16
 
20
17
  def dir_to_files(
@@ -90,82 +87,6 @@ def dir_to_files(
90
87
  raise ValueError(f"Error processing directory {directory}: {e}") from e
91
88
 
92
89
 
93
- def file_to_chunks(
94
- file_path: str | Path,
95
- chunk_by: Literal["chars", "tokens"] = "chars",
96
- chunk_size: int = 1500,
97
- overlap: float = 0.1,
98
- threshold: int = 200,
99
- encoding: str = "utf-8",
100
- custom_metadata: dict[str, Any] | None = None,
101
- output_dir: str | Path | None = None,
102
- verbose: bool = False,
103
- timestamp: bool = True,
104
- random_hash_digits: int = 4,
105
- as_node: bool = False,
106
- ) -> list[dict[str, Any]]:
107
- """
108
- Process a file and split its content into chunks.
109
-
110
- This function reads a file, splits its content into chunks using the provided
111
- chunking function, and optionally saves the chunks to separate files.
112
-
113
- Args:
114
- file_path (Union[str, Path]): Path to the file to be processed.
115
- chunk_func (Callable): Function to use for chunking the content.
116
- chunk_size (int): The target size for each chunk.
117
- overlap (float): The fraction of overlap between chunks.
118
- threshold (int): The minimum size for the last chunk.
119
- encoding (str): File encoding to use when reading the file.
120
- custom_metadata (Optional[Dict[str, Any]]): Additional metadata to include with each chunk.
121
- output_dir (Optional[Union[str, Path]]): Directory to save output chunks (if provided).
122
- verbose (bool): If True, print verbose output.
123
- timestamp (bool): If True, include timestamp in output filenames.
124
- random_hash_digits (int): Number of random hash digits to include in output filenames.
125
-
126
- Returns:
127
- List[Dict[str, Any]]: A list of dictionaries, each representing a chunk with metadata.
128
-
129
- Raises:
130
- ValueError: If there's an error processing the file.
131
- """
132
- try:
133
- if isinstance(file_path, str):
134
- file_path = Path(file_path)
135
-
136
- text = file_path.read_text(encoding=encoding)
137
-
138
- metadata = {
139
- "file_path": str(file_path),
140
- "file_name": file_path.name,
141
- "file_size": file_path.stat().st_size,
142
- **(custom_metadata or {}),
143
- }
144
-
145
- chunks = chunk_content(
146
- text,
147
- chunk_by=chunk_by,
148
- chunk_size=chunk_size,
149
- overlap=overlap,
150
- threshold=threshold,
151
- metadata=metadata,
152
- as_node=as_node,
153
- )
154
-
155
- if output_dir:
156
- save_chunks(
157
- chunks=chunks,
158
- output_dir=output_dir,
159
- verbose=verbose,
160
- timestamp=timestamp,
161
- random_hash_digits=random_hash_digits,
162
- )
163
-
164
- return chunks
165
- except Exception as e:
166
- raise ValueError(f"Error processing file {file_path}: {e}") from e
167
-
168
-
169
90
  def chunk(
170
91
  *,
171
92
  text: str | None = None,
@@ -209,12 +130,12 @@ def chunk(
209
130
  reader_tool = lambda x: Path(x).read_text(encoding="utf-8")
210
131
 
211
132
  if reader_tool == "docling":
212
- if _HAS_DOCLING is not True:
213
- raise _HAS_DOCLING
214
-
215
- from docling.document_converter import ( # noqa: F401
216
- DocumentConverter,
217
- )
133
+ if not is_import_installed("docling"):
134
+ raise ImportError(
135
+ "The 'docling' package is required for this feature. "
136
+ "Please install it via 'pip install lionagi[reader]'."
137
+ )
138
+ from docling.document_converter import DocumentConverter
218
139
 
219
140
  converter = DocumentConverter()
220
141
  reader_tool = lambda x: converter.convert(
@@ -235,7 +156,7 @@ def chunk(
235
156
  threshold=threshold,
236
157
  metadata=metadata,
237
158
  as_node=True,
238
- flatten=True,
159
+ output_flatten=True,
239
160
  tokenizer=tokenizer or str.split,
240
161
  )
241
162
  if threshold:
@@ -248,15 +169,12 @@ def chunk(
248
169
  if output_file.suffix == ".csv":
249
170
  p = Pile(chunks)
250
171
  p.dump(output_file, "csv")
251
-
252
- if output_file.suffix == "json":
172
+ elif output_file.suffix == ".json":
253
173
  p = Pile(chunks)
254
174
  p.dump(output_file, "json")
255
-
256
- if output_file.suffix == ".parquet":
175
+ elif output_file.suffix == ".parquet":
257
176
  p = Pile(chunks)
258
177
  p.dump(output_file, "parquet")
259
-
260
178
  else:
261
179
  raise ValueError(f"Unsupported output file format: {output_file}")
262
180
 
@@ -0,0 +1,45 @@
1
+ from inspect import isclass
2
+ from typing import Any, get_args, get_origin
3
+
4
+ from pydantic import BaseModel
5
+
6
+
7
+ def breakdown_pydantic_annotation(
8
+ model: type[BaseModel],
9
+ max_depth: int | None = None,
10
+ current_depth: int = 0,
11
+ ) -> dict[str, Any]:
12
+ if not _is_pydantic_model(model):
13
+ raise TypeError("Input must be a Pydantic model")
14
+
15
+ if max_depth is not None and current_depth >= max_depth:
16
+ raise RecursionError("Maximum recursion depth reached")
17
+
18
+ out: dict[str, Any] = {}
19
+ for k, v in model.__annotations__.items():
20
+ origin = get_origin(v)
21
+ if _is_pydantic_model(v):
22
+ out[k] = breakdown_pydantic_annotation(
23
+ v, max_depth, current_depth + 1
24
+ )
25
+ elif origin is list:
26
+ args = get_args(v)
27
+ if args and _is_pydantic_model(args[0]):
28
+ out[k] = [
29
+ breakdown_pydantic_annotation(
30
+ args[0], max_depth, current_depth + 1
31
+ )
32
+ ]
33
+ else:
34
+ out[k] = [args[0] if args else Any]
35
+ else:
36
+ out[k] = v
37
+
38
+ return out
39
+
40
+
41
+ def _is_pydantic_model(x: Any) -> bool:
42
+ try:
43
+ return isclass(x) and issubclass(x, BaseModel)
44
+ except TypeError:
45
+ return False
@@ -43,7 +43,7 @@ async def alcall(
43
43
  output_unique: bool = False,
44
44
  output_flatten_tuple_set: bool = False,
45
45
  delay_before_start: float = 0,
46
- retry_initial_deplay: float = 0,
46
+ retry_initial_delay: float = 0,
47
47
  retry_backoff: float = 1,
48
48
  retry_default: Any = Unset,
49
49
  retry_timeout: float = None,
@@ -143,7 +143,7 @@ async def alcall(
143
143
 
144
144
  async def execute_task(i: Any, index: int) -> Any:
145
145
  attempts = 0
146
- current_delay = retry_initial_deplay
146
+ current_delay = retry_initial_delay
147
147
  while True:
148
148
  try:
149
149
  result = await call_func(i)
@@ -223,10 +223,10 @@ async def bcall(
223
223
  output_unique: bool = False,
224
224
  output_flatten_tuple_set: bool = False,
225
225
  delay_before_start: float = 0,
226
- retry_initial_deplay: float = 0,
226
+ retry_initial_delay: float = 0,
227
227
  retry_backoff: float = 1,
228
228
  retry_default: Any = Unset,
229
- retry_timeout: float = 0,
229
+ retry_timeout: float = None,
230
230
  retry_attempts: int = 0,
231
231
  max_concurrent: int | None = None,
232
232
  throttle_period: float | None = None,
@@ -248,7 +248,7 @@ async def bcall(
248
248
  output_unique=output_unique,
249
249
  output_flatten_tuple_set=output_flatten_tuple_set,
250
250
  delay_before_start=delay_before_start,
251
- retry_initial_deplay=retry_initial_deplay,
251
+ retry_initial_delay=retry_initial_delay,
252
252
  retry_backoff=retry_backoff,
253
253
  retry_default=retry_default,
254
254
  retry_timeout=retry_timeout,
@@ -279,7 +279,7 @@ class AlcallParams(Params):
279
279
 
280
280
  # retry and timeout
281
281
  delay_before_start: float
282
- retry_initial_deplay: float
282
+ retry_initial_delay: float
283
283
  retry_backoff: float
284
284
  retry_default: Any
285
285
  retry_timeout: float
@@ -1,8 +1,7 @@
1
- from collections.abc import Sequence
2
1
  from dataclasses import dataclass
3
2
  from typing import Any, ClassVar, Literal
4
3
 
5
- from ..types import KeysDict, Params, Unset
4
+ from ..types import KeysLike, Params, Unset
6
5
  from ._string_similarity import (
7
6
  SIMILARITY_ALGO_MAP,
8
7
  SIMILARITY_TYPE,
@@ -21,7 +20,7 @@ HandleUnmatched = Literal["ignore", "raise", "remove", "fill", "force"]
21
20
 
22
21
  def fuzzy_match_keys(
23
22
  d_: dict[str, Any],
24
- keys: Sequence[str] | KeysDict,
23
+ keys: KeysLike,
25
24
  /,
26
25
  *,
27
26
  similarity_algo: SIMILARITY_TYPE | SimilarityFunc = "jaro_winkler",
@@ -166,7 +165,5 @@ class FuzzyMatchKeysParams(Params):
166
165
  fill_mapping: dict[str, Any] | Any = Unset
167
166
  strict: bool = False
168
167
 
169
- def __call__(
170
- self, d_: dict[str, Any], keys: Sequence[str] | KeysDict
171
- ) -> dict[str, Any]:
168
+ def __call__(self, d_: dict[str, Any], keys: KeysLike) -> dict[str, Any]:
172
169
  return fuzzy_match_keys(d_, keys, **self.default_kw())
@@ -1,9 +1,9 @@
1
- from collections.abc import Callable, Sequence
1
+ from collections.abc import Callable
2
2
  from typing import TYPE_CHECKING, Any, Literal
3
3
 
4
4
  from lionagi._errors import ValidationError
5
5
 
6
- from ..types import KeysDict
6
+ from ..types import KeysLike
7
7
  from ._extract_json import extract_json
8
8
  from ._fuzzy_match import FuzzyMatchKeysParams, fuzzy_match_keys
9
9
  from ._string_similarity import SIMILARITY_TYPE
@@ -56,7 +56,7 @@ def fuzzy_validate_pydantic(
56
56
 
57
57
  def fuzzy_validate_mapping(
58
58
  d: Any,
59
- keys: Sequence[str] | KeysDict,
59
+ keys: KeysLike,
60
60
  /,
61
61
  *,
62
62
  similarity_algo: (
@@ -110,7 +110,6 @@ def fuzzy_validate_mapping(
110
110
  # Try converting to dictionary
111
111
  try:
112
112
  if isinstance(d, str):
113
- # First try to_json for JSON strings and code blocks
114
113
  try:
115
114
  json_result = extract_json(
116
115
  d, fuzzy_parse=True, return_one_if_single=True
@@ -2,11 +2,13 @@
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
- from collections.abc import Callable, Sequence
5
+ from collections.abc import Callable
6
6
  from dataclasses import dataclass
7
- from difflib import SequenceMatcher
8
- from itertools import product
9
- from typing import Literal
7
+ from typing import TYPE_CHECKING, Literal
8
+
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Sequence
11
+
10
12
 
11
13
  __all__ = ("string_similarity",)
12
14
 
@@ -157,6 +159,8 @@ def levenshtein_distance(a: str, b: str) -> int:
157
159
  int: Minimum number of single-character edits needed to change one
158
160
  string into the other
159
161
  """
162
+ from itertools import product
163
+
160
164
  if not a:
161
165
  return len(b)
162
166
  if not b:
@@ -213,6 +217,8 @@ def sequence_matcher_similarity(s1: str, s2: str) -> float:
213
217
  Returns:
214
218
  float: Similarity score between 0 and 1
215
219
  """
220
+ from difflib import SequenceMatcher
221
+
216
222
  return SequenceMatcher(None, s1, s2).ratio()
217
223
 
218
224
 
@@ -249,7 +255,7 @@ class MatchResult:
249
255
 
250
256
  def string_similarity(
251
257
  word: str,
252
- correct_words: Sequence[str],
258
+ correct_words: "Sequence[str]",
253
259
  algorithm: SIMILARITY_TYPE | Callable[[str, str], float] = "jaro_winkler",
254
260
  threshold: float = 0.0,
255
261
  case_sensitive: bool = False,