lionagi 0.15.8__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 (319) hide show
  1. {lionagi-0.15.8 → lionagi-0.15.11}/.github/workflows/ci.yml +2 -2
  2. {lionagi-0.15.8 → lionagi-0.15.11}/.github/workflows/codeql.yml +1 -1
  3. {lionagi-0.15.8 → lionagi-0.15.11}/.github/workflows/release.yml +2 -2
  4. {lionagi-0.15.8 → lionagi-0.15.11}/PKG-INFO +2 -2
  5. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/__init__.py +4 -6
  6. lionagi-0.15.11/lionagi/adapters/async_postgres_adapter.py +98 -0
  7. lionagi-0.15.11/lionagi/libs/file/_utils.py +10 -0
  8. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/process.py +16 -13
  9. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/save.py +3 -2
  10. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/load_pydantic_model_from_schema.py +2 -1
  11. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/unstructured/pdf_to_image.py +2 -2
  12. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/__init__.py +38 -0
  13. lionagi-0.15.11/lionagi/ln/_extract_json.py +60 -0
  14. lionagi-0.15.11/lionagi/ln/_fuzzy_json.py +116 -0
  15. lionagi-0.15.11/lionagi/ln/_json_dump.py +75 -0
  16. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_models.py +0 -1
  17. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/field_model.py +8 -6
  18. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/__init__.py +3 -0
  19. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/builder.py +10 -0
  20. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/element.py +56 -53
  21. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/event.py +46 -67
  22. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/pile.py +56 -1
  23. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/progression.py +11 -11
  24. lionagi-0.15.11/lionagi/protocols/graph/_utils.py +22 -0
  25. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/graph/graph.py +17 -21
  26. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/graph/node.py +23 -5
  27. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/manager.py +41 -45
  28. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/message.py +3 -1
  29. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/operatives/step.py +2 -19
  30. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/types.py +1 -2
  31. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/claude_code_.py +9 -7
  32. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/claude_code.py +3 -2
  33. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/session/session.py +14 -2
  34. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/tools/file/reader.py +5 -6
  35. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/utils.py +8 -385
  36. lionagi-0.15.11/lionagi/version.py +1 -0
  37. {lionagi-0.15.8 → lionagi-0.15.11}/pyproject.toml +2 -2
  38. {lionagi-0.15.8 → lionagi-0.15.11}/uv.lock +5 -5
  39. lionagi-0.15.8/.github/workflows/docs.yml +0 -58
  40. lionagi-0.15.8/lionagi/adapters/async_postgres_adapter.py +0 -362
  41. lionagi-0.15.8/lionagi/libs/package/imports.py +0 -21
  42. lionagi-0.15.8/lionagi/libs/package/management.py +0 -62
  43. lionagi-0.15.8/lionagi/libs/package/params.py +0 -30
  44. lionagi-0.15.8/lionagi/libs/package/system.py +0 -22
  45. lionagi-0.15.8/lionagi/tools/file/__init__.py +0 -3
  46. lionagi-0.15.8/lionagi/version.py +0 -1
  47. {lionagi-0.15.8 → lionagi-0.15.11}/.coveragerc +0 -0
  48. {lionagi-0.15.8 → lionagi-0.15.11}/.env.example +0 -0
  49. {lionagi-0.15.8 → lionagi-0.15.11}/.github/FUNDING.yml +0 -0
  50. {lionagi-0.15.8 → lionagi-0.15.11}/.github/dependabot.yml +0 -0
  51. {lionagi-0.15.8 → lionagi-0.15.11}/.gitignore +0 -0
  52. {lionagi-0.15.8 → lionagi-0.15.11}/.pre-commit-config.yaml +0 -0
  53. {lionagi-0.15.8 → lionagi-0.15.11}/.python-version +0 -0
  54. {lionagi-0.15.8 → lionagi-0.15.11}/CODE_OF_CONDUCT.md +0 -0
  55. {lionagi-0.15.8 → lionagi-0.15.11}/CONTRIBUTING.md +0 -0
  56. {lionagi-0.15.8 → lionagi-0.15.11}/LICENSE +0 -0
  57. {lionagi-0.15.8 → lionagi-0.15.11}/README.md +0 -0
  58. {lionagi-0.15.8 → lionagi-0.15.11}/assets/operation_builder.gif +0 -0
  59. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/001_branch_converse.ipynb +0 -0
  60. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/002_branch_interact.ipynb +0 -0
  61. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/003_branch_info.ipynb +0 -0
  62. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/004_conversation_patterns.ipynb +0 -0
  63. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/005_react_basics.ipynb +0 -0
  64. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
  65. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/007_fan_out_in.py +0 -0
  66. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/claude_proxy/README.md +0 -0
  67. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/claude_proxy/claude_code_proxy.py +0 -0
  68. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
  69. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/data/002_comedian.json +0 -0
  70. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/data/002_critic.json +0 -0
  71. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/data/006_lion_proof_ch2.md +0 -0
  72. {lionagi-0.15.8 → lionagi-0.15.11}/cookbooks/using_claude_code.py +0 -0
  73. {lionagi-0.15.8 → lionagi-0.15.11}/docs/Makefile +0 -0
  74. {lionagi-0.15.8 → lionagi-0.15.11}/docs/_static/custom.css +0 -0
  75. {lionagi-0.15.8 → lionagi-0.15.11}/docs/_templates/layout.html +0 -0
  76. {lionagi-0.15.8 → lionagi-0.15.11}/docs/conf.py +0 -0
  77. {lionagi-0.15.8 → lionagi-0.15.11}/docs/discussions/anyio-migration.md +0 -0
  78. {lionagi-0.15.8 → lionagi-0.15.11}/docs/index.rst +0 -0
  79. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/action.rst +0 -0
  80. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/adapter.rst +0 -0
  81. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/branch.rst +0 -0
  82. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/branch_operations.rst +0 -0
  83. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/concepts.rst +0 -0
  84. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/element_id.rst +0 -0
  85. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/event.rst +0 -0
  86. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/form.rst +0 -0
  87. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/graph.rst +0 -0
  88. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/index.rst +0 -0
  89. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/instruct.rst +0 -0
  90. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_file.rst +0 -0
  91. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_nested.rst +0 -0
  92. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_package.rst +0 -0
  93. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_schema.rst +0 -0
  94. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/lib_validate.rst +0 -0
  95. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/log.rst +0 -0
  96. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/mail.rst +0 -0
  97. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/message.rst +0 -0
  98. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/models.rst +0 -0
  99. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/operative_step.rst +0 -0
  100. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/pile.rst +0 -0
  101. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/processor.rst +0 -0
  102. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/progression.rst +0 -0
  103. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/service.rst +0 -0
  104. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/session.rst +0 -0
  105. {lionagi-0.15.8 → lionagi-0.15.11}/docs/modules/utils.rst +0 -0
  106. {lionagi-0.15.8 → lionagi-0.15.11}/docs/tutorials/get_started.rst +0 -0
  107. {lionagi-0.15.8 → lionagi-0.15.11}/docs/tutorials/get_started_pt2.rst +0 -0
  108. {lionagi-0.15.8 → lionagi-0.15.11}/docs/tutorials/get_started_pt3.rst +0 -0
  109. {lionagi-0.15.8 → lionagi-0.15.11}/docs/tutorials/index.rst +0 -0
  110. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/_class_registry.py +0 -0
  111. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/_errors.py +0 -0
  112. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/_types.py +0 -0
  113. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/adapters/__init__.py +0 -0
  114. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/adapters/_utils.py +0 -0
  115. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/adapters/postgres_model_adapter.py +0 -0
  116. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/config.py +0 -0
  117. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/__init__.py +0 -0
  118. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/action.py +0 -0
  119. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/base.py +0 -0
  120. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/code.py +0 -0
  121. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/file.py +0 -0
  122. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/instruct.py +0 -0
  123. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/reason.py +0 -0
  124. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/fields/research.py +0 -0
  125. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/__init__.py +0 -0
  126. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/concurrency.py +0 -0
  127. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/__init__.py +0 -0
  128. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/chunk.py +0 -0
  129. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/concat.py +0 -0
  130. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/concat_files.py +0 -0
  131. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/file_ops.py +0 -0
  132. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/file/params.py +0 -0
  133. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/__init__.py +0 -0
  134. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/flatten.py +0 -0
  135. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/nfilter.py +0 -0
  136. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/nget.py +0 -0
  137. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/ninsert.py +0 -0
  138. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/nmerge.py +0 -0
  139. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/npop.py +0 -0
  140. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/nset.py +0 -0
  141. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/unflatten.py +0 -0
  142. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/nested/utils.py +0 -0
  143. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/parse.py +0 -0
  144. {lionagi-0.15.8/lionagi/libs/package → lionagi-0.15.11/lionagi/libs/schema}/__init__.py +0 -0
  145. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/as_readable.py +0 -0
  146. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/extract_code_block.py +0 -0
  147. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/extract_docstring.py +0 -0
  148. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/function_to_schema.py +0 -0
  149. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/schema/json_schema.py +0 -0
  150. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/__init__.py +0 -0
  151. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/base.py +0 -0
  152. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/llmlingua.py +0 -0
  153. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/perplexity.py +0 -0
  154. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/symbolic_compress_context.py +0 -0
  155. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang.py +0 -0
  156. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/base.py +0 -0
  157. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/abstract_algebra.toml +0 -0
  158. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/category_theory.toml +0 -0
  159. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/complex_analysis.toml +0 -0
  160. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/framework_options.json +0 -0
  161. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/group_theory.toml +0 -0
  162. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/math_logic.toml +0 -0
  163. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/reflective_patterns.toml +0 -0
  164. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/set_theory.toml +0 -0
  165. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/frameworks/topology_fundamentals.toml +0 -0
  166. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/lion_emoji_mapping.toml +0 -0
  167. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/python_math_mapping.toml +0 -0
  168. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/mapping/rust_chinese_mapping.toml +0 -0
  169. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/resources/utility/base_synthlang_system_prompt.toml +0 -0
  170. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/synthlang_/translate_to_synthlang.py +0 -0
  171. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/token_transform/types.py +0 -0
  172. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/unstructured/__init__.py +0 -0
  173. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/unstructured/read_image_to_base64.py +0 -0
  174. {lionagi-0.15.8/lionagi/libs/schema → lionagi-0.15.11/lionagi/libs/validate}/__init__.py +0 -0
  175. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/common_field_validators.py +0 -0
  176. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
  177. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
  178. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/string_similarity.py +4 -4
  179. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/to_num.py +0 -0
  180. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/validate_boolean.py +0 -0
  181. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/libs/validate/xml_parser.py +0 -0
  182. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_async_call.py +0 -0
  183. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_hash.py +0 -0
  184. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_list_call.py +0 -0
  185. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_to_list.py +0 -0
  186. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/_types.py +0 -0
  187. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/__init__.py +0 -0
  188. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/cancel.py +0 -0
  189. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/errors.py +0 -0
  190. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/patterns.py +0 -0
  191. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/primitives.py +0 -0
  192. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/resource_tracker.py +0 -0
  193. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/task.py +0 -0
  194. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/throttle.py +0 -0
  195. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/ln/concurrency/utils.py +0 -0
  196. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/__init__.py +0 -0
  197. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/hashable_model.py +0 -0
  198. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/model_params.py +0 -0
  199. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/note.py +0 -0
  200. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/operable_model.py +0 -0
  201. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/models/schema_model.py +0 -0
  202. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/ReAct/ReAct.py +0 -0
  203. {lionagi-0.15.8/lionagi/libs/validate → lionagi-0.15.11/lionagi/operations/ReAct}/__init__.py +0 -0
  204. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/ReAct/utils.py +0 -0
  205. {lionagi-0.15.8/lionagi/operations/ReAct → lionagi-0.15.11/lionagi/operations/_act}/__init__.py +0 -0
  206. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/_act/act.py +0 -0
  207. {lionagi-0.15.8/lionagi/operations/_act → lionagi-0.15.11/lionagi/operations/brainstorm}/__init__.py +0 -0
  208. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/brainstorm/brainstorm.py +0 -0
  209. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/brainstorm/prompt.py +0 -0
  210. {lionagi-0.15.8/lionagi/operations/brainstorm → lionagi-0.15.11/lionagi/operations/chat}/__init__.py +0 -0
  211. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/chat/chat.py +0 -0
  212. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/communicate/__init__.py +0 -0
  213. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/communicate/communicate.py +0 -0
  214. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/flow.py +0 -0
  215. {lionagi-0.15.8/lionagi/operations/chat → lionagi-0.15.11/lionagi/operations/instruct}/__init__.py +0 -0
  216. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/instruct/instruct.py +0 -0
  217. {lionagi-0.15.8/lionagi/operations/instruct → lionagi-0.15.11/lionagi/operations/interpret}/__init__.py +0 -0
  218. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/interpret/interpret.py +0 -0
  219. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/manager.py +0 -0
  220. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/node.py +0 -0
  221. {lionagi-0.15.8/lionagi/operations/interpret → lionagi-0.15.11/lionagi/operations/operate}/__init__.py +0 -0
  222. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/operate/operate.py +0 -0
  223. {lionagi-0.15.8/lionagi/operations/operate → lionagi-0.15.11/lionagi/operations/parse}/__init__.py +0 -0
  224. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/parse/parse.py +0 -0
  225. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/plan/__init__.py +0 -0
  226. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/plan/plan.py +0 -0
  227. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/plan/prompt.py +0 -0
  228. {lionagi-0.15.8/lionagi/operations/parse → lionagi-0.15.11/lionagi/operations/select}/__init__.py +0 -0
  229. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/select/select.py +0 -0
  230. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/select/utils.py +0 -0
  231. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/translate/__init__.py +0 -0
  232. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/translate/translate.py +0 -0
  233. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/types.py +0 -0
  234. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/operations/utils.py +0 -0
  235. {lionagi-0.15.8/lionagi/operations/select → lionagi-0.15.11/lionagi/protocols}/__init__.py +0 -0
  236. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/_concepts.py +0 -0
  237. {lionagi-0.15.8/lionagi/protocols → lionagi-0.15.11/lionagi/protocols/action}/__init__.py +0 -0
  238. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/action/function_calling.py +0 -0
  239. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/action/manager.py +0 -0
  240. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/action/tool.py +0 -0
  241. {lionagi-0.15.8/lionagi/protocols/action → lionagi-0.15.11/lionagi/protocols/forms}/__init__.py +0 -0
  242. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/forms/base.py +0 -0
  243. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/forms/flow.py +0 -0
  244. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/forms/form.py +0 -0
  245. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/forms/report.py +0 -0
  246. {lionagi-0.15.8/lionagi/protocols/forms → lionagi-0.15.11/lionagi/protocols/generic}/__init__.py +0 -0
  247. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/log.py +0 -0
  248. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/generic/processor.py +0 -0
  249. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/graph/__init__.py +0 -0
  250. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/graph/edge.py +0 -0
  251. {lionagi-0.15.8/lionagi/protocols/generic → lionagi-0.15.11/lionagi/protocols/mail}/__init__.py +0 -0
  252. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/exchange.py +0 -0
  253. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/mail.py +0 -0
  254. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/mailbox.py +0 -0
  255. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/manager.py +0 -0
  256. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/mail/package.py +0 -0
  257. {lionagi-0.15.8/lionagi/protocols/mail → lionagi-0.15.11/lionagi/protocols/messages}/__init__.py +0 -0
  258. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/action_request.py +0 -0
  259. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/action_response.py +0 -0
  260. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/assistant_response.py +0 -0
  261. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/base.py +0 -0
  262. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/instruction.py +0 -0
  263. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/system.py +0 -0
  264. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/README.md +0 -0
  265. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
  266. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
  267. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
  268. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
  269. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
  270. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
  271. {lionagi-0.15.8/lionagi/protocols/messages → lionagi-0.15.11/lionagi/protocols/operatives}/__init__.py +0 -0
  272. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/protocols/operatives/operative.py +0 -0
  273. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/py.typed +0 -0
  274. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/__init__.py +0 -0
  275. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/__init__.py +0 -0
  276. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/api_calling.py +0 -0
  277. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/endpoint.py +0 -0
  278. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/endpoint_config.py +0 -0
  279. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/header_factory.py +0 -0
  280. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/match_endpoint.py +0 -0
  281. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/__init__.py +0 -0
  282. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/anthropic_.py +0 -0
  283. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/claude_code_cli.py +0 -0
  284. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/exa_.py +0 -0
  285. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/oai_.py +0 -0
  286. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/ollama_.py +0 -0
  287. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/perplexity_.py +0 -0
  288. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/connections/providers/types.py +0 -0
  289. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/__init__.py +0 -0
  290. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/_types.py +0 -0
  291. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/_utils.py +0 -0
  292. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/hook_event.py +0 -0
  293. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/hooks/hook_registry.py +0 -0
  294. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/imodel.py +0 -0
  295. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/manager.py +0 -0
  296. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/rate_limited_processor.py +0 -0
  297. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/resilience.py +0 -0
  298. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/README.md +0 -0
  299. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/__init__.py +0 -0
  300. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/anthropic_models.py +0 -0
  301. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/exa_models.py +0 -0
  302. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/openai_model_names.py +0 -0
  303. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/third_party/pplx_models.py +0 -0
  304. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/token_calculator.py +0 -0
  305. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/service/types.py +0 -0
  306. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/session/__init__.py +0 -0
  307. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/session/branch.py +0 -0
  308. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/session/prompts.py +0 -0
  309. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/settings.py +0 -0
  310. {lionagi-0.15.8/lionagi/protocols/operatives → lionagi-0.15.11/lionagi/tools}/__init__.py +0 -0
  311. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/tools/base.py +0 -0
  312. {lionagi-0.15.8/lionagi/tools → lionagi-0.15.11/lionagi/tools/file}/__init__.py +0 -0
  313. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/tools/memory/tools.py +0 -0
  314. {lionagi-0.15.8 → lionagi-0.15.11}/lionagi/tools/types.py +0 -0
  315. {lionagi-0.15.8 → lionagi-0.15.11}/main.py +0 -0
  316. {lionagi-0.15.8 → lionagi-0.15.11}/scripts/README.md +0 -0
  317. {lionagi-0.15.8 → lionagi-0.15.11}/scripts/concat.py +0 -0
  318. {lionagi-0.15.8 → lionagi-0.15.11}/scripts/config.py +0 -0
  319. {lionagi-0.15.8 → lionagi-0.15.11}/scripts/update_openai_models.py +0 -0
@@ -16,7 +16,7 @@ jobs:
16
16
  matrix:
17
17
  python-version: ['3.10', '3.11', '3.12', '3.13']
18
18
  steps:
19
- - uses: actions/checkout@v4
19
+ - uses: actions/checkout@v5
20
20
  - name: Set up Python ${{ matrix.python-version }}
21
21
  uses: actions/setup-python@v5
22
22
  with:
@@ -59,7 +59,7 @@ jobs:
59
59
  contents: read
60
60
  packages: write
61
61
  steps:
62
- - uses: actions/checkout@v4
62
+ - uses: actions/checkout@v5
63
63
  - name: Set up Python
64
64
  uses: actions/setup-python@v5
65
65
  with:
@@ -24,7 +24,7 @@ jobs:
24
24
 
25
25
  steps:
26
26
  - name: Checkout repository
27
- uses: actions/checkout@v4
27
+ uses: actions/checkout@v5
28
28
 
29
29
  - name: Initialize CodeQL
30
30
  uses: github/codeql-action/init@v3
@@ -14,7 +14,7 @@ jobs:
14
14
  matrix:
15
15
  python-version: ['3.10', '3.11', '3.12', '3.13']
16
16
  steps:
17
- - uses: actions/checkout@v4
17
+ - uses: actions/checkout@v5
18
18
  - name: Set up Python ${{ matrix.python-version }}
19
19
  uses: actions/setup-python@v5
20
20
  with:
@@ -39,7 +39,7 @@ jobs:
39
39
  needs: test
40
40
  runs-on: ubuntu-latest
41
41
  steps:
42
- - uses: actions/checkout@v4
42
+ - uses: actions/checkout@v5
43
43
  - name: Set up Python
44
44
  uses: actions/setup-python@v5
45
45
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.15.8
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}")
@@ -2,7 +2,6 @@
2
2
  #
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
- import json
6
5
  import logging
7
6
  from pathlib import Path
8
7
  from typing import Any
@@ -78,6 +77,8 @@ def save_chunks(
78
77
  random_hash_digits: int,
79
78
  ) -> None:
80
79
  """Helper function to save chunks to files."""
80
+ from lionagi import ln
81
+
81
82
  output_path = Path(output_dir)
82
83
  for i, chunk in enumerate(chunks):
83
84
  file_path = create_path(
@@ -88,7 +89,7 @@ def save_chunks(
88
89
  random_hash_digits=random_hash_digits,
89
90
  )
90
91
  save_to_file(
91
- json.dumps(chunk, ensure_ascii=False, indent=2),
92
+ ln.json_dumps(chunk),
92
93
  directory=file_path.parent,
93
94
  filename=file_path.name,
94
95
  verbose=verbose,
@@ -11,6 +11,7 @@ from typing import Any, TypeVar
11
11
 
12
12
  from pydantic import BaseModel, PydanticUserError
13
13
 
14
+ from lionagi import ln
14
15
  from lionagi.utils import is_import_installed
15
16
 
16
17
  _HAS_DATAMODEL_CODE_GENERATOR = is_import_installed("datamodel_code_generator")
@@ -98,7 +99,7 @@ def load_pydantic_model_from_schema(
98
99
  sanitized_title # Update the name to use
99
100
  )
100
101
  schema_dict = schema
101
- schema_input_data = json.dumps(schema)
102
+ schema_input_data = ln.json_dumps(schema_dict)
102
103
  except TypeError as e:
103
104
  error_msg = "Invalid dictionary provided for schema"
104
105
  raise ValueError(error_msg) from e
@@ -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,5 +1,13 @@
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
5
+ from ._json_dump import (
6
+ DEFAULT_SERIALIZER,
7
+ DEFAULT_SERIALIZER_OPTION,
8
+ get_orjson_default,
9
+ json_dumps,
10
+ )
3
11
  from ._list_call import LcallParams, lcall
4
12
  from ._models import DataClass, Params
5
13
  from ._to_list import ToListParams, to_list
@@ -46,4 +54,34 @@ __all__ = (
46
54
  "bcall",
47
55
  "AlcallParams",
48
56
  "BcallParams",
57
+ "get_orjson_default",
58
+ "DEFAULT_SERIALIZER",
59
+ "DEFAULT_SERIALIZER_OPTION",
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",
49
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
@@ -0,0 +1,75 @@
1
+ import datetime as dt
2
+ import decimal
3
+ from collections.abc import Callable
4
+ from pathlib import Path
5
+ from uuid import UUID
6
+
7
+ import orjson
8
+
9
+
10
+ def _get_default_serializers():
11
+ return {
12
+ dt.datetime: lambda o: o.isoformat(),
13
+ Path: lambda o: str(o),
14
+ UUID: lambda o: str(o),
15
+ decimal.Decimal: lambda o: str(o),
16
+ set: lambda o: list(o),
17
+ frozenset: lambda o: list(o),
18
+ }
19
+
20
+
21
+ def _get_default_serializer_order():
22
+ return [dt.datetime, Path, UUID, decimal.Decimal, set, frozenset]
23
+
24
+
25
+ def get_orjson_default(
26
+ order: list[type] = None,
27
+ additional: dict[type, Callable] = None,
28
+ extend_default: bool = True,
29
+ ) -> Callable:
30
+ """get the default function for orjson.dumps
31
+ Args:
32
+ order: order of types to check. Defaults to None.
33
+ additional: additional serializers
34
+ extend_default: when order is provided, whether to extend the default order or replace it.
35
+ """
36
+ dict_ = _get_default_serializers()
37
+ dict_.update(additional or {})
38
+ order_ = _get_default_serializer_order()
39
+
40
+ if order:
41
+ if len(additional or {}) > 0 and extend_default:
42
+ order_.extend([k for k in order if k not in order_])
43
+ else:
44
+ order_ = list(order)
45
+ else:
46
+ if len(additional or {}) > 0:
47
+ order_.extend([k for k in additional.keys() if k not in order_])
48
+
49
+ def default(obj):
50
+ for t in order_:
51
+ if isinstance(obj, t) and t in dict_:
52
+ return dict_[t](obj)
53
+ raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
54
+
55
+ return default
56
+
57
+
58
+ DEFAULT_SERIALIZER = get_orjson_default()
59
+ DEFAULT_SERIALIZER_OPTION = (
60
+ orjson.OPT_INDENT_2
61
+ | orjson.OPT_SORT_KEYS
62
+ | orjson.OPT_APPEND_NEWLINE
63
+ | orjson.OPT_SERIALIZE_DATACLASS
64
+ )
65
+
66
+
67
+ def json_dumps(d_, decode=True, /) -> str:
68
+ by_ = orjson.dumps(
69
+ d_,
70
+ default=DEFAULT_SERIALIZER,
71
+ option=DEFAULT_SERIALIZER_OPTION,
72
+ )
73
+ if decode:
74
+ return by_.decode("utf-8")
75
+ return by_
@@ -70,7 +70,6 @@ class Params:
70
70
  _validate_strict(k)
71
71
 
72
72
  def default_kw(self) -> Any:
73
-
74
73
  # create a partial function with the current parameters
75
74
  dict_ = self.to_dict()
76
75
 
@@ -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
  )