diff --git a/src/main/java/com/olympus/hermione/controllers/ScenarioController.java b/src/main/java/com/olympus/hermione/controllers/ScenarioController.java index 549631a..1106674 100644 --- a/src/main/java/com/olympus/hermione/controllers/ScenarioController.java +++ b/src/main/java/com/olympus/hermione/controllers/ScenarioController.java @@ -5,16 +5,22 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; +import com.olympus.hermione.dto.ScenarioExecutionInput; +import com.olympus.hermione.dto.ScenarioOutput; import com.olympus.hermione.models.Scenario; import com.olympus.hermione.repository.ScenarioRepository; +import com.olympus.hermione.services.ScenarioExecutionService; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; @RestController public class ScenarioController { @Autowired ScenarioRepository scenarioRepository; + @Autowired + ScenarioExecutionService scenarioExecutionService; @GetMapping("/scenarios") public Iterable getScenarios() { @@ -25,4 +31,16 @@ public class ScenarioController { public Scenario createScenario(@RequestBody Scenario scenario) { return scenarioRepository.save(scenario); } + + @GetMapping("/scenarios/{id}") + public Scenario getScenario(@RequestParam String id) { + return scenarioRepository.findById(id).get(); + } + + @PostMapping("scenarios/execute") + public ScenarioOutput executeScenario(@RequestBody ScenarioExecutionInput scenarioExecutionInput) { + return scenarioExecutionService.executeScenario(scenarioExecutionInput); + } + + } diff --git a/src/main/java/com/olympus/hermione/dto/ScenarioExecutionInput.java b/src/main/java/com/olympus/hermione/dto/ScenarioExecutionInput.java new file mode 100644 index 0000000..67044ad --- /dev/null +++ b/src/main/java/com/olympus/hermione/dto/ScenarioExecutionInput.java @@ -0,0 +1,13 @@ +package com.olympus.hermione.dto; + +import java.util.HashMap; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ScenarioExecutionInput { + private String scenario_id; + private HashMap inputs; +} diff --git a/src/main/java/com/olympus/hermione/dto/ScenarioOutput.java b/src/main/java/com/olympus/hermione/dto/ScenarioOutput.java new file mode 100644 index 0000000..0b72dfe --- /dev/null +++ b/src/main/java/com/olympus/hermione/dto/ScenarioOutput.java @@ -0,0 +1,12 @@ +package com.olympus.hermione.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ScenarioOutput { + private String stringOutput; + private String status; + private String message; +} \ No newline at end of file diff --git a/src/main/java/com/olympus/hermione/models/Scenario.java b/src/main/java/com/olympus/hermione/models/Scenario.java index 878db4d..7631ab1 100644 --- a/src/main/java/com/olympus/hermione/models/Scenario.java +++ b/src/main/java/com/olympus/hermione/models/Scenario.java @@ -14,5 +14,6 @@ public class Scenario { @Id private String id; private String name; + private String description; private List steps; } diff --git a/src/main/java/com/olympus/hermione/services/ScenarioExecutionService.java b/src/main/java/com/olympus/hermione/services/ScenarioExecutionService.java index aa1f6d4..b6b1668 100644 --- a/src/main/java/com/olympus/hermione/services/ScenarioExecutionService.java +++ b/src/main/java/com/olympus/hermione/services/ScenarioExecutionService.java @@ -13,6 +13,8 @@ import org.springframework.ai.vectorstore.VectorStore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.olympus.hermione.dto.ScenarioExecutionInput; +import com.olympus.hermione.dto.ScenarioOutput; import com.olympus.hermione.models.Scenario; import com.olympus.hermione.models.ScenarioExecution; import com.olympus.hermione.models.ScenarioStep; @@ -74,6 +76,48 @@ public class ScenarioExecutionService { return ""; } + public ScenarioOutput executeScenario(ScenarioExecutionInput scenarioExecutionInput){ + + String scenarioId = scenarioExecutionInput.getScenario_id(); + HashMap inputs = scenarioExecutionInput.getInputs(); + ScenarioOutput scenarioOutput = new ScenarioOutput(); + + Optional o_scenario = scenarioRepository.findById(scenarioId); + + if(o_scenario.isPresent()){ + Scenario scenario = o_scenario.get(); + logger.info("Executing scenario: " + scenario.getName()); + + ScenarioExecution scenarioExecution = new ScenarioExecution(); + scenarioExecution.setScenario(scenario); + + HashMap execSharedMap = new HashMap(); + execSharedMap.put("user_input", inputs); + scenarioExecution.setExecSharedMap(execSharedMap); + scenarioExecutionRepository.save(scenarioExecution); + + List steps = scenario.getSteps(); + + steps.sort(Comparator.comparingInt(ScenarioStep::getOrder)); + for (ScenarioStep step : steps) { + executeScenarioStep(step, scenarioExecution, step.getOrder()); + } + + scenarioOutput.setStringOutput(scenarioExecution.getExecSharedMap().get("scenario_output").toString()); + scenarioOutput.setStatus("OK"); + return scenarioOutput; + + }else{ + logger.error("Scenario not found with id: " + scenarioId); + scenarioOutput.setStatus("ERROR"); + scenarioOutput.setMessage("Scenario not found"); + } + + return scenarioOutput; + } + + + private void executeScenarioStep(ScenarioStep step, ScenarioExecution scenarioExecution, int stepIndex){ logger.info("Executing step: " + step.getName()); StepSolver solver=new StepSolver(); @@ -99,5 +143,4 @@ public class ScenarioExecutionService { } - } diff --git a/src/main/java/com/olympus/hermione/stepSolvers/StepSolver.java b/src/main/java/com/olympus/hermione/stepSolvers/StepSolver.java index 2eb3349..5528746 100644 --- a/src/main/java/com/olympus/hermione/stepSolvers/StepSolver.java +++ b/src/main/java/com/olympus/hermione/stepSolvers/StepSolver.java @@ -15,7 +15,6 @@ import lombok.Setter; public class StepSolver { - protected ScenarioExecution scenarioExecution; protected ScenarioStep step; protected VectorStore vectorStore; @@ -31,5 +30,5 @@ public class StepSolver { this.vectorStore = vectorStore; this.chatModel = chatModel; System.out.println("Initializing StepSolver"); - }; + } } \ No newline at end of file diff --git a/src/main/java/com/olympus/hermione/stepSolvers/apollo.code-workspace b/src/main/java/com/olympus/hermione/stepSolvers/apollo.code-workspace new file mode 100644 index 0000000..4378d1e --- /dev/null +++ b/src/main/java/com/olympus/hermione/stepSolvers/apollo.code-workspace @@ -0,0 +1,16 @@ +{ + "folders": [ + { + "path": "../../../../../../../../apollo" + }, + { + "name": "hermione", + "path": "../../../../../../.." + }, + { + "name": "hermione-fe", + "path": "../../../../../../../../hermione-fe" + } + ], + "settings": {} +} \ No newline at end of file