soe-ai 0.2.0b2__py3-none-any.whl → 0.2.0b3__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.
- soe/broker.py +14 -32
- soe/docs/guide_01_tool.md +52 -0
- soe/docs/guide_02_llm.md +5 -5
- soe/docs/primitives/node_reference.md +1 -0
- soe/docs/primitives/signals.md +10 -9
- soe/docs_index.py +1 -1
- soe/lib/inheritance.py +42 -1
- soe/nodes/agent/factory.py +1 -1
- soe/nodes/agent/stages/response.py +3 -3
- soe/nodes/agent/types.py +1 -1
- soe/nodes/lib/response_builder.py +12 -10
- soe/nodes/lib/signal_emission.py +6 -10
- soe/nodes/llm/factory.py +3 -3
- soe/nodes/tool/state.py +21 -1
- soe/nodes/tool/validation/config.py +15 -0
- soe/validation/__init__.py +7 -1
- soe/validation/config.py +22 -0
- {soe_ai-0.2.0b2.dist-info → soe_ai-0.2.0b3.dist-info}/METADATA +1 -1
- {soe_ai-0.2.0b2.dist-info → soe_ai-0.2.0b3.dist-info}/RECORD +22 -22
- {soe_ai-0.2.0b2.dist-info → soe_ai-0.2.0b3.dist-info}/WHEEL +0 -0
- {soe_ai-0.2.0b2.dist-info → soe_ai-0.2.0b3.dist-info}/licenses/LICENSE +0 -0
- {soe_ai-0.2.0b2.dist-info → soe_ai-0.2.0b3.dist-info}/top_level.txt +0 -0
soe/lib/inheritance.py
CHANGED
|
@@ -12,7 +12,9 @@ Used for workflow initialization and chaining.
|
|
|
12
12
|
import copy
|
|
13
13
|
from typing import Dict, Any, Optional
|
|
14
14
|
|
|
15
|
-
from ..types import Backends
|
|
15
|
+
from ..types import Backends, EventTypes
|
|
16
|
+
from .register_event import register_event
|
|
17
|
+
from .context_fields import set_field
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
def save_config_sections(
|
|
@@ -170,3 +172,42 @@ def inherit_context(
|
|
|
170
172
|
}
|
|
171
173
|
|
|
172
174
|
return inherited_context
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def prepare_initial_context(
|
|
178
|
+
execution_id: str,
|
|
179
|
+
initial_context: Dict[str, Any],
|
|
180
|
+
backends: Backends,
|
|
181
|
+
inherit_context_from_id: Optional[str] = None,
|
|
182
|
+
) -> Dict[str, Any]:
|
|
183
|
+
"""
|
|
184
|
+
Prepare initial context, optionally inheriting from another execution.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
execution_id: Target execution ID
|
|
188
|
+
initial_context: Initial context data provided by user
|
|
189
|
+
backends: Backend services
|
|
190
|
+
inherit_context_from_id: Optional source execution ID to inherit from
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
Prepared context dictionary
|
|
194
|
+
"""
|
|
195
|
+
if inherit_context_from_id:
|
|
196
|
+
register_event(
|
|
197
|
+
backends, execution_id, EventTypes.CONTEXT_INHERITANCE_START,
|
|
198
|
+
)
|
|
199
|
+
context = inherit_context(inherit_context_from_id, backends)
|
|
200
|
+
if initial_context:
|
|
201
|
+
register_event(
|
|
202
|
+
backends, execution_id, EventTypes.CONTEXT_MERGE,
|
|
203
|
+
{"fields": list(initial_context.keys())}
|
|
204
|
+
)
|
|
205
|
+
for field, value in initial_context.items():
|
|
206
|
+
set_field(context, field, value)
|
|
207
|
+
else:
|
|
208
|
+
context = {
|
|
209
|
+
k: [v] if not k.startswith("__") else v
|
|
210
|
+
for k, v in initial_context.items()
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return context
|
soe/nodes/agent/factory.py
CHANGED
|
@@ -97,7 +97,7 @@ def create_agent_node_caller(
|
|
|
97
97
|
operational_state.context[operational_state.output_field] = [final_response.output]
|
|
98
98
|
|
|
99
99
|
emit_completion_signals(
|
|
100
|
-
|
|
100
|
+
selected_signals=final_response.selected_signals,
|
|
101
101
|
node_config=node_config,
|
|
102
102
|
operational_state=operational_state,
|
|
103
103
|
broadcast_signals_caller=broadcast_signals_caller,
|
|
@@ -4,7 +4,7 @@ from ...lib.llm_resolver import resolve_llm_call
|
|
|
4
4
|
from ...lib.response_builder import (
|
|
5
5
|
build_response_model,
|
|
6
6
|
extract_output_from_response,
|
|
7
|
-
|
|
7
|
+
extract_signals_from_response,
|
|
8
8
|
)
|
|
9
9
|
from ....types import CallLlm
|
|
10
10
|
from ..types import ResponseStageInput, FinalResponse
|
|
@@ -46,9 +46,9 @@ def execute_response_stage(
|
|
|
46
46
|
)
|
|
47
47
|
|
|
48
48
|
output_value = extract_output_from_response(raw_response, output_field)
|
|
49
|
-
|
|
49
|
+
selected_signals = extract_signals_from_response(raw_response)
|
|
50
50
|
|
|
51
51
|
return FinalResponse(
|
|
52
52
|
output=output_value,
|
|
53
|
-
|
|
53
|
+
selected_signals=selected_signals,
|
|
54
54
|
)
|
soe/nodes/agent/types.py
CHANGED
|
@@ -5,9 +5,8 @@ Dynamic Pydantic response model builder.
|
|
|
5
5
|
from typing import Type, Any, Optional, List, Dict, Literal
|
|
6
6
|
from pydantic import RootModel
|
|
7
7
|
from pydantic import BaseModel, Field, create_model
|
|
8
|
-
from typing import Type, Any, Optional, List, Dict, Literal
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
|
|
11
10
|
def build_response_model(
|
|
12
11
|
output_field: Optional[str] = None,
|
|
13
12
|
output_schema: Optional[Type[BaseModel]] = None,
|
|
@@ -51,11 +50,11 @@ def build_response_model(
|
|
|
51
50
|
else:
|
|
52
51
|
descriptions.append(f"- {s['name']}")
|
|
53
52
|
|
|
54
|
-
desc_text = "Select
|
|
53
|
+
desc_text = "Select ALL signals that apply (can be none, one, or multiple):\n" + "\n".join(descriptions)
|
|
55
54
|
|
|
56
|
-
fields["
|
|
57
|
-
signal_literal,
|
|
58
|
-
Field(
|
|
55
|
+
fields["selected_signals"] = (
|
|
56
|
+
List[signal_literal],
|
|
57
|
+
Field(default=[], description=desc_text)
|
|
59
58
|
)
|
|
60
59
|
|
|
61
60
|
model_name = "DynamicResponse"
|
|
@@ -81,11 +80,14 @@ def extract_output_from_response(
|
|
|
81
80
|
return data.get("output")
|
|
82
81
|
|
|
83
82
|
|
|
84
|
-
def
|
|
83
|
+
def extract_signals_from_response(response: BaseModel) -> List[str]:
|
|
85
84
|
"""
|
|
86
|
-
Extract the selected
|
|
85
|
+
Extract the selected signals from a dynamic response model.
|
|
86
|
+
Returns a list of signal names (can be empty).
|
|
87
87
|
"""
|
|
88
88
|
data = response.model_dump()
|
|
89
89
|
if isinstance(data, dict):
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
signals = data.get("selected_signals", [])
|
|
91
|
+
if isinstance(signals, list):
|
|
92
|
+
return signals
|
|
93
|
+
return []
|
soe/nodes/lib/signal_emission.py
CHANGED
|
@@ -39,7 +39,7 @@ def handle_llm_failure(
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
def emit_completion_signals(
|
|
42
|
-
|
|
42
|
+
selected_signals: List[str],
|
|
43
43
|
node_config: Dict[str, Any],
|
|
44
44
|
operational_state: OperationalState,
|
|
45
45
|
broadcast_signals_caller: BroadcastSignalsCaller,
|
|
@@ -49,17 +49,16 @@ def emit_completion_signals(
|
|
|
49
49
|
Emit signals after successful node completion.
|
|
50
50
|
|
|
51
51
|
Signal emission priority:
|
|
52
|
-
1. LLM-selected
|
|
52
|
+
1. LLM-selected signals (when multiple signals with plain-text conditions)
|
|
53
53
|
2. Jinja-conditioned emissions (evaluate {{ }} templates)
|
|
54
54
|
3. Single unconditional signal (emit it)
|
|
55
|
-
4. Multiple signals without selection → error (shouldn't happen)
|
|
56
55
|
|
|
57
56
|
The 'condition' field has dual purpose:
|
|
58
|
-
- Plain text: used as description for LLM signal selection
|
|
57
|
+
- Plain text: used as description for LLM signal selection (multi-select)
|
|
59
58
|
- Jinja template ({{ }}): evaluated to determine if signal should emit
|
|
60
59
|
"""
|
|
61
|
-
if
|
|
62
|
-
broadcast_signals_caller(execution_id,
|
|
60
|
+
if selected_signals:
|
|
61
|
+
broadcast_signals_caller(execution_id, selected_signals)
|
|
63
62
|
elif operational_state.event_emissions:
|
|
64
63
|
if has_jinja_conditions(operational_state.event_emissions):
|
|
65
64
|
handle_signal_emission(
|
|
@@ -73,7 +72,4 @@ def emit_completion_signals(
|
|
|
73
72
|
]
|
|
74
73
|
if len(signals) == 1:
|
|
75
74
|
broadcast_signals_caller(execution_id, signals)
|
|
76
|
-
|
|
77
|
-
raise RuntimeError(
|
|
78
|
-
f"Multiple signals defined but no selection made: {signals}"
|
|
79
|
-
)
|
|
75
|
+
# Multiple signals with no selection = LLM chose none, which is valid
|
soe/nodes/llm/factory.py
CHANGED
|
@@ -12,7 +12,7 @@ from ..lib.signal_emission import emit_completion_signals, handle_llm_failure
|
|
|
12
12
|
from ..lib.response_builder import (
|
|
13
13
|
build_response_model,
|
|
14
14
|
extract_output_from_response,
|
|
15
|
-
|
|
15
|
+
extract_signals_from_response,
|
|
16
16
|
)
|
|
17
17
|
from ...types import CallLlm, BroadcastSignalsCaller, Backends, LlmNodeCaller, EventTypes
|
|
18
18
|
from ...lib.register_event import register_event
|
|
@@ -80,10 +80,10 @@ def create_llm_node_caller(
|
|
|
80
80
|
rendered_prompt, str(output_value), backends
|
|
81
81
|
)
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
selected_signals = extract_signals_from_response(raw_response)
|
|
84
84
|
|
|
85
85
|
emit_completion_signals(
|
|
86
|
-
|
|
86
|
+
selected_signals=selected_signals,
|
|
87
87
|
node_config=node_config,
|
|
88
88
|
operational_state=state,
|
|
89
89
|
broadcast_signals_caller=broadcast_signals_caller,
|
soe/nodes/tool/state.py
CHANGED
|
@@ -42,8 +42,14 @@ def get_operational_state(
|
|
|
42
42
|
tool_name, tools_registry, execution_id, backends
|
|
43
43
|
)
|
|
44
44
|
|
|
45
|
+
# Priority: 1) inline parameters, 2) context_parameter_field, 3) empty dict
|
|
46
|
+
inline_parameters = node_config.get("parameters")
|
|
45
47
|
context_parameter_field = node_config.get("context_parameter_field")
|
|
46
|
-
|
|
48
|
+
|
|
49
|
+
if inline_parameters is not None:
|
|
50
|
+
# Inline parameters from YAML - render any Jinja templates
|
|
51
|
+
parameters = _render_parameters(inline_parameters, context)
|
|
52
|
+
elif context_parameter_field and context_parameter_field in context:
|
|
47
53
|
if process_accumulated:
|
|
48
54
|
raw_params = context[context_parameter_field]
|
|
49
55
|
else:
|
|
@@ -64,3 +70,17 @@ def get_operational_state(
|
|
|
64
70
|
parameters=parameters,
|
|
65
71
|
process_accumulated=process_accumulated,
|
|
66
72
|
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _render_parameters(params: Any, context: Dict[str, Any]) -> Any:
|
|
76
|
+
"""Render Jinja templates in parameter values."""
|
|
77
|
+
from ...lib.jinja_render import render_prompt
|
|
78
|
+
|
|
79
|
+
if isinstance(params, dict):
|
|
80
|
+
return {k: _render_parameters(v, context) for k, v in params.items()}
|
|
81
|
+
elif isinstance(params, list):
|
|
82
|
+
return [_render_parameters(item, context) for item in params]
|
|
83
|
+
elif isinstance(params, str) and "{{" in params:
|
|
84
|
+
rendered, _ = render_prompt(params, context)
|
|
85
|
+
return rendered
|
|
86
|
+
return params
|
|
@@ -108,6 +108,21 @@ def validate_node_config(node_config: Dict[str, Any]) -> None:
|
|
|
108
108
|
"'output_field' cannot be '__operational__' - this is a reserved system field"
|
|
109
109
|
)
|
|
110
110
|
|
|
111
|
+
# Validate parameters field (inline tool parameters)
|
|
112
|
+
parameters = node_config.get("parameters")
|
|
113
|
+
if parameters is not None:
|
|
114
|
+
if not isinstance(parameters, dict):
|
|
115
|
+
raise WorkflowValidationError(
|
|
116
|
+
"'parameters' must be a dict - the kwargs to pass to the tool"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Cannot have both parameters and context_parameter_field
|
|
120
|
+
context_parameter_field = node_config.get("context_parameter_field")
|
|
121
|
+
if parameters is not None and context_parameter_field is not None:
|
|
122
|
+
raise WorkflowValidationError(
|
|
123
|
+
"Cannot specify both 'parameters' and 'context_parameter_field' - use one or the other"
|
|
124
|
+
)
|
|
125
|
+
|
|
111
126
|
|
|
112
127
|
def validate_tool_node_config(
|
|
113
128
|
node_config: Dict[str, Any], tools_registry: ToolsRegistry
|
soe/validation/__init__.py
CHANGED
|
@@ -6,13 +6,19 @@ Two types of validation:
|
|
|
6
6
|
2. operational.py - Validates runtime state before node execution (fail-fast)
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
from .config import
|
|
9
|
+
from .config import (
|
|
10
|
+
validate_config,
|
|
11
|
+
validate_workflow,
|
|
12
|
+
validate_orchestrate_params,
|
|
13
|
+
validate_initial_workflow,
|
|
14
|
+
)
|
|
10
15
|
from .operational import validate_operational, OperationalValidationError
|
|
11
16
|
|
|
12
17
|
__all__ = [
|
|
13
18
|
"validate_config",
|
|
14
19
|
"validate_workflow",
|
|
15
20
|
"validate_orchestrate_params",
|
|
21
|
+
"validate_initial_workflow",
|
|
16
22
|
"validate_operational",
|
|
17
23
|
"OperationalValidationError",
|
|
18
24
|
]
|
soe/validation/config.py
CHANGED
|
@@ -193,3 +193,25 @@ def validate_orchestrate_params(
|
|
|
193
193
|
raise WorkflowValidationError(
|
|
194
194
|
"'initial_workflow_name' must be a non-empty string"
|
|
195
195
|
)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def validate_initial_workflow(
|
|
199
|
+
initial_workflow_name: str,
|
|
200
|
+
parsed_registry: Dict[str, Any],
|
|
201
|
+
) -> None:
|
|
202
|
+
"""
|
|
203
|
+
Validate that the initial workflow exists in the registry.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
initial_workflow_name: Name of workflow to start with
|
|
207
|
+
parsed_registry: Dictionary of available workflows
|
|
208
|
+
|
|
209
|
+
Raises:
|
|
210
|
+
WorkflowValidationError: If workflow not found
|
|
211
|
+
"""
|
|
212
|
+
if initial_workflow_name not in parsed_registry:
|
|
213
|
+
available = list(parsed_registry.keys())
|
|
214
|
+
raise WorkflowValidationError(
|
|
215
|
+
f"Workflow '{initial_workflow_name}' not found in config. "
|
|
216
|
+
f"Available workflows: {available}"
|
|
217
|
+
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
soe/__init__.py,sha256=4g0b-2C4wlr3Aq9eSmISxEMeWRCI4fim_I1v4nfW_Cs,1131
|
|
2
|
-
soe/broker.py,sha256=
|
|
3
|
-
soe/docs_index.py,sha256=
|
|
2
|
+
soe/broker.py,sha256=XLcjauBqpzNMyBj0ECPsoO9K2_UVnOFTDmkmOiEe6aQ,5043
|
|
3
|
+
soe/docs_index.py,sha256=Qb5O9TwakXpLFlbF3J0lLvkDf9wVfna_N-EnupOTfnw,1325490
|
|
4
4
|
soe/init.py,sha256=SdVV1oTmh63BCtJpaYZavyO0ALfffsFgd75Vb8aJmXI,5928
|
|
5
5
|
soe/types.py,sha256=3CERX7rti_xRSliH2knZKeNDWqbetWg0z-tTQaGZODk,5929
|
|
6
6
|
soe/builtin_tools/__init__.py,sha256=wC4eyf7pO7Oc81RnxekhJJ-E7352Q_Rtzoh9lUq_Aps,2593
|
|
@@ -25,8 +25,8 @@ soe/builtin_tools/soe_remove_workflow.py,sha256=AlhjPU1xrj6VqKSwAbBVpt1sv1B3gcnW
|
|
|
25
25
|
soe/builtin_tools/soe_update_context.py,sha256=qXInqfM8UQnbbeYV1MUepMYaNsIXqTyMO_EfeXVtQTg,1690
|
|
26
26
|
soe/docs/_config.yml,sha256=PBTNeE97HoDj80tgMtpfxrAAGQxr0OiCaMZaJF-qVmo,255
|
|
27
27
|
soe/docs/guide_00_getting_started.md,sha256=ULHQfKSyex5I3FVwENVa3AmOQkMMKVKJ8TaVPpYVVXA,11279
|
|
28
|
-
soe/docs/guide_01_tool.md,sha256=
|
|
29
|
-
soe/docs/guide_02_llm.md,sha256=
|
|
28
|
+
soe/docs/guide_01_tool.md,sha256=SscNALq0V3-tCiWmhUqN9oX7EUqE-ktxDkKlFMsERFs,8242
|
|
29
|
+
soe/docs/guide_02_llm.md,sha256=dCjvCzHCTky9MasuQdaJNRXmQFcfALczTwaefG3NvSQ,4822
|
|
30
30
|
soe/docs/guide_03_router.md,sha256=614FW8jhwJBZ6TBeyhBfRRDyw3xV6_6byZH74hlgO6A,5645
|
|
31
31
|
soe/docs/guide_04_patterns.md,sha256=Yyzhb0yyFuHZSiPam7UCj6HagkTcqrI3K2MJbwA2nQU,15368
|
|
32
32
|
soe/docs/guide_05_agent.md,sha256=eZAYryU1AypunOM3V8i9DOeCDPcvk0FjMg97355DCPw,6075
|
|
@@ -52,13 +52,13 @@ soe/docs/builtins/tools.md,sha256=a5QZLEdddK6WZ1jJ1UPxlmTHHOjm4QhQZ8pC2GOEbr0,37
|
|
|
52
52
|
soe/docs/builtins/workflows.md,sha256=M1n2tGECcrCUQwZ-OzF-GqVRx-LNUxTvKDxIv41esx4,4774
|
|
53
53
|
soe/docs/primitives/backends.md,sha256=T_6jhjum6af9gPil4vIZdJtX9tgSGCJk6IQUuiISnyo,8209
|
|
54
54
|
soe/docs/primitives/context.md,sha256=FJ5d_7H8hOYJeSQ5MPzsapMS13WZ2f9IJ6of8TvmwdY,5325
|
|
55
|
-
soe/docs/primitives/node_reference.md,sha256=
|
|
55
|
+
soe/docs/primitives/node_reference.md,sha256=rmYdB5DjgHlyB5hTC57WtbJajC9an5J8a7O2najAhXw,8304
|
|
56
56
|
soe/docs/primitives/primitives.md,sha256=LUtIb1h5b2b3QCWSJrPYHUWAwE4KJjagCDCNJjj_UJo,11519
|
|
57
|
-
soe/docs/primitives/signals.md,sha256=
|
|
57
|
+
soe/docs/primitives/signals.md,sha256=n-rPlYFORVcm1Fmizmk6ZoNpFVa3eR7URCu3_b6saso,26382
|
|
58
58
|
soe/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
59
|
soe/lib/child_context.py,sha256=qIosNpCjhvEuLpJUHxRkgXjA78FyasnGrsTTcq9DN-4,1431
|
|
60
60
|
soe/lib/context_fields.py,sha256=Fct7JlzWLQ2268pdKHo8P2o2DVhpIDNwVMQ3o5bcqtI,1363
|
|
61
|
-
soe/lib/inheritance.py,sha256=
|
|
61
|
+
soe/lib/inheritance.py,sha256=4XEWSyhT6CMmqOaUrYSAGCPyqc1vpOVSM3MVhhOSjSQ,6440
|
|
62
62
|
soe/lib/jinja_render.py,sha256=MTWNvv0XU2WmhcTupTfLkp_n348dL9nBlz0J4oDDm4Q,4041
|
|
63
63
|
soe/lib/operational.py,sha256=pgx-nSOhYXD9pj1vlQqyCMloLLfPazL0WYp785K4mjQ,1416
|
|
64
64
|
soe/lib/parent_sync.py,sha256=h5x20aop3zqgtLWaIJ848sd6hkRcEFvVed99JFBTdxQ,2504
|
|
@@ -81,16 +81,16 @@ soe/local_backends/storage/telemetry.py,sha256=K6gcpXDsoH9Pll_Lz-27ff_ad48nCNwfH
|
|
|
81
81
|
soe/local_backends/storage/workflow.py,sha256=d3DiwfjR1OP4bnhRLgzdTZQ6xYUnwBh5B3sz0W5sH_k,2094
|
|
82
82
|
soe/nodes/__init__.py,sha256=soAkTMdrAuc82la7TRabTtpiQW2kngd8MlWuJuCRCrM,305
|
|
83
83
|
soe/nodes/agent/__init__.py,sha256=SQaDB9TAiMv5ZjGLX4B1nBnOwX_DGUxqzzDJ4BIT534,171
|
|
84
|
-
soe/nodes/agent/factory.py,sha256=
|
|
84
|
+
soe/nodes/agent/factory.py,sha256=b9EG5WsooG6uAmnKz0Hb2x34fo83ekTvXNmJLwxB_x8,5361
|
|
85
85
|
soe/nodes/agent/state.py,sha256=2fznePHA-0etOlCepMKVnguFDpooYynTBD21VjI_Fgw,3716
|
|
86
|
-
soe/nodes/agent/types.py,sha256=
|
|
86
|
+
soe/nodes/agent/types.py,sha256=MHbm6oJyOf91CsFW7ntRTpLPi3yOA3HxOKVigR8nRs4,1832
|
|
87
87
|
soe/nodes/agent/lib/loop_handlers.py,sha256=ndCoW_hQbtEkoj7UYlvXskZxXc-IgTCG3kBQzjJqQUE,4642
|
|
88
88
|
soe/nodes/agent/lib/loop_state.py,sha256=oft2uP5Rrl5iYrKZ31JX9nslKhi6GZRQZFclTU0w6DU,5474
|
|
89
89
|
soe/nodes/agent/lib/prompts.py,sha256=Nk3115Hq7Pa5FX1w_YZel7Yi1BLcMjLGme-p3UgyOxY,2002
|
|
90
90
|
soe/nodes/agent/lib/tools.py,sha256=8XDof2qYnUw8BWC0VXybMaBx-QwzEfZM5fAbA9VMwc0,986
|
|
91
91
|
soe/nodes/agent/stages/__init__.py,sha256=l3jXE7U4B41w7iTvuvgVrymD_BNIQSNA65oWfMRYtgs,330
|
|
92
92
|
soe/nodes/agent/stages/parameter.py,sha256=R6ylX2Lprf24FGiohN9LQk3C6jrQkTtOWdNNQHKST9g,1052
|
|
93
|
-
soe/nodes/agent/stages/response.py,sha256=
|
|
93
|
+
soe/nodes/agent/stages/response.py,sha256=h5I5wUkONA_UmDugD5dvgxupCZHW6iSBcpqWCsbClL4,1676
|
|
94
94
|
soe/nodes/agent/stages/router.py,sha256=AWtcYD8ae25QQFySg7iKyn9kKIq-8LLEZyqBG7XxL4I,1138
|
|
95
95
|
soe/nodes/agent/validation/__init__.py,sha256=ELLoSXqr1NeVwG766QzTuP2Fm3rLMKBXdhsgRUYOy_E,314
|
|
96
96
|
soe/nodes/agent/validation/config.py,sha256=YQABnBSS4bLZvdhl2N5AfSPsZmhVljWS8ibxDxAeyWs,3834
|
|
@@ -107,12 +107,12 @@ soe/nodes/lib/conversation_history.py,sha256=WTQscCSTElWShehij3lEVSWebHtrGpM_s2R
|
|
|
107
107
|
soe/nodes/lib/identity.py,sha256=HxSVJrjPAyAjMujFOgq-uZkGYrSz6sZbjM1VFi2PSVk,1861
|
|
108
108
|
soe/nodes/lib/llm_resolver.py,sha256=KJYh9Rt3T85XDe8wWyf1p-UPPxF6EYqGCdnd87rUk3o,4138
|
|
109
109
|
soe/nodes/lib/output.py,sha256=bfTwwSmSFr8i5_AoKwrPU-bEMqImo8QDd-AWEY9mac4,2231
|
|
110
|
-
soe/nodes/lib/response_builder.py,sha256=
|
|
111
|
-
soe/nodes/lib/signal_emission.py,sha256=
|
|
110
|
+
soe/nodes/lib/response_builder.py,sha256=OJoR84JcySsVRwzccr2kVLFJ0-5jcwsICNCVb34CK5Y,3122
|
|
111
|
+
soe/nodes/lib/signal_emission.py,sha256=pf_7gPQShKnqFnEKqAKx2o-mAjm1fg7hLrz1NYPs5nc,2627
|
|
112
112
|
soe/nodes/lib/signals.py,sha256=GD5PnwACVNvQ8VnH5o60ixhwZrO6cFlAb0DwEjW06T4,1829
|
|
113
113
|
soe/nodes/lib/tools.py,sha256=2m5kQQWC46zL0wjj7Amo-m4Hzar56UH11q1z8XMlgmo,3105
|
|
114
114
|
soe/nodes/llm/__init__.py,sha256=2iUEslXqRO5izJZLdecLBUZ0cXsQsD0pWg0CaBY13MI,159
|
|
115
|
-
soe/nodes/llm/factory.py,sha256=
|
|
115
|
+
soe/nodes/llm/factory.py,sha256=7OSRcN71r_0cCwpz-CdppcL7invm9K_wVt4bKaKpC5A,3748
|
|
116
116
|
soe/nodes/llm/state.py,sha256=c4x_22SdYTa1NRz5APjex8Ro_l3ISAixg55-rIG6ucQ,2775
|
|
117
117
|
soe/nodes/llm/types.py,sha256=hqUrvnNRCw_vnqJWIvdru9k4sLh6O3Zk9DSY-7jOE7c,223
|
|
118
118
|
soe/nodes/llm/validation/__init__.py,sha256=HAArh6mw4ixTRx4v8CW44BcpIRpU6tLjLGPd06X9m4Y,308
|
|
@@ -125,21 +125,21 @@ soe/nodes/router/validation/__init__.py,sha256=DgU37MHrR90GI1VvvfaUltrFtwpVGlGOc
|
|
|
125
125
|
soe/nodes/router/validation/config.py,sha256=iR07s31GsyJJBInljRu8qh7zMKHKGoYVf2auLb0lSQQ,2195
|
|
126
126
|
soe/nodes/router/validation/operational.py,sha256=Chldb5tpMe1MfFV3ym5XzneIF2OA8cBTvbfdWchX21c,519
|
|
127
127
|
soe/nodes/tool/factory.py,sha256=cWJD-tNsCQnp6vNGtdbdX7pnQWlsCu1RdClKH6q2KSA,2460
|
|
128
|
-
soe/nodes/tool/state.py,sha256=
|
|
128
|
+
soe/nodes/tool/state.py,sha256=MkJpSAtdXCj7pqKy55shjn92S6jhnZcuTTjIzcp5Yxk,3113
|
|
129
129
|
soe/nodes/tool/types.py,sha256=l3ZjXlOReqYEe8jg1ohzmldaPqQGEmZpkgNFCvWejw4,566
|
|
130
130
|
soe/nodes/tool/lib/__init__.py,sha256=KG1pnYuOAdPofsmX9LZgNc61bqagj1SMv-mzw8J5Hvc,201
|
|
131
131
|
soe/nodes/tool/lib/conditions.py,sha256=3xoBEjBeCZQGGjh8cRumH1IGwvZqv3vw_2zk9Ha6AWU,1111
|
|
132
132
|
soe/nodes/tool/lib/failure.py,sha256=miCrV2Mbx8b6sle1WT_zoaAoAyB7tHQhkwcjxgiDmRY,891
|
|
133
133
|
soe/nodes/tool/lib/parameters.py,sha256=q0c7znyqpRY3L0iI8x3WXTWyjSQ-XzDGw6baVJVdvDw,2182
|
|
134
134
|
soe/nodes/tool/validation/__init__.py,sha256=9sdtiYrPZg4zJ3WXAWg6h4c_oS9SIVgL7Oc7JQTiMfI,382
|
|
135
|
-
soe/nodes/tool/validation/config.py,sha256=
|
|
135
|
+
soe/nodes/tool/validation/config.py,sha256=E0QSAFXdDah9F-ljnuaRhqo3HAcmatlE-LHzEfwmtKo,5305
|
|
136
136
|
soe/nodes/tool/validation/operational.py,sha256=5he58ssGzQ_kXfdy26y4kqNEjo_CAVx989JJxNa5fi0,488
|
|
137
|
-
soe/validation/__init__.py,sha256=
|
|
138
|
-
soe/validation/config.py,sha256=
|
|
137
|
+
soe/validation/__init__.py,sha256=BjNN7MCR6OMBwFgKfw3NbKixYKkd0iPHk8zRi0dUMrg,604
|
|
138
|
+
soe/validation/config.py,sha256=ibkPUjeD8jmjsuoHzbcwzDSyKmx_0iLrER255HTuIHM,7497
|
|
139
139
|
soe/validation/jinja.py,sha256=_Ykj-UT9i3wQRXCyQgja3boCZuI3lrqOnf5C3iB1Kmg,1746
|
|
140
140
|
soe/validation/operational.py,sha256=P5SrE_8345IhHvsXpJ-XDEp1sIQVFhGXDBNQhuh7sTo,3628
|
|
141
|
-
soe_ai-0.2.
|
|
142
|
-
soe_ai-0.2.
|
|
143
|
-
soe_ai-0.2.
|
|
144
|
-
soe_ai-0.2.
|
|
145
|
-
soe_ai-0.2.
|
|
141
|
+
soe_ai-0.2.0b3.dist-info/licenses/LICENSE,sha256=SvEn330zvSOu83Vi4lDCX2QHgr6bmSSXOV1YClLGk1Y,1069
|
|
142
|
+
soe_ai-0.2.0b3.dist-info/METADATA,sha256=p01JcwyhLOD4KVlvLRwAJXZUDw3rrzTHqiWEhxmNF0Y,8796
|
|
143
|
+
soe_ai-0.2.0b3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
144
|
+
soe_ai-0.2.0b3.dist-info/top_level.txt,sha256=TUufXyVAQnzN6iT6zRb4dRHdfBSiWXuAL8EoyvugZuY,4
|
|
145
|
+
soe_ai-0.2.0b3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|