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.
- jupyter_agent/bot_agents/base.py +4 -0
- jupyter_agent/bot_agents/master_planner.py +1 -2
- jupyter_agent/bot_agents/prepare_next_cell.py +52 -0
- jupyter_agent/bot_agents/request_user_supply.py +1 -1
- jupyter_agent/bot_agents/task_code_executor.py +3 -2
- jupyter_agent/bot_agents/task_planner_v3.py +6 -2
- jupyter_agent/bot_agents/task_reasoner.py +1 -0
- jupyter_agent/bot_agents/task_structrue_reasoner.py +3 -0
- jupyter_agent/bot_agents/task_structrue_summarier.py +3 -0
- jupyter_agent/bot_agents/task_summarier.py +1 -0
- jupyter_agent/bot_agents/task_verifier.py +2 -1
- jupyter_agent/bot_agents/task_verify_summarier.py +1 -0
- jupyter_agent/bot_contexts.py +10 -7
- jupyter_agent/bot_evaluators/base.py +1 -1
- jupyter_agent/bot_flows/base.py +61 -47
- jupyter_agent/bot_flows/master_planner.py +11 -4
- jupyter_agent/bot_flows/task_executor_v3.py +34 -29
- jupyter_agent/bot_magics.py +31 -4
- {jupyter_agent-2025.6.105.dist-info → jupyter_agent-2025.7.100.dist-info}/METADATA +23 -1
- jupyter_agent-2025.7.100.dist-info/RECORD +41 -0
- jupyter_agent-2025.6.105.dist-info/RECORD +0 -40
- {jupyter_agent-2025.6.105.dist-info → jupyter_agent-2025.7.100.dist-info}/WHEEL +0 -0
- {jupyter_agent-2025.6.105.dist-info → jupyter_agent-2025.7.100.dist-info}/entry_points.txt +0 -0
- {jupyter_agent-2025.6.105.dist-info → jupyter_agent-2025.7.100.dist-info}/licenses/LICENSE +0 -0
- {jupyter_agent-2025.6.105.dist-info → jupyter_agent-2025.7.100.dist-info}/top_level.txt +0 -0
jupyter_agent/bot_agents/base.py
CHANGED
@@ -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
|
-
|
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,
|
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}")
|
@@ -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(
|
@@ -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:
|
jupyter_agent/bot_contexts.py
CHANGED
@@ -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
|
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:
|
jupyter_agent/bot_flows/base.py
CHANGED
@@ -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
|
43
|
+
class StageNode[ST, AS](BaseModel):
|
43
44
|
stage: ST | str
|
44
|
-
|
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
|
-
|
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.
|
65
|
-
self.
|
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
|
76
|
-
for st in self.
|
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.
|
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
|
108
|
-
for t in self.
|
109
|
+
def get_stage_agents(self, stage) -> List[BaseAgent]:
|
110
|
+
for t in self.STAGE_NODES:
|
109
111
|
if t.stage == stage:
|
110
|
-
|
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.
|
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
|
-
|
172
|
-
|
173
|
-
|
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
|
-
|
183
|
-
if (
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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,
|
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
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
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
|
-
|
47
|
-
|
48
|
+
STAGE_NODES = [
|
49
|
+
StageNode[TaskStage, TaskPlannerState](
|
48
50
|
stage=TaskStage.PLANNING,
|
49
|
-
|
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
|
-
|
58
|
-
stage=TaskStage.REQUEST_INFO_ABOVE,
|
59
|
+
StageNode[TaskStage, None](
|
60
|
+
stage=TaskStage.REQUEST_INFO_ABOVE,
|
61
|
+
agents=RequestAboveUserSupplyAgent,
|
62
|
+
next_stage=TaskStage.PLANNING_PAUSED,
|
59
63
|
),
|
60
|
-
|
64
|
+
StageNode[TaskStage, TaskPlannerState](
|
61
65
|
stage=TaskStage.PLANNING_PAUSED,
|
62
|
-
|
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
|
-
|
71
|
-
|
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
|
-
|
77
|
+
agents=CodeExecutor,
|
76
78
|
states={True: TaskStage.SUMMARY, False: TaskStage.DEBUGGING},
|
77
79
|
),
|
78
|
-
|
79
|
-
|
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
|
-
|
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
|
-
|
89
|
+
StageNode[TaskStage, TaskStructureSummaryState](
|
90
90
|
stage=TaskStage.SUMMARY,
|
91
|
-
|
91
|
+
agents=TaskStructureSummaryAgent,
|
92
92
|
states={
|
93
93
|
TaskStructureSummaryState.DONE: {
|
94
|
-
TaskAction.DEFAULT: StageNext(stage=TaskStage.
|
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
|
-
|
101
|
-
stage=TaskStage.
|
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
|
-
|
108
|
+
StageNode[TaskStage, bool](
|
104
109
|
stage=TaskStage.COMPLETED,
|
105
|
-
|
110
|
+
agents=CodeExecutor,
|
106
111
|
states={True: TaskStage.OUTPUT_RESULT, False: TaskStage.DEBUGGING},
|
107
112
|
),
|
108
|
-
|
109
|
-
stage=TaskStage.OUTPUT_RESULT,
|
113
|
+
StageNode[TaskStage, None](
|
114
|
+
stage=TaskStage.OUTPUT_RESULT, agents=OutputTaskResult, next_stage=TaskStage.COMPLETED
|
110
115
|
),
|
111
|
-
|
112
|
-
stage=TaskStage.GLOBAL_FINISHED,
|
116
|
+
StageNode[TaskStage, None](
|
117
|
+
stage=TaskStage.GLOBAL_FINISHED, agents=OutputTaskResult, next_stage=TaskStage.GLOBAL_FINISHED
|
113
118
|
),
|
114
119
|
]
|
jupyter_agent/bot_magics.py
CHANGED
@@ -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(
|
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(
|
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
|
-
"-
|
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
|
-
"-
|
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.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|