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.
- lionagi/__init__.py +61 -3
- lionagi/core/__init__.py +0 -14
- lionagi/core/_setting/_setting.py +59 -0
- lionagi/core/action/__init__.py +14 -0
- lionagi/core/action/function_calling.py +136 -0
- lionagi/core/action/manual.py +1 -0
- lionagi/core/action/node.py +109 -0
- lionagi/core/action/tool.py +114 -0
- lionagi/core/action/tool_manager.py +356 -0
- lionagi/core/agent/__init__.py +0 -3
- lionagi/core/agent/base_agent.py +45 -36
- lionagi/core/agent/eval/evaluator.py +1 -0
- lionagi/core/agent/eval/vote.py +40 -0
- lionagi/core/agent/learn/learner.py +59 -0
- lionagi/core/agent/plan/unit_template.py +1 -0
- lionagi/core/collections/__init__.py +17 -0
- lionagi/core/collections/_logger.py +319 -0
- lionagi/core/collections/abc/__init__.py +53 -0
- lionagi/core/collections/abc/component.py +615 -0
- lionagi/core/collections/abc/concepts.py +297 -0
- lionagi/core/collections/abc/exceptions.py +150 -0
- lionagi/core/collections/abc/util.py +45 -0
- lionagi/core/collections/exchange.py +161 -0
- lionagi/core/collections/flow.py +426 -0
- lionagi/core/collections/model.py +419 -0
- lionagi/core/collections/pile.py +913 -0
- lionagi/core/collections/progression.py +236 -0
- lionagi/core/collections/util.py +64 -0
- lionagi/core/director/direct.py +314 -0
- lionagi/core/director/director.py +2 -0
- lionagi/core/engine/branch_engine.py +333 -0
- lionagi/core/engine/instruction_map_engine.py +204 -0
- lionagi/core/engine/sandbox_.py +14 -0
- lionagi/core/engine/script_engine.py +99 -0
- lionagi/core/executor/base_executor.py +90 -0
- lionagi/core/executor/graph_executor.py +330 -0
- lionagi/core/executor/neo4j_executor.py +384 -0
- lionagi/core/generic/__init__.py +7 -0
- lionagi/core/generic/edge.py +112 -0
- lionagi/core/generic/edge_condition.py +16 -0
- lionagi/core/generic/graph.py +236 -0
- lionagi/core/generic/hyperedge.py +1 -0
- lionagi/core/generic/node.py +220 -0
- lionagi/core/generic/tree.py +48 -0
- lionagi/core/generic/tree_node.py +79 -0
- lionagi/core/mail/__init__.py +7 -3
- lionagi/core/mail/mail.py +25 -0
- lionagi/core/mail/mail_manager.py +142 -58
- lionagi/core/mail/package.py +45 -0
- lionagi/core/mail/start_mail.py +36 -0
- lionagi/core/message/__init__.py +19 -0
- lionagi/core/message/action_request.py +133 -0
- lionagi/core/message/action_response.py +135 -0
- lionagi/core/message/assistant_response.py +95 -0
- lionagi/core/message/instruction.py +234 -0
- lionagi/core/message/message.py +101 -0
- lionagi/core/message/system.py +86 -0
- lionagi/core/message/util.py +283 -0
- lionagi/core/report/__init__.py +4 -0
- lionagi/core/report/base.py +217 -0
- lionagi/core/report/form.py +231 -0
- lionagi/core/report/report.py +166 -0
- lionagi/core/report/util.py +28 -0
- lionagi/core/rule/__init__.py +0 -0
- lionagi/core/rule/_default.py +16 -0
- lionagi/core/rule/action.py +99 -0
- lionagi/core/rule/base.py +238 -0
- lionagi/core/rule/boolean.py +56 -0
- lionagi/core/rule/choice.py +47 -0
- lionagi/core/rule/mapping.py +96 -0
- lionagi/core/rule/number.py +71 -0
- lionagi/core/rule/rulebook.py +109 -0
- lionagi/core/rule/string.py +52 -0
- lionagi/core/rule/util.py +35 -0
- lionagi/core/session/__init__.py +0 -3
- lionagi/core/session/branch.py +431 -0
- lionagi/core/session/directive_mixin.py +287 -0
- lionagi/core/session/session.py +230 -902
- lionagi/core/structure/__init__.py +1 -0
- lionagi/core/structure/chain.py +1 -0
- lionagi/core/structure/forest.py +1 -0
- lionagi/core/structure/graph.py +1 -0
- lionagi/core/structure/tree.py +1 -0
- lionagi/core/unit/__init__.py +5 -0
- lionagi/core/unit/parallel_unit.py +245 -0
- lionagi/core/unit/template/__init__.py +0 -0
- lionagi/core/unit/template/action.py +81 -0
- lionagi/core/unit/template/base.py +51 -0
- lionagi/core/unit/template/plan.py +84 -0
- lionagi/core/unit/template/predict.py +109 -0
- lionagi/core/unit/template/score.py +124 -0
- lionagi/core/unit/template/select.py +104 -0
- lionagi/core/unit/unit.py +362 -0
- lionagi/core/unit/unit_form.py +305 -0
- lionagi/core/unit/unit_mixin.py +1168 -0
- lionagi/core/unit/util.py +71 -0
- lionagi/core/validator/__init__.py +0 -0
- lionagi/core/validator/validator.py +364 -0
- lionagi/core/work/__init__.py +0 -0
- lionagi/core/work/work.py +76 -0
- lionagi/core/work/work_function.py +101 -0
- lionagi/core/work/work_queue.py +103 -0
- lionagi/core/work/worker.py +258 -0
- lionagi/core/work/worklog.py +120 -0
- lionagi/experimental/__init__.py +0 -0
- lionagi/experimental/compressor/__init__.py +0 -0
- lionagi/experimental/compressor/base.py +46 -0
- lionagi/experimental/compressor/llm_compressor.py +247 -0
- lionagi/experimental/compressor/llm_summarizer.py +61 -0
- lionagi/experimental/compressor/util.py +70 -0
- lionagi/experimental/directive/__init__.py +19 -0
- lionagi/experimental/directive/parser/__init__.py +0 -0
- lionagi/experimental/directive/parser/base_parser.py +282 -0
- lionagi/experimental/directive/template/__init__.py +0 -0
- lionagi/experimental/directive/template/base_template.py +79 -0
- lionagi/experimental/directive/template/schema.py +36 -0
- lionagi/experimental/directive/tokenizer.py +73 -0
- lionagi/experimental/evaluator/__init__.py +0 -0
- lionagi/experimental/evaluator/ast_evaluator.py +131 -0
- lionagi/experimental/evaluator/base_evaluator.py +218 -0
- lionagi/experimental/knowledge/__init__.py +0 -0
- lionagi/experimental/knowledge/base.py +10 -0
- lionagi/experimental/knowledge/graph.py +0 -0
- lionagi/experimental/memory/__init__.py +0 -0
- lionagi/experimental/strategies/__init__.py +0 -0
- lionagi/experimental/strategies/base.py +1 -0
- lionagi/integrations/bridge/autogen_/__init__.py +0 -0
- lionagi/integrations/bridge/autogen_/autogen_.py +124 -0
- lionagi/integrations/bridge/langchain_/documents.py +4 -0
- lionagi/integrations/bridge/llamaindex_/index.py +30 -0
- lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +6 -0
- lionagi/integrations/bridge/llamaindex_/llama_pack.py +227 -0
- lionagi/integrations/bridge/llamaindex_/node_parser.py +6 -9
- lionagi/integrations/bridge/pydantic_/pydantic_bridge.py +1 -0
- lionagi/integrations/bridge/transformers_/__init__.py +0 -0
- lionagi/integrations/bridge/transformers_/install_.py +36 -0
- lionagi/integrations/chunker/__init__.py +0 -0
- lionagi/integrations/chunker/chunk.py +312 -0
- lionagi/integrations/config/oai_configs.py +38 -7
- lionagi/integrations/config/ollama_configs.py +1 -1
- lionagi/integrations/config/openrouter_configs.py +14 -2
- lionagi/integrations/loader/__init__.py +0 -0
- lionagi/integrations/loader/load.py +253 -0
- lionagi/integrations/loader/load_util.py +195 -0
- lionagi/integrations/provider/_mapping.py +46 -0
- lionagi/integrations/provider/litellm.py +2 -1
- lionagi/integrations/provider/mlx_service.py +16 -9
- lionagi/integrations/provider/oai.py +91 -4
- lionagi/integrations/provider/ollama.py +7 -6
- lionagi/integrations/provider/openrouter.py +115 -8
- lionagi/integrations/provider/services.py +2 -2
- lionagi/integrations/provider/transformers.py +18 -22
- lionagi/integrations/storage/__init__.py +3 -0
- lionagi/integrations/storage/neo4j.py +665 -0
- lionagi/integrations/storage/storage_util.py +287 -0
- lionagi/integrations/storage/structure_excel.py +285 -0
- lionagi/integrations/storage/to_csv.py +63 -0
- lionagi/integrations/storage/to_excel.py +83 -0
- lionagi/libs/__init__.py +26 -1
- lionagi/libs/ln_api.py +78 -23
- lionagi/libs/ln_context.py +37 -0
- lionagi/libs/ln_convert.py +21 -9
- lionagi/libs/ln_func_call.py +69 -28
- lionagi/libs/ln_image.py +107 -0
- lionagi/libs/ln_knowledge_graph.py +405 -0
- lionagi/libs/ln_nested.py +26 -11
- lionagi/libs/ln_parse.py +110 -14
- lionagi/libs/ln_queue.py +117 -0
- lionagi/libs/ln_tokenize.py +164 -0
- lionagi/{core/prompt/field_validator.py → libs/ln_validate.py} +79 -14
- lionagi/libs/special_tokens.py +172 -0
- lionagi/libs/sys_util.py +107 -2
- lionagi/lions/__init__.py +0 -0
- lionagi/lions/coder/__init__.py +0 -0
- lionagi/lions/coder/add_feature.py +20 -0
- lionagi/lions/coder/base_prompts.py +22 -0
- lionagi/lions/coder/code_form.py +13 -0
- lionagi/lions/coder/coder.py +168 -0
- lionagi/lions/coder/util.py +96 -0
- lionagi/lions/researcher/__init__.py +0 -0
- lionagi/lions/researcher/data_source/__init__.py +0 -0
- lionagi/lions/researcher/data_source/finhub_.py +191 -0
- lionagi/lions/researcher/data_source/google_.py +199 -0
- lionagi/lions/researcher/data_source/wiki_.py +96 -0
- lionagi/lions/researcher/data_source/yfinance_.py +21 -0
- lionagi/tests/integrations/__init__.py +0 -0
- lionagi/tests/libs/__init__.py +0 -0
- lionagi/tests/libs/test_field_validators.py +353 -0
- lionagi/tests/{test_libs → libs}/test_func_call.py +23 -21
- lionagi/tests/{test_libs → libs}/test_nested.py +36 -21
- lionagi/tests/{test_libs → libs}/test_parse.py +1 -1
- lionagi/tests/libs/test_queue.py +67 -0
- lionagi/tests/test_core/collections/__init__.py +0 -0
- lionagi/tests/test_core/collections/test_component.py +206 -0
- lionagi/tests/test_core/collections/test_exchange.py +138 -0
- lionagi/tests/test_core/collections/test_flow.py +145 -0
- lionagi/tests/test_core/collections/test_pile.py +171 -0
- lionagi/tests/test_core/collections/test_progression.py +129 -0
- lionagi/tests/test_core/generic/__init__.py +0 -0
- lionagi/tests/test_core/generic/test_edge.py +67 -0
- lionagi/tests/test_core/generic/test_graph.py +96 -0
- lionagi/tests/test_core/generic/test_node.py +106 -0
- lionagi/tests/test_core/generic/test_tree_node.py +73 -0
- lionagi/tests/test_core/test_branch.py +115 -292
- lionagi/tests/test_core/test_form.py +46 -0
- lionagi/tests/test_core/test_report.py +105 -0
- lionagi/tests/test_core/test_validator.py +111 -0
- lionagi/version.py +1 -1
- {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/LICENSE +12 -11
- {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/METADATA +19 -118
- lionagi-0.2.1.dist-info/RECORD +240 -0
- lionagi/core/branch/__init__.py +0 -4
- lionagi/core/branch/base_branch.py +0 -654
- lionagi/core/branch/branch.py +0 -471
- lionagi/core/branch/branch_flow_mixin.py +0 -96
- lionagi/core/branch/executable_branch.py +0 -347
- lionagi/core/branch/util.py +0 -323
- lionagi/core/direct/__init__.py +0 -6
- lionagi/core/direct/predict.py +0 -161
- lionagi/core/direct/score.py +0 -278
- lionagi/core/direct/select.py +0 -169
- lionagi/core/direct/utils.py +0 -87
- lionagi/core/direct/vote.py +0 -64
- lionagi/core/flow/base/baseflow.py +0 -23
- lionagi/core/flow/monoflow/ReAct.py +0 -238
- lionagi/core/flow/monoflow/__init__.py +0 -9
- lionagi/core/flow/monoflow/chat.py +0 -95
- lionagi/core/flow/monoflow/chat_mixin.py +0 -263
- lionagi/core/flow/monoflow/followup.py +0 -214
- lionagi/core/flow/polyflow/__init__.py +0 -1
- lionagi/core/flow/polyflow/chat.py +0 -248
- lionagi/core/mail/schema.py +0 -56
- lionagi/core/messages/__init__.py +0 -3
- lionagi/core/messages/schema.py +0 -533
- lionagi/core/prompt/prompt_template.py +0 -316
- lionagi/core/schema/__init__.py +0 -22
- lionagi/core/schema/action_node.py +0 -29
- lionagi/core/schema/base_mixin.py +0 -296
- lionagi/core/schema/base_node.py +0 -199
- lionagi/core/schema/condition.py +0 -24
- lionagi/core/schema/data_logger.py +0 -354
- lionagi/core/schema/data_node.py +0 -93
- lionagi/core/schema/prompt_template.py +0 -67
- lionagi/core/schema/structure.py +0 -910
- lionagi/core/tool/__init__.py +0 -3
- lionagi/core/tool/tool_manager.py +0 -280
- lionagi/integrations/bridge/pydantic_/base_model.py +0 -7
- lionagi/tests/test_core/test_base_branch.py +0 -427
- lionagi/tests/test_core/test_chat_flow.py +0 -63
- lionagi/tests/test_core/test_mail_manager.py +0 -75
- lionagi/tests/test_core/test_prompts.py +0 -51
- lionagi/tests/test_core/test_session.py +0 -254
- lionagi/tests/test_core/test_session_base_util.py +0 -312
- lionagi/tests/test_core/test_tool_manager.py +0 -95
- lionagi-0.0.312.dist-info/RECORD +0 -111
- /lionagi/core/{branch/base → _setting}/__init__.py +0 -0
- /lionagi/core/{flow → agent/eval}/__init__.py +0 -0
- /lionagi/core/{flow/base → agent/learn}/__init__.py +0 -0
- /lionagi/core/{prompt → agent/plan}/__init__.py +0 -0
- /lionagi/core/{tool/manual.py → agent/plan/plan.py} +0 -0
- /lionagi/{tests/test_integrations → core/director}/__init__.py +0 -0
- /lionagi/{tests/test_libs → core/engine}/__init__.py +0 -0
- /lionagi/{tests/test_libs/test_async.py → core/executor/__init__.py} +0 -0
- /lionagi/tests/{test_libs → libs}/test_api.py +0 -0
- /lionagi/tests/{test_libs → libs}/test_convert.py +0 -0
- /lionagi/tests/{test_libs → libs}/test_sys_util.py +0 -0
- {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/WHEEL +0 -0
- {lionagi-0.0.312.dist-info → lionagi-0.2.1.dist-info}/top_level.txt +0 -0
lionagi/core/messages/schema.py
DELETED
@@ -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)
|