Agently 3.2.2.2__tar.gz → 3.2.2.4__tar.gz

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 (108) hide show
  1. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Agent/Agent.py +4 -0
  2. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Agent/AgentFactory.py +4 -0
  3. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/yamlflow/yamlflow.py +1 -1
  4. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/Tool.py +7 -5
  5. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/YAMLLoader.py +5 -1
  6. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/Claude.py +14 -3
  7. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/OAIClient.py +2 -54
  8. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/utils/__init__.py +2 -1
  9. Agently-3.2.2.4/Agently/plugins/request/utils/format.py +57 -0
  10. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/storage/FileStorage.py +1 -1
  11. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/tool/Web.py +22 -51
  12. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/requirements.txt +2 -1
  13. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/ToolManager.py +6 -1
  14. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently.egg-info/PKG-INFO +3 -2
  15. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently.egg-info/SOURCES.txt +1 -0
  16. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently.egg-info/requires.txt +2 -1
  17. {Agently-3.2.2.2 → Agently-3.2.2.4}/PKG-INFO +3 -2
  18. {Agently-3.2.2.2 → Agently-3.2.2.4}/setup.py +1 -1
  19. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Agent/__init__.py +0 -0
  20. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Facility/FacilityManager.py +0 -0
  21. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Facility/__init__.py +0 -0
  22. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Request/Request.py +0 -0
  23. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Request/__init__.py +0 -0
  24. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/WebSocket/WebSocket.py +0 -0
  25. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/WebSocket/__init__.py +0 -0
  26. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/Chunk.py +0 -0
  27. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/MainExecutor.py +0 -0
  28. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/Schema.py +0 -0
  29. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/Workflow.py +0 -0
  30. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/__init__.py +0 -0
  31. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/executors/StartExecutor.py +0 -0
  32. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/executors/__init__.py +0 -0
  33. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/executors/install.py +0 -0
  34. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/lib/BreakingHub.py +0 -0
  35. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/lib/ChunkExecutorABC.py +0 -0
  36. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/lib/ChunkExecutorManager.py +0 -0
  37. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/lib/Store.py +0 -0
  38. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/lib/__init__.py +0 -0
  39. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/lib/constants.py +0 -0
  40. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/lib/painter.py +0 -0
  41. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/utils/__init__.py +0 -0
  42. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/utils/exec_tree.py +0 -0
  43. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/utils/find.py +0 -0
  44. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/utils/logger.py +0 -0
  45. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/utils/runtime_supports.py +0 -0
  46. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/utils/verify.py +0 -0
  47. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/yamlflow/__init__.py +0 -0
  48. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/yamlflow/preset_chunks/Print.py +0 -0
  49. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/yamlflow/preset_chunks/Start.py +0 -0
  50. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/yamlflow/preset_chunks/UserInput.py +0 -0
  51. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/Workflow/yamlflow/preset_chunks/__init__.py +0 -0
  52. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/__init__.py +0 -0
  53. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/_global.py +0 -0
  54. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/global_plugin_manager.py +0 -0
  55. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/__init__.py +0 -0
  56. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/Decorator.py +0 -0
  57. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/EventListener.py +0 -0
  58. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/OpenAIAssistant.py +0 -0
  59. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/ReplyReformer.py +0 -0
  60. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/Role.py +0 -0
  61. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/Search.py +0 -0
  62. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/Segment.py +0 -0
  63. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/Session.py +0 -0
  64. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/Status.py +0 -0
  65. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/UserInfo.py +0 -0
  66. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/__init__.py +0 -0
  67. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/config.ini +0 -0
  68. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/utils/ComponentABC.py +0 -0
  69. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/agent_component/utils/__init__.py +0 -0
  70. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/facility/Embedding.py +0 -0
  71. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/facility/RoleManager.py +0 -0
  72. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/facility/StatusManager.py +0 -0
  73. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/facility/__init__.py +0 -0
  74. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/facility/config.ini +0 -0
  75. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/facility/utils/FacilityABC.py +0 -0
  76. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/facility/utils/__init__.py +0 -0
  77. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/ERNIE.py +0 -0
  78. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/Google.py +0 -0
  79. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/Kimi.py +0 -0
  80. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/MiniMax.py +0 -0
  81. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/OpenAI.py +0 -0
  82. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/ZhipuAI.py +0 -0
  83. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/__init__.py +0 -0
  84. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/config.ini +0 -0
  85. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/utils/RequestABC.py +0 -0
  86. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/request/utils/transform.py +0 -0
  87. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/storage/__init__.py +0 -0
  88. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/storage/config.ini +0 -0
  89. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/storage/utils/StorageABC.py +0 -0
  90. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/storage/utils/__init__.py +0 -0
  91. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/tool/Code.py +0 -0
  92. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/tool/__init__.py +0 -0
  93. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/tool/config.ini +0 -0
  94. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/tool/utils/ToolABC.py +0 -0
  95. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/plugins/tool/utils/__init__.py +0 -0
  96. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/AliasManager.py +0 -0
  97. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/DataOps.py +0 -0
  98. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/IdGenerator.py +0 -0
  99. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/PluginManager.py +0 -0
  100. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/RuntimeCtx.py +0 -0
  101. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/StorageDelegate.py +0 -0
  102. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/__init__.py +0 -0
  103. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/check_version.py +0 -0
  104. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/load_json.py +0 -0
  105. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently/utils/transform.py +0 -0
  106. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently.egg-info/dependency_links.txt +0 -0
  107. {Agently-3.2.2.2 → Agently-3.2.2.4}/Agently.egg-info/top_level.txt +0 -0
  108. {Agently-3.2.2.2 → Agently-3.2.2.4}/setup.cfg +0 -0
@@ -122,6 +122,10 @@ class Agent(object):
122
122
  self.settings.set(settings_key, settings_value)
123
123
  return self
124
124
 
125
+ def set_global_variable(self, variable_name: str, variable_value: any):
126
+ self.settings.set(f"global_variables.{ variable_name }", variable_value)
127
+ return self
128
+
125
129
  def set_agent_prompt(self, key: str, value: any):
126
130
  self.agent_runtime_ctx.set(f"prompt.{ key }", value)
127
131
  return self
@@ -52,6 +52,10 @@ class AgentFactory(object):
52
52
  self.settings.set(settings_key, settings_value)
53
53
  return self
54
54
 
55
+ def set_global_variable(self, variable_name: str, variable_value: any):
56
+ self.settings.set(f"global_variables.{ variable_name }", variable_value)
57
+ return self
58
+
55
59
  def toggle_component(self, component_name: str, is_enabled: bool):
56
60
  self.set_settings(f"component_toggles.{ component_name }", is_enabled)
57
61
  return self
@@ -107,7 +107,7 @@ def start_yaml(workflow, yaml_dict, *, draw):
107
107
 
108
108
  def start_yaml_from_path(workflow, yaml_path, *, draw):
109
109
  try:
110
- with open(yaml_path, "r") as yaml_file:
110
+ with open(yaml_path, "r", encoding="utf-8") as yaml_file:
111
111
  yaml_dict = yaml.safe_load(yaml_file)
112
112
  return start_yaml(workflow, yaml_dict, draw=draw)
113
113
  except Exception as e:
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import json
2
3
  from datetime import datetime
3
4
  from .utils import ComponentABC
@@ -11,6 +12,7 @@ class Tool(ComponentABC):
11
12
  self.tool_manager = self.agent.tool_manager
12
13
  self.tool_dict = {}
13
14
  self.must_call_tool_info = None
15
+ self.get_tool_func = self.tool_manager.get_tool_func
14
16
  self.call_tool_func = self.tool_manager.call_tool_func
15
17
  self.set_tool_proxy = self.tool_manager.set_tool_proxy
16
18
 
@@ -101,10 +103,11 @@ class Tool(ComponentABC):
101
103
  tool_kwrags.update({ "proxy": proxy })
102
104
  call_result = None
103
105
  try:
104
- call_result = self.call_tool_func(
105
- tool_info["tool_name"],
106
- **tool_kwrags
107
- )
106
+ tool_func = self.get_tool_func(tool_info["tool_name"])
107
+ if asyncio.iscoroutinefunction(tool_func):
108
+ call_result = await tool_func(**tool_kwrags)
109
+ else:
110
+ call_result = tool_func(**tool_kwrags)
108
111
  except Exception as e:
109
112
  if self.is_debug():
110
113
  print("[Tool Error]: ", e)
@@ -151,7 +154,6 @@ class Tool(ComponentABC):
151
154
  if tool_results and len(tool_results.keys()) > 0:
152
155
  return {
153
156
  "info": tool_results,
154
- "instruct": ["Use format [keywords](url) to mark internet-source information in {OUTPUT}"]
155
157
  }
156
158
  else:
157
159
  return None
@@ -19,7 +19,7 @@ class YAMLLoader(ComponentABC):
19
19
  agently_tuple_list[1] = self.transform_to_agently_style(value, variables=variables)
20
20
  else:
21
21
  result.update({ key: self.transform_to_agently_style(value, variables=variables) })
22
- if agently_tuple_list[0] and agently_tuple_list[1]:
22
+ if agently_tuple_list[0] or agently_tuple_list[1]:
23
23
  result = (agently_tuple_list[0], agently_tuple_list[1])
24
24
  return result
25
25
  if isinstance(target, list):
@@ -31,6 +31,10 @@ class YAMLLoader(ComponentABC):
31
31
  result = str(target)
32
32
  for key, value in variables.items():
33
33
  result = result.replace("${" + str(key) + "}", str(value))
34
+ global_variables = self.agent.settings.get("global_variables")
35
+ if global_variables:
36
+ for key, value in global_variables.items():
37
+ result = result.replace("${" + str(key) + "}", str(value))
34
38
  return result
35
39
 
36
40
  def load_yaml_prompt(self, *, path:str=None, yaml:str=None, use_agently_style:bool=True, variables:dict={}):
@@ -1,4 +1,4 @@
1
- from .utils import RequestABC, to_prompt_structure, to_instruction, to_json_desc, find_json
1
+ from .utils import RequestABC, to_prompt_structure, to_instruction, to_json_desc, find_json, format_request_messages
2
2
  from Agently.utils import RuntimeCtxNamespace
3
3
  import httpx
4
4
  import json
@@ -8,6 +8,12 @@ class Claude(RequestABC):
8
8
  self.request = request
9
9
  self.model_name = "Claude"
10
10
  self.model_settings = RuntimeCtxNamespace(f"model.{ self.model_name }", self.request.settings)
11
+ if not self.model_settings.get_trace_back("message_rules.no_multi_system_messages"):
12
+ self.model_settings.set("message_rules.no_multi_system_messages", False)
13
+ if not self.model_settings.get_trace_back("message_rules.strict_orders"):
14
+ self.model_settings.set("message_rules.strict_orders", True)
15
+ if not self.model_settings.get_trace_back("message_rules.no_multi_type_messages"):
16
+ self.model_settings.set("message_rules.no_multi_type_messages", False)
11
17
  self.default_options = {
12
18
  "model": "claude-3-sonnet-20240229",
13
19
  "max_tokens": 4096,
@@ -72,15 +78,20 @@ class Claude(RequestABC):
72
78
  request_messages.append({ "role": "user", "content": [{"type": "text", "text": prompt_text }] })
73
79
  return request_messages
74
80
 
81
+
82
+
75
83
  def generate_request_data(self):
76
84
  options = self.model_settings.get_trace_back("options", {})
77
85
  return {
78
- "messages": self.construct_request_messages(),
86
+ "messages": format_request_messages(self.construct_request_messages(), self.model_settings),
79
87
  "options": options,
80
88
  }
81
89
 
82
90
  async def request_model(self, request_data: dict):
83
91
  api_key = self.model_settings.get_trace_back("auth.api_key")
92
+ base_url = self.model_settings.get_trace_back("url", "https://api.anthropic.com/v1")
93
+ if base_url.endswith("/"):
94
+ base_url = base_url[:-1]
84
95
  proxy = self.request.settings.get_trace_back("proxy")
85
96
  messages = request_data["messages"]
86
97
  system_prompt = ""
@@ -111,7 +122,7 @@ class Claude(RequestABC):
111
122
  async with httpx.AsyncClient(**client_params) as client:
112
123
  async with client.stream(
113
124
  "POST",
114
- "https://api.anthropic.com/v1/messages",
125
+ f"{ base_url }/messages",
115
126
  **request_params
116
127
  ) as response:
117
128
  async for chunk in response.aiter_lines():
@@ -1,5 +1,5 @@
1
1
  from openai import AsyncOpenAI as OpenAIClient
2
- from .utils import RequestABC, to_prompt_structure, to_instruction, to_json_desc, find_json
2
+ from .utils import RequestABC, to_prompt_structure, to_instruction, to_json_desc, find_json, format_request_messages
3
3
  from Agently.utils import RuntimeCtxNamespace
4
4
  import httpx
5
5
  import json
@@ -76,58 +76,6 @@ class OAIClient(RequestABC):
76
76
  request_messages.append({ "role": "user", "content": [{"type": "text", "text": prompt_text }] })
77
77
  return request_messages
78
78
 
79
- def format_request_messages(self, request_messages):
80
- system_prompt = ""
81
- system_messages = []
82
- chat_messages = []
83
- role_list = ["user", "assistant"]
84
- current_role = 0
85
- for message in request_messages:
86
- if message["role"] == "system":
87
- # no_multi_system_messages=True
88
- if self.model_settings.get_trace_back("message_rules.no_multi_system_messages"):
89
- for content in message["content"]:
90
- if content["type"] == "text":
91
- system_prompt += f"{ content['text'] }\n"
92
- # no_multi_system_messages=False
93
- else:
94
- system_messages.append(message)
95
- else:
96
- # strict_orders=True
97
- if self.model_settings.get_trace_back("message_rules.strict_orders"):
98
- if len(chat_messages) == 0 and message["role"] != "user":
99
- chat_messages.append({ "role": "user", "content": "What did we talked about?" })
100
- current_role = not current_role
101
- if message["role"] == role_list[current_role]:
102
- chat_messages.append(message)
103
- current_role = not current_role
104
- else:
105
- content = f"{ chat_messages[-1]['content'] }\n{ message['content'] }"
106
- chat_messages[-1]['content'] = content
107
- # strict_orders=False
108
- else:
109
- chat_messages.append(message)
110
- # no_multi_system_messages=True
111
- if self.model_settings.get_trace_back("message_rules.no_multi_system_messages") and system_prompt != "":
112
- system_messages.append({
113
- "role": "system",
114
- "content": [{
115
- "type": "text",
116
- "text": system_prompt
117
- }]
118
- })
119
- formatted_messages = system_messages.copy()
120
- formatted_messages.extend(chat_messages)
121
- # no_multi_type_messages=True
122
- if self.model_settings.get_trace_back("message_rules.no_multi_type_messages"):
123
- current_messages = formatted_messages.copy()
124
- formatted_messages = []
125
- for message in current_messages:
126
- for item in message["content"]:
127
- if item["type"] == "text":
128
- formatted_messages.append({ "role": message["role"], "content": item["text"] })
129
- return formatted_messages
130
-
131
79
  def construct_completion_prompt(self):
132
80
  # - init prompt
133
81
  completion_prompt = ""
@@ -218,7 +166,7 @@ class OAIClient(RequestABC):
218
166
  options.update({ key: value })
219
167
  if self.request_type == "chat":
220
168
  return {
221
- "messages": self.format_request_messages(self.construct_request_messages()),
169
+ "messages": format_request_messages(self.construct_request_messages(), self.model_settings),
222
170
  **options,
223
171
  }
224
172
  elif self.request_type == "completions":
@@ -1,2 +1,3 @@
1
1
  from .RequestABC import RequestABC
2
- from .transform import to_prompt_structure, to_instruction, to_json_desc, find_json
2
+ from .transform import to_prompt_structure, to_instruction, to_json_desc, find_json
3
+ from .format import format_request_messages
@@ -0,0 +1,57 @@
1
+ def format_request_messages(request_messages, model_settings):
2
+ system_prompt = ""
3
+ system_messages = []
4
+ chat_messages = []
5
+ role_list = ["user", "assistant"]
6
+ current_role = 0
7
+ for message in request_messages:
8
+ if message["role"] == "system":
9
+ # no_multi_system_messages=True
10
+ if model_settings.get_trace_back("message_rules.no_multi_system_messages"):
11
+ if isinstance(message["content"], str):
12
+ system_prompt += f"{ message['content'] }\n"
13
+ elif isinstance(message["content"], list):
14
+ for content in message["content"]:
15
+ if content["type"] == "text":
16
+ system_prompt += f"{ content['text'] }\n"
17
+ # no_multi_system_messages=False
18
+ else:
19
+ system_messages.append(message)
20
+ else:
21
+ # strict_orders=True
22
+ if model_settings.get_trace_back("message_rules.strict_orders"):
23
+ if len(chat_messages) == 0 and message["role"] != "user":
24
+ chat_messages.append({ "role": "user", "content": [{"type": "text", "text": "What did we talked about?" }] })
25
+ current_role = not current_role
26
+ if message["role"] == role_list[current_role]:
27
+ chat_messages.append(message)
28
+ current_role = not current_role
29
+ else:
30
+ content = f"{ chat_messages[-1]['content'] }\n{ message['content'] }"
31
+ chat_messages[-1]['content'] = content
32
+ # strict_orders=False
33
+ else:
34
+ chat_messages.append(message)
35
+ # no_multi_system_messages=True
36
+ if model_settings.get_trace_back("message_rules.no_multi_system_messages") and system_prompt != "":
37
+ system_messages.append({
38
+ "role": "system",
39
+ "content": [{
40
+ "type": "text",
41
+ "text": system_prompt
42
+ }]
43
+ })
44
+ formatted_messages = system_messages.copy()
45
+ formatted_messages.extend(chat_messages)
46
+ # no_multi_type_messages=True
47
+ if model_settings.get_trace_back("message_rules.no_multi_type_messages"):
48
+ current_messages = formatted_messages.copy()
49
+ formatted_messages = []
50
+ for message in current_messages:
51
+ if isinstance(message["content"], str):
52
+ formatted_messages.append(message)
53
+ elif isinstance(message["content"], list):
54
+ for item in message["content"]:
55
+ if item["type"] == "text":
56
+ formatted_messages.append({ "role": message["role"], "content": item["text"] })
57
+ return formatted_messages
@@ -5,7 +5,7 @@ from .utils import StorageABC
5
5
  class FileStorage(StorageABC):
6
6
  def __init__(self, db_name: str="default"):
7
7
  self.db_name = db_name
8
- self.path = "./file_storage"
8
+ self.path = "./.Agently"
9
9
  if not os.path.exists(self.path):
10
10
  os.mkdir(self.path)
11
11
 
@@ -2,8 +2,8 @@ from .utils import ToolABC
2
2
  import time
3
3
  import httpx
4
4
  from duckduckgo_search import DDGS
5
- from newspaper import Article as NsArticle, Config as NsConfig
6
- #from bs4 import BeautifulSoup
5
+ import requests
6
+ from bs4 import BeautifulSoup
7
7
 
8
8
  class Web(ToolABC):
9
9
  def __init__(self, tool_manager: object):
@@ -36,14 +36,6 @@ class Web(ToolABC):
36
36
  "brief": result["body"],
37
37
  "url": result["href"],
38
38
  })
39
- '''
40
- results["origin"].append(result)
41
- results["for_agent"].append({
42
- "index": index,
43
- "title": result["title"],
44
- "body": result["body"],
45
- })
46
- '''
47
39
  elif type == 2:
48
40
  for index, result in enumerate(ddgs.news(
49
41
  str(keywords),
@@ -56,15 +48,6 @@ class Web(ToolABC):
56
48
  "source": result["source"],
57
49
  "date": result["date"],
58
50
  })
59
- '''
60
- results["origin"].append(result)
61
- results["for_agent"].append({
62
- "index": index,
63
- "title": result["title"],
64
- "body": result["body"],
65
- "date": result["date"],
66
- })
67
- '''
68
51
  except Exception as e:
69
52
  results = f"No Result Because: { str(e) }"
70
53
  return results
@@ -82,40 +65,28 @@ class Web(ToolABC):
82
65
  return self.search(keywords, options=options, proxy=proxy, type=2)
83
66
 
84
67
  def browse(self, url: str, *, retry_times:int = 0, proxy: str=None):
85
- ns_config = NsConfig()
86
- if proxy:
87
- if proxy.startswith("http:"):
88
- ns_config.proxies = { "http": proxy }
89
- elif proxy.startswith("https:"):
90
- ns_config.proxies = { "https": proxy }
91
- ns_config.request_timeout = 20
92
- ns_config.browser_user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
93
- ns_config.browser_accept = "*/*"
94
- ns_config.fetch_images = False
95
- ns_config.memoize_articles = False
96
- ns_article = NsArticle(url, config = ns_config)
97
- ns_article.download()
98
- ns_article.parse()
99
- result = ns_article.text
100
- return result
101
- '''
102
- if len(result) < 200:
103
- request_params = {}
68
+ try:
69
+ request_options = {}
104
70
  if proxy:
105
- request_params.update({ "proxies": proxy })
106
- response = httpx.get(url, **request_params)
107
- if response.status_code == 200:
108
- soup = BeautifulSoup(response.text, "html.parser")
109
- result = re.sub(r"\n{3,}", "\n\n", soup.get_text())
110
- return result
71
+ if proxy.startswith("http:"):
72
+ request_options.update({ "proxies": { "http": proxy } })
73
+ elif proxy.startswith("https:"):
74
+ request_options.update({ "proxies": { "https": proxy } })
75
+ request_options.update({ "headers": { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"} })
76
+ page_response = requests.get(url, **request_options)
77
+ soup = BeautifulSoup(page_response.content, 'html.parser')
78
+ paragraphs = soup.find_all('p')
79
+ texts = [p.get_text() for p in paragraphs]
80
+ page_content = '\n'.join(texts)
81
+ if page_content and page_content != "":
82
+ return page_content
111
83
  else:
112
- if retry_times < 3:
113
- return self.browse(url, retry_times = retry_times + 1)
114
- else:
115
- return "Can not open the web page."
116
- else:
117
- return result
118
- '''
84
+ return f"Can not get content from url: { url }"
85
+ except Exception as e:
86
+ if retry_times < 3:
87
+ return self.browse(url, retry_times = retry_times + 1, proxy = proxy)
88
+ else:
89
+ return f"Can not get content from url: { url }\nError: { str(e) }"
119
90
 
120
91
  def export(self):
121
92
  return {
@@ -12,7 +12,8 @@ PyYAML
12
12
  json5
13
13
  # Web
14
14
  duckduckgo_search
15
- newspaper3k
15
+ beautifulsoup4
16
+ requests
16
17
  # Calulate
17
18
  numpy
18
19
  scipy
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  from .RuntimeCtx import RuntimeCtx, RuntimeCtxNamespace
2
3
 
3
4
  class ToolManager(object):
@@ -71,7 +72,11 @@ class ToolManager(object):
71
72
  def call_tool_func(self, tool_name: str, *args, **kwargs):
72
73
  func = self.get_tool_func(tool_name)
73
74
  if func:
74
- return func(*args, **kwargs)
75
+ if asyncio.iscoroutinefunction(func):
76
+ loop = asyncio.get_event_loop()
77
+ return loop.run_until_complete(func(*args, **kwargs))
78
+ else:
79
+ return func(*args, **kwargs)
75
80
  else:
76
81
  return None
77
82
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Agently
3
- Version: 3.2.2.2
3
+ Version: 3.2.2.4
4
4
  Summary: Agently, a framework to build applications based on language model powered intelligent agents.
5
5
  Home-page: https://github.com/Maplemx/Agently
6
6
  Author: Maplemx
@@ -20,7 +20,8 @@ Requires-Dist: zhipuai
20
20
  Requires-Dist: PyYAML
21
21
  Requires-Dist: json5
22
22
  Requires-Dist: duckduckgo_search
23
- Requires-Dist: newspaper3k
23
+ Requires-Dist: beautifulsoup4
24
+ Requires-Dist: requests
24
25
  Requires-Dist: numpy
25
26
  Requires-Dist: scipy
26
27
  Requires-Dist: sympy
@@ -80,6 +80,7 @@ Agently/plugins/request/__init__.py
80
80
  Agently/plugins/request/config.ini
81
81
  Agently/plugins/request/utils/RequestABC.py
82
82
  Agently/plugins/request/utils/__init__.py
83
+ Agently/plugins/request/utils/format.py
83
84
  Agently/plugins/request/utils/transform.py
84
85
  Agently/plugins/storage/FileStorage.py
85
86
  Agently/plugins/storage/__init__.py
@@ -8,7 +8,8 @@ zhipuai
8
8
  PyYAML
9
9
  json5
10
10
  duckduckgo_search
11
- newspaper3k
11
+ beautifulsoup4
12
+ requests
12
13
  numpy
13
14
  scipy
14
15
  sympy
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Agently
3
- Version: 3.2.2.2
3
+ Version: 3.2.2.4
4
4
  Summary: Agently, a framework to build applications based on language model powered intelligent agents.
5
5
  Home-page: https://github.com/Maplemx/Agently
6
6
  Author: Maplemx
@@ -20,7 +20,8 @@ Requires-Dist: zhipuai
20
20
  Requires-Dist: PyYAML
21
21
  Requires-Dist: json5
22
22
  Requires-Dist: duckduckgo_search
23
- Requires-Dist: newspaper3k
23
+ Requires-Dist: beautifulsoup4
24
+ Requires-Dist: requests
24
25
  Requires-Dist: numpy
25
26
  Requires-Dist: scipy
26
27
  Requires-Dist: sympy
@@ -10,7 +10,7 @@ for requirement in origin_requirements:
10
10
 
11
11
  setuptools.setup(
12
12
  name = "Agently",
13
- version = "3.2.2.2",
13
+ version = "3.2.2.4",
14
14
  author = "Maplemx",
15
15
  author_email = "maplemx@gmail.com",
16
16
  description = "Agently, a framework to build applications based on language model powered intelligent agents.",
File without changes
File without changes
File without changes