lionagi 0.14.8__tar.gz → 0.14.10__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 (317) hide show
  1. {lionagi-0.14.8 → lionagi-0.14.10}/PKG-INFO +6 -2
  2. {lionagi-0.14.8 → lionagi-0.14.10}/README.md +1 -1
  3. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/007_fan_out_in.py +35 -7
  4. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/claude_proxy/claude_code_proxy.py +2 -5
  5. lionagi-0.14.10/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +100 -0
  6. lionagi-0.14.10/lionagi/_errors.py +148 -0
  7. lionagi-0.14.10/lionagi/_types.py +3 -0
  8. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/config.py +3 -1
  9. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/reason.py +1 -1
  10. lionagi-0.14.10/lionagi/libs/concurrency/throttle.py +79 -0
  11. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/parse.py +2 -1
  12. lionagi-0.14.10/lionagi/libs/unstructured/pdf_to_image.py +45 -0
  13. lionagi-0.14.10/lionagi/libs/unstructured/read_image_to_base64.py +33 -0
  14. lionagi-0.14.10/lionagi/libs/validate/to_num.py +378 -0
  15. lionagi-0.14.10/lionagi/libs/validate/xml_parser.py +203 -0
  16. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/operable_model.py +8 -3
  17. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/flow.py +0 -1
  18. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/event.py +2 -0
  19. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/log.py +26 -10
  20. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/operatives/step.py +1 -1
  21. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/types.py +9 -1
  22. lionagi-0.14.8/lionagi/service/types.py → lionagi-0.14.10/lionagi/service/__init__.py +6 -4
  23. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/api_calling.py +57 -2
  24. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/endpoint_config.py +1 -1
  25. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/header_factory.py +4 -2
  26. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/match_endpoint.py +10 -10
  27. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/anthropic_.py +5 -2
  28. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/claude_code_.py +13 -17
  29. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/claude_code_cli.py +51 -16
  30. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/exa_.py +5 -3
  31. lionagi-0.14.10/lionagi/service/connections/providers/oai_.py +200 -0
  32. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/ollama_.py +38 -18
  33. lionagi-0.14.10/lionagi/service/connections/providers/perplexity_.py +51 -0
  34. lionagi-0.14.10/lionagi/service/connections/providers/types.py +30 -0
  35. lionagi-0.14.10/lionagi/service/hooks/__init__.py +25 -0
  36. lionagi-0.14.10/lionagi/service/hooks/_types.py +52 -0
  37. lionagi-0.14.10/lionagi/service/hooks/_utils.py +85 -0
  38. lionagi-0.14.10/lionagi/service/hooks/hook_event.py +67 -0
  39. lionagi-0.14.10/lionagi/service/hooks/hook_registry.py +221 -0
  40. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/imodel.py +120 -34
  41. lionagi-0.14.10/lionagi/service/third_party/__init__.py +0 -0
  42. lionagi-0.14.10/lionagi/service/third_party/claude_code.py +715 -0
  43. lionagi-0.14.10/lionagi/service/third_party/openai_model_names.py +198 -0
  44. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/third_party/pplx_models.py +16 -8
  45. lionagi-0.14.10/lionagi/service/types.py +41 -0
  46. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/session/branch.py +1 -4
  47. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/base.py +1 -3
  48. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/file/reader.py +1 -1
  49. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/memory/tools.py +2 -2
  50. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/utils.py +12 -775
  51. lionagi-0.14.10/lionagi/version.py +1 -0
  52. {lionagi-0.14.8 → lionagi-0.14.10}/pyproject.toml +10 -1
  53. lionagi-0.14.10/scripts/README.md +41 -0
  54. lionagi-0.14.10/scripts/update_openai_models.py +281 -0
  55. {lionagi-0.14.8 → lionagi-0.14.10}/uv.lock +54 -126
  56. lionagi-0.14.8/cookbooks/claude_proxy/run_w_claude_code_proxy.ipynb +0 -217
  57. lionagi-0.14.8/lionagi/_errors.py +0 -39
  58. lionagi-0.14.8/lionagi/_types.py +0 -9
  59. lionagi-0.14.8/lionagi/service/__init__.py +0 -1
  60. lionagi-0.14.8/lionagi/service/connections/providers/_claude_code/__init__.py +0 -3
  61. lionagi-0.14.8/lionagi/service/connections/providers/_claude_code/models.py +0 -244
  62. lionagi-0.14.8/lionagi/service/connections/providers/_claude_code/stream_cli.py +0 -359
  63. lionagi-0.14.8/lionagi/service/connections/providers/oai_.py +0 -165
  64. lionagi-0.14.8/lionagi/service/connections/providers/perplexity_.py +0 -29
  65. lionagi-0.14.8/lionagi/service/third_party/openai_models.py +0 -18241
  66. lionagi-0.14.8/lionagi/version.py +0 -1
  67. lionagi-0.14.8/scripts/README.md +0 -15
  68. {lionagi-0.14.8 → lionagi-0.14.10}/.coveragerc +0 -0
  69. {lionagi-0.14.8 → lionagi-0.14.10}/.env.example +0 -0
  70. {lionagi-0.14.8 → lionagi-0.14.10}/.github/FUNDING.yml +0 -0
  71. {lionagi-0.14.8 → lionagi-0.14.10}/.github/dependabot.yml +0 -0
  72. {lionagi-0.14.8 → lionagi-0.14.10}/.github/workflows/ci.yml +0 -0
  73. {lionagi-0.14.8 → lionagi-0.14.10}/.github/workflows/codeql.yml +0 -0
  74. {lionagi-0.14.8 → lionagi-0.14.10}/.github/workflows/docs.yml +0 -0
  75. {lionagi-0.14.8 → lionagi-0.14.10}/.github/workflows/release.yml +0 -0
  76. {lionagi-0.14.8 → lionagi-0.14.10}/.gitignore +0 -0
  77. {lionagi-0.14.8 → lionagi-0.14.10}/.pre-commit-config.yaml +0 -0
  78. {lionagi-0.14.8 → lionagi-0.14.10}/.python-version +0 -0
  79. {lionagi-0.14.8 → lionagi-0.14.10}/CODE_OF_CONDUCT.md +0 -0
  80. {lionagi-0.14.8 → lionagi-0.14.10}/CONTRIBUTING.md +0 -0
  81. {lionagi-0.14.8 → lionagi-0.14.10}/LICENSE +0 -0
  82. {lionagi-0.14.8 → lionagi-0.14.10}/assets/operation_builder.gif +0 -0
  83. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/001_branch_converse.ipynb +0 -0
  84. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/002_branch_interact.ipynb +0 -0
  85. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/003_branch_info.ipynb +0 -0
  86. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/004_conversation_patterns.ipynb +0 -0
  87. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/005_react_basics.ipynb +0 -0
  88. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
  89. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/claude_proxy/README.md +0 -0
  90. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/data/002_comedian.json +0 -0
  91. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/data/002_critic.json +0 -0
  92. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/data/006_lion_proof_ch2.md +0 -0
  93. {lionagi-0.14.8 → lionagi-0.14.10}/cookbooks/using_claude_code.py +0 -0
  94. {lionagi-0.14.8 → lionagi-0.14.10}/docs/Makefile +0 -0
  95. {lionagi-0.14.8 → lionagi-0.14.10}/docs/_static/custom.css +0 -0
  96. {lionagi-0.14.8 → lionagi-0.14.10}/docs/_templates/layout.html +0 -0
  97. {lionagi-0.14.8 → lionagi-0.14.10}/docs/conf.py +0 -0
  98. {lionagi-0.14.8 → lionagi-0.14.10}/docs/discussions/anyio-migration.md +0 -0
  99. {lionagi-0.14.8 → lionagi-0.14.10}/docs/index.rst +0 -0
  100. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/action.rst +0 -0
  101. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/adapter.rst +0 -0
  102. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/branch.rst +0 -0
  103. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/branch_operations.rst +0 -0
  104. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/concepts.rst +0 -0
  105. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/element_id.rst +0 -0
  106. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/event.rst +0 -0
  107. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/form.rst +0 -0
  108. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/graph.rst +0 -0
  109. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/index.rst +0 -0
  110. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/instruct.rst +0 -0
  111. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_file.rst +0 -0
  112. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_nested.rst +0 -0
  113. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_package.rst +0 -0
  114. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_schema.rst +0 -0
  115. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/lib_validate.rst +0 -0
  116. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/log.rst +0 -0
  117. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/mail.rst +0 -0
  118. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/message.rst +0 -0
  119. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/models.rst +0 -0
  120. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/operative_step.rst +0 -0
  121. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/pile.rst +0 -0
  122. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/processor.rst +0 -0
  123. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/progression.rst +0 -0
  124. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/service.rst +0 -0
  125. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/session.rst +0 -0
  126. {lionagi-0.14.8 → lionagi-0.14.10}/docs/modules/utils.rst +0 -0
  127. {lionagi-0.14.8 → lionagi-0.14.10}/docs/tutorials/get_started.rst +0 -0
  128. {lionagi-0.14.8 → lionagi-0.14.10}/docs/tutorials/get_started_pt2.rst +0 -0
  129. {lionagi-0.14.8 → lionagi-0.14.10}/docs/tutorials/get_started_pt3.rst +0 -0
  130. {lionagi-0.14.8 → lionagi-0.14.10}/docs/tutorials/index.rst +0 -0
  131. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/__init__.py +0 -0
  132. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/_class_registry.py +0 -0
  133. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/adapters/__init__.py +0 -0
  134. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/adapters/async_postgres_adapter.py +0 -0
  135. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/adapters/postgres_model_adapter.py +0 -0
  136. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/__init__.py +0 -0
  137. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/action.py +0 -0
  138. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/base.py +0 -0
  139. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/code.py +0 -0
  140. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/file.py +0 -0
  141. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/instruct.py +0 -0
  142. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/fields/research.py +0 -0
  143. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/__init__.py +0 -0
  144. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/__init__.py +0 -0
  145. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/cancel.py +0 -0
  146. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/errors.py +0 -0
  147. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/patterns.py +0 -0
  148. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/primitives.py +0 -0
  149. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/resource_tracker.py +0 -0
  150. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/concurrency/task.py +0 -0
  151. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/__init__.py +0 -0
  152. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/chunk.py +0 -0
  153. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/concat.py +0 -0
  154. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/concat_files.py +0 -0
  155. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/file_ops.py +0 -0
  156. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/params.py +0 -0
  157. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/process.py +0 -0
  158. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/file/save.py +0 -0
  159. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/hash/__init__.py +0 -0
  160. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/hash/hash_dict.py +0 -0
  161. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/hash/manager.py +0 -0
  162. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/__init__.py +0 -0
  163. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/flatten.py +0 -0
  164. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/nfilter.py +0 -0
  165. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/nget.py +0 -0
  166. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/ninsert.py +0 -0
  167. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/nmerge.py +0 -0
  168. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/npop.py +0 -0
  169. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/nset.py +0 -0
  170. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/unflatten.py +0 -0
  171. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/nested/utils.py +0 -0
  172. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/__init__.py +0 -0
  173. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/imports.py +0 -0
  174. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/management.py +0 -0
  175. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/params.py +0 -0
  176. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/package/system.py +0 -0
  177. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/__init__.py +0 -0
  178. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/as_readable.py +0 -0
  179. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/extract_code_block.py +0 -0
  180. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/extract_docstring.py +0 -0
  181. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/function_to_schema.py +0 -0
  182. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/json_schema.py +0 -0
  183. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
  184. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/__init__.py +0 -0
  185. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/base.py +0 -0
  186. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/llmlingua.py +0 -0
  187. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/perplexity.py +0 -0
  188. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/symbolic_compress_context.py +0 -0
  189. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang.py +0 -0
  190. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/base.py +0 -0
  191. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/abstract_algebra.toml +0 -0
  192. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/category_theory.toml +0 -0
  193. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/complex_analysis.toml +0 -0
  194. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/framework_options.json +0 -0
  195. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/group_theory.toml +0 -0
  196. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/math_logic.toml +0 -0
  197. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/reflective_patterns.toml +0 -0
  198. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/set_theory.toml +0 -0
  199. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/frameworks/topology_fundamentals.toml +0 -0
  200. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/mapping/lion_emoji_mapping.toml +0 -0
  201. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/mapping/python_math_mapping.toml +0 -0
  202. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/mapping/rust_chinese_mapping.toml +0 -0
  203. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/resources/utility/base_synthlang_system_prompt.toml +0 -0
  204. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/synthlang_/translate_to_synthlang.py +0 -0
  205. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/token_transform/types.py +0 -0
  206. {lionagi-0.14.8/lionagi/operations/communicate → lionagi-0.14.10/lionagi/libs/unstructured}/__init__.py +0 -0
  207. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/__init__.py +0 -0
  208. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/common_field_validators.py +0 -0
  209. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/fuzzy_match_keys.py +0 -0
  210. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/fuzzy_validate_mapping.py +0 -0
  211. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/string_similarity.py +0 -0
  212. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/libs/validate/validate_boolean.py +0 -0
  213. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/__init__.py +0 -0
  214. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/field_model.py +0 -0
  215. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/hashable_model.py +0 -0
  216. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/model_params.py +0 -0
  217. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/note.py +0 -0
  218. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/models/schema_model.py +0 -0
  219. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/ReAct/ReAct.py +0 -0
  220. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/ReAct/__init__.py +0 -0
  221. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/ReAct/utils.py +0 -0
  222. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/__init__.py +0 -0
  223. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/_act/__init__.py +0 -0
  224. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/_act/act.py +0 -0
  225. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/brainstorm/__init__.py +0 -0
  226. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/brainstorm/brainstorm.py +0 -0
  227. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/brainstorm/prompt.py +0 -0
  228. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/builder.py +0 -0
  229. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/chat/__init__.py +0 -0
  230. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/chat/chat.py +0 -0
  231. {lionagi-0.14.8/lionagi/operations/translate → lionagi-0.14.10/lionagi/operations/communicate}/__init__.py +0 -0
  232. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/communicate/communicate.py +0 -0
  233. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/instruct/__init__.py +0 -0
  234. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/instruct/instruct.py +0 -0
  235. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/interpret/__init__.py +0 -0
  236. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/interpret/interpret.py +0 -0
  237. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/manager.py +0 -0
  238. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/node.py +0 -0
  239. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/operate/__init__.py +0 -0
  240. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/operate/operate.py +0 -0
  241. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/parse/__init__.py +0 -0
  242. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/parse/parse.py +0 -0
  243. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/plan/__init__.py +0 -0
  244. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/plan/plan.py +0 -0
  245. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/plan/prompt.py +0 -0
  246. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/select/__init__.py +0 -0
  247. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/select/select.py +0 -0
  248. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/select/utils.py +0 -0
  249. {lionagi-0.14.8/lionagi/service/third_party → lionagi-0.14.10/lionagi/operations/translate}/__init__.py +0 -0
  250. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/translate/translate.py +0 -0
  251. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/types.py +0 -0
  252. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/operations/utils.py +0 -0
  253. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/__init__.py +0 -0
  254. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/_concepts.py +0 -0
  255. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/action/__init__.py +0 -0
  256. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/action/function_calling.py +0 -0
  257. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/action/manager.py +0 -0
  258. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/action/tool.py +0 -0
  259. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/__init__.py +0 -0
  260. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/base.py +0 -0
  261. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/flow.py +0 -0
  262. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/form.py +0 -0
  263. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/forms/report.py +0 -0
  264. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/__init__.py +0 -0
  265. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/element.py +0 -0
  266. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/pile.py +0 -0
  267. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/processor.py +0 -0
  268. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/generic/progression.py +0 -0
  269. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/graph/__init__.py +0 -0
  270. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/graph/edge.py +0 -0
  271. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/graph/graph.py +0 -0
  272. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/graph/node.py +0 -0
  273. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/__init__.py +0 -0
  274. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/exchange.py +0 -0
  275. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/mail.py +0 -0
  276. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/mailbox.py +0 -0
  277. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/manager.py +0 -0
  278. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/mail/package.py +0 -0
  279. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/__init__.py +0 -0
  280. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/action_request.py +0 -0
  281. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/action_response.py +0 -0
  282. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/assistant_response.py +0 -0
  283. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/base.py +0 -0
  284. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/instruction.py +0 -0
  285. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/manager.py +0 -0
  286. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/message.py +0 -0
  287. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/system.py +0 -0
  288. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/README.md +0 -0
  289. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
  290. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
  291. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
  292. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
  293. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
  294. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
  295. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/operatives/__init__.py +0 -0
  296. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/protocols/operatives/operative.py +0 -0
  297. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/py.typed +0 -0
  298. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/__init__.py +0 -0
  299. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/endpoint.py +0 -0
  300. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/connections/providers/__init__.py +0 -0
  301. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/manager.py +0 -0
  302. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/rate_limited_processor.py +0 -0
  303. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/resilience.py +0 -0
  304. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/third_party/README.md +0 -0
  305. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/third_party/anthropic_models.py +0 -0
  306. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/third_party/exa_models.py +0 -0
  307. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/service/token_calculator.py +0 -0
  308. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/session/__init__.py +0 -0
  309. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/session/prompts.py +0 -0
  310. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/session/session.py +0 -0
  311. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/settings.py +0 -0
  312. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/__init__.py +0 -0
  313. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/file/__init__.py +0 -0
  314. {lionagi-0.14.8 → lionagi-0.14.10}/lionagi/tools/types.py +0 -0
  315. {lionagi-0.14.8 → lionagi-0.14.10}/main.py +0 -0
  316. {lionagi-0.14.8 → lionagi-0.14.10}/scripts/concat.py +0 -0
  317. {lionagi-0.14.8 → lionagi-0.14.10}/scripts/config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.14.8
3
+ Version: 0.14.10
4
4
  Summary: An Intelligence Operating System.
5
5
  Author-email: HaiyangLi <quantocean.li@gmail.com>, Liangbingyan Luo <llby_luo@outlook.com>
6
6
  License: Apache License
@@ -264,6 +264,10 @@ Provides-Extra: sqlite
264
264
  Requires-Dist: aiosqlite>=0.21.0; extra == 'sqlite'
265
265
  Provides-Extra: tools
266
266
  Requires-Dist: docling>=2.15.0; extra == 'tools'
267
+ Provides-Extra: unstructured
268
+ Requires-Dist: opencv-python>=4.2.0.34; extra == 'unstructured'
269
+ Provides-Extra: xml
270
+ Requires-Dist: xmltodict>=0.12.0; extra == 'xml'
267
271
  Description-Content-Type: text/markdown
268
272
 
269
273
  ![PyPI - Version](https://img.shields.io/pypi/v/lionagi?labelColor=233476aa&color=231fc935)
@@ -272,7 +276,7 @@ Description-Content-Type: text/markdown
272
276
 
273
277
  [Documentation](https://lion-agi.github.io/lionagi/) |
274
278
  [Discord](https://discord.gg/JDj9ENhUE8) |
275
- [PyPI](https://pypi.org/project/lionagi/) |
279
+ [PyPI](https://pypi.org/project/lionagi/)
276
280
 
277
281
  # LION - Language InterOperable Network
278
282
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  [Documentation](https://lion-agi.github.io/lionagi/) |
6
6
  [Discord](https://discord.gg/JDj9ENhUE8) |
7
- [PyPI](https://pypi.org/project/lionagi/) |
7
+ [PyPI](https://pypi.org/project/lionagi/)
8
8
 
9
9
  # LION - Language InterOperable Network
10
10
 
@@ -1,5 +1,6 @@
1
- from lionagi import Branch, Builder, Session, iModel
1
+ from lionagi import Branch, Builder, Operation, Session, iModel
2
2
  from lionagi.fields import LIST_INSTRUCT_FIELD_MODEL, Instruct
3
+ from lionagi.protocols.types import AssistantResponse
3
4
 
4
5
  CC_WORKSPACE = ".khive/workspace"
5
6
 
@@ -15,7 +16,6 @@ def create_cc(
15
16
  provider="claude_code",
16
17
  endpoint="query_cli",
17
18
  model=model,
18
- api_key="dummy_api_key",
19
19
  ws=f"{CC_WORKSPACE}/{subdir}",
20
20
  verbose_output=verbose_output,
21
21
  add_dir="../../../",
@@ -26,7 +26,7 @@ def create_cc(
26
26
 
27
27
 
28
28
  prompt = """
29
- Task: Investigate the codebase in the specified directory and provide a comprehensive overview.
29
+ Task: Quickly Investigate the codebase in the specified directory and provide a comprehensive overview.
30
30
 
31
31
  ---START
32
32
  read into the specified dir, glance over the key components and pay attention to architecture,
@@ -86,16 +86,44 @@ async def main():
86
86
  )
87
87
  research_nodes.append(node)
88
88
 
89
- synthesis = builder.add_aggregation(
89
+ costs = 0
90
+
91
+ def get_context(node_id):
92
+ nonlocal costs
93
+ g = builder.get_graph()
94
+ node: Operation = g.internal_nodes[node_id]
95
+ branch = session.get_branch(node.branch_id, None)
96
+ if (
97
+ branch
98
+ and len(branch.messages) > 0
99
+ and isinstance(msg := branch.messages[-1], AssistantResponse)
100
+ ):
101
+ costs += msg.model_response.get("total_cost_usd") or 0
102
+ return f"""
103
+ Response: {msg.model_response.get("result") or "Not available"}
104
+ Summary: {msg.model_response.get("summary") or "Not available"}
105
+ """.strip()
106
+
107
+ await session.flow(builder.get_graph())
108
+ ctx = [get_context(i) for i in research_nodes]
109
+
110
+ synthesis = builder.add_operation(
90
111
  "communicate",
91
- source_node_ids=research_nodes,
112
+ depends_on=research_nodes,
92
113
  branch=orc_branch,
93
114
  instruction="Synthesize the information from the researcher branches.",
115
+ context=[i for i in ctx if i is not None],
116
+ )
117
+
118
+ result3 = await session.flow(builder.get_graph())
119
+ result_synthesis = result3["operation_results"][synthesis]
120
+
121
+ builder.visualize(
122
+ "LionAGI codebase investigation: fan-out fan-in pattern with Claude Code"
94
123
  )
95
124
 
96
- result2 = await session.flow(builder.get_graph())
97
- result_synthesis = result2["operation_results"][synthesis]
98
125
  print(result_synthesis)
126
+ print(f"Flow total cost: ${costs:.4f}")
99
127
 
100
128
  except Exception as e:
101
129
  print(f"Error: {e}")
@@ -47,12 +47,10 @@ app = FastAPI(
47
47
  def check_claude_code():
48
48
  """Verify Claude Code CLI is installed and accessible"""
49
49
  try:
50
- from lionagi.service.connections.providers._claude_code.stream_cli import (
51
- CLAUDE,
52
- )
50
+ from lionagi.service.third_party.claude_code import CLAUDE_CLI
53
51
 
54
52
  result = subprocess.run(
55
- [CLAUDE, "--version"], capture_output=True, text=True
53
+ [CLAUDE_CLI, "--version"], capture_output=True, text=True
56
54
  )
57
55
  if result.returncode != 0:
58
56
  raise RuntimeError(
@@ -75,7 +73,6 @@ async def health_check():
75
73
 
76
74
  @app.post("/v1/query")
77
75
  async def query(request: ClaudeCodeRequest):
78
-
79
76
  endpoint = ClaudeCodeCLIEndpoint()
80
77
  try:
81
78
  return await endpoint._call(payload={"request": request}, headers={})
@@ -0,0 +1,100 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "id": "d2ceb407",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "from lionagi.service.connections.endpoint_config import EndpointConfig\n",
11
+ "from lionagi.service.imodel import Endpoint\n",
12
+ "from lionagi.service.connections.providers.claude_code_cli import (\n",
13
+ " ClaudeCodeRequest,\n",
14
+ ")\n",
15
+ "\n",
16
+ "claude_code_config = EndpointConfig(\n",
17
+ " name=\"claude_code_cli_proxy\",\n",
18
+ " provider=\"claude_code\",\n",
19
+ " base_url=\"http://localhost:8000/v1\",\n",
20
+ " endpoint=\"query\",\n",
21
+ " api_key=\"dummy_api_key\",\n",
22
+ " kwargs={\"model\": \"sonnet\"},\n",
23
+ ")\n",
24
+ "claude_code = Endpoint(claude_code_config)"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": null,
30
+ "id": "5fc216f4",
31
+ "metadata": {},
32
+ "outputs": [],
33
+ "source": [
34
+ "# prompt = \"reply in text only, Write a Python function to calculate the factorial of a number.\"\n",
35
+ "\n",
36
+ "# await claude_code.call(request=ClaudeCodeRequest(prompt=prompt))"
37
+ ]
38
+ },
39
+ {
40
+ "cell_type": "code",
41
+ "execution_count": null,
42
+ "id": "4c173814",
43
+ "metadata": {},
44
+ "outputs": [],
45
+ "source": [
46
+ "from lionagi import iModel\n",
47
+ "\n",
48
+ "claude_code = iModel(endpoint=claude_code)"
49
+ ]
50
+ },
51
+ {
52
+ "cell_type": "code",
53
+ "execution_count": null,
54
+ "id": "fe6dcca4",
55
+ "metadata": {},
56
+ "outputs": [],
57
+ "source": [
58
+ "result = await claude_code.invoke(\n",
59
+ " messages=[\n",
60
+ " {\n",
61
+ " \"role\": \"user\",\n",
62
+ " \"content\": \"reply in text only, Write a Python function to calculate the factorial of a number.\",\n",
63
+ " }\n",
64
+ " ]\n",
65
+ ")"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "code",
70
+ "execution_count": null,
71
+ "id": "88db9e9a",
72
+ "metadata": {},
73
+ "outputs": [],
74
+ "source": [
75
+ "result.response"
76
+ ]
77
+ }
78
+ ],
79
+ "metadata": {
80
+ "kernelspec": {
81
+ "display_name": "lionagi",
82
+ "language": "python",
83
+ "name": "python3"
84
+ },
85
+ "language_info": {
86
+ "codemirror_mode": {
87
+ "name": "ipython",
88
+ "version": 3
89
+ },
90
+ "file_extension": ".py",
91
+ "mimetype": "text/x-python",
92
+ "name": "python",
93
+ "nbconvert_exporter": "python",
94
+ "pygments_lexer": "ipython3",
95
+ "version": "3.10.15"
96
+ }
97
+ },
98
+ "nbformat": 4,
99
+ "nbformat_minor": 5
100
+ }
@@ -0,0 +1,148 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import Any, ClassVar
8
+
9
+ __all__ = (
10
+ "LionError",
11
+ "ValidationError",
12
+ "NotFoundError",
13
+ "ExistsError",
14
+ "ObservationError",
15
+ "ResourceError",
16
+ "RateLimitError",
17
+ "IDError",
18
+ "RelationError",
19
+ "OperationError",
20
+ "ExecutionError",
21
+ "ItemNotFoundError",
22
+ "ItemExistsError",
23
+ )
24
+
25
+
26
+ class LionError(Exception):
27
+ default_message: ClassVar[str] = "LionAGI error"
28
+ default_status_code: ClassVar[int] = 500
29
+ __slots__ = ("message", "details", "status_code")
30
+
31
+ def __init__(
32
+ self,
33
+ message: str | None = None,
34
+ *,
35
+ details: dict[str, Any] | None = None,
36
+ status_code: int | None = None,
37
+ cause: Exception | None = None,
38
+ ):
39
+ super().__init__(message or self.default_message)
40
+ if cause:
41
+ self.__cause__ = cause # preserves traceback
42
+ self.message = message or self.default_message
43
+ self.details = details or {}
44
+ self.status_code = status_code or type(self).default_status_code
45
+
46
+ def to_dict(self, *, include_cause: bool = False) -> dict[str, Any]:
47
+ data = {
48
+ "error": self.__class__.__name__,
49
+ "message": self.message,
50
+ "status_code": self.status_code,
51
+ **({"details": self.details} if self.details else {}),
52
+ }
53
+ if include_cause and (cause := self.get_cause()):
54
+ data["cause"] = repr(cause)
55
+ return data
56
+
57
+ def get_cause(self) -> Exception | None:
58
+ """Get the cause of this error, if any."""
59
+ return self.__cause__ if hasattr(self, "__cause__") else None
60
+
61
+ @classmethod
62
+ def from_value(
63
+ cls,
64
+ value: Any,
65
+ *,
66
+ expected: str | None = None,
67
+ message: str | None = None,
68
+ cause: Exception | None = None,
69
+ **extra: Any,
70
+ ):
71
+ """Create a ValidationError from a value with optional expected type and message."""
72
+ details = {
73
+ "value": value,
74
+ "type": type(value).__name__,
75
+ **({"expected": expected} if expected else {}),
76
+ **extra,
77
+ }
78
+ return cls(message=message, details=details, cause=cause)
79
+
80
+
81
+ class ValidationError(LionError):
82
+ """Exception raised when validation fails."""
83
+
84
+ default_message = "Validation failed"
85
+ default_status_code = 422
86
+ __slots__ = ()
87
+
88
+
89
+ class NotFoundError(LionError):
90
+ """Exception raised when an item is not found."""
91
+
92
+ default_message = "Item not found"
93
+ default_status_code = 404
94
+ __slots__ = ()
95
+
96
+
97
+ class ExistsError(LionError):
98
+ """Exception raised when an item already exists."""
99
+
100
+ default_message = "Item already exists"
101
+ default_status_code = 409
102
+ __slots__ = ()
103
+
104
+
105
+ class ObservationError(LionError):
106
+ """Exception raised when an observation fails."""
107
+
108
+ default_message = "Observation failed"
109
+ default_status_code = 500
110
+ __slots__ = ()
111
+
112
+
113
+ class ResourceError(LionError):
114
+ """Exception raised when resource access fails."""
115
+
116
+ default_message = "Resource error"
117
+ default_status_code = 429
118
+ __slots__ = ()
119
+
120
+
121
+ class RateLimitError(LionError):
122
+ __slots__ = ("retry_after",) # one extra attr
123
+ default_message = "Rate limit exceeded"
124
+ default_status_code = 429
125
+
126
+ def __init__(self, retry_after: float, **kw):
127
+ super().__init__(**kw)
128
+ object.__setattr__(self, "retry_after", retry_after)
129
+
130
+
131
+ class IDError(LionError):
132
+ pass
133
+
134
+
135
+ class RelationError(LionError):
136
+ pass
137
+
138
+
139
+ class OperationError(LionError):
140
+ pass
141
+
142
+
143
+ class ExecutionError(LionError):
144
+ pass
145
+
146
+
147
+ ItemNotFoundError = NotFoundError
148
+ ItemExistsError = ExistsError
@@ -0,0 +1,3 @@
1
+ from .fields import *
2
+ from .models import *
3
+ from .protocols.types import *
@@ -63,12 +63,14 @@ class AppSettings(BaseSettings, frozen=True):
63
63
  GROQ_API_KEY: SecretStr | None = None
64
64
  ANTHROPIC_API_KEY: SecretStr | None = None
65
65
 
66
+ OPENAI_DEFAULT_MODEL: str = "gpt-4.1-mini"
67
+
66
68
  # defaults models
67
69
  LIONAGI_EMBEDDING_PROVIDER: str = "openai"
68
70
  LIONAGI_EMBEDDING_MODEL: str = "text-embedding-3-small"
69
71
 
70
72
  LIONAGI_CHAT_PROVIDER: str = "openai"
71
- LIONAGI_CHAT_MODEL: str = "gpt-4.1-nano"
73
+ LIONAGI_CHAT_MODEL: str = "gpt-4.1-mini"
72
74
 
73
75
  # default storage
74
76
  LIONAGI_AUTO_STORE_EVENT: bool = False
@@ -4,8 +4,8 @@
4
4
 
5
5
  from pydantic import Field, field_validator
6
6
 
7
+ from lionagi.libs.validate.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
 
@@ -0,0 +1,79 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import functools
5
+ from time import sleep, time
6
+ from typing import Any, Callable, TypeVar
7
+
8
+ T = TypeVar("T")
9
+
10
+
11
+ __all__ = ("Throttle",)
12
+
13
+
14
+ class Throttle:
15
+ """
16
+ Provide a throttling mechanism for function calls.
17
+
18
+ When used as a decorator, it ensures that the decorated function can only
19
+ be called once per specified period. Subsequent calls within this period
20
+ are delayed to enforce this constraint.
21
+
22
+ Attributes:
23
+ period: The minimum time period (in seconds) between successive calls.
24
+ """
25
+
26
+ def __init__(self, period: float) -> None:
27
+ """
28
+ Initialize a new instance of Throttle.
29
+
30
+ Args:
31
+ period: The minimum time period (in seconds) between
32
+ successive calls.
33
+ """
34
+ self.period = period
35
+ self.last_called = 0
36
+
37
+ def __call__(self, func: Callable[..., T]) -> Callable[..., T]:
38
+ """
39
+ Decorate a synchronous function with the throttling mechanism.
40
+
41
+ Args:
42
+ func: The synchronous function to be throttled.
43
+
44
+ Returns:
45
+ The throttled synchronous function.
46
+ """
47
+
48
+ @functools.wraps(func)
49
+ def wrapper(*args, **kwargs) -> Any:
50
+ elapsed = time() - self.last_called
51
+ if elapsed < self.period:
52
+ sleep(self.period - elapsed)
53
+ self.last_called = time()
54
+ return func(*args, **kwargs)
55
+
56
+ return wrapper
57
+
58
+ def __call_async__(
59
+ self, func: Callable[..., Callable[..., T]]
60
+ ) -> Callable[..., Callable[..., T]]:
61
+ """
62
+ Decorate an asynchronous function with the throttling mechanism.
63
+
64
+ Args:
65
+ func: The asynchronous function to be throttled.
66
+
67
+ Returns:
68
+ The throttled asynchronous function.
69
+ """
70
+
71
+ @functools.wraps(func)
72
+ async def wrapper(*args, **kwargs) -> Any:
73
+ elapsed = time() - self.last_called
74
+ if elapsed < self.period:
75
+ await asyncio.sleep(self.period - elapsed)
76
+ self.last_called = time()
77
+ return await func(*args, **kwargs)
78
+
79
+ return wrapper
@@ -8,7 +8,8 @@ from lionagi.libs.schema.function_to_schema import function_to_schema
8
8
  from lionagi.libs.validate.fuzzy_match_keys import fuzzy_match_keys
9
9
  from lionagi.libs.validate.fuzzy_validate_mapping import fuzzy_validate_mapping
10
10
  from lionagi.libs.validate.string_similarity import string_similarity
11
- from lionagi.utils import fuzzy_parse_json, to_dict, to_json, to_num
11
+ from lionagi.libs.validate.to_num import to_num
12
+ from lionagi.utils import fuzzy_parse_json, to_dict, to_json
12
13
 
13
14
  validate_keys = fuzzy_match_keys # for backward compatibility
14
15
  validate_mapping = fuzzy_validate_mapping # for backward compatibility
@@ -0,0 +1,45 @@
1
+ from lionagi.utils import check_import, is_import_installed
2
+
3
+ _HAS_PDF2IMAGE = is_import_installed("pdf2image")
4
+
5
+
6
+ def pdf_to_images(
7
+ pdf_path: str, output_folder: str, dpi: int = 300, fmt: str = "jpeg"
8
+ ) -> list:
9
+ """
10
+ Convert a PDF file into images, one image per page.
11
+
12
+ Args:
13
+ pdf_path (str): Path to the input PDF file.
14
+ output_folder (str): Directory to save the output images.
15
+ dpi (int): Dots per inch (resolution) for conversion (default: 300).
16
+ fmt (str): Image format (default: 'jpeg'). Use 'png' if preferred.
17
+
18
+ Returns:
19
+ list: A list of file paths for the saved images.
20
+ """
21
+ if not _HAS_PDF2IMAGE:
22
+ raise ModuleNotFoundError(
23
+ "pdf2image is not installed, please install it with `pip install lionagi[unstructured]`"
24
+ )
25
+
26
+ import os
27
+
28
+ convert_from_path = check_import(
29
+ "pdf2image", import_name="convert_from_path"
30
+ )
31
+
32
+ # Ensure the output folder exists
33
+ os.makedirs(output_folder, exist_ok=True)
34
+
35
+ # Convert PDF to a list of PIL Image objects
36
+ images = convert_from_path(pdf_path, dpi=dpi)
37
+
38
+ saved_paths = []
39
+ for i, image in enumerate(images):
40
+ # Construct the output file name
41
+ image_file = os.path.join(output_folder, f"page_{i + 1}.{fmt}")
42
+ image.save(image_file, fmt.upper())
43
+ saved_paths.append(image_file)
44
+
45
+ return saved_paths
@@ -0,0 +1,33 @@
1
+ from pathlib import Path
2
+
3
+ from lionagi.utils import is_import_installed
4
+
5
+ _HAS_OPENCV = is_import_installed("cv2")
6
+
7
+
8
+ __all__ = ("read_image_to_base64",)
9
+
10
+
11
+ def read_image_to_base64(image_path: str | Path) -> str:
12
+ if not _HAS_OPENCV:
13
+ raise ModuleNotFoundError(
14
+ "OpenCV is not installed, please install it with `pip install lionagi[unstructured]`"
15
+ )
16
+
17
+ import base64
18
+
19
+ import cv2
20
+
21
+ image_path = str(image_path)
22
+ image = cv2.imread(image_path, cv2.COLOR_BGR2RGB)
23
+
24
+ if image is None:
25
+ raise ValueError(f"Could not read image from path: {image_path}")
26
+
27
+ file_extension = "." + image_path.split(".")[-1]
28
+
29
+ success, buffer = cv2.imencode(file_extension, image)
30
+ if not success:
31
+ raise ValueError(f"Could not encode image to {file_extension} format.")
32
+ encoded_image = base64.b64encode(buffer).decode("utf-8")
33
+ return encoded_image