fluxloop-cli 0.2.22__tar.gz → 0.2.23__tar.gz
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.
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/PKG-INFO +3 -1
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/README.md +2 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/__init__.py +1 -1
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/conversation_supervisor.py +40 -4
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/templates.py +9 -3
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli.egg-info/PKG-INFO +3 -1
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/pyproject.toml +1 -1
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/arg_binder.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/__init__.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/config.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/doctor.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/evaluate.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/generate.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/init.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/parse.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/record.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/run.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/commands/status.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/config_loader.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/config_schema.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/constants.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/environment.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/__init__.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/config.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/__init__.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/analysis.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/core.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/reporting/__init__.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/reporting/html.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/reporting/markdown.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/success.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/llm.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/__init__.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/base.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/information_completeness.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/intent_recognition.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/response_clarity.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/response_consistency.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/rules.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/input_generator.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/llm_generator.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/main.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/project_paths.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/runner.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/target_loader.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/validators.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli.egg-info/SOURCES.txt +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli.egg-info/dependency_links.txt +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli.egg-info/entry_points.txt +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli.egg-info/requires.txt +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli.egg-info/top_level.txt +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/setup.cfg +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_analysis_recommendations.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_arg_binder.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_config_command.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_evaluate_command.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_evaluation_llm.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_input_generator.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_prompt_library.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_run_command.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_success_criteria.py +0 -0
- {fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/tests/test_target_loader.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fluxloop-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.23
|
|
4
4
|
Summary: FluxLoop CLI for running agent simulations
|
|
5
5
|
Author-email: FluxLoop Team <team@fluxloop.dev>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -83,6 +83,8 @@ The legacy `setting.yaml` is still supported, but new projects created with
|
|
|
83
83
|
|
|
84
84
|
These flags override the values in `configs/simulation.yaml` (`multi_turn` block). When enabled, the runner consults the supervisor after every turn to decide whether to continue and to synthesize the next realistic user message.
|
|
85
85
|
|
|
86
|
+
**Scripted Playback Mode**: For deterministic multi-turn scenarios, switch `supervisor.provider` to `mock` and populate `supervisor.metadata.scripted_questions` with a list of user messages. FluxLoop will replay them sequentially and terminate when the script ends—ideal for regression testing and demos.
|
|
87
|
+
|
|
86
88
|
Run `fluxloop --help` or `fluxloop <command> --help` for more detail.
|
|
87
89
|
|
|
88
90
|
## Quick Setup Script
|
|
@@ -43,6 +43,8 @@ The legacy `setting.yaml` is still supported, but new projects created with
|
|
|
43
43
|
|
|
44
44
|
These flags override the values in `configs/simulation.yaml` (`multi_turn` block). When enabled, the runner consults the supervisor after every turn to decide whether to continue and to synthesize the next realistic user message.
|
|
45
45
|
|
|
46
|
+
**Scripted Playback Mode**: For deterministic multi-turn scenarios, switch `supervisor.provider` to `mock` and populate `supervisor.metadata.scripted_questions` with a list of user messages. FluxLoop will replay them sequentially and terminate when the script ends—ideal for regression testing and demos.
|
|
47
|
+
|
|
46
48
|
Run `fluxloop --help` or `fluxloop <command> --help` for more detail.
|
|
47
49
|
|
|
48
50
|
## Quick Setup Script
|
|
@@ -119,7 +119,7 @@ class ConversationSupervisor:
|
|
|
119
119
|
|
|
120
120
|
provider = (self.config.provider or "openai").lower()
|
|
121
121
|
if provider == "mock":
|
|
122
|
-
return self._mock_decision()
|
|
122
|
+
return self._mock_decision(conversation_state)
|
|
123
123
|
if provider == "openai":
|
|
124
124
|
response_text = await self._call_openai(prompt)
|
|
125
125
|
else:
|
|
@@ -127,10 +127,45 @@ class ConversationSupervisor:
|
|
|
127
127
|
|
|
128
128
|
return self._parse_decision(response_text)
|
|
129
129
|
|
|
130
|
-
def _mock_decision(self) -> SupervisorDecision:
|
|
131
|
-
"""Deterministic supervisor used for tests or offline
|
|
130
|
+
def _mock_decision(self, conversation_state: Dict[str, Any]) -> SupervisorDecision:
|
|
131
|
+
"""Deterministic supervisor used for tests, scripted runs, or offline modes."""
|
|
132
132
|
|
|
133
133
|
metadata = self.config.metadata or {}
|
|
134
|
+
|
|
135
|
+
scripted_questions = metadata.get("scripted_questions")
|
|
136
|
+
if isinstance(scripted_questions, list):
|
|
137
|
+
context = conversation_state.setdefault("context", {})
|
|
138
|
+
index = int(context.get("mock_script_index", 0))
|
|
139
|
+
script_length = len(scripted_questions)
|
|
140
|
+
|
|
141
|
+
if index < script_length:
|
|
142
|
+
next_message = scripted_questions[index]
|
|
143
|
+
context["mock_script_index"] = index + 1
|
|
144
|
+
return SupervisorDecision(
|
|
145
|
+
decision="continue",
|
|
146
|
+
next_user_message=str(next_message),
|
|
147
|
+
raw_response={
|
|
148
|
+
"mock": True,
|
|
149
|
+
"scripted": True,
|
|
150
|
+
"script_index": index,
|
|
151
|
+
"script_length": script_length,
|
|
152
|
+
},
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
reason = metadata.get("mock_reason", "script_complete")
|
|
156
|
+
closing = metadata.get("mock_closing")
|
|
157
|
+
return SupervisorDecision(
|
|
158
|
+
decision="terminate",
|
|
159
|
+
termination_reason=reason,
|
|
160
|
+
closing_user_message=closing,
|
|
161
|
+
raw_response={
|
|
162
|
+
"mock": True,
|
|
163
|
+
"scripted": True,
|
|
164
|
+
"script_complete": True,
|
|
165
|
+
"script_length": script_length,
|
|
166
|
+
},
|
|
167
|
+
)
|
|
168
|
+
|
|
134
169
|
default_decision = metadata.get("mock_decision", "terminate")
|
|
135
170
|
decision: SupervisorDecisionType = (
|
|
136
171
|
default_decision if default_decision in {"continue", "terminate"} else "terminate"
|
|
@@ -181,8 +216,9 @@ class ConversationSupervisor:
|
|
|
181
216
|
payload = {
|
|
182
217
|
"model": self.config.model,
|
|
183
218
|
"messages": messages,
|
|
184
|
-
"temperature": self.config.temperature,
|
|
185
219
|
}
|
|
220
|
+
if self.config.temperature is not None:
|
|
221
|
+
payload["temperature"] = self.config.temperature
|
|
186
222
|
|
|
187
223
|
async with httpx.AsyncClient(timeout=60) as client:
|
|
188
224
|
response = await client.post(
|
|
@@ -35,6 +35,8 @@ def create_project_config(project_name: str) -> str:
|
|
|
35
35
|
metadata:
|
|
36
36
|
team: development
|
|
37
37
|
environment: local
|
|
38
|
+
service_context: ""
|
|
39
|
+
# Describe the overall service scenario (used by multi-turn supervisor)
|
|
38
40
|
# Add any custom fields used by dashboards or automation tools.
|
|
39
41
|
"""
|
|
40
42
|
).strip() + "\n"
|
|
@@ -140,19 +142,23 @@ def create_simulation_config(project_name: str) -> str:
|
|
|
140
142
|
override_param_path: data.content
|
|
141
143
|
|
|
142
144
|
multi_turn:
|
|
143
|
-
enabled: false # Enable to drive conversations via supervisor
|
|
145
|
+
enabled: false # Enable to drive conversations via supervisor
|
|
144
146
|
max_turns: 8 # Safety cap on total turns per conversation
|
|
145
147
|
auto_approve_tools: true # Automatically approve tool calls when supported
|
|
146
148
|
persona_override: null # Force a specific persona id (optional)
|
|
147
149
|
supervisor:
|
|
148
|
-
provider: openai
|
|
150
|
+
provider: openai # openai (LLM generated) | mock (scripted playback)
|
|
149
151
|
model: gpt-5-mini
|
|
150
|
-
temperature: 0.2
|
|
151
152
|
system_prompt: |
|
|
152
153
|
You supervise an AI assistant supporting customers.
|
|
153
154
|
Review the entire transcript and decide whether to continue.
|
|
154
155
|
When continuing, craft the next user message consistent with the persona.
|
|
155
156
|
When terminating, explain the reason and provide any closing notes.
|
|
157
|
+
metadata:
|
|
158
|
+
scripted_questions: [] # 순차 재생용 사용자 발화 배열 (예: ["첫 질문", "둘째 질문", ...])
|
|
159
|
+
mock_decision: terminate # Fallback when no scripted questions remain
|
|
160
|
+
mock_reason: script_complete # Termination reason for scripted runs
|
|
161
|
+
mock_closing: "Thanks for the help. I have no further questions."
|
|
156
162
|
|
|
157
163
|
output_directory: experiments
|
|
158
164
|
save_traces: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fluxloop-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.23
|
|
4
4
|
Summary: FluxLoop CLI for running agent simulations
|
|
5
5
|
Author-email: FluxLoop Team <team@fluxloop.dev>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -83,6 +83,8 @@ The legacy `setting.yaml` is still supported, but new projects created with
|
|
|
83
83
|
|
|
84
84
|
These flags override the values in `configs/simulation.yaml` (`multi_turn` block). When enabled, the runner consults the supervisor after every turn to decide whether to continue and to synthesize the next realistic user message.
|
|
85
85
|
|
|
86
|
+
**Scripted Playback Mode**: For deterministic multi-turn scenarios, switch `supervisor.provider` to `mock` and populate `supervisor.metadata.scripted_questions` with a list of user messages. FluxLoop will replay them sequentially and terminate when the script ends—ideal for regression testing and demos.
|
|
87
|
+
|
|
86
88
|
Run `fluxloop --help` or `fluxloop <command> --help` for more detail.
|
|
87
89
|
|
|
88
90
|
## Quick Setup Script
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/reporting/__init__.py
RENAMED
|
File without changes
|
{fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/reporting/html.py
RENAMED
|
File without changes
|
{fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/engine/reporting/markdown.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/intent_recognition.py
RENAMED
|
File without changes
|
{fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/response_clarity.py
RENAMED
|
File without changes
|
{fluxloop_cli-0.2.22 → fluxloop_cli-0.2.23}/fluxloop_cli/evaluation/prompts/response_consistency.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|