lionagi 0.1.2__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 +60 -5
  2. lionagi/core/__init__.py +0 -25
  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/base_agent.py +27 -13
  11. lionagi/core/agent/eval/evaluator.py +1 -0
  12. lionagi/core/agent/eval/vote.py +40 -0
  13. lionagi/core/agent/learn/learner.py +59 -0
  14. lionagi/core/agent/plan/unit_template.py +1 -0
  15. lionagi/core/collections/__init__.py +17 -0
  16. lionagi/core/{generic/data_logger.py → collections/_logger.py} +69 -55
  17. lionagi/core/collections/abc/__init__.py +53 -0
  18. lionagi/core/collections/abc/component.py +615 -0
  19. lionagi/core/collections/abc/concepts.py +297 -0
  20. lionagi/core/collections/abc/exceptions.py +150 -0
  21. lionagi/core/collections/abc/util.py +45 -0
  22. lionagi/core/collections/exchange.py +161 -0
  23. lionagi/core/collections/flow.py +426 -0
  24. lionagi/core/collections/model.py +419 -0
  25. lionagi/core/collections/pile.py +913 -0
  26. lionagi/core/collections/progression.py +236 -0
  27. lionagi/core/collections/util.py +64 -0
  28. lionagi/core/director/direct.py +314 -0
  29. lionagi/core/director/director.py +2 -0
  30. lionagi/core/{execute/branch_executor.py → engine/branch_engine.py} +134 -97
  31. lionagi/core/{execute/instruction_map_executor.py → engine/instruction_map_engine.py} +80 -55
  32. lionagi/{experimental/directive/evaluator → core/engine}/script_engine.py +17 -1
  33. lionagi/core/executor/base_executor.py +90 -0
  34. lionagi/core/{execute/structure_executor.py → executor/graph_executor.py} +62 -66
  35. lionagi/core/{execute → executor}/neo4j_executor.py +70 -67
  36. lionagi/core/generic/__init__.py +3 -33
  37. lionagi/core/generic/edge.py +29 -79
  38. lionagi/core/generic/edge_condition.py +16 -0
  39. lionagi/core/generic/graph.py +236 -0
  40. lionagi/core/generic/hyperedge.py +1 -0
  41. lionagi/core/generic/node.py +156 -221
  42. lionagi/core/generic/tree.py +48 -0
  43. lionagi/core/generic/tree_node.py +79 -0
  44. lionagi/core/mail/__init__.py +12 -0
  45. lionagi/core/mail/mail.py +25 -0
  46. lionagi/core/mail/mail_manager.py +139 -58
  47. lionagi/core/mail/package.py +45 -0
  48. lionagi/core/mail/start_mail.py +36 -0
  49. lionagi/core/message/__init__.py +19 -0
  50. lionagi/core/message/action_request.py +133 -0
  51. lionagi/core/message/action_response.py +135 -0
  52. lionagi/core/message/assistant_response.py +95 -0
  53. lionagi/core/message/instruction.py +234 -0
  54. lionagi/core/message/message.py +101 -0
  55. lionagi/core/message/system.py +86 -0
  56. lionagi/core/message/util.py +283 -0
  57. lionagi/core/report/__init__.py +4 -0
  58. lionagi/core/report/base.py +217 -0
  59. lionagi/core/report/form.py +231 -0
  60. lionagi/core/report/report.py +166 -0
  61. lionagi/core/report/util.py +28 -0
  62. lionagi/core/rule/_default.py +16 -0
  63. lionagi/core/rule/action.py +99 -0
  64. lionagi/core/rule/base.py +238 -0
  65. lionagi/core/rule/boolean.py +56 -0
  66. lionagi/core/rule/choice.py +47 -0
  67. lionagi/core/rule/mapping.py +96 -0
  68. lionagi/core/rule/number.py +71 -0
  69. lionagi/core/rule/rulebook.py +109 -0
  70. lionagi/core/rule/string.py +52 -0
  71. lionagi/core/rule/util.py +35 -0
  72. lionagi/core/session/branch.py +431 -0
  73. lionagi/core/session/directive_mixin.py +287 -0
  74. lionagi/core/session/session.py +229 -903
  75. lionagi/core/structure/__init__.py +1 -0
  76. lionagi/core/structure/chain.py +1 -0
  77. lionagi/core/structure/forest.py +1 -0
  78. lionagi/core/structure/graph.py +1 -0
  79. lionagi/core/structure/tree.py +1 -0
  80. lionagi/core/unit/__init__.py +5 -0
  81. lionagi/core/unit/parallel_unit.py +245 -0
  82. lionagi/core/unit/template/action.py +81 -0
  83. lionagi/core/unit/template/base.py +51 -0
  84. lionagi/core/unit/template/plan.py +84 -0
  85. lionagi/core/unit/template/predict.py +109 -0
  86. lionagi/core/unit/template/score.py +124 -0
  87. lionagi/core/unit/template/select.py +104 -0
  88. lionagi/core/unit/unit.py +362 -0
  89. lionagi/core/unit/unit_form.py +305 -0
  90. lionagi/core/unit/unit_mixin.py +1168 -0
  91. lionagi/core/unit/util.py +71 -0
  92. lionagi/core/validator/validator.py +364 -0
  93. lionagi/core/work/work.py +76 -0
  94. lionagi/core/work/work_function.py +101 -0
  95. lionagi/core/work/work_queue.py +103 -0
  96. lionagi/core/work/worker.py +258 -0
  97. lionagi/core/work/worklog.py +120 -0
  98. lionagi/experimental/compressor/base.py +46 -0
  99. lionagi/experimental/compressor/llm_compressor.py +247 -0
  100. lionagi/experimental/compressor/llm_summarizer.py +61 -0
  101. lionagi/experimental/compressor/util.py +70 -0
  102. lionagi/experimental/directive/__init__.py +19 -0
  103. lionagi/experimental/directive/parser/base_parser.py +69 -2
  104. lionagi/experimental/directive/{template_ → template}/base_template.py +17 -1
  105. lionagi/{libs/ln_tokenizer.py → experimental/directive/tokenizer.py} +16 -0
  106. lionagi/experimental/{directive/evaluator → evaluator}/ast_evaluator.py +16 -0
  107. lionagi/experimental/{directive/evaluator → evaluator}/base_evaluator.py +16 -0
  108. lionagi/experimental/knowledge/base.py +10 -0
  109. lionagi/experimental/memory/__init__.py +0 -0
  110. lionagi/experimental/strategies/__init__.py +0 -0
  111. lionagi/experimental/strategies/base.py +1 -0
  112. lionagi/integrations/bridge/langchain_/documents.py +4 -0
  113. lionagi/integrations/bridge/llamaindex_/index.py +30 -0
  114. lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +6 -0
  115. lionagi/integrations/chunker/chunk.py +161 -24
  116. lionagi/integrations/config/oai_configs.py +34 -3
  117. lionagi/integrations/config/openrouter_configs.py +14 -2
  118. lionagi/integrations/loader/load.py +122 -21
  119. lionagi/integrations/loader/load_util.py +6 -77
  120. lionagi/integrations/provider/_mapping.py +46 -0
  121. lionagi/integrations/provider/litellm.py +2 -1
  122. lionagi/integrations/provider/mlx_service.py +16 -9
  123. lionagi/integrations/provider/oai.py +91 -4
  124. lionagi/integrations/provider/ollama.py +6 -5
  125. lionagi/integrations/provider/openrouter.py +115 -8
  126. lionagi/integrations/provider/services.py +2 -2
  127. lionagi/integrations/provider/transformers.py +18 -22
  128. lionagi/integrations/storage/__init__.py +3 -3
  129. lionagi/integrations/storage/neo4j.py +52 -60
  130. lionagi/integrations/storage/storage_util.py +44 -46
  131. lionagi/integrations/storage/structure_excel.py +43 -26
  132. lionagi/integrations/storage/to_excel.py +11 -4
  133. lionagi/libs/__init__.py +22 -1
  134. lionagi/libs/ln_api.py +75 -20
  135. lionagi/libs/ln_context.py +37 -0
  136. lionagi/libs/ln_convert.py +21 -9
  137. lionagi/libs/ln_func_call.py +69 -28
  138. lionagi/libs/ln_image.py +107 -0
  139. lionagi/libs/ln_nested.py +26 -11
  140. lionagi/libs/ln_parse.py +82 -23
  141. lionagi/libs/ln_queue.py +16 -0
  142. lionagi/libs/ln_tokenize.py +164 -0
  143. lionagi/libs/ln_validate.py +16 -0
  144. lionagi/libs/special_tokens.py +172 -0
  145. lionagi/libs/sys_util.py +95 -24
  146. lionagi/lions/coder/code_form.py +13 -0
  147. lionagi/lions/coder/coder.py +50 -3
  148. lionagi/lions/coder/util.py +30 -25
  149. lionagi/tests/libs/test_func_call.py +23 -21
  150. lionagi/tests/libs/test_nested.py +36 -21
  151. lionagi/tests/libs/test_parse.py +1 -1
  152. lionagi/tests/test_core/collections/__init__.py +0 -0
  153. lionagi/tests/test_core/collections/test_component.py +206 -0
  154. lionagi/tests/test_core/collections/test_exchange.py +138 -0
  155. lionagi/tests/test_core/collections/test_flow.py +145 -0
  156. lionagi/tests/test_core/collections/test_pile.py +171 -0
  157. lionagi/tests/test_core/collections/test_progression.py +129 -0
  158. lionagi/tests/test_core/generic/test_edge.py +67 -0
  159. lionagi/tests/test_core/generic/test_graph.py +96 -0
  160. lionagi/tests/test_core/generic/test_node.py +106 -0
  161. lionagi/tests/test_core/generic/test_tree_node.py +73 -0
  162. lionagi/tests/test_core/test_branch.py +115 -294
  163. lionagi/tests/test_core/test_form.py +46 -0
  164. lionagi/tests/test_core/test_report.py +105 -0
  165. lionagi/tests/test_core/test_validator.py +111 -0
  166. lionagi/version.py +1 -1
  167. lionagi-0.2.1.dist-info/LICENSE +202 -0
  168. lionagi-0.2.1.dist-info/METADATA +272 -0
  169. lionagi-0.2.1.dist-info/RECORD +240 -0
  170. lionagi/core/branch/base.py +0 -653
  171. lionagi/core/branch/branch.py +0 -474
  172. lionagi/core/branch/flow_mixin.py +0 -96
  173. lionagi/core/branch/util.py +0 -323
  174. lionagi/core/direct/__init__.py +0 -19
  175. lionagi/core/direct/cot.py +0 -123
  176. lionagi/core/direct/plan.py +0 -164
  177. lionagi/core/direct/predict.py +0 -166
  178. lionagi/core/direct/react.py +0 -171
  179. lionagi/core/direct/score.py +0 -279
  180. lionagi/core/direct/select.py +0 -170
  181. lionagi/core/direct/sentiment.py +0 -1
  182. lionagi/core/direct/utils.py +0 -110
  183. lionagi/core/direct/vote.py +0 -64
  184. lionagi/core/execute/base_executor.py +0 -47
  185. lionagi/core/flow/baseflow.py +0 -23
  186. lionagi/core/flow/monoflow/ReAct.py +0 -240
  187. lionagi/core/flow/monoflow/__init__.py +0 -9
  188. lionagi/core/flow/monoflow/chat.py +0 -95
  189. lionagi/core/flow/monoflow/chat_mixin.py +0 -253
  190. lionagi/core/flow/monoflow/followup.py +0 -215
  191. lionagi/core/flow/polyflow/__init__.py +0 -1
  192. lionagi/core/flow/polyflow/chat.py +0 -251
  193. lionagi/core/form/action_form.py +0 -26
  194. lionagi/core/form/field_validator.py +0 -287
  195. lionagi/core/form/form.py +0 -302
  196. lionagi/core/form/mixin.py +0 -214
  197. lionagi/core/form/scored_form.py +0 -13
  198. lionagi/core/generic/action.py +0 -26
  199. lionagi/core/generic/component.py +0 -532
  200. lionagi/core/generic/condition.py +0 -46
  201. lionagi/core/generic/mail.py +0 -90
  202. lionagi/core/generic/mailbox.py +0 -36
  203. lionagi/core/generic/relation.py +0 -70
  204. lionagi/core/generic/signal.py +0 -22
  205. lionagi/core/generic/structure.py +0 -362
  206. lionagi/core/generic/transfer.py +0 -20
  207. lionagi/core/generic/work.py +0 -40
  208. lionagi/core/graph/graph.py +0 -126
  209. lionagi/core/graph/tree.py +0 -190
  210. lionagi/core/mail/schema.py +0 -63
  211. lionagi/core/messages/schema.py +0 -325
  212. lionagi/core/tool/__init__.py +0 -5
  213. lionagi/core/tool/tool.py +0 -28
  214. lionagi/core/tool/tool_manager.py +0 -283
  215. lionagi/experimental/report/form.py +0 -64
  216. lionagi/experimental/report/report.py +0 -138
  217. lionagi/experimental/report/util.py +0 -47
  218. lionagi/experimental/tool/function_calling.py +0 -43
  219. lionagi/experimental/tool/manual.py +0 -66
  220. lionagi/experimental/tool/schema.py +0 -59
  221. lionagi/experimental/tool/tool_manager.py +0 -138
  222. lionagi/experimental/tool/util.py +0 -16
  223. lionagi/experimental/validator/rule.py +0 -139
  224. lionagi/experimental/validator/validator.py +0 -56
  225. lionagi/experimental/work/__init__.py +0 -10
  226. lionagi/experimental/work/async_queue.py +0 -54
  227. lionagi/experimental/work/schema.py +0 -73
  228. lionagi/experimental/work/work_function.py +0 -67
  229. lionagi/experimental/work/worker.py +0 -56
  230. lionagi/experimental/work2/form.py +0 -371
  231. lionagi/experimental/work2/report.py +0 -289
  232. lionagi/experimental/work2/schema.py +0 -30
  233. lionagi/experimental/work2/tests.py +0 -72
  234. lionagi/experimental/work2/work_function.py +0 -89
  235. lionagi/experimental/work2/worker.py +0 -12
  236. lionagi/integrations/bridge/llamaindex_/get_index.py +0 -294
  237. lionagi/tests/test_core/generic/test_component.py +0 -89
  238. lionagi/tests/test_core/test_base_branch.py +0 -426
  239. lionagi/tests/test_core/test_chat_flow.py +0 -63
  240. lionagi/tests/test_core/test_mail_manager.py +0 -75
  241. lionagi/tests/test_core/test_prompts.py +0 -51
  242. lionagi/tests/test_core/test_session.py +0 -254
  243. lionagi/tests/test_core/test_session_base_util.py +0 -313
  244. lionagi/tests/test_core/test_tool_manager.py +0 -95
  245. lionagi-0.1.2.dist-info/LICENSE +0 -9
  246. lionagi-0.1.2.dist-info/METADATA +0 -174
  247. lionagi-0.1.2.dist-info/RECORD +0 -206
  248. /lionagi/core/{branch → _setting}/__init__.py +0 -0
  249. /lionagi/core/{execute → agent/eval}/__init__.py +0 -0
  250. /lionagi/core/{flow → agent/learn}/__init__.py +0 -0
  251. /lionagi/core/{form → agent/plan}/__init__.py +0 -0
  252. /lionagi/core/{branch/executable_branch.py → agent/plan/plan.py} +0 -0
  253. /lionagi/core/{graph → director}/__init__.py +0 -0
  254. /lionagi/core/{messages → engine}/__init__.py +0 -0
  255. /lionagi/{experimental/directive/evaluator → core/engine}/sandbox_.py +0 -0
  256. /lionagi/{experimental/directive/evaluator → core/executor}/__init__.py +0 -0
  257. /lionagi/{experimental/directive/template_ → core/rule}/__init__.py +0 -0
  258. /lionagi/{experimental/report → core/unit/template}/__init__.py +0 -0
  259. /lionagi/{experimental/tool → core/validator}/__init__.py +0 -0
  260. /lionagi/{experimental/validator → core/work}/__init__.py +0 -0
  261. /lionagi/experimental/{work2 → compressor}/__init__.py +0 -0
  262. /lionagi/{core/flow/mono_chat_mixin.py → experimental/directive/template/__init__.py} +0 -0
  263. /lionagi/experimental/directive/{schema.py → template/schema.py} +0 -0
  264. /lionagi/experimental/{work2/util.py → evaluator/__init__.py} +0 -0
  265. /lionagi/experimental/{work2/work.py → knowledge/__init__.py} +0 -0
  266. /lionagi/{tests/libs/test_async.py → experimental/knowledge/graph.py} +0 -0
  267. {lionagi-0.1.2.dist-info → lionagi-0.2.1.dist-info}/WHEEL +0 -0
  268. {lionagi-0.1.2.dist-info → lionagi-0.2.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,287 @@
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
+ # lionagi/core/session/directive_mixin.py
18
+
19
+ from lionagi.core.unit import Unit
20
+ from ..message.action_response import ActionResponse
21
+
22
+
23
+ class DirectiveMixin:
24
+ """
25
+ Mixin class for handling chat interactions within the directive framework.
26
+ """
27
+
28
+ async def chat(
29
+ self,
30
+ instruction=None, # additional instruction
31
+ context=None, # context to perform the instruction on
32
+ system=None, # optionally swap system message
33
+ sender=None, # sender of the instruction, default "user"
34
+ recipient=None, # recipient of the instruction, default "branch.ln_id"
35
+ requested_fields=None, # fields to request from the context, default None
36
+ form=None, # form to create instruction from, default None,
37
+ tools=False, # the tools to use, use True to consider all tools, no tools by default
38
+ invoke_tool=True, # whether to invoke the tool when function calling, default True
39
+ return_form=True, # whether to return the form if a form is passed in, otherwise return a dict/str
40
+ strict=False, # whether to strictly enforce the rule validation, default False
41
+ rulebook=None, # the rulebook to use for validation, default None, use default rulebook
42
+ imodel=None, # the optinally swappable iModel for the commands, otherwise self.branch.imodel
43
+ clear_messages=False,
44
+ use_annotation=True, # whether to use annotation as rule qualifier, default True, (need rulebook if False)
45
+ retries: int = 3,
46
+ delay: float = 0,
47
+ backoff_factor: float = 1,
48
+ default=None,
49
+ timeout: float = None,
50
+ timing: bool = False,
51
+ return_branch=False,
52
+ images=None,
53
+ image_path=None,
54
+ **kwargs,
55
+ ):
56
+ """
57
+ Asynchronously handles a chat interaction within the directive framework.
58
+
59
+ This method processes an instruction with the given context and optional
60
+ parameters, interacting with tools, models, and validation rules as needed.
61
+ It manages retries, timeouts, concurrency, and can optionally clear
62
+ previous messages, swap system messages, and control the use of
63
+ annotations and rulebooks.
64
+
65
+ Args:
66
+ instruction (str, optional): Additional instruction to process.
67
+ context (Any, optional): Context to perform the instruction on.
68
+ system (str, optional): Optionally swap the system message.
69
+ sender (str, optional): Sender of the instruction, default is "user".
70
+ recipient (str, optional): Recipient of the instruction, default is
71
+ "branch.ln_id".
72
+ requested_fields (dict[str, str], optional): Fields to request from
73
+ the context.
74
+ form (Any, optional): Form to create instruction from, default is None.
75
+ tools (bool, optional): Tools to use, use True to consider all tools,
76
+ no tools by default.
77
+ invoke_tool (bool, optional): Whether to invoke the tool when function
78
+ calling, default is True.
79
+ return_form (bool, optional): Whether to return the form if a form is
80
+ passed in, otherwise return a dict/str.
81
+ strict (bool, optional): Whether to strictly enforce rule validation,
82
+ default is False.
83
+ rulebook (Any, optional): The rulebook to use for validation, default
84
+ is None (uses default rulebook).
85
+ imodel (iModel, optional): Optionally swappable iModel for the
86
+ commands, otherwise self.branch.imodel.
87
+ clear_messages (bool, optional): Whether to clear previous messages,
88
+ default is False.
89
+ use_annotation (bool, optional): Whether to use annotation as rule
90
+ qualifier, default is True (needs rulebook if False).
91
+ retries (int, optional): Number of retries if failed, default is 3.
92
+ delay (float, optional): Number of seconds to delay before retrying,
93
+ default is 0.
94
+ backoff_factor (float, optional): Exponential backoff factor, default
95
+ is 1 (no backoff).
96
+ default (Any, optional): Default value to return if all retries failed.
97
+ timeout (float, optional): Timeout for the rcall, default is None
98
+ (no timeout).
99
+ timing (bool, optional): If True, will return a tuple (output,
100
+ duration), default is False.
101
+ return_branch (bool, optional): Whether to return the branch after
102
+ processing, default is False.
103
+ **kwargs: Additional keyword arguments for further customization.
104
+
105
+ Returns:
106
+ Any: The result of the chat processing, format determined by the
107
+ `return_form` parameter.
108
+
109
+ Raises:
110
+ ValueError: If an invalid combination of parameters is provided.
111
+
112
+ Examples:
113
+ >>> result = await self.chat(instruction="Hello", context={"data": "example"})
114
+ >>> print(result)
115
+ """
116
+
117
+ directive = Unit(self, imodel=imodel, rulebook=rulebook)
118
+ if system:
119
+ self.add_message(system=system)
120
+
121
+ if not images and image_path:
122
+ from lionagi.libs import ImageUtil
123
+
124
+ images = ImageUtil.read_image_to_base64(image_path)
125
+
126
+ return await directive.chat(
127
+ instruction=instruction,
128
+ context=context,
129
+ sender=sender,
130
+ recipient=recipient,
131
+ requested_fields=requested_fields,
132
+ form=form,
133
+ tools=tools,
134
+ invoke_tool=invoke_tool,
135
+ return_form=return_form,
136
+ strict=strict,
137
+ use_annotation=use_annotation,
138
+ retries=retries,
139
+ delay=delay,
140
+ backoff_factor=backoff_factor,
141
+ default=default,
142
+ timeout=timeout,
143
+ timing=timing,
144
+ clear_messages=clear_messages,
145
+ return_branch=return_branch,
146
+ images=images,
147
+ **kwargs,
148
+ )
149
+
150
+ async def direct(
151
+ self,
152
+ *,
153
+ instruction=None,
154
+ context=None,
155
+ form=None,
156
+ tools=None,
157
+ reason: bool = False,
158
+ predict: bool = False,
159
+ score=None,
160
+ select=None,
161
+ plan=None,
162
+ allow_action: bool = False,
163
+ allow_extension: bool = False,
164
+ max_extension: int = None,
165
+ confidence=None,
166
+ score_num_digits=None,
167
+ score_range=None,
168
+ select_choices=None,
169
+ plan_num_step=None,
170
+ predict_num_sentences=None,
171
+ imodel=None,
172
+ system=None,
173
+ rulebook=None,
174
+ directive=None,
175
+ images=None,
176
+ image_path=None,
177
+ verbose=False,
178
+ **kwargs,
179
+ ):
180
+ """
181
+ Asynchronously directs the operation based on the provided parameters.
182
+
183
+ Args:
184
+ instruction (str, optional): Instruction message.
185
+ context (Any, optional): Context to perform the instruction on.
186
+ form (Form, optional): Form data.
187
+ tools (Any, optional): Tools to use.
188
+ reason (bool, optional): Flag indicating if reason should be included.
189
+ predict (bool, optional): Flag indicating if prediction should be included.
190
+ score (Any, optional): Score parameters.
191
+ select (Any, optional): Select parameters.
192
+ plan (Any, optional): Plan parameters.
193
+ allow_action (bool, optional): Flag indicating if action should be allowed.
194
+ allow_extension (bool, optional): Flag indicating if extension should be allowed.
195
+ max_extension (int, optional): Maximum extension value.
196
+ confidence (Any, optional): Confidence parameters.
197
+ score_num_digits (int, optional): Number of digits for score.
198
+ score_range (tuple, optional): Range for score.
199
+ select_choices (list, optional): Choices for selection.
200
+ plan_num_step (int, optional): Number of steps for plan.
201
+ predict_num_sentences (int, optional): Number of sentences for prediction.
202
+ imodel (iModel, optional): Optionally swappable iModel for the commands.
203
+ system (str, optional): Optionally swap the system message.
204
+ rulebook (Any, optional): The rulebook to use for validation.
205
+ directive (str, optional): Directive for the operation.
206
+ **kwargs: Additional keyword arguments.
207
+
208
+ Returns:
209
+ Any: The processed response.
210
+
211
+ Examples:
212
+ >>> result = await self.direct(instruction="Process data", context={"data": "example"})
213
+ >>> print(result)
214
+ """
215
+ if system:
216
+ self.add_message(system=system)
217
+
218
+ if not images and image_path:
219
+ from lionagi.libs import ImageUtil
220
+
221
+ images = ImageUtil.read_image_to_base64(image_path)
222
+
223
+ _directive = Unit(self, imodel=imodel, rulebook=rulebook, verbose=verbose)
224
+
225
+ idx = len(self.progress)
226
+ if directive and isinstance(directive, str):
227
+ form = await _directive.direct(
228
+ directive=directive,
229
+ instruction=instruction,
230
+ context=context,
231
+ tools=tools,
232
+ reason=reason,
233
+ confidence=confidence,
234
+ images=images,
235
+ **kwargs,
236
+ )
237
+
238
+ action_responses = [
239
+ i for i in self.messages[idx:] if isinstance(i, ActionResponse)
240
+ ]
241
+ if len(action_responses) > 0:
242
+ _dict = {
243
+ f"action_{idx}": i.content["action_response"]
244
+ for idx, i in enumerate(action_responses)
245
+ }
246
+ if not hasattr(form, "action_response"):
247
+ form.append_to_request("action_response", {})
248
+ form.action_response.update(_dict)
249
+
250
+ return form
251
+
252
+ form = await _directive.direct(
253
+ instruction=instruction,
254
+ context=context,
255
+ form=form,
256
+ tools=tools,
257
+ reason=reason,
258
+ predict=predict,
259
+ score=score,
260
+ select=select,
261
+ plan=plan,
262
+ allow_action=allow_action,
263
+ allow_extension=allow_extension,
264
+ max_extension=max_extension,
265
+ confidence=confidence,
266
+ score_num_digits=score_num_digits,
267
+ score_range=score_range,
268
+ select_choices=select_choices,
269
+ plan_num_step=plan_num_step,
270
+ predict_num_sentences=predict_num_sentences,
271
+ images=images,
272
+ **kwargs,
273
+ )
274
+
275
+ action_responses = [
276
+ i for i in self.messages[idx:] if isinstance(i, ActionResponse)
277
+ ]
278
+ if len(action_responses) > 0:
279
+ _dict = {
280
+ f"action_{idx}": i.content["action_response"]
281
+ for idx, i in enumerate(action_responses)
282
+ }
283
+ if not hasattr(form, "action_response"):
284
+ form.append_to_request("action_response", {})
285
+ form.action_response.update(_dict)
286
+
287
+ return form