lionagi 0.11.0__tar.gz → 0.12.1__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 (309) hide show
  1. lionagi-0.12.1/.coveragerc +13 -0
  2. lionagi-0.12.1/.github/workflows/ci.yml +35 -0
  3. {lionagi-0.11.0 → lionagi-0.12.1}/.github/workflows/docs.yml +3 -0
  4. {lionagi-0.11.0 → lionagi-0.12.1}/.github/workflows/release.yml +2 -6
  5. {lionagi-0.11.0 → lionagi-0.12.1}/.gitignore +5 -1
  6. {lionagi-0.11.0 → lionagi-0.12.1}/PKG-INFO +8 -11
  7. lionagi-0.12.1/lionagi/adapters/__init__.py +1 -0
  8. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/fields/file.py +1 -1
  9. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/fields/reason.py +1 -1
  10. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/file/concat.py +6 -1
  11. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/file/concat_files.py +5 -1
  12. lionagi-0.12.1/lionagi/libs/file/create_path.py +80 -0
  13. lionagi-0.12.1/lionagi/libs/file/file_util.py +358 -0
  14. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/file/save.py +1 -1
  15. lionagi-0.12.1/lionagi/libs/package/imports.py +190 -0
  16. lionagi-0.12.1/lionagi/libs/parse/fuzzy_parse_json.py +117 -0
  17. lionagi-0.12.1/lionagi/libs/parse/to_dict.py +336 -0
  18. lionagi-0.12.1/lionagi/libs/parse/to_json.py +61 -0
  19. lionagi-0.12.1/lionagi/libs/parse/to_num.py +378 -0
  20. lionagi-0.12.1/lionagi/libs/parse/to_xml.py +57 -0
  21. lionagi-0.12.1/lionagi/libs/parse/xml_parser.py +148 -0
  22. lionagi-0.12.1/lionagi/libs/schema/breakdown_pydantic_annotation.py +48 -0
  23. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/generic/log.py +2 -1
  24. lionagi-0.12.1/lionagi/service/providers/exa_/models.py +3 -0
  25. lionagi-0.12.1/lionagi/service/providers/perplexity_/models.py +5 -0
  26. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/utils.py +123 -921
  27. lionagi-0.12.1/lionagi/version.py +1 -0
  28. {lionagi-0.11.0 → lionagi-0.12.1}/pyproject.toml +15 -13
  29. lionagi-0.12.1/uv.lock +4463 -0
  30. lionagi-0.11.0/.github/workflows/ci.yml +0 -68
  31. lionagi-0.11.0/.roomodes +0 -80
  32. lionagi-0.11.0/lionagi/libs/package/imports.py +0 -21
  33. lionagi-0.11.0/lionagi/libs/parse.py +0 -30
  34. lionagi-0.11.0/lionagi/service/providers/exa_/__init__.py +0 -0
  35. lionagi-0.11.0/lionagi/service/providers/exa_/models.py +0 -160
  36. lionagi-0.11.0/lionagi/service/providers/perplexity_/models.py +0 -144
  37. lionagi-0.11.0/lionagi/tools/browser/__init__.py +0 -0
  38. lionagi-0.11.0/lionagi/tools/browser/providers/browser_use_.py +0 -3
  39. lionagi-0.11.0/lionagi/tools/code/coder.py +0 -3
  40. lionagi-0.11.0/lionagi/tools/code/manager.py +0 -3
  41. lionagi-0.11.0/lionagi/tools/code/providers/__init__.py +0 -3
  42. lionagi-0.11.0/lionagi/tools/code/providers/aider_.py +0 -3
  43. lionagi-0.11.0/lionagi/tools/code/providers/e2b_.py +0 -3
  44. lionagi-0.11.0/lionagi/tools/code/sandbox.py +0 -3
  45. lionagi-0.11.0/lionagi/tools/file/__init__.py +0 -3
  46. lionagi-0.11.0/lionagi/tools/file/manager.py +0 -3
  47. lionagi-0.11.0/lionagi/tools/file/providers/__init__.py +0 -3
  48. lionagi-0.11.0/lionagi/tools/file/providers/docling_.py +0 -3
  49. lionagi-0.11.0/lionagi/tools/file/writer.py +0 -3
  50. lionagi-0.11.0/lionagi/tools/query/__init__.py +0 -3
  51. lionagi-0.11.0/lionagi/version.py +0 -1
  52. lionagi-0.11.0/scripts/README.md +0 -15
  53. lionagi-0.11.0/scripts/concat.py +0 -95
  54. lionagi-0.11.0/scripts/config.py +0 -18
  55. lionagi-0.11.0/uv.lock +0 -4025
  56. {lionagi-0.11.0 → lionagi-0.12.1}/.env.example +0 -0
  57. {lionagi-0.11.0 → lionagi-0.12.1}/.github/dependabot.yml +0 -0
  58. {lionagi-0.11.0 → lionagi-0.12.1}/.github/workflows/codeql.yml +0 -0
  59. {lionagi-0.11.0 → lionagi-0.12.1}/.pre-commit-config.yaml +0 -0
  60. {lionagi-0.11.0 → lionagi-0.12.1}/CODE_OF_CONDUCT.md +0 -0
  61. {lionagi-0.11.0 → lionagi-0.12.1}/CONTRIBUTING.md +0 -0
  62. {lionagi-0.11.0 → lionagi-0.12.1}/LICENSE +0 -0
  63. {lionagi-0.11.0 → lionagi-0.12.1}/README.md +0 -0
  64. {lionagi-0.11.0 → lionagi-0.12.1}/cookbooks/ch01_get_started.md +0 -0
  65. {lionagi-0.11.0 → lionagi-0.12.1}/cookbooks/ch02_concepts.md +0 -0
  66. {lionagi-0.11.0 → lionagi-0.12.1}/dev_tools/count_code_base_lines.py +0 -0
  67. {lionagi-0.11.0 → lionagi-0.12.1}/docs/Makefile +0 -0
  68. {lionagi-0.11.0 → lionagi-0.12.1}/docs/_static/custom.css +0 -0
  69. {lionagi-0.11.0 → lionagi-0.12.1}/docs/_templates/layout.html +0 -0
  70. {lionagi-0.11.0 → lionagi-0.12.1}/docs/conf.py +0 -0
  71. {lionagi-0.11.0 → lionagi-0.12.1}/docs/index.rst +0 -0
  72. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/action.rst +0 -0
  73. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/adapter.rst +0 -0
  74. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/branch.rst +0 -0
  75. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/branch_operations.rst +0 -0
  76. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/concepts.rst +0 -0
  77. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/element_id.rst +0 -0
  78. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/event.rst +0 -0
  79. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/form.rst +0 -0
  80. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/graph.rst +0 -0
  81. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/index.rst +0 -0
  82. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/instruct.rst +0 -0
  83. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/lib_file.rst +0 -0
  84. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/lib_nested.rst +0 -0
  85. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/lib_package.rst +0 -0
  86. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/lib_schema.rst +0 -0
  87. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/lib_validate.rst +0 -0
  88. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/log.rst +0 -0
  89. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/mail.rst +0 -0
  90. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/message.rst +0 -0
  91. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/models.rst +0 -0
  92. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/operative_step.rst +0 -0
  93. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/pile.rst +0 -0
  94. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/processor.rst +0 -0
  95. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/progression.rst +0 -0
  96. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/service.rst +0 -0
  97. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/session.rst +0 -0
  98. {lionagi-0.11.0 → lionagi-0.12.1}/docs/modules/utils.rst +0 -0
  99. {lionagi-0.11.0 → lionagi-0.12.1}/docs/tutorials/get_started.rst +0 -0
  100. {lionagi-0.11.0 → lionagi-0.12.1}/docs/tutorials/get_started_pt2.rst +0 -0
  101. {lionagi-0.11.0 → lionagi-0.12.1}/docs/tutorials/get_started_pt3.rst +0 -0
  102. {lionagi-0.11.0 → lionagi-0.12.1}/docs/tutorials/index.rst +0 -0
  103. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/__init__.py +0 -0
  104. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/_class_registry.py +0 -0
  105. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/_errors.py +0 -0
  106. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/_types.py +0 -0
  107. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/adapters/adapter.py +0 -0
  108. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/adapters/json_adapter.py +0 -0
  109. {lionagi-0.11.0/lionagi/adapters → lionagi-0.12.1/lionagi/adapters/pandas_}/__init__.py +0 -0
  110. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/adapters/pandas_/csv_adapter.py +0 -0
  111. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/adapters/pandas_/excel_adapter.py +0 -0
  112. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/adapters/pandas_/pd_dataframe_adapter.py +0 -0
  113. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/adapters/pandas_/pd_series_adapter.py +0 -0
  114. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/adapters/toml_adapter.py +0 -0
  115. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/adapters/types.py +0 -0
  116. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/fields/__init__.py +0 -0
  117. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/fields/action.py +0 -0
  118. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/fields/base.py +0 -0
  119. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/fields/code.py +0 -0
  120. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/fields/instruct.py +0 -0
  121. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/fields/research.py +0 -0
  122. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/__init__.py +0 -0
  123. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/file/__init__.py +0 -0
  124. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/file/chunk.py +0 -0
  125. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/file/file_ops.py +0 -0
  126. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/file/params.py +0 -0
  127. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/file/process.py +0 -0
  128. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/__init__.py +0 -0
  129. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/flatten.py +0 -0
  130. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/nfilter.py +0 -0
  131. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/nget.py +0 -0
  132. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/ninsert.py +0 -0
  133. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/nmerge.py +0 -0
  134. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/npop.py +0 -0
  135. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/nset.py +0 -0
  136. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/unflatten.py +0 -0
  137. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/nested/utils.py +0 -0
  138. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/package/__init__.py +0 -0
  139. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/package/management.py +0 -0
  140. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/package/params.py +0 -0
  141. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/package/system.py +0 -0
  142. {lionagi-0.11.0/lionagi/libs/schema → lionagi-0.12.1/lionagi/libs/parse}/__init__.py +0 -0
  143. {lionagi-0.11.0/lionagi/libs/validate → lionagi-0.12.1/lionagi/libs/schema}/__init__.py +0 -0
  144. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/schema/as_readable.py +0 -0
  145. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/schema/extract_code_block.py +0 -0
  146. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/schema/extract_docstring.py +0 -0
  147. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/schema/function_to_schema.py +0 -0
  148. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/schema/json_schema.py +0 -0
  149. {lionagi-0.11.0/lionagi/adapters/pandas_ → lionagi-0.12.1/lionagi/libs/token_transform}/__init__.py +0 -0
  150. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/base.py +0 -0
  151. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/llmlingua.py +0 -0
  152. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/perplexity.py +0 -0
  153. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/symbolic_compress_context.py +0 -0
  154. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang.py +0 -0
  155. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/base.py +0 -0
  156. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/abstract_algebra.toml +0 -0
  157. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/category_theory.toml +0 -0
  158. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/complex_analysis.toml +0 -0
  159. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/framework_options.json +0 -0
  160. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/group_theory.toml +0 -0
  161. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/math_logic.toml +0 -0
  162. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/reflective_patterns.toml +0 -0
  163. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/set_theory.toml +0 -0
  164. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/frameworks/topology_fundamentals.toml +0 -0
  165. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/mapping/lion_emoji_mapping.toml +0 -0
  166. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/mapping/python_math_mapping.toml +0 -0
  167. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/mapping/rust_chinese_mapping.toml +0 -0
  168. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/resources/utility/base_synthlang_system_prompt.toml +0 -0
  169. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/synthlang_/translate_to_synthlang.py +0 -0
  170. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/token_transform/types.py +0 -0
  171. {lionagi-0.11.0/lionagi/operations/ReAct → lionagi-0.12.1/lionagi/libs/validate}/__init__.py +0 -0
  172. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/validate/common_field_validators.py +0 -0
  173. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
  174. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
  175. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/validate/string_similarity.py +0 -0
  176. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/libs/validate/validate_boolean.py +0 -0
  177. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/models/__init__.py +0 -0
  178. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/models/field_model.py +0 -0
  179. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/models/hashable_model.py +0 -0
  180. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/models/model_params.py +0 -0
  181. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/models/note.py +0 -0
  182. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/models/operable_model.py +0 -0
  183. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/models/schema_model.py +0 -0
  184. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/ReAct/ReAct.py +0 -0
  185. {lionagi-0.11.0/lionagi/operations/_act → lionagi-0.12.1/lionagi/operations/ReAct}/__init__.py +0 -0
  186. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/ReAct/utils.py +0 -0
  187. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/__init__.py +0 -0
  188. {lionagi-0.11.0/lionagi/operations/brainstorm → lionagi-0.12.1/lionagi/operations/_act}/__init__.py +0 -0
  189. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/_act/act.py +0 -0
  190. {lionagi-0.11.0/lionagi/operations/chat → lionagi-0.12.1/lionagi/operations/brainstorm}/__init__.py +0 -0
  191. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/brainstorm/brainstorm.py +0 -0
  192. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/brainstorm/prompt.py +0 -0
  193. {lionagi-0.11.0/lionagi/operations/instruct → lionagi-0.12.1/lionagi/operations/chat}/__init__.py +0 -0
  194. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/chat/chat.py +0 -0
  195. {lionagi-0.11.0/lionagi/libs/token_transform → lionagi-0.12.1/lionagi/operations/communicate}/__init__.py +0 -0
  196. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/communicate/communicate.py +0 -0
  197. {lionagi-0.11.0/lionagi/operations/interpret → lionagi-0.12.1/lionagi/operations/instruct}/__init__.py +0 -0
  198. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/instruct/instruct.py +0 -0
  199. {lionagi-0.11.0/lionagi/operations/operate → lionagi-0.12.1/lionagi/operations/interpret}/__init__.py +0 -0
  200. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/interpret/interpret.py +0 -0
  201. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/manager.py +0 -0
  202. {lionagi-0.11.0/lionagi/operations/parse → lionagi-0.12.1/lionagi/operations/operate}/__init__.py +0 -0
  203. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/operate/operate.py +0 -0
  204. {lionagi-0.11.0/lionagi/operations/select → lionagi-0.12.1/lionagi/operations/parse}/__init__.py +0 -0
  205. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/parse/parse.py +0 -0
  206. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/plan/__init__.py +0 -0
  207. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/plan/plan.py +0 -0
  208. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/plan/prompt.py +0 -0
  209. {lionagi-0.11.0/lionagi/protocols → lionagi-0.12.1/lionagi/operations/select}/__init__.py +0 -0
  210. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/select/select.py +0 -0
  211. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/select/utils.py +0 -0
  212. {lionagi-0.11.0/lionagi/operations/communicate → lionagi-0.12.1/lionagi/operations/translate}/__init__.py +0 -0
  213. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/translate/translate.py +0 -0
  214. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/types.py +0 -0
  215. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/operations/utils.py +0 -0
  216. {lionagi-0.11.0/lionagi/protocols/action → lionagi-0.12.1/lionagi/protocols}/__init__.py +0 -0
  217. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/_concepts.py +0 -0
  218. {lionagi-0.11.0/lionagi/protocols/forms → lionagi-0.12.1/lionagi/protocols/action}/__init__.py +0 -0
  219. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/action/function_calling.py +0 -0
  220. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/action/manager.py +0 -0
  221. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/action/tool.py +0 -0
  222. {lionagi-0.11.0/lionagi/protocols/generic → lionagi-0.12.1/lionagi/protocols/forms}/__init__.py +0 -0
  223. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/forms/base.py +0 -0
  224. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/forms/flow.py +0 -0
  225. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/forms/form.py +0 -0
  226. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/forms/report.py +0 -0
  227. {lionagi-0.11.0/lionagi/protocols/graph → lionagi-0.12.1/lionagi/protocols/generic}/__init__.py +0 -0
  228. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/generic/element.py +0 -0
  229. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/generic/event.py +0 -0
  230. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/generic/pile.py +0 -0
  231. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/generic/processor.py +0 -0
  232. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/generic/progression.py +0 -0
  233. {lionagi-0.11.0/lionagi/protocols/mail → lionagi-0.12.1/lionagi/protocols/graph}/__init__.py +0 -0
  234. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/graph/edge.py +0 -0
  235. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/graph/graph.py +0 -0
  236. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/graph/node.py +0 -0
  237. {lionagi-0.11.0/lionagi/protocols/messages → lionagi-0.12.1/lionagi/protocols/mail}/__init__.py +0 -0
  238. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/mail/exchange.py +0 -0
  239. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/mail/mail.py +0 -0
  240. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/mail/mailbox.py +0 -0
  241. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/mail/manager.py +0 -0
  242. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/mail/package.py +0 -0
  243. {lionagi-0.11.0/lionagi/protocols/operatives → lionagi-0.12.1/lionagi/protocols/messages}/__init__.py +0 -0
  244. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/action_request.py +0 -0
  245. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/action_response.py +0 -0
  246. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/assistant_response.py +0 -0
  247. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/base.py +0 -0
  248. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/instruction.py +0 -0
  249. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/manager.py +0 -0
  250. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/message.py +0 -0
  251. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/system.py +0 -0
  252. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/templates/README.md +0 -0
  253. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
  254. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
  255. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
  256. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
  257. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
  258. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
  259. {lionagi-0.11.0/lionagi/service/endpoints → lionagi-0.12.1/lionagi/protocols/operatives}/__init__.py +0 -0
  260. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/operatives/operative.py +0 -0
  261. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/operatives/step.py +0 -0
  262. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/protocols/types.py +0 -0
  263. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/__init__.py +0 -0
  264. {lionagi-0.11.0/lionagi/service/providers → lionagi-0.12.1/lionagi/service/endpoints}/__init__.py +0 -0
  265. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/endpoints/base.py +0 -0
  266. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/endpoints/chat_completion.py +0 -0
  267. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/endpoints/match_endpoint.py +0 -0
  268. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/endpoints/rate_limited_processor.py +0 -0
  269. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/endpoints/token_calculator.py +0 -0
  270. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/imodel.py +0 -0
  271. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/manager.py +0 -0
  272. {lionagi-0.11.0/lionagi/service/providers/anthropic_ → lionagi-0.12.1/lionagi/service/providers}/__init__.py +0 -0
  273. {lionagi-0.11.0/lionagi/service/providers/groq_ → lionagi-0.12.1/lionagi/service/providers/anthropic_}/__init__.py +0 -0
  274. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/anthropic_/messages.py +0 -0
  275. {lionagi-0.11.0/lionagi/operations/translate → lionagi-0.12.1/lionagi/service/providers/exa_}/__init__.py +0 -0
  276. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/exa_/search.py +0 -0
  277. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/exa_/types.py +0 -0
  278. {lionagi-0.11.0/lionagi/service/providers/ollama_ → lionagi-0.12.1/lionagi/service/providers/groq_}/__init__.py +0 -0
  279. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/groq_/chat_completions.py +0 -0
  280. {lionagi-0.11.0/lionagi/service/providers/openai_ → lionagi-0.12.1/lionagi/service/providers/ollama_}/__init__.py +0 -0
  281. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/ollama_/chat_completions.py +0 -0
  282. {lionagi-0.11.0/lionagi/service/providers/openrouter_ → lionagi-0.12.1/lionagi/service/providers/openai_}/__init__.py +0 -0
  283. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/openai_/chat_completions.py +0 -0
  284. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/openai_/spec.py +0 -0
  285. {lionagi-0.11.0/lionagi/service/providers/perplexity_ → lionagi-0.12.1/lionagi/service/providers/openrouter_}/__init__.py +0 -0
  286. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/openrouter_/chat_completions.py +0 -0
  287. {lionagi-0.11.0/lionagi/session → lionagi-0.12.1/lionagi/service/providers/perplexity_}/__init__.py +0 -0
  288. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/perplexity_/chat_completions.py +0 -0
  289. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/providers/types.py +0 -0
  290. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/service/types.py +0 -0
  291. {lionagi-0.11.0/lionagi/tools → lionagi-0.12.1/lionagi/session}/__init__.py +0 -0
  292. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/session/branch.py +0 -0
  293. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/session/prompts.py +0 -0
  294. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/session/session.py +0 -0
  295. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/settings.py +0 -0
  296. {lionagi-0.11.0/lionagi/tools/browser/providers → lionagi-0.12.1/lionagi/tools}/__init__.py +0 -0
  297. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/tools/base.py +0 -0
  298. {lionagi-0.11.0/lionagi/tools/code → lionagi-0.12.1/lionagi/tools/file}/__init__.py +0 -0
  299. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/tools/file/reader.py +0 -0
  300. {lionagi-0.11.0 → lionagi-0.12.1}/lionagi/tools/types.py +0 -0
  301. {lionagi-0.11.0 → lionagi-0.12.1}/prompts/doc_style.md +0 -0
  302. {lionagi-0.11.0 → lionagi-0.12.1}/reports/ips/IP-601.md +0 -0
  303. {lionagi-0.11.0 → lionagi-0.12.1}/reports/ips/IP-602.md +0 -0
  304. {lionagi-0.11.0 → lionagi-0.12.1}/reports/ips/IP-603.md +0 -0
  305. {lionagi-0.11.0 → lionagi-0.12.1}/reports/ips/IP-604.md +0 -0
  306. {lionagi-0.11.0 → lionagi-0.12.1}/reports/tis/TI-601.md +0 -0
  307. {lionagi-0.11.0 → lionagi-0.12.1}/reports/tis/TI-602.md +0 -0
  308. {lionagi-0.11.0 → lionagi-0.12.1}/reports/tis/TI-603.md +0 -0
  309. {lionagi-0.11.0 → lionagi-0.12.1}/reports/tis/TI-604.md +0 -0
@@ -0,0 +1,13 @@
1
+ [run]
2
+ source = lionagi
3
+ omit =
4
+ tests/*
5
+
6
+ [report]
7
+ exclude_lines =
8
+ pragma: no cover
9
+ def __repr__
10
+ raise NotImplementedError
11
+ if __name__ == .__main__.:
12
+ pass
13
+ raise ImportError
@@ -0,0 +1,35 @@
1
+ name: ci
2
+ on: [pull_request]
3
+ permissions:
4
+ contents: read
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-latest
8
+ services:
9
+ docker:
10
+ image: docker:dind
11
+ options: --privileged
12
+ strategy:
13
+ matrix:
14
+ py: ["3.10", "3.11", "3.12", "3.13"]
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "${{ matrix.py }}"
20
+ - run: pip install uv
21
+ - name: Create and activate virtual environment
22
+ run: |
23
+ uv venv .venv
24
+ echo "VIRTUAL_ENV=$GITHUB_WORKSPACE/.venv" >> $GITHUB_ENV
25
+ echo "$GITHUB_WORKSPACE/.venv/bin" >> $GITHUB_PATH
26
+ - name: Install dependencies
27
+ run: |
28
+ uv sync --extra all
29
+ - name: Run tests
30
+ run: uv run pytest -q --cov=lionagi --cov-report=xml
31
+ # - name: Upload coverage to Codecov
32
+ # uses: codecov/codecov-action@v3
33
+ # with:
34
+ # token: ${{ secrets.CODECOV_TOKEN }}
35
+ # fail_ci_if_error: true
@@ -4,6 +4,9 @@ on:
4
4
  push:
5
5
  branches: ["main"]
6
6
 
7
+ permissions:
8
+ contents: write
9
+
7
10
  jobs:
8
11
  build-deploy:
9
12
  runs-on: ubuntu-latest
@@ -27,13 +27,9 @@ jobs:
27
27
 
28
28
  - name: Install dependencies
29
29
  run: |
30
- uv venv
31
- uv build
32
-
30
+ uv sync --extra all
33
31
  - name: Run tests
34
- run: |
35
- source .venv/bin/activate
36
- uv run pytest --asyncio-mode=auto --maxfail=1 --disable-warnings tests/
32
+ run: uv run pytest -q --cov=lionagi --cov-report=xml
37
33
 
38
34
  deploy:
39
35
  needs: test
@@ -175,4 +175,8 @@ notebooks/.lock
175
175
  notebooks/meta.json
176
176
  logs/
177
177
  temp_logs/
178
- dev/
178
+ dev/
179
+ *.DS_Store
180
+ .roomodes
181
+ .khive/
182
+ .roo/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.11.0
3
+ Version: 0.12.1
4
4
  Summary: An Intelligence Operating System.
5
5
  Author-email: HaiyangLi <quantocean.li@gmail.com>
6
6
  License: Apache License
@@ -219,22 +219,19 @@ Classifier: Programming Language :: Python :: 3.11
219
219
  Classifier: Programming Language :: Python :: 3.12
220
220
  Classifier: Programming Language :: Python :: 3.13
221
221
  Requires-Python: >=3.10
222
- Requires-Dist: aiocache>=0.12.0
223
- Requires-Dist: aiohttp>=3.11.14
224
222
  Requires-Dist: jinja2>=3.0.0
223
+ Requires-Dist: khive>=0.2.6
225
224
  Requires-Dist: pandas>=2.0.0
226
- Requires-Dist: pillow>=10.0.0
227
- Requires-Dist: pydantic>=2.0.0
228
- Requires-Dist: python-dotenv>=1.1.0
229
225
  Requires-Dist: tiktoken>=0.8.0
230
- Requires-Dist: toml>=0.9.0
226
+ Provides-Extra: all
227
+ Requires-Dist: khive[ollama,reader]; extra == 'all'
228
+ Requires-Dist: litellm; extra == 'all'
231
229
  Provides-Extra: llms
232
- Requires-Dist: litellm>=1.59.5; extra == 'llms'
230
+ Requires-Dist: litellm; extra == 'llms'
233
231
  Provides-Extra: ollama
234
- Requires-Dist: ollama>=0.4.7; extra == 'ollama'
235
- Requires-Dist: openai>=1.60.0; extra == 'ollama'
232
+ Requires-Dist: khive[ollama]; extra == 'ollama'
236
233
  Provides-Extra: tools
237
- Requires-Dist: docling>=2.15.1; extra == 'tools'
234
+ Requires-Dist: khive[reader]; extra == 'tools'
238
235
  Description-Content-Type: text/markdown
239
236
 
240
237
  ![PyPI - Version](https://img.shields.io/pypi/v/lionagi?labelColor=233476aa&color=231fc935)
@@ -0,0 +1 @@
1
+ """deprecated, will be removed in v0.13.0"""
@@ -71,7 +71,7 @@ class File(HashableModel):
71
71
  header: str | None = None,
72
72
  footer: str | None = None,
73
73
  ) -> Path:
74
- from lionagi.utils import create_path
74
+ from lionagi.libs.file.create_path import create_path
75
75
 
76
76
  fp = create_path(
77
77
  directory=directory,
@@ -4,8 +4,8 @@
4
4
 
5
5
  from pydantic import Field, field_validator
6
6
 
7
+ from lionagi.libs.parse.to_num import to_num
7
8
  from lionagi.models import FieldModel, HashableModel
8
- from lionagi.utils import to_num
9
9
 
10
10
  __all__ = ("Reason",)
11
11
 
@@ -1,7 +1,12 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from pathlib import Path
2
6
  from typing import Any
3
7
 
4
- from lionagi.utils import create_path, lcall
8
+ from lionagi.libs.file.create_path import create_path
9
+ from lionagi.utils import lcall
5
10
 
6
11
  from .process import dir_to_files
7
12
 
@@ -1,6 +1,10 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
1
5
  from pathlib import Path
2
6
 
3
- from lionagi.utils import create_path
7
+ from lionagi.libs.file.create_path import create_path
4
8
 
5
9
  from .process import dir_to_files
6
10
 
@@ -0,0 +1,80 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import uuid
6
+ from datetime import datetime
7
+ from pathlib import Path
8
+
9
+
10
+ def create_path(
11
+ directory: Path | str,
12
+ filename: str,
13
+ extension: str = None,
14
+ timestamp: bool = False,
15
+ dir_exist_ok: bool = True,
16
+ file_exist_ok: bool = False,
17
+ time_prefix: bool = False,
18
+ timestamp_format: str | None = None,
19
+ random_hash_digits: int = 0,
20
+ ) -> Path:
21
+ """
22
+ Generate a new file path with optional timestamp and a random suffix.
23
+
24
+ Args:
25
+ directory: The directory where the file will be created.
26
+ filename: The base name of the file to create.
27
+ extension: The file extension, if not part of filename.
28
+ timestamp: If True, add a timestamp to the filename.
29
+ dir_exist_ok: If True, don't error if directory exists.
30
+ file_exist_ok: If True, allow overwriting existing files.
31
+ time_prefix: If True, timestamp is prefixed instead of suffixed.
32
+ timestamp_format: Custom format for timestamp (default: "%Y%m%d%H%M%S").
33
+ random_hash_digits: Number of hex digits for a random suffix.
34
+
35
+ Returns:
36
+ The full Path to the new or existing file.
37
+
38
+ Raises:
39
+ ValueError: If filename is invalid.
40
+ FileExistsError: If file exists and file_exist_ok=False.
41
+ """
42
+ if "/" in filename:
43
+ sub_dir, filename = filename.split("/")[:-1], filename.split("/")[-1]
44
+ directory = Path(directory) / "/".join(sub_dir)
45
+
46
+ if "\\" in filename:
47
+ raise ValueError("Filename cannot contain directory separators.")
48
+
49
+ directory = Path(directory)
50
+
51
+ # Extract name and extension from filename if present
52
+ if "." in filename:
53
+ name, ext = filename.rsplit(".", 1)
54
+ else:
55
+ name, ext = filename, extension
56
+
57
+ # Ensure extension has a single leading dot
58
+ ext = f".{ext.lstrip('.')}" if ext else ""
59
+
60
+ # Add timestamp if requested
61
+ if timestamp:
62
+ ts_str = datetime.now().strftime(timestamp_format or "%Y%m%d%H%M%S")
63
+ name = f"{ts_str}_{name}" if time_prefix else f"{name}_{ts_str}"
64
+
65
+ # Add random suffix if requested
66
+ if random_hash_digits > 0:
67
+ # Use UUID4 and truncate its hex for random suffix
68
+ random_suffix = uuid.uuid4().hex[:random_hash_digits]
69
+ name = f"{name}-{random_suffix}"
70
+
71
+ full_path = directory / f"{name}{ext}"
72
+
73
+ # Check if file or directory existence
74
+ full_path.parent.mkdir(parents=True, exist_ok=dir_exist_ok)
75
+ if full_path.exists() and not file_exist_ok:
76
+ raise FileExistsError(
77
+ f"File {full_path} already exists and file_exist_ok is False."
78
+ )
79
+
80
+ return full_path
@@ -0,0 +1,358 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from collections.abc import Callable
6
+ from pathlib import Path
7
+ from typing import Any, Literal
8
+
9
+
10
+ class FileUtil:
11
+
12
+ @staticmethod
13
+ def chunk_by_chars(
14
+ text: str,
15
+ chunk_size: int = 2048,
16
+ overlap: float = 0,
17
+ threshold: int = 256,
18
+ ) -> list[str]:
19
+ from .chunk import chunk_by_chars
20
+
21
+ return chunk_by_chars(
22
+ text,
23
+ chunk_size=chunk_size,
24
+ overlap=overlap,
25
+ threshold=threshold,
26
+ )
27
+
28
+ @staticmethod
29
+ def chunk_by_tokens(
30
+ text: str,
31
+ tokenizer: Callable[[str], list[str]] = str.split,
32
+ chunk_size: int = 1024,
33
+ overlap: float = 0,
34
+ threshold: int = 256,
35
+ ) -> list[str]:
36
+ from .chunk import chunk_by_tokens
37
+
38
+ return chunk_by_tokens(
39
+ text,
40
+ tokenizer=tokenizer,
41
+ chunk_size=chunk_size,
42
+ overlap=overlap,
43
+ threshold=threshold,
44
+ )
45
+
46
+ @staticmethod
47
+ def chunk_content(
48
+ content: str,
49
+ chunk_by: Literal["chars", "tokens"] = "chars",
50
+ tokenizer: Callable[[str], list[str]] = str.split,
51
+ chunk_size: int = 1024,
52
+ overlap: float = 0,
53
+ threshold: int = 256,
54
+ ) -> list[str]:
55
+ from .chunk import chunk_content
56
+
57
+ return chunk_content(
58
+ content,
59
+ chunk_by=chunk_by,
60
+ tokenizer=tokenizer,
61
+ chunk_size=chunk_size,
62
+ overlap=overlap,
63
+ threshold=threshold,
64
+ )
65
+
66
+ @staticmethod
67
+ def concat_files(
68
+ data_path: str | Path | list,
69
+ file_types: list[str],
70
+ output_dir: str | Path = None,
71
+ output_filename: str = None,
72
+ file_exist_ok: bool = True,
73
+ recursive: bool = True,
74
+ verbose: bool = True,
75
+ threshold: int = 0,
76
+ return_fps: bool = False,
77
+ return_files: bool = False,
78
+ **kwargs,
79
+ ) -> (
80
+ list[str] | str | tuple[list[str], list[Path]] | tuple[str, list[Path]]
81
+ ):
82
+ from .concat_files import concat_files
83
+
84
+ return concat_files(
85
+ data_path,
86
+ file_types=file_types,
87
+ output_dir=output_dir,
88
+ output_filename=output_filename,
89
+ file_exist_ok=file_exist_ok,
90
+ recursive=recursive,
91
+ verbose=verbose,
92
+ threshold=threshold,
93
+ return_fps=return_fps,
94
+ return_files=return_files,
95
+ **kwargs,
96
+ )
97
+
98
+ @staticmethod
99
+ def concat(
100
+ data_path: str | Path | list,
101
+ file_types: list[str],
102
+ output_dir: str | Path = None,
103
+ output_filename: str = None,
104
+ file_exist_ok: bool = True,
105
+ recursive: bool = True,
106
+ verbose: bool = True,
107
+ threshold: int = 0,
108
+ return_fps: bool = False,
109
+ return_files: bool = False,
110
+ exclude_patterns: list[str] = None,
111
+ **kwargs,
112
+ ) -> dict[str, Any]:
113
+ from .concat import concat
114
+
115
+ return concat(
116
+ data_path,
117
+ file_types=file_types,
118
+ output_dir=output_dir,
119
+ output_filename=output_filename,
120
+ file_exist_ok=file_exist_ok,
121
+ recursive=recursive,
122
+ verbose=verbose,
123
+ threshold=threshold,
124
+ return_fps=return_fps,
125
+ return_files=return_files,
126
+ exclude_patterns=exclude_patterns,
127
+ **kwargs,
128
+ )
129
+
130
+ @staticmethod
131
+ def copy_file(src: Path | str, dest: Path | str) -> None:
132
+ from .file_ops import copy_file
133
+
134
+ copy_file(src, dest)
135
+
136
+ @staticmethod
137
+ def get_file_size(path: Path | str) -> int:
138
+ from .file_ops import get_file_size
139
+
140
+ return get_file_size(path)
141
+
142
+ @staticmethod
143
+ def list_files(
144
+ dir_path: Path | str, extension: str | None = None
145
+ ) -> list[Path]:
146
+ from .file_ops import list_files
147
+
148
+ return list_files(dir_path, extension=extension)
149
+
150
+ @staticmethod
151
+ def read_file(file_path: Path | str, encoding: str = "utf-8") -> str:
152
+ from .file_ops import read_file
153
+
154
+ return read_file(file_path, encoding=encoding)
155
+
156
+ @staticmethod
157
+ def read_image_to_base64(image_path: str | Path) -> str:
158
+ import base64
159
+
160
+ import cv2 # type: ignore[import]
161
+
162
+ image_path = str(image_path)
163
+ image = cv2.imread(image_path, cv2.COLOR_BGR2RGB)
164
+
165
+ if image is None:
166
+ raise ValueError(f"Could not read image from path: {image_path}")
167
+
168
+ file_extension = "." + image_path.split(".")[-1]
169
+
170
+ success, buffer = cv2.imencode(file_extension, image)
171
+ if not success:
172
+ raise ValueError(
173
+ f"Could not encode image to {file_extension} format."
174
+ )
175
+ encoded_image = base64.b64encode(buffer).decode("utf-8")
176
+ return encoded_image
177
+
178
+ @staticmethod
179
+ def pdf_to_images(
180
+ pdf_path: str, output_folder: str, dpi: int = 300, fmt: str = "jpeg"
181
+ ) -> list:
182
+ """
183
+ Convert a PDF file into images, one image per page.
184
+
185
+ Args:
186
+ pdf_path (str): Path to the input PDF file.
187
+ output_folder (str): Directory to save the output images.
188
+ dpi (int): Dots per inch (resolution) for conversion (default: 300).
189
+ fmt (str): Image format (default: 'jpeg'). Use 'png' if preferred.
190
+
191
+ Returns:
192
+ list: A list of file paths for the saved images.
193
+ """
194
+ import os
195
+
196
+ from lionagi.utils import check_import
197
+
198
+ convert_from_path = check_import(
199
+ "pdf2image", import_name="convert_from_path"
200
+ )
201
+
202
+ # Ensure the output folder exists
203
+ os.makedirs(output_folder, exist_ok=True)
204
+
205
+ # Convert PDF to a list of PIL Image objects
206
+ images = convert_from_path(pdf_path, dpi=dpi)
207
+
208
+ saved_paths = []
209
+ for i, image in enumerate(images):
210
+ # Construct the output file name
211
+ image_file = os.path.join(output_folder, f"page_{i + 1}.{fmt}")
212
+ image.save(image_file, fmt.upper())
213
+ saved_paths.append(image_file)
214
+
215
+ return saved_paths
216
+
217
+ @staticmethod
218
+ def dir_to_files(
219
+ directory: str | Path,
220
+ file_types: list[str] | None = None,
221
+ max_workers: int | None = None,
222
+ ignore_errors: bool = False,
223
+ verbose: bool = False,
224
+ recursive: bool = False,
225
+ ) -> list[Path]:
226
+ from .process import dir_to_files
227
+
228
+ return dir_to_files(
229
+ directory,
230
+ file_types=file_types,
231
+ max_workers=max_workers,
232
+ ignore_errors=ignore_errors,
233
+ verbose=verbose,
234
+ recursive=recursive,
235
+ )
236
+
237
+ @staticmethod
238
+ def file_to_chunks(
239
+ file_path: str | Path,
240
+ chunk_by: Literal["chars", "tokens"] = "chars",
241
+ chunk_size: int = 1500,
242
+ overlap: float = 0.1,
243
+ threshold: int = 200,
244
+ encoding: str = "utf-8",
245
+ custom_metadata: dict[str, Any] | None = None,
246
+ output_dir: str | Path | None = None,
247
+ verbose: bool = False,
248
+ timestamp: bool = True,
249
+ random_hash_digits: int = 4,
250
+ as_node: bool = False,
251
+ ) -> list[dict[str, Any]]:
252
+ from .file_ops import file_to_chunks
253
+
254
+ return file_to_chunks(
255
+ file_path,
256
+ chunk_by=chunk_by,
257
+ chunk_size=chunk_size,
258
+ overlap=overlap,
259
+ threshold=threshold,
260
+ encoding=encoding,
261
+ custom_metadata=custom_metadata,
262
+ output_dir=output_dir,
263
+ verbose=verbose,
264
+ timestamp=timestamp,
265
+ random_hash_digits=random_hash_digits,
266
+ as_node=as_node,
267
+ )
268
+
269
+ @staticmethod
270
+ def chunk(
271
+ *,
272
+ text: str | None = None,
273
+ url_or_path: str | Path = None,
274
+ file_types: list[str] | None = None, # only local files
275
+ recursive: bool = False, # only local files
276
+ tokenizer: Callable[[str], list[str]] = None,
277
+ chunk_by: Literal["chars", "tokens"] = "chars",
278
+ chunk_size: int = 1500,
279
+ overlap: float = 0.1,
280
+ threshold: int = 200,
281
+ output_file: str | Path | None = None,
282
+ metadata: dict[str, Any] | None = None,
283
+ reader_tool: Callable = None,
284
+ as_node: bool = False,
285
+ ) -> list:
286
+ from .process import chunk
287
+
288
+ return chunk(
289
+ text=text,
290
+ url_or_path=url_or_path,
291
+ file_types=file_types,
292
+ recursive=recursive,
293
+ tokenizer=tokenizer,
294
+ chunk_by=chunk_by,
295
+ chunk_size=chunk_size,
296
+ overlap=overlap,
297
+ threshold=threshold,
298
+ output_file=output_file,
299
+ metadata=metadata,
300
+ reader_tool=reader_tool,
301
+ as_node=as_node,
302
+ )
303
+
304
+ @staticmethod
305
+ def save_to_file(
306
+ text: str,
307
+ directory: str | Path,
308
+ filename: str,
309
+ extension: str = "txt",
310
+ timestamp: bool = True,
311
+ dir_exist_ok: bool = True,
312
+ file_exist_ok: bool = True,
313
+ time_prefix: bool = False,
314
+ timestamp_format: str = "%Y%m%d_%H%M%S",
315
+ random_hash_digits: int = 4,
316
+ verbose: bool = False,
317
+ ) -> Path:
318
+ from .save import save_to_file
319
+
320
+ return save_to_file(
321
+ text,
322
+ directory=directory,
323
+ filename=filename,
324
+ extension=extension,
325
+ timestamp=timestamp,
326
+ dir_exist_ok=dir_exist_ok,
327
+ file_exist_ok=file_exist_ok,
328
+ time_prefix=time_prefix,
329
+ timestamp_format=timestamp_format,
330
+ random_hash_digits=random_hash_digits,
331
+ verbose=verbose,
332
+ )
333
+
334
+ @staticmethod
335
+ def create_path(
336
+ directory: Path | str,
337
+ filename: str,
338
+ extension: str = None,
339
+ timestamp: bool = False,
340
+ dir_exist_ok: bool = True,
341
+ file_exist_ok: bool = False,
342
+ time_prefix: bool = False,
343
+ timestamp_format: str | None = None,
344
+ random_hash_digits: int = 0,
345
+ ) -> Path:
346
+ from .create_path import create_path
347
+
348
+ return create_path(
349
+ directory=directory,
350
+ filename=filename,
351
+ extension=extension,
352
+ timestamp=timestamp,
353
+ dir_exist_ok=dir_exist_ok,
354
+ file_exist_ok=file_exist_ok,
355
+ time_prefix=time_prefix,
356
+ timestamp_format=timestamp_format,
357
+ random_hash_digits=random_hash_digits,
358
+ )
@@ -7,7 +7,7 @@ import logging
7
7
  from pathlib import Path
8
8
  from typing import Any
9
9
 
10
- from lionagi.utils import create_path
10
+ from .create_path import create_path
11
11
 
12
12
 
13
13
  def save_to_file(