lionagi 0.0.312__py3-none-any.whl → 0.2.1__py3-none-any.whl

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 (268) hide show
  1. lionagi/__init__.py +61 -3
  2. lionagi/core/__init__.py +0 -14
  3. lionagi/core/_setting/_setting.py +59 -0
  4. lionagi/core/action/__init__.py +14 -0
  5. lionagi/core/action/function_calling.py +136 -0
  6. lionagi/core/action/manual.py +1 -0
  7. lionagi/core/action/node.py +109 -0
  8. lionagi/core/action/tool.py +114 -0
  9. lionagi/core/action/tool_manager.py +356 -0
  10. lionagi/core/agent/__init__.py +0 -3
  11. lionagi/core/agent/base_agent.py +45 -36
  12. lionagi/core/agent/eval/evaluator.py +1 -0
  13. lionagi/core/agent/eval/vote.py +40 -0
  14. lionagi/core/agent/learn/learner.py +59 -0
  15. lionagi/core/agent/plan/unit_template.py +1 -0
  16. lionagi/core/collections/__init__.py +17 -0
  17. lionagi/core/collections/_logger.py +319 -0
  18. lionagi/core/collections/abc/__init__.py +53 -0
  19. lionagi/core/collections/abc/component.py +615 -0
  20. lionagi/core/collections/abc/concepts.py +297 -0
  21. lionagi/core/collections/abc/exceptions.py +150 -0
  22. lionagi/core/collections/abc/util.py +45 -0
  23. lionagi/core/collections/exchange.py +161 -0
  24. lionagi/core/collections/flow.py +426 -0
  25. lionagi/core/collections/model.py +419 -0
  26. lionagi/core/collections/pile.py +913 -0
  27. lionagi/core/collections/progression.py +236 -0
  28. lionagi/core/collections/util.py +64 -0
  29. lionagi/core/director/direct.py +314 -0
  30. lionagi/core/director/director.py +2 -0
  31. lionagi/core/engine/branch_engine.py +333 -0
  32. lionagi/core/engine/instruction_map_engine.py +204 -0
  33. lionagi/core/engine/sandbox_.py +14 -0
  34. lionagi/core/engine/script_engine.py +99 -0
  35. lionagi/core/executor/base_executor.py +90 -0
  36. lionagi/core/executor/graph_executor.py +330 -0
  37. lionagi/core/executor/neo4j_executor.py +384 -0
  38. lionagi/core/generic/__init__.py +7 -0
  39. lionagi/core/generic/edge.py +112 -0
  40. lionagi/core/generic/edge_condition.py +16 -0
  41. lionagi/core/generic/graph.py +236 -0
  42. lionagi/core/generic/hyperedge.py +1 -0
  43. lionagi/core/generic/node.py +220 -0
  44. lionagi/core/generic/tree.py +48 -0
  45. lionagi/core/generic/tree_node.py +79 -0
  46. lionagi/core/mail/__init__.py +7 -3
  47. lionagi/core/mail/mail.py +25 -0
  48. lionagi/core/mail/mail_manager.py +142 -58
  49. lionagi/core/mail/package.py +45 -0
  50. lionagi/core/mail/start_mail.py +36 -0
  51. lionagi/core/message/__init__.py +19 -0
  52. lionagi/core/message/action_request.py +133 -0
  53. lionagi/core/message/action_response.py +135 -0
  54. lionagi/core/message/assistant_response.py +95 -0
  55. lionagi/core/message/instruction.py +234 -0
  56. lionagi/core/message/message.py +101 -0
  57. lionagi/core/message/system.py +86 -0
  58. lionagi/core/message/util.py +283 -0
  59. lionagi/core/report/__init__.py +4 -0
  60. lionagi/core/report/base.py +217 -0
  61. lionagi/core/report/form.py +231 -0
  62. lionagi/core/report/report.py +166 -0
  63. lionagi/core/report/util.py +28 -0
  64. lionagi/core/rule/__init__.py +0 -0
  65. lionagi/core/rule/_default.py +16 -0
  66. lionagi/core/rule/action.py +99 -0
  67. lionagi/core/rule/base.py +238 -0
  68. lionagi/core/rule/boolean.py +56 -0
  69. lionagi/core/rule/choice.py +47 -0
  70. lionagi/core/rule/mapping.py +96 -0
  71. lionagi/core/rule/number.py +71 -0
  72. lionagi/core/rule/rulebook.py +109 -0
  73. lionagi/core/rule/string.py +52 -0
  74. lionagi/core/rule/util.py +35 -0
  75. lionagi/core/session/__init__.py +0 -3
  76. lionagi/core/session/branch.py +431 -0
  77. lionagi/core/session/directive_mixin.py +287 -0
  78. lionagi/core/session/session.py +230 -902
  79. lionagi/core/structure/__init__.py +1 -0
  80. lionagi/core/structure/chain.py +1 -0
  81. lionagi/core/structure/forest.py +1 -0
  82. lionagi/core/structure/graph.py +1 -0
  83. lionagi/core/structure/tree.py +1 -0
  84. lionagi/core/unit/__init__.py +5 -0
  85. lionagi/core/unit/parallel_unit.py +245 -0
  86. lionagi/core/unit/template/__init__.py +0 -0
  87. lionagi/core/unit/template/action.py +81 -0
  88. lionagi/core/unit/template/base.py +51 -0
  89. lionagi/core/unit/template/plan.py +84 -0
  90. lionagi/core/unit/template/predict.py +109 -0
  91. lionagi/core/unit/template/score.py +124 -0
  92. lionagi/core/unit/template/select.py +104 -0
  93. lionagi/core/unit/unit.py +362 -0
  94. lionagi/core/unit/unit_form.py +305 -0
  95. lionagi/core/unit/unit_mixin.py +1168 -0
  96. lionagi/core/unit/util.py +71 -0
  97. lionagi/core/validator/__init__.py +0 -0
  98. lionagi/core/validator/validator.py +364 -0
  99. lionagi/core/work/__init__.py +0 -0
  100. lionagi/core/work/work.py +76 -0
  101. lionagi/core/work/work_function.py +101 -0
  102. lionagi/core/work/work_queue.py +103 -0
  103. lionagi/core/work/worker.py +258 -0
  104. lionagi/core/work/worklog.py +120 -0
  105. lionagi/experimental/__init__.py +0 -0
  106. lionagi/experimental/compressor/__init__.py +0 -0
  107. lionagi/experimental/compressor/base.py +46 -0
  108. lionagi/experimental/compressor/llm_compressor.py +247 -0
  109. lionagi/experimental/compressor/llm_summarizer.py +61 -0
  110. lionagi/experimental/compressor/util.py +70 -0
  111. lionagi/experimental/directive/__init__.py +19 -0
  112. lionagi/experimental/directive/parser/__init__.py +0 -0
  113. lionagi/experimental/directive/parser/base_parser.py +282 -0
  114. lionagi/experimental/directive/template/__init__.py +0 -0
  115. lionagi/experimental/directive/template/base_template.py +79 -0
  116. lionagi/experimental/directive/template/schema.py +36 -0
  117. lionagi/experimental/directive/tokenizer.py +73 -0
  118. lionagi/experimental/evaluator/__init__.py +0 -0
  119. lionagi/experimental/evaluator/ast_evaluator.py +131 -0
  120. lionagi/experimental/evaluator/base_evaluator.py +218 -0
  121. lionagi/experimental/knowledge/__init__.py +0 -0
  122. lionagi/experimental/knowledge/base.py +10 -0
  123. lionagi/experimental/knowledge/graph.py +0 -0
  124. lionagi/experimental/memory/__init__.py +0 -0
  125. lionagi/experimental/strategies/__init__.py +0 -0
  126. lionagi/experimental/strategies/base.py +1 -0
  127. lionagi/integrations/bridge/autogen_/__init__.py +0 -0
  128. lionagi/integrations/bridge/autogen_/autogen_.py +124 -0
  129. lionagi/integrations/bridge/langchain_/documents.py +4 -0
  130. lionagi/integrations/bridge/llamaindex_/index.py +30 -0
  131. lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +6 -0
  132. lionagi/integrations/bridge/llamaindex_/llama_pack.py +227 -0
  133. lionagi/integrations/bridge/llamaindex_/node_parser.py +6 -9
  134. lionagi/integrations/bridge/pydantic_/pydantic_bridge.py +1 -0
  135. lionagi/integrations/bridge/transformers_/__init__.py +0 -0
  136. lionagi/integrations/bridge/transformers_/install_.py +36 -0
  137. lionagi/integrations/chunker/__init__.py +0 -0
  138. lionagi/integrations/chunker/chunk.py +312 -0
  139. lionagi/integrations/config/oai_configs.py +38 -7
  140. lionagi/integrations/config/ollama_configs.py +1 -1
  141. lionagi/integrations/config/openrouter_configs.py +14 -2
  142. lionagi/integrations/loader/__init__.py +0 -0
  143. lionagi/integrations/loader/load.py +253 -0
  144. lionagi/integrations/loader/load_util.py +195 -0
  145. lionagi/integrations/provider/_mapping.py +46 -0
  146. lionagi/integrations/provider/litellm.py +2 -1
  147. lionagi/integrations/provider/mlx_service.py +16 -9
  148. lionagi/integrations/provider/oai.py +91 -4
  149. lionagi/integrations/provider/ollama.py +7 -6
  150. lionagi/integrations/provider/openrouter.py +115 -8
  151. lionagi/integrations/provider/services.py +2 -2
  152. lionagi/integrations/provider/transformers.py +18 -22
  153. lionagi/integrations/storage/__init__.py +3 -0
  154. lionagi/integrations/storage/neo4j.py +665 -0
  155. lionagi/integrations/storage/storage_util.py +287 -0
  156. lionagi/integrations/storage/structure_excel.py +285 -0
  157. lionagi/integrations/storage/to_csv.py +63 -0
  158. lionagi/integrations/storage/to_excel.py +83 -0
  159. lionagi/libs/__init__.py +26 -1
  160. lionagi/libs/ln_api.py +78 -23
  161. lionagi/libs/ln_context.py +37 -0
  162. lionagi/libs/ln_convert.py +21 -9
  163. lionagi/libs/ln_func_call.py +69 -28
  164. lionagi/libs/ln_image.py +107 -0
  165. lionagi/libs/ln_knowledge_graph.py +405 -0
  166. lionagi/libs/ln_nested.py +26 -11
  167. lionagi/libs/ln_parse.py +110 -14
  168. lionagi/libs/ln_queue.py +117 -0
  169. lionagi/libs/ln_tokenize.py +164 -0
  170. lionagi/{core/prompt/field_validator.py → libs/ln_validate.py} +79 -14
  171. lionagi/libs/special_tokens.py +172 -0
  172. lionagi/libs/sys_util.py +107 -2
  173. lionagi/lions/__init__.py +0 -0
  174. lionagi/lions/coder/__init__.py +0 -0
  175. lionagi/lions/coder/add_feature.py +20 -0
  176. lionagi/lions/coder/base_prompts.py +22 -0
  177. lionagi/lions/coder/code_form.py +13 -0
  178. lionagi/lions/coder/coder.py +168 -0
  179. lionagi/lions/coder/util.py +96 -0
  180. lionagi/lions/researcher/__init__.py +0 -0
  181. lionagi/lions/researcher/data_source/__init__.py +0 -0
  182. lionagi/lions/researcher/data_source/finhub_.py +191 -0
  183. lionagi/lions/researcher/data_source/google_.py +199 -0
  184. lionagi/lions/researcher/data_source/wiki_.py +96 -0
  185. lionagi/lions/researcher/data_source/yfinance_.py +21 -0
  186. lionagi/tests/integrations/__init__.py +0 -0
  187. lionagi/tests/libs/__init__.py +0 -0
  188. lionagi/tests/libs/test_field_validators.py +353 -0
  189. lionagi/tests/{test_libs → libs}/test_func_call.py +23 -21
  190. lionagi/tests/{test_libs → libs}/test_nested.py +36 -21
  191. lionagi/tests/{test_libs → libs}/test_parse.py +1 -1
  192. lionagi/tests/libs/test_queue.py +67 -0
  193. lionagi/tests/test_core/collections/__init__.py +0 -0
  194. lionagi/tests/test_core/collections/test_component.py +206 -0
  195. lionagi/tests/test_core/collections/test_exchange.py +138 -0
  196. lionagi/tests/test_core/collections/test_flow.py +145 -0
  197. lionagi/tests/test_core/collections/test_pile.py +171 -0
  198. lionagi/tests/test_core/collections/test_progression.py +129 -0
  199. lionagi/tests/test_core/generic/__init__.py +0 -0
  200. lionagi/tests/test_core/generic/test_edge.py +67 -0
  201. lionagi/tests/test_core/generic/test_graph.py +96 -0
  202. lionagi/tests/test_core/generic/test_node.py +106 -0
  203. lionagi/tests/test_core/generic/test_tree_node.py +73 -0
  204. lionagi/tests/test_core/test_branch.py +115 -292
  205. lionagi/tests/test_core/test_form.py +46 -0
  206. lionagi/tests/test_core/test_report.py +105 -0
  207. lionagi/tests/test_core/test_validator.py +111 -0
  208. lionagi/version.py +1 -1
  209. {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/LICENSE +12 -11
  210. {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/METADATA +19 -118
  211. lionagi-0.2.1.dist-info/RECORD +240 -0
  212. lionagi/core/branch/__init__.py +0 -4
  213. lionagi/core/branch/base_branch.py +0 -654
  214. lionagi/core/branch/branch.py +0 -471
  215. lionagi/core/branch/branch_flow_mixin.py +0 -96
  216. lionagi/core/branch/executable_branch.py +0 -347
  217. lionagi/core/branch/util.py +0 -323
  218. lionagi/core/direct/__init__.py +0 -6
  219. lionagi/core/direct/predict.py +0 -161
  220. lionagi/core/direct/score.py +0 -278
  221. lionagi/core/direct/select.py +0 -169
  222. lionagi/core/direct/utils.py +0 -87
  223. lionagi/core/direct/vote.py +0 -64
  224. lionagi/core/flow/base/baseflow.py +0 -23
  225. lionagi/core/flow/monoflow/ReAct.py +0 -238
  226. lionagi/core/flow/monoflow/__init__.py +0 -9
  227. lionagi/core/flow/monoflow/chat.py +0 -95
  228. lionagi/core/flow/monoflow/chat_mixin.py +0 -263
  229. lionagi/core/flow/monoflow/followup.py +0 -214
  230. lionagi/core/flow/polyflow/__init__.py +0 -1
  231. lionagi/core/flow/polyflow/chat.py +0 -248
  232. lionagi/core/mail/schema.py +0 -56
  233. lionagi/core/messages/__init__.py +0 -3
  234. lionagi/core/messages/schema.py +0 -533
  235. lionagi/core/prompt/prompt_template.py +0 -316
  236. lionagi/core/schema/__init__.py +0 -22
  237. lionagi/core/schema/action_node.py +0 -29
  238. lionagi/core/schema/base_mixin.py +0 -296
  239. lionagi/core/schema/base_node.py +0 -199
  240. lionagi/core/schema/condition.py +0 -24
  241. lionagi/core/schema/data_logger.py +0 -354
  242. lionagi/core/schema/data_node.py +0 -93
  243. lionagi/core/schema/prompt_template.py +0 -67
  244. lionagi/core/schema/structure.py +0 -910
  245. lionagi/core/tool/__init__.py +0 -3
  246. lionagi/core/tool/tool_manager.py +0 -280
  247. lionagi/integrations/bridge/pydantic_/base_model.py +0 -7
  248. lionagi/tests/test_core/test_base_branch.py +0 -427
  249. lionagi/tests/test_core/test_chat_flow.py +0 -63
  250. lionagi/tests/test_core/test_mail_manager.py +0 -75
  251. lionagi/tests/test_core/test_prompts.py +0 -51
  252. lionagi/tests/test_core/test_session.py +0 -254
  253. lionagi/tests/test_core/test_session_base_util.py +0 -312
  254. lionagi/tests/test_core/test_tool_manager.py +0 -95
  255. lionagi-0.0.312.dist-info/RECORD +0 -111
  256. /lionagi/core/{branch/base → _setting}/__init__.py +0 -0
  257. /lionagi/core/{flow → agent/eval}/__init__.py +0 -0
  258. /lionagi/core/{flow/base → agent/learn}/__init__.py +0 -0
  259. /lionagi/core/{prompt → agent/plan}/__init__.py +0 -0
  260. /lionagi/core/{tool/manual.py → agent/plan/plan.py} +0 -0
  261. /lionagi/{tests/test_integrations → core/director}/__init__.py +0 -0
  262. /lionagi/{tests/test_libs → core/engine}/__init__.py +0 -0
  263. /lionagi/{tests/test_libs/test_async.py → core/executor/__init__.py} +0 -0
  264. /lionagi/tests/{test_libs → libs}/test_api.py +0 -0
  265. /lionagi/tests/{test_libs → libs}/test_convert.py +0 -0
  266. /lionagi/tests/{test_libs → libs}/test_sys_util.py +0 -0
  267. {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/WHEEL +0 -0
  268. {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/top_level.txt +0 -0
@@ -28,6 +28,10 @@ def to_langchain_document(datanode: T, **kwargs: Any) -> Any:
28
28
  SysUtil.change_dict_key(dnode, old_key="content", new_key="page_content")
29
29
  SysUtil.change_dict_key(dnode, old_key="lc_id", new_key="id_")
30
30
  dnode = {**dnode, **kwargs}
31
+ dnode = {k: v for k, v in dnode.items() if v is not None}
32
+ if "page_content" not in dnode:
33
+ dnode["page_content"] = ""
34
+
31
35
  return LangchainDocument(**dnode)
32
36
 
33
37
 
@@ -0,0 +1,30 @@
1
+ class LlamaIndex:
2
+
3
+ @classmethod
4
+ def index(
5
+ cls,
6
+ nodes,
7
+ llm_obj=None,
8
+ llm_class=None,
9
+ llm_kwargs=None,
10
+ index_type=None,
11
+ **kwargs,
12
+ ):
13
+ from llama_index.core import Settings
14
+ from llama_index.llms.openai import OpenAI
15
+
16
+ if not llm_obj:
17
+ llm_class = llm_class or OpenAI
18
+ llm_kwargs = llm_kwargs or {}
19
+ if "model" not in llm_kwargs:
20
+ llm_kwargs["model"] = "gpt-4o"
21
+ llm_obj = llm_class(**llm_kwargs)
22
+
23
+ Settings.llm = llm_obj
24
+
25
+ if not index_type:
26
+ from llama_index.core import VectorStoreIndex
27
+
28
+ index_type = VectorStoreIndex
29
+
30
+ return index_type(nodes, **kwargs)
@@ -100,3 +100,9 @@ class LlamaIndexBridge:
100
100
  from .reader import get_llama_index_reader
101
101
 
102
102
  return get_llama_index_reader(*args, **kwargs)
103
+
104
+ @staticmethod
105
+ def index(nodes, **kwargs):
106
+ from .index import LlamaIndex
107
+
108
+ return LlamaIndex.index(nodes, **kwargs)
@@ -0,0 +1,227 @@
1
+ class LlamaPack:
2
+
3
+ @staticmethod
4
+ def download(pack_name, pack_path):
5
+ try:
6
+ from llama_index.llama_pack import download_llama_pack
7
+
8
+ return download_llama_pack(pack_name, pack_path)
9
+ except Exception as e:
10
+ raise ImportError(f"Error in downloading llama pack: {e}")
11
+
12
+ @staticmethod
13
+ def build(pack_name, pack_path, args=[], **kwargs):
14
+ pack = LlamaPack.download(pack_name, pack_path)
15
+ return pack(*args, **kwargs)
16
+
17
+ @staticmethod
18
+ def stock_market_pack(pack_path="./stock_market_data_pack", args=[], **kwargs):
19
+ name_ = "StockMarketDataQueryEnginePack"
20
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
21
+
22
+ @staticmethod
23
+ def embedded_table_pack(
24
+ pack_path="./embedded_tables_unstructured_pack", args=[], **kwargs
25
+ ):
26
+ name_ = "RecursiveRetrieverSmallToBigPack"
27
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
28
+
29
+ @staticmethod
30
+ def rag_evaluator_pack(pack_path="./rag_evaluator_pack", args=[], **kwargs):
31
+ name_ = "RagEvaluatorPack"
32
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
33
+
34
+ @staticmethod
35
+ def ollma_pack(pack_path="./ollama_pack", args=[], **kwargs):
36
+ name_ = "OllamaQueryEnginePack"
37
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
38
+
39
+ @staticmethod
40
+ def llm_compiler_agent_pack(
41
+ pack_path="./llm_compiler_agent_pack", args=[], **kwargs
42
+ ):
43
+ name_ = "LLMCompilerAgentPack"
44
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
45
+
46
+ @staticmethod
47
+ def resume_screener_pack(pack_path="./resume_screener_pack", args=[], **kwargs):
48
+ name_ = "ResumeScreenerPack"
49
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
50
+
51
+ @staticmethod
52
+ def ragatouille_retriever_pack(pack_path="./ragatouille_pack", args=[], **kwargs):
53
+ name_ = "RAGatouilleRetrieverPack"
54
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
55
+
56
+ @staticmethod
57
+ def chain_of_table_pack(pack_path="./chain_of_table_pack", args=[], **kwargs):
58
+ name_ = "ChainOfTablePack"
59
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
60
+
61
+ @staticmethod
62
+ def hybrid_fusion_retriever_pack(
63
+ pack_path="./hybrid_fusion_pack", args=[], **kwargs
64
+ ):
65
+ name_ = "HybridFusionRetrieverPack"
66
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
67
+
68
+ @staticmethod
69
+ def neo4j_query_engine_pack(pack_path="./neo4j_pack", args=[], **kwargs):
70
+ name_ = "Neo4jQueryEnginePack"
71
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
72
+
73
+ @staticmethod
74
+ def llava_completion_pack(pack_path="./llava_pack", args=[], **kwargs):
75
+ name_ = "LlavaCompletionPack"
76
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
77
+
78
+ @staticmethod
79
+ def sentence_window_retriever_pack(
80
+ pack_path="./sentence_window_retriever_pack", args=[], **kwargs
81
+ ):
82
+ name_ = "SentenceWindowRetrieverPack"
83
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
84
+
85
+ @staticmethod
86
+ def dense_x_retrieval_pack(pack_path="./dense_pack", args=[], **kwargs):
87
+ name_ = "DenseXRetrievalPack"
88
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
89
+
90
+ @staticmethod
91
+ def zephyr_query_engine_pack(pack_path="./zephyr_pack", args=[], **kwargs):
92
+ name_ = "ZephyrQueryEnginePack"
93
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
94
+
95
+ @staticmethod
96
+ def query_rewriting_retriever_pack(
97
+ pack_path="./query_rewriting_pack", args=[], **kwargs
98
+ ):
99
+ name_ = "QueryRewritingRetrieverPack"
100
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
101
+
102
+ @staticmethod
103
+ def fuzzy_citation_engine_pack(
104
+ pack_path="./fuzzy_citation_pack", args=[], **kwargs
105
+ ):
106
+ name_ = "FuzzyCitationEnginePack"
107
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
108
+
109
+ @staticmethod
110
+ def multidoc_auto_retriever_pack(
111
+ pack_path="./multidoc_autoretrieval_pack", args=[], **kwargs
112
+ ):
113
+ name_ = "MultiDocAutoRetrieverPack"
114
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
115
+
116
+ @staticmethod
117
+ def auto_merging_retriever_pack(
118
+ pack_path="./auto_merging_retriever_pack", args=[], **kwargs
119
+ ):
120
+ name_ = "AutoMergingRetrieverPack"
121
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
122
+
123
+ @staticmethod
124
+ def voyage_query_engine_pack(pack_path="./voyage_pack", args=[], **kwargs):
125
+ name_ = "VoyageQueryEnginePack"
126
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
127
+
128
+ @staticmethod
129
+ def mix_self_consistency_pack(
130
+ pack_path="./mix_self_consistency_pack", args=[], **kwargs
131
+ ):
132
+ name_ = "MixSelfConsistencyPack"
133
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
134
+
135
+ @staticmethod
136
+ def rag_fusion_pipeline_pack(
137
+ pack_path="./rag_fusion_pipeline_pack", args=[], **kwargs
138
+ ):
139
+ name_ = "RAGFusionPipelinePack"
140
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
141
+
142
+ @staticmethod
143
+ def multi_document_agents_pack(
144
+ pack_path="./multi_doc_agents_pack", args=[], **kwargs
145
+ ):
146
+ name_ = "MultiDocumentAgentsPack"
147
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
148
+
149
+ @staticmethod
150
+ def llama_guard_moderator_pack(pack_path="./llamaguard_pack", args=[], **kwargs):
151
+ name_ = "LlamaGuardModeratorPack"
152
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
153
+
154
+ @staticmethod
155
+ def evaluator_benchmarker_pack(
156
+ pack_path="./eval_benchmark_pack", args=[], **kwargs
157
+ ):
158
+ name_ = "EvaluatorBenchmarkerPack"
159
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
160
+
161
+ @staticmethod
162
+ def amazon_product_extraction_pack(
163
+ pack_path="./amazon_product_extraction_pack", args=[], **kwargs
164
+ ):
165
+ name_ = "AmazonProductExtractionPack"
166
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
167
+
168
+ @staticmethod
169
+ def llama_dataset_metadata_pack(
170
+ pack_path="./llama_dataset_metadata_pack", args=[], **kwargs
171
+ ):
172
+ name_ = "LlamaDatasetMetadataPack"
173
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
174
+
175
+ @staticmethod
176
+ def multi_tenancy_rag_pack(pack_path="./multitenancy_rag_pack", args=[], **kwargs):
177
+ name_ = "MultiTenancyRAGPack"
178
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
179
+
180
+ @staticmethod
181
+ def gmail_openai_agent_pack(pack_path="./gmail_pack", args=[], **kwargs):
182
+ name_ = "GmailOpenAIAgentPack"
183
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
184
+
185
+ @staticmethod
186
+ def snowflake_query_engine_pack(pack_path="./snowflake_pack", args=[], **kwargs):
187
+ name_ = "SnowflakeQueryEnginePack"
188
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
189
+
190
+ @staticmethod
191
+ def agent_search_retriever_pack(pack_path="./agent_search_pack", args=[], **kwargs):
192
+ name_ = "AgentSearchRetrieverPack"
193
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
194
+
195
+ @staticmethod
196
+ def vectara_rag_pack(pack_path="./vectara_rag_pack", args=[], **kwargs):
197
+ name_ = "VectaraRagPack"
198
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
199
+
200
+ @staticmethod
201
+ def chroma_autoretrieval_pack(pack_path="./chroma_pack", args=[], **kwargs):
202
+ name_ = "ChromaAutoretrievalPack"
203
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
204
+
205
+ @staticmethod
206
+ def arize_phoenix_query_engine_pack(pack_path="./arize_pack", args=[], **kwargs):
207
+ name_ = "ArizePhoenixQueryEnginePack"
208
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
209
+
210
+ @staticmethod
211
+ def redis_ingestion_pipeline_pack(
212
+ pack_path="./redis_ingestion_pack", args=[], **kwargs
213
+ ):
214
+ name_ = "RedisIngestionPipelinePack"
215
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
216
+
217
+ @staticmethod
218
+ def nebula_graph_query_engine_pack(
219
+ pack_path="./nebulagraph_pack", args=[], **kwargs
220
+ ):
221
+ name_ = "NebulaGraphQueryEnginePack"
222
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
223
+
224
+ @staticmethod
225
+ def weaviate_retry_engine_pack(pack_path="./weaviate_pack", args=[], **kwargs):
226
+ name_ = "WeaviateRetryEnginePack"
227
+ return LlamaPack.build(name_, pack_path, args, **kwargs)
@@ -29,19 +29,18 @@ def get_llama_index_node_parser(node_parser: Any):
29
29
  import llama_index.core.node_parser
30
30
 
31
31
  if not isinstance(node_parser, str) and not issubclass(node_parser, NodeParser):
32
- raise TypeError(f"node_parser must be a string or NodeParser.")
32
+ raise TypeError("node_parser must be a string or NodeParser.")
33
33
 
34
34
  if isinstance(node_parser, str):
35
35
  if node_parser == "CodeSplitter":
36
36
  SysUtil.check_import("tree_sitter_languages")
37
37
 
38
38
  try:
39
- parser = getattr(llama_index.core.node_parser, node_parser)
40
- return parser
39
+ return getattr(llama_index.core.node_parser, node_parser)
41
40
  except Exception as e:
42
41
  raise AttributeError(
43
42
  f"llama_index_core has no such attribute:" f" {node_parser}, Error: {e}"
44
- )
43
+ ) from e
45
44
 
46
45
  elif isinstance(node_parser, NodeParser):
47
46
  return node_parser
@@ -75,10 +74,8 @@ def llama_index_parse_node(
75
74
  parser = get_llama_index_node_parser(node_parser)
76
75
  try:
77
76
  parser = parser(*parser_args, **parser_kwargs)
78
- except:
77
+ except Exception:
79
78
  parser = parser.from_defaults(*parser_args, **parser_kwargs)
80
- nodes = parser.get_nodes_from_documents(documents)
81
- return nodes
82
-
79
+ return parser.get_nodes_from_documents(documents)
83
80
  except Exception as e:
84
- raise ValueError(f"Failed to parse. Error: {e}")
81
+ raise ValueError(f"Failed to parse. Error: {e}") from e
@@ -0,0 +1 @@
1
+ from pydantic import BaseModel, Field, ValidationError, AliasChoices, field_serializer
File without changes
@@ -0,0 +1,36 @@
1
+ import subprocess
2
+ from lionagi.libs import SysUtil
3
+
4
+
5
+ def get_pytorch_install_command():
6
+ cpu_arch = SysUtil.get_cpu_architecture()
7
+
8
+ if cpu_arch == "apple_silicon":
9
+ return "pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu"
10
+ else:
11
+ # Default CPU installation
12
+ return "pip install torch torchvision torchaudio"
13
+
14
+
15
+ def install_pytorch():
16
+ command = get_pytorch_install_command()
17
+ try:
18
+ subprocess.run(command.split(), check=True)
19
+ print("PyTorch installed successfully.")
20
+ except subprocess.CalledProcessError as e:
21
+ print(f"Failed to install PyTorch: {e}")
22
+
23
+
24
+ def install_transformers():
25
+ if not SysUtil.is_package_installed("torch"):
26
+ in_ = input(
27
+ "PyTorch is required for transformers. Would you like to install it now? (y/n): "
28
+ )
29
+ if in_ == "y":
30
+ install_pytorch()
31
+ if not SysUtil.is_package_installed("transformers"):
32
+ in_ = input(
33
+ "transformers is required. Would you like to install it now? (y/n): "
34
+ )
35
+ if in_ == "y":
36
+ SysUtil.install_import(package_name="transformers", import_name="pipeline")
File without changes
@@ -0,0 +1,312 @@
1
+ from typing import Union, Callable
2
+
3
+ from lionagi.libs import func_call
4
+ from lionagi.libs.ln_convert import to_list
5
+ from lionagi.core.collections import pile
6
+ from lionagi.core.generic import Node
7
+ from ..bridge.langchain_.langchain_bridge import LangchainBridge
8
+ from ..bridge.llamaindex_.llama_index_bridge import LlamaIndexBridge
9
+
10
+
11
+ from ..loader.load_util import ChunkerType, file_to_chunks, _datanode_parser
12
+
13
+
14
+ def datanodes_convert(documents, chunker_type):
15
+ """
16
+ Converts documents to the specified chunker type.
17
+
18
+ Args:
19
+ documents (list): List of documents to be converted.
20
+ chunker_type (ChunkerType): The type of chunker to convert the documents to.
21
+
22
+ Returns:
23
+ list: The converted documents.
24
+
25
+ Example usage:
26
+ >>> documents = [Node(...), Node(...)]
27
+ >>> converted_docs = datanodes_convert(documents, ChunkerType.LLAMAINDEX)
28
+ """
29
+ for i in range(len(documents)):
30
+ if type(documents[i]) == Node:
31
+ if chunker_type == ChunkerType.LLAMAINDEX:
32
+ documents[i] = documents[i].to_llama_index()
33
+ elif chunker_type == ChunkerType.LANGCHAIN:
34
+ documents[i] = documents[i].to_langchain()
35
+ return documents
36
+
37
+
38
+ def text_chunker(documents, args, kwargs):
39
+ """
40
+ Chunks text documents into smaller pieces.
41
+
42
+ Args:
43
+ documents (list): List of documents to be chunked.
44
+ args (tuple): Positional arguments for the chunking function.
45
+ kwargs (dict): Keyword arguments for the chunking function.
46
+
47
+ Returns:
48
+ pile: A pile of chunked Node instances.
49
+
50
+ Example usage:
51
+ >>> documents = [Node(...), Node(...)]
52
+ >>> chunked_docs = text_chunker(documents, args, kwargs)
53
+ """
54
+
55
+ def chunk_node(node):
56
+ chunks = file_to_chunks(node.to_dict(), *args, **kwargs)
57
+ func_call.lcall(chunks, lambda chunk: chunk.pop("ln_id"))
58
+ return [Node.from_obj({**chunk}) for chunk in chunks]
59
+
60
+ a = to_list([chunk_node(doc) for doc in documents], flatten=True, dropna=True)
61
+ return pile(a)
62
+
63
+
64
+ def chunk(
65
+ docs,
66
+ field: str = "content",
67
+ chunk_size: int = 1500,
68
+ overlap: float = 0.1,
69
+ threshold: int = 200,
70
+ chunker="text_chunker",
71
+ chunker_type=ChunkerType.PLAIN,
72
+ chunker_args=None,
73
+ chunker_kwargs=None,
74
+ chunking_kwargs=None,
75
+ documents_convert_func=None,
76
+ to_lion: bool | Callable = True,
77
+ ):
78
+ """
79
+ Chunks documents using the specified chunker.
80
+
81
+ Args:
82
+ docs (list): List of documents to be chunked.
83
+ field (str, optional): The field to chunk. Defaults to "content".
84
+ chunk_size (int, optional): The size of each chunk. Defaults to 1500.
85
+ overlap (float, optional): The overlap between chunks. Defaults to 0.1.
86
+ threshold (int, optional): The threshold for chunking. Defaults to 200.
87
+ chunker (str, optional): The chunker function or its name. Defaults to "text_chunker".
88
+ chunker_type (ChunkerType, optional): The type of chunker to use. Defaults to ChunkerType.PLAIN.
89
+ chunker_args (list, optional): Positional arguments for the chunker function. Defaults to None.
90
+ chunker_kwargs (dict, optional): Keyword arguments for the chunker function. Defaults to None.
91
+ chunking_kwargs (dict, optional): Additional keyword arguments for chunking. Defaults to None.
92
+ documents_convert_func (Callable, optional): Function to convert documents. Defaults to None.
93
+ to_lion (bool | Callable, optional): Whether to convert the data to Node instances or a custom parser. Defaults to True.
94
+
95
+ Returns:
96
+ pile: A pile of chunked Node instances.
97
+
98
+ Raises:
99
+ ValueError: If the chunker_type is not supported.
100
+
101
+ Example usage:
102
+ >>> chunked_docs = chunk(docs, field='text', chunk_size=1000, overlap=0.2)
103
+ """
104
+
105
+ if chunker_args is None:
106
+ chunker_args = []
107
+ if chunker_kwargs is None:
108
+ chunker_kwargs = {}
109
+ if chunking_kwargs is None:
110
+ chunking_kwargs = {}
111
+
112
+ if chunker_type == ChunkerType.PLAIN:
113
+ chunker_kwargs["field"] = field
114
+ chunker_kwargs["chunk_size"] = chunk_size
115
+ chunker_kwargs["overlap"] = overlap
116
+ chunker_kwargs["threshold"] = threshold
117
+ return chunk_funcs[ChunkerType.PLAIN](
118
+ docs, chunker, chunker_args, chunker_kwargs
119
+ )
120
+
121
+ elif chunker_type == ChunkerType.LANGCHAIN:
122
+ return chunk_funcs[ChunkerType.LANGCHAIN](
123
+ docs,
124
+ documents_convert_func,
125
+ chunker,
126
+ chunker_args,
127
+ chunker_kwargs,
128
+ to_lion,
129
+ )
130
+
131
+ elif chunker_type == ChunkerType.LLAMAINDEX:
132
+ return chunk_funcs[ChunkerType.LLAMAINDEX](
133
+ docs,
134
+ documents_convert_func,
135
+ chunker,
136
+ chunker_args,
137
+ chunker_kwargs,
138
+ to_lion,
139
+ )
140
+
141
+ elif chunker_type == ChunkerType.SELFDEFINED:
142
+ return chunk_funcs[ChunkerType.SELFDEFINED](
143
+ docs,
144
+ chunker,
145
+ chunker_args,
146
+ chunker_kwargs,
147
+ chunking_kwargs,
148
+ to_lion,
149
+ )
150
+
151
+ else:
152
+ raise ValueError(
153
+ f"{chunker_type} is not supported. Please choose from {list(ChunkerType)}"
154
+ )
155
+
156
+
157
+ def _self_defined_chunker(
158
+ documents,
159
+ chunker,
160
+ chunker_args,
161
+ chunker_kwargs,
162
+ chunking_kwargs,
163
+ to_lion: bool | Callable,
164
+ ):
165
+ """
166
+ Chunks documents using a self-defined chunker.
167
+
168
+ Args:
169
+ documents (list): List of documents to be chunked.
170
+ chunker (str | Callable): The chunker function or its name.
171
+ chunker_args (list): Positional arguments for the chunker function.
172
+ chunker_kwargs (dict): Keyword arguments for the chunker function.
173
+ chunking_kwargs (dict): Additional keyword arguments for chunking.
174
+ to_lion (bool | Callable): Whether to convert the data to Node instances or a custom parser.
175
+
176
+ Returns:
177
+ pile: A pile of chunked Node instances or custom parsed nodes.
178
+
179
+ Raises:
180
+ ValueError: If the self-defined chunker is not valid.
181
+
182
+ Example usage:
183
+ >>> chunked_docs = _self_defined_chunker(docs, custom_chunker, ['arg1'], {'key': 'value'}, {}, custom_parser)
184
+ """
185
+ try:
186
+ splitter = chunker(*chunker_args, **chunker_kwargs)
187
+ nodes = splitter.split(documents, **chunking_kwargs)
188
+ except Exception as e:
189
+ raise ValueError(
190
+ f"Self defined chunker {chunker} is not valid. Error: {e}"
191
+ ) from e
192
+
193
+ if isinstance(to_lion, bool) and to_lion is True:
194
+ raise ValueError("Please define a valid parser to Node.")
195
+ elif isinstance(to_lion, Callable):
196
+ nodes = _datanode_parser(nodes, to_lion)
197
+ return nodes
198
+
199
+
200
+ def _llama_index_chunker(
201
+ documents,
202
+ documents_convert_func,
203
+ chunker,
204
+ chunker_args,
205
+ chunker_kwargs,
206
+ to_lion: bool | Callable,
207
+ ):
208
+ """
209
+ Chunks documents using a LlamaIndex chunker.
210
+
211
+ Args:
212
+ documents (list): List of documents to be chunked.
213
+ documents_convert_func (Callable): Function to convert documents.
214
+ chunker (str | Callable): The chunker function or its name.
215
+ chunker_args (list): Positional arguments for the chunker function.
216
+ chunker_kwargs (dict): Keyword arguments for the chunker function.
217
+ to_lion (bool | Callable): Whether to convert the data to Node instances or a custom parser.
218
+
219
+ Returns:
220
+ pile: A pile of chunked Node instances or custom parsed nodes.
221
+
222
+ Example usage:
223
+ >>> chunked_docs = _llama_index_chunker(docs, convert_func, llama_chunker, ['arg1'], {'key': 'value'}, True)
224
+ """
225
+ if documents_convert_func:
226
+ documents = documents_convert_func(documents, "llama_index")
227
+ nodes = LlamaIndexBridge.llama_index_parse_node(
228
+ documents, chunker, chunker_args, chunker_kwargs
229
+ )
230
+
231
+ if isinstance(to_lion, bool) and to_lion is True:
232
+ nodes = [Node.from_llama_index(i) for i in nodes]
233
+ elif isinstance(to_lion, Callable):
234
+ nodes = _datanode_parser(nodes, to_lion)
235
+ return nodes
236
+
237
+
238
+ def _langchain_chunker(
239
+ documents,
240
+ documents_convert_func,
241
+ chunker,
242
+ chunker_args,
243
+ chunker_kwargs,
244
+ to_lion: bool | Callable,
245
+ ):
246
+ """
247
+ Chunks documents using a Langchain chunker.
248
+
249
+ Args:
250
+ documents (list): List of documents to be chunked.
251
+ documents_convert_func (Callable): Function to convert documents.
252
+ chunker (str | Callable): The chunker function or its name.
253
+ chunker_args (list): Positional arguments for the chunker function.
254
+ chunker_kwargs (dict): Keyword arguments for the chunker function.
255
+ to_lion (bool | Callable): Whether to convert the data to Node instances or a custom parser.
256
+
257
+ Returns:
258
+ pile: A pile of chunked Node instances or custom parsed nodes.
259
+
260
+ Example usage:
261
+ >>> chunked_docs = _langchain_chunker(docs, convert_func, langchain_chunker, ['arg1'], {'key': 'value'}, True)
262
+ """
263
+ if documents_convert_func:
264
+ documents = documents_convert_func(documents, "langchain")
265
+ nodes = LangchainBridge.langchain_text_splitter(
266
+ documents, chunker, chunker_args, chunker_kwargs
267
+ )
268
+ if isinstance(to_lion, bool) and to_lion is True:
269
+ if isinstance(documents, str):
270
+ nodes = [Node(content=i) for i in nodes]
271
+ else:
272
+ nodes = [Node.from_langchain(i) for i in nodes]
273
+ elif isinstance(to_lion, Callable):
274
+ nodes = _datanode_parser(nodes, to_lion)
275
+ return nodes
276
+
277
+
278
+ def _plain_chunker(documents, chunker, chunker_args, chunker_kwargs):
279
+ """
280
+ Chunks documents using a plain chunker.
281
+
282
+ Args:
283
+ documents (list): List of documents to be chunked.
284
+ chunker (str | Callable): The chunker function or its name.
285
+ chunker_args (list): Positional arguments for the chunker function.
286
+ chunker_kwargs (dict): Keyword arguments for the chunker function.
287
+
288
+ Returns:
289
+ pile: A pile of chunked Node instances.
290
+
291
+ Raises:
292
+ ValueError: If the chunker is not supported.
293
+
294
+ Example usage:
295
+ >>> chunked_docs = _plain_chunker(docs, 'text_chunker', ['arg1'], {'key': 'value'})
296
+ """
297
+ try:
298
+ if chunker == "text_chunker":
299
+ chunker = text_chunker
300
+ return chunker(documents, chunker_args, chunker_kwargs)
301
+ except Exception as e:
302
+ raise ValueError(
303
+ f"Reader {chunker} is currently not supported. Error: {e}"
304
+ ) from e
305
+
306
+
307
+ chunk_funcs = {
308
+ ChunkerType.PLAIN: _plain_chunker,
309
+ ChunkerType.LANGCHAIN: _langchain_chunker,
310
+ ChunkerType.LLAMAINDEX: _llama_index_chunker,
311
+ ChunkerType.SELFDEFINED: _self_defined_chunker,
312
+ }