zrb 1.16.5__py3-none-any.whl → 1.17.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.
@@ -0,0 +1,21 @@
1
+ import os
2
+
3
+ from zrb.builtin.group import searxng_group
4
+ from zrb.config.config import CFG
5
+ from zrb.input.int_input import IntInput
6
+ from zrb.task.cmd_task import CmdTask
7
+ from zrb.task.http_check import HttpCheck
8
+
9
+ start_searxng = searxng_group.add_task(
10
+ CmdTask(
11
+ name="start-searxng",
12
+ input=IntInput(name="port", default=CFG.SEARXNG_PORT),
13
+ cwd=os.path.dirname(__file__),
14
+ cmd="docker run --rm -p {ctx.input.port}:8080 -v ./config/:/etc/searxng/ docker.io/searxng/searxng:latest -d", # noqa
15
+ readiness_check=HttpCheck(
16
+ "check-searxng",
17
+ url="http://localhost:{ctx.input.port}",
18
+ ),
19
+ ),
20
+ alias="start",
21
+ )
zrb/config/config.py CHANGED
@@ -244,6 +244,21 @@ class Config:
244
244
  value = self._getenv("LLM_API_KEY")
245
245
  return None if value == "" else value
246
246
 
247
+ @property
248
+ def LLM_MODEL_SMALL(self) -> str | None:
249
+ value = self._getenv("LLM_MODEL_SMALL")
250
+ return None if value == "" else value
251
+
252
+ @property
253
+ def LLM_BASE_URL_SMALL(self) -> str | None:
254
+ value = self._getenv("LLM_BASE_URL_SMALL")
255
+ return None if value == "" else value
256
+
257
+ @property
258
+ def LLM_API_KEY_SMALL(self) -> str | None:
259
+ value = self._getenv("LLM_API_KEY_SMALL")
260
+ return None if value == "" else value
261
+
247
262
  @property
248
263
  def LLM_SYSTEM_PROMPT(self) -> str | None:
249
264
  value = self._getenv("LLM_SYSTEM_PROMPT")
@@ -383,14 +398,6 @@ class Config:
383
398
  def LLM_ALLOW_SEARCH_INTERNET(self) -> bool:
384
399
  return to_boolean(self._getenv("LLM_ALLOW_SEARCH_INTERNET", "1"))
385
400
 
386
- @property
387
- def LLM_ALLOW_SEARCH_ARXIV(self) -> bool:
388
- return to_boolean(self._getenv("LLM_ALLOW_SEARCH_ARXIV", "1"))
389
-
390
- @property
391
- def LLM_ALLOW_SEARCH_WIKIPEDIA(self) -> bool:
392
- return to_boolean(self._getenv("LLM_ALLOW_SEARCH_WIKIPEDIA", "1"))
393
-
394
401
  @property
395
402
  def LLM_ALLOW_GET_CURRENT_LOCATION(self) -> bool:
396
403
  return to_boolean(self._getenv("LLM_ALLOW_GET_CURRENT_LOCATION", "1"))
@@ -425,10 +432,23 @@ class Config:
425
432
  def RAG_MAX_RESULT_COUNT(self) -> int:
426
433
  return int(self._getenv("RAG_MAX_RESULT_COUNT", "5"))
427
434
 
435
+ @property
436
+ def SEARCH_INTERNET_METHOD(self) -> str:
437
+ """Either serpapi or searxng"""
438
+ return self._getenv("SEARCH_INTERNET_METHOD", "serpapi")
439
+
428
440
  @property
429
441
  def SERPAPI_KEY(self) -> str:
430
442
  return os.getenv("SERPAPI_KEY", "")
431
443
 
444
+ @property
445
+ def SEARXNG_PORT(self) -> int:
446
+ return int(self._getenv("SEARXNG_PORT", "8080"))
447
+
448
+ @property
449
+ def SEARXNG_BASE_URL(self) -> str:
450
+ return self._getenv("SEARXNG_BASE_URL", f"http://localhost:{self.SEARXNG_PORT}")
451
+
432
452
  @property
433
453
  def BANNER(self) -> str:
434
454
  return fstring_format(
zrb/config/llm_config.py CHANGED
@@ -13,8 +13,11 @@ class LLMConfig:
13
13
  def __init__(
14
14
  self,
15
15
  default_model_name: str | None = None,
16
- default_base_url: str | None = None,
17
- default_api_key: str | None = None,
16
+ default_model_base_url: str | None = None,
17
+ default_model_api_key: str | None = None,
18
+ default_small_model_name: str | None = None,
19
+ default_small_model_base_url: str | None = None,
20
+ default_small_model_api_key: str | None = None,
18
21
  default_persona: str | None = None,
19
22
  default_system_prompt: str | None = None,
20
23
  default_interactive_system_prompt: str | None = None,
@@ -26,12 +29,21 @@ class LLMConfig:
26
29
  default_model: "Model | None" = None,
27
30
  default_model_settings: "ModelSettings | None" = None,
28
31
  default_model_provider: "Provider | None" = None,
32
+ default_small_model: "Model | None" = None,
33
+ default_small_model_settings: "ModelSettings | None" = None,
34
+ default_small_model_provider: "Provider | None" = None,
29
35
  default_yolo_mode: bool | list[str] | None = None,
36
+ default_current_weather_tool: Callable | None = None,
37
+ default_current_location_tool: Callable | None = None,
38
+ default_search_internet_tool: Callable | None = None,
30
39
  ):
31
40
  self.__internal_default_prompt: dict[str, str] = {}
32
41
  self._default_model_name = default_model_name
33
- self._default_model_base_url = default_base_url
34
- self._default_model_api_key = default_api_key
42
+ self._default_model_base_url = default_model_base_url
43
+ self._default_model_api_key = default_model_api_key
44
+ self._default_small_model_name = default_small_model_name
45
+ self._default_small_model_base_url = default_small_model_base_url
46
+ self._default_small_model_api_key = default_small_model_api_key
35
47
  self._default_persona = default_persona
36
48
  self._default_system_prompt = default_system_prompt
37
49
  self._default_interactive_system_prompt = default_interactive_system_prompt
@@ -45,7 +57,13 @@ class LLMConfig:
45
57
  self._default_model = default_model
46
58
  self._default_model_settings = default_model_settings
47
59
  self._default_model_provider = default_model_provider
60
+ self._default_small_model = default_small_model
61
+ self._default_small_model_settings = default_small_model_settings
62
+ self._default_small_model_provider = default_small_model_provider
48
63
  self._default_yolo_mode = default_yolo_mode
64
+ self._default_current_weather_tool = default_current_weather_tool
65
+ self._default_current_location_tool = default_current_location_tool
66
+ self._default_search_internet_tool = default_search_internet_tool
49
67
 
50
68
  def _get_internal_default_prompt(self, name: str) -> str:
51
69
  if name not in self.__internal_default_prompt:
@@ -100,6 +118,54 @@ class LLMConfig:
100
118
  base_url=self.default_model_base_url, api_key=self.default_model_api_key
101
119
  )
102
120
 
121
+ @property
122
+ def default_small_model_name(self) -> str | None:
123
+ return self._get_property(
124
+ self._default_small_model_name,
125
+ CFG.LLM_MODEL_SMALL,
126
+ lambda: self.default_model_name,
127
+ )
128
+
129
+ @property
130
+ def default_small_model_base_url(self) -> str | None:
131
+ return self._get_property(
132
+ self._default_small_model_base_url,
133
+ CFG.LLM_BASE_URL_SMALL,
134
+ lambda: self.default_model_base_url,
135
+ )
136
+
137
+ @property
138
+ def default_small_model_api_key(self) -> str | None:
139
+ return self._get_property(
140
+ self._default_small_model_api_key,
141
+ CFG.LLM_API_KEY_SMALL,
142
+ lambda: self.default_model_api_key,
143
+ )
144
+
145
+ @property
146
+ def default_small_model_settings(self) -> "ModelSettings | None":
147
+ return self._get_property(
148
+ self._default_small_model_settings,
149
+ None,
150
+ lambda: self.default_model_settings,
151
+ )
152
+
153
+ @property
154
+ def default_small_model_provider(self) -> "Provider | str":
155
+ if self._default_small_model_provider is not None:
156
+ return self._default_small_model_provider
157
+ if (
158
+ self.default_small_model_base_url is None
159
+ and self.default_small_model_api_key is None
160
+ ):
161
+ return self.default_model_provider
162
+ from pydantic_ai.providers.openai import OpenAIProvider
163
+
164
+ return OpenAIProvider(
165
+ base_url=self.default_small_model_base_url,
166
+ api_key=self.default_small_model_api_key,
167
+ )
168
+
103
169
  @property
104
170
  def default_system_prompt(self) -> str:
105
171
  return self._get_property(
@@ -160,6 +226,15 @@ class LLMConfig:
160
226
  provider=self.default_model_provider,
161
227
  )
162
228
 
229
+ @property
230
+ def default_small_model(self) -> "Model | str":
231
+ if self._default_small_model is not None:
232
+ return self._default_small_model
233
+ model_name = self.default_small_model_name
234
+ if model_name is None:
235
+ return "openai:gpt-4o"
236
+ return self.default_model
237
+
163
238
  @property
164
239
  def default_summarize_history(self) -> bool:
165
240
  return self._get_property(
@@ -180,6 +255,18 @@ class LLMConfig:
180
255
  self._default_yolo_mode, CFG.LLM_YOLO_MODE, lambda: False
181
256
  )
182
257
 
258
+ @property
259
+ def default_current_weather_tool(self) -> Callable | None:
260
+ return self._default_current_weather_tool
261
+
262
+ @property
263
+ def default_current_location_tool(self) -> Callable | None:
264
+ return self._default_current_location_tool
265
+
266
+ @property
267
+ def default_search_internet_tool(self) -> Callable | None:
268
+ return self._default_search_internet_tool
269
+
183
270
  def set_default_persona(self, persona: str):
184
271
  self._default_persona = persona
185
272
 
@@ -239,5 +326,14 @@ class LLMConfig:
239
326
  def set_default_yolo_mode(self, yolo_mode: bool | list[str]):
240
327
  self._default_yolo_mode = yolo_mode
241
328
 
329
+ def set_default_current_weather_tool(self, tool: Callable):
330
+ self._default_current_weather_tool = tool
331
+
332
+ def set_default_current_location_tool(self, tool: Callable):
333
+ self._default_current_location_tool = tool
334
+
335
+ def set_default_search_internet_tool(self, tool: Callable):
336
+ self._default_search_internet_tool = tool
337
+
242
338
 
243
339
  llm_config = LLMConfig()
zrb/group/any_group.py CHANGED
@@ -35,7 +35,7 @@ class AnyGroup(ABC):
35
35
  pass
36
36
 
37
37
  @abstractmethod
38
- def add_group(self, group: "AnyGroup", alias: str | None) -> "AnyGroup":
38
+ def add_group(self, group: "AnyGroup", alias: str | None = None) -> "AnyGroup":
39
39
  pass
40
40
 
41
41
  @abstractmethod
zrb/task/llm/agent.py CHANGED
@@ -116,7 +116,6 @@ def create_agent_instance(
116
116
 
117
117
  def get_agent(
118
118
  ctx: AnyContext,
119
- agent_attr: "Agent | Callable[[AnySharedContext], Agent] | None",
120
119
  model: "str | Model",
121
120
  output_type: "OutputSpec[OutputDataT]" = str,
122
121
  system_prompt: str = "",
@@ -131,20 +130,6 @@ def get_agent(
131
130
  yolo_mode: bool | list[str] | None = None,
132
131
  ) -> "Agent":
133
132
  """Retrieves the configured Agent instance or creates one if necessary."""
134
- from pydantic_ai import Agent
135
-
136
- # Render agent instance and return if agent_attr is already an agent
137
- if isinstance(agent_attr, Agent):
138
- return agent_attr
139
- if callable(agent_attr):
140
- agent_instance = agent_attr(ctx)
141
- if not isinstance(agent_instance, Agent):
142
- err_msg = (
143
- "Callable agent factory did not return an Agent instance, "
144
- f"got: {type(agent_instance)}"
145
- )
146
- raise TypeError(err_msg)
147
- return agent_instance
148
133
  # Get tools for agent
149
134
  tools = list(tools_attr(ctx) if callable(tools_attr) else tools_attr)
150
135
  tools.extend(additional_tools)
zrb/task/llm/config.py CHANGED
@@ -84,12 +84,15 @@ def get_model(
84
84
  render_model_base_url: bool = True,
85
85
  model_api_key_attr: StrAttr | None = None,
86
86
  render_model_api_key: bool = True,
87
+ is_small_model: bool = False,
87
88
  ) -> "str | Model":
88
89
  """Gets the model instance or name, handling defaults and configuration."""
89
90
  from pydantic_ai.models import Model
90
91
 
91
92
  model = get_attr(ctx, model_attr, None, auto_render=render_model)
92
93
  if model is None:
94
+ if is_small_model:
95
+ return llm_config.default_small_model
93
96
  return llm_config.default_model
94
97
  if isinstance(model, str):
95
98
  model_base_url = get_model_base_url(
@@ -98,11 +101,11 @@ def get_model(
98
101
  model_api_key = get_model_api_key(ctx, model_api_key_attr, render_model_api_key)
99
102
  new_llm_config = LLMConfig(
100
103
  default_model_name=model,
101
- default_base_url=model_base_url,
102
- default_api_key=model_api_key,
104
+ default_model_base_url=model_base_url,
105
+ default_model_api_key=model_api_key,
103
106
  )
104
107
  if model_base_url is None and model_api_key is None:
105
- default_model_provider = llm_config.default_model_provider
108
+ default_model_provider = _get_default_model_provider(is_small_model)
106
109
  if default_model_provider is not None:
107
110
  new_llm_config.set_default_model_provider(default_model_provider)
108
111
  return new_llm_config.default_model
@@ -110,3 +113,9 @@ def get_model(
110
113
  if isinstance(model, Model):
111
114
  return model
112
115
  raise ValueError(f"Invalid model type resolved: {type(model)}, value: {model}")
116
+
117
+
118
+ def _get_default_model_provider(is_small_model: bool = False):
119
+ if is_small_model:
120
+ return llm_config.default_small_model_provider
121
+ return llm_config.default_model_provider
zrb/task/llm/prompt.py CHANGED
@@ -233,6 +233,50 @@ def get_system_and_user_prompt(
233
233
  return new_system_prompt, new_user_message
234
234
 
235
235
 
236
+ def _generate_directory_tree(
237
+ dir_path: str,
238
+ max_depth: int = 2,
239
+ ignore_dirs: list[str] | None = None,
240
+ ) -> str:
241
+ """
242
+ Generates a string representation of a directory tree, pure Python.
243
+ """
244
+ if ignore_dirs is None:
245
+ ignore_dirs = [
246
+ ".git",
247
+ ".venv",
248
+ "node_modules",
249
+ "__pycache__",
250
+ ".idea",
251
+ "dist",
252
+ "build",
253
+ ]
254
+ tree_lines = []
255
+
256
+ def recurse(path: str, depth: int, prefix: str):
257
+ if depth > max_depth:
258
+ return
259
+ try:
260
+ entries = sorted(
261
+ [e for e in os.scandir(path) if e.name not in ignore_dirs],
262
+ key=lambda e: e.name,
263
+ )
264
+ except FileNotFoundError:
265
+ return
266
+
267
+ for i, entry in enumerate(entries):
268
+ is_last = i == len(entries) - 1
269
+ connector = "└───" if is_last else "├───"
270
+ tree_lines.append(f"{prefix}{connector}{entry.name}")
271
+ if entry.is_dir():
272
+ new_prefix = prefix + (" " if is_last else "│ ")
273
+ recurse(entry.path, depth + 1, new_prefix)
274
+
275
+ tree_lines.append(os.path.basename(dir_path))
276
+ recurse(dir_path, 1, "")
277
+ return "\n".join(tree_lines)
278
+
279
+
236
280
  def extract_conversation_context(user_message: str) -> tuple[str, str]:
237
281
  modified_user_message = user_message
238
282
  # Match “@” + any non-space/comma sequence that contains at least one “/”
@@ -262,15 +306,19 @@ def extract_conversation_context(user_message: str) -> tuple[str, str]:
262
306
  as_code=True,
263
307
  )
264
308
  )
309
+ current_directory = os.getcwd()
310
+ directory_tree = _generate_directory_tree(current_directory, max_depth=2)
265
311
  conversation_context = "\n".join(
266
312
  [
267
313
  make_prompt_section("Current OS", platform.system()),
268
314
  make_prompt_section("OS Version", platform.version()),
269
315
  make_prompt_section("Python Version", platform.python_version()),
316
+ make_prompt_section(
317
+ "Directory Tree (depth=2)", directory_tree, as_code=True
318
+ ),
270
319
  ]
271
320
  )
272
321
  iso_date = datetime.now(timezone.utc).astimezone().isoformat()
273
- current_directory = os.getcwd()
274
322
  modified_user_message = "\n".join(
275
323
  [
276
324
  make_prompt_section("User Message", modified_user_message),
@@ -120,13 +120,15 @@ def _create_wrapper(
120
120
  ctx, func, args, kwargs
121
121
  )
122
122
  if not approval:
123
- raise ToolExecutionCancelled(f"User disapproving: {reason}")
123
+ raise ToolExecutionCancelled(
124
+ f"Tool execution cancelled. User disapproving: {reason}"
125
+ )
124
126
  result = await run_async(func(*args, **kwargs))
125
127
  if has_ever_edited:
126
128
  return {
127
129
  "tool_call_result": result,
128
130
  "new_tool_parameters": kwargs,
129
- "message": "User has intercepted tool call and updated the parameters",
131
+ "message": "User correction: Tool was called with user's parameters",
130
132
  }
131
133
  return result
132
134
  except KeyboardInterrupt as e:
@@ -243,12 +245,11 @@ def _get_detail_func_param(args: list[Any] | tuple[Any], kwargs: dict[str, Any])
243
245
 
244
246
 
245
247
  def _get_func_param_item(key: str, val: Any) -> str:
246
- upper_key = key.upper()
247
248
  val_str = _get_val_str(val)
248
249
  val_parts = val_str.split("\n")
249
250
  if len(val_parts) == 1:
250
- return f"- {upper_key} `{val}`"
251
- lines = [f"- {upper_key}", " ```"]
251
+ return f"- {key} `{val}`"
252
+ lines = [f"- {key}", " ```"]
252
253
  for val_part in val_parts:
253
254
  lines.append(f" {val_part}")
254
255
  lines.append(" ```")
zrb/task/llm_task.py CHANGED
@@ -63,7 +63,17 @@ class LLMTask(BaseTask):
63
63
  model_settings: (
64
64
  "ModelSettings | Callable[[AnySharedContext], ModelSettings] | None"
65
65
  ) = None,
66
- agent: "Agent | Callable[[AnySharedContext], Agent] | None" = None,
66
+ small_model: (
67
+ "Callable[[AnySharedContext], Model | str | fstring] | Model | None"
68
+ ) = None,
69
+ render_small_model: bool = True,
70
+ small_model_base_url: StrAttr | None = None,
71
+ render_small_model_base_url: bool = True,
72
+ small_model_api_key: StrAttr | None = None,
73
+ render_small_model_api_key: bool = True,
74
+ small_model_settings: (
75
+ "ModelSettings | Callable[[AnySharedContext], ModelSettings] | None"
76
+ ) = None,
67
77
  persona: StrAttr | None = None,
68
78
  render_persona: bool = False,
69
79
  system_prompt: StrAttr | None = None,
@@ -109,7 +119,6 @@ class LLMTask(BaseTask):
109
119
  retries: int = 2,
110
120
  retry_period: float = 0,
111
121
  yolo_mode: StrListAttr | BoolAttr | None = None,
112
- is_yolo_mode: BoolAttr | None = None,
113
122
  render_yolo_mode: bool = True,
114
123
  readiness_check: list[AnyTask] | AnyTask | None = None,
115
124
  readiness_check_delay: float = 0.5,
@@ -153,7 +162,13 @@ class LLMTask(BaseTask):
153
162
  self._model_api_key = model_api_key
154
163
  self._render_model_api_key = render_model_api_key
155
164
  self._model_settings = model_settings
156
- self._agent = agent
165
+ self._small_model = small_model
166
+ self._render_small_model = render_small_model
167
+ self._small_model_base_url = small_model_base_url
168
+ self._render_small_model_base_url = render_small_model_base_url
169
+ self._small_model_api_key = small_model_api_key
170
+ self._render_small_model_api_key = render_small_model_api_key
171
+ self._small_model_settings = small_model_settings
157
172
  self._persona = persona
158
173
  self._render_persona = render_persona
159
174
  self._system_prompt = system_prompt
@@ -187,10 +202,6 @@ class LLMTask(BaseTask):
187
202
  self._max_call_iteration = max_call_iteration
188
203
  self._conversation_context = conversation_context
189
204
  self._yolo_mode = yolo_mode
190
- if is_yolo_mode is not None:
191
- print("[DEPRECATED] use `yolo_mode` instead of `is_yolo_mode`")
192
- if self._yolo_mode is None:
193
- self._yolo_mode = is_yolo_mode
194
205
  self._render_yolo_mode = render_yolo_mode
195
206
  self._attachment = attachment
196
207
 
@@ -273,7 +284,6 @@ class LLMTask(BaseTask):
273
284
  # 3. Get the agent instance
274
285
  agent = get_agent(
275
286
  ctx=ctx,
276
- agent_attr=self._agent,
277
287
  model=model,
278
288
  system_prompt=system_prompt,
279
289
  model_settings=model_settings,
@@ -292,6 +302,16 @@ class LLMTask(BaseTask):
292
302
  conversation_history=conversation_history,
293
303
  )
294
304
  # 5. Summarize
305
+ small_model = get_model(
306
+ ctx=ctx,
307
+ model_attr=self._small_model,
308
+ render_model=self._render_small_model,
309
+ model_base_url_attr=self._small_model_base_url,
310
+ render_model_base_url=self._render_small_model_base_url,
311
+ model_api_key_attr=self._small_model_api_key,
312
+ render_model_api_key=self._render_small_model_api_key,
313
+ )
314
+ small_model_settings = get_model_settings(ctx, self._small_model_settings)
295
315
  conversation_history = await maybe_summarize_history(
296
316
  ctx=ctx,
297
317
  conversation_history=conversation_history,
@@ -303,8 +323,8 @@ class LLMTask(BaseTask):
303
323
  render_history_summarization_token_threshold=(
304
324
  self._render_history_summarization_token_threshold
305
325
  ),
306
- model=model,
307
- model_settings=model_settings,
326
+ model=small_model,
327
+ model_settings=small_model_settings,
308
328
  summarization_prompt=summarization_prompt,
309
329
  rate_limitter=self._rate_limitter,
310
330
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: zrb
3
- Version: 1.16.5
3
+ Version: 1.17.1
4
4
  Summary: Your Automation Powerhouse
5
5
  License: AGPL-3.0-or-later
6
6
  Keywords: Automation,Task Runner,Code Generator,Monorepo,Low Code
@@ -37,7 +37,6 @@ Requires-Dist: requests (>=2.32.2,<3.0.0)
37
37
  Requires-Dist: rich (>=13)
38
38
  Requires-Dist: tiktoken (>=0.8.0,<0.9.0)
39
39
  Requires-Dist: ulid-py (>=1.1.0,<2.0.0)
40
- Requires-Dist: xmltodict (>=1.0.2,<2.0.0)
41
40
  Project-URL: Documentation, https://github.com/state-alchemists/zrb
42
41
  Project-URL: Homepage, https://github.com/state-alchemists/zrb
43
42
  Project-URL: Repository, https://github.com/state-alchemists/zrb
@@ -2,28 +2,28 @@ zrb/__init__.py,sha256=qkCV2EnAGIgvsawBHYvKgPAp0zzPcikYSmbQXATLzg4,5060
2
2
  zrb/__main__.py,sha256=9SXH9MK4PVyU9lkEyHxiIUABbcsV2wseP94HmlqTR4M,2657
3
3
  zrb/attr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  zrb/attr/type.py,sha256=4TV5gPYMMrKh5V-yB6iRYKCbsXAH_AvGXMsjxKLHcUs,568
5
- zrb/builtin/__init__.py,sha256=qeLg_S7mRWe48AYrzNutAgAnLh2YE57-iEVK0ICd-3A,1672
5
+ zrb/builtin/__init__.py,sha256=X_uDUEeu86MrYLehHEFiLFdbqrRXMvHECEeIJJkKWh4,1724
6
6
  zrb/builtin/base64.py,sha256=UjaFttE2oRx0T7_RpKtKfgMtWfiQXfJBAJmA16ek8Ic,1507
7
7
  zrb/builtin/git.py,sha256=8_qVE_2lVQEVXQ9vhiw8Tn4Prj1VZB78ZjEJJS5Ab3M,5461
8
8
  zrb/builtin/git_subtree.py,sha256=7BKwOkVTWDrR0DXXQ4iJyHqeR6sV5VYRt8y_rEB0EHg,3505
9
- zrb/builtin/group.py,sha256=zYC5uw0VE97TXiLCr464kFJ-CJIJyeQ2RXjnVRY5ovs,2577
9
+ zrb/builtin/group.py,sha256=W_IA_4414c8Wi8QazqcT6Gq6UftrKwy95yMF114EJtI,2677
10
10
  zrb/builtin/http.py,sha256=L6RE73c65wWwG5iHFN-tpOhyh56KsrgVskDd3c3YXtk,4246
11
11
  zrb/builtin/jwt.py,sha256=3M5uaQhJZbKQLjTUft1OwPz_JxtmK-xtkjxWjciOQho,2859
12
12
  zrb/builtin/llm/chat_session.py,sha256=6q40xQdv56OtaTZCVSS16WDchn4l0sagZI2BGX_JyQM,10448
13
13
  zrb/builtin/llm/chat_trigger.py,sha256=xaJmzrvBGz6LFPOpYnG9bMeT1dY6XqZPXamtr9e72-w,2427
14
14
  zrb/builtin/llm/history.py,sha256=LDOrL0p7r_AHLa5L8Dp7bHNsOALugmJd7OguXRWGnm4,3087
15
15
  zrb/builtin/llm/input.py,sha256=Nw-26uTWp2QhUgKJcP_IMHmtk-b542CCSQ_vCOjhvhM,877
16
- zrb/builtin/llm/llm_ask.py,sha256=Va2uSfzKUWrifn4yYdw-yndy38-s1Z_pjO6YLzIwrF0,7850
16
+ zrb/builtin/llm/llm_ask.py,sha256=nMrKO_j3X1ZyFWHabi8M4Fh74gDQerocni_ozvLa4_8,7692
17
17
  zrb/builtin/llm/previous-session.js,sha256=xMKZvJoAbrwiyHS0OoPrWuaKxWYLoyR5sguePIoCjTY,816
18
18
  zrb/builtin/llm/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- zrb/builtin/llm/tool/api.py,sha256=p55Fs6QTmsM2u-vVcBJb9xYxGAkiHIKX2wYKhsGlWFE,2417
19
+ zrb/builtin/llm/tool/api.py,sha256=HFs7kEUSg-tzsc-ab4h3-pT_6KjuyF1Wo-ukgo_FWr4,3081
20
20
  zrb/builtin/llm/tool/cli.py,sha256=sm_maE1WBB051odh1xXr8QQOWln_ewAU_7OScKAneT4,1244
21
21
  zrb/builtin/llm/tool/code.py,sha256=-MKUpXX4jkWm4rCqrUmTTzsYhjfzKle9_XsNPtq8PNM,8952
22
- zrb/builtin/llm/tool/file.py,sha256=9pwE4dme95EEuH_W-Cau3h-i2dAF8FZbXxRI27NhAzA,25902
23
- zrb/builtin/llm/tool/note.py,sha256=DZChwYiKqxBvPsEQOMnk4HFOXYCPjtxCmK1nRQsbLvI,2203
22
+ zrb/builtin/llm/tool/file.py,sha256=Ac-8t8OxWKS1c9BftMowYy6edV9nSzwft-cCXf_ii-o,23528
23
+ zrb/builtin/llm/tool/note.py,sha256=7H1PK2NJRAF5BqVNwh6d0I27zUIKvkiyPS1xzVxlcZY,2298
24
24
  zrb/builtin/llm/tool/rag.py,sha256=aN8D8ZqzGXWCP_1F1LbN0QgfyzaK9CKrjfTPorDIYjw,9824
25
25
  zrb/builtin/llm/tool/sub_agent.py,sha256=nYluPfc8FlSobpP_4vnBIqkPARrDHq_SwKkmlh_ATUI,5067
26
- zrb/builtin/llm/tool/web.py,sha256=zDgxYRIQRj9A8QXb80-ZSPmGCvIOWy8bpJMGSAuTL8Y,7491
26
+ zrb/builtin/llm/tool/web.py,sha256=iwW1PPBiiyQEaOnTLYx9L2PWknIC1rHsAinAMxrjyEg,5780
27
27
  zrb/builtin/md5.py,sha256=690RV2LbW7wQeTFxY-lmmqTSVEEZv3XZbjEUW1Q3XpE,1480
28
28
  zrb/builtin/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  zrb/builtin/project/add/fastapp/fastapp_input.py,sha256=MKlWR_LxWhM_DcULCtLfL_IjTxpDnDBkn9KIqNmajFs,310
@@ -195,6 +195,8 @@ zrb/builtin/project/create/project-template/zrb_init.py,sha256=kY0x5MrkIVl3l1GtN
195
195
  zrb/builtin/project/create/project_task.py,sha256=az-yd2FRDmGZ_7qxslmW11ryTeI3yttRmXtlFnZhF00,1132
196
196
  zrb/builtin/python.py,sha256=e-yyVWovwlxCBLyXGsd9Ek3IAL_X-Q_hpNNOPoRjOgk,349
197
197
  zrb/builtin/random.py,sha256=p9kCvosSiSJyuGQrlrXuIQT8TRDGxXhfiUbsm3GFPd0,1793
198
+ zrb/builtin/searxng/config/settings.yml,sha256=dUuIebTYSFYYnM0HG3ItT9-DZWf0RJPSdWzJrXQvc44,140353
199
+ zrb/builtin/searxng/start.py,sha256=ASvALrUR8MoQ202qgZ3jLR8W_2drtAZpxTCOqa5IMi8,679
198
200
  zrb/builtin/setup/asdf/asdf.py,sha256=_k60yiRiKbRPh_eJVI4Nx_ZmmClOlOb9G0b0KhSGo1M,2444
199
201
  zrb/builtin/setup/asdf/asdf_helper.py,sha256=6jARtyIAE1H82HKVQ84D25RrMAsAip_gD28X9ZlaTCk,1205
200
202
  zrb/builtin/setup/common_input.py,sha256=zIVVsZsNlSoV2Fw8kyt7g5B8XAU8cWBsT865NPoddwo,848
@@ -219,7 +221,7 @@ zrb/callback/callback.py,sha256=PFhCqzfxdk6IAthmXcZ13DokT62xtBzJr_ciLw6I8Zg,4030
219
221
  zrb/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
220
222
  zrb/cmd/cmd_result.py,sha256=L8bQJzWCpcYexIxHBNsXj2pT3BtLmWex0iJSMkvimOA,597
221
223
  zrb/cmd/cmd_val.py,sha256=7Doowyg6BK3ISSGBLt-PmlhzaEkBjWWm51cED6fAUOQ,1014
222
- zrb/config/config.py,sha256=afsH-a7yTPT5hhvnmxGarAiU5yRUcUbua3Y_hRgltEg,14326
224
+ zrb/config/config.py,sha256=31h9VEJ1H-td6EGADWPZ42ETDUuXJdst3W6K7qejr0o,14941
223
225
  zrb/config/default_prompt/file_extractor_system_prompt.md,sha256=dNBWy4O4mfCqGkqaRQHDo18hDCengU0IZ0vQMSDwbyY,3821
224
226
  zrb/config/default_prompt/interactive_system_prompt.md,sha256=5wE_E1WiMwbXY_jaRoQzDM9esnOxmlsD3BShGx8HyEc,2702
225
227
  zrb/config/default_prompt/persona.md,sha256=GfUJ4-Mlf_Bm1YTzxFNkPkdVbAi06ZDVYh-iIma3NOs,253
@@ -227,7 +229,7 @@ zrb/config/default_prompt/repo_extractor_system_prompt.md,sha256=jkmpjKfWKKo3a5x
227
229
  zrb/config/default_prompt/repo_summarizer_system_prompt.md,sha256=nEDVbhVwTUKJ9W3AoV_h-7hcsT9VjfjE62F3FeWA1a4,1993
228
230
  zrb/config/default_prompt/summarization_prompt.md,sha256=1dY5dbAUgTdJHystOVSFOT0kUDnrfbFfiwIFjXq0OYI,951
229
231
  zrb/config/default_prompt/system_prompt.md,sha256=SP49gcvIQB7mxWqfQAAQUwXwYemQkgWAXpRHiuXjCy0,2368
230
- zrb/config/llm_config.py,sha256=9I_msAibvTY-ADG6lXCBXQ0EshaA-GQzJym9EZKsetw,8901
232
+ zrb/config/llm_config.py,sha256=1rX07YpMGDwS2MoqjdFzbi5tOrmBi8qo7YXP2rx9J9Q,12718
231
233
  zrb/config/llm_context/config.py,sha256=NXS1KNok-82VArstHmTVgrelPHSlKOWYJ6lytEyCQao,6833
232
234
  zrb/config/llm_context/config_parser.py,sha256=XrvkpbmzrrAuDhLCugriBHf2t9fSFuYxwzKehvTl9x4,1467
233
235
  zrb/config/llm_rate_limitter.py,sha256=_iQRv3d6kUPeRvmUYZX_iwCE7iDSEK1oKa4bQ9GROho,5261
@@ -248,7 +250,7 @@ zrb/env/env.py,sha256=zT-xj0l5G_lp_ginV_InuBr5qTqZMcGaMKE_p5FoqlU,1061
248
250
  zrb/env/env_file.py,sha256=dccsR_cjXp1Q_qz692YPaZSny3Xa049V5NAZ-WLDDEQ,746
249
251
  zrb/env/env_map.py,sha256=CKMmXUbuvf6h2rgFWj-WvW_xLZNgG3TtWdfrqHDe4qk,1253
250
252
  zrb/group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
251
- zrb/group/any_group.py,sha256=2ViaIcGKkKavZSlTahjUtAKA06W7BV2GGfCr1tOWSyI,1260
253
+ zrb/group/any_group.py,sha256=jOdjojUriyHitDvp3jW7W2BDhqPhHTcXWZOAvUDGFqA,1267
252
254
  zrb/group/group.py,sha256=jt6GMxe3_9j49s3TfEDqA-EwzXKhVaW_npQ1gmyHre8,4298
253
255
  zrb/input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
254
256
  zrb/input/any_input.py,sha256=3EQgg2Qk_2t2Ege_4pHV2G95tV3XAIThLLuFZ6uV6oM,1051
@@ -348,8 +350,8 @@ zrb/task/base_trigger.py,sha256=HVasUkIZc8ZdAkJCbhXeO1QTY9vF7BvENoxKRV3R_eY,7171
348
350
  zrb/task/cmd_task.py,sha256=myM8WZm6NrUD-Wv0Vb5sTOrutrAVZLt5LVsSBKwX6SM,10860
349
351
  zrb/task/http_check.py,sha256=Gf5rOB2Se2EdizuN9rp65HpGmfZkGc-clIAlHmPVehs,2565
350
352
  zrb/task/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
- zrb/task/llm/agent.py,sha256=7N_lsU5DNcgqRAxWnA-wm7ojo3xW6B_jjD6WXQCv7T0,11706
352
- zrb/task/llm/config.py,sha256=2usr_FjylQrrRjjPDOIBhb7pIwVQkicA0hYGeMy9qYg,4076
353
+ zrb/task/llm/agent.py,sha256=MdPJJ02rmC6uWDOj13miDihVxf8Nik6mikbo37CaxpA,11116
354
+ zrb/task/llm/config.py,sha256=r5MbrJqlFZk-CyUut3D5LJauDDeJ3b2kb9x69d0wRUQ,4397
353
355
  zrb/task/llm/conversation_history.py,sha256=_ThBOCv4vs3V6B3P_s-Aad2sH0RqE46KzLqgwdwHMC0,6758
354
356
  zrb/task/llm/conversation_history_model.py,sha256=kk-7niTl29Rm2EUIhTHzPXgZ5tp4IThMnIB3dS-1OdU,3062
355
357
  zrb/task/llm/default_workflow/coding.md,sha256=u2JMCNHjmRYQUzzgTGb7Mp6K7g9Tv2tqGPnyf4SbCLs,4487
@@ -359,10 +361,10 @@ zrb/task/llm/error.py,sha256=QR-nIohS6pBpC_16cWR-fw7Mevo1sNYAiXMBsh_CJDE,4157
359
361
  zrb/task/llm/history_summarization.py,sha256=Ntk0mCr4OKeFqjgyfI2UGifNLmAZi4UbSivphXfBwMc,7493
360
362
  zrb/task/llm/history_summarization_tool.py,sha256=KjL2RPThg6zDAk9eATuXmQvyrzd1t0scCgo2Cn4-hpY,1022
361
363
  zrb/task/llm/print_node.py,sha256=Nnf4F6eDJR4PFcOqQ1jLWBTFnzNGl1Stux2DZ3SMhsY,8062
362
- zrb/task/llm/prompt.py,sha256=Mb3hz-KAp2bL9m6ZL0gcfLveRfBDRZvDVN_HHPGuEPM,12028
363
- zrb/task/llm/tool_wrapper.py,sha256=Bvfds8WE0ewuXwJepvHJ5w547ImU5KaLaJf46Sxlth4,10997
364
+ zrb/task/llm/prompt.py,sha256=Ro6XEv41Lw3krWZggJ24kO_UDjDaGSKASX82Ir5wdv8,13509
365
+ zrb/task/llm/tool_wrapper.py,sha256=UM4aN2xsuGNBK57W1R7dLjAZWOEtmgAhv1YLClW1x04,11035
364
366
  zrb/task/llm/typing.py,sha256=c8VAuPBw_4A3DxfYdydkgedaP-LU61W9_wj3m3CAX1E,58
365
- zrb/task/llm_task.py,sha256=iG2urOrhlvKerzagej7CheIEs2XNXzm-ByVqR9oFfeQ,14968
367
+ zrb/task/llm_task.py,sha256=onQlUnOIBxXa6gSurgXcpmQ4BsIxDH6G4PnuEImLZPU,15994
366
368
  zrb/task/make_task.py,sha256=PD3b_aYazthS8LHeJsLAhwKDEgdurQZpymJDKeN60u0,2265
367
369
  zrb/task/rsync_task.py,sha256=WfqNSaicJgYWpunNU34eYxXDqHDHOftuDHyWJKjqwg0,6365
368
370
  zrb/task/scaffolder.py,sha256=rME18w1HJUHXgi9eTYXx_T2G4JdqDYzBoNOkdOOo5-o,6806
@@ -412,7 +414,7 @@ zrb/util/todo_model.py,sha256=hhzAX-uFl5rsg7iVX1ULlJOfBtblwQ_ieNUxBWfc-Os,1670
412
414
  zrb/util/truncate.py,sha256=eSzmjBpc1Qod3lM3M73snNbDOcARHukW_tq36dWdPvc,921
413
415
  zrb/xcom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
414
416
  zrb/xcom/xcom.py,sha256=o79rxR9wphnShrcIushA0Qt71d_p3ZTxjNf7x9hJB78,1571
415
- zrb-1.16.5.dist-info/METADATA,sha256=oQ2k0Lvu-cnQyNcYjC35nQnDYNQFuhA2uI5dBYkbxlA,9935
416
- zrb-1.16.5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
417
- zrb-1.16.5.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
418
- zrb-1.16.5.dist-info/RECORD,,
417
+ zrb-1.17.1.dist-info/METADATA,sha256=tDEEqBHlN6u6EsGf-YvCnH6TtHfF6QCyqxIcpcNwD_Y,9893
418
+ zrb-1.17.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
419
+ zrb-1.17.1.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
420
+ zrb-1.17.1.dist-info/RECORD,,
File without changes