Skip to content

Commit f35054e

Browse files
committed
Fix failing PeasyAI tests: RAG import path, langchain import, and chunk test
- Fix sys.path in tests/rag/test_rag_index.py to point to src/rag/ - Add pytest.importorskip for faiss graceful skip when not installed - Update create_rag_index.py import from langchain.text_splitter to langchain_text_splitters (current package layout) - Fix test_create_chunks to use text longer than chunk_size (500 chars) so the splitter actually produces multiple chunks
1 parent b177137 commit f35054e

File tree

7 files changed

+164
-66
lines changed

7 files changed

+164
-66
lines changed

Src/PeasyAI/scripts/mcp_e2e_protocols.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,11 @@ def run_protocol_ensemble(
188188
return result
189189

190190

191-
def run_protocol(tools: Dict[str, Any], design_doc: str, out_root: Path, project_name: str) -> Dict[str, Any]:
191+
def run_protocol(tools: Dict[str, Any], design_doc: str, out_root: Path, project_name: str, ensemble_size: int = 3) -> Dict[str, Any]:
192192
"""
193-
Run a protocol end-to-end using the step-by-step flow (legacy).
194-
Kept for backward compatibility; prefer ``run_protocol_ensemble``.
193+
Run a protocol end-to-end using the step-by-step flow.
194+
Now uses ensemble generation (best-of-N) for each file by default.
195+
For the single-call ensemble flow, prefer ``run_protocol_ensemble``.
195196
"""
196197
result: Dict[str, Any] = {
197198
"project_name": project_name,
@@ -242,6 +243,7 @@ def run_protocol(tools: Dict[str, Any], design_doc: str, out_root: Path, project
242243
design_doc=design_doc,
243244
project_path=project_path,
244245
context_files=context_files,
246+
ensemble_size=ensemble_size,
245247
)
246248
)
247249
generated[f"machine:{machine_name}"] = machine_resp
@@ -255,6 +257,7 @@ def run_protocol(tools: Dict[str, Any], design_doc: str, out_root: Path, project
255257
design_doc=design_doc,
256258
project_path=project_path,
257259
context_files=context_files,
260+
ensemble_size=ensemble_size,
258261
)
259262
)
260263
generated["spec"] = spec_resp
@@ -266,6 +269,7 @@ def run_protocol(tools: Dict[str, Any], design_doc: str, out_root: Path, project
266269
design_doc=design_doc,
267270
project_path=project_path,
268271
context_files=context_files,
272+
ensemble_size=ensemble_size,
269273
)
270274
)
271275
generated["test"] = test_resp

Src/PeasyAI/src/core/workflow/factory.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ def create_full_generation_workflow(
6767
self,
6868
machine_names: List[str],
6969
spec_name: str = "Safety",
70-
test_name: str = "TestDriver"
70+
test_name: str = "TestDriver",
71+
ensemble_size: int = 3,
7172
) -> WorkflowDefinition:
7273
"""
7374
Create a full project generation workflow.
@@ -76,6 +77,7 @@ def create_full_generation_workflow(
7677
machine_names: List of machine names to generate
7778
spec_name: Name for the specification file
7879
test_name: Name for the test file
80+
ensemble_size: Number of candidates per file for ensemble selection
7981
8082
Returns:
8183
WorkflowDefinition ready for execution
@@ -88,12 +90,12 @@ def create_full_generation_workflow(
8890
# Add machine generation steps
8991
for machine_name in machine_names:
9092
steps.append(
91-
GenerateMachineStep(self.generation_service, machine_name)
93+
GenerateMachineStep(self.generation_service, machine_name, ensemble_size=ensemble_size)
9294
)
9395

9496
# Add spec and test
95-
steps.append(GenerateSpecStep(self.generation_service, spec_name))
96-
steps.append(GenerateTestStep(self.generation_service, test_name))
97+
steps.append(GenerateSpecStep(self.generation_service, spec_name, ensemble_size=ensemble_size))
98+
steps.append(GenerateTestStep(self.generation_service, test_name, ensemble_size=ensemble_size))
9799

98100
# Save files
99101
steps.append(SaveGeneratedFilesStep())
@@ -109,27 +111,27 @@ def create_full_generation_workflow(
109111
continue_on_failure=False
110112
)
111113

112-
def create_add_machine_workflow(self, machine_name: str) -> WorkflowDefinition:
114+
def create_add_machine_workflow(self, machine_name: str, ensemble_size: int = 3) -> WorkflowDefinition:
113115
"""Create workflow to add a single machine to existing project."""
114116
return WorkflowDefinition(
115117
name=f"add_machine_{machine_name}",
116118
description=f"Add {machine_name} machine to project",
117119
steps=[
118-
GenerateMachineStep(self.generation_service, machine_name),
120+
GenerateMachineStep(self.generation_service, machine_name, ensemble_size=ensemble_size),
119121
SaveGeneratedFilesStep(),
120122
CompileProjectStep(self.compilation_service),
121123
FixCompilationErrorsStep(self.fixer_service),
122124
],
123125
continue_on_failure=False
124126
)
125127

126-
def create_add_spec_workflow(self, spec_name: str) -> WorkflowDefinition:
128+
def create_add_spec_workflow(self, spec_name: str, ensemble_size: int = 3) -> WorkflowDefinition:
127129
"""Create workflow to add a specification to existing project."""
128130
return WorkflowDefinition(
129131
name=f"add_spec_{spec_name}",
130132
description=f"Add {spec_name} specification to project",
131133
steps=[
132-
GenerateSpecStep(self.generation_service, spec_name),
134+
GenerateSpecStep(self.generation_service, spec_name, ensemble_size=ensemble_size),
133135
SaveGeneratedFilesStep(),
134136
CompileProjectStep(self.compilation_service),
135137
FixCompilationErrorsStep(self.fixer_service),

Src/PeasyAI/src/core/workflow/p_steps.py

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,16 @@ class GenerateMachineStep(WorkflowStep):
120120
description = "Generate a P state machine implementation"
121121
max_retries = 3
122122

123-
def __init__(self, generation_service: GenerationService, machine_name: str):
123+
def __init__(self, generation_service: GenerationService, machine_name: str, ensemble_size: int = 3):
124124
self.service = generation_service
125125
self.machine_name = machine_name
126+
self.ensemble_size = ensemble_size
126127
self.name = f"generate_machine_{machine_name}"
127128

128129
def execute(self, context: Dict[str, Any]) -> StepResult:
129130
design_doc = context.get("design_doc")
130131
project_path = context.get("project_path")
132+
ensemble_size = context.get("ensemble_size", self.ensemble_size)
131133

132134
if not design_doc:
133135
return StepResult.failure("design_doc is required")
@@ -148,13 +150,23 @@ def execute(self, context: Dict[str, Any]) -> StepResult:
148150
context_files[machine_file] = value
149151

150152
try:
151-
result = self.service.generate_machine(
152-
machine_name=self.machine_name,
153-
design_doc=design_doc,
154-
project_path=project_path,
155-
context_files=context_files,
156-
save_to_disk=False # Preview mode
157-
)
153+
if ensemble_size > 1:
154+
result = self.service.generate_machine_ensemble(
155+
machine_name=self.machine_name,
156+
design_doc=design_doc,
157+
project_path=project_path,
158+
context_files=context_files,
159+
ensemble_size=ensemble_size,
160+
save_to_disk=False # Preview mode
161+
)
162+
else:
163+
result = self.service.generate_machine(
164+
machine_name=self.machine_name,
165+
design_doc=design_doc,
166+
project_path=project_path,
167+
context_files=context_files,
168+
save_to_disk=False # Preview mode
169+
)
158170

159171
if result.success:
160172
return StepResult.success(
@@ -185,14 +197,16 @@ class GenerateSpecStep(WorkflowStep):
185197
description = "Generate a P specification/monitor file"
186198
max_retries = 3
187199

188-
def __init__(self, generation_service: GenerationService, spec_name: str = "Safety"):
200+
def __init__(self, generation_service: GenerationService, spec_name: str = "Safety", ensemble_size: int = 3):
189201
self.service = generation_service
190202
self.spec_name = spec_name
203+
self.ensemble_size = ensemble_size
191204
self.name = f"generate_spec_{spec_name}"
192205

193206
def execute(self, context: Dict[str, Any]) -> StepResult:
194207
design_doc = context.get("design_doc")
195208
project_path = context.get("project_path")
209+
ensemble_size = context.get("ensemble_size", self.ensemble_size)
196210

197211
if not design_doc:
198212
return StepResult.failure("design_doc is required")
@@ -203,13 +217,23 @@ def execute(self, context: Dict[str, Any]) -> StepResult:
203217
context_files = self._collect_context_files(context, project_path)
204218

205219
try:
206-
result = self.service.generate_spec(
207-
spec_name=self.spec_name,
208-
design_doc=design_doc,
209-
project_path=project_path,
210-
context_files=context_files,
211-
save_to_disk=False
212-
)
220+
if ensemble_size > 1:
221+
result = self.service.generate_spec_ensemble(
222+
spec_name=self.spec_name,
223+
design_doc=design_doc,
224+
project_path=project_path,
225+
context_files=context_files,
226+
ensemble_size=ensemble_size,
227+
save_to_disk=False
228+
)
229+
else:
230+
result = self.service.generate_spec(
231+
spec_name=self.spec_name,
232+
design_doc=design_doc,
233+
project_path=project_path,
234+
context_files=context_files,
235+
save_to_disk=False
236+
)
213237

214238
if result.success:
215239
return StepResult.success(
@@ -265,14 +289,16 @@ class GenerateTestStep(WorkflowStep):
265289
description = "Generate a P test driver file"
266290
max_retries = 3
267291

268-
def __init__(self, generation_service: GenerationService, test_name: str = "TestDriver"):
292+
def __init__(self, generation_service: GenerationService, test_name: str = "TestDriver", ensemble_size: int = 3):
269293
self.service = generation_service
270294
self.test_name = test_name
295+
self.ensemble_size = ensemble_size
271296
self.name = f"generate_test_{test_name}"
272297

273298
def execute(self, context: Dict[str, Any]) -> StepResult:
274299
design_doc = context.get("design_doc")
275300
project_path = context.get("project_path")
301+
ensemble_size = context.get("ensemble_size", self.ensemble_size)
276302

277303
if not design_doc:
278304
return StepResult.failure("design_doc is required")
@@ -283,13 +309,23 @@ def execute(self, context: Dict[str, Any]) -> StepResult:
283309
context_files = self._collect_all_context(context, project_path)
284310

285311
try:
286-
result = self.service.generate_test(
287-
test_name=self.test_name,
288-
design_doc=design_doc,
289-
project_path=project_path,
290-
context_files=context_files,
291-
save_to_disk=False
292-
)
312+
if ensemble_size > 1:
313+
result = self.service.generate_test_ensemble(
314+
test_name=self.test_name,
315+
design_doc=design_doc,
316+
project_path=project_path,
317+
context_files=context_files,
318+
ensemble_size=ensemble_size,
319+
save_to_disk=False
320+
)
321+
else:
322+
result = self.service.generate_test(
323+
test_name=self.test_name,
324+
design_doc=design_doc,
325+
project_path=project_path,
326+
context_files=context_files,
327+
save_to_disk=False
328+
)
293329

294330
if result.success:
295331
return StepResult.success(

Src/PeasyAI/src/rag/create_rag_index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import faiss
1010
import numpy as np
1111
from sentence_transformers import SentenceTransformer
12-
from langchain.text_splitter import RecursiveCharacterTextSplitter
12+
from langchain_text_splitters import RecursiveCharacterTextSplitter
1313
import pickle
1414
import sys
1515
from datetime import datetime

0 commit comments

Comments
 (0)