lionagi 0.17.3__tar.gz → 0.17.5__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 (321) hide show
  1. {lionagi-0.17.3 → lionagi-0.17.5}/PKG-INFO +30 -3
  2. {lionagi-0.17.3 → lionagi-0.17.5}/README.md +29 -2
  3. lionagi-0.17.5/lionagi/__init__.py +96 -0
  4. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/_async_call.py +13 -2
  5. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/_hash.py +12 -2
  6. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/_to_list.py +23 -12
  7. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/fuzzy/_fuzzy_validate.py +6 -4
  8. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/action/manager.py +0 -2
  9. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/api_calling.py +1 -5
  10. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/mcp/wrapper.py +8 -15
  11. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/utils.py +0 -8
  12. lionagi-0.17.5/lionagi/version.py +1 -0
  13. {lionagi-0.17.3 → lionagi-0.17.5}/pyproject.toml +1 -1
  14. {lionagi-0.17.3 → lionagi-0.17.5}/uv.lock +1936 -1761
  15. lionagi-0.17.3/lionagi/__init__.py +0 -54
  16. lionagi-0.17.3/lionagi/version.py +0 -1
  17. {lionagi-0.17.3 → lionagi-0.17.5}/.coveragerc +0 -0
  18. {lionagi-0.17.3 → lionagi-0.17.5}/.env.example +0 -0
  19. {lionagi-0.17.3 → lionagi-0.17.5}/.github/FUNDING.yml +0 -0
  20. {lionagi-0.17.3 → lionagi-0.17.5}/.github/dependabot.yml +0 -0
  21. {lionagi-0.17.3 → lionagi-0.17.5}/.github/workflows/benchmarks.yml +0 -0
  22. {lionagi-0.17.3 → lionagi-0.17.5}/.github/workflows/ci.yml +0 -0
  23. {lionagi-0.17.3 → lionagi-0.17.5}/.github/workflows/codeql.yml +0 -0
  24. {lionagi-0.17.3 → lionagi-0.17.5}/.github/workflows/docs-deploy.yml +0 -0
  25. {lionagi-0.17.3 → lionagi-0.17.5}/.github/workflows/refresh-bench-baselines.yml +0 -0
  26. {lionagi-0.17.3 → lionagi-0.17.5}/.github/workflows/release.yml +0 -0
  27. {lionagi-0.17.3 → lionagi-0.17.5}/.gitignore +0 -0
  28. {lionagi-0.17.3 → lionagi-0.17.5}/.pre-commit-config.yaml +0 -0
  29. {lionagi-0.17.3 → lionagi-0.17.5}/.python-version +0 -0
  30. {lionagi-0.17.3 → lionagi-0.17.5}/CODE_OF_CONDUCT.md +0 -0
  31. {lionagi-0.17.3 → lionagi-0.17.5}/CONTRIBUTING.md +0 -0
  32. {lionagi-0.17.3 → lionagi-0.17.5}/LICENSE +0 -0
  33. {lionagi-0.17.3 → lionagi-0.17.5}/assets/operation_builder.gif +0 -0
  34. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/README.md +0 -0
  35. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/baselines/.gitkeep +0 -0
  36. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/baselines/concurrency-asyncio.json +0 -0
  37. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/baselines/concurrency-trio.json +0 -0
  38. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/baselines/fuzzy.json +0 -0
  39. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/baselines/ln-asyncio.json +0 -0
  40. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/baselines/ln-trio.json +0 -0
  41. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/ci_compare.py +0 -0
  42. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/concurrency_bench.py +0 -0
  43. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/fuzzy_bench.py +0 -0
  44. {lionagi-0.17.3 → lionagi-0.17.5}/benchmarks/ln_bench.py +0 -0
  45. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/001_branch_converse.ipynb +0 -0
  46. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/002_branch_interact.ipynb +0 -0
  47. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/003_branch_info.ipynb +0 -0
  48. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/004_conversation_patterns.ipynb +0 -0
  49. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/005_react_basics.ipynb +0 -0
  50. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/006_operation_graphs_claim_extraction.ipynb +0 -0
  51. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/007_fan_out_in.py +0 -0
  52. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/data/002_comedian.json +0 -0
  53. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/data/002_critic.json +0 -0
  54. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/data/006_lion_proof_ch2.md +0 -0
  55. {lionagi-0.17.3/cookbooks → lionagi-0.17.5/cookbooks/using_claude_code}/claude_proxy/README.md +0 -0
  56. {lionagi-0.17.3/cookbooks → lionagi-0.17.5/cookbooks/using_claude_code}/claude_proxy/claude_code_proxy.py +0 -0
  57. {lionagi-0.17.3/cookbooks → lionagi-0.17.5/cookbooks/using_claude_code}/claude_proxy/run_w_claude_code_proxy.ipynb +0 -0
  58. {lionagi-0.17.3/cookbooks → lionagi-0.17.5/cookbooks/using_claude_code}/using_claude_code.py +0 -0
  59. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/using_mcp/.mcp.json +0 -0
  60. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/using_mcp/README.md +0 -0
  61. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/using_mcp/react_mcp_with_schema.py +0 -0
  62. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/using_mcp/search_group.py +0 -0
  63. {lionagi-0.17.3 → lionagi-0.17.5}/cookbooks/using_mcp/search_group_config.json +0 -0
  64. {lionagi-0.17.3 → lionagi-0.17.5}/docs/DOCUMENTATION_STANDARDS.md +0 -0
  65. {lionagi-0.17.3 → lionagi-0.17.5}/docs/advanced/custom-operations.md +0 -0
  66. {lionagi-0.17.3 → lionagi-0.17.5}/docs/advanced/error-handling.md +0 -0
  67. {lionagi-0.17.3 → lionagi-0.17.5}/docs/advanced/flow-composition.md +0 -0
  68. {lionagi-0.17.3 → lionagi-0.17.5}/docs/advanced/index.md +0 -0
  69. {lionagi-0.17.3 → lionagi-0.17.5}/docs/advanced/observability.md +0 -0
  70. {lionagi-0.17.3 → lionagi-0.17.5}/docs/advanced/performance.md +0 -0
  71. {lionagi-0.17.3 → lionagi-0.17.5}/docs/code-of-conduct.md +0 -0
  72. {lionagi-0.17.3 → lionagi-0.17.5}/docs/comparisons/langgraph.md +0 -0
  73. {lionagi-0.17.3 → lionagi-0.17.5}/docs/contributing.md +0 -0
  74. {lionagi-0.17.3 → lionagi-0.17.5}/docs/cookbook/brainstorming.md +0 -0
  75. {lionagi-0.17.3 → lionagi-0.17.5}/docs/cookbook/claim-extraction.md +0 -0
  76. {lionagi-0.17.3 → lionagi-0.17.5}/docs/cookbook/code-review-crew.md +0 -0
  77. {lionagi-0.17.3 → lionagi-0.17.5}/docs/cookbook/data-persistence.md +0 -0
  78. {lionagi-0.17.3 → lionagi-0.17.5}/docs/cookbook/hr-automation.md +0 -0
  79. {lionagi-0.17.3 → lionagi-0.17.5}/docs/cookbook/index.md +0 -0
  80. {lionagi-0.17.3 → lionagi-0.17.5}/docs/cookbook/research-synthesis.md +0 -0
  81. {lionagi-0.17.3 → lionagi-0.17.5}/docs/core-concepts/index.md +0 -0
  82. {lionagi-0.17.3 → lionagi-0.17.5}/docs/core-concepts/lionagi-philosophy.md +0 -0
  83. {lionagi-0.17.3 → lionagi-0.17.5}/docs/core-concepts/messages-and-memory.md +0 -0
  84. {lionagi-0.17.3 → lionagi-0.17.5}/docs/core-concepts/models-and-providers.md +0 -0
  85. {lionagi-0.17.3 → lionagi-0.17.5}/docs/core-concepts/operations.md +0 -0
  86. {lionagi-0.17.3 → lionagi-0.17.5}/docs/core-concepts/sessions-and-branches.md +0 -0
  87. {lionagi-0.17.3 → lionagi-0.17.5}/docs/core-concepts/tools-and-functions.md +0 -0
  88. {lionagi-0.17.3 → lionagi-0.17.5}/docs/for-ai-agents/claude-code-usage.md +0 -0
  89. {lionagi-0.17.3 → lionagi-0.17.5}/docs/for-ai-agents/index.md +0 -0
  90. {lionagi-0.17.3 → lionagi-0.17.5}/docs/for-ai-agents/orchestration-guide.md +0 -0
  91. {lionagi-0.17.3 → lionagi-0.17.5}/docs/for-ai-agents/pattern-selection.md +0 -0
  92. {lionagi-0.17.3 → lionagi-0.17.5}/docs/for-ai-agents/self-improvement.md +0 -0
  93. {lionagi-0.17.3 → lionagi-0.17.5}/docs/includes/abbreviations.md +0 -0
  94. {lionagi-0.17.3 → lionagi-0.17.5}/docs/index.md +0 -0
  95. {lionagi-0.17.3 → lionagi-0.17.5}/docs/integrations/databases.md +0 -0
  96. {lionagi-0.17.3 → lionagi-0.17.5}/docs/integrations/dspy-optimization.md +0 -0
  97. {lionagi-0.17.3 → lionagi-0.17.5}/docs/integrations/index.md +0 -0
  98. {lionagi-0.17.3 → lionagi-0.17.5}/docs/integrations/llamaindex-rag.md +0 -0
  99. {lionagi-0.17.3 → lionagi-0.17.5}/docs/integrations/llm-providers.md +0 -0
  100. {lionagi-0.17.3 → lionagi-0.17.5}/docs/integrations/mcp-servers.md +0 -0
  101. {lionagi-0.17.3 → lionagi-0.17.5}/docs/integrations/tools.md +0 -0
  102. {lionagi-0.17.3 → lionagi-0.17.5}/docs/integrations/vector-stores.md +0 -0
  103. {lionagi-0.17.3 → lionagi-0.17.5}/docs/marketing/language-interoperability-manifesto.md +0 -0
  104. {lionagi-0.17.3 → lionagi-0.17.5}/docs/migration/from-autogen.md +0 -0
  105. {lionagi-0.17.3 → lionagi-0.17.5}/docs/migration/from-crewai.md +0 -0
  106. {lionagi-0.17.3 → lionagi-0.17.5}/docs/migration/from-langchain.md +0 -0
  107. {lionagi-0.17.3 → lionagi-0.17.5}/docs/migration/index.md +0 -0
  108. {lionagi-0.17.3 → lionagi-0.17.5}/docs/patterns/conditional-flows.md +0 -0
  109. {lionagi-0.17.3 → lionagi-0.17.5}/docs/patterns/fan-out-in.md +0 -0
  110. {lionagi-0.17.3 → lionagi-0.17.5}/docs/patterns/index.md +0 -0
  111. {lionagi-0.17.3 → lionagi-0.17.5}/docs/patterns/react-with-rag.md +0 -0
  112. {lionagi-0.17.3 → lionagi-0.17.5}/docs/patterns/sequential-analysis.md +0 -0
  113. {lionagi-0.17.3 → lionagi-0.17.5}/docs/patterns/tournament-validation.md +0 -0
  114. {lionagi-0.17.3 → lionagi-0.17.5}/docs/problem-statement.md +0 -0
  115. {lionagi-0.17.3 → lionagi-0.17.5}/docs/quickstart/claude-code-integration.md +0 -0
  116. {lionagi-0.17.3 → lionagi-0.17.5}/docs/quickstart/index.md +0 -0
  117. {lionagi-0.17.3 → lionagi-0.17.5}/docs/quickstart/installation.md +0 -0
  118. {lionagi-0.17.3 → lionagi-0.17.5}/docs/quickstart/orchestration-first.md +0 -0
  119. {lionagi-0.17.3 → lionagi-0.17.5}/docs/quickstart/your-first-flow.md +0 -0
  120. {lionagi-0.17.3 → lionagi-0.17.5}/docs/reference/api/index.md +0 -0
  121. {lionagi-0.17.3 → lionagi-0.17.5}/docs/reference/changelog.md +0 -0
  122. {lionagi-0.17.3 → lionagi-0.17.5}/docs/reference/troubleshooting.md +0 -0
  123. {lionagi-0.17.3 → lionagi-0.17.5}/docs/stylesheets/extra.css +0 -0
  124. {lionagi-0.17.3 → lionagi-0.17.5}/docs/thinking-in-lionagi/branches-as-agents.md +0 -0
  125. {lionagi-0.17.3 → lionagi-0.17.5}/docs/thinking-in-lionagi/builder-pattern.md +0 -0
  126. {lionagi-0.17.3 → lionagi-0.17.5}/docs/thinking-in-lionagi/graphs-over-chains.md +0 -0
  127. {lionagi-0.17.3 → lionagi-0.17.5}/docs/thinking-in-lionagi/index.md +0 -0
  128. {lionagi-0.17.3 → lionagi-0.17.5}/docs/thinking-in-lionagi/why-lionagi.md +0 -0
  129. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/_class_registry.py +0 -0
  130. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/_errors.py +0 -0
  131. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/_types.py +0 -0
  132. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/adapters/__init__.py +0 -0
  133. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/adapters/_utils.py +0 -0
  134. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/adapters/async_postgres_adapter.py +0 -0
  135. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/config.py +0 -0
  136. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/fields/__init__.py +0 -0
  137. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/fields/action.py +0 -0
  138. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/fields/base.py +0 -0
  139. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/fields/code.py +0 -0
  140. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/fields/file.py +0 -0
  141. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/fields/instruct.py +0 -0
  142. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/fields/reason.py +0 -0
  143. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/fields/research.py +0 -0
  144. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/__init__.py +0 -0
  145. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/file/__init__.py +0 -0
  146. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/file/_utils.py +0 -0
  147. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/file/chunk.py +0 -0
  148. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/file/concat.py +0 -0
  149. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/file/concat_files.py +0 -0
  150. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/file/file_ops.py +0 -0
  151. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/file/process.py +0 -0
  152. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/file/save.py +0 -0
  153. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/schema/__init__.py +0 -0
  154. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/schema/as_readable.py +0 -0
  155. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/schema/extract_code_block.py +0 -0
  156. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/schema/extract_docstring.py +0 -0
  157. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/schema/function_to_schema.py +0 -0
  158. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/schema/load_pydantic_model_from_schema.py +0 -0
  159. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/validate/__init__.py +0 -0
  160. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/validate/common_field_validators.py +0 -0
  161. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/validate/to_num.py +0 -0
  162. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/libs/validate/validate_boolean.py +0 -0
  163. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/__init__.py +0 -0
  164. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/_json_dump.py +0 -0
  165. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/_list_call.py +0 -0
  166. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/_utils.py +0 -0
  167. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/__init__.py +0 -0
  168. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/_compat.py +0 -0
  169. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/cancel.py +0 -0
  170. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/errors.py +0 -0
  171. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/patterns.py +0 -0
  172. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/primitives.py +0 -0
  173. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/resource_tracker.py +0 -0
  174. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/task.py +0 -0
  175. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/throttle.py +0 -0
  176. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/concurrency/utils.py +0 -0
  177. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/fuzzy/__init__.py +0 -0
  178. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/fuzzy/_extract_json.py +0 -0
  179. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/fuzzy/_fuzzy_json.py +0 -0
  180. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/fuzzy/_fuzzy_match.py +0 -0
  181. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/fuzzy/_string_similarity.py +0 -0
  182. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/fuzzy/_to_dict.py +0 -0
  183. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/ln/types.py +0 -0
  184. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/models/__init__.py +0 -0
  185. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/models/field_model.py +0 -0
  186. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/models/hashable_model.py +0 -0
  187. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/models/model_params.py +0 -0
  188. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/models/operable_model.py +0 -0
  189. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/models/schema_model.py +0 -0
  190. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/ReAct/ReAct.py +0 -0
  191. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/ReAct/__init__.py +0 -0
  192. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/ReAct/utils.py +0 -0
  193. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/__init__.py +0 -0
  194. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/_act/__init__.py +0 -0
  195. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/_act/act.py +0 -0
  196. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/_visualize_graph.py +0 -0
  197. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/brainstorm/__init__.py +0 -0
  198. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/brainstorm/brainstorm.py +0 -0
  199. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/brainstorm/prompt.py +0 -0
  200. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/builder.py +0 -0
  201. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/chat/__init__.py +0 -0
  202. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/chat/chat.py +0 -0
  203. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/communicate/__init__.py +0 -0
  204. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/communicate/communicate.py +0 -0
  205. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/flow.py +0 -0
  206. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/instruct/__init__.py +0 -0
  207. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/instruct/instruct.py +0 -0
  208. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/interpret/__init__.py +0 -0
  209. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/interpret/interpret.py +0 -0
  210. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/manager.py +0 -0
  211. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/node.py +0 -0
  212. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/operate/__init__.py +0 -0
  213. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/operate/operate.py +0 -0
  214. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/parse/__init__.py +0 -0
  215. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/parse/parse.py +0 -0
  216. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/plan/__init__.py +0 -0
  217. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/plan/plan.py +0 -0
  218. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/plan/prompt.py +0 -0
  219. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/select/__init__.py +0 -0
  220. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/select/select.py +0 -0
  221. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/select/utils.py +0 -0
  222. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/types.py +0 -0
  223. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/operations/utils.py +0 -0
  224. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/__init__.py +0 -0
  225. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/_concepts.py +0 -0
  226. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/action/__init__.py +0 -0
  227. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/action/function_calling.py +0 -0
  228. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/action/tool.py +0 -0
  229. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/contracts.py +0 -0
  230. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/forms/__init__.py +0 -0
  231. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/forms/base.py +0 -0
  232. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/forms/flow.py +0 -0
  233. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/forms/form.py +0 -0
  234. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/forms/report.py +0 -0
  235. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/generic/__init__.py +0 -0
  236. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/generic/element.py +0 -0
  237. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/generic/event.py +0 -0
  238. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/generic/log.py +0 -0
  239. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/generic/pile.py +0 -0
  240. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/generic/processor.py +0 -0
  241. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/generic/progression.py +0 -0
  242. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/graph/__init__.py +0 -0
  243. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/graph/edge.py +0 -0
  244. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/graph/graph.py +0 -0
  245. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/graph/node.py +0 -0
  246. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/ids.py +0 -0
  247. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/mail/__init__.py +0 -0
  248. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/mail/exchange.py +0 -0
  249. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/mail/mail.py +0 -0
  250. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/mail/mailbox.py +0 -0
  251. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/mail/manager.py +0 -0
  252. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/mail/package.py +0 -0
  253. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/__init__.py +0 -0
  254. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/action_request.py +0 -0
  255. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/action_response.py +0 -0
  256. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/assistant_response.py +0 -0
  257. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/base.py +0 -0
  258. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/instruction.py +0 -0
  259. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/manager.py +0 -0
  260. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/message.py +0 -0
  261. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/system.py +0 -0
  262. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/templates/README.md +0 -0
  263. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/templates/action_request.jinja2 +0 -0
  264. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/templates/action_response.jinja2 +0 -0
  265. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/templates/assistant_response.jinja2 +0 -0
  266. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/templates/instruction_message.jinja2 +0 -0
  267. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/templates/system_message.jinja2 +0 -0
  268. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/messages/templates/tool_schemas.jinja2 +0 -0
  269. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/operatives/__init__.py +0 -0
  270. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/operatives/operative.py +0 -0
  271. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/operatives/step.py +0 -0
  272. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/protocols/types.py +0 -0
  273. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/py.typed +0 -0
  274. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/__init__.py +0 -0
  275. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/__init__.py +0 -0
  276. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/endpoint.py +0 -0
  277. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/endpoint_config.py +0 -0
  278. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/header_factory.py +0 -0
  279. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/match_endpoint.py +0 -0
  280. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/mcp/__init__.py +0 -0
  281. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/__init__.py +0 -0
  282. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/anthropic_.py +0 -0
  283. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/claude_code_cli.py +0 -0
  284. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/exa_.py +0 -0
  285. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/nvidia_nim_.py +0 -0
  286. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/oai_.py +0 -0
  287. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/ollama_.py +0 -0
  288. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/perplexity_.py +0 -0
  289. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/connections/providers/types.py +0 -0
  290. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/hooks/__init__.py +0 -0
  291. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/hooks/_types.py +0 -0
  292. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/hooks/_utils.py +0 -0
  293. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/hooks/hook_event.py +0 -0
  294. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/hooks/hook_registry.py +0 -0
  295. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/imodel.py +0 -0
  296. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/manager.py +0 -0
  297. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/rate_limited_processor.py +0 -0
  298. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/resilience.py +0 -0
  299. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/third_party/README.md +0 -0
  300. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/third_party/__init__.py +0 -0
  301. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/third_party/anthropic_models.py +0 -0
  302. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/third_party/claude_code.py +0 -0
  303. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/third_party/exa_models.py +0 -0
  304. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/third_party/openai_model_names.py +0 -0
  305. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/third_party/pplx_models.py +0 -0
  306. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/token_calculator.py +0 -0
  307. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/service/types.py +0 -0
  308. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/session/__init__.py +0 -0
  309. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/session/branch.py +0 -0
  310. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/session/prompts.py +0 -0
  311. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/session/session.py +0 -0
  312. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/settings.py +0 -0
  313. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/tools/__init__.py +0 -0
  314. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/tools/base.py +0 -0
  315. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/tools/file/__init__.py +0 -0
  316. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/tools/file/reader.py +0 -0
  317. {lionagi-0.17.3 → lionagi-0.17.5}/lionagi/tools/types.py +0 -0
  318. {lionagi-0.17.3 → lionagi-0.17.5}/main.py +0 -0
  319. {lionagi-0.17.3 → lionagi-0.17.5}/mkdocs.yml +0 -0
  320. {lionagi-0.17.3 → lionagi-0.17.5}/scripts/README.md +0 -0
  321. {lionagi-0.17.3 → lionagi-0.17.5}/scripts/update_openai_models.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lionagi
3
- Version: 0.17.3
3
+ Version: 0.17.5
4
4
  Summary: An Intelligence Operating System.
5
5
  Author-email: HaiyangLi <quantocean.li@gmail.com>
6
6
  License: Apache License
@@ -330,8 +330,8 @@ from pydantic import BaseModel
330
330
  class Joke(BaseModel):
331
331
  joke: str
332
332
 
333
- res = await hunter.communicate(
334
- "Tell me a short dragon joke",
333
+ res = await hunter.operate(
334
+ instruction="Tell me a short dragon joke",
335
335
  response_format=Joke
336
336
  )
337
337
  print(type(res))
@@ -374,6 +374,33 @@ print(result)
374
374
  The LLM can now open the PDF, read in slices, fetch references, and produce a
375
375
  final structured summary.
376
376
 
377
+ ### MCP (Model Context Protocol) Integration
378
+
379
+ LionAGI supports Anthropic's Model Context Protocol for seamless tool integration:
380
+
381
+ ```
382
+ pip install "lionagi[mcp]"
383
+ ```
384
+
385
+ ```python
386
+ from lionagi import load_mcp_tools
387
+
388
+ # Load tools from any MCP server
389
+ tools = await load_mcp_tools(".mcp.json", ["search", "memory"])
390
+
391
+ # Use with ReAct reasoning
392
+ branch = Branch(chat_model=gpt4o, tools=tools)
393
+ result = await branch.ReAct(
394
+ instruct={"instruction": "Research recent AI developments"},
395
+ tools=["search_exa_search"],
396
+ max_extensions=3
397
+ )
398
+ ```
399
+
400
+ - **Dynamic Discovery**: Auto-discover and register tools from MCP servers
401
+ - **Type Safety**: Full Pydantic validation for tool interactions
402
+ - **Connection Pooling**: Efficient resource management with automatic reuse
403
+
377
404
  ### Observability & Debugging
378
405
 
379
406
  - Inspect messages:
@@ -66,8 +66,8 @@ from pydantic import BaseModel
66
66
  class Joke(BaseModel):
67
67
  joke: str
68
68
 
69
- res = await hunter.communicate(
70
- "Tell me a short dragon joke",
69
+ res = await hunter.operate(
70
+ instruction="Tell me a short dragon joke",
71
71
  response_format=Joke
72
72
  )
73
73
  print(type(res))
@@ -110,6 +110,33 @@ print(result)
110
110
  The LLM can now open the PDF, read in slices, fetch references, and produce a
111
111
  final structured summary.
112
112
 
113
+ ### MCP (Model Context Protocol) Integration
114
+
115
+ LionAGI supports Anthropic's Model Context Protocol for seamless tool integration:
116
+
117
+ ```
118
+ pip install "lionagi[mcp]"
119
+ ```
120
+
121
+ ```python
122
+ from lionagi import load_mcp_tools
123
+
124
+ # Load tools from any MCP server
125
+ tools = await load_mcp_tools(".mcp.json", ["search", "memory"])
126
+
127
+ # Use with ReAct reasoning
128
+ branch = Branch(chat_model=gpt4o, tools=tools)
129
+ result = await branch.ReAct(
130
+ instruct={"instruction": "Research recent AI developments"},
131
+ tools=["search_exa_search"],
132
+ max_extensions=3
133
+ )
134
+ ```
135
+
136
+ - **Dynamic Discovery**: Auto-discover and register tools from MCP servers
137
+ - **Type Safety**: Full Pydantic validation for tool interactions
138
+ - **Connection Pooling**: Efficient resource management with automatic reuse
139
+
113
140
  ### Observability & Debugging
114
141
 
115
142
  - Inspect messages:
@@ -0,0 +1,96 @@
1
+ # Copyright (c) 2023 - 2025, HaiyangLi <quantocean.li at gmail dot com>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import logging
6
+ from typing import TYPE_CHECKING
7
+
8
+ from . import ln as ln # Lightweight concurrency utilities
9
+ from .version import __version__
10
+
11
+ if TYPE_CHECKING:
12
+ # Type hints only - not imported at runtime
13
+ from pydantic import BaseModel, Field
14
+
15
+ from .operations.node import Operation
16
+ from .service.imodel import iModel
17
+ from .session.session import Branch, Session
18
+
19
+ logger = logging.getLogger(__name__)
20
+ logger.setLevel(logging.INFO)
21
+
22
+ # Module-level lazy loading cache
23
+ _lazy_imports = {}
24
+
25
+
26
+ def __getattr__(name: str):
27
+ """Lazy loading for expensive imports."""
28
+ if name in _lazy_imports:
29
+ return _lazy_imports[name]
30
+
31
+ # Lazy load core components
32
+ if name == "Session":
33
+ from .session.session import Session
34
+
35
+ _lazy_imports[name] = Session
36
+ return Session
37
+ elif name == "Branch":
38
+ from .session.session import Branch
39
+
40
+ _lazy_imports[name] = Branch
41
+ return Branch
42
+ # Lazy load Pydantic components
43
+ elif name == "BaseModel":
44
+ from pydantic import BaseModel
45
+
46
+ _lazy_imports[name] = BaseModel
47
+ return BaseModel
48
+ elif name == "Field":
49
+ from pydantic import Field
50
+
51
+ _lazy_imports[name] = Field
52
+ return Field
53
+ # Lazy load operations
54
+ elif name == "Operation":
55
+ from .operations.node import Operation
56
+
57
+ _lazy_imports[name] = Operation
58
+ return Operation
59
+ elif name == "iModel":
60
+ from .service.imodel import iModel
61
+
62
+ _lazy_imports[name] = iModel
63
+ return iModel
64
+ elif name == "types":
65
+ from . import _types as types
66
+
67
+ _lazy_imports["types"] = types
68
+ return types
69
+ elif name == "Builder":
70
+ from .operations.builder import OperationGraphBuilder as Builder
71
+
72
+ _lazy_imports["Builder"] = Builder
73
+ return Builder
74
+ elif name == "load_mcp_tools":
75
+ from .protocols.action.manager import load_mcp_tools
76
+
77
+ _lazy_imports["load_mcp_tools"] = load_mcp_tools
78
+ return load_mcp_tools
79
+
80
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
81
+
82
+
83
+ __all__ = (
84
+ "Session",
85
+ "Branch",
86
+ "iModel",
87
+ "types",
88
+ "__version__",
89
+ "BaseModel",
90
+ "Field",
91
+ "logger",
92
+ "Builder",
93
+ "Operation",
94
+ "load_mcp_tools",
95
+ "ln",
96
+ )
@@ -5,7 +5,6 @@ from typing import Any, ClassVar
5
5
 
6
6
  import anyio
7
7
  import anyio.to_thread
8
- from pydantic import BaseModel
9
8
 
10
9
  from ._to_list import to_list
11
10
  from .concurrency import Lock as ConcurrencyLock
@@ -18,6 +17,10 @@ from .concurrency import (
18
17
  )
19
18
  from .types import Params, T, Unset, not_sentinel
20
19
 
20
+ _INITIALIZED = False
21
+ _MODEL_LIKE = None
22
+
23
+
21
24
  __all__ = (
22
25
  "alcall",
23
26
  "bcall",
@@ -54,6 +57,14 @@ async def alcall(
54
57
  retries, timeout, and output processing.
55
58
  """
56
59
 
60
+ global _INITIALIZED, _MODEL_LIKE
61
+ if _INITIALIZED is False:
62
+ from msgspec import Struct
63
+ from pydantic import BaseModel
64
+
65
+ _MODEL_LIKE = (BaseModel, Struct)
66
+ _INITIALIZED = True
67
+
57
68
  # Validate func is a single callable
58
69
  if not callable(func):
59
70
  # If func is not callable, maybe it's an iterable. Extract one callable if possible.
@@ -82,7 +93,7 @@ async def alcall(
82
93
  else:
83
94
  if not isinstance(input_, list):
84
95
  # Attempt to iterate
85
- if isinstance(input_, BaseModel):
96
+ if isinstance(input_, _MODEL_LIKE):
86
97
  # Pydantic model, convert to list
87
98
  input_ = [input_]
88
99
  else:
@@ -3,10 +3,13 @@ from __future__ import annotations
3
3
  import copy
4
4
 
5
5
  import msgspec
6
- from pydantic import BaseModel as PydanticBaseModel
7
6
 
8
7
  __all__ = ("hash_dict",)
9
8
 
9
+ # Global initialization state
10
+ _INITIALIZED = False
11
+ PydanticBaseModel = None
12
+
10
13
  # --- Canonical Representation Generator ---
11
14
  _PRIMITIVE_TYPES = (str, int, float, bool, type(None))
12
15
  _TYPE_MARKER_DICT = 0
@@ -35,7 +38,7 @@ def _generate_hashable_representation(item: any) -> any:
35
38
  _generate_hashable_representation(msgspec.to_builtins(item)),
36
39
  )
37
40
 
38
- if isinstance(item, PydanticBaseModel):
41
+ if PydanticBaseModel and isinstance(item, PydanticBaseModel):
39
42
  # Process the Pydantic model by first dumping it to a dict, then processing that dict.
40
43
  # The type marker distinguishes this from a regular dictionary.
41
44
  return (
@@ -117,6 +120,13 @@ def _generate_hashable_representation(item: any) -> any:
117
120
 
118
121
 
119
122
  def hash_dict(data: any, strict: bool = False) -> int:
123
+ global _INITIALIZED, PydanticBaseModel
124
+ if _INITIALIZED is False:
125
+ from pydantic import BaseModel
126
+
127
+ PydanticBaseModel = BaseModel
128
+ _INITIALIZED = True
129
+
120
130
  data_to_process = data
121
131
  if strict:
122
132
  data_to_process = copy.deepcopy(data)
@@ -3,24 +3,20 @@ from dataclasses import dataclass
3
3
  from enum import Enum as _Enum
4
4
  from typing import Any, ClassVar
5
5
 
6
- from msgspec import Struct
7
- from pydantic import BaseModel
8
- from pydantic_core import PydanticUndefinedType
9
-
10
6
  from ._hash import hash_dict
11
- from .types import Params, UndefinedType, UnsetType
7
+ from .types import Params
12
8
 
13
9
  __all__ = ("to_list", "ToListParams")
14
10
 
15
11
 
12
+ _INITIALIZED = False
13
+ _MODEL_LIKE = None
14
+ _MAP_LIKE = None
15
+ _SINGLETONE_TYPES = None
16
+ _SKIP_TYPE = None
17
+ _SKIP_TUPLE_SET = None
16
18
  _BYTE_LIKE = (str, bytes, bytearray)
17
- _MODEL_LIKE = (BaseModel, Struct)
18
- _MAP_LIKE = (Mapping, *_MODEL_LIKE)
19
19
  _TUPLE_SET = (tuple, set, frozenset)
20
- _SINGLETONE_TYPES = (UndefinedType, UnsetType, PydanticUndefinedType)
21
-
22
- _SKIP_TYPE = (*_BYTE_LIKE, *_MAP_LIKE, _Enum)
23
- _SKIP_TUPLE_SET = (*_SKIP_TYPE, *_TUPLE_SET)
24
20
 
25
21
 
26
22
  def to_list(
@@ -50,6 +46,21 @@ def to_list(
50
46
  Raises:
51
47
  ValueError: If unique=True is used without flatten=True.
52
48
  """
49
+ global _INITIALIZED
50
+ if _INITIALIZED is False:
51
+ from msgspec import Struct
52
+ from pydantic import BaseModel
53
+ from pydantic_core import PydanticUndefinedType
54
+
55
+ from .types import UndefinedType, UnsetType
56
+
57
+ global _MODEL_LIKE, _MAP_LIKE, _SINGLETONE_TYPES, _SKIP_TYPE, _SKIP_TUPLE_SET
58
+ _MODEL_LIKE = (BaseModel, Struct)
59
+ _MAP_LIKE = (Mapping, *_MODEL_LIKE)
60
+ _SINGLETONE_TYPES = (UndefinedType, UnsetType, PydanticUndefinedType)
61
+ _SKIP_TYPE = (*_BYTE_LIKE, *_MAP_LIKE, _Enum)
62
+ _SKIP_TUPLE_SET = (*_SKIP_TYPE, *_TUPLE_SET)
63
+ _INITIALIZED = True
53
64
 
54
65
  def _process_list(
55
66
  lst: list[Any],
@@ -117,7 +128,7 @@ def to_list(
117
128
  else [input_]
118
129
  )
119
130
 
120
- if isinstance(input_, BaseModel):
131
+ if isinstance(input_, _MODEL_LIKE):
121
132
  return [input_]
122
133
 
123
134
  if isinstance(input_, Iterable) and not isinstance(input_, _BYTE_LIKE):
@@ -1,7 +1,5 @@
1
1
  from collections.abc import Callable, Sequence
2
- from typing import Any, Literal
3
-
4
- from pydantic import BaseModel
2
+ from typing import TYPE_CHECKING, Any, Literal
5
3
 
6
4
  from lionagi._errors import ValidationError
7
5
 
@@ -11,13 +9,17 @@ from ._fuzzy_match import FuzzyMatchKeysParams, fuzzy_match_keys
11
9
  from ._string_similarity import SIMILARITY_TYPE
12
10
  from ._to_dict import to_dict
13
11
 
12
+ if TYPE_CHECKING:
13
+ from pydantic import BaseModel
14
+
15
+
14
16
  __all__ = ("fuzzy_validate_pydantic",)
15
17
 
16
18
 
17
19
  def fuzzy_validate_pydantic(
18
20
  text,
19
21
  /,
20
- model_type: type[BaseModel],
22
+ model_type: "type[BaseModel]",
21
23
  fuzzy_parse: bool = True,
22
24
  fuzzy_match: bool = False,
23
25
  fuzzy_match_params: FuzzyMatchKeysParams | dict = None,
@@ -12,8 +12,6 @@ from lionagi.utils import to_list
12
12
  from .function_calling import FunctionCalling
13
13
  from .tool import FuncTool, FuncToolRef, Tool, ToolRef
14
14
 
15
- __all__ = ("ActionManager",)
16
-
17
15
 
18
16
  class ActionManager(Manager):
19
17
  """
@@ -85,20 +85,16 @@ class APICalling(Event):
85
85
  TOKEN_LIMITS = {
86
86
  # OpenAI models
87
87
  "gpt-4": 128_000,
88
- "gpt-4-turbo": 128_000,
89
- "o1-mini": 128_000,
90
- "o1-preview": 128_000,
91
88
  "o1": 200_000,
92
89
  "o3": 200_000,
93
90
  "gpt-4.1": 1_000_000,
91
+ "gpt-5": 1_000_000,
94
92
  # Anthropic models
95
93
  "sonnet": 200_000,
96
94
  "haiku": 200_000,
97
95
  "opus": 200_000,
98
96
  # Google models
99
97
  "gemini": 1_000_000,
100
- # Alibaba models
101
- "qwen-turbo": 1_000_000,
102
98
  }
103
99
 
104
100
  token_msg = (
@@ -7,15 +7,7 @@ import json
7
7
  import logging
8
8
  import os
9
9
  from pathlib import Path
10
- from typing import Any, Dict
11
-
12
- try:
13
- from fastmcp import Client as FastMCPClient
14
-
15
- FASTMCP_AVAILABLE = True
16
- except ImportError:
17
- FASTMCP_AVAILABLE = False
18
- FastMCPClient = None
10
+ from typing import Any
19
11
 
20
12
  # Suppress MCP server logging by default
21
13
  logging.getLogger("mcp").setLevel(logging.WARNING)
@@ -88,11 +80,6 @@ class MCPConnectionPool:
88
80
  @classmethod
89
81
  async def get_client(cls, server_config: dict[str, Any]) -> Any:
90
82
  """Get or create a pooled MCP client."""
91
- if not FASTMCP_AVAILABLE:
92
- raise ImportError(
93
- "FastMCP not installed. Run: pip install fastmcp"
94
- )
95
-
96
83
  # Generate unique key for this config
97
84
  if "server" in server_config:
98
85
  # Server reference from .mcp.json
@@ -149,6 +136,13 @@ class MCPConnectionPool:
149
136
  if not any(k in config for k in ["url", "command"]):
150
137
  raise ValueError("Config must have either 'url' or 'command' key")
151
138
 
139
+ try:
140
+ from fastmcp import Client as FastMCPClient
141
+ except ImportError:
142
+ raise ImportError(
143
+ "FastMCP not installed. Run: pip install fastmcp"
144
+ )
145
+
152
146
  # Handle different config formats
153
147
  if "url" in config:
154
148
  # Direct URL connection
@@ -172,7 +166,6 @@ class MCPConnectionPool:
172
166
  # Common environment variables to suppress logging
173
167
  env.setdefault("LOG_LEVEL", "ERROR")
174
168
  env.setdefault("PYTHONWARNINGS", "ignore")
175
- env.setdefault("KHIVEMCP_LOG_LEVEL", "ERROR")
176
169
  # Suppress FastMCP server logs
177
170
  env.setdefault("FASTMCP_QUIET", "true")
178
171
  env.setdefault("MCP_QUIET", "true")
@@ -87,8 +87,6 @@ __all__ = (
87
87
  "max_concurrent",
88
88
  "force_async",
89
89
  "breakdown_pydantic_annotation",
90
- "run_package_manager_command",
91
- "StringEnum",
92
90
  "Enum",
93
91
  "hash_dict",
94
92
  "is_union_type",
@@ -106,12 +104,6 @@ __all__ = (
106
104
  )
107
105
 
108
106
 
109
- # --- General Global Utilities Types ---
110
- @deprecated("String Enum is deprecated, use `Enum` instead.")
111
- class StringEnum(str, Enum):
112
- pass
113
-
114
-
115
107
  # --- General Global Utilities Functions ---
116
108
  def time(
117
109
  *,
@@ -0,0 +1 @@
1
+ __version__ = "0.17.5"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lionagi"
3
- version = "0.17.3"
3
+ version = "0.17.5"
4
4
  description = "An Intelligence Operating System."
5
5
  authors = [
6
6
  { name = "HaiyangLi", email = "quantocean.li@gmail.com" },