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

Sign up to get free protection for your applications and to get access to all the features.
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)