waldiez 0.5.8__py3-none-any.whl → 0.5.10__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.

Potentially problematic release.


This version of waldiez might be problematic. Click here for more details.

Files changed (88) hide show
  1. waldiez/_version.py +1 -1
  2. waldiez/cli.py +112 -24
  3. waldiez/exporting/agent/exporter.py +3 -0
  4. waldiez/exporting/agent/extras/captain_agent_extras.py +44 -7
  5. waldiez/exporting/agent/extras/handoffs/condition.py +3 -1
  6. waldiez/exporting/chats/utils/common.py +25 -23
  7. waldiez/exporting/core/__init__.py +0 -2
  8. waldiez/exporting/core/context.py +13 -13
  9. waldiez/exporting/core/protocols.py +0 -141
  10. waldiez/exporting/core/result.py +5 -5
  11. waldiez/exporting/flow/merger.py +2 -2
  12. waldiez/exporting/flow/orchestrator.py +1 -0
  13. waldiez/exporting/flow/utils/common.py +2 -2
  14. waldiez/exporting/flow/utils/importing.py +1 -0
  15. waldiez/exporting/flow/utils/logging.py +6 -7
  16. waldiez/exporting/tools/exporter.py +5 -0
  17. waldiez/exporting/tools/factory.py +4 -0
  18. waldiez/exporting/tools/processor.py +5 -1
  19. waldiez/io/_ws.py +13 -5
  20. waldiez/io/models/content/image.py +1 -0
  21. waldiez/io/models/user_input.py +4 -4
  22. waldiez/io/models/user_response.py +1 -0
  23. waldiez/io/mqtt.py +1 -1
  24. waldiez/io/structured.py +17 -17
  25. waldiez/io/utils.py +1 -1
  26. waldiez/io/ws.py +9 -11
  27. waldiez/logger.py +180 -63
  28. waldiez/models/agents/agent/update_system_message.py +0 -2
  29. waldiez/models/agents/doc_agent/doc_agent.py +8 -1
  30. waldiez/models/common/dict_utils.py +169 -40
  31. waldiez/models/flow/flow.py +6 -6
  32. waldiez/models/flow/info.py +5 -1
  33. waldiez/models/model/_llm.py +28 -14
  34. waldiez/models/model/model.py +4 -1
  35. waldiez/models/model/model_data.py +18 -5
  36. waldiez/models/tool/predefined/_config.py +5 -1
  37. waldiez/models/tool/predefined/_duckduckgo.py +4 -0
  38. waldiez/models/tool/predefined/_email.py +474 -0
  39. waldiez/models/tool/predefined/_google.py +8 -6
  40. waldiez/models/tool/predefined/_perplexity.py +3 -0
  41. waldiez/models/tool/predefined/_searxng.py +3 -0
  42. waldiez/models/tool/predefined/_tavily.py +4 -1
  43. waldiez/models/tool/predefined/_wikipedia.py +4 -1
  44. waldiez/models/tool/predefined/_youtube.py +4 -1
  45. waldiez/models/tool/predefined/protocol.py +3 -0
  46. waldiez/models/tool/tool.py +22 -4
  47. waldiez/models/waldiez.py +12 -0
  48. waldiez/runner.py +37 -54
  49. waldiez/running/__init__.py +6 -0
  50. waldiez/running/base_runner.py +310 -353
  51. waldiez/running/environment.py +1 -0
  52. waldiez/running/exceptions.py +9 -0
  53. waldiez/running/post_run.py +4 -4
  54. waldiez/running/pre_run.py +51 -40
  55. waldiez/running/protocol.py +21 -101
  56. waldiez/running/run_results.py +1 -1
  57. waldiez/running/standard_runner.py +84 -277
  58. waldiez/running/step_by_step/__init__.py +46 -0
  59. waldiez/running/step_by_step/breakpoints_mixin.py +188 -0
  60. waldiez/running/step_by_step/step_by_step_models.py +224 -0
  61. waldiez/running/step_by_step/step_by_step_runner.py +745 -0
  62. waldiez/running/subprocess_runner/__base__.py +282 -0
  63. waldiez/running/subprocess_runner/__init__.py +16 -0
  64. waldiez/running/subprocess_runner/_async_runner.py +362 -0
  65. waldiez/running/subprocess_runner/_sync_runner.py +455 -0
  66. waldiez/running/subprocess_runner/runner.py +561 -0
  67. waldiez/running/timeline_processor.py +1 -1
  68. waldiez/running/utils.py +376 -1
  69. waldiez/utils/version.py +2 -6
  70. waldiez/ws/__init__.py +70 -0
  71. waldiez/ws/__main__.py +15 -0
  72. waldiez/ws/_file_handler.py +201 -0
  73. waldiez/ws/cli.py +211 -0
  74. waldiez/ws/client_manager.py +835 -0
  75. waldiez/ws/errors.py +416 -0
  76. waldiez/ws/models.py +971 -0
  77. waldiez/ws/reloader.py +342 -0
  78. waldiez/ws/server.py +469 -0
  79. waldiez/ws/session_manager.py +393 -0
  80. waldiez/ws/session_stats.py +83 -0
  81. waldiez/ws/utils.py +385 -0
  82. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/METADATA +74 -74
  83. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/RECORD +87 -65
  84. waldiez/running/patch_io_stream.py +0 -210
  85. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/WHEEL +0 -0
  86. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/entry_points.txt +0 -0
  87. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/licenses/LICENSE +0 -0
  88. {waldiez-0.5.8.dist-info → waldiez-0.5.10.dist-info}/licenses/NOTICE.md +0 -0
@@ -0,0 +1,188 @@
1
+ # SPDX-License-Identifier: Apache-2.0.
2
+ # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
+ # pylint: disable=unused-argument
4
+ """Breakpoints management mixin for step-by-step debugging."""
5
+
6
+ from typing import TYPE_CHECKING, Any, Iterable, Union
7
+
8
+ from .step_by_step_models import (
9
+ WaldiezDebugBreakpointAdded,
10
+ WaldiezDebugBreakpointCleared,
11
+ WaldiezDebugBreakpointRemoved,
12
+ WaldiezDebugBreakpointsList,
13
+ WaldiezDebugError,
14
+ WaldiezDebugMessage,
15
+ )
16
+
17
+ if TYPE_CHECKING:
18
+ from autogen.events import BaseEvent # type: ignore
19
+ from autogen.messages import BaseMessage # type: ignore
20
+
21
+
22
+ class BreakpointsMixin:
23
+ """Mixin class for managing breakpoints in step-by-step debugging."""
24
+
25
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
26
+ """Initialize breakpoints storage."""
27
+ self._breakpoints: set[str] = set()
28
+
29
+ def emit(self, message: WaldiezDebugMessage) -> None:
30
+ """Emit a debug message. Implemented by the class using this mixin.
31
+
32
+ Parameters
33
+ ----------
34
+ message : WaldiezDebugMessage
35
+ The debug message to emit.
36
+ """
37
+ raise NotImplementedError("emit method must be implemented")
38
+
39
+ def add_breakpoint(self, event_type: str) -> None:
40
+ """Add a breakpoint for an event type.
41
+
42
+ Parameters
43
+ ----------
44
+ event_type : str
45
+ The event type to add a breakpoint for.
46
+ """
47
+ if not event_type or not isinstance(event_type, str): # pyright: ignore
48
+ self.emit(
49
+ WaldiezDebugError(
50
+ error="Invalid event type: must be a non-empty string"
51
+ )
52
+ )
53
+ return
54
+
55
+ self._breakpoints.add(event_type)
56
+ self.emit(WaldiezDebugBreakpointAdded(breakpoint=event_type))
57
+
58
+ def remove_breakpoint(self, event_type: str) -> bool:
59
+ """Remove a breakpoint for an event type.
60
+
61
+ Parameters
62
+ ----------
63
+ event_type : str
64
+ The event type to remove the breakpoint for.
65
+
66
+ Returns
67
+ -------
68
+ bool
69
+ True if the breakpoint was removed, False if it didn't exist.
70
+ """
71
+ if not event_type or not isinstance(event_type, str): # pyright: ignore
72
+ self.emit(
73
+ WaldiezDebugError(
74
+ error="Invalid event type: must be a non-empty string"
75
+ )
76
+ )
77
+ return False
78
+
79
+ if event_type in self._breakpoints:
80
+ self._breakpoints.remove(event_type)
81
+ self.emit(WaldiezDebugBreakpointRemoved(breakpoint=event_type))
82
+ return True
83
+ self.emit(
84
+ WaldiezDebugError(
85
+ error=f"Breakpoint for '{event_type}' does not exist"
86
+ )
87
+ )
88
+ return False
89
+
90
+ def list_breakpoints(self) -> None:
91
+ """List all current breakpoints."""
92
+ self.emit(
93
+ WaldiezDebugBreakpointsList(breakpoints=sorted(self._breakpoints))
94
+ )
95
+
96
+ def clear_breakpoints(self) -> None:
97
+ """Clear all breakpoints."""
98
+ count = len(self._breakpoints)
99
+ self._breakpoints.clear()
100
+ if count > 0:
101
+ self.emit(
102
+ WaldiezDebugBreakpointCleared(
103
+ message=f"Cleared {count} breakpoint(s)"
104
+ )
105
+ )
106
+
107
+ def set_breakpoints(self, event_types: Iterable[str]) -> None:
108
+ """Set which event types to break on.
109
+
110
+ Parameters
111
+ ----------
112
+ event_types : Iterable[str]
113
+ Iterable of event types to break on. Empty means break on all.
114
+ """
115
+ self._breakpoints = set(event_types)
116
+
117
+ def get_breakpoints(self) -> set[str]:
118
+ """Get current breakpoints.
119
+
120
+ Returns
121
+ -------
122
+ set[str]
123
+ Set of current breakpoint event types.
124
+ """
125
+ return self._breakpoints.copy()
126
+
127
+ def has_breakpoint(self, event_type: str) -> bool:
128
+ """Check if a breakpoint exists for an event type.
129
+
130
+ Parameters
131
+ ----------
132
+ event_type : str
133
+ The event type to check.
134
+
135
+ Returns
136
+ -------
137
+ bool
138
+ True if a breakpoint exists for this event type.
139
+ """
140
+ return event_type in self._breakpoints
141
+
142
+ def should_break_on_event(
143
+ self, event: Union["BaseEvent", "BaseMessage"], step_mode: bool = True
144
+ ) -> bool:
145
+ """Determine if we should break on this event.
146
+
147
+ Parameters
148
+ ----------
149
+ event : Union[BaseEvent, BaseMessage]
150
+ The event to check.
151
+ step_mode : bool, optional
152
+ Whether step mode is enabled, by default True.
153
+
154
+ Returns
155
+ -------
156
+ bool
157
+ True if we should break, False otherwise.
158
+ """
159
+ if not step_mode:
160
+ return False
161
+
162
+ # Get event type
163
+ event_type = getattr(event, "type", "unknown")
164
+
165
+ # Don't break on input requests - they're handled separately
166
+ if event_type == "input_request":
167
+ return False
168
+
169
+ # If no specific breakpoints set, break on all events
170
+ if not self._breakpoints:
171
+ return True
172
+
173
+ # Check if this event type has a breakpoint
174
+ return event_type in self._breakpoints
175
+
176
+ def get_breakpoint_stats(self) -> dict[str, Any]:
177
+ """Get breakpoint statistics.
178
+
179
+ Returns
180
+ -------
181
+ dict[str, Any]
182
+ Dictionary containing breakpoint statistics.
183
+ """
184
+ return {
185
+ "total_breakpoints": len(self._breakpoints),
186
+ "breakpoints": sorted(self._breakpoints),
187
+ "has_breakpoints": len(self._breakpoints) > 0,
188
+ }
@@ -0,0 +1,224 @@
1
+ # SPDX-License-Identifier: Apache-2.0.
2
+ # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
+ """Step-by-step execution models for Waldiez."""
4
+
5
+ from enum import Enum
6
+ from typing import Annotated, Any, Dict, Literal, Union
7
+
8
+ from pydantic import BaseModel, Field
9
+
10
+
11
+ class WaldiezDebugStepAction(Enum):
12
+ """Available actions during step-by-step execution."""
13
+
14
+ CONTINUE = "c" # Continue to next event
15
+ STEP = "s" # Step through (same as continue, but explicit)
16
+ RUN = "r" # Run without stopping (disable step mode)
17
+ QUIT = "q" # Quit execution
18
+ INFO = "i" # Show detailed event information
19
+ HELP = "h" # Show help
20
+ STATS = "st" # Show execution statistics
21
+ ADD_BREAKPOINT = "ab" # Add a breakpoint
22
+ REMOVE_BREAKPOINT = "rb" # Remove a breakpoint
23
+ LIST_BREAKPOINTS = "lb" # List all breakpoints
24
+ CLEAR_BREAKPOINTS = "cb" # Clear all breakpoints
25
+ UNKNOWN = "unknown" # Unknown command
26
+
27
+
28
+ VALID_CONTROL_COMMANDS = {
29
+ "", # continue/step (allow empty input)
30
+ "c", # continue
31
+ "r", # run
32
+ "s", # step
33
+ "h", # help
34
+ "q", # quit
35
+ "i", # info
36
+ "st", # stats
37
+ "ab", # add_breakpoint
38
+ "rb", # remove_breakpoint
39
+ "lb", # list_breakpoints
40
+ "cb", # clear_breakpoints
41
+ }
42
+
43
+
44
+ class WaldiezDebugHelpCommand(BaseModel):
45
+ """Help command information."""
46
+
47
+ cmds: list[str] = Field(
48
+ default_factory=list, description="List of command aliases"
49
+ )
50
+ desc: str
51
+
52
+
53
+ class WaldiezDebugHelpCommandGroup(BaseModel):
54
+ """Help command group information."""
55
+
56
+ title: str
57
+ commands: list[WaldiezDebugHelpCommand]
58
+
59
+
60
+ class WaldiezDebugPrint(BaseModel):
61
+ """Debug print message."""
62
+
63
+ type: Literal["debug_print"] = "debug_print"
64
+ content: str
65
+
66
+
67
+ class WaldiezDebugInputRequest(BaseModel):
68
+ """Debug input request message."""
69
+
70
+ type: Literal["debug_input_request"] = "debug_input_request"
71
+ prompt: str
72
+ request_id: str
73
+
74
+
75
+ class WaldiezDebugInputResponse(BaseModel):
76
+ """Debug input response message."""
77
+
78
+ type: Literal["debug_input_response"] = "debug_input_response"
79
+ request_id: str
80
+ data: str
81
+
82
+
83
+ class WaldiezDebugEventInfo(BaseModel):
84
+ """Debug event info message."""
85
+
86
+ type: Literal["debug_event_info"] = "debug_event_info"
87
+ event: Dict[str, Any]
88
+
89
+
90
+ class WaldiezDebugStats(BaseModel):
91
+ """Debug stats message."""
92
+
93
+ type: Literal["debug_stats"] = "debug_stats"
94
+ stats: Dict[str, Any]
95
+
96
+
97
+ class WaldiezDebugHelp(BaseModel):
98
+ """Debug help message."""
99
+
100
+ type: Literal["debug_help"] = "debug_help"
101
+ help: list[WaldiezDebugHelpCommandGroup]
102
+
103
+
104
+ class WaldiezDebugError(BaseModel):
105
+ """Debug error message."""
106
+
107
+ type: Literal["debug_error"] = "debug_error"
108
+ error: str
109
+
110
+
111
+ class WaldiezDebugBreakpointsList(BaseModel):
112
+ """Debug breakpoints message."""
113
+
114
+ type: Literal["debug_breakpoints_list"] = "debug_breakpoints_list"
115
+ breakpoints: list[str] # Event types
116
+ # Optional: Could extend to include agent+event combinations
117
+
118
+
119
+ class WaldiezDebugBreakpointAdded(BaseModel):
120
+ """Debug breakpoint added message."""
121
+
122
+ type: Literal["debug_breakpoint_added"] = "debug_breakpoint_added"
123
+ breakpoint: str
124
+
125
+
126
+ class WaldiezDebugBreakpointRemoved(BaseModel):
127
+ """Debug breakpoint removed message."""
128
+
129
+ type: Literal["debug_breakpoint_removed"] = "debug_breakpoint_removed"
130
+ breakpoint: str
131
+
132
+
133
+ class WaldiezDebugBreakpointCleared(BaseModel):
134
+ """Debug breakpoint cleared message."""
135
+
136
+ type: Literal["debug_breakpoint_cleared"] = "debug_breakpoint_cleared"
137
+ message: str
138
+
139
+
140
+ WaldiezDebugMessage = Annotated[
141
+ Union[
142
+ WaldiezDebugPrint,
143
+ WaldiezDebugInputRequest,
144
+ WaldiezDebugInputResponse,
145
+ WaldiezDebugEventInfo,
146
+ WaldiezDebugStats,
147
+ WaldiezDebugHelp,
148
+ WaldiezDebugError,
149
+ WaldiezDebugBreakpointsList,
150
+ WaldiezDebugBreakpointAdded,
151
+ WaldiezDebugBreakpointRemoved,
152
+ WaldiezDebugBreakpointCleared,
153
+ ],
154
+ Field(discriminator="type"),
155
+ ]
156
+
157
+
158
+ class WaldiezDebugMessageWrapper(BaseModel):
159
+ """Wrapper for debug messages."""
160
+
161
+ # noinspection PyTypeHints
162
+ message: WaldiezDebugMessage
163
+
164
+
165
+ HELP_MESSAGE = WaldiezDebugHelp(
166
+ help=[
167
+ WaldiezDebugHelpCommandGroup(
168
+ title="Commands",
169
+ commands=[
170
+ WaldiezDebugHelpCommand(
171
+ cmds=["continue", "c"], desc="Continue to the next step."
172
+ ),
173
+ WaldiezDebugHelpCommand(
174
+ cmds=["step", "s"], desc="Step through the next event."
175
+ ),
176
+ WaldiezDebugHelpCommand(
177
+ cmds=["run", "r"], desc="Run without stopping."
178
+ ),
179
+ WaldiezDebugHelpCommand(
180
+ cmds=["quit", "q"], desc="Quit the debugger."
181
+ ),
182
+ WaldiezDebugHelpCommand(
183
+ cmds=["info", "i"], desc="Show detailed event information."
184
+ ),
185
+ WaldiezDebugHelpCommand(
186
+ cmds=["help", "h"], desc="Show this help message."
187
+ ),
188
+ WaldiezDebugHelpCommand(
189
+ cmds=["stats", "st"], desc="Show execution statistics."
190
+ ),
191
+ WaldiezDebugHelpCommand(
192
+ cmds=["add_breakpoint", "ab"],
193
+ desc="Add breakpoint for event type.",
194
+ ),
195
+ WaldiezDebugHelpCommand(
196
+ cmds=["remove_breakpoint", "rb"],
197
+ desc="Remove breakpoint for event type.",
198
+ ),
199
+ WaldiezDebugHelpCommand(
200
+ cmds=["list_breakpoints", "lb"],
201
+ desc="List all breakpoints.",
202
+ ),
203
+ WaldiezDebugHelpCommand(
204
+ cmds=["clear_breakpoints", "cb"],
205
+ desc="Clear all breakpoints.",
206
+ ),
207
+ ],
208
+ ),
209
+ WaldiezDebugHelpCommandGroup(
210
+ title="Tips",
211
+ commands=[
212
+ WaldiezDebugHelpCommand(
213
+ desc="Press Enter alone to continue (same as 'c')"
214
+ ),
215
+ WaldiezDebugHelpCommand(
216
+ desc="Use (s)tep to go through events one by one."
217
+ ),
218
+ WaldiezDebugHelpCommand(
219
+ desc="Use (r)un to continue without stopping."
220
+ ),
221
+ ],
222
+ ),
223
+ ]
224
+ )