jupyter-agent 2025.6.105__py3-none-any.whl → 2025.7.100__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.
@@ -135,6 +135,7 @@ class AgentModelType(str, Enum):
135
135
  DEFAULT = "default"
136
136
  PLANNER = "planner"
137
137
  CODING = "coding"
138
+ EVALUATING = "evaluating"
138
139
  REASONING = "reasoning"
139
140
 
140
141
 
@@ -152,6 +153,9 @@ class BaseAgent:
152
153
  def cells(self):
153
154
  return self.notebook_context.cells
154
155
 
156
+ def __call__(self, **kwds: Any) -> Tuple[bool, Any]:
157
+ raise NotImplementedError
158
+
155
159
 
156
160
  class BaseChatAgent(BotChat, BaseAgent):
157
161
  """基础聊天代理类"""
@@ -8,7 +8,6 @@ https://opensource.org/licenses/MIT
8
8
  from IPython.display import Markdown
9
9
  from .base import BaseChatAgent, AgentModelType
10
10
  from ..bot_outputs import _C, ReplyType
11
- from ..bot_evaluators.dummy_task import DummyTaskEvaluator
12
11
 
13
12
  MASTER_PLANNER_PROMPT = """\
14
13
  **角色定义**:
@@ -41,7 +40,7 @@ class MasterPlannerAgent(BaseChatAgent):
41
40
  PROMPT = MASTER_PLANNER_PROMPT
42
41
  DISPLAY_REPLY = False
43
42
  MODEL_TYPE = AgentModelType.PLANNER
44
- EVALUATORS = {None: DummyTaskEvaluator}
45
43
 
46
44
  def on_reply(self, reply):
45
+ self.task.agent_data.result = ""
47
46
  _C(Markdown(reply), reply_type=ReplyType.TASK_RESULT)
@@ -0,0 +1,52 @@
1
+ """
2
+ Copyright (c) 2025 viewstar000
3
+
4
+ This software is released under the MIT License.
5
+ https://opensource.org/licenses/MIT
6
+ """
7
+
8
+ import json
9
+ import datetime
10
+
11
+ from IPython.display import Markdown
12
+ from .base import BaseAgent
13
+ from ..bot_outputs import _D, _I, _W, _E, _F, _M, _B, _C, _O, ReplyType, markdown_block
14
+ from ..bot_actions import get_action_dispatcher, ActionSetCellContent, SetCellContentParams
15
+ from ..utils import get_env_capbilities
16
+
17
+
18
+ class PrepareNextCell(BaseAgent):
19
+
20
+ def __call__(self):
21
+ """执行代码逻辑"""
22
+ if get_env_capbilities().set_cell_content:
23
+ _I("set next cell content to generate the next task")
24
+ get_action_dispatcher().send_action(
25
+ ActionSetCellContent(
26
+ source=self.__class__.__name__,
27
+ params=SetCellContentParams(
28
+ index=1,
29
+ type="code",
30
+ source=(
31
+ "%%bot\n\n"
32
+ "# Execute this cell to generate the next task\n"
33
+ "# {}\n"
34
+ "# Special Note: Ensure the notebook is SAVED before executing this cell!\n"
35
+ ).format(datetime.datetime.now().isoformat()),
36
+ ),
37
+ ),
38
+ need_reply=False,
39
+ )
40
+ else:
41
+ _M("Copy the following code to the next cell to generate the next task ...")
42
+ _M(
43
+ (
44
+ "```python\n"
45
+ "%%bot\n\n"
46
+ "# Execute this cell to generate the next task\n"
47
+ "# {}\n"
48
+ "# Special Note: Ensure the notebook is SAVED before executing this cell!\n"
49
+ "```"
50
+ ).format(datetime.datetime.now().isoformat())
51
+ )
52
+ return False, None
@@ -145,7 +145,7 @@ class RequestUserSupplyAgent(BaseChatAgent):
145
145
  return super().__call__(**kwargs)
146
146
  else:
147
147
  if get_env_capbilities().user_supply_info:
148
- _M(f"**需要用户补充确认信息**,请按要求补充确认信息。")
148
+ _I(f"Request User Supply Info: {request_supply_infos}")
149
149
  action = ActionRequestUserSupplyInfo(
150
150
  source=self.__class__.__name__,
151
151
  params=RequestUserSupplyInfoParams(title="用户需求补充确认", issues=request_supply_infos),
@@ -11,7 +11,7 @@ from IPython.core.getipython import get_ipython
11
11
  from IPython.display import Markdown, clear_output
12
12
  from .base import BaseAgent
13
13
  from ..utils import TeeOutputCapture
14
- from ..bot_outputs import _D, _I, _W, _E, _F, _M, _B, _C, ReplyType
14
+ from ..bot_outputs import _D, _I, _W, _E, _F, _M, _B, _C, flush_output
15
15
 
16
16
 
17
17
  class CodeExecutor(BaseAgent):
@@ -21,6 +21,8 @@ class CodeExecutor(BaseAgent):
21
21
  _D(f"执行代码: {repr(self.task.source)[:80]}")
22
22
  ipython = get_ipython()
23
23
  exec_failed = False
24
+ self.task.cell_output = ""
25
+ self.task.cell_error = ""
24
26
  with TeeOutputCapture() as captured:
25
27
  if ipython is None:
26
28
  exec_failed = True
@@ -39,7 +41,6 @@ class CodeExecutor(BaseAgent):
39
41
  clean_traceback = "\n".join(ansi_escape.sub("", line) for line in exc_info["traceback"])
40
42
  self.task.cell_error = clean_traceback
41
43
  _E(f"执行失败: {clean_traceback}")
42
- self.task.cell_output = ""
43
44
  if captured.stdout:
44
45
  self.task.cell_output += "Stdout:\n" + captured.stdout + "\n"
45
46
  if captured.stderr:
@@ -146,6 +146,12 @@ class TaskPlannerAgentV3(BaseChatAgent):
146
146
 
147
147
  def on_reply(self, reply: TaskPlannerOutput):
148
148
  """执行规划逻辑"""
149
+ self.task.agent_data.result = ""
150
+ self.task.agent_data.coding_prompt = ""
151
+ self.task.agent_data.summary_prompt = ""
152
+ self.task.agent_data.important_infos = None
153
+ self.task.agent_data.request_above_supply_infos = None
154
+ self.task.agent_data.request_below_supply_infos = None
149
155
  if reply.state == TaskPlannerState.GLOBAL_FINISHED:
150
156
  _C(Markdown("全局目标已达成,任务完成!"), reply_type=ReplyType.TASK_RESULT)
151
157
  return False, reply.state
@@ -168,7 +174,6 @@ class TaskPlannerAgentV3(BaseChatAgent):
168
174
  self.task.agent_data.subject = reply.subtask_subject
169
175
  self.task.agent_data.coding_prompt = reply.subtask_coding_prompt
170
176
  self.task.agent_data.summary_prompt = reply.subtask_summary_prompt
171
- self.task.agent_data.result = ""
172
177
  return False, reply.state
173
178
  elif reply.state == TaskPlannerState.REASONING_PLANNED:
174
179
  assert reply.subtask_id, "Subtask id is empty"
@@ -182,7 +187,6 @@ class TaskPlannerAgentV3(BaseChatAgent):
182
187
  self.task.agent_data.task_id = reply.subtask_id
183
188
  self.task.agent_data.subject = reply.subtask_subject
184
189
  self.task.agent_data.summary_prompt = reply.subtask_summary_prompt
185
- self.task.agent_data.result = ""
186
190
  return False, reply.state
187
191
  else:
188
192
  raise ValueError(f"Unknown task planner state: {reply.state}")
@@ -58,4 +58,5 @@ class TaskReasoningAgent(BaseChatAgent):
58
58
  def on_reply(self, reply: str):
59
59
  assert reply, "Reply is empty"
60
60
  _M("### 任务总结\n" + reply)
61
+ self.task.agent_data.issue = ""
61
62
  self.task.agent_data.result = reply
@@ -98,7 +98,10 @@ class TaskStructureReasoningAgent(BaseChatAgent):
98
98
  def on_reply(self, reply: TaskStructureReasonOutput):
99
99
  assert reply.summary, "Reply is empty"
100
100
  _M("### 任务总结\n\n" + reply.summary)
101
+ self.task.agent_data.issue = ""
101
102
  self.task.agent_data.result = reply.summary
103
+ self.task.agent_data.important_infos = None
104
+ self.task.agent_data.request_below_supply_infos = None
102
105
  if reply.important_infos:
103
106
  self.task.agent_data.important_infos = reply.important_infos
104
107
  _B(
@@ -109,7 +109,10 @@ class TaskStructureSummaryAgent(BaseChatAgent):
109
109
  def on_reply(self, reply: TaskStructureSummaryOutput):
110
110
  assert reply.summary, "Reply is empty"
111
111
  _M("### 任务总结\n\n" + reply.summary)
112
+ self.task.agent_data.issue = ""
112
113
  self.task.agent_data.result = reply.summary
114
+ self.task.agent_data.important_infos = None
115
+ self.task.agent_data.request_below_supply_infos = None
113
116
  if reply.important_infos:
114
117
  self.task.agent_data.important_infos = reply.important_infos
115
118
  _B(
@@ -73,4 +73,5 @@ class TaskSummaryAgent(BaseChatAgent):
73
73
  def on_reply(self, reply: str):
74
74
  assert reply, "Reply is empty"
75
75
  _M("### 任务总结\n" + reply)
76
+ self.task.agent_data.issue = ""
76
77
  self.task.agent_data.result = reply
@@ -87,6 +87,7 @@ class TaskVerifyAgent(BaseChatAgent):
87
87
 
88
88
  if reply.state == TaskVerifyState.PASSED:
89
89
  _M("### 任务验证通过!")
90
+ self.task.agent_data.issue = ""
90
91
  return False, reply.state
91
92
  else:
92
93
  _M("### 任务验证不通过!\n")
@@ -94,6 +95,6 @@ class TaskVerifyAgent(BaseChatAgent):
94
95
  if reply.issues:
95
96
  for issue in reply.issues:
96
97
  task_issue += "- {}\n".format(issue)
97
- self.task.agent_data.issue = task_issue
98
98
  _M(task_issue)
99
+ self.task.agent_data.issue = task_issue
99
100
  return True, reply.state
@@ -111,6 +111,7 @@ class TaskVerifySummaryAgent(BaseChatAgent):
111
111
  if reply.state == TaskSummaryState.SUCCESS:
112
112
  assert reply.summary, "Summary is empty"
113
113
  _M("### 任务总结\n\n" + reply.summary)
114
+ self.task.agent_data.issue = ""
114
115
  self.task.agent_data.result = reply.summary
115
116
  return False, reply.state
116
117
  else:
@@ -240,6 +240,14 @@ class AgentCellContext(CodeCellContext):
240
240
  def set_data(self, name, value):
241
241
  setattr(self.agent_data, name, value)
242
242
 
243
+ def is_json_field(self, name):
244
+
245
+ return (
246
+ AgentData.model_fields[name]
247
+ and AgentData.model_fields[name].description is not None
248
+ and "[JSON]" in AgentData.model_fields[name].description # type: ignore
249
+ )
250
+
243
251
  def parse_magic_argv(self):
244
252
  """解析任务单元格的magic命令参数"""
245
253
  parser = argparse.ArgumentParser()
@@ -289,7 +297,7 @@ class AgentCellContext(CodeCellContext):
289
297
  cell_options = yaml.safe_load(cell_options)
290
298
  for key, value in cell_options.items():
291
299
  if self.has_data(key):
292
- if isinstance(self.get_data(key), (dict, list)) and isinstance(value, str):
300
+ if self.is_json_field(key) and isinstance(value, str):
293
301
  value = json.loads(value)
294
302
  _D("CELL[{}] Load task option {}: {}".format(self.cell_idx, key, value))
295
303
  self.set_data(key, value)
@@ -380,12 +388,7 @@ class AgentCellContext(CodeCellContext):
380
388
  if key == "result" and self.type == CellType.PLANNING:
381
389
  continue
382
390
  if value:
383
- if (
384
- isinstance(value, (dict, list))
385
- and AgentData.model_fields[key]
386
- and AgentData.model_fields[key].description is not None
387
- and "[JSON]" in AgentData.model_fields[key].description # type: ignore
388
- ):
391
+ if isinstance(value, (dict, list)) and self.is_json_field(key):
389
392
  value = json.dumps(value, ensure_ascii=False, indent=4)
390
393
  cell_options[key] = value
391
394
  if cell_options:
@@ -17,7 +17,7 @@ class BaseEvaluator(BaseChatAgent):
17
17
  """
18
18
 
19
19
  OUTPUT_FORMAT = AgentOutputFormat.JSON
20
- MODEL_TYPE = AgentModelType.REASONING
20
+ MODEL_TYPE = AgentModelType.EVALUATING
21
21
  DISPLAY_REPLY = False
22
22
 
23
23
  def on_reply(self, reply):
@@ -13,6 +13,7 @@ from enum import Enum
13
13
  from typing import List, Dict, Optional, Type
14
14
  from IPython.display import Markdown
15
15
  from ..bot_agents.base import BaseAgent
16
+ from ..bot_evaluators.base import BaseEvaluator
16
17
  from ..bot_evaluators.dummy_global import DummyGlobalEvaluator
17
18
  from ..bot_evaluators.flow_task_executor import FlowTaskExecEvaluator
18
19
  from ..bot_outputs import _D, _I, _W, _E, _F, _M, _B
@@ -39,9 +40,10 @@ class StageNext[ST](BaseModel):
39
40
  message: str = ""
40
41
 
41
42
 
42
- class StageTransition[ST, AS](BaseModel):
43
+ class StageNode[ST, AS](BaseModel):
43
44
  stage: ST | str
44
- agent: Type[BaseAgent] | str
45
+ agents: Type[BaseAgent] | List[Type[BaseAgent]]
46
+ evaluators: Optional[Type[BaseEvaluator] | List[Type[BaseEvaluator]]] = None
45
47
  states: Dict[AS | str, StageNext[ST] | List[StageNext[ST]] | Dict[TaskAction, StageNext[ST]] | ST | str] = {}
46
48
  next_stage: Optional[StageNext[ST] | List[StageNext[ST]] | Dict[TaskAction, StageNext[ST]] | ST | str] = None
47
49
 
@@ -51,7 +53,7 @@ class BaseTaskFlow:
51
53
  基础任务流程
52
54
  """
53
55
 
54
- STAGE_TRANSITIONS: List[StageTransition] = []
56
+ STAGE_NODES: List[StageNode] = []
55
57
  START_STAGE = TASK_STAGE_START
56
58
  STOP_STAGES = [TASK_STAGE_COMPLETED, TASK_STAGE_GLOBAL_FINISHED]
57
59
  FLOW_EVALUATOR = FlowTaskExecEvaluator
@@ -61,8 +63,8 @@ class BaseTaskFlow:
61
63
  self.notebook_context = notebook_context
62
64
  self.agent_factory = agent_factory
63
65
  self.evaluator_factory = evaluator_factory
64
- self.stage_transitions = {}
65
- self.prepare_stage_transitions()
66
+ self.stage_nodes = {}
67
+ self.prepare_stage_nodes()
66
68
 
67
69
  @property
68
70
  def task(self):
@@ -72,10 +74,10 @@ class BaseTaskFlow:
72
74
  def cells(self):
73
75
  return self.notebook_context.cells
74
76
 
75
- def prepare_stage_transitions(self):
76
- for st in self.STAGE_TRANSITIONS:
77
+ def prepare_stage_nodes(self):
78
+ for st in self.STAGE_NODES:
77
79
  assert not (st.next_stage and st.states), "next_stage and states are mutually exclusive"
78
- self.stage_transitions[st.stage] = st
80
+ self.stage_nodes[st.stage] = st
79
81
  if st.next_stage:
80
82
  st.states[TaskAction.DEFAULT] = st.next_stage
81
83
  st.next_stage = None
@@ -104,15 +106,29 @@ class BaseTaskFlow:
104
106
  if TASK_AGENT_STATE_ERROR not in st.states:
105
107
  st.states[TASK_AGENT_STATE_ERROR] = {"*": StageNext(stage=st.stage)}
106
108
 
107
- def get_stage_agent(self, stage):
108
- for t in self.STAGE_TRANSITIONS:
109
+ def get_stage_agents(self, stage) -> List[BaseAgent]:
110
+ for t in self.STAGE_NODES:
109
111
  if t.stage == stage:
110
- return self.agent_factory(t.agent)
112
+ if isinstance(t.agents, list):
113
+ return [self.agent_factory(a) for a in t.agents]
114
+ else:
115
+ return [self.agent_factory(t.agents)]
111
116
  raise ValueError(f"No agent for stage `{stage}`")
112
117
 
118
+ def get_stage_evaluators(self, stage) -> List[BaseEvaluator]:
119
+ if self.evaluator_factory is None:
120
+ return []
121
+ for t in self.STAGE_NODES:
122
+ if t.stage == stage:
123
+ if isinstance(t.evaluators, list):
124
+ return [self.evaluator_factory(e) for e in t.evaluators]
125
+ else:
126
+ return [self.evaluator_factory(t.evaluators)]
127
+ return []
128
+
113
129
  def _get_next_stage_trans(self, stage, state, action=TaskAction.CONTINUE):
114
130
 
115
- st = self.stage_transitions.get(stage)
131
+ st = self.stage_nodes.get(stage)
116
132
  if st:
117
133
  state_ns = st.states.get(state) or st.states.get("*")
118
134
  assert state_ns, f"No next stage for stage `{stage}` and state `{state}`"
@@ -162,16 +178,19 @@ class BaseTaskFlow:
162
178
  stage_count = 0
163
179
  # Initialize the task stage
164
180
  stage = stage or self.START_STAGE
181
+ agent = None
165
182
  while n_tries <= max_tries:
166
183
  stage_st = time.time()
167
184
  try:
168
185
  stage_name = stage.value if isinstance(stage, Enum) else stage
169
186
  stage_name = stage_name.replace(".", "-").capitalize()
170
187
  set_stage(stage_name)
171
- agent = self.get_stage_agent(stage)
172
- _M(f"**Executing** stage `{stage}` with agent `{type(agent).__name__}` ...")
173
- failed, state = agent()
188
+ agents = self.get_stage_agents(stage)
189
+ for agent in agents:
190
+ _I(f"Executing stage `{stage}` with agent `{type(agent).__name__}` ...")
191
+ failed, state = agent()
174
192
  except Exception as e:
193
+ _W(f"Error during task execution stage `{stage}`: `{type(e)}`: `{e}`")
175
194
  _M(f"**Error** during task execution stage `{stage}`: `{type(e)}`: `{e}`")
176
195
  _M(f"```python\n{traceback.format_exc()}\n```")
177
196
  state = TASK_AGENT_STATE_ERROR
@@ -179,30 +198,26 @@ class BaseTaskFlow:
179
198
  stage_count += 1
180
199
  stage_duration = time.time() - stage_st
181
200
  flow_duration += stage_duration
182
- _M(f"Stage `{stage}` completed in {stage_duration:.2f} seconds with state `{state}` and failed `{failed}`")
183
- if (
184
- self.evaluator_factory is not None
185
- and not failed
186
- and hasattr(agent, "EVALUATORS")
187
- and state in agent.EVALUATORS
188
- ):
189
- # If the agent has evaluators, run them
190
- evaluator = self.evaluator_factory(agent.EVALUATORS[state])
191
- try:
192
- _M(f"**Evaluating** stage `{stage}` with evaluator `{type(evaluator).__name__}` ...")
193
- evaluation_result = evaluator()
194
- evaluation_result.timestamp = evaluation_result.timestamp or time.time()
195
- evaluation_result.evaluator = evaluation_result.evaluator or type(evaluator).__name__
196
- evaluation_result.cell_index = self.task.cell_idx
197
- evaluation_result.flow = type(self).__name__
198
- evaluation_result.stage = str(stage)
199
- evaluation_result.agent = type(agent).__name__
200
- evaluation_result.execution_duration = stage_duration
201
- evaluation_result.is_success = not failed
202
- output_evaluation(evaluation_result)
203
- except Exception as e:
204
- _M(f"**Error** during task evaluation stage `{stage}`: `{type(e)}`: `{e}`")
205
- _M(f"```python\n{traceback.format_exc()}\n```")
201
+ _I(f"Stage `{stage}` completed in {stage_duration:.2f} seconds with state `{state}` and failed `{failed}`")
202
+ if evaluators := self.get_stage_evaluators(stage):
203
+ for evaluator in evaluators:
204
+ # If the agent has evaluators, run them
205
+ try:
206
+ _I(f"Evaluating stage `{stage}` with evaluator `{type(evaluator).__name__}` ...")
207
+ evaluation_result = evaluator()
208
+ evaluation_result.timestamp = evaluation_result.timestamp or time.time()
209
+ evaluation_result.evaluator = evaluation_result.evaluator or type(evaluator).__name__
210
+ evaluation_result.cell_index = self.task.cell_idx
211
+ evaluation_result.flow = type(self).__name__
212
+ evaluation_result.stage = str(stage)
213
+ evaluation_result.agent = type(agent).__name__
214
+ evaluation_result.execution_duration = stage_duration
215
+ evaluation_result.is_success = not failed
216
+ output_evaluation(evaluation_result)
217
+ except Exception as e:
218
+ _W(f"Error during task evaluation stage `{stage}`: `{type(e)}`: `{e}`")
219
+ _M(f"**Error** during task evaluation stage `{stage}`: `{type(e)}`: `{e}`")
220
+ _M(f"```python\n{traceback.format_exc()}\n```")
206
221
  else:
207
222
  output_evaluation(
208
223
  StageEvaluationRecord(
@@ -223,7 +238,7 @@ class BaseTaskFlow:
223
238
  self.task.agent_stage = next_stage
224
239
  self.task.update_cell()
225
240
  if next_stage in self.STOP_STAGES:
226
- _M(f"Task execution **Stopped** at stage `{next_stage}`")
241
+ _I(f"Task execution **Stopped** at stage `{next_stage}`")
227
242
  stage = next_stage
228
243
  break
229
244
 
@@ -244,20 +259,19 @@ class BaseTaskFlow:
244
259
  self.task.agent_stage = next_stage
245
260
  self.task.update_cell()
246
261
  if action == TaskAction.STOP:
247
- _M(f"Task execution **Stopped**, and set next stage to `{next_stage}`")
262
+ _I(f"Task execution **Stopped**, and set next stage to `{next_stage}`")
248
263
  stage = next_stage
249
264
  break
250
265
  else:
251
- _M(f"**Action**: `{action}` transits stage to `{next_stage}`")
266
+ _I(f"Action: `{action}` transits stage to `{next_stage}`")
252
267
  stage = next_stage
253
268
  else:
254
269
  # transit to the next stage without confirmation
255
270
  next_stage = self.get_next_stage(stage, state, TaskAction.CONTINUE)
256
271
  self.task.agent_stage = next_stage
257
272
  self.task.update_cell()
258
- _M(f"**Transits** stage to `{next_stage}`")
273
+ _I(f"Transits stage to `{next_stage}`")
259
274
  stage = next_stage
260
-
261
275
  if not stage_continue:
262
276
  break
263
277
  # Finalize the task execution
@@ -266,7 +280,7 @@ class BaseTaskFlow:
266
280
  _M("Task execution **finished** globally.")
267
281
  if self.evaluator_factory is not None and hasattr(self, "GLOBAL_EVALUATOR") and self.GLOBAL_EVALUATOR:
268
282
  evaluator = self.evaluator_factory(self.GLOBAL_EVALUATOR)
269
- _M(f"**Evaluating** notebook with evaluator `{type(evaluator).__name__}` ...")
283
+ _I(f"Evaluating notebook with evaluator `{type(evaluator).__name__}` ...")
270
284
  evaluation_result = evaluator()
271
285
  evaluation_result.timestamp = evaluation_result.timestamp or time.time()
272
286
  evaluation_result.evaluator = evaluation_result.evaluator or type(evaluator).__name__
@@ -283,10 +297,10 @@ class BaseTaskFlow:
283
297
  )
284
298
  )
285
299
  elif stage_name == TASK_STAGE_COMPLETED:
286
- _M(f"Task execution **completed** in {flow_duration:.2f} seconds with {stage_count} stages.")
300
+ _I(f"Task execution **completed** in {flow_duration:.2f} seconds with {stage_count} stages.")
287
301
  if self.evaluator_factory is not None and hasattr(self, "FLOW_EVALUATOR") and self.FLOW_EVALUATOR:
288
302
  evaluator = self.evaluator_factory(self.FLOW_EVALUATOR)
289
- _M(f"**Evaluating** flow `{type(self).__name__}` with evaluator `{type(evaluator).__name__}` ...")
303
+ _I(f"Evaluating flow `{type(self).__name__}` with evaluator `{type(evaluator).__name__}` ...")
290
304
  evaluation_result = evaluator()
291
305
  evaluation_result.timestamp = evaluation_result.timestamp or time.time()
292
306
  evaluation_result.evaluator = evaluation_result.evaluator or type(evaluator).__name__
@@ -5,17 +5,24 @@ This software is released under the MIT License.
5
5
  https://opensource.org/licenses/MIT
6
6
  """
7
7
 
8
- from .base import BaseTaskFlow, StageTransition, TASK_STAGE_START, TASK_STAGE_COMPLETED
8
+ from .base import BaseTaskFlow, StageNode, TASK_STAGE_START, TASK_STAGE_COMPLETED
9
9
  from ..bot_evaluators.flow_global_planning import FlowGlobalPlanningEvaluator
10
10
  from ..bot_agents.master_planner import MasterPlannerAgent
11
11
  from ..bot_agents.output_task_result import OutputTaskResult
12
+ from ..bot_agents.prepare_next_cell import PrepareNextCell
13
+ from ..bot_evaluators.dummy_task import DummyTaskEvaluator
12
14
 
13
15
 
14
16
  class MasterPlannerFlow(BaseTaskFlow):
15
17
 
16
- STAGE_TRANSITIONS = [
17
- StageTransition(stage=TASK_STAGE_START, agent=MasterPlannerAgent, next_stage=TASK_STAGE_COMPLETED),
18
- StageTransition(stage=TASK_STAGE_COMPLETED, agent=OutputTaskResult, next_stage=TASK_STAGE_COMPLETED),
18
+ STAGE_NODES = [
19
+ StageNode(
20
+ stage=TASK_STAGE_START,
21
+ agents=MasterPlannerAgent,
22
+ evaluators=DummyTaskEvaluator,
23
+ next_stage=TASK_STAGE_COMPLETED,
24
+ ),
25
+ StageNode(stage=TASK_STAGE_COMPLETED, agents=OutputTaskResult, next_stage=TASK_STAGE_COMPLETED),
19
26
  ]
20
27
  STOP_STAGES = [TASK_STAGE_COMPLETED]
21
28
  FLOW_EVALUATOR = FlowGlobalPlanningEvaluator
@@ -8,7 +8,7 @@ https://opensource.org/licenses/MIT
8
8
  from enum import Enum
9
9
  from .base import (
10
10
  BaseTaskFlow,
11
- StageTransition,
11
+ StageNode,
12
12
  StageNext,
13
13
  TaskAction,
14
14
  TASK_STAGE_COMPLETED,
@@ -22,6 +22,7 @@ from ..bot_agents.task_structrue_summarier import TaskStructureSummaryAgent, Tas
22
22
  from ..bot_agents.task_structrue_reasoner import TaskStructureReasoningAgent, TaskStructureReasonState
23
23
  from ..bot_agents.output_task_result import OutputTaskResult
24
24
  from ..bot_agents.request_user_supply import RequestAboveUserSupplyAgent, RequestBelowUserSupplyAgent
25
+ from ..bot_agents.prepare_next_cell import PrepareNextCell
25
26
 
26
27
 
27
28
  class TaskStage(str, Enum):
@@ -34,6 +35,7 @@ class TaskStage(str, Enum):
34
35
  DEBUGGING = "debugging"
35
36
  REASONING = "reasoning"
36
37
  SUMMARY = "summary"
38
+ PREPARE_NEXT = "prepare_next"
37
39
  OUTPUT_RESULT = "output_result"
38
40
  COMPLETED = TASK_STAGE_COMPLETED
39
41
  GLOBAL_FINISHED = TASK_STAGE_GLOBAL_FINISHED
@@ -43,10 +45,10 @@ class TaskExecutorFlowV3(BaseTaskFlow):
43
45
 
44
46
  START_STAGE = TaskStage.PLANNING
45
47
  STOP_STAGES = [TaskStage.COMPLETED, TaskStage.PLANNING_PAUSED, TaskStage.GLOBAL_FINISHED]
46
- STAGE_TRANSITIONS = [
47
- StageTransition[TaskStage, TaskPlannerState](
48
+ STAGE_NODES = [
49
+ StageNode[TaskStage, TaskPlannerState](
48
50
  stage=TaskStage.PLANNING,
49
- agent=TaskPlannerAgentV3,
51
+ agents=TaskPlannerAgentV3,
50
52
  states={
51
53
  TaskPlannerState.CODING_PLANNED: TaskStage.CODING,
52
54
  TaskPlannerState.REASONING_PLANNED: TaskStage.REASONING,
@@ -54,12 +56,14 @@ class TaskExecutorFlowV3(BaseTaskFlow):
54
56
  TaskPlannerState.GLOBAL_FINISHED: TaskStage.GLOBAL_FINISHED,
55
57
  },
56
58
  ),
57
- StageTransition[TaskStage, None](
58
- stage=TaskStage.REQUEST_INFO_ABOVE, agent=RequestAboveUserSupplyAgent, next_stage=TaskStage.PLANNING_PAUSED
59
+ StageNode[TaskStage, None](
60
+ stage=TaskStage.REQUEST_INFO_ABOVE,
61
+ agents=RequestAboveUserSupplyAgent,
62
+ next_stage=TaskStage.PLANNING_PAUSED,
59
63
  ),
60
- StageTransition[TaskStage, TaskPlannerState](
64
+ StageNode[TaskStage, TaskPlannerState](
61
65
  stage=TaskStage.PLANNING_PAUSED,
62
- agent=TaskPlannerAgentV3,
66
+ agents=TaskPlannerAgentV3,
63
67
  states={
64
68
  TaskPlannerState.CODING_PLANNED: TaskStage.CODING,
65
69
  TaskPlannerState.REASONING_PLANNED: TaskStage.REASONING,
@@ -67,48 +71,49 @@ class TaskExecutorFlowV3(BaseTaskFlow):
67
71
  TaskPlannerState.GLOBAL_FINISHED: TaskStage.COMPLETED,
68
72
  },
69
73
  ),
70
- StageTransition[TaskStage, None](
71
- stage=TaskStage.CODING, agent=TaskCodingAgent, next_stage=TaskStage.EXECUTING
72
- ),
73
- StageTransition[TaskStage, bool](
74
+ StageNode[TaskStage, None](stage=TaskStage.CODING, agents=TaskCodingAgent, next_stage=TaskStage.EXECUTING),
75
+ StageNode[TaskStage, bool](
74
76
  stage=TaskStage.EXECUTING,
75
- agent=CodeExecutor,
77
+ agents=CodeExecutor,
76
78
  states={True: TaskStage.SUMMARY, False: TaskStage.DEBUGGING},
77
79
  ),
78
- StageTransition[TaskStage, None](
79
- stage=TaskStage.DEBUGGING, agent=CodeDebugerAgent, next_stage=TaskStage.EXECUTING
80
- ),
81
- StageTransition[TaskStage, TaskStructureReasonState](
80
+ StageNode[TaskStage, None](stage=TaskStage.DEBUGGING, agents=CodeDebugerAgent, next_stage=TaskStage.EXECUTING),
81
+ StageNode[TaskStage, TaskStructureReasonState](
82
82
  stage=TaskStage.REASONING,
83
- agent=TaskStructureReasoningAgent,
83
+ agents=TaskStructureReasoningAgent,
84
84
  states={
85
85
  TaskStructureReasonState.DONE: TaskStage.COMPLETED,
86
86
  TaskStructureReasonState.REQUEST_INFO: TaskStage.REQUEST_INFO_BELOW,
87
87
  },
88
88
  ),
89
- StageTransition[TaskStage, TaskStructureSummaryState](
89
+ StageNode[TaskStage, TaskStructureSummaryState](
90
90
  stage=TaskStage.SUMMARY,
91
- agent=TaskStructureSummaryAgent,
91
+ agents=TaskStructureSummaryAgent,
92
92
  states={
93
93
  TaskStructureSummaryState.DONE: {
94
- TaskAction.DEFAULT: StageNext(stage=TaskStage.COMPLETED),
94
+ TaskAction.DEFAULT: StageNext(stage=TaskStage.PREPARE_NEXT),
95
95
  TaskAction.STOP: StageNext(stage=TaskStage.EXECUTING),
96
96
  },
97
97
  TaskStructureSummaryState.REQUEST_INFO: TaskStage.REQUEST_INFO_BELOW,
98
98
  },
99
99
  ),
100
- StageTransition[TaskStage, None](
101
- stage=TaskStage.REQUEST_INFO_BELOW, agent=RequestBelowUserSupplyAgent, next_stage=TaskStage.COMPLETED
100
+ StageNode[TaskStage, None](
101
+ stage=TaskStage.PREPARE_NEXT, agents=PrepareNextCell, next_stage=TaskStage.COMPLETED
102
+ ),
103
+ StageNode[TaskStage, None](
104
+ stage=TaskStage.REQUEST_INFO_BELOW,
105
+ agents=[PrepareNextCell, RequestBelowUserSupplyAgent],
106
+ next_stage=TaskStage.COMPLETED,
102
107
  ),
103
- StageTransition[TaskStage, bool](
108
+ StageNode[TaskStage, bool](
104
109
  stage=TaskStage.COMPLETED,
105
- agent=CodeExecutor,
110
+ agents=CodeExecutor,
106
111
  states={True: TaskStage.OUTPUT_RESULT, False: TaskStage.DEBUGGING},
107
112
  ),
108
- StageTransition[TaskStage, None](
109
- stage=TaskStage.OUTPUT_RESULT, agent=OutputTaskResult, next_stage=TaskStage.COMPLETED
113
+ StageNode[TaskStage, None](
114
+ stage=TaskStage.OUTPUT_RESULT, agents=OutputTaskResult, next_stage=TaskStage.COMPLETED
110
115
  ),
111
- StageTransition[TaskStage, None](
112
- stage=TaskStage.GLOBAL_FINISHED, agent=OutputTaskResult, next_stage=TaskStage.GLOBAL_FINISHED
116
+ StageNode[TaskStage, None](
117
+ stage=TaskStage.GLOBAL_FINISHED, agents=OutputTaskResult, next_stage=TaskStage.GLOBAL_FINISHED
113
118
  ),
114
119
  ]
@@ -40,6 +40,9 @@ class BotMagics(Magics, Configurable):
40
40
  coding_api_url = Unicode(None, allow_none=True, help="Coding API URL").tag(config=True)
41
41
  coding_api_key = Unicode("API_KEY", help="Coding API Key").tag(config=True)
42
42
  coding_model_name = Unicode("", help="Coding Model Name").tag(config=True)
43
+ evaluating_api_url = Unicode(None, allow_none=True, help="Evaluating API URL").tag(config=True)
44
+ evaluating_api_key = Unicode("API_KEY", help="Evaluating API Key").tag(config=True)
45
+ evaluating_model_name = Unicode("", help="Evaluating Model Name").tag(config=True)
43
46
  reasoning_api_url = Unicode(None, allow_none=True, help="Reasoning API URL").tag(config=True)
44
47
  reasoning_api_key = Unicode("API_KEY", help="Reasoning API Key").tag(config=True)
45
48
  reasoning_model_name = Unicode("", help="Reasoning Model Name").tag(config=True)
@@ -54,9 +57,9 @@ class BotMagics(Magics, Configurable):
54
57
  enable_supply_mocking = Bool(False, help="Enable supply mocking").tag(config=True)
55
58
  notebook_path = Unicode(None, allow_none=True, help="Path to Notebook file").tag(config=True)
56
59
  default_task_flow = Unicode("v3", allow_none=True, help="Default task flow").tag(config=True)
57
- default_max_tries = Int(3, help="Default max tries for task execution").tag(config=True)
60
+ default_max_tries = Int(2, help="Default max tries for task execution").tag(config=True)
58
61
  default_step_mode = Bool(False, help="Default step mode for task execution").tag(config=True)
59
- default_auto_confirm = Bool(False, help="Default auto confirm for task execution").tag(config=True)
62
+ default_auto_confirm = Bool(True, help="Default auto confirm for task execution").tag(config=True)
60
63
 
61
64
  def parse_args(self, line):
62
65
  """解析命令行参数"""
@@ -67,19 +70,37 @@ class BotMagics(Magics, Configurable):
67
70
  parser.add_argument("-f", "--flow", type=str, default=self.default_task_flow, help="Flow name")
68
71
  parser.add_argument("-m", "--max-tries", type=int, default=self.default_max_tries, help="Max tries")
69
72
  parser.add_argument(
70
- "-S",
73
+ "-t",
71
74
  "--step-mode",
72
75
  action="store_true",
76
+ dest="step_mode",
73
77
  default=self.default_step_mode,
74
78
  help="Run in single step mode",
75
79
  )
76
80
  parser.add_argument(
77
- "-Y",
81
+ "-T",
82
+ "--not-step-mode",
83
+ action="store_false",
84
+ dest="step_mode",
85
+ default=self.default_step_mode,
86
+ help="Run in multi step mode",
87
+ )
88
+ parser.add_argument(
89
+ "-y",
78
90
  "--auto-confirm",
79
91
  action="store_true",
92
+ dest="auto_confirm",
80
93
  default=self.default_auto_confirm,
81
94
  help="Run without confirm",
82
95
  )
96
+ parser.add_argument(
97
+ "-Y",
98
+ "--not-auto-confirm",
99
+ action="store_false",
100
+ dest="auto_confirm",
101
+ default=self.default_auto_confirm,
102
+ help="Run with confirm",
103
+ )
83
104
  options, _ = parser.parse_known_args(shlex.split(line.strip()))
84
105
  return options
85
106
 
@@ -173,6 +194,9 @@ class BotMagics(Magics, Configurable):
173
194
  agent_factory.config_model(
174
195
  AgentModelType.CODING, self.coding_api_url, self.coding_api_key, self.coding_model_name
175
196
  )
197
+ agent_factory.config_model(
198
+ AgentModelType.EVALUATING, self.evaluating_api_url, self.evaluating_api_key, self.evaluating_model_name
199
+ )
176
200
  agent_factory.config_model(
177
201
  AgentModelType.REASONING, self.reasoning_api_url, self.reasoning_api_key, self.reasoning_model_name
178
202
  )
@@ -190,6 +214,9 @@ class BotMagics(Magics, Configurable):
190
214
  evaluator_factory.config_model(
191
215
  AgentModelType.CODING, self.coding_api_url, self.coding_api_key, self.coding_model_name
192
216
  )
217
+ evaluator_factory.config_model(
218
+ AgentModelType.EVALUATING, self.evaluating_api_url, self.evaluating_api_key, self.evaluating_model_name
219
+ )
193
220
  evaluator_factory.config_model(
194
221
  AgentModelType.REASONING, self.reasoning_api_url, self.reasoning_api_key, self.reasoning_model_name
195
222
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jupyter-agent
3
- Version: 2025.6.105
3
+ Version: 2025.7.100
4
4
  Summary: 调用LLM实现Jupyter代码的自动生成、执行、调试等功能
5
5
  Author: viewstar000
6
6
  License: MIT
@@ -96,6 +96,11 @@ pip install /path/to/jupyter-agent/dist/jupyter_agent-xxxx-py3-none-any.whl
96
96
  # 设置当前Notebook的路径,当无法自动获取时需要手工指定,以Vscode中的Notebook为例
97
97
  %config BotMagics.notebook_path = globals()["__vsc_ipynb_file__"]
98
98
 
99
+ # 是否默认开启单步模式,每执行一个步骤都退出执行循环,需要用户手动执行下一个步骤,默认为False
100
+ %config BotMagics.default_step_mode = False
101
+ # 是否默认开启自动确认,若关闭自动确认,每执行一个步骤都需要用户手动确认,默认为True
102
+ %config BotMagics.default_auto_confirm = True
103
+
99
104
  # 设置运行环境是否保存任务数据到Metadata,默认为False,仅在Vscode中安装jupyter-agent-extension后或在评估模式下支持
100
105
  %config BotMagics.support_save_meta = True
101
106
  # 设置运行环境是否设置单元格内容,默认为False,权在Vscode中安装jupyter-agent-extension后或在评估模式下支持
@@ -166,6 +171,12 @@ pip install /path/to/jupyter-agent/dist/jupyter_agent-xxxx-py3-none-any.whl
166
171
  bot_eval [-o output_eval.ipynb] [-e output_eval.jsonl] input.ipynb
167
172
  ```
168
173
 
174
+ 例如
175
+
176
+ ```bash
177
+ bot_eval examples/data_loader_eval.ipynb
178
+ ```
179
+
169
180
  ## 贡献
170
181
 
171
182
  欢迎提交 issue 或 pull request 参与贡献。
@@ -252,6 +263,11 @@ Advanced Configuration:
252
263
  # Set the current notebook path, when it is not automatically obtained, it needs to be manually specified, for example, in Vscode Notebook
253
264
  %config BotMagics.notebook_path = globals()["__vsc_ipynb_file__"]
254
265
 
266
+ # Whether to enable single step mode, each step will exit the execution loop, you need to manually execute the next step, the default is False
267
+ %config BotMagics.default_step_mode = False
268
+ # Whether to enable automatic confirmation, if automatic confirmation is closed, each step needs to be confirmed by the user, the default is True
269
+ %config BotMagics.default_auto_confirm = True
270
+
255
271
  # Set whether to save task data to Metadata, only Vscode installed with jupyter-agent-extension or evaluation mode supports this.
256
272
  %config BotMagics.support_save_meta = True
257
273
  # Set whether to set cell content, only Vscode installed with jupyter-agent-extension or evaluation mode supports this.
@@ -320,6 +336,12 @@ Use `bot_eval` command to evaluate the code generated by the agent in evaluation
320
336
  bot_eval [-o output_eval.ipynb] [-e output_eval.jsonl] input.ipynb
321
337
  ```
322
338
 
339
+ For example
340
+
341
+ ```bash
342
+ bot_eval examples/data_loader_eval.ipynb
343
+ ```
344
+
323
345
  ## Contributing
324
346
 
325
347
  Welcome to submit issues or pull requests to participate in contributions.
@@ -0,0 +1,41 @@
1
+ jupyter_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ jupyter_agent/bot_actions.py,sha256=Zq9_nfh4SJdMxkjqcTyQzS0RY4RwofaRkGq_4aexO2o,8453
3
+ jupyter_agent/bot_chat.py,sha256=4zjkHtyOabT1bvGO-n4ZTMw0XREU_XDlgfLCI5gpxsw,8834
4
+ jupyter_agent/bot_contexts.py,sha256=gs3hVIj81jasQYiJjdoAloWx8S1Xpa4cXr8XzcefUus,19475
5
+ jupyter_agent/bot_evaluation.py,sha256=t4SH6Gq4BmSyyRMozyQ2623XNGmgtCi9CTNRvOqzuRM,14266
6
+ jupyter_agent/bot_magics.py,sha256=Sh2CGs_esZqaHWDDLKjJSDlUYcI4PdF2aFPcibcf43Y,11027
7
+ jupyter_agent/bot_outputs.py,sha256=QDzReXLqZsU7RAPR4F9JEotxAtIe9YA3ZklCJ9U_jVg,16239
8
+ jupyter_agent/utils.py,sha256=8XKXXZB1EgCwIJEqYJigA8C84FzVTc2xdcF-y5kO3kY,3634
9
+ jupyter_agent/bot_agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ jupyter_agent/bot_agents/base.py,sha256=pAwW_KQZE9LwyxM91umzIlWalgFUKGJOpby8JGfvLQo,12430
11
+ jupyter_agent/bot_agents/master_planner.py,sha256=twDEc0KMCyNkcsD_0nilbPteZqFwUT38QDfeYUhOzzE,1330
12
+ jupyter_agent/bot_agents/output_task_result.py,sha256=4DeAmDzjUI_0yfb26f5sLIwa74aJRzEQXbMRSyYMv1g,761
13
+ jupyter_agent/bot_agents/prepare_next_cell.py,sha256=_4-kYQxAs9PK4a6T5vbsdSixNQ4l-R8qzQNjs8e_09c,1891
14
+ jupyter_agent/bot_agents/request_user_supply.py,sha256=Bkw08hhkUUVnirBijv1mJ0hQW2VpzdXoC3TToQolQos,6106
15
+ jupyter_agent/bot_agents/task_code_executor.py,sha256=V138uj39_lLGuljEDrxzd-jRf1k4nAQkA_gF2_Jhpgw,2243
16
+ jupyter_agent/bot_agents/task_coder.py,sha256=7fXq9nk1yH3F_mJfCMZBktHmxGfgmpuChMQbpEuL0w4,1783
17
+ jupyter_agent/bot_agents/task_debuger.py,sha256=77pa_Awgvzxm3XkFA1oZsGr8SPJkjApKMtkmoySShmI,1367
18
+ jupyter_agent/bot_agents/task_planner_v3.py,sha256=Mlves3v3KL7MAJ8hPPMxUsKdB2v6vuOXlVZ6XtNMbbo,8713
19
+ jupyter_agent/bot_agents/task_reasoner.py,sha256=4oP5DzAkfEGh6LtpX4OH6aMgAPDiRvbSVclxrhx0v20,1465
20
+ jupyter_agent/bot_agents/task_structrue_reasoner.py,sha256=lNt508g4ileRjG9_NETdSrQqVb7tjdu8qHajKcZzB6E,3947
21
+ jupyter_agent/bot_agents/task_structrue_summarier.py,sha256=fnNiXQMiEPHyowqOP6Ht_OnxV_1h_WTLKfcM2IYEt24,4053
22
+ jupyter_agent/bot_agents/task_summarier.py,sha256=Q9b11gdWvwnYLsIjwSpMkZQur1CqFdd_uKb322o8u-M,1787
23
+ jupyter_agent/bot_agents/task_verifier.py,sha256=kGtz8BkSB097RwdgY3FcXpSbVRcikFeTXiokheza0t8,2522
24
+ jupyter_agent/bot_agents/task_verify_summarier.py,sha256=XIxRuW8T1DchHLy3PlGWWUMVC8hcTEyjhQ5tnELWNZk,4943
25
+ jupyter_agent/bot_evaluators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ jupyter_agent/bot_evaluators/base.py,sha256=zGxW469lq2Ab1mOaTtVQcWQmJrKNAAaF8X7OPbnUY04,1375
27
+ jupyter_agent/bot_evaluators/dummy_flow.py,sha256=W0BWJKMgXIilZY0i8eP_SNVgqTUd1CT_uqMBs5aygVA,473
28
+ jupyter_agent/bot_evaluators/dummy_global.py,sha256=yZ8fo2xfVN8gZTpBfs8EJ4dcv2t4ls6aXxn3Mo7bNSk,483
29
+ jupyter_agent/bot_evaluators/dummy_task.py,sha256=owh6g6ItPXXYjesplzNMxVcKAU_kktWtuJhqRzZ05V4,475
30
+ jupyter_agent/bot_evaluators/flow_global_planning.py,sha256=kOLd0dCoqrMi6zbe5chXrwxmdahtt8QqX3UnAZgk3AQ,2419
31
+ jupyter_agent/bot_evaluators/flow_task_executor.py,sha256=gzHlKkP9K5fICYgUY5BKAzjwqn3xScxklohqoUCJaZk,4450
32
+ jupyter_agent/bot_flows/__init__.py,sha256=Xe7EbC6bt04Nc4Yr0e--FVvBJCxkZCZkwYL9oahMBtI,338
33
+ jupyter_agent/bot_flows/base.py,sha256=F-iXu59IfnOXWze3e2myvzdBlyk8xzlrqHA8GTfu4vo,14916
34
+ jupyter_agent/bot_flows/master_planner.py,sha256=F1AunpfNwFqEn4z8uzNEq7d_5_cNHRhMlO1P7uWcYf0,980
35
+ jupyter_agent/bot_flows/task_executor_v3.py,sha256=uCuwcG8ZfPIR7V5AX7UfFkYVbJ6MxPscixjtLwBYWtE,4878
36
+ jupyter_agent-2025.7.100.dist-info/licenses/LICENSE,sha256=nWMmSIg7OepTIDX_OPP0-T9ImeCBBoog7eJxm5awtcM,1068
37
+ jupyter_agent-2025.7.100.dist-info/METADATA,sha256=zaOVnSQK797gupNKlYbwOCV9Y_A3R4_6yk12WRDjqYI,12560
38
+ jupyter_agent-2025.7.100.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
39
+ jupyter_agent-2025.7.100.dist-info/entry_points.txt,sha256=063AB86wSrC_V-iiEEqxTlR4uz-T7VH_YagIpmKFQC0,63
40
+ jupyter_agent-2025.7.100.dist-info/top_level.txt,sha256=c3USTBZ7DZGuvLKlEW-QfGIx0tzn98iCEn3bpdYnDtE,14
41
+ jupyter_agent-2025.7.100.dist-info/RECORD,,
@@ -1,40 +0,0 @@
1
- jupyter_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- jupyter_agent/bot_actions.py,sha256=Zq9_nfh4SJdMxkjqcTyQzS0RY4RwofaRkGq_4aexO2o,8453
3
- jupyter_agent/bot_chat.py,sha256=4zjkHtyOabT1bvGO-n4ZTMw0XREU_XDlgfLCI5gpxsw,8834
4
- jupyter_agent/bot_contexts.py,sha256=f9PmrA8dTH8v4WLdNL_ZSMJUzMVLuRldLWYwL4vXQ6c,19489
5
- jupyter_agent/bot_evaluation.py,sha256=t4SH6Gq4BmSyyRMozyQ2623XNGmgtCi9CTNRvOqzuRM,14266
6
- jupyter_agent/bot_magics.py,sha256=fOStbhYwg60hUbuZwqYIbMrn_TBg0JfTwFT92pysUFw,9869
7
- jupyter_agent/bot_outputs.py,sha256=QDzReXLqZsU7RAPR4F9JEotxAtIe9YA3ZklCJ9U_jVg,16239
8
- jupyter_agent/utils.py,sha256=8XKXXZB1EgCwIJEqYJigA8C84FzVTc2xdcF-y5kO3kY,3634
9
- jupyter_agent/bot_agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- jupyter_agent/bot_agents/base.py,sha256=FwCl1Z9E-nIL99qheGEcKO0H_PEd0I9OzEXd23cmQrg,12308
11
- jupyter_agent/bot_agents/master_planner.py,sha256=aXXgtyarBmDFNAypdEbpQoxzgGkU-botX7bE9q9w3sM,1392
12
- jupyter_agent/bot_agents/output_task_result.py,sha256=4DeAmDzjUI_0yfb26f5sLIwa74aJRzEQXbMRSyYMv1g,761
13
- jupyter_agent/bot_agents/request_user_supply.py,sha256=wL_DyIWPd5-Jdq0boTCAhF-nxf_gPmzXgSPM6jOBFFU,6128
14
- jupyter_agent/bot_agents/task_code_executor.py,sha256=M3oeEBlmsNz89f-yk3_nzsWKGH2C0o7AH059D_J94D8,2206
15
- jupyter_agent/bot_agents/task_coder.py,sha256=7fXq9nk1yH3F_mJfCMZBktHmxGfgmpuChMQbpEuL0w4,1783
16
- jupyter_agent/bot_agents/task_debuger.py,sha256=77pa_Awgvzxm3XkFA1oZsGr8SPJkjApKMtkmoySShmI,1367
17
- jupyter_agent/bot_agents/task_planner_v3.py,sha256=qrvgfsgWs-tD8L1NWzyv9-fwamNTEm6etJYBy-Ipz28,8487
18
- jupyter_agent/bot_agents/task_reasoner.py,sha256=OHYzPEb1e4eOGdKfo9655tTEdZRqz-s-Vdgp-2G0Jxc,1425
19
- jupyter_agent/bot_agents/task_structrue_reasoner.py,sha256=NQ0V9uY4UelRH5Glw3PwS9HiN4I74A9FxNPcMC5P0lg,3792
20
- jupyter_agent/bot_agents/task_structrue_summarier.py,sha256=bMrNlb_Xrs4FNosuTBPmMmmHIoPyCIjSUVR_0j7aZZ8,3898
21
- jupyter_agent/bot_agents/task_summarier.py,sha256=85pW9mSqI-9nfuKr2n-h36OpD3QLA0WPJ1T7eWyww-A,1747
22
- jupyter_agent/bot_agents/task_verifier.py,sha256=z45jo38c9U4FnS87-AnI4PGki14uuCRhyWVPtAbkl70,2478
23
- jupyter_agent/bot_agents/task_verify_summarier.py,sha256=usW7RDE8-XAZXAgyHkWU1ZmY-kwi-_ePVXBngYFtb_M,4899
24
- jupyter_agent/bot_evaluators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- jupyter_agent/bot_evaluators/base.py,sha256=yMmeFCNrQRhO9Y4s1OeRAXgxD_m-20a14hM1XFvmN-I,1374
26
- jupyter_agent/bot_evaluators/dummy_flow.py,sha256=W0BWJKMgXIilZY0i8eP_SNVgqTUd1CT_uqMBs5aygVA,473
27
- jupyter_agent/bot_evaluators/dummy_global.py,sha256=yZ8fo2xfVN8gZTpBfs8EJ4dcv2t4ls6aXxn3Mo7bNSk,483
28
- jupyter_agent/bot_evaluators/dummy_task.py,sha256=owh6g6ItPXXYjesplzNMxVcKAU_kktWtuJhqRzZ05V4,475
29
- jupyter_agent/bot_evaluators/flow_global_planning.py,sha256=kOLd0dCoqrMi6zbe5chXrwxmdahtt8QqX3UnAZgk3AQ,2419
30
- jupyter_agent/bot_evaluators/flow_task_executor.py,sha256=gzHlKkP9K5fICYgUY5BKAzjwqn3xScxklohqoUCJaZk,4450
31
- jupyter_agent/bot_flows/__init__.py,sha256=Xe7EbC6bt04Nc4Yr0e--FVvBJCxkZCZkwYL9oahMBtI,338
32
- jupyter_agent/bot_flows/base.py,sha256=ADNs_-F4XLvEthRyjjBgGkv4KOOYIJRIdaRgjQXHq_k,14116
33
- jupyter_agent/bot_flows/master_planner.py,sha256=DAsMLXzrKCZaCNoEuPK3A5yWY_PxIcN3bwzYrlpx0pU,794
34
- jupyter_agent/bot_flows/task_executor_v3.py,sha256=_K6FOM2ZnMZAa8B_Rt1HXDVB20eCQl4Eew2KyfDPyEU,4685
35
- jupyter_agent-2025.6.105.dist-info/licenses/LICENSE,sha256=nWMmSIg7OepTIDX_OPP0-T9ImeCBBoog7eJxm5awtcM,1068
36
- jupyter_agent-2025.6.105.dist-info/METADATA,sha256=QqX2ahmch7Ofn_l8GHRjW5BpA1pvlm9kpOTbc5QpnIM,11699
37
- jupyter_agent-2025.6.105.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
38
- jupyter_agent-2025.6.105.dist-info/entry_points.txt,sha256=063AB86wSrC_V-iiEEqxTlR4uz-T7VH_YagIpmKFQC0,63
39
- jupyter_agent-2025.6.105.dist-info/top_level.txt,sha256=c3USTBZ7DZGuvLKlEW-QfGIx0tzn98iCEn3bpdYnDtE,14
40
- jupyter_agent-2025.6.105.dist-info/RECORD,,