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.
- zrb/builtin/__init__.py +1 -0
- zrb/builtin/group.py +5 -1
- zrb/builtin/llm/llm_ask.py +7 -10
- zrb/builtin/llm/tool/api.py +85 -71
- zrb/builtin/llm/tool/file.py +35 -100
- zrb/builtin/llm/tool/note.py +9 -12
- zrb/builtin/llm/tool/web.py +31 -87
- zrb/builtin/searxng/config/settings.yml +5671 -0
- zrb/builtin/searxng/start.py +21 -0
- zrb/config/config.py +28 -8
- zrb/config/llm_config.py +100 -4
- zrb/group/any_group.py +1 -1
- zrb/task/llm/agent.py +0 -15
- zrb/task/llm/config.py +12 -3
- zrb/task/llm/prompt.py +49 -1
- zrb/task/llm/tool_wrapper.py +6 -5
- zrb/task/llm_task.py +30 -10
- {zrb-1.16.5.dist-info → zrb-1.17.1.dist-info}/METADATA +1 -2
- {zrb-1.16.5.dist-info → zrb-1.17.1.dist-info}/RECORD +21 -19
- {zrb-1.16.5.dist-info → zrb-1.17.1.dist-info}/WHEEL +0 -0
- {zrb-1.16.5.dist-info → zrb-1.17.1.dist-info}/entry_points.txt +0 -0
@@ -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
|
-
|
17
|
-
|
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 =
|
34
|
-
self._default_model_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
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
|
-
|
102
|
-
|
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 =
|
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),
|
zrb/task/llm/tool_wrapper.py
CHANGED
@@ -120,13 +120,15 @@ def _create_wrapper(
|
|
120
120
|
ctx, func, args, kwargs
|
121
121
|
)
|
122
122
|
if not approval:
|
123
|
-
raise ToolExecutionCancelled(
|
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
|
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"- {
|
251
|
-
lines = [f"- {
|
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
|
-
|
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.
|
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=
|
307
|
-
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.
|
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=
|
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=
|
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=
|
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=
|
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=
|
23
|
-
zrb/builtin/llm/tool/note.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
352
|
-
zrb/task/llm/config.py,sha256=
|
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=
|
363
|
-
zrb/task/llm/tool_wrapper.py,sha256=
|
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=
|
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.
|
416
|
-
zrb-1.
|
417
|
-
zrb-1.
|
418
|
-
zrb-1.
|
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
|
File without changes
|