agently 4.0.6.7__tar.gz → 4.0.6.8__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 (76) hide show
  1. {agently-4.0.6.7 → agently-4.0.6.8}/PKG-INFO +1 -1
  2. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/agent_extensions/ConfigurePromptExtension.py +2 -0
  3. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/plugins/PromptGenerator/AgentlyPromptGenerator.py +6 -1
  4. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/ModelRequest.py +169 -16
  5. {agently-4.0.6.7 → agently-4.0.6.8}/pyproject.toml +1 -1
  6. {agently-4.0.6.7 → agently-4.0.6.8}/LICENSE +0 -0
  7. {agently-4.0.6.7 → agently-4.0.6.8}/README.md +0 -0
  8. {agently-4.0.6.7 → agently-4.0.6.8}/agently/__init__.py +0 -0
  9. {agently-4.0.6.7 → agently-4.0.6.8}/agently/_default_init.py +0 -0
  10. {agently-4.0.6.7 → agently-4.0.6.8}/agently/_default_settings.yaml +0 -0
  11. {agently-4.0.6.7 → agently-4.0.6.8}/agently/base.py +0 -0
  12. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/agent_extensions/AutoFuncExtension.py +0 -0
  13. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/agent_extensions/ChatSessionExtension.py +0 -0
  14. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/agent_extensions/KeyWaiterExtension.py +0 -0
  15. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/agent_extensions/ToolExtension.py +0 -0
  16. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/agent_extensions/__init__.py +0 -0
  17. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/hookers/ConsoleHooker.py +0 -0
  18. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/hookers/PureLoggerHooker.py +0 -0
  19. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/hookers/SystemMessageHooker.py +0 -0
  20. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/plugins/ModelRequester/OpenAICompatible.py +0 -0
  21. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/plugins/ResponseParser/AgentlyResponseParser.py +0 -0
  22. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/plugins/ToolManager/AgentlyToolManager.py +0 -0
  23. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/plugins/__init__.py +0 -0
  24. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/tools/Browse.py +0 -0
  25. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/tools/Search.py +0 -0
  26. {agently-4.0.6.7 → agently-4.0.6.8}/agently/builtins/tools/__init__.py +0 -0
  27. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/Agent.py +0 -0
  28. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/EventCenter.py +0 -0
  29. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/ExtensionHandlers.py +0 -0
  30. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/PluginManager.py +0 -0
  31. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/Prompt.py +0 -0
  32. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/Tool.py +0 -0
  33. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/BluePrint.py +0 -0
  34. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/Chunk.py +0 -0
  35. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/Execution.py +0 -0
  36. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/Process.py +0 -0
  37. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/TriggerFlow.py +0 -0
  38. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/__init__.py +0 -0
  39. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/process/BaseProcess.py +0 -0
  40. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/process/ForEachProcess.py +0 -0
  41. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/process/MatchCaseProcess.py +0 -0
  42. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/TriggerFlow/process/__init__.py +0 -0
  43. {agently-4.0.6.7 → agently-4.0.6.8}/agently/core/__init__.py +0 -0
  44. {agently-4.0.6.7 → agently-4.0.6.8}/agently/integrations/chromadb.py +0 -0
  45. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/__init__.py +0 -0
  46. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/data/__init__.py +0 -0
  47. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/data/event.py +0 -0
  48. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/data/prompt.py +0 -0
  49. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/data/request.py +0 -0
  50. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/data/response.py +0 -0
  51. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/data/serializable.py +0 -0
  52. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/data/tool.py +0 -0
  53. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/plugins/EventHooker.py +0 -0
  54. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/plugins/ModelRequester.py +0 -0
  55. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/plugins/PromptGenerator.py +0 -0
  56. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/plugins/ResponseParser.py +0 -0
  57. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/plugins/ToolManager.py +0 -0
  58. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/plugins/__init__.py +0 -0
  59. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/plugins/base.py +0 -0
  60. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/trigger_flow/__init__.py +0 -0
  61. {agently-4.0.6.7 → agently-4.0.6.8}/agently/types/trigger_flow/trigger_flow.py +0 -0
  62. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/DataFormatter.py +0 -0
  63. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/DataLocator.py +0 -0
  64. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/DataPathBuilder.py +0 -0
  65. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/FunctionShifter.py +0 -0
  66. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/GeneratorConsumer.py +0 -0
  67. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/LazyImport.py +0 -0
  68. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/Logger.py +0 -0
  69. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/Messenger.py +0 -0
  70. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/RuntimeData.py +0 -0
  71. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/SerializableRuntimeData.py +0 -0
  72. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/Settings.py +0 -0
  73. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/Storage.py +0 -0
  74. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/StreamingJSONCompleter.py +0 -0
  75. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/StreamingJSONParser.py +0 -0
  76. {agently-4.0.6.7 → agently-4.0.6.8}/agently/utils/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agently
3
- Version: 4.0.6.7
3
+ Version: 4.0.6.8
4
4
  Summary:
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -188,6 +188,7 @@ class ConfigurePromptExtension(BaseAgent):
188
188
  "Cannot execute YAML prompt configures, expect prompt configures as a dictionary data but got:"
189
189
  f"{ prompt }"
190
190
  )
191
+ return self
191
192
 
192
193
  def load_json_prompt(self, path_or_content: str, mappings: dict[str, Any] | None = None):
193
194
  path = Path(path_or_content)
@@ -209,3 +210,4 @@ class ConfigurePromptExtension(BaseAgent):
209
210
  "Cannot execute JSON prompt configures, expect prompt configures as a dictionary data but got:"
210
211
  f"{ prompt }"
211
212
  )
213
+ return self
@@ -649,7 +649,12 @@ class AgentlyPromptGenerator(PromptGenerator):
649
649
  }
650
650
  )
651
651
 
652
- return create_model(name, **fields, **validators)
652
+ return create_model(
653
+ name,
654
+ __config__={'extra': 'allow'},
655
+ **fields,
656
+ **validators,
657
+ )
653
658
  else:
654
659
  item_type = Any
655
660
  if len(schema) > 0:
@@ -22,12 +22,13 @@ ContentKindTuple: TypeAlias = Literal["all", "delta", "original"]
22
22
  ContentKindStreaming: TypeAlias = Literal["instant", "streaming_parse"]
23
23
 
24
24
  from agently.core import Prompt, ExtensionHandlers
25
- from agently.utils import Settings, FunctionShifter, DataFormatter
25
+ from agently.utils import Settings, FunctionShifter, DataFormatter, DataLocator
26
26
 
27
27
  if TYPE_CHECKING:
28
28
  from agently.core import PluginManager
29
29
  from agently.types.data import AgentlyModelResponseMessage, PromptStandardSlot, StreamingData, SerializableValue
30
30
  from agently.types.plugins import ModelRequester, ResponseParser
31
+ from pydantic import BaseModel
31
32
 
32
33
 
33
34
  class ModelResponseResult:
@@ -39,6 +40,7 @@ class ModelResponseResult:
39
40
  response_generator: AsyncGenerator["AgentlyModelResponseMessage", None],
40
41
  plugin_manager: "PluginManager",
41
42
  settings: Settings,
43
+ extension_handlers: ExtensionHandlers,
42
44
  ):
43
45
  self.agent_name = agent_name
44
46
  self.plugin_manager = plugin_manager
@@ -50,19 +52,145 @@ class ModelResponseResult:
50
52
  str(self.settings["plugins.ResponseParser.activate"]),
51
53
  ),
52
54
  )
53
- _response_parser = ResponseParser(agent_name, response_id, prompt, response_generator, self.settings)
55
+ self._response_id = response_id
56
+ self._extension_handlers = extension_handlers
57
+ self._response_parser = ResponseParser(agent_name, response_id, prompt, response_generator, self.settings)
54
58
  self.prompt = prompt
55
- self.full_result_data = _response_parser.full_result_data
56
- self.get_meta = _response_parser.get_meta
57
- self.async_get_meta = _response_parser.async_get_meta
58
- self.get_text = _response_parser.get_text
59
- self.async_get_text = _response_parser.async_get_text
60
- self.get_data = _response_parser.get_data
61
- self.async_get_data = _response_parser.async_get_data
62
- self.get_data_object = _response_parser.get_data_object
63
- self.async_get_data_object = _response_parser.async_get_data_object
64
- self.get_generator = _response_parser.get_generator
65
- self.get_async_generator = _response_parser.get_async_generator
59
+ self.full_result_data = self._response_parser.full_result_data
60
+ self.get_meta = self._response_parser.get_meta
61
+ self.async_get_meta = self._response_parser.async_get_meta
62
+ self.get_text = self._response_parser.get_text
63
+ self.async_get_text = self._response_parser.async_get_text
64
+ # self.get_data = self._response_parser.get_data
65
+ # self.async_get_data = self._response_parser.async_get_data
66
+ # self.get_data_object = self._response_parser.get_data_object
67
+ # self.async_get_data_object = self._response_parser.async_get_data_object
68
+ self.get_data = FunctionShifter.syncify(self.async_get_data)
69
+ self.get_data_object = FunctionShifter.syncify(self.async_get_data_object)
70
+ self.get_generator = self._response_parser.get_generator
71
+ self.get_async_generator = self._response_parser.get_async_generator
72
+
73
+ @overload
74
+ async def async_get_data(
75
+ self,
76
+ *,
77
+ type: Literal['parsed'],
78
+ ensure_keys: list[str],
79
+ key_style: Literal["dot", "slash"] = "dot",
80
+ max_retries: int = 3,
81
+ raise_ensure_failure: bool = True,
82
+ _retry_count: int = 0,
83
+ ) -> dict[str, Any]: ...
84
+
85
+ @overload
86
+ async def async_get_data(
87
+ self,
88
+ *,
89
+ type: Literal['original', 'parsed', 'all'] = "parsed",
90
+ ensure_keys: list[str] | None = None,
91
+ key_style: Literal["dot", "slash"] = "dot",
92
+ max_retries: int = 3,
93
+ raise_ensure_failure: bool = True,
94
+ _retry_count: int = 0,
95
+ ) -> Any: ...
96
+
97
+ async def async_get_data(
98
+ self,
99
+ *,
100
+ type: Literal['original', 'parsed', 'all'] = "parsed",
101
+ ensure_keys: list[str] | None = None,
102
+ key_style: Literal["dot", "slash"] = "dot",
103
+ max_retries: int = 3,
104
+ raise_ensure_failure: bool = True,
105
+ _retry_count: int = 0,
106
+ ) -> Any:
107
+ if type == "parsed" and ensure_keys:
108
+ try:
109
+ data = await self._response_parser.async_get_data(type=type)
110
+ for ensure_key in ensure_keys:
111
+ EMPTY = object()
112
+ if DataLocator.locate_path_in_dict(data, ensure_key, key_style, default=EMPTY) is EMPTY:
113
+ raise
114
+ return data
115
+ except:
116
+ from agently.base import async_system_message
117
+
118
+ await async_system_message(
119
+ "MODEL_REQUEST",
120
+ {
121
+ "agent_name": self.agent_name,
122
+ "response_id": self._response_id,
123
+ "content": {
124
+ "stage": "No Target Data in Response, Preparing Retry",
125
+ "detail": f"\n[Response]: { await self.async_get_text() }\n"
126
+ f"[Retried Times]: { _retry_count }",
127
+ },
128
+ },
129
+ self.settings,
130
+ )
131
+
132
+ if _retry_count < max_retries:
133
+ return await ModelResponse(
134
+ self.agent_name,
135
+ self.plugin_manager,
136
+ self.settings,
137
+ self.prompt,
138
+ self._extension_handlers,
139
+ ).result.async_get_data(
140
+ type=type,
141
+ ensure_keys=ensure_keys,
142
+ key_style=key_style,
143
+ max_retries=max_retries,
144
+ raise_ensure_failure=raise_ensure_failure,
145
+ _retry_count=_retry_count + 1,
146
+ )
147
+ else:
148
+ if raise_ensure_failure:
149
+ raise ValueError(
150
+ f"Can not generate ensure keys { ensure_keys } within { max_retries } retires."
151
+ )
152
+ else:
153
+ return await self._response_parser.async_get_data(type=type)
154
+ return await self._response_parser.async_get_data(type=type)
155
+
156
+ @overload
157
+ async def async_get_data_object(
158
+ self,
159
+ *,
160
+ ensure_keys: list[str],
161
+ key_style: Literal["dot", "slash"] = "dot",
162
+ max_retries: int = 3,
163
+ raise_ensure_failure: bool = True,
164
+ ) -> "BaseModel": ...
165
+
166
+ @overload
167
+ async def async_get_data_object(
168
+ self,
169
+ *,
170
+ ensure_keys: None,
171
+ key_style: Literal["dot", "slash"] = "dot",
172
+ max_retries: int = 3,
173
+ raise_ensure_failure: bool = True,
174
+ ) -> "BaseModel | None": ...
175
+
176
+ async def async_get_data_object(
177
+ self,
178
+ *,
179
+ ensure_keys: list[str] | None = None,
180
+ key_style: Literal["dot", "slash"] = "dot",
181
+ max_retries: int = 3,
182
+ raise_ensure_failure: bool = True,
183
+ ):
184
+ if ensure_keys:
185
+ await self.async_get_data(
186
+ ensure_keys=ensure_keys,
187
+ key_style=key_style,
188
+ max_retries=max_retries,
189
+ _retry_count=0,
190
+ raise_ensure_failure=raise_ensure_failure,
191
+ )
192
+ return await self._response_parser.async_get_data_object()
193
+ return await self._response_parser.async_get_data_object()
66
194
 
67
195
 
68
196
  class ModelResponse:
@@ -98,6 +226,7 @@ class ModelResponse:
98
226
  self._get_response_generator(),
99
227
  self.plugin_manager,
100
228
  self.settings,
229
+ self.extension_handlers,
101
230
  )
102
231
  self.get_meta = self.result.get_meta
103
232
  self.async_get_meta = self.result.async_get_meta
@@ -418,11 +547,35 @@ class ModelRequest:
418
547
  self,
419
548
  *,
420
549
  type: Literal['original', 'parsed', 'all'] = "parsed",
550
+ ensure_keys: list[str] | None = None,
551
+ key_style: Literal["dot", "slash"] = "dot",
552
+ max_retries: int = 3,
553
+ raise_ensure_failure: bool = True,
421
554
  ):
422
- return await self.get_response().async_get_data(type=type)
555
+ response = self.get_response()
556
+ return await response.async_get_data(
557
+ type=type,
558
+ ensure_keys=ensure_keys,
559
+ key_style=key_style,
560
+ max_retries=max_retries,
561
+ raise_ensure_failure=raise_ensure_failure,
562
+ )
423
563
 
424
- async def async_get_data_object(self):
425
- return await self.get_response().async_get_data_object()
564
+ async def async_get_data_object(
565
+ self,
566
+ *,
567
+ ensure_keys: list[str] | None = None,
568
+ key_style: Literal["dot", "slash"] = "dot",
569
+ max_retries: int = 3,
570
+ raise_ensure_failure: bool = True,
571
+ ):
572
+ response = self.get_response()
573
+ return await response.async_get_data_object(
574
+ ensure_keys=ensure_keys,
575
+ key_style=key_style,
576
+ max_retries=max_retries,
577
+ raise_ensure_failure=raise_ensure_failure,
578
+ )
426
579
 
427
580
  @overload
428
581
  def get_generator(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agently"
3
- version = "4.0.6.7"
3
+ version = "4.0.6.8"
4
4
  description = ""
5
5
  authors = [
6
6
  {name = "Agently Team",email = "developer@agently.tech"},
File without changes
File without changes
File without changes
File without changes