lionagi 0.0.312__tar.gz → 0.2.3__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (321) hide show
  1. {lionagi-0.0.312 → lionagi-0.2.3}/LICENSE +12 -11
  2. {lionagi-0.0.312 → lionagi-0.2.3}/PKG-INFO +26 -120
  3. lionagi-0.2.3/README.md +48 -0
  4. lionagi-0.2.3/lionagi/__init__.py +73 -0
  5. lionagi-0.2.3/lionagi/core/_setting/_setting.py +59 -0
  6. lionagi-0.2.3/lionagi/core/action/__init__.py +14 -0
  7. lionagi-0.2.3/lionagi/core/action/function_calling.py +136 -0
  8. lionagi-0.2.3/lionagi/core/action/manual.py +1 -0
  9. lionagi-0.2.3/lionagi/core/action/node.py +109 -0
  10. lionagi-0.2.3/lionagi/core/action/tool.py +114 -0
  11. lionagi-0.2.3/lionagi/core/action/tool_manager.py +356 -0
  12. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/core/agent/base_agent.py +45 -36
  13. lionagi-0.2.3/lionagi/core/agent/eval/evaluator.py +1 -0
  14. lionagi-0.2.3/lionagi/core/agent/eval/vote.py +40 -0
  15. lionagi-0.2.3/lionagi/core/agent/learn/learner.py +59 -0
  16. lionagi-0.2.3/lionagi/core/agent/plan/unit_template.py +1 -0
  17. lionagi-0.2.3/lionagi/core/collections/__init__.py +17 -0
  18. lionagi-0.2.3/lionagi/core/collections/_logger.py +319 -0
  19. lionagi-0.2.3/lionagi/core/collections/abc/__init__.py +53 -0
  20. lionagi-0.2.3/lionagi/core/collections/abc/component.py +615 -0
  21. lionagi-0.2.3/lionagi/core/collections/abc/concepts.py +297 -0
  22. lionagi-0.2.3/lionagi/core/collections/abc/exceptions.py +150 -0
  23. lionagi-0.2.3/lionagi/core/collections/abc/util.py +45 -0
  24. lionagi-0.2.3/lionagi/core/collections/exchange.py +161 -0
  25. lionagi-0.2.3/lionagi/core/collections/flow.py +426 -0
  26. lionagi-0.2.3/lionagi/core/collections/model.py +419 -0
  27. lionagi-0.2.3/lionagi/core/collections/pile.py +913 -0
  28. lionagi-0.2.3/lionagi/core/collections/progression.py +236 -0
  29. lionagi-0.2.3/lionagi/core/collections/util.py +64 -0
  30. lionagi-0.2.3/lionagi/core/director/direct.py +314 -0
  31. lionagi-0.2.3/lionagi/core/director/director.py +2 -0
  32. lionagi-0.2.3/lionagi/core/engine/branch_engine.py +333 -0
  33. lionagi-0.2.3/lionagi/core/engine/instruction_map_engine.py +204 -0
  34. lionagi-0.2.3/lionagi/core/engine/sandbox_.py +14 -0
  35. lionagi-0.2.3/lionagi/core/engine/script_engine.py +99 -0
  36. lionagi-0.2.3/lionagi/core/executor/base_executor.py +90 -0
  37. lionagi-0.2.3/lionagi/core/executor/graph_executor.py +330 -0
  38. lionagi-0.2.3/lionagi/core/executor/neo4j_executor.py +384 -0
  39. lionagi-0.2.3/lionagi/core/generic/__init__.py +7 -0
  40. lionagi-0.2.3/lionagi/core/generic/edge.py +112 -0
  41. lionagi-0.2.3/lionagi/core/generic/edge_condition.py +16 -0
  42. lionagi-0.2.3/lionagi/core/generic/graph.py +243 -0
  43. lionagi-0.2.3/lionagi/core/generic/hyperedge.py +1 -0
  44. lionagi-0.2.3/lionagi/core/generic/node.py +224 -0
  45. lionagi-0.2.3/lionagi/core/generic/tree.py +48 -0
  46. lionagi-0.2.3/lionagi/core/generic/tree_node.py +79 -0
  47. lionagi-0.2.3/lionagi/core/mail/__init__.py +12 -0
  48. lionagi-0.2.3/lionagi/core/mail/mail.py +25 -0
  49. lionagi-0.2.3/lionagi/core/mail/mail_manager.py +181 -0
  50. lionagi-0.2.3/lionagi/core/mail/package.py +45 -0
  51. lionagi-0.2.3/lionagi/core/mail/start_mail.py +36 -0
  52. lionagi-0.2.3/lionagi/core/message/__init__.py +19 -0
  53. lionagi-0.2.3/lionagi/core/message/action_request.py +133 -0
  54. lionagi-0.2.3/lionagi/core/message/action_response.py +135 -0
  55. lionagi-0.2.3/lionagi/core/message/assistant_response.py +95 -0
  56. lionagi-0.2.3/lionagi/core/message/instruction.py +234 -0
  57. lionagi-0.2.3/lionagi/core/message/message.py +101 -0
  58. lionagi-0.2.3/lionagi/core/message/system.py +86 -0
  59. lionagi-0.2.3/lionagi/core/message/util.py +283 -0
  60. lionagi-0.2.3/lionagi/core/report/__init__.py +4 -0
  61. lionagi-0.2.3/lionagi/core/report/base.py +218 -0
  62. lionagi-0.2.3/lionagi/core/report/form.py +231 -0
  63. lionagi-0.2.3/lionagi/core/report/report.py +166 -0
  64. lionagi-0.2.3/lionagi/core/report/util.py +28 -0
  65. lionagi-0.2.3/lionagi/core/rule/_default.py +16 -0
  66. lionagi-0.2.3/lionagi/core/rule/action.py +99 -0
  67. lionagi-0.2.3/lionagi/core/rule/base.py +238 -0
  68. lionagi-0.2.3/lionagi/core/rule/boolean.py +56 -0
  69. lionagi-0.2.3/lionagi/core/rule/choice.py +47 -0
  70. lionagi-0.2.3/lionagi/core/rule/mapping.py +96 -0
  71. lionagi-0.2.3/lionagi/core/rule/number.py +71 -0
  72. lionagi-0.2.3/lionagi/core/rule/rulebook.py +109 -0
  73. lionagi-0.2.3/lionagi/core/rule/string.py +52 -0
  74. lionagi-0.2.3/lionagi/core/rule/util.py +35 -0
  75. lionagi-0.2.3/lionagi/core/session/branch.py +431 -0
  76. lionagi-0.2.3/lionagi/core/session/directive_mixin.py +287 -0
  77. lionagi-0.2.3/lionagi/core/session/session.py +311 -0
  78. lionagi-0.2.3/lionagi/core/structure/__init__.py +1 -0
  79. lionagi-0.2.3/lionagi/core/structure/chain.py +1 -0
  80. lionagi-0.2.3/lionagi/core/structure/forest.py +1 -0
  81. lionagi-0.2.3/lionagi/core/structure/graph.py +1 -0
  82. lionagi-0.2.3/lionagi/core/structure/tree.py +1 -0
  83. lionagi-0.2.3/lionagi/core/unit/__init__.py +5 -0
  84. lionagi-0.2.3/lionagi/core/unit/parallel_unit.py +245 -0
  85. lionagi-0.2.3/lionagi/core/unit/template/action.py +81 -0
  86. lionagi-0.2.3/lionagi/core/unit/template/base.py +51 -0
  87. lionagi-0.2.3/lionagi/core/unit/template/plan.py +84 -0
  88. lionagi-0.2.3/lionagi/core/unit/template/predict.py +109 -0
  89. lionagi-0.2.3/lionagi/core/unit/template/score.py +124 -0
  90. lionagi-0.2.3/lionagi/core/unit/template/select.py +104 -0
  91. lionagi-0.2.3/lionagi/core/unit/unit.py +362 -0
  92. lionagi-0.2.3/lionagi/core/unit/unit_form.py +305 -0
  93. lionagi-0.2.3/lionagi/core/unit/unit_mixin.py +1168 -0
  94. lionagi-0.2.3/lionagi/core/unit/util.py +71 -0
  95. lionagi-0.2.3/lionagi/core/validator/validator.py +364 -0
  96. lionagi-0.2.3/lionagi/core/work/work.py +76 -0
  97. lionagi-0.2.3/lionagi/core/work/work_edge.py +96 -0
  98. lionagi-0.2.3/lionagi/core/work/work_function.py +124 -0
  99. lionagi-0.2.3/lionagi/core/work/work_function_node.py +44 -0
  100. lionagi-0.2.3/lionagi/core/work/work_queue.py +105 -0
  101. lionagi-0.2.3/lionagi/core/work/work_task.py +155 -0
  102. lionagi-0.2.3/lionagi/core/work/worker.py +383 -0
  103. lionagi-0.2.3/lionagi/core/work/worker_engine.py +179 -0
  104. lionagi-0.2.3/lionagi/core/work/worklog.py +122 -0
  105. lionagi-0.2.3/lionagi/experimental/compressor/__init__.py +0 -0
  106. lionagi-0.2.3/lionagi/experimental/compressor/base.py +46 -0
  107. lionagi-0.2.3/lionagi/experimental/compressor/llm_compressor.py +247 -0
  108. lionagi-0.2.3/lionagi/experimental/compressor/llm_summarizer.py +61 -0
  109. lionagi-0.2.3/lionagi/experimental/compressor/util.py +70 -0
  110. lionagi-0.2.3/lionagi/experimental/directive/__init__.py +19 -0
  111. lionagi-0.2.3/lionagi/experimental/directive/parser/__init__.py +0 -0
  112. lionagi-0.2.3/lionagi/experimental/directive/parser/base_parser.py +282 -0
  113. lionagi-0.2.3/lionagi/experimental/directive/template/__init__.py +0 -0
  114. lionagi-0.2.3/lionagi/experimental/directive/template/base_template.py +79 -0
  115. lionagi-0.2.3/lionagi/experimental/directive/template/schema.py +36 -0
  116. lionagi-0.2.3/lionagi/experimental/directive/tokenizer.py +73 -0
  117. lionagi-0.2.3/lionagi/experimental/evaluator/__init__.py +0 -0
  118. lionagi-0.2.3/lionagi/experimental/evaluator/ast_evaluator.py +131 -0
  119. lionagi-0.2.3/lionagi/experimental/evaluator/base_evaluator.py +218 -0
  120. lionagi-0.2.3/lionagi/experimental/knowledge/__init__.py +0 -0
  121. lionagi-0.2.3/lionagi/experimental/knowledge/base.py +10 -0
  122. lionagi-0.2.3/lionagi/experimental/knowledge/graph.py +0 -0
  123. lionagi-0.2.3/lionagi/experimental/memory/__init__.py +0 -0
  124. lionagi-0.2.3/lionagi/experimental/strategies/__init__.py +0 -0
  125. lionagi-0.2.3/lionagi/experimental/strategies/base.py +1 -0
  126. lionagi-0.2.3/lionagi/integrations/__init__.py +1 -0
  127. lionagi-0.2.3/lionagi/integrations/bridge/autogen_/__init__.py +0 -0
  128. lionagi-0.2.3/lionagi/integrations/bridge/autogen_/autogen_.py +124 -0
  129. lionagi-0.2.3/lionagi/integrations/bridge/langchain_/__init__.py +0 -0
  130. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/langchain_/documents.py +4 -0
  131. lionagi-0.2.3/lionagi/integrations/bridge/llamaindex_/__init__.py +0 -0
  132. lionagi-0.2.3/lionagi/integrations/bridge/llamaindex_/index.py +30 -0
  133. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +6 -0
  134. lionagi-0.2.3/lionagi/integrations/bridge/llamaindex_/llama_pack.py +227 -0
  135. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/llamaindex_/node_parser.py +6 -9
  136. lionagi-0.2.3/lionagi/integrations/bridge/pydantic_/__init__.py +0 -0
  137. lionagi-0.2.3/lionagi/integrations/bridge/pydantic_/pydantic_bridge.py +1 -0
  138. lionagi-0.2.3/lionagi/integrations/bridge/transformers_/__init__.py +0 -0
  139. lionagi-0.2.3/lionagi/integrations/bridge/transformers_/install_.py +36 -0
  140. lionagi-0.2.3/lionagi/integrations/chunker/__init__.py +0 -0
  141. lionagi-0.2.3/lionagi/integrations/chunker/chunk.py +312 -0
  142. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/config/oai_configs.py +38 -7
  143. lionagi-0.2.3/lionagi/integrations/config/ollama_configs.py +1 -0
  144. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/config/openrouter_configs.py +14 -2
  145. lionagi-0.2.3/lionagi/integrations/loader/__init__.py +0 -0
  146. lionagi-0.2.3/lionagi/integrations/loader/load.py +253 -0
  147. lionagi-0.2.3/lionagi/integrations/loader/load_util.py +195 -0
  148. lionagi-0.2.3/lionagi/integrations/provider/_mapping.py +46 -0
  149. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/litellm.py +2 -1
  150. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/mlx_service.py +16 -9
  151. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/oai.py +91 -4
  152. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/ollama.py +7 -6
  153. lionagi-0.2.3/lionagi/integrations/provider/openrouter.py +160 -0
  154. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/services.py +2 -2
  155. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/transformers.py +18 -22
  156. lionagi-0.2.3/lionagi/integrations/storage/__init__.py +3 -0
  157. lionagi-0.2.3/lionagi/integrations/storage/neo4j.py +665 -0
  158. lionagi-0.2.3/lionagi/integrations/storage/storage_util.py +287 -0
  159. lionagi-0.2.3/lionagi/integrations/storage/structure_excel.py +285 -0
  160. lionagi-0.2.3/lionagi/integrations/storage/to_csv.py +63 -0
  161. lionagi-0.2.3/lionagi/integrations/storage/to_excel.py +83 -0
  162. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/__init__.py +26 -1
  163. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_api.py +78 -23
  164. lionagi-0.2.3/lionagi/libs/ln_context.py +37 -0
  165. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_convert.py +21 -9
  166. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_func_call.py +69 -28
  167. lionagi-0.2.3/lionagi/libs/ln_image.py +107 -0
  168. lionagi-0.2.3/lionagi/libs/ln_knowledge_graph.py +405 -0
  169. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_nested.py +26 -11
  170. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_parse.py +110 -14
  171. lionagi-0.2.3/lionagi/libs/ln_queue.py +117 -0
  172. lionagi-0.2.3/lionagi/libs/ln_tokenize.py +164 -0
  173. lionagi-0.0.312/lionagi/core/prompt/field_validator.py → lionagi-0.2.3/lionagi/libs/ln_validate.py +79 -14
  174. lionagi-0.2.3/lionagi/libs/special_tokens.py +172 -0
  175. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/sys_util.py +107 -2
  176. lionagi-0.2.3/lionagi/lions/__init__.py +0 -0
  177. lionagi-0.2.3/lionagi/lions/coder/__init__.py +0 -0
  178. lionagi-0.2.3/lionagi/lions/coder/add_feature.py +20 -0
  179. lionagi-0.2.3/lionagi/lions/coder/base_prompts.py +22 -0
  180. lionagi-0.2.3/lionagi/lions/coder/code_form.py +13 -0
  181. lionagi-0.2.3/lionagi/lions/coder/coder.py +168 -0
  182. lionagi-0.2.3/lionagi/lions/coder/util.py +96 -0
  183. lionagi-0.2.3/lionagi/lions/researcher/__init__.py +0 -0
  184. lionagi-0.2.3/lionagi/lions/researcher/data_source/__init__.py +0 -0
  185. lionagi-0.2.3/lionagi/lions/researcher/data_source/finhub_.py +191 -0
  186. lionagi-0.2.3/lionagi/lions/researcher/data_source/google_.py +199 -0
  187. lionagi-0.2.3/lionagi/lions/researcher/data_source/wiki_.py +96 -0
  188. lionagi-0.2.3/lionagi/lions/researcher/data_source/yfinance_.py +21 -0
  189. lionagi-0.2.3/lionagi/tests/__init__.py +0 -0
  190. lionagi-0.2.3/lionagi/tests/api/__init__.py +0 -0
  191. lionagi-0.2.3/lionagi/tests/api/aws/__init__.py +0 -0
  192. lionagi-0.2.3/lionagi/tests/api/aws/conftest.py +28 -0
  193. lionagi-0.2.3/lionagi/tests/api/aws/test_aws_s3.py +7 -0
  194. lionagi-0.2.3/lionagi/tests/integrations/__init__.py +0 -0
  195. lionagi-0.2.3/lionagi/tests/libs/__init__.py +0 -0
  196. lionagi-0.2.3/lionagi/tests/libs/test_field_validators.py +353 -0
  197. {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_func_call.py +23 -21
  198. {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_nested.py +36 -21
  199. {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_parse.py +1 -1
  200. lionagi-0.2.3/lionagi/tests/libs/test_queue.py +67 -0
  201. lionagi-0.2.3/lionagi/tests/test_core/__init__.py +0 -0
  202. lionagi-0.2.3/lionagi/tests/test_core/collections/__init__.py +0 -0
  203. lionagi-0.2.3/lionagi/tests/test_core/collections/test_component.py +206 -0
  204. lionagi-0.2.3/lionagi/tests/test_core/collections/test_exchange.py +138 -0
  205. lionagi-0.2.3/lionagi/tests/test_core/collections/test_flow.py +145 -0
  206. lionagi-0.2.3/lionagi/tests/test_core/collections/test_pile.py +171 -0
  207. lionagi-0.2.3/lionagi/tests/test_core/collections/test_progression.py +129 -0
  208. lionagi-0.2.3/lionagi/tests/test_core/generic/__init__.py +0 -0
  209. lionagi-0.2.3/lionagi/tests/test_core/generic/test_edge.py +67 -0
  210. lionagi-0.2.3/lionagi/tests/test_core/generic/test_graph.py +96 -0
  211. lionagi-0.2.3/lionagi/tests/test_core/generic/test_node.py +106 -0
  212. lionagi-0.2.3/lionagi/tests/test_core/generic/test_structure.py +194 -0
  213. lionagi-0.2.3/lionagi/tests/test_core/generic/test_tree_node.py +73 -0
  214. lionagi-0.2.3/lionagi/tests/test_core/graph/__init__.py +0 -0
  215. lionagi-0.2.3/lionagi/tests/test_core/graph/test_graph.py +71 -0
  216. lionagi-0.2.3/lionagi/tests/test_core/graph/test_tree.py +76 -0
  217. lionagi-0.2.3/lionagi/tests/test_core/mail/__init__.py +0 -0
  218. lionagi-0.2.3/lionagi/tests/test_core/mail/test_mail.py +98 -0
  219. lionagi-0.2.3/lionagi/tests/test_core/test_branch.py +115 -0
  220. lionagi-0.2.3/lionagi/tests/test_core/test_form.py +46 -0
  221. lionagi-0.2.3/lionagi/tests/test_core/test_report.py +105 -0
  222. lionagi-0.2.3/lionagi/tests/test_core/test_structure/__init__.py +0 -0
  223. lionagi-0.2.3/lionagi/tests/test_core/test_structure/test_base_structure.py +198 -0
  224. lionagi-0.2.3/lionagi/tests/test_core/test_structure/test_graph.py +55 -0
  225. lionagi-0.2.3/lionagi/tests/test_core/test_structure/test_tree.py +49 -0
  226. lionagi-0.2.3/lionagi/tests/test_core/test_validator.py +111 -0
  227. lionagi-0.2.3/lionagi/version.py +1 -0
  228. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi.egg-info/PKG-INFO +26 -120
  229. lionagi-0.2.3/lionagi.egg-info/SOURCES.txt +263 -0
  230. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi.egg-info/requires.txt +4 -0
  231. {lionagi-0.0.312 → lionagi-0.2.3}/pyproject.toml +11 -2
  232. {lionagi-0.0.312 → lionagi-0.2.3}/setup.py +1 -1
  233. lionagi-0.0.312/README.md +0 -147
  234. lionagi-0.0.312/lionagi/__init__.py +0 -14
  235. lionagi-0.0.312/lionagi/core/__init__.py +0 -15
  236. lionagi-0.0.312/lionagi/core/agent/__init__.py +0 -3
  237. lionagi-0.0.312/lionagi/core/branch/__init__.py +0 -4
  238. lionagi-0.0.312/lionagi/core/branch/base_branch.py +0 -654
  239. lionagi-0.0.312/lionagi/core/branch/branch.py +0 -471
  240. lionagi-0.0.312/lionagi/core/branch/branch_flow_mixin.py +0 -96
  241. lionagi-0.0.312/lionagi/core/branch/executable_branch.py +0 -347
  242. lionagi-0.0.312/lionagi/core/branch/util.py +0 -323
  243. lionagi-0.0.312/lionagi/core/direct/__init__.py +0 -6
  244. lionagi-0.0.312/lionagi/core/direct/predict.py +0 -161
  245. lionagi-0.0.312/lionagi/core/direct/score.py +0 -278
  246. lionagi-0.0.312/lionagi/core/direct/select.py +0 -169
  247. lionagi-0.0.312/lionagi/core/direct/utils.py +0 -87
  248. lionagi-0.0.312/lionagi/core/direct/vote.py +0 -64
  249. lionagi-0.0.312/lionagi/core/flow/base/baseflow.py +0 -23
  250. lionagi-0.0.312/lionagi/core/flow/monoflow/ReAct.py +0 -238
  251. lionagi-0.0.312/lionagi/core/flow/monoflow/__init__.py +0 -9
  252. lionagi-0.0.312/lionagi/core/flow/monoflow/chat.py +0 -95
  253. lionagi-0.0.312/lionagi/core/flow/monoflow/chat_mixin.py +0 -263
  254. lionagi-0.0.312/lionagi/core/flow/monoflow/followup.py +0 -214
  255. lionagi-0.0.312/lionagi/core/flow/polyflow/__init__.py +0 -1
  256. lionagi-0.0.312/lionagi/core/flow/polyflow/chat.py +0 -248
  257. lionagi-0.0.312/lionagi/core/mail/__init__.py +0 -8
  258. lionagi-0.0.312/lionagi/core/mail/mail_manager.py +0 -97
  259. lionagi-0.0.312/lionagi/core/mail/schema.py +0 -56
  260. lionagi-0.0.312/lionagi/core/messages/__init__.py +0 -3
  261. lionagi-0.0.312/lionagi/core/messages/schema.py +0 -533
  262. lionagi-0.0.312/lionagi/core/prompt/prompt_template.py +0 -316
  263. lionagi-0.0.312/lionagi/core/schema/__init__.py +0 -22
  264. lionagi-0.0.312/lionagi/core/schema/action_node.py +0 -29
  265. lionagi-0.0.312/lionagi/core/schema/base_mixin.py +0 -296
  266. lionagi-0.0.312/lionagi/core/schema/base_node.py +0 -199
  267. lionagi-0.0.312/lionagi/core/schema/condition.py +0 -24
  268. lionagi-0.0.312/lionagi/core/schema/data_logger.py +0 -354
  269. lionagi-0.0.312/lionagi/core/schema/data_node.py +0 -93
  270. lionagi-0.0.312/lionagi/core/schema/prompt_template.py +0 -67
  271. lionagi-0.0.312/lionagi/core/schema/structure.py +0 -910
  272. lionagi-0.0.312/lionagi/core/session/__init__.py +0 -3
  273. lionagi-0.0.312/lionagi/core/session/session.py +0 -983
  274. lionagi-0.0.312/lionagi/core/tool/__init__.py +0 -3
  275. lionagi-0.0.312/lionagi/core/tool/tool_manager.py +0 -280
  276. lionagi-0.0.312/lionagi/integrations/bridge/pydantic_/base_model.py +0 -7
  277. lionagi-0.0.312/lionagi/integrations/config/ollama_configs.py +0 -1
  278. lionagi-0.0.312/lionagi/integrations/provider/openrouter.py +0 -53
  279. lionagi-0.0.312/lionagi/tests/test_core/test_base_branch.py +0 -427
  280. lionagi-0.0.312/lionagi/tests/test_core/test_branch.py +0 -292
  281. lionagi-0.0.312/lionagi/tests/test_core/test_chat_flow.py +0 -63
  282. lionagi-0.0.312/lionagi/tests/test_core/test_mail_manager.py +0 -75
  283. lionagi-0.0.312/lionagi/tests/test_core/test_prompts.py +0 -51
  284. lionagi-0.0.312/lionagi/tests/test_core/test_session.py +0 -254
  285. lionagi-0.0.312/lionagi/tests/test_core/test_session_base_util.py +0 -312
  286. lionagi-0.0.312/lionagi/tests/test_core/test_tool_manager.py +0 -95
  287. lionagi-0.0.312/lionagi/version.py +0 -1
  288. lionagi-0.0.312/lionagi.egg-info/SOURCES.txt +0 -116
  289. {lionagi-0.0.312 → lionagi-0.2.3}/README.rst +0 -0
  290. {lionagi-0.0.312/lionagi/integrations → lionagi-0.2.3/lionagi/core}/__init__.py +0 -0
  291. {lionagi-0.0.312/lionagi/core/branch/base → lionagi-0.2.3/lionagi/core/_setting}/__init__.py +0 -0
  292. {lionagi-0.0.312/lionagi/core/flow → lionagi-0.2.3/lionagi/core/agent}/__init__.py +0 -0
  293. {lionagi-0.0.312/lionagi/core/flow/base → lionagi-0.2.3/lionagi/core/agent/eval}/__init__.py +0 -0
  294. {lionagi-0.0.312/lionagi/core/prompt → lionagi-0.2.3/lionagi/core/agent/learn}/__init__.py +0 -0
  295. {lionagi-0.0.312/lionagi/integrations/bridge/langchain_ → lionagi-0.2.3/lionagi/core/agent/plan}/__init__.py +0 -0
  296. /lionagi-0.0.312/lionagi/core/tool/manual.py → /lionagi-0.2.3/lionagi/core/agent/plan/plan.py +0 -0
  297. {lionagi-0.0.312/lionagi/integrations/bridge/llamaindex_ → lionagi-0.2.3/lionagi/core/director}/__init__.py +0 -0
  298. {lionagi-0.0.312/lionagi/integrations/bridge/pydantic_ → lionagi-0.2.3/lionagi/core/engine}/__init__.py +0 -0
  299. {lionagi-0.0.312/lionagi/tests → lionagi-0.2.3/lionagi/core/executor}/__init__.py +0 -0
  300. {lionagi-0.0.312/lionagi/tests/test_core → lionagi-0.2.3/lionagi/core/rule}/__init__.py +0 -0
  301. {lionagi-0.0.312/lionagi/tests/test_integrations → lionagi-0.2.3/lionagi/core/session}/__init__.py +0 -0
  302. {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/core/unit/template}/__init__.py +0 -0
  303. /lionagi-0.0.312/lionagi/integrations/bridge/llamaindex_/index.py → /lionagi-0.2.3/lionagi/core/validator/__init__.py +0 -0
  304. /lionagi-0.0.312/lionagi/integrations/bridge/pydantic_/pydantic_bridge.py → /lionagi-0.2.3/lionagi/core/work/__init__.py +0 -0
  305. /lionagi-0.0.312/lionagi/tests/test_libs/test_async.py → /lionagi-0.2.3/lionagi/experimental/__init__.py +0 -0
  306. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/__init__.py +0 -0
  307. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/langchain_/langchain_bridge.py +0 -0
  308. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/llamaindex_/reader.py +0 -0
  309. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/bridge/llamaindex_/textnode.py +0 -0
  310. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/config/__init__.py +0 -0
  311. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/config/mlx_configs.py +0 -0
  312. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/__init__.py +0 -0
  313. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/integrations/provider/mistralai.py +0 -0
  314. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_async.py +0 -0
  315. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi/libs/ln_dataframe.py +0 -0
  316. {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_api.py +0 -0
  317. {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_convert.py +0 -0
  318. {lionagi-0.0.312/lionagi/tests/test_libs → lionagi-0.2.3/lionagi/tests/libs}/test_sys_util.py +0 -0
  319. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi.egg-info/dependency_links.txt +0 -0
  320. {lionagi-0.0.312 → lionagi-0.2.3}/lionagi.egg-info/top_level.txt +0 -0
  321. {lionagi-0.0.312 → lionagi-0.2.3}/setup.cfg +0 -0
@@ -1,4 +1,4 @@
1
- Apache License
1
+ Apache License
2
2
  Version 2.0, January 2004
3
3
  http://www.apache.org/licenses/
4
4
 
@@ -186,16 +186,17 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2023 HaiyangLi <ocean@lionagi.ai>
190
189
 
191
- Licensed under the Apache License, Version 2.0 (the "License");
192
- you may not use this file except in compliance with the License.
193
- You may obtain a copy of the License at
190
+ Copyright 2024 HaiyangLi
194
191
 
195
- http://www.apache.org/licenses/LICENSE-2.0
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
196
195
 
197
- Unless required by applicable law or agreed to in writing, software
198
- distributed under the License is distributed on an "AS IS" BASIS,
199
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
- See the License for the specific language governing permissions and
201
- limitations under the License.
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lionagi
3
- Version: 0.0.312
3
+ Version: 0.2.3
4
4
  Summary: Towards automated general intelligence.
5
5
  Author: HaiyangLi
6
6
  Author-email: Haiyang Li <ocean@lionagi.ai>
7
- License: Apache License
7
+ License: Apache License
8
8
  Version 2.0, January 2004
9
9
  http://www.apache.org/licenses/
10
10
 
@@ -192,19 +192,20 @@ License: Apache License
192
192
  same "printed page" as the copyright notice for easier
193
193
  identification within third-party archives.
194
194
 
195
- Copyright 2023 HaiyangLi <ocean@lionagi.ai>
196
195
 
197
- Licensed under the Apache License, Version 2.0 (the "License");
198
- you may not use this file except in compliance with the License.
199
- You may obtain a copy of the License at
196
+ Copyright 2024 HaiyangLi
200
197
 
201
- http://www.apache.org/licenses/LICENSE-2.0
198
+ Licensed under the Apache License, Version 2.0 (the "License");
199
+ you may not use this file except in compliance with the License.
200
+ You may obtain a copy of the License at
202
201
 
203
- Unless required by applicable law or agreed to in writing, software
204
- distributed under the License is distributed on an "AS IS" BASIS,
205
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
206
- See the License for the specific language governing permissions and
207
- limitations under the License.
202
+ http://www.apache.org/licenses/LICENSE-2.0
203
+
204
+ Unless required by applicable law or agreed to in writing, software
205
+ distributed under the License is distributed on an "AS IS" BASIS,
206
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
207
+ See the License for the specific language governing permissions and
208
+ limitations under the License.
208
209
 
209
210
  Project-URL: PyPI, https://pypi.org/project/lionagi/
210
211
  Project-URL: Repository, https://github.com/lion-agi/lionagi
@@ -221,135 +222,40 @@ Requires-Dist: tiktoken>=0.5.1
221
222
  Requires-Dist: pydantic>=2.6.0
222
223
  Requires-Dist: aiocache>=0.12.2
223
224
  Requires-Dist: pandas>=2.1.0
225
+ Requires-Dist: pytest>=8.2.2
226
+ Requires-Dist: moto>=5.0.9
227
+ Requires-Dist: PyYAML>=6.0.1
228
+ Requires-Dist: boto3>=1.34.131
224
229
 
225
230
  ![PyPI - Version](https://img.shields.io/pypi/v/lionagi?labelColor=233476aa&color=231fc935) ![PyPI - Downloads](https://img.shields.io/pypi/dm/lionagi?color=blue)
226
231
 
227
232
 
233
+ [PyPI](https://pypi.org/project/lionagi/) | [Documentation](https://ocean-lion.com/Welcome) | [Discord](https://discord.gg/aqSJ2v46vu) | [Roadmap](https://trello.com/b/3seomsrI/lionagi)
228
234
 
229
- [PyPI](https://pypi.org/project/lionagi/) | [Documentation](https://ocean-lion.com/Welcome) | [Discord](https://discord.gg/xCkA5ErGmV)
230
235
 
231
- ```
232
- Documentation for v0.0.300+ is in progress
236
+ # Language InterOperable Network - LION
237
+ ### an AGentic Intelligence Operating System
233
238
 
234
- To contribute, you need to make a fork first, and then make pull request from your fork.
235
239
  ```
236
-
237
- # LionAGI
238
-
239
-
240
- **LionAGI is undergoing major transformation.**
241
-
242
- It is an intelligent agentic workflow automation framework. It introduces advanced ML models into any existing workflows and data infrastructure.
243
-
244
- #### Currently, it can
245
-
246
- - generate inferences from almost all models including local
247
- - run most model inferencing in parallel
248
- - produce structured pydantic outputs with flexible usage
249
- - automate workflow via graph based agents
250
- - use advanced prompting techniques, i.e. ReAct (reason-action)
251
- - …
252
-
253
- #### It aims to:
254
-
255
- - provide a centralized agent-managed framework for ML-powered tools coordination.
256
- - such that, people can utilize intelligence to solve their problems in real life.
257
- - achieve the goal by dramatically lowering the barrier of entries for creating use-case/domain specific tools.
258
-
259
- #### Why?
260
-
261
- - To better the human experience for more.
262
-
263
- ---
264
-
240
+ pip install lionagi==0.2.2
241
+ ```
265
242
 
266
243
  **Powerful Intelligent Workflow Automation**
267
244
 
268
- LionAGI is an **intelligent agent framework**. Tailored for **big data analysis** in conjunction with advanced **machine learning** tools, designed for data-centric, production-level projects. Lionagi provides a set of robust tools, enabling flexible and rapid design of agentic workflow, for your own data.
245
+ lionagi is an intelligent agentic workflow automation framework. It introduces advanced ML models into any existing workflows and data infrastructure.
269
246
 
270
247
 
271
- ## Why Automating Workflows?
248
+ ### Why Automating Workflows?
272
249
 
273
250
  Intelligent AI models such as [Large Language Model (LLM)](https://en.wikipedia.org/wiki/Large_language_model), introduced new possibilities of human-computer interaction. LLMs is drawing a lot of attention worldwide due to its “one model fits all”, and incredible performance. One way of using LLM is to use as search engine, however, this usage is complicated by the fact that LLMs [hallucinate](https://arxiv.org/abs/2311.05232).
274
251
 
275
- What goes inside of a LLM is more akin to a [black-box](https://pauldeepakraj-r.medium.com/demystifying-the-black-box-a-deep-dive-into-llm-interpretability-971524966fdf), lacking interpretability, meaning we don’t know how it reaches certain answer or conclusion, thus we cannot fully trust/rely the output from such a system.
276
-
277
- <img width="500" alt="ReAct flow" src="https://github.com/lion-agi/lionagi/assets/122793010/fabec1eb-fa8e-4ce9-b75f-b7aca4809c0f">
278
-
279
-
280
- Another approach of using LLM is to treat them as [intelligent agent](https://arxiv.org/html/2401.03428v1), that are equipped with various tools and data sources. A workflow conducted by such an intelligent agent have clear steps, and we can specify, observe, evaluate and optimize the logic for each decision that the `agent` made to perform actions. This approach, though we still cannot pinpoint how LLM output what it outputs, but the flow itself is **explainable**.
281
-
282
- LionAGI `agent` can manage and direct other agents, can also use multiple different tools in parallel.
283
-
284
- <img width="700" alt="parallel agents" src="https://github.com/lion-agi/lionagi/assets/122793010/ab263a6a-c7cc-40c3-8c03-ba1968df7309">
285
-
286
-
287
- ### Install LionAGI with pip:
288
-
289
- ```bash
290
- pip install lionagi
291
- ```
292
- Download the `.env_template` file, input your appropriate `API_KEY`, save the file, rename as `.env` and put in your project's root directory.
293
- by default we use `OPENAI_API_KEY`.
294
-
295
-
296
- ### Quick Start
297
-
298
- The following example shows how to use LionAGI's `Session` object to interact with `gpt-4-turbo` model:
299
-
300
- ```python
301
-
302
- # define system messages, context and user instruction
303
- system = "You are a helpful assistant designed to perform calculations."
304
- instruction = {"Addition":"Add the two numbers together i.e. x+y"}
305
- context = {"x": 10, "y": 5}
306
-
307
- model="gpt-4-turbo-preview"
308
- ```
309
-
310
- ```python
311
- # in interactive environment (.ipynb for example)
312
- from lionagi import Session
313
-
314
- calculator = Session(system)
315
- result = await calculator.chat(instruction, context=context, model=model)
316
-
317
- print(f"Calculation Result: {result}")
318
- ```
319
-
320
- ```python
321
- # or otherwise, you can use
322
- import asyncio
323
- from dotenv import load_dotenv
324
-
325
- load_dotenv()
326
-
327
- from lionagi import Session
328
-
329
- async def main():
330
- calculator = Session(system)
331
- result = await calculator.chat(instruction, context=context, model=model)
332
-
333
- print(f"Calculation Result: {result}")
334
-
335
- if __name__ == "__main__":
336
- asyncio.run(main())
337
- ```
338
-
339
- Visit our notebooks for examples.
252
+ What goes inside of a LLM is more akin to a [black-box](https://pauldeepakraj-r.medium.com/demystifying-the-black-box-a-deep-dive-into-llm-interpretability-971524966fdf), lacking interpretability, meaning we don’t know how it reaches certain answer or conclusion, thus we cannot fully trust/rely the output from such a system. Another approach of using LLM is to treat them as [intelligent agent](https://arxiv.org/html/2401.03428v1), that are equipped with various tools and data sources. A workflow conducted by such an intelligent agent have clear steps, and we can specify, observe, evaluate and optimize the logic for each decision that the `agent` made to perform actions. This approach, though we still cannot pinpoint how LLM output what it outputs, but the flow itself is **explainable**.
340
253
 
341
- LionAGI is designed to be `asynchronous` only, please check python official documentation on how `async` work: [here](https://docs.python.org/3/library/asyncio.html)
342
254
 
343
- ---
344
255
 
345
- **Notice**:
346
- * calling API with maximum throughput over large set of data with advanced models i.e. gpt-4 can get **EXPENSIVE IN JUST SECONDS**,
347
- * please know what you are doing, and check the usage on OpenAI regularly
348
- * default rate limits are set to be 1,000 requests, 100,000 tokens per miniute, please check the [OpenAI usage limit documentation](https://platform.openai.com/docs/guides/rate-limits?context=tier-free) you can modify token rate parameters to fit different use cases.
349
- * if you would like to build from source, please download the [latest release](https://github.com/lion-agi/lionagi/releases),
350
256
  ### Community
351
257
 
352
- We encourage contributions to LionAGI and invite you to enrich its features and capabilities. Engage with us and other community members [Join Our Discord](https://discord.gg/7RGWqpSxze)
258
+ We encourage contributions to LionAGI and invite you to enrich its features and capabilities. Engage with us and other community members [Join Our Discord](https://discord.gg/aqSJ2v46vu)
353
259
 
354
260
  ### Citation
355
261
 
@@ -0,0 +1,48 @@
1
+ ![PyPI - Version](https://img.shields.io/pypi/v/lionagi?labelColor=233476aa&color=231fc935) ![PyPI - Downloads](https://img.shields.io/pypi/dm/lionagi?color=blue)
2
+
3
+
4
+ [PyPI](https://pypi.org/project/lionagi/) | [Documentation](https://ocean-lion.com/Welcome) | [Discord](https://discord.gg/aqSJ2v46vu) | [Roadmap](https://trello.com/b/3seomsrI/lionagi)
5
+
6
+
7
+ # Language InterOperable Network - LION
8
+ ### an AGentic Intelligence Operating System
9
+
10
+ ```
11
+ pip install lionagi==0.2.2
12
+ ```
13
+
14
+ **Powerful Intelligent Workflow Automation**
15
+
16
+ lionagi is an intelligent agentic workflow automation framework. It introduces advanced ML models into any existing workflows and data infrastructure.
17
+
18
+
19
+ ### Why Automating Workflows?
20
+
21
+ Intelligent AI models such as [Large Language Model (LLM)](https://en.wikipedia.org/wiki/Large_language_model), introduced new possibilities of human-computer interaction. LLMs is drawing a lot of attention worldwide due to its “one model fits all”, and incredible performance. One way of using LLM is to use as search engine, however, this usage is complicated by the fact that LLMs [hallucinate](https://arxiv.org/abs/2311.05232).
22
+
23
+ What goes inside of a LLM is more akin to a [black-box](https://pauldeepakraj-r.medium.com/demystifying-the-black-box-a-deep-dive-into-llm-interpretability-971524966fdf), lacking interpretability, meaning we don’t know how it reaches certain answer or conclusion, thus we cannot fully trust/rely the output from such a system. Another approach of using LLM is to treat them as [intelligent agent](https://arxiv.org/html/2401.03428v1), that are equipped with various tools and data sources. A workflow conducted by such an intelligent agent have clear steps, and we can specify, observe, evaluate and optimize the logic for each decision that the `agent` made to perform actions. This approach, though we still cannot pinpoint how LLM output what it outputs, but the flow itself is **explainable**.
24
+
25
+
26
+
27
+ ### Community
28
+
29
+ We encourage contributions to LionAGI and invite you to enrich its features and capabilities. Engage with us and other community members [Join Our Discord](https://discord.gg/aqSJ2v46vu)
30
+
31
+ ### Citation
32
+
33
+ When referencing LionAGI in your projects or research, please cite:
34
+
35
+ ```bibtex
36
+ @software{Li_LionAGI_2023,
37
+ author = {Haiyang Li},
38
+ month = {12},
39
+ year = {2023},
40
+ title = {LionAGI: Towards Automated General Intelligence},
41
+ url = {https://github.com/lion-agi/lionagi},
42
+ }
43
+ ```
44
+
45
+
46
+ ### Requirements
47
+ Python 3.10 or higher.
48
+
@@ -0,0 +1,73 @@
1
+ """
2
+ Copyright 2024 HaiyangLi
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
17
+ import logging
18
+ from .version import __version__
19
+ from dotenv import load_dotenv
20
+
21
+ from lionagi.libs.ln_convert import to_list, to_dict, to_df, to_readable_dict
22
+ from lionagi.libs.ln_func_call import alcall, bcall, lcall, CallDecorator as cd, tcall
23
+ from lionagi.core.collections.abc import Field
24
+ from lionagi.core.collections import progression, flow, pile, iModel
25
+ from lionagi.core.generic import Node, Graph, Tree, Edge
26
+ from lionagi.core.action import func_to_tool
27
+ from lionagi.core.report import Form, Report
28
+ from lionagi.core.session.branch import Branch
29
+ from lionagi.core.session.session import Session
30
+ from lionagi.core.work.worker import work, Worker, worklink
31
+ from lionagi.integrations.provider.services import Services
32
+ from lionagi.integrations.chunker.chunk import chunk
33
+ from lionagi.integrations.loader.load import load
34
+ import lionagi.core.director.direct as direct
35
+
36
+
37
+ __all__ = [
38
+ "Field",
39
+ "progression",
40
+ "flow",
41
+ "pile",
42
+ "iModel",
43
+ "work",
44
+ "worklink",
45
+ "Worker",
46
+ "Branch",
47
+ "Session",
48
+ "Form",
49
+ "Report",
50
+ "Services",
51
+ "direct",
52
+ "Node",
53
+ "Graph",
54
+ "Tree",
55
+ "Edge",
56
+ "chunk",
57
+ "load",
58
+ "func_to_tool",
59
+ "cd",
60
+ "alcall",
61
+ "bcall",
62
+ "to_list",
63
+ "to_dict",
64
+ "lcall",
65
+ "to_df",
66
+ "tcall",
67
+ "to_readable_dict",
68
+ ]
69
+
70
+
71
+ logger = logging.getLogger(__name__)
72
+ logger.setLevel(logging.INFO)
73
+ load_dotenv()
@@ -0,0 +1,59 @@
1
+ # TODO
2
+
3
+ # import csv
4
+ # import json
5
+ # import threading
6
+ # from contextlib import contextmanager
7
+
8
+
9
+ # class Settings:
10
+ # def __init__(self):
11
+ # self._lock = threading.Lock()
12
+ # self._config = {}
13
+ # self._default_service = None
14
+
15
+ # def load_from_json(self, file_path):
16
+ # with self._lock:
17
+ # with open(file_path, "r") as file:
18
+ # self._config = json.load(file)
19
+
20
+ # def save_to_json(self, file_path):
21
+ # with self._lock:
22
+ # with open(file_path, "w") as file:
23
+ # json.dump(self._config, file, indent=4)
24
+
25
+ # def load_default_service(self, file_path):
26
+ # with self._lock:
27
+ # with open(file_path, "r") as file:
28
+ # reader = csv.DictReader(file)
29
+ # self._default_service = next(reader)
30
+
31
+ # def save_default_service(self, file_path):
32
+ # with self._lock:
33
+ # fieldnames = ["provider", "api_key", "rate_limit"]
34
+ # with open(file_path, "w", newline="") as file:
35
+ # writer = csv.DictWriter(file, fieldnames=fieldnames)
36
+ # writer.writeheader()
37
+ # writer.writerow(self._default_service)
38
+
39
+ # @contextmanager
40
+ # def service_context(self, provider=None, api_key=None, rate_limit=None):
41
+ # with self._lock:
42
+ # service_config = {
43
+ # "provider": provider or self._default_service["provider"],
44
+ # "api_key": api_key or self._default_service["api_key"],
45
+ # "rate_limit": rate_limit or self._default_service["rate_limit"],
46
+ # }
47
+ # yield service_config
48
+
49
+ # def get_config(self, key):
50
+ # with self._lock:
51
+ # return self._config.get(key)
52
+
53
+ # def set_config(self, key, value):
54
+ # with self._lock:
55
+ # self._config[key] = value
56
+
57
+
58
+ # # Singleton instance
59
+ # lionagi_settings = Settings()
@@ -0,0 +1,14 @@
1
+ from .function_calling import FunctionCalling
2
+ from .tool import Tool
3
+ from .tool_manager import ToolManager, func_to_tool
4
+ from .node import ActionNode, DirectiveSelection
5
+
6
+
7
+ __all__ = [
8
+ "FunctionCalling",
9
+ "Tool",
10
+ "ToolManager",
11
+ "func_to_tool",
12
+ "ActionNode",
13
+ "DirectiveSelection",
14
+ ]
@@ -0,0 +1,136 @@
1
+ """
2
+ Copyright 2024 HaiyangLi
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
17
+ """
18
+ This module defines the FunctionCalling class, which facilitates dynamic
19
+ invocation of functions based on various input types. It supports initializing
20
+ function calls from tuples, dictionaries, ActionRequest objects, or JSON strings.
21
+
22
+ Note:
23
+ Function Calling object is the only way for AI system to call functions.
24
+ """
25
+
26
+ from functools import singledispatchmethod
27
+ from typing import Any, Callable, Dict
28
+
29
+ from lionagi.libs import ParseUtil
30
+ from lionagi.libs.ln_func_call import call_handler
31
+ from lionagi.core.collections.abc import Actionable
32
+ from lionagi.core.message.action_request import ActionRequest
33
+
34
+
35
+ class FunctionCalling(Actionable):
36
+ """
37
+ A class for dynamically invoking functions based on various input types,
38
+ allowing for specification of the function and arguments through multiple
39
+ formats including tuples, dictionaries, ActionRequests, or JSON strings.
40
+ """
41
+
42
+ def __init__(self, function: Callable, arguments: Dict[str, Any] = None):
43
+ """
44
+ Initializes a new instance of FunctionCalling with the given function
45
+ and optional arguments.
46
+
47
+ Args:
48
+ function (Callable): The function to be called.
49
+ arguments (Dict[str, Any]): Arguments to pass to the function.
50
+ Defaults to an empty dictionary.
51
+ """
52
+ self.function = function
53
+ self.arguments = arguments or {}
54
+
55
+ @property
56
+ def func_name(self) -> str:
57
+ """
58
+ Returns the name of the function.
59
+
60
+ Returns:
61
+ str: The function's name.
62
+ """
63
+ return self.function.__name__
64
+
65
+ @singledispatchmethod
66
+ @classmethod
67
+ def create(cls, func_call: Any) -> "FunctionCalling":
68
+ """
69
+ Creates an instance of FunctionCalling based on the type of input.
70
+
71
+ Args:
72
+ func_call (Any): The function call description, which can be a tuple, dict,
73
+ ActionRequest, or JSON string.
74
+
75
+ Returns:
76
+ FunctionCalling: An instance of FunctionCalling prepared to invoke
77
+ the specified function.
78
+
79
+ Raises:
80
+ TypeError: If the input type is not supported.
81
+ """
82
+ raise TypeError(f"Unsupported type {type(func_call)}")
83
+
84
+ @create.register(tuple)
85
+ def _(cls, function_calling: tuple) -> "FunctionCalling":
86
+ if len(function_calling) == 2:
87
+ return cls(function=function_calling[0], arguments=function_calling[1])
88
+ else:
89
+ raise ValueError(f"Invalid function call {function_calling}")
90
+
91
+ @create.register(dict)
92
+ def _(cls, function_calling: Dict[str, Any]) -> "FunctionCalling":
93
+ if len(function_calling) == 2 and (
94
+ {"function", "arguments"} <= function_calling.keys()
95
+ ):
96
+ return cls.create(
97
+ (function_calling["function"], function_calling["arguments"])
98
+ )
99
+ raise ValueError(f"Invalid function call {function_calling}")
100
+
101
+ @create.register(ActionRequest)
102
+ def _(cls, function_calling: ActionRequest) -> "FunctionCalling":
103
+ return cls.create((function_calling.function, function_calling.arguments))
104
+
105
+ @create.register(str)
106
+ def _(cls, function_calling: str) -> "FunctionCalling":
107
+ _call = None
108
+ try:
109
+ _call = ParseUtil.fuzzy_parse_json(function_calling)
110
+ except Exception as e:
111
+ raise ValueError(f"Invalid function call {function_calling}") from e
112
+
113
+ if isinstance(_call, dict):
114
+ return cls.create(_call)
115
+ raise ValueError(f"Invalid function call {function_calling}")
116
+
117
+ async def invoke(self) -> Any:
118
+ """
119
+ Asynchronously invokes the stored function with the provided arguments.
120
+
121
+ Returns:
122
+ Any: The result of the function call.
123
+ """
124
+ return await call_handler(self.function, **self.arguments)
125
+
126
+ def __str__(self) -> str:
127
+ """
128
+ Returns a string representation of the function call.
129
+
130
+ Returns:
131
+ str: String representation of the function call.
132
+ """
133
+ return f"{self.func_name}({self.arguments})"
134
+
135
+ def __repr__(self) -> str:
136
+ return self.__str__()
@@ -0,0 +1 @@
1
+ # TODO
@@ -0,0 +1,109 @@
1
+ """
2
+ Copyright 2024 HaiyangLi
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
17
+ from pydantic import Field
18
+
19
+ from lionagi.core.collections.abc import Actionable
20
+ from lionagi.core.generic.node import Node
21
+ from .tool import Tool
22
+
23
+
24
+ class DirectiveSelection(Node, Actionable):
25
+ """
26
+ Represents a directive selection node which can be invoked to perform an action.
27
+
28
+ Attributes:
29
+ directive (str): The action to be performed, with a default value of "chat".
30
+ directive_kwargs (dict): The arguments for the action.
31
+
32
+ Methods:
33
+ invoke(): An asynchronous method to perform the action defined by the directive.
34
+ """
35
+
36
+ directive: str = Field(
37
+ "chat", description="The action to be performed", alias="action_type"
38
+ )
39
+ directive_kwargs: dict = Field(
40
+ default_factory=dict,
41
+ description="The arguments for the action",
42
+ alias="action_arguments",
43
+ )
44
+
45
+ async def invoke(self):
46
+ """
47
+ Perform the action defined by the directive.
48
+
49
+ This method is intended to be overridden by subclasses to provide specific
50
+ implementation details for the action.
51
+ """
52
+ pass
53
+
54
+
55
+ class ActionNode(DirectiveSelection):
56
+ """
57
+ Represents an action node that can invoke actions within a branch using tools and instructions.
58
+
59
+ Attributes:
60
+ tools (list[Tool] | Tool | None): The tools to be used in the action.
61
+ instruction (Node): The instruction for the action.
62
+
63
+ Methods:
64
+ invoke(branch, context=None): An asynchronous method to invoke the action
65
+ within the given branch.
66
+ """
67
+
68
+ tools: list[Tool] | Tool | None = Field(
69
+ default_factory=list,
70
+ description="The tools to be used in the action",
71
+ alias="tool",
72
+ )
73
+ instruction: Node = Field(
74
+ ..., description="The instruction for the action", alias="instruct"
75
+ )
76
+
77
+ async def invoke(self, branch, context=None):
78
+ """
79
+ Invoke the action within the given branch.
80
+
81
+ Args:
82
+ branch: The branch in which to perform the action.
83
+ context: Optional; Additional context for the action.
84
+
85
+ Returns:
86
+ The result of the action, depending on the directive.
87
+
88
+ Raises:
89
+ ValueError: If the directive is not "chat" or "direct".
90
+ """
91
+ if self.directive == "chat":
92
+ return await branch.chat(
93
+ instruction=self.instruction.instruct,
94
+ tools=self.tools,
95
+ **self.directive_kwargs,
96
+ )
97
+ elif self.directive == "direct":
98
+ if self.tools:
99
+ self.directive_kwargs["allow_action"] = True
100
+ return await branch.direct(
101
+ instruction=self.instruction.instruct,
102
+ context=context,
103
+ tools=self.tools,
104
+ **self.directive_kwargs,
105
+ )
106
+ else:
107
+ raise ValueError(
108
+ 'Invalid directive, valid directives are: "chat", "direct"'
109
+ )