zrb 1.6.8__py3-none-any.whl → 1.7.0__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/__main__.py CHANGED
@@ -6,6 +6,7 @@ from zrb.config import CFG
6
6
  from zrb.runner.cli import cli
7
7
  from zrb.util.cli.style import stylize_error, stylize_faint, stylize_warning
8
8
  from zrb.util.group import NodeNotFoundError
9
+ from zrb.util.init_path import get_init_path_list
9
10
  from zrb.util.load import load_file, load_module
10
11
 
11
12
 
@@ -35,18 +36,27 @@ def serve_cli():
35
36
  # load init modules
36
37
  for init_module in CFG.INIT_MODULES:
37
38
  CFG.LOGGER.info(f"Loading {init_module}")
38
- load_module(init_module)
39
- zrb_init_path_list = _get_zrb_init_path_list()
39
+ try:
40
+ load_module(init_module)
41
+ except BaseException as e:
42
+ print(stylize_error(f"{e}"), file=sys.stderr)
43
+ zrb_init_path_list = get_init_path_list()
40
44
  # load init scripts
41
45
  for init_script in CFG.INIT_SCRIPTS:
42
46
  abs_init_script = os.path.abspath(os.path.expanduser(init_script))
43
47
  if abs_init_script not in zrb_init_path_list:
44
48
  CFG.LOGGER.info(f"Loading {abs_init_script}")
45
- load_file(abs_init_script, -1)
49
+ try:
50
+ load_file(abs_init_script, -1)
51
+ except BaseException as e:
52
+ print(stylize_error(f"{e}"), file=sys.stderr)
46
53
  # load zrb init
47
54
  for zrb_init_path in zrb_init_path_list:
48
55
  CFG.LOGGER.info(f"Loading {zrb_init_path}")
49
- load_file(zrb_init_path)
56
+ try:
57
+ load_file(zrb_init_path)
58
+ except BaseException as e:
59
+ print(stylize_error(f"{e}"), file=sys.stderr)
50
60
  # run the CLI
51
61
  cli.run(sys.argv[1:])
52
62
  except KeyboardInterrupt:
@@ -59,18 +69,3 @@ def serve_cli():
59
69
  except NodeNotFoundError as e:
60
70
  print(stylize_error(f"{e}"), file=sys.stderr)
61
71
  sys.exit(1)
62
-
63
-
64
- def _get_zrb_init_path_list() -> list[str]:
65
- current_path = os.path.abspath(os.getcwd())
66
- dir_path_list = [current_path]
67
- while current_path != os.path.dirname(current_path): # Stop at root
68
- current_path = os.path.dirname(current_path)
69
- dir_path_list.append(current_path)
70
- zrb_init_path_list = []
71
- for current_path in dir_path_list[::-1]:
72
- zrb_init_path = os.path.join(current_path, CFG.INIT_FILE_NAME)
73
- CFG.LOGGER.info(f"Finding {zrb_init_path}")
74
- if os.path.isfile(zrb_init_path):
75
- zrb_init_path_list.append(zrb_init_path)
76
- return zrb_init_path_list
@@ -98,7 +98,7 @@ async def _trigger_ask_and_wait_for_result(
98
98
  return None
99
99
  await _trigger_ask(ctx, user_prompt, previous_session_name, start_new)
100
100
  result = await _wait_ask_result(ctx)
101
- ctx.print(stylize_faint("🤖 >> ") + result, plain=True)
101
+ ctx.print(f"{stylize_faint('🤖 >>')} {result}", plain=True)
102
102
  return result
103
103
 
104
104
 
@@ -150,7 +150,7 @@ async def _trigger_ask(
150
150
  )
151
151
 
152
152
 
153
- async def _wait_ask_result(ctx: AnyContext) -> str:
153
+ async def _wait_ask_result(ctx: AnyContext) -> str | None:
154
154
  """
155
155
  Waits for and retrieves the LLM task result from the 'ask_result' XCom queue.
156
156
 
@@ -162,6 +162,9 @@ async def _wait_ask_result(ctx: AnyContext) -> str:
162
162
  """
163
163
  while "ask_result" not in ctx.xcom or len(ctx.xcom.ask_result) == 0:
164
164
  await asyncio.sleep(0.1)
165
+ if "ask_error" in ctx.xcom and len(ctx.xcom.ask_error) > 0:
166
+ ctx.xcom.ask_error.pop()
167
+ return None
165
168
  return ctx.xcom.ask_result.pop()
166
169
 
167
170
 
@@ -11,6 +11,7 @@ from zrb.builtin.llm.tool.file import (
11
11
  search_files,
12
12
  write_to_file,
13
13
  )
14
+ from zrb.builtin.llm.tool.sub_agent import create_sub_agent_tool
14
15
  from zrb.builtin.llm.tool.web import (
15
16
  create_search_internet_tool,
16
17
  open_web_page,
@@ -114,6 +115,7 @@ llm_group.add_task(
114
115
  task=llm_ask,
115
116
  input_mapping=get_llm_ask_input_mapping,
116
117
  result_queue="ask_result",
118
+ error_queue="ask_error",
117
119
  session_name_queue="ask_session_name",
118
120
  ),
119
121
  retries=0,
@@ -123,20 +125,41 @@ llm_group.add_task(
123
125
  )
124
126
 
125
127
  if CFG.LLM_ALLOW_ACCESS_LOCAL_FILE:
126
- llm_ask.add_tool(list_files)
127
- llm_ask.add_tool(read_from_file)
128
- llm_ask.add_tool(write_to_file)
129
- llm_ask.add_tool(search_files)
130
- llm_ask.add_tool(apply_diff)
128
+ llm_ask.append_tool(
129
+ list_files,
130
+ read_from_file,
131
+ write_to_file,
132
+ search_files,
133
+ apply_diff,
134
+ create_sub_agent_tool(
135
+ tool_name="analyze_file",
136
+ tool_description="\n".join(
137
+ [
138
+ "Analyze file using LLM capability.",
139
+ "This tool can do:",
140
+ "- summarization",
141
+ "- outline/structure extraction",
142
+ "- code review",
143
+ "- other tasks requiring deep understanding.",
144
+ "Always use this tool to get deep understanding of file content",
145
+ ]
146
+ ),
147
+ sub_agent_system_prompt="\n".join(
148
+ [
149
+ "You are a file analyzer assistant",
150
+ "Your goal is to help the main asisstant by reading file",
151
+ "and perform necessary indepth analysis required by the main assistant",
152
+ ]
153
+ ),
154
+ sub_agent_tools=[read_from_file, search_files],
155
+ ),
156
+ )
131
157
 
132
158
  if CFG.LLM_ALLOW_ACCESS_SHELL:
133
- llm_ask.add_tool(run_shell_command)
159
+ llm_ask.append_tool(run_shell_command)
134
160
 
135
161
  if CFG.LLM_ALLOW_ACCESS_INTERNET:
136
- llm_ask.add_tool(open_web_page)
137
- llm_ask.add_tool(search_wikipedia)
138
- llm_ask.add_tool(search_arxiv)
162
+ llm_ask.append_tool(open_web_page, search_wikipedia, search_arxiv)
139
163
  if CFG.SERP_API_KEY != "":
140
- llm_ask.add_tool(create_search_internet_tool(CFG.SERP_API_KEY))
141
- llm_ask.add_tool(get_current_location)
142
- llm_ask.add_tool(get_current_weather)
164
+ llm_ask.append_tool(create_search_internet_tool(CFG.SERP_API_KEY))
165
+ llm_ask.append_tool(get_current_location, get_current_weather)
zrb/callback/callback.py CHANGED
@@ -23,6 +23,7 @@ class Callback(AnyCallback):
23
23
  input_mapping: StrDictAttr,
24
24
  render_input_mapping: bool = True,
25
25
  result_queue: str | None = None,
26
+ error_queue: str | None = None,
26
27
  session_name_queue: str | None = None,
27
28
  ):
28
29
  """
@@ -35,6 +36,8 @@ class Callback(AnyCallback):
35
36
  f-string like syntax.
36
37
  result_queue: The name of the XCom queue in the parent session
37
38
  to publish the task result.
39
+ result_queue: The name of the Xcom queue in the parent session
40
+ to publish the task error.
38
41
  session_name_queue: The name of the XCom queue in the parent
39
42
  session to publish the session name.
40
43
  """
@@ -42,6 +45,7 @@ class Callback(AnyCallback):
42
45
  self._input_mapping = input_mapping
43
46
  self._render_input_mapping = render_input_mapping
44
47
  self._result_queue = result_queue
48
+ self._error_queue = error_queue
45
49
  self._session_name_queue = session_name_queue
46
50
 
47
51
  async def async_run(self, parent_session: AnySession, session: AnySession) -> Any:
@@ -58,9 +62,12 @@ class Callback(AnyCallback):
58
62
  session.shared_ctx.input[name] = value
59
63
  session.shared_ctx.input[to_snake_case(name)] = value
60
64
  # run task and get result
61
- result = await self._task.async_run(session)
62
- self._maybe_publish_result_to_parent_session(parent_session, result)
63
- return result
65
+ try:
66
+ result = await self._task.async_run(session)
67
+ self._maybe_publish_result_to_parent_session(parent_session, result)
68
+ return result
69
+ except BaseException as e:
70
+ self._maybe_publish_error_to_parent_session(parent_session, e)
64
71
 
65
72
  def _maybe_publish_session_name_to_parent_session(
66
73
  self, parent_session: AnySession, session: AnySession
@@ -71,6 +78,13 @@ class Callback(AnyCallback):
71
78
  value=session.name,
72
79
  )
73
80
 
81
+ def _maybe_publish_error_to_parent_session(
82
+ self, parent_session: AnySession, error: Any
83
+ ):
84
+ self._maybe_publish_to_parent_session(
85
+ parent_session=parent_session, xcom_name=self._error_queue, value=error
86
+ )
87
+
74
88
  def _maybe_publish_result_to_parent_session(
75
89
  self, parent_session: AnySession, result: Any
76
90
  ):
zrb/config.py CHANGED
@@ -199,6 +199,10 @@ class Config:
199
199
  def LLM_PERSONA(self) -> str | None:
200
200
  return os.getenv("ZRB_LLM_PERSONA", None)
201
201
 
202
+ @property
203
+ def LLM_CODE_REVIEW_INSTRUCTION_PROMPT(self) -> str | None:
204
+ return os.getenv("ZRB_LLM_CODE_REVIEW_INSTRUCTION_PROMPT", None)
205
+
202
206
  @property
203
207
  def LLM_SPECIAL_INSTRUCTION_PROMPT(self) -> str | None:
204
208
  return os.getenv("ZRB_LLM_SPECIAL_INSTRUCTION_PROMPT", None)
zrb/context/context.py CHANGED
@@ -89,7 +89,7 @@ class Context(AnyContext):
89
89
  return int(self.render(template))
90
90
 
91
91
  def render_float(self, template: str | float) -> float:
92
- if isinstance(template, float):
92
+ if isinstance(template, float) or isinstance(template, int):
93
93
  return template
94
94
  return float(self.render(template))
95
95
 
@@ -107,6 +107,7 @@ class Context(AnyContext):
107
107
  if plain:
108
108
  # self.append_to_shared_log(remove_style(message))
109
109
  print(message, sep=sep, end=end, file=file, flush=flush)
110
+ self.append_to_shared_log(remove_style(f"{message}{end}"))
110
111
  return
111
112
  color = self._color
112
113
  icon = self._icon
@@ -120,7 +121,7 @@ class Context(AnyContext):
120
121
  now = datetime.datetime.now()
121
122
  formatted_time = now.strftime("%y%m%d %H:%M:%S.%f")[:19] + " "
122
123
  prefix = f"{formatted_time}{attempt_status} {padded_styled_task_name} ⬤ "
123
- self.append_to_shared_log(remove_style(f"{prefix} {message}"))
124
+ self.append_to_shared_log(remove_style(f"{prefix} {message}{end}"))
124
125
  stylized_prefix = stylize(prefix, color=color)
125
126
  print(f"{stylized_prefix} {message}", sep=sep, end=end, file=file, flush=flush)
126
127
 
zrb/llm_config.py CHANGED
@@ -20,6 +20,8 @@ Do not ask for confirmation unless strictly necessary due to ambiguity or
20
20
  missing critical information.
21
21
  Apply relevant domain knowledge and best practices.
22
22
  Respond directly and concisely upon task completion or when clarification is essential.
23
+ Make sure to always include all necessary information in your final answer.
24
+ Remember that you have limited set of context.
23
25
  """.strip()
24
26
 
25
27
  DEFAULT_PERSONA = """
@@ -41,15 +43,35 @@ Output *only* the updated summary text.
41
43
  DEFAULT_CONTEXT_ENRICHMENT_PROMPT = """
42
44
  You are an information extraction assistant.
43
45
  Your goal is to help main assistant to continue the conversation by extracting
44
- important informations.
46
+ important long-term/short-term informations.
45
47
  Analyze the conversation history and current context to extract key facts like
46
- user_name, user_roles, preferences, goals, etc.
48
+ user_name, user_roles, user_address, etc.
47
49
  Return only a JSON object containing a single key "response", whose value is
48
50
  another JSON object with these details (i.e., {"response": {"context_name": "value"}}).
49
51
  If no context can be extracted, return {"response": {}}.
50
52
  """.strip()
51
53
 
52
54
  DEFAULT_SPECIAL_INSTRUCTION_PROMPT = "" # Default to empty
55
+ DEFAULT_CODE_REVIEW_INSTRUCTION_PROMPT = """
56
+ Your goal is to review code provided by the user for correctness, readability,
57
+ performance, security, and maintainability.
58
+ Follow these principles:
59
+ 1. **Correctness** Check whether the code performs the intended logic,
60
+ handles edge cases, and avoids obvious bugs.
61
+ 2. **Readability** Evaluate naming conventions, code structure, and clarity.
62
+ Suggest improvements where code could be more understandable.
63
+ 3. **Performance** Identify inefficient patterns or unnecessary operations.
64
+ Recommend optimizations only when they provide meaningful benefit.
65
+ 4. **Security** Spot unsafe code, potential vulnerabilities, or bad practices
66
+ that could lead to security issues.
67
+ 5. **Consistency** Ensure the code adheres to common language idioms,
68
+ style guides, and project conventions.
69
+ Provide clear, concise, and actionable feedback.
70
+ Use inline code examples when helpful.
71
+ Do not restate the code unnecessarily.
72
+ Focus on meaningful insights that help the user improve the code quality.
73
+ Avoid excessive nitpicking unless requested.
74
+ """.strip()
53
75
 
54
76
 
55
77
  class LLMConfig:
@@ -62,6 +84,7 @@ class LLMConfig:
62
84
  default_persona: str | None = None,
63
85
  default_system_prompt: str | None = None,
64
86
  default_special_instruction_prompt: str | None = None,
87
+ default_code_review_instruction_prompt: str | None = None,
65
88
  default_summarization_prompt: str | None = None,
66
89
  default_context_enrichment_prompt: str | None = None,
67
90
  default_summarize_history: bool | None = None,
@@ -78,6 +101,9 @@ class LLMConfig:
78
101
  self._default_persona = default_persona
79
102
  self._default_system_prompt = default_system_prompt
80
103
  self._default_special_instruction_prompt = default_special_instruction_prompt
104
+ self._default_code_review_instruction_prompt = (
105
+ default_code_review_instruction_prompt
106
+ )
81
107
  self._default_summarization_prompt = default_summarization_prompt
82
108
  self._default_context_enrichment_prompt = default_context_enrichment_prompt
83
109
  self._default_summarize_history = default_summarize_history
@@ -149,6 +175,14 @@ class LLMConfig:
149
175
  return CFG.LLM_PERSONA
150
176
  return DEFAULT_PERSONA
151
177
 
178
+ @property
179
+ def default_code_review_instruction_prompt(self) -> str:
180
+ if self._default_code_review_instruction_prompt is not None:
181
+ return self._default_code_review_instruction_prompt
182
+ if CFG.LLM_CODE_REVIEW_INSTRUCTION_PROMPT is not None:
183
+ return CFG.LLM_CODE_REVIEW_INSTRUCTION_PROMPT
184
+ return DEFAULT_CODE_REVIEW_INSTRUCTION_PROMPT
185
+
152
186
  @property
153
187
  def default_special_instruction_prompt(self) -> str:
154
188
  if self._default_special_instruction_prompt is not None:
zrb/runner/cli.py CHANGED
@@ -19,6 +19,7 @@ from zrb.util.cli.style import (
19
19
  stylize_section_header,
20
20
  )
21
21
  from zrb.util.group import extract_node_from_args, get_non_empty_subgroups, get_subtasks
22
+ from zrb.util.init_path import get_init_path_list
22
23
  from zrb.util.string.conversion import double_quote
23
24
 
24
25
 
@@ -189,6 +190,11 @@ async def start_server(_: AnyContext):
189
190
 
190
191
  app = create_web_app(cli, web_config, session_state_logger)
191
192
  server = Server(
192
- Config(app=app, host="0.0.0.0", port=CFG.WEB_HTTP_PORT, loop="asyncio")
193
+ Config(
194
+ app=app,
195
+ host="0.0.0.0",
196
+ port=CFG.WEB_HTTP_PORT,
197
+ loop="asyncio",
198
+ )
193
199
  )
194
200
  await server.serve()
zrb/runner/web_app.py CHANGED
@@ -47,7 +47,7 @@ def create_web_app(
47
47
  asyncio.gather(*_COROS)
48
48
 
49
49
  app = FastAPI(
50
- title="Zrb",
50
+ title=CFG.WEB_TITLE,
51
51
  version=CFG.VERSION,
52
52
  summary="Your Automation Powerhouse",
53
53
  lifespan=lifespan,
@@ -25,7 +25,7 @@ const CURRENT_SESSION = {
25
25
  resultTextarea.rows = resultLineCount <= 5 ? resultLineCount : 5;
26
26
  // update text areas
27
27
  resultTextarea.value = data.final_result;
28
- logTextarea.value = data.log.join("\n");
28
+ logTextarea.value = data.log.join("");
29
29
  // logTextarea.scrollTop = logTextarea.scrollHeight;
30
30
  // visualize history
31
31
  this.showCurrentSession(data.task_status, data.finished);
@@ -53,7 +53,10 @@ async def enrich_context(
53
53
  # The user prompt will now contain the dynamic data
54
54
  user_prompt_data = "\n".join(
55
55
  [
56
- "Extract context from the following conversation info",
56
+ "Extract context from the following conversation info.",
57
+ "Maintain the relevan context and remove the unrelevant ones.",
58
+ "Restructure the context in a helpful way",
59
+ "Keep the context small",
57
60
  f"Existing Context: {context_json}",
58
61
  f"Conversation History: {history_json}",
59
62
  ]
zrb/task/llm/prompt.py CHANGED
@@ -52,7 +52,19 @@ def get_special_instruction_prompt(
52
52
  )
53
53
  if special_instruction is not None:
54
54
  return special_instruction
55
- return llm_config.default_special_instruction_prompt or ""
55
+ aggregated_special_instruction = ""
56
+ if llm_config.default_code_review_instruction_prompt:
57
+ aggregated_special_instruction += "\n".join(
58
+ [
59
+ "# Code review instruction",
60
+ llm_config.default_code_review_instruction_prompt,
61
+ ]
62
+ )
63
+ if llm_config.default_special_instruction_prompt:
64
+ aggregated_special_instruction += "\n" + "\n".join(
65
+ ["# Code review instruction", llm_config.default_special_instruction_prompt]
66
+ )
67
+ return aggregated_special_instruction or ""
56
68
 
57
69
 
58
70
  def get_combined_system_prompt(
zrb/task/llm_task.py CHANGED
@@ -192,17 +192,19 @@ class LLMTask(BaseTask):
192
192
  self._max_call_iteration = max_call_iteration
193
193
  self._conversation_context = conversation_context
194
194
 
195
- def add_tool(self, tool: ToolOrCallable):
196
- self.append_tool(tool)
195
+ def add_tool(self, *tool: ToolOrCallable):
196
+ self.append_tool(*tool)
197
197
 
198
- def append_tool(self, tool: ToolOrCallable):
199
- self._additional_tools.append(tool)
198
+ def append_tool(self, *tool: ToolOrCallable):
199
+ for single_tool in tool:
200
+ self._additional_tools.append(single_tool)
200
201
 
201
- def add_mcp_server(self, mcp_server: MCPServer):
202
- self.append_mcp_server(mcp_server)
202
+ def add_mcp_server(self, *mcp_server: MCPServer):
203
+ self.append_mcp_server(*mcp_server)
203
204
 
204
- def append_mcp_server(self, mcp_server: MCPServer):
205
- self._additional_mcp_servers.append(mcp_server)
205
+ def append_mcp_server(self, *mcp_server: MCPServer):
206
+ for single_mcp_server in mcp_server:
207
+ self._additional_mcp_servers.append(single_mcp_server)
206
208
 
207
209
  def set_should_enrich_context(self, enrich_context: bool):
208
210
  self._should_enrich_context = enrich_context
@@ -332,7 +334,7 @@ class LLMTask(BaseTask):
332
334
  user_prompt=user_prompt,
333
335
  history_list=history_list,
334
336
  )
335
- if agent_run:
337
+ if agent_run and agent_run.result:
336
338
  new_history_list = json.loads(agent_run.result.all_messages_json())
337
339
  data_to_write = ConversationHistoryData(
338
340
  context=conversation_context, # Save the final context state
zrb/util/init_path.py ADDED
@@ -0,0 +1,18 @@
1
+ import os
2
+
3
+ from zrb.config import CFG
4
+
5
+
6
+ def get_init_path_list() -> list[str]:
7
+ current_path = os.path.abspath(os.getcwd())
8
+ dir_path_list = [current_path]
9
+ while current_path != os.path.dirname(current_path): # Stop at root
10
+ current_path = os.path.dirname(current_path)
11
+ dir_path_list.append(current_path)
12
+ zrb_init_path_list = []
13
+ for current_path in dir_path_list[::-1]:
14
+ zrb_init_path = os.path.join(current_path, CFG.INIT_FILE_NAME)
15
+ CFG.LOGGER.info(f"Finding {zrb_init_path}")
16
+ if os.path.isfile(zrb_init_path):
17
+ zrb_init_path_list.append(zrb_init_path)
18
+ return zrb_init_path_list
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 1.6.8
3
+ Version: 1.7.0
4
4
  Summary: Your Automation Powerhouse
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -26,7 +26,7 @@ Requires-Dist: openai (>=1.76.0,<2.0.0) ; extra == "rag" or extra == "all"
26
26
  Requires-Dist: pdfplumber (>=0.11.6,<0.12.0) ; extra == "rag" or extra == "all"
27
27
  Requires-Dist: playwright (>=1.51.0,<2.0.0) ; extra == "playwright" or extra == "all"
28
28
  Requires-Dist: psutil (>=7.0.0,<8.0.0)
29
- Requires-Dist: pydantic-ai (>=0.1.6,<0.2.0)
29
+ Requires-Dist: pydantic-ai (>=0.2.7,<0.3.0)
30
30
  Requires-Dist: pyjwt (>=2.10.1,<3.0.0)
31
31
  Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
32
32
  Requires-Dist: python-jose[cryptography] (>=3.4.0,<4.0.0)
@@ -1,5 +1,5 @@
1
1
  zrb/__init__.py,sha256=JgYNwsKYVzYzpoFXRn_LwuNFreMffPEvoSehTZisp4M,3103
2
- zrb/__main__.py,sha256=8LMzIvdKtOe7sIBfEhXYW8SM7dyTcd5JIySHFa6shbQ,2799
2
+ zrb/__main__.py,sha256=Kr_AkgmwBEycQcPVkZmrNh4hp2g62G-7ZXeOhJg0Qis,2603
3
3
  zrb/attr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  zrb/attr/type.py,sha256=4TV5gPYMMrKh5V-yB6iRYKCbsXAH_AvGXMsjxKLHcUs,568
5
5
  zrb/builtin/__init__.py,sha256=N-h-BoXWv0jYOldixXwgk6ekiWtrGZsGv57iqonsYdc,2657
@@ -9,10 +9,10 @@ zrb/builtin/git_subtree.py,sha256=7BKwOkVTWDrR0DXXQ4iJyHqeR6sV5VYRt8y_rEB0EHg,35
9
9
  zrb/builtin/group.py,sha256=t008xLM4_fgbjfZrPoi_fQAnSHIo6MOiQSCHBO4GDYU,2379
10
10
  zrb/builtin/http.py,sha256=sLqEczuSxGYXWzyJR6frGOHkPTviu4BeyroUr3-ZuAI,4322
11
11
  zrb/builtin/jwt.py,sha256=kjCf8qt7tkW9BpBDRAVTMJaEPQGzCbO1wo9xt5JoM8A,2836
12
- zrb/builtin/llm/chat_session.py,sha256=PSFfXPASMT-TLb-BQXI-nXbVDOnjmVJcUW6InxrpXKU,6491
12
+ zrb/builtin/llm/chat_session.py,sha256=HqFwrE1DiSlJrR-S3LRYWQBHkVsD-sfAV8_IIbnmtqY,6631
13
13
  zrb/builtin/llm/history.py,sha256=cnkOyO43uiMQ9cEvmqk-pPoCk1zCAH_fwAqSgBtsjzY,3079
14
14
  zrb/builtin/llm/input.py,sha256=Nw-26uTWp2QhUgKJcP_IMHmtk-b542CCSQ_vCOjhvhM,877
15
- zrb/builtin/llm/llm_ask.py,sha256=bC4OtlYChhOlUIwstzPM4_LOfL_8NNhNpN60xpjzeNg,4375
15
+ zrb/builtin/llm/llm_ask.py,sha256=7Dx5XWf0QAbPwscGohloKOp_iqoI-JuaVojTaCJL3Jc,5332
16
16
  zrb/builtin/llm/previous-session.js,sha256=xMKZvJoAbrwiyHS0OoPrWuaKxWYLoyR5sguePIoCjTY,816
17
17
  zrb/builtin/llm/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  zrb/builtin/llm/tool/api.py,sha256=yR9I0ZsI96OeQl9pgwORMASVuXsAL0a89D_iPS4C8Dc,1699
@@ -212,18 +212,18 @@ zrb/builtin/todo.py,sha256=pDbDKp94VHy-JsOr1sFtY8K4nIpNr1v6siqs5ptypsg,11568
212
212
  zrb/builtin/uuid.py,sha256=lIdhSGzPQ1rixRzMXxQDcgFgV7W-gUduHIudZXlzZzg,5393
213
213
  zrb/callback/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
214
214
  zrb/callback/any_callback.py,sha256=PqEJYX_RigXEmoPniSeZusZBZSLWEoVIHvHk8MZ0Mvg,253
215
- zrb/callback/callback.py,sha256=yPVsbMqRkFH5kKIcFVg-U0VEKTP2VXVArhgQYwD-Jv8,3293
215
+ zrb/callback/callback.py,sha256=mk_RIHuWi-oP5b81jfhzU6fruhsIjhRtKpwh2yYmsiM,3876
216
216
  zrb/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
217
217
  zrb/cmd/cmd_result.py,sha256=L8bQJzWCpcYexIxHBNsXj2pT3BtLmWex0iJSMkvimOA,597
218
218
  zrb/cmd/cmd_val.py,sha256=7Doowyg6BK3ISSGBLt-PmlhzaEkBjWWm51cED6fAUOQ,1014
219
- zrb/config.py,sha256=Ipb1RhOJqM0O_CGF0-UPMiF1XFnYLu7pdWVk8BASO50,8556
219
+ zrb/config.py,sha256=ZQKSNZmMfCyxTq7_4eCVzn_XsbMd7SlErjxAdB3wwoA,8708
220
220
  zrb/content_transformer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
221
  zrb/content_transformer/any_content_transformer.py,sha256=v8ZUbcix1GGeDQwB6OKX_1TjpY__ksxWVeqibwa_iZA,850
222
222
  zrb/content_transformer/content_transformer.py,sha256=STl77wW-I69QaGzCXjvkppngYFLufow8ybPLSyAvlHs,2404
223
223
  zrb/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
224
224
  zrb/context/any_context.py,sha256=2hgVKbbDwmwrEl1h1L1FaTUjuUYaDd_b7YRGkaorW6Q,6362
225
225
  zrb/context/any_shared_context.py,sha256=p1i9af_CUDz5Mf1h1kBZMAa2AEhf17I3O5IgAcjRLoY,1768
226
- zrb/context/context.py,sha256=VGoUwoWyL9d4QqJEhg41S-X8T2jlssGpiC9YSc3Gjqk,6601
226
+ zrb/context/context.py,sha256=3p43LTTqkcaX00wSBwLFVTyoEdlPnMYMASqnXUxdU_U,6706
227
227
  zrb/context/shared_context.py,sha256=w6cJH41nmhTzYlUrquRMbOexXrXgadfTd5awLnKAq4Q,2801
228
228
  zrb/dot_dict/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
229
229
  zrb/dot_dict/dot_dict.py,sha256=ubw_x8I7AOJ59xxtFVJ00VGmq_IYdZP3mUhNlO4nEK0,556
@@ -245,11 +245,11 @@ zrb/input/option_input.py,sha256=TQB82ko5odgzkULEizBZi0e9TIHEbIgvdP0AR3RhA74,213
245
245
  zrb/input/password_input.py,sha256=szBojWxSP9QJecgsgA87OIYwQrY2AQ3USIKdDZY6snU,1465
246
246
  zrb/input/str_input.py,sha256=NevZHX9rf1g8eMatPyy-kUX3DglrVAQpzvVpKAzf7bA,81
247
247
  zrb/input/text_input.py,sha256=6T3MngWdUs0u0ZVs5Dl11w5KS7nN1RkgrIR_zKumzPM,3695
248
- zrb/llm_config.py,sha256=Twe7-32OxvzCSPFOY-cV3SQGPSqCcjO1ZmiYvSjNpCk,10443
248
+ zrb/llm_config.py,sha256=h3LyjoOunc-2FxOOyCwM6Xcll3iXDykvvbV6xob-iB8,12244
249
249
  zrb/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
250
- zrb/runner/cli.py,sha256=2xy4cPGqDZOm4EBGcP4WtKBXWjk74O2whDS3XarX0XQ,6925
250
+ zrb/runner/cli.py,sha256=knWItZ0fm25gy4hjSgjliCtMSP2i3m2N8rNpS8B9csQ,7034
251
251
  zrb/runner/common_util.py,sha256=JDMcwvQ8cxnv9kQrAoKVLA40Q1omfv-u5_d5MvvwHeE,1373
252
- zrb/runner/web_app.py,sha256=huY9SCvMC9akhEQDW6mUC0osr0b0H3EosD7GFClVt-A,2612
252
+ zrb/runner/web_app.py,sha256=y7lA9urDg1ImZHFzhzogjVMVa9K8E-uSbMK_aNXYstM,2620
253
253
  zrb/runner/web_config/config.py,sha256=0wR58KreAmawGGfamm0GLZY344HaXs7qfDgHLavBDwo,3125
254
254
  zrb/runner/web_config/config_factory.py,sha256=GIvAwQKY_jkAb_IVt179KvphqHPY7gfBiQrZmELVQdQ,636
255
255
  zrb/runner/web_route/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -282,7 +282,7 @@ zrb/runner/web_route/static/resources/login/event.js,sha256=1-NxaUwU-X7Tu2RAwVkz
282
282
  zrb/runner/web_route/static/resources/logout/event.js,sha256=MfZxrTa2yL49Lbh7cCZDdqsIcf9e1q3W8-WjmZXV5pA,692
283
283
  zrb/runner/web_route/static/resources/pico.min.css,sha256=_Esfkjs_U_igYn-tXBUaK3AEKb7d4l9DlmaOiw9bXfI,82214
284
284
  zrb/runner/web_route/static/resources/session/common-util.js,sha256=t7_s5DXgMyZlT8L8LYZTkzOT6vWVeZvmCKjt-bflQY0,2117
285
- zrb/runner/web_route/static/resources/session/current-session.js,sha256=kAYHoSVjtQ4XA5yfXocKFVjOmYihQoIHTW0pHx22sPg,7010
285
+ zrb/runner/web_route/static/resources/session/current-session.js,sha256=tzUdK7qJKnMBGlIaMZJIPc2oeL5csk1JTBbjTsjhrFA,7008
286
286
  zrb/runner/web_route/static/resources/session/event.js,sha256=X5OlSHefK0SDB9VkFCRyBKE_Pb7mqM319mW9jRGoDOk,4716
287
287
  zrb/runner/web_route/static/resources/session/past-session.js,sha256=RwGJYKSp75K8NZ-iZP58XppWgdzkiKFaiC5wgcMLxDo,5470
288
288
  zrb/runner/web_route/static/static_route.py,sha256=BxFXIhKqkPtSBVkuf6Uho8yLph_EqDTLTVB0KG2-Pbo,1539
@@ -320,15 +320,15 @@ zrb/task/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
320
320
  zrb/task/llm/agent.py,sha256=6wGSsw03GdY_fj12CsJh7wxB6BnE13N8RYXaWfbiUsk,5451
321
321
  zrb/task/llm/config.py,sha256=oGxHYMdIvhASnKwNuMPwcdeJiFfS0tNskzGHakpfpQU,3458
322
322
  zrb/task/llm/context.py,sha256=U9a8lxa2ikz6my0Sd5vpO763legHrMHyvBjbrqNmv0Y,3838
323
- zrb/task/llm/context_enrichment.py,sha256=BKiWTorUrwDCMxghFXua3d-CHA3faUaCc3am7I3YGCg,6446
323
+ zrb/task/llm/context_enrichment.py,sha256=i2oWcs0mJGkfT8Jho3tQwNADagG9qU5oEZHbGxTTsSs,6629
324
324
  zrb/task/llm/error.py,sha256=27DQXSG8SH1-XuvXFdZQKzP39wZDWmd_YnSTz6DJKKI,3690
325
325
  zrb/task/llm/history.py,sha256=3WMXoi7RquxosXQf3iv2_BCeF8iKtY1f407pR71xERs,7745
326
326
  zrb/task/llm/history_summarization.py,sha256=n3GbgwXlDIkgpJppMGfpqF_8Wpi9yAoZYh46O1pFQeU,6432
327
327
  zrb/task/llm/print_node.py,sha256=bpISOUxSH_JBLR-4Nq6-iLrzNWFagrKFX6u8ogYYMw8,4395
328
- zrb/task/llm/prompt.py,sha256=2JG9eey3wbysz4IjcmiNNYRIeffSJkbj_vr0Laxa6wE,3833
328
+ zrb/task/llm/prompt.py,sha256=AUuyxjFgdK72yFNmNqsUDe55wjjxjK37vL7q7XPcgt8,4332
329
329
  zrb/task/llm/tool_wrapper.py,sha256=Xygd4VCY3ykjVv63pqlTI16ZG41ySkp683_5VTnL-Zo,6481
330
330
  zrb/task/llm/typing.py,sha256=c8VAuPBw_4A3DxfYdydkgedaP-LU61W9_wj3m3CAX1E,58
331
- zrb/task/llm_task.py,sha256=Bj_EJRv2qrCw6bgt7aHbaZwS5u0kc1R6NlqLkRw-0SE,15516
331
+ zrb/task/llm_task.py,sha256=Yav1pmV26Eh4h9xTh16dN-DbTvhfYINI0EDp_ptJHLg,15643
332
332
  zrb/task/make_task.py,sha256=PD3b_aYazthS8LHeJsLAhwKDEgdurQZpymJDKeN60u0,2265
333
333
  zrb/task/rsync_task.py,sha256=GSL9144bmp6F0EckT6m-2a1xG25AzrrWYzH4k3SVUKM,6370
334
334
  zrb/task/scaffolder.py,sha256=rME18w1HJUHXgi9eTYXx_T2G4JdqDYzBoNOkdOOo5-o,6806
@@ -360,6 +360,7 @@ zrb/util/file.py,sha256=Y5pRJxkpshyELxsv8qw_gp1qM5OXgeDwYXqt7Y6Lqu8,2242
360
360
  zrb/util/git.py,sha256=gS_Y9sQgJbY0PfgSQiowLvV3Nf0y9C8nT3j6z6oEsG8,8186
361
361
  zrb/util/git_subtree.py,sha256=E_UB5OIgm8WkHL9beifRxpZ25_BB9p1H578OhLZTgRU,4611
362
362
  zrb/util/group.py,sha256=T82yr3qg9I5k10VPXkMyrIRIqyfzadSH813bqzwKEPI,4718
363
+ zrb/util/init_path.py,sha256=n4BgLGeq3mPLS1la8VEqZpqJHx0vJRe2WRwTtbw-FjE,652
363
364
  zrb/util/load.py,sha256=DK0KYSlu48HCoGPqnW1IxnE3pHrZSPCstfz8Fjyqqv8,2140
364
365
  zrb/util/run.py,sha256=FPRCCvl5g6GuDvHTkaV95CFDlqxQ-5FZb2-F-Jz1fnI,485
365
366
  zrb/util/string/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -369,7 +370,7 @@ zrb/util/string/name.py,sha256=SXEfxJ1-tDOzHqmSV8kvepRVyMqs2XdV_vyoh_9XUu0,1584
369
370
  zrb/util/todo.py,sha256=VGISej2KQZERpornK-8X7bysp4JydMrMUTnG8B0-liI,20708
370
371
  zrb/xcom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
371
372
  zrb/xcom/xcom.py,sha256=o79rxR9wphnShrcIushA0Qt71d_p3ZTxjNf7x9hJB78,1571
372
- zrb-1.6.8.dist-info/METADATA,sha256=-DMAZAILCbphje8LYMrIIbFRFbMDF7MNsK8MMOBehM0,8385
373
- zrb-1.6.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
374
- zrb-1.6.8.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
375
- zrb-1.6.8.dist-info/RECORD,,
373
+ zrb-1.7.0.dist-info/METADATA,sha256=CFGNJW5jVSUWPFlS6-xNemTuGvjfBrOrmymGwRc3V40,8385
374
+ zrb-1.7.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
375
+ zrb-1.7.0.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
376
+ zrb-1.7.0.dist-info/RECORD,,
File without changes