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
@@ -1,533 +0,0 @@
1
- from enum import Enum
2
-
3
- from lionagi.libs import nested, convert
4
- from ..schema import DataNode
5
- from ..prompt.prompt_template import PromptTemplate
6
-
7
- _message_fields = ["node_id", "timestamp", "role", "sender", "recipient", "content"]
8
-
9
-
10
- # ToDo: actually implement the new message classes
11
-
12
-
13
- class BranchColumns(list[str], Enum):
14
- COLUMNS = _message_fields
15
-
16
-
17
- class MessageField(str, Enum):
18
- NODE_ID = "node_id"
19
- TIMESTAMP = "timestamp"
20
- ROLE = "role"
21
- SENDER = "sender"
22
- RECIPIENT = "recipient"
23
- CONTENT = "content"
24
- METADATA = "metadata"
25
- RELATION = "relation"
26
-
27
-
28
- class MessageRoleType(str, Enum):
29
- SYSTEM = "system"
30
- USER = "user"
31
- ASSISTANT = "assistant"
32
-
33
-
34
- class MessageContentKey(str, Enum):
35
- INSTRUCTION = "instruction"
36
- CONTEXT = "context"
37
- SYSTEM = "system_info"
38
- ACTION_REQUEST = "action_request"
39
- ACTION_RESPONSE = "action_response"
40
- RESPONSE = "response"
41
-
42
-
43
- class MessageType(dict, Enum):
44
- SYSTEM = (
45
- {
46
- MessageField.ROLE.value: MessageRoleType.SYSTEM.value,
47
- MessageField.SENDER.value: MessageRoleType.SYSTEM.value,
48
- MessageField.RECIPIENT.value: "null",
49
- "content_key": MessageContentKey.SYSTEM.value,
50
- },
51
- )
52
-
53
- INSTRUCTION = (
54
- {
55
- MessageField.ROLE.value: MessageRoleType.USER.value,
56
- MessageField.SENDER.value: MessageRoleType.USER.value,
57
- MessageField.RECIPIENT.value: "null",
58
- "content_key": MessageContentKey.INSTRUCTION.value,
59
- },
60
- )
61
-
62
- CONTEXT = (
63
- {
64
- MessageField.ROLE.value: MessageRoleType.USER.value,
65
- MessageField.SENDER.value: MessageRoleType.USER.value,
66
- MessageField.RECIPIENT.value: "null",
67
- "content_key": MessageContentKey.CONTEXT.value,
68
- },
69
- )
70
-
71
- ACTION_REQUEST = (
72
- {
73
- MessageField.ROLE.value: MessageRoleType.ASSISTANT.value,
74
- MessageField.SENDER.value: MessageRoleType.ASSISTANT.value,
75
- MessageField.RECIPIENT.value: "null",
76
- "content_key": MessageContentKey.ACTION_REQUEST.value,
77
- },
78
- )
79
-
80
- ACTION_RESPONSE = (
81
- {
82
- MessageField.ROLE.value: MessageRoleType.ASSISTANT.value,
83
- MessageField.SENDER.value: MessageRoleType.ASSISTANT.value,
84
- MessageField.RECIPIENT.value: "null",
85
- "content_key": MessageContentKey.ACTION_RESPONSE.value,
86
- },
87
- )
88
-
89
- RESPONSE = {
90
- MessageField.ROLE.value: MessageRoleType.ASSISTANT.value,
91
- MessageField.SENDER.value: MessageRoleType.ASSISTANT.value,
92
- MessageField.RECIPIENT.value: "null",
93
- "content_key": MessageContentKey.RESPONSE.value,
94
- }
95
-
96
-
97
- class BaseMessage(DataNode):
98
- """
99
- Represents a message in a chatbot-like system, inheriting from BaseNode.
100
-
101
- Attributes:
102
- role (str | None): The role of the entity sending the message, e.g., 'user', 'system'.
103
- sender (str | None): The identifier of the sender of the message.
104
- content (Any): The actual content of the message.
105
- """
106
-
107
- role: str | None = None
108
- sender: str | None = None
109
- recipient: str | None = None
110
-
111
- @property
112
- def msg(self) -> dict:
113
- """
114
- Constructs and returns a dictionary representation of the message.
115
-
116
- Returns:
117
- A dictionary representation of the message with 'role' and 'content' keys.
118
- """
119
- return self._to_message()
120
-
121
- @property
122
- def msg_content(self) -> str | dict:
123
- """
124
- Gets the 'content' field of the message.
125
-
126
- Returns:
127
- The 'content' part of the message.
128
- """
129
- return self.msg["content"]
130
-
131
- def _to_message(self):
132
- """
133
- Constructs and returns a dictionary representation of the message.
134
-
135
- Returns:
136
- dict: A dictionary representation of the message with 'role' and 'content' keys.
137
- """
138
- return {"role": self.role, "content": convert.to_str(self.content)}
139
-
140
- def __str__(self):
141
- content_preview = (
142
- f"{str(self.content)[:75]}..."
143
- if self.content and len(self.content) > 75
144
- else str(self.content)
145
- )
146
- return f"Message(role={self.role}, sender={self.sender}, content='{content_preview}')"
147
-
148
-
149
- class Instruction(BaseMessage):
150
- """
151
- Represents an instruction message, a specialized subclass of Message.
152
-
153
- This class is specifically used for creating messages that are instructions from the user,
154
- including any associated context. It sets the message role to 'user'.
155
- """
156
-
157
- def __init__(
158
- self,
159
- instruction: dict | list | str,
160
- context=None,
161
- sender: str | None = None,
162
- output_fields=None,
163
- recipient=None,
164
- ):
165
- super().__init__(
166
- role="user",
167
- sender=sender or "user",
168
- content={"instruction": instruction},
169
- recipient=recipient or "assistant",
170
- )
171
- if context:
172
- self.content.update({"context": context})
173
-
174
- if output_fields:
175
- format_ = f"""
176
- Follow the following response format.
177
- ```json
178
- {output_fields}
179
- ```
180
- """
181
- self.content.update(
182
- {"response_format": format_.replace(" ", "")}
183
- )
184
-
185
- @property
186
- def instruct(self):
187
- return self.content["instruction"]
188
-
189
- @classmethod
190
- def from_prompt_template(
191
- cls,
192
- prompt_template: PromptTemplate,
193
- sender: str | None = None,
194
- recipient=None,
195
- ):
196
- return cls(
197
- instruction=prompt_template.instruction,
198
- context=prompt_template.instruction_context,
199
- output_fields=prompt_template.instruction_output_fields,
200
- sender=sender,
201
- recipient=recipient,
202
- )
203
-
204
-
205
- class System(BaseMessage):
206
- """
207
- Represents a system-related message, a specialized subclass of Message.
208
-
209
- Designed for messages containing system information, this class sets the message role to 'system'.
210
- """
211
-
212
- def __init__(
213
- self, system: dict | list | str, sender: str | None = None, recipient=None
214
- ):
215
- super().__init__(
216
- role="system",
217
- sender=sender or "system",
218
- content={"system_info": system},
219
- recipient=recipient or "assistant",
220
- )
221
-
222
- @property
223
- def system_info(self):
224
- return self.content["system_info"]
225
-
226
-
227
- class Response(BaseMessage):
228
- """
229
- Represents a response message, a specialized subclass of Message.
230
-
231
- Used for various types of response messages including regular responses, action requests,
232
- and action responses. It sets the message role to 'assistant'.
233
-
234
- """
235
-
236
- def __init__(
237
- self, response: dict | list | str, sender: str | None = None, recipient=None
238
- ) -> None:
239
- content_key = ""
240
- try:
241
- response = response["message"]
242
- if convert.strip_lower(response["content"]) == "none":
243
- content_ = self._handle_action_request(response)
244
- sender = sender or "action_request"
245
- content_key = content_key or "action_request"
246
- recipient = recipient or "action"
247
-
248
- else:
249
- try:
250
- if "tool_uses" in convert.to_dict(response["content"]):
251
- content_ = convert.to_dict(response["content"])["tool_uses"]
252
- content_key = content_key or "action_request"
253
- sender = sender or "action_request"
254
- recipient = recipient or "action"
255
-
256
- elif "response" in convert.to_dict(response["content"]):
257
- sender = sender or "assistant"
258
- content_key = content_key or "response"
259
- content_ = convert.to_dict(response["content"])["response"]
260
- recipient = recipient or "user"
261
-
262
- elif "action_request" in convert.to_dict(response["content"]):
263
- sender = sender or "action_request"
264
- content_key = content_key or "action_request"
265
- content_ = convert.to_dict(response["content"])[
266
- "action_request"
267
- ]
268
- recipient = recipient or "action"
269
-
270
- else:
271
- content_ = response["content"]
272
- content_key = content_key or "response"
273
- sender = sender or "assistant"
274
- recipient = recipient or "user"
275
- except Exception:
276
- content_ = response["content"]
277
- content_key = content_key or "response"
278
- sender = sender or "assistant"
279
- recipient = recipient or "user"
280
-
281
- except Exception:
282
- sender = sender or "action_response"
283
- content_ = response
284
- content_key = content_key or "action_response"
285
- recipient = recipient or "assistant"
286
-
287
- super().__init__(
288
- role="assistant",
289
- sender=sender,
290
- content={content_key: content_},
291
- recipient=recipient,
292
- )
293
-
294
- @staticmethod
295
- def _handle_action_request(response):
296
- """
297
- Processes an action request response and extracts relevant information.
298
-
299
- Args:
300
- response (dict): The response dictionary containing tool calls and other information.
301
-
302
- Returns:
303
- list: A list of dictionaries, each representing a function call with action and arguments.
304
-
305
- Raises:
306
- ValueError: If the response does not conform to the expected format for action requests.
307
- """
308
- try:
309
- tool_count = 0
310
- func_list = []
311
- while tool_count < len(response["tool_calls"]):
312
- _path = ["tool_calls", tool_count, "type"]
313
-
314
- if nested.nget(response, _path) == "function":
315
- _path1 = ["tool_calls", tool_count, "function", "name"]
316
- _path2 = ["tool_calls", tool_count, "function", "arguments"]
317
-
318
- func_content = {
319
- "action": f"action_{nested.nget(response, _path1)}",
320
- "arguments": nested.nget(response, _path2),
321
- }
322
- func_list.append(func_content)
323
- tool_count += 1
324
- return func_list
325
- except:
326
- raise ValueError(
327
- "Response message must be one of regular response or function calling"
328
- )
329
-
330
-
331
- # class BaseMessage(DataNode):
332
-
333
-
334
- # def __init__():
335
- # ...
336
-
337
- # role: MessageRoleType = Field(..., alias=MessageField.ROLE.value)
338
- # sender: str = Field(..., alias=MessageField.SENDER.value) # Customizable sender
339
- # recipient: str | None = Field(None,
340
- # alias=MessageField.RECIPIENT.value) # Optional recipient
341
-
342
- # class Config:
343
- # extra = 'allow'
344
- # use_enum_values = True
345
- # populate_by_name = True
346
-
347
- # @model_validator(mode='before')
348
- # def handle_extra_fields(cls, values):
349
- # """Move undefined fields to metadata."""
350
- # fields = set(values.keys())
351
- # defined_fields = set(cls.model_fields.keys())
352
- # extra_fields = fields - defined_fields
353
-
354
- # if extra_fields:
355
- # metadata = values.get('metadata', {})
356
- # for field in extra_fields:
357
- # if field in metadata:
358
- # metadata[f"{field}_1"] = values.pop(field)
359
- # else:
360
- # metadata[field] = values.pop(field)
361
- # values['metadata'] = metadata
362
- # return values
363
-
364
- # def _to_roled_message(self):
365
- # return {
366
- # MessageField.ROLE.value: self.role.value,
367
- # MessageField.CONTENT.value: (
368
- # json.dumps(self.content) if isinstance(self.content, dict)
369
- # else self.content
370
- # )
371
- # }
372
-
373
- # def to_pd_series(self, *args, **kwargs):
374
- # msg_dict = self.to_dict(*args, **kwargs)
375
- # if isinstance(to_dict(msg_dict['content']), dict):
376
- # msg_dict['content'] = json.dumps(msg_dict['content'])
377
- # return pd.Series(msg_dict)
378
-
379
- # @classmethod
380
- # def from_pd_series(cls, series: pd.Series, **kwargs):
381
- # self = cls.from_dict(series.to_dict(**kwargs))
382
- # if isinstance(self.content, str):
383
- # try:
384
- # self.content = to_dict(self.content)
385
- # except:
386
- # pass
387
- # return self
388
-
389
-
390
- # def __str__(self):
391
- # content_preview = self.content[:50] + "..." if len(
392
- # self.content) > 50 else self.content
393
- # meta_preview = str(self.metadata)[:50] + "..." if len(
394
- # str(self.metadata)) > 50 else str(self.metadata)
395
-
396
- # return (
397
- # f"Message({self.role.value or 'none'}, {self._sender or 'none'}, "
398
- # f"{content_preview or 'none'}, {self.recipient or 'none'},"
399
- # f"{self.timestamp or 'none'}, {meta_preview or 'none'}"
400
- # )
401
-
402
- # class Instruction(BaseMessage):
403
-
404
- # def __init__(self, instruction: Any, context: Any = None,
405
- # sender: str | None = None, recipient: str | None | Any = None,
406
- # metadata: dict | None = None, relation: list | None | Any = None,
407
- # **kwargs):
408
- # super().__init__(
409
- # role=MessageType.INSTRUCTION.value[MessageField.ROLE.value],
410
- # sender=sender or MessageType.INSTRUCTION.value[MessageField.SENDER.value],
411
- # content={MessageType.INSTRUCTION.value["content_key"]: instruction},
412
- # recipient=recipient or MessageType.SYSTEM.value[MessageField.RECIPIENT.value],
413
- # metadata=metadata or {}, relation=relation or [], **kwargs
414
- # )
415
- # if context:
416
- # self.content.update({MessageType.CONTEXT.value["content_key"]: context})
417
-
418
-
419
- # class System(BaseMessage):
420
-
421
- # def __init__(self, system: Any, sender: str | None = None, recipient: Optional[
422
- # str] = None, metadata: Optional[dict] = None, relation: Optional[list] = None,
423
- # **kwargs):
424
- # super().__init__(
425
- # role=MessageType.SYSTEM.value[MessageField.ROLE.value],
426
- # sender=sender or MessageType.SYSTEM.value[MessageField.SENDER.value],
427
- # content={MessageType.SYSTEM.value["content_key"]: system},
428
- # recipient=recipient or MessageType.SYSTEM.value[MessageField.RECIPIENT.value],
429
- # metadata=metadata or {}, relation=relation or [], **kwargs
430
- # )
431
-
432
-
433
- # class ActionRequest(BaseMessage):
434
-
435
- # def __init__(self, action_request: Any, sender: str | None = None,
436
- # recipient: Optional[
437
- # str] = None, metadata: Optional[dict] = None,
438
- # relation: Optional[list] = None,
439
- # **kwargs
440
- # ):
441
-
442
- # super().__init__(
443
- # role=MessageType.ACTION_REQUEST.value[MessageField.ROLE.value],
444
- # sender=sender or MessageType.ACTION_REQUEST.value[MessageField.SENDER.value],
445
- # content={MessageType.ACTION_REQUEST.value["content_key"]: action_request},
446
- # recipient=recipient or MessageType.ACTION_REQUEST.value[
447
- # MessageField.RECIPIENT.value],
448
- # metadata=metadata or {}, relation=relation or [], **kwargs
449
- # )
450
-
451
- # @classmethod
452
- # def from_response(cls, response, sender=None, recipient=None, metadata=None,
453
- # relation=None,
454
- # **kwargs):
455
- # return cls(action_request=response, sender=sender, recipient=recipient,
456
- # metadata=metadata,
457
- # relation=relation, **kwargs)
458
-
459
- # @staticmethod
460
- # def _handle_action_request(response):
461
- # try:
462
- # tool_count = 0
463
- # func_list = []
464
- # while tool_count < len(response['tool_calls']):
465
- # _path = ['tool_calls', tool_count, 'type']
466
-
467
- # if nget(response, _path) == 'function':
468
- # _path1 = ['tool_calls', tool_count, 'function', 'name']
469
- # _path2 = ['tool_calls', tool_count, 'function', 'arguments']
470
-
471
- # func_content = {
472
- # "action": ("action_" + nget(response, _path1)),
473
- # "arguments": nget(response, _path2)
474
- # }
475
- # func_list.append(func_content)
476
- # tool_count += 1
477
- # return func_list
478
- # except:
479
- # raise ValueError(
480
- # "Response message must be one of regular response or function calling"
481
- # )
482
-
483
-
484
- # class ActionResponse(BaseMessage):
485
-
486
- # def __init__(self, action_response: Any, sender: str | None = None,
487
- # recipient: Optional[
488
- # str] = None, metadata: Optional[dict] = None,
489
- # relation: Optional[list] = None,
490
- # **kwargs
491
- # ):
492
- # super().__init__(
493
- # role=MessageType.ACTION_RESPONSE.value[MessageField.ROLE.value],
494
- # sender=sender or MessageType.ACTION_RESPONSE.value[MessageField.SENDER.value],
495
- # content={MessageType.ACTION_RESPONSE.value["content_key"]: action_response},
496
- # recipient=recipient or MessageType.ACTION_RESPONSE.value[
497
- # MessageField.RECIPIENT.value],
498
- # metadata=metadata or {}, relation=relation or [], **kwargs
499
- # )
500
-
501
- # @classmethod
502
- # def from_response(cls, response, sender=None, recipient=None, metadata=None,
503
- # relation=None,
504
- # **kwargs):
505
- # return cls(action_response=response, sender=sender, recipient=recipient,
506
- # metadata=metadata,
507
- # relation=relation, **kwargs)
508
-
509
-
510
- # class AssistantResponse(BaseMessage):
511
-
512
- # def __init__(self, response: Any, sender: str | None = None,
513
- # recipient: Optional[
514
- # str] = None, metadata: Optional[dict] = None,
515
- # relation: Optional[list] = None,
516
- # **kwargs
517
- # ):
518
- # super().__init__(
519
- # role='assistant',
520
- # sender=sender or MessageType.RESPONSE.value[MessageField.SENDER.value],
521
- # content={MessageType.RESPONSE.value["content_key"]: response},
522
- # recipient=recipient or MessageType.RESPONSE.value[
523
- # MessageField.RECIPIENT.value],
524
- # metadata=metadata or {}, relation=relation or [], **kwargs
525
- # )
526
-
527
- # @classmethod
528
- # def from_response(cls, response, sender=None, recipient=None, metadata=None,
529
- # relation=None,
530
- # **kwargs):
531
- # return cls(response=response, sender=sender, recipient=recipient,
532
- # metadata=metadata,
533
- # relation=relation, **kwargs)