lionagi 0.15.9__tar.gz → 0.15.11__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 (318) hide show
  1. {lionagi-0.15.9 → lionagi-0.15.11}/PKG-INFO +2 -2
  2. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/__init__.py +4 -6
  3. lionagi-0.15.11/lionagi/adapters/async_postgres_adapter.py +98 -0
  4. lionagi-0.15.11/lionagi/libs/file/_utils.py +10 -0
  5. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/process.py +16 -13
  6. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/unstructured/pdf_to_image.py +2 -2
  7. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/__init__.py +28 -0
  8. lionagi-0.15.11/lionagi/ln/_extract_json.py +60 -0
  9. lionagi-0.15.11/lionagi/ln/_fuzzy_json.py +116 -0
  10. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/field_model.py +8 -6
  11. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/__init__.py +3 -0
  12. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/builder.py +10 -0
  13. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/element.py +22 -10
  14. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/pile.py +56 -1
  15. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/progression.py +11 -11
  16. lionagi-0.15.11/lionagi/protocols/graph/_utils.py +22 -0
  17. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/graph/graph.py +17 -21
  18. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/graph/node.py +23 -5
  19. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/manager.py +41 -45
  20. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/operatives/step.py +2 -19
  21. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/types.py +1 -2
  22. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/tools/file/reader.py +5 -6
  23. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/utils.py +8 -385
  24. lionagi-0.15.11/lionagi/version.py +1 -0
  25. {lionagi-0.15.9 → lionagi-0.15.11}/pyproject.toml +2 -2
  26. {lionagi-0.15.9 → lionagi-0.15.11}/uv.lock +5 -5
  27. lionagi-0.15.9/lionagi/adapters/async_postgres_adapter.py +0 -362
  28. lionagi-0.15.9/lionagi/libs/package/imports.py +0 -21
  29. lionagi-0.15.9/lionagi/libs/package/management.py +0 -62
  30. lionagi-0.15.9/lionagi/libs/package/params.py +0 -30
  31. lionagi-0.15.9/lionagi/libs/package/system.py +0 -22
  32. lionagi-0.15.9/lionagi/tools/file/__init__.py +0 -3
  33. lionagi-0.15.9/lionagi/version.py +0 -1
  34. {lionagi-0.15.9 → lionagi-0.15.11}/.coveragerc +0 -0
  35. {lionagi-0.15.9 → lionagi-0.15.11}/.env.example +0 -0
  36. {lionagi-0.15.9 → lionagi-0.15.11}/.github/FUNDING.yml +0 -0
  37. {lionagi-0.15.9 → lionagi-0.15.11}/.github/dependabot.yml +0 -0
  38. {lionagi-0.15.9 → lionagi-0.15.11}/.github/workflows/ci.yml +0 -0
  39. {lionagi-0.15.9 → lionagi-0.15.11}/.github/workflows/codeql.yml +0 -0
  40. {lionagi-0.15.9 → lionagi-0.15.11}/.github/workflows/release.yml +0 -0
  41. {lionagi-0.15.9 → lionagi-0.15.11}/.gitignore +0 -0
  42. {lionagi-0.15.9 → lionagi-0.15.11}/.pre-commit-config.yaml +0 -0
  43. {lionagi-0.15.9 → lionagi-0.15.11}/.python-version +0 -0
  44. {lionagi-0.15.9 → lionagi-0.15.11}/CODE_OF_CONDUCT.md +0 -0
  45. {lionagi-0.15.9 → lionagi-0.15.11}/CONTRIBUTING.md +0 -0
  46. {lionagi-0.15.9 → lionagi-0.15.11}/LICENSE +0 -0
  47. {lionagi-0.15.9 → lionagi-0.15.11}/README.md +0 -0
  48. {lionagi-0.15.9 → lionagi-0.15.11}/assets/operation_builder.gif +0 -0
  49. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/001_branch_converse.ipynb +0 -0
  50. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/002_branch_interact.ipynb +0 -0
  51. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/003_branch_info.ipynb +0 -0
  52. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/004_conversation_patterns.ipynb +0 -0
  53. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/005_react_basics.ipynb +0 -0
  54. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
  55. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/007_fan_out_in.py +0 -0
  56. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/claude_proxy/README.md +0 -0
  57. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/claude_proxy/claude_code_proxy.py +0 -0
  58. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
  59. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/data/002_comedian.json +0 -0
  60. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/data/002_critic.json +0 -0
  61. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/data/006_lion_proof_ch2.md +0 -0
  62. {lionagi-0.15.9 → lionagi-0.15.11}/cookbooks/using_claude_code.py +0 -0
  63. {lionagi-0.15.9 → lionagi-0.15.11}/docs/Makefile +0 -0
  64. {lionagi-0.15.9 → lionagi-0.15.11}/docs/_static/custom.css +0 -0
  65. {lionagi-0.15.9 → lionagi-0.15.11}/docs/_templates/layout.html +0 -0
  66. {lionagi-0.15.9 → lionagi-0.15.11}/docs/conf.py +0 -0
  67. {lionagi-0.15.9 → lionagi-0.15.11}/docs/discussions/anyio-migration.md +0 -0
  68. {lionagi-0.15.9 → lionagi-0.15.11}/docs/index.rst +0 -0
  69. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/action.rst +0 -0
  70. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/adapter.rst +0 -0
  71. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/branch.rst +0 -0
  72. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/branch_operations.rst +0 -0
  73. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/concepts.rst +0 -0
  74. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/element_id.rst +0 -0
  75. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/event.rst +0 -0
  76. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/form.rst +0 -0
  77. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/graph.rst +0 -0
  78. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/index.rst +0 -0
  79. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/instruct.rst +0 -0
  80. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_file.rst +0 -0
  81. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_nested.rst +0 -0
  82. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_package.rst +0 -0
  83. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_schema.rst +0 -0
  84. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/lib_validate.rst +0 -0
  85. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/log.rst +0 -0
  86. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/mail.rst +0 -0
  87. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/message.rst +0 -0
  88. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/models.rst +0 -0
  89. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/operative_step.rst +0 -0
  90. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/pile.rst +0 -0
  91. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/processor.rst +0 -0
  92. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/progression.rst +0 -0
  93. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/service.rst +0 -0
  94. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/session.rst +0 -0
  95. {lionagi-0.15.9 → lionagi-0.15.11}/docs/modules/utils.rst +0 -0
  96. {lionagi-0.15.9 → lionagi-0.15.11}/docs/tutorials/get_started.rst +0 -0
  97. {lionagi-0.15.9 → lionagi-0.15.11}/docs/tutorials/get_started_pt2.rst +0 -0
  98. {lionagi-0.15.9 → lionagi-0.15.11}/docs/tutorials/get_started_pt3.rst +0 -0
  99. {lionagi-0.15.9 → lionagi-0.15.11}/docs/tutorials/index.rst +0 -0
  100. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/_class_registry.py +0 -0
  101. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/_errors.py +0 -0
  102. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/_types.py +0 -0
  103. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/adapters/__init__.py +0 -0
  104. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/adapters/_utils.py +0 -0
  105. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/adapters/postgres_model_adapter.py +0 -0
  106. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/config.py +0 -0
  107. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/__init__.py +0 -0
  108. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/action.py +0 -0
  109. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/base.py +0 -0
  110. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/code.py +0 -0
  111. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/file.py +0 -0
  112. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/instruct.py +0 -0
  113. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/reason.py +0 -0
  114. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/fields/research.py +0 -0
  115. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/__init__.py +0 -0
  116. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/concurrency.py +0 -0
  117. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/__init__.py +0 -0
  118. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/chunk.py +0 -0
  119. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/concat.py +0 -0
  120. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/concat_files.py +0 -0
  121. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/file_ops.py +0 -0
  122. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/params.py +0 -0
  123. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/file/save.py +0 -0
  124. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/__init__.py +0 -0
  125. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/flatten.py +0 -0
  126. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/nfilter.py +0 -0
  127. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/nget.py +0 -0
  128. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/ninsert.py +0 -0
  129. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/nmerge.py +0 -0
  130. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/npop.py +0 -0
  131. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/nset.py +0 -0
  132. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/unflatten.py +0 -0
  133. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/nested/utils.py +0 -0
  134. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/parse.py +0 -0
  135. {lionagi-0.15.9/lionagi/libs/package → lionagi-0.15.11/lionagi/libs/schema}/__init__.py +0 -0
  136. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/as_readable.py +0 -0
  137. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/extract_code_block.py +0 -0
  138. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/extract_docstring.py +0 -0
  139. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/function_to_schema.py +0 -0
  140. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/json_schema.py +0 -0
  141. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
  142. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/__init__.py +0 -0
  143. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/base.py +0 -0
  144. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/llmlingua.py +0 -0
  145. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/perplexity.py +0 -0
  146. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/symbolic_compress_context.py +0 -0
  147. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang.py +0 -0
  148. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/base.py +0 -0
  149. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/abstract_algebra.toml +0 -0
  150. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/category_theory.toml +0 -0
  151. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/complex_analysis.toml +0 -0
  152. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/framework_options.json +0 -0
  153. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/group_theory.toml +0 -0
  154. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/math_logic.toml +0 -0
  155. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/reflective_patterns.toml +0 -0
  156. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/set_theory.toml +0 -0
  157. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/topology_fundamentals.toml +0 -0
  158. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/lion_emoji_mapping.toml +0 -0
  159. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/python_math_mapping.toml +0 -0
  160. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/rust_chinese_mapping.toml +0 -0
  161. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/utility/base_synthlang_system_prompt.toml +0 -0
  162. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/translate_to_synthlang.py +0 -0
  163. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/token_transform/types.py +0 -0
  164. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/unstructured/__init__.py +0 -0
  165. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/unstructured/read_image_to_base64.py +0 -0
  166. {lionagi-0.15.9/lionagi/libs/schema → lionagi-0.15.11/lionagi/libs/validate}/__init__.py +0 -0
  167. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/common_field_validators.py +0 -0
  168. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
  169. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
  170. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/string_similarity.py +4 -4
  171. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/to_num.py +0 -0
  172. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/validate_boolean.py +0 -0
  173. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/libs/validate/xml_parser.py +0 -0
  174. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_async_call.py +0 -0
  175. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_hash.py +0 -0
  176. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_json_dump.py +0 -0
  177. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_list_call.py +0 -0
  178. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_models.py +0 -0
  179. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_to_list.py +0 -0
  180. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/_types.py +0 -0
  181. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/__init__.py +0 -0
  182. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/cancel.py +0 -0
  183. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/errors.py +0 -0
  184. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/patterns.py +0 -0
  185. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/primitives.py +0 -0
  186. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/resource_tracker.py +0 -0
  187. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/task.py +0 -0
  188. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/throttle.py +0 -0
  189. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/ln/concurrency/utils.py +0 -0
  190. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/__init__.py +0 -0
  191. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/hashable_model.py +0 -0
  192. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/model_params.py +0 -0
  193. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/note.py +0 -0
  194. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/operable_model.py +0 -0
  195. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/models/schema_model.py +0 -0
  196. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/ReAct/ReAct.py +0 -0
  197. {lionagi-0.15.9/lionagi/libs/validate → lionagi-0.15.11/lionagi/operations/ReAct}/__init__.py +0 -0
  198. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/ReAct/utils.py +0 -0
  199. {lionagi-0.15.9/lionagi/operations/ReAct → lionagi-0.15.11/lionagi/operations/_act}/__init__.py +0 -0
  200. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/_act/act.py +0 -0
  201. {lionagi-0.15.9/lionagi/operations/_act → lionagi-0.15.11/lionagi/operations/brainstorm}/__init__.py +0 -0
  202. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/brainstorm/brainstorm.py +0 -0
  203. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/brainstorm/prompt.py +0 -0
  204. {lionagi-0.15.9/lionagi/operations/brainstorm → lionagi-0.15.11/lionagi/operations/chat}/__init__.py +0 -0
  205. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/chat/chat.py +0 -0
  206. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/communicate/__init__.py +0 -0
  207. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/communicate/communicate.py +0 -0
  208. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/flow.py +0 -0
  209. {lionagi-0.15.9/lionagi/operations/chat → lionagi-0.15.11/lionagi/operations/instruct}/__init__.py +0 -0
  210. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/instruct/instruct.py +0 -0
  211. {lionagi-0.15.9/lionagi/operations/instruct → lionagi-0.15.11/lionagi/operations/interpret}/__init__.py +0 -0
  212. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/interpret/interpret.py +0 -0
  213. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/manager.py +0 -0
  214. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/node.py +0 -0
  215. {lionagi-0.15.9/lionagi/operations/interpret → lionagi-0.15.11/lionagi/operations/operate}/__init__.py +0 -0
  216. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/operate/operate.py +0 -0
  217. {lionagi-0.15.9/lionagi/operations/operate → lionagi-0.15.11/lionagi/operations/parse}/__init__.py +0 -0
  218. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/parse/parse.py +0 -0
  219. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/plan/__init__.py +0 -0
  220. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/plan/plan.py +0 -0
  221. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/plan/prompt.py +0 -0
  222. {lionagi-0.15.9/lionagi/operations/parse → lionagi-0.15.11/lionagi/operations/select}/__init__.py +0 -0
  223. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/select/select.py +0 -0
  224. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/select/utils.py +0 -0
  225. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/translate/__init__.py +0 -0
  226. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/translate/translate.py +0 -0
  227. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/types.py +0 -0
  228. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/operations/utils.py +0 -0
  229. {lionagi-0.15.9/lionagi/operations/select → lionagi-0.15.11/lionagi/protocols}/__init__.py +0 -0
  230. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/_concepts.py +0 -0
  231. {lionagi-0.15.9/lionagi/protocols → lionagi-0.15.11/lionagi/protocols/action}/__init__.py +0 -0
  232. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/action/function_calling.py +0 -0
  233. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/action/manager.py +0 -0
  234. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/action/tool.py +0 -0
  235. {lionagi-0.15.9/lionagi/protocols/action → lionagi-0.15.11/lionagi/protocols/forms}/__init__.py +0 -0
  236. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/forms/base.py +0 -0
  237. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/forms/flow.py +0 -0
  238. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/forms/form.py +0 -0
  239. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/forms/report.py +0 -0
  240. {lionagi-0.15.9/lionagi/protocols/forms → lionagi-0.15.11/lionagi/protocols/generic}/__init__.py +0 -0
  241. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/event.py +0 -0
  242. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/log.py +0 -0
  243. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/generic/processor.py +0 -0
  244. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/graph/__init__.py +0 -0
  245. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/graph/edge.py +0 -0
  246. {lionagi-0.15.9/lionagi/protocols/generic → lionagi-0.15.11/lionagi/protocols/mail}/__init__.py +0 -0
  247. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/exchange.py +0 -0
  248. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/mail.py +0 -0
  249. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/mailbox.py +0 -0
  250. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/manager.py +0 -0
  251. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/mail/package.py +0 -0
  252. {lionagi-0.15.9/lionagi/protocols/mail → lionagi-0.15.11/lionagi/protocols/messages}/__init__.py +0 -0
  253. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/action_request.py +0 -0
  254. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/action_response.py +0 -0
  255. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/assistant_response.py +0 -0
  256. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/base.py +0 -0
  257. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/instruction.py +0 -0
  258. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/message.py +0 -0
  259. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/system.py +0 -0
  260. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/README.md +0 -0
  261. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
  262. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
  263. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
  264. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
  265. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
  266. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
  267. {lionagi-0.15.9/lionagi/protocols/messages → lionagi-0.15.11/lionagi/protocols/operatives}/__init__.py +0 -0
  268. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/protocols/operatives/operative.py +0 -0
  269. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/py.typed +0 -0
  270. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/__init__.py +0 -0
  271. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/__init__.py +0 -0
  272. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/api_calling.py +0 -0
  273. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/endpoint.py +0 -0
  274. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/endpoint_config.py +0 -0
  275. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/header_factory.py +0 -0
  276. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/match_endpoint.py +0 -0
  277. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/__init__.py +0 -0
  278. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/anthropic_.py +0 -0
  279. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/claude_code_.py +0 -0
  280. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/claude_code_cli.py +0 -0
  281. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/exa_.py +0 -0
  282. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/oai_.py +0 -0
  283. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/ollama_.py +0 -0
  284. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/perplexity_.py +0 -0
  285. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/connections/providers/types.py +0 -0
  286. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/__init__.py +0 -0
  287. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/_types.py +0 -0
  288. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/_utils.py +0 -0
  289. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/hook_event.py +0 -0
  290. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/hooks/hook_registry.py +0 -0
  291. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/imodel.py +0 -0
  292. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/manager.py +0 -0
  293. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/rate_limited_processor.py +0 -0
  294. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/resilience.py +0 -0
  295. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/README.md +0 -0
  296. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/__init__.py +0 -0
  297. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/anthropic_models.py +0 -0
  298. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/claude_code.py +0 -0
  299. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/exa_models.py +0 -0
  300. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/openai_model_names.py +0 -0
  301. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/third_party/pplx_models.py +0 -0
  302. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/token_calculator.py +0 -0
  303. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/service/types.py +0 -0
  304. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/session/__init__.py +0 -0
  305. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/session/branch.py +0 -0
  306. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/session/prompts.py +0 -0
  307. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/session/session.py +0 -0
  308. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/settings.py +0 -0
  309. {lionagi-0.15.9/lionagi/protocols/operatives → lionagi-0.15.11/lionagi/tools}/__init__.py +0 -0
  310. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/tools/base.py +0 -0
  311. {lionagi-0.15.9/lionagi/tools → lionagi-0.15.11/lionagi/tools/file}/__init__.py +0 -0
  312. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/tools/memory/tools.py +0 -0
  313. {lionagi-0.15.9 → lionagi-0.15.11}/lionagi/tools/types.py +0 -0
  314. {lionagi-0.15.9 → lionagi-0.15.11}/main.py +0 -0
  315. {lionagi-0.15.9 → lionagi-0.15.11}/scripts/README.md +0 -0
  316. {lionagi-0.15.9 → lionagi-0.15.11}/scripts/concat.py +0 -0
  317. {lionagi-0.15.9 → lionagi-0.15.11}/scripts/config.py +0 -0
  318. {lionagi-0.15.9 → lionagi-0.15.11}/scripts/update_openai_models.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.15.9
3
+ Version: 0.15.11
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: pillow>=11.0.0
229
229
  Requires-Dist: psutil>=6.0.0
230
230
  Requires-Dist: pydantic-settings>=2.8.0
231
- Requires-Dist: pydapter[pandas]>=1.0.0
231
+ Requires-Dist: pydapter[pandas]>=1.0.2
232
232
  Requires-Dist: python-dotenv>=1.1.0
233
233
  Requires-Dist: tiktoken>=0.9.0
234
234
  Requires-Dist: toml>=0.8.0
@@ -7,9 +7,9 @@ import logging
7
7
  from pydantic import BaseModel, Field
8
8
 
9
9
  from . import _types as types
10
- from .operations import Operation
11
- from .operations import OperationGraphBuilder as Builder
12
- from .operations import brainstorm, flow, plan
10
+ from . import ln as ln
11
+ from .operations.builder import OperationGraphBuilder as Builder
12
+ from .operations.node import Operation
13
13
  from .service.imodel import iModel
14
14
  from .session.session import Branch, Session
15
15
  from .version import __version__
@@ -28,7 +28,5 @@ __all__ = (
28
28
  "logger",
29
29
  "Builder",
30
30
  "Operation",
31
- "brainstorm",
32
- "flow",
33
- "plan",
31
+ "ln",
34
32
  )
@@ -0,0 +1,98 @@
1
+ """
2
+ Clean LionAGI async PostgreSQL adapter for integration into lionagi core.
3
+
4
+ This adapter leverages pydapter v1.0.2+ CRUD operations.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import ClassVar, TypeVar
10
+
11
+ import sqlalchemy as sa
12
+ from pydapter.extras.async_postgres_ import AsyncPostgresAdapter
13
+ from sqlalchemy.ext.asyncio import create_async_engine
14
+
15
+ from ._utils import check_async_postgres_available
16
+
17
+ _ASYNC_POSTGRES_AVAILABLE = check_async_postgres_available()
18
+
19
+ if isinstance(_ASYNC_POSTGRES_AVAILABLE, ImportError):
20
+ raise _ASYNC_POSTGRES_AVAILABLE
21
+
22
+ T = TypeVar("T")
23
+
24
+
25
+ class LionAGIAsyncPostgresAdapter(AsyncPostgresAdapter[T]):
26
+ """
27
+ Zero-config async PostgreSQL adapter for lionagi Nodes.
28
+
29
+ - Auto-creates tables with lionagi schema
30
+ - Changes default adapt_meth to "to_dict" for lionagi Elements
31
+ - Everything else handled by parent AsyncPostgresAdapter
32
+ """
33
+
34
+ obj_key: ClassVar[str] = "lionagi_async_pg"
35
+
36
+ @classmethod
37
+ async def to_obj(
38
+ cls,
39
+ subj,
40
+ /,
41
+ *,
42
+ many: bool = True,
43
+ adapt_meth: str = "as_jsonable", # Default to to_dict for lionagi
44
+ **kw,
45
+ ):
46
+ """Write lionagi Node(s) to PostgreSQL with CRUD support."""
47
+ # Auto-create table if needed
48
+ if table := kw.get("table"):
49
+ if engine_url := (kw.get("dsn") or kw.get("engine_url")):
50
+ await cls._ensure_table(engine_url, table)
51
+ elif engine := kw.get("engine"):
52
+ await cls._ensure_table(engine, table)
53
+
54
+ return await super().to_obj(
55
+ subj, many=many, adapt_meth=adapt_meth, **kw
56
+ )
57
+
58
+ @classmethod
59
+ async def _ensure_table(cls, engine_or_url, table_name: str):
60
+ """Create table with lionagi schema if it doesn't exist."""
61
+ # Handle both engine and URL
62
+ should_dispose = None
63
+ if isinstance(engine_or_url, str):
64
+ engine = create_async_engine(engine_or_url, future=True)
65
+ should_dispose = True
66
+ else:
67
+ engine = engine_or_url
68
+ should_dispose = False
69
+
70
+ try:
71
+ async with engine.begin() as conn:
72
+ # Determine JSON type based on database
73
+ engine_url = str(engine.url)
74
+ json_type = (
75
+ sa.dialects.postgresql.JSONB
76
+ if "postgresql" in engine_url
77
+ else sa.JSON
78
+ )
79
+
80
+ # Create table with lionagi schema
81
+ await conn.run_sync(
82
+ lambda sync_conn: sa.Table(
83
+ table_name,
84
+ sa.MetaData(),
85
+ sa.Column("id", sa.String, primary_key=True),
86
+ sa.Column("content", json_type),
87
+ sa.Column(
88
+ "metadata", json_type
89
+ ), # Use metadata directly now
90
+ sa.Column(
91
+ "created_at", sa.Float
92
+ ), # Stored as float timestamp
93
+ sa.Column("embedding", json_type, nullable=True),
94
+ ).create(sync_conn, checkfirst=True)
95
+ )
96
+ finally:
97
+ if should_dispose:
98
+ await engine.dispose()
@@ -0,0 +1,10 @@
1
+ def check_docling_available():
2
+ try:
3
+ from docling.document_converter import DocumentConverter # noqa: F401
4
+
5
+ return True
6
+ except Exception:
7
+ return ImportError(
8
+ "The 'docling' package is required for this feature. "
9
+ "Please install it via 'pip install lionagi[reader]'."
10
+ )
@@ -8,11 +8,14 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
8
8
  from pathlib import Path
9
9
  from typing import Any, Literal
10
10
 
11
- from lionagi.utils import lcall
11
+ from lionagi import ln
12
12
 
13
+ from ._utils import check_docling_available
13
14
  from .chunk import chunk_content
14
15
  from .save import save_chunks
15
16
 
17
+ _HAS_DOCLING = check_docling_available()
18
+
16
19
 
17
20
  def dir_to_files(
18
21
  directory: str | Path,
@@ -206,24 +209,24 @@ def chunk(
206
209
  reader_tool = lambda x: Path(x).read_text(encoding="utf-8")
207
210
 
208
211
  if reader_tool == "docling":
209
- from lionagi.libs.package.imports import check_import
212
+ if _HAS_DOCLING is not True:
213
+ raise _HAS_DOCLING
210
214
 
211
- DocumentConverter = check_import(
212
- "docling",
213
- module_name="document_converter",
214
- import_name="DocumentConverter",
215
+ from docling.document_converter import ( # noqa: F401
216
+ DocumentConverter,
215
217
  )
218
+
216
219
  converter = DocumentConverter()
217
220
  reader_tool = lambda x: converter.convert(
218
221
  x
219
222
  ).document.export_to_markdown()
220
223
 
221
- texts = lcall(files, reader_tool)
224
+ texts = ln.lcall(files, reader_tool)
222
225
 
223
226
  else:
224
227
  texts = [text]
225
228
 
226
- chunks = lcall(
229
+ chunks = ln.lcall(
227
230
  texts,
228
231
  chunk_content,
229
232
  chunk_by=chunk_by,
@@ -244,15 +247,15 @@ def chunk(
244
247
  output_file = Path(output_file)
245
248
  if output_file.suffix == ".csv":
246
249
  p = Pile(chunks)
247
- p.to_csv_file(output_file)
250
+ p.dump(output_file, "csv")
248
251
 
249
- elif output_file.suffix == ".json":
252
+ if output_file.suffix == "json":
250
253
  p = Pile(chunks)
251
- p.to_json_file(output_file, use_pd=True)
254
+ p.dump(output_file, "json")
252
255
 
253
- elif output_file.suffix in Pile.list_adapters():
256
+ if output_file.suffix == ".parquet":
254
257
  p = Pile(chunks)
255
- p.adapt_to(output_file.suffix, fp=output_file)
258
+ p.dump(output_file, "parquet")
256
259
 
257
260
  else:
258
261
  raise ValueError(f"Unsupported output file format: {output_file}")
@@ -1,4 +1,4 @@
1
- from lionagi.utils import check_import, is_import_installed
1
+ from lionagi.utils import import_module, is_import_installed
2
2
 
3
3
  _HAS_PDF2IMAGE = is_import_installed("pdf2image")
4
4
 
@@ -25,7 +25,7 @@ def pdf_to_images(
25
25
 
26
26
  import os
27
27
 
28
- convert_from_path = check_import(
28
+ convert_from_path = import_module(
29
29
  "pdf2image", import_name="convert_from_path"
30
30
  )
31
31
 
@@ -1,4 +1,6 @@
1
1
  from ._async_call import AlcallParams, BcallParams, alcall, bcall
2
+ from ._extract_json import extract_json
3
+ from ._fuzzy_json import fuzzy_json
2
4
  from ._hash import hash_dict
3
5
  from ._json_dump import (
4
6
  DEFAULT_SERIALIZER,
@@ -56,4 +58,30 @@ __all__ = (
56
58
  "DEFAULT_SERIALIZER",
57
59
  "DEFAULT_SERIALIZER_OPTION",
58
60
  "json_dumps",
61
+ "TaskGroup",
62
+ "create_task_group",
63
+ "CancelScope",
64
+ "move_on_after",
65
+ "fail_after",
66
+ "ConnectionPool",
67
+ "WorkerPool",
68
+ "parallel_requests",
69
+ "retry_with_timeout",
70
+ "Lock",
71
+ "Semaphore",
72
+ "CapacityLimiter",
73
+ "Event",
74
+ "Condition",
75
+ "get_cancelled_exc_class",
76
+ "shield",
77
+ "ResourceTracker",
78
+ "resource_leak_detector",
79
+ "track_resource",
80
+ "untrack_resource",
81
+ "cleanup_check",
82
+ "get_global_tracker",
83
+ "is_coro_func",
84
+ "ConcurrencyEvent",
85
+ "fuzzy_json",
86
+ "extract_json",
59
87
  )
@@ -0,0 +1,60 @@
1
+ import re
2
+ from typing import Any
3
+
4
+ import orjson
5
+
6
+ from ._fuzzy_json import fuzzy_json
7
+
8
+ # Precompile the regex for extracting JSON code blocks
9
+ _JSON_BLOCK_PATTERN = re.compile(r"```json\s*(.*?)\s*```", re.DOTALL)
10
+
11
+
12
+ def extract_json(
13
+ input_data: str | list[str],
14
+ /,
15
+ *,
16
+ fuzzy_parse: bool = False,
17
+ return_one_if_single: bool = True,
18
+ ) -> dict[str, Any] | list[dict[str, Any]]:
19
+ """Extract and parse JSON content from a string or markdown code blocks.
20
+ Attempts direct JSON parsing first. If that fails, looks for JSON content
21
+ within markdown code blocks denoted by ```json.
22
+
23
+ Args:
24
+ input_data (str | list[str]): The input string or list of strings to parse.
25
+ fuzzy_parse (bool): If True, attempts fuzzy JSON parsing on failed attempts.
26
+ return_one_if_single (bool): If True and only one JSON object is found,
27
+ returns a dict instead of a list with one dict.
28
+ """
29
+
30
+ # If input_data is a list, join into a single string
31
+ if isinstance(input_data, list):
32
+ input_str = "\n".join(input_data)
33
+ else:
34
+ input_str = input_data
35
+
36
+ # 1. Try direct parsing
37
+ try:
38
+ if fuzzy_parse:
39
+ return fuzzy_json(input_str)
40
+ return orjson.loads(input_str)
41
+ except Exception:
42
+ pass
43
+
44
+ # 2. Attempt extracting JSON blocks from markdown
45
+ matches = _JSON_BLOCK_PATTERN.findall(input_str)
46
+ if not matches:
47
+ return []
48
+
49
+ # If only one match, return single dict; if multiple, return list of dicts
50
+ if return_one_if_single and len(matches) == 1:
51
+ data_str = matches[0]
52
+ if fuzzy_parse:
53
+ return fuzzy_json(data_str)
54
+ return orjson.loads(data_str)
55
+
56
+ # Multiple matches
57
+ if fuzzy_parse:
58
+ return [fuzzy_json(m) for m in matches]
59
+ else:
60
+ return [orjson.loads(m) for m in matches]
@@ -0,0 +1,116 @@
1
+ import contextlib
2
+ import re
3
+ from typing import Any
4
+
5
+ import orjson
6
+
7
+
8
+ def fuzzy_json(str_to_parse: str, /) -> dict[str, Any] | list[dict[str, Any]]:
9
+ """
10
+ Attempt to parse a JSON string, trying a few minimal "fuzzy" fixes if needed.
11
+
12
+ Steps:
13
+ 1. Parse directly with json.loads.
14
+ 2. Replace single quotes with double quotes, normalize spacing, and try again.
15
+ 3. Attempt to fix unmatched brackets using fix_json_string.
16
+ 4. If all fail, raise ValueError.
17
+
18
+ Args:
19
+ str_to_parse: The JSON string to parse
20
+
21
+ Returns:
22
+ Parsed JSON (dict or list of dicts)
23
+
24
+ Raises:
25
+ ValueError: If the string cannot be parsed as valid JSON
26
+ TypeError: If the input is not a string
27
+ """
28
+ _check_valid_str(str_to_parse)
29
+
30
+ # 1. Direct attempt
31
+ with contextlib.suppress(Exception):
32
+ return orjson.loads(str_to_parse)
33
+
34
+ # 2. Try cleaning: replace single quotes with double and normalize
35
+ cleaned = _clean_json_string(str_to_parse.replace("'", '"'))
36
+ with contextlib.suppress(Exception):
37
+ return orjson.loads(cleaned)
38
+
39
+ # 3. Try fixing brackets
40
+ fixed = fix_json_string(cleaned)
41
+ with contextlib.suppress(Exception):
42
+ return orjson.loads(fixed)
43
+
44
+ # If all attempts fail
45
+ raise ValueError("Invalid JSON string")
46
+
47
+
48
+ def _check_valid_str(str_to_parse: str, /):
49
+ if not isinstance(str_to_parse, str):
50
+ raise TypeError("Input must be a string")
51
+ if not str_to_parse.strip():
52
+ raise ValueError("Input string is empty")
53
+
54
+
55
+ def _clean_json_string(s: str) -> str:
56
+ """Basic normalization: replace unescaped single quotes, trim spaces, ensure keys are quoted."""
57
+ # Replace unescaped single quotes with double quotes
58
+ # '(?<!\\)'" means a single quote not preceded by a backslash
59
+ s = re.sub(r"(?<!\\)'", '"', s)
60
+ # Collapse multiple whitespaces
61
+ s = re.sub(r"\s+", " ", s)
62
+ # Ensure keys are quoted
63
+ # This attempts to find patterns like { key: value } and turn them into {"key": value}
64
+ s = re.sub(r'([{,])\s*([^"\s]+)\s*:', r'\1"\2":', s)
65
+ return s.strip()
66
+
67
+
68
+ def fix_json_string(str_to_parse: str, /) -> str:
69
+ """Try to fix JSON string by ensuring brackets are matched properly."""
70
+ if not str_to_parse:
71
+ raise ValueError("Input string is empty")
72
+
73
+ brackets = {"{": "}", "[": "]"}
74
+ open_brackets = []
75
+ pos = 0
76
+ length = len(str_to_parse)
77
+
78
+ while pos < length:
79
+ char = str_to_parse[pos]
80
+
81
+ if char == "\\":
82
+ pos += 2 # Skip escaped chars
83
+ continue
84
+
85
+ if char == '"':
86
+ pos += 1
87
+ # skip string content
88
+ while pos < length:
89
+ if str_to_parse[pos] == "\\":
90
+ pos += 2
91
+ continue
92
+ if str_to_parse[pos] == '"':
93
+ pos += 1
94
+ break
95
+ pos += 1
96
+ continue
97
+
98
+ if char in brackets:
99
+ open_brackets.append(brackets[char])
100
+ elif char in brackets.values():
101
+ if not open_brackets:
102
+ # Extra closing bracket
103
+ # Better to raise error than guess
104
+ raise ValueError("Extra closing bracket found.")
105
+ if open_brackets[-1] != char:
106
+ # Mismatched bracket
107
+ raise ValueError("Mismatched brackets.")
108
+ open_brackets.pop()
109
+
110
+ pos += 1
111
+
112
+ # Add missing closing brackets if any
113
+ if open_brackets:
114
+ str_to_parse += "".join(reversed(open_brackets))
115
+
116
+ return str_to_parse
@@ -16,7 +16,6 @@ from typing import Annotated, Any
16
16
  from typing_extensions import Self, override
17
17
 
18
18
  from .._errors import ValidationError
19
- from ..utils import UNDEFINED
20
19
 
21
20
  # Cache of valid Pydantic Field parameters
22
21
  _PYDANTIC_FIELD_PARAMS: set[str] | None = None
@@ -660,13 +659,16 @@ def to_dict(self) -> dict[str, Any]:
660
659
 
661
660
  # Convert metadata to dictionary
662
661
  for meta in self.metadata:
663
- if meta.key not in ("nullable", "listable", "validator"):
662
+ if meta.key not in (
663
+ "nullable",
664
+ "listable",
665
+ "validator",
666
+ "name",
667
+ "validator_kwargs",
668
+ "annotation",
669
+ ):
664
670
  result[meta.key] = meta.value
665
671
 
666
- # Add annotation if available
667
- if hasattr(self, "annotation"):
668
- result["annotation"] = self.base_type
669
-
670
672
  return result
671
673
 
672
674
 
@@ -8,6 +8,8 @@ from .flow import flow
8
8
  from .node import BranchOperations, Operation
9
9
  from .plan.plan import PlanOperation, plan
10
10
 
11
+ Builder = OperationGraphBuilder
12
+
11
13
  __all__ = (
12
14
  "ExpansionStrategy",
13
15
  "OperationGraphBuilder",
@@ -19,4 +21,5 @@ __all__ = (
19
21
  "PlanOperation",
20
22
  "brainstorm",
21
23
  "BrainstormOperation",
24
+ "Builder",
22
25
  )
@@ -453,6 +453,16 @@ def visualize_graph(
453
453
  figsize=(14, 10),
454
454
  ):
455
455
  """Visualization with improved layout for complex graphs."""
456
+ from lionagi.protocols.graph.graph import (
457
+ _MATPLIB_AVAILABLE,
458
+ _NETWORKX_AVAILABLE,
459
+ )
460
+
461
+ if _MATPLIB_AVAILABLE is not True:
462
+ raise _MATPLIB_AVAILABLE
463
+ if _NETWORKX_AVAILABLE is not True:
464
+ raise _NETWORKX_AVAILABLE
465
+
456
466
  import matplotlib.pyplot as plt
457
467
  import networkx as nx
458
468
  import numpy as np
@@ -6,7 +6,7 @@ from __future__ import annotations
6
6
 
7
7
  import datetime as dt
8
8
  from collections.abc import Mapping, Sequence
9
- from typing import Any, Generic, TypeAlias, TypeVar
9
+ from typing import Any, Generic, Literal, TypeAlias, TypeVar
10
10
  from uuid import UUID, uuid4
11
11
 
12
12
  import orjson
@@ -22,7 +22,7 @@ from lionagi import ln
22
22
  from lionagi._class_registry import get_class
23
23
  from lionagi._errors import IDError
24
24
  from lionagi.settings import Settings
25
- from lionagi.utils import time, to_dict
25
+ from lionagi.utils import import_module, time, to_dict
26
26
 
27
27
  from .._concepts import Collective, Observable, Ordering
28
28
 
@@ -274,12 +274,21 @@ class Element(BaseModel, Observable):
274
274
  return str(cls).split("'")[1]
275
275
  return cls.__name__
276
276
 
277
- def to_dict(self) -> dict:
278
- """Converts this Element to a dictionary."""
277
+ def _to_dict(self) -> dict:
279
278
  dict_ = self.model_dump()
280
279
  dict_["metadata"].update({"lion_class": self.class_name(full=True)})
281
280
  return {k: v for k, v in dict_.items() if ln.not_sentinel(v)}
282
281
 
282
+ def to_dict(self, mode: Literal["python", "json"] = "python") -> dict:
283
+ """Converts this Element to a dictionary."""
284
+ if mode == "python":
285
+ return self._to_dict()
286
+ return orjson.loads(self.to_json(decode=False))
287
+
288
+ def as_jsonable(self) -> dict:
289
+ """Converts this Element to a JSON-serializable dictionary."""
290
+ return self.to_dict(mode="json")
291
+
283
292
  @classmethod
284
293
  def from_dict(cls, data: dict, /) -> Element:
285
294
  """Deserializes a dictionary into an Element or subclass of Element.
@@ -308,9 +317,6 @@ class Element(BaseModel, Observable):
308
317
  return subcls_type.from_dict(data)
309
318
 
310
319
  except Exception:
311
- # Fallback attempt: direct import if not in registry
312
- from lionagi.libs.package.imports import import_module
313
-
314
320
  mod, imp = subcls.rsplit(".", 1)
315
321
  subcls_type = import_module(mod, import_name=imp)
316
322
  data["metadata"] = metadata
@@ -321,10 +327,16 @@ class Element(BaseModel, Observable):
321
327
  data["metadata"] = metadata
322
328
  return cls.model_validate(data)
323
329
 
324
- def to_json(self) -> str:
330
+ def to_json(self, decode: bool = True) -> str:
325
331
  """Converts this Element to a JSON string."""
326
- dict_ = self.to_dict()
327
- return orjson.dumps(dict_, default=DEFAULT_ELEMENT_SERIALIZER).decode()
332
+ dict_ = self._to_dict()
333
+ if decode:
334
+ return orjson.dumps(
335
+ dict_,
336
+ default=DEFAULT_ELEMENT_SERIALIZER,
337
+ option=ln.DEFAULT_SERIALIZER_OPTION,
338
+ ).decode()
339
+ return orjson.dumps(dict_, default=DEFAULT_ELEMENT_SERIALIZER)
328
340
 
329
341
  def from_json(cls, json_str: str) -> Element:
330
342
  """Deserializes a JSON string into an Element or subclass of Element."""
@@ -19,7 +19,7 @@ from pathlib import Path
19
19
  from typing import Any, ClassVar, Generic, Literal, TypeVar
20
20
 
21
21
  import pandas as pd
22
- from pydantic import Field, field_serializer, field_validator, model_validator
22
+ from pydantic import Field, field_serializer
23
23
  from pydantic.fields import FieldInfo
24
24
  from pydapter import Adaptable, AsyncAdaptable
25
25
  from typing_extensions import Self, deprecated, override
@@ -988,6 +988,12 @@ class Pile(Element, Collective[T], Generic[T], Adaptable, AsyncAdaptable):
988
988
  is_same_dtype(self.collections.values())
989
989
  )
990
990
 
991
+ @classmethod
992
+ def list_adapters(cls) -> list[str]:
993
+ syn_ = cls._adapter_registry._reg.keys()
994
+ asy_ = cls._async_registry._reg.keys()
995
+ return list(set(syn_) | set(asy_))
996
+
991
997
  def adapt_to(self, obj_key: str, many=False, **kw: Any) -> Any:
992
998
  """Adapt to another format.
993
999
 
@@ -1132,6 +1138,55 @@ class Pile(Element, Collective[T], Generic[T], Adaptable, AsyncAdaptable):
1132
1138
  ) -> None:
1133
1139
  return self.dump(fp, obj_key=obj_key, mode=mode, clear=clear, **kw)
1134
1140
 
1141
+ def filter_by_type(
1142
+ self,
1143
+ item_type: type[T] | list | set,
1144
+ strict_type: bool = False,
1145
+ as_pile: bool = False,
1146
+ reverse: bool = False,
1147
+ num_items: int | None = None,
1148
+ ) -> list[T]:
1149
+ if isinstance(item_type, type):
1150
+ if is_union_type(item_type):
1151
+ item_type = set(union_members(item_type))
1152
+ else:
1153
+ item_type = {item_type}
1154
+
1155
+ if isinstance(item_type, list | tuple):
1156
+ item_type = set(item_type)
1157
+
1158
+ if not isinstance(item_type, set):
1159
+ raise TypeError("item_type must be a type or a list/set of types")
1160
+
1161
+ meth = None
1162
+
1163
+ if strict_type:
1164
+ meth = lambda item: type(item) in item_type
1165
+ else:
1166
+ meth = (
1167
+ lambda item: any(isinstance(item, t) for t in item_type)
1168
+ is True
1169
+ )
1170
+
1171
+ out = []
1172
+ prog = (
1173
+ list(self.progression)
1174
+ if not reverse
1175
+ else reversed(list(self.progression))
1176
+ )
1177
+ for i in prog:
1178
+ item = self.collections[i]
1179
+ if meth(item):
1180
+ out.append(item)
1181
+ if num_items is not None and len(out) == num_items:
1182
+ break
1183
+
1184
+ if as_pile:
1185
+ return self.__class__(
1186
+ collections=out, item_type=item_type, strict_type=strict_type
1187
+ )
1188
+ return out
1189
+
1135
1190
 
1136
1191
  def to_list_type(value: Any, /) -> list[Any]:
1137
1192
  """Convert input to a list format"""