From 495a9cd8a6d9f3c38718dcbbbd99b51db720dc41 Mon Sep 17 00:00:00 2001 From: Andrew Charneski Date: Sun, 21 Dec 2025 18:24:23 -0500 Subject: [PATCH 1/4] wip --- gradle.properties | 2 +- .../cognotik/agents/ParsedAgent.kt | 3 +- .../cognotik/agents/ParsedImageAgent.kt | 85 +++++++ .../simiacryptus/cognotik/plan/TaskType.kt | 3 + .../tools/file/GenerateSpriteSheetTask.kt | 210 ++++++++++++++++++ 5 files changed, 300 insertions(+), 3 deletions(-) create mode 100644 jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedImageAgent.kt create mode 100644 webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt diff --git a/gradle.properties b/gradle.properties index 6b00fb5a..5b97d796 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ pluginName=Cognotik - Open Source Agentic Power Tools pluginRepositoryUrl=https://github.com/SimiaCryptus/Cognotik libraryGroup=com.cognotik -libraryVersion=2.0.35 +libraryVersion=2.0.36 gradleVersion=8.13 org.gradle.caching=true org.gradle.configureondemand=false diff --git a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedAgent.kt b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedAgent.kt index 1c872064..de9d6ee8 100644 --- a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedAgent.kt +++ b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedAgent.kt @@ -191,5 +191,4 @@ inline fun Any.parserCast( model = model, parsingChatter = model, describer = describer -).getParser().apply(this.toJson()) - +).getParser().apply(this.toJson()) \ No newline at end of file diff --git a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedImageAgent.kt b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedImageAgent.kt new file mode 100644 index 00000000..e287c49a --- /dev/null +++ b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedImageAgent.kt @@ -0,0 +1,85 @@ +package com.simiacryptus.cognotik.agents + +import com.simiacryptus.cognotik.chat.model.ChatInterface +import com.simiacryptus.cognotik.describe.AbbrevWhitelistYamlDescriber +import com.simiacryptus.cognotik.describe.TypeDescriber +import com.simiacryptus.cognotik.models.ModelSchema +import com.simiacryptus.cognotik.util.JsonUtil +import com.simiacryptus.cognotik.util.LoggerFactory +import com.simiacryptus.cognotik.util.toContentList + +open class ParsedImageAgent( + var resultClass: Class? = null, + val exampleInstance: T? = resultClass?.getConstructor()?.newInstance(), + prompt: String = "", + name: String? = resultClass?.simpleName, + model: ChatInterface, + temperature: Double = 0.3, + val validation: Boolean = true, + open val describer: TypeDescriber = object : AbbrevWhitelistYamlDescriber( + "com.simiacryptus", "aicoder.actions" + ) { + override val includeMethods: Boolean get() = false + }, +) : BaseAgent, ParsedResponse>( + prompt = prompt, + name = name, + model = model, + temperature = temperature, +) { + init { + requireNotNull(resultClass) { + "Result class is required" + } + } + override fun chatMessages(questions: List) = arrayOf( + ModelSchema.ChatMessage( + role = ModelSchema.Role.system, + content = """ + $prompt + + Response should be in JSON format: + ${describer.describe(resultClass!!)} + """.trimIndent().toContentList() + ), + ModelSchema.ChatMessage( + role = ModelSchema.Role.user, + content = questions.flatMap { question -> + listOf( + ModelSchema.ContentPart( + text = question.text, + image_url = question.image?.let { "data:image/png;base64,${it.encodeImageToBase64()}" }, + ) + ) + } + ) + ) + private inner class ParsedResponseImpl(vararg messages: ModelSchema.ChatMessage) : + ParsedResponse(resultClass!!) { + override val text = + response(*messages).choices.firstOrNull()?.message?.content + ?: throw RuntimeException("No response") + private val _obj: T by lazy { JsonUtil.fromJson(text, resultClass!!) } + override val obj get() = _obj + } + override fun respond(input: List, vararg messages: ModelSchema.ChatMessage): ParsedResponse = + try { + ParsedResponseImpl(*messages) + } catch (e: Exception) { + log.info("Failed to parse response", e) + throw e + } + override fun withModel(model: ChatInterface): ParsedImageAgent = ParsedImageAgent( + resultClass = resultClass, + exampleInstance = exampleInstance, + prompt = prompt, + name = name, + model = model, + temperature = temperature, + validation = validation, + describer = describer, + ) + companion object { + private val log = LoggerFactory.getLogger(ParsedImageAgent::class.java) + } +} \ No newline at end of file diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/TaskType.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/TaskType.kt index 05d5a437..ec04d9e5 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/TaskType.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/TaskType.kt @@ -73,6 +73,9 @@ class TaskType( } register(taskType) } + registerConstructor(GenerateSpriteSheetTask.GenerateSpriteSheet) { settings, task -> + GenerateSpriteSheetTask(settings, task) + } registerConstructor(FunctorialMappingTask.FunctorialMapping) { settings, task -> FunctorialMappingTask(settings, task) } diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt new file mode 100644 index 00000000..3baf4586 --- /dev/null +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt @@ -0,0 +1,210 @@ +package com.simiacryptus.cognotik.plan.tools.file + +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.simiacryptus.cognotik.agents.ImageAndText +import com.simiacryptus.cognotik.agents.ImageProcessingAgent +import com.simiacryptus.cognotik.agents.ParsedImageAgent +import com.simiacryptus.cognotik.describe.Description +import com.simiacryptus.cognotik.plan.OrchestrationConfig +import com.simiacryptus.cognotik.plan.TaskOrchestrator +import com.simiacryptus.cognotik.plan.TaskType +import com.simiacryptus.cognotik.plan.TaskTypeConfig +import com.simiacryptus.cognotik.util.LoggerFactory +import com.simiacryptus.cognotik.util.MarkdownUtil +import com.simiacryptus.cognotik.util.ValidatedObject +import com.simiacryptus.cognotik.webui.session.SessionTask +import com.simiacryptus.cognotik.webui.session.SocketManager +import org.slf4j.Logger +import java.io.File +import javax.imageio.ImageIO + +class GenerateSpriteSheetTask( + orchestrationConfig: OrchestrationConfig, + planTask: GenerateSpriteSheetTaskExecutionConfigData? +) : AbstractFileTask( + orchestrationConfig, + planTask +) { + + class GenerateSpriteSheetTaskExecutionConfigData( + @Description("The sprite sheet image file to be created (relative path, must end with .png)") + files: List? = null, + @Description("The JSON metadata file to be created (relative path, must end with .json)") + val metadata_file: String? = null, + @Description("Detailed description of the sprites to generate (e.g., 'A pixel art warrior walking animation, 4 frames, side view')") + task_description: String? = null, + task_dependencies: List? = null, + state: TaskState? = TaskState.Pending, + ) : ValidatedObject, FileTaskExecutionConfig( + task_type = GenerateSpriteSheet.name, + task_description = task_description, + files = files, + task_dependencies = task_dependencies, + state = state + ) { + override fun validate(): String? { + if (files.isNullOrEmpty()) return "Sprite sheet image file must be specified" + if (metadata_file.isNullOrBlank()) return "Metadata JSON file must be specified" + if (!files.first().endsWith(".png", ignoreCase = true)) return "Image file must be .png" + if (!metadata_file.endsWith(".json", ignoreCase = true)) return "Metadata file must be .json" + return ValidatedObject.validateFields(this) + } + } + + data class SpriteLocation( + @Description("Name or tag of the specific sprite") + val name: String = "", + @Description("X coordinate of the top-left corner") + val x: Int = 0, + @Description("Y coordinate of the top-left corner") + val y: Int = 0, + @Description("Width of the sprite") + val width: Int = 0, + @Description("Height of the sprite") + val height: Int = 0 + ) + + data class SpriteSheetMetadata( + @Description("List of sprites identified in the sheet") + val sprites: List = emptyList(), + @Description("General description of the sprite sheet content") + val description: String = "" + ) + + override fun promptSegment(): String { + return """ +GenerateSpriteSheet - Create a sprite sheet image and corresponding JSON metadata + * Generates an image containing multiple sprites based on a description + * Automatically identifies sprite locations (x, y, width, height) + * Outputs both a .png image and a .json metadata file + """.trimIndent() + } + + override fun run( + agent: TaskOrchestrator, + messages: List, + task: SessionTask, + resultFn: (String) -> Unit, + orchestrationConfig: OrchestrationConfig + ) { + val imageFile = executionConfig?.files?.firstOrNull() ?: return resultFn("No image file specified") + val metadataFile = executionConfig?.metadata_file ?: return resultFn("No metadata file specified") + val description = executionConfig?.task_description ?: "Generate a sprite sheet" + + task.add(MarkdownUtil.renderMarkdown("## Generating Sprite Sheet: `$imageFile`", ui = task.ui)) + + try { + // Step 1: Generate the Image + task.add(MarkdownUtil.renderMarkdown("### Step 1: Drawing Sprites...", ui = task.ui)) + + val imageGenPrompt = """ + Create a sprite sheet based on this description: $description. + Requirements: + - Arrange sprites in a grid or logical layout. + - Use a solid, contrasting background color (e.g., magenta or bright green) to make separation easy. + - Ensure sprites do not overlap. + - Maintain consistent style and scale. + """.trimIndent() + + val imageAgent = ImageProcessingAgent( + prompt = "You are a pixel artist and game asset designer.", + name = "SpriteGenerator", + model = orchestrationConfig.imageChatChatter, + ) + + val imageResult = imageAgent.answer(listOf(ImageAndText(imageGenPrompt))) + val generatedImage = imageResult.image ?: throw RuntimeException("Failed to generate image") + + // Save Image + val imageOutputPath = root.resolve(imageFile) + imageOutputPath.toFile().parentFile?.mkdirs() + ImageIO.write(generatedImage, "png", imageOutputPath.toFile()) + + val imageLink = task.linkTo(imageFile) + task.add("""""") + + // Step 2: Parse Metadata + task.add(MarkdownUtil.renderMarkdown("### Step 2: Analyzing Sprite Locations...", ui = task.ui)) + + val parserAgent = ParsedImageAgent( + resultClass = SpriteSheetMetadata::class.java, + model = orchestrationConfig.defaultChatter, // Vision model to see the sprites + prompt = """ + Identify all distinct sprites in this image. + For each sprite, provide: + 1. A descriptive name (e.g., 'walk_frame_1', 'idle_stand'). + 2. The exact bounding box (x, y, width, height). + Ignore the background color. + """.trimIndent() + ) + + val parseResult = parserAgent.answer( + listOf( + ImageAndText( + text = "Extract sprite metadata from this image.", + image = generatedImage + ) + ) + ) + + val metadata = parseResult.obj + + // Save Metadata + val jsonOutputPath = root.resolve(metadataFile) + val mapper = jacksonObjectMapper().writerWithDefaultPrettyPrinter() + jsonOutputPath.toFile().writeText(mapper.writeValueAsString(metadata)) + + // Display Results + val metadataLink = task.linkTo(metadataFile) + val summary = """ + ### Complete + - Image saved to: $imageFile + - Metadata saved to: $metadataFile + - Identified ${metadata.sprites.size} sprites. + """.trimIndent() + + task.add(MarkdownUtil.renderMarkdown(summary, ui = task.ui)) + + // Visualize boxes on the UI (Optional visualization) + val tableRows = metadata.sprites.joinToString("\n") { + "| ${it.name} | ${it.x}, ${it.y} | ${it.width}x${it.height} |" + } + task.add(MarkdownUtil.renderMarkdown(""" + | Name | Position | Size | + |------|----------|------| + $tableRows + """.trimIndent(), ui = task.ui)) + + task.complete("Generated sprite sheet with ${metadata.sprites.size} sprites") + resultFn("Generated sprite sheet: $imageFile and $metadataFile") + + } catch (e: Exception) { + log.error("Error generating sprite sheet", e) + task.error(e) + resultFn("ERROR: ${e.message}") + } + } + + override fun acceptButtonFooter(ui: SocketManager, fn: () -> Unit): String { + return ui.hrefLink("Accept Sprite Sheet") { fn() } + } + + companion object { + private val log: Logger = LoggerFactory.getLogger(GenerateSpriteSheetTask::class.java) + val GenerateSpriteSheet = TaskType( + "GenerateSpriteSheet", + "Writing", + GenerateSpriteSheetTaskExecutionConfigData::class.java, + TaskTypeConfig::class.java, + "Generate a sprite sheet and associated JSON metadata", + """ + Creates game assets by generating a sprite sheet image and extracting coordinate data. +
    +
  • Generates visual sprite sheet using AI image models
  • +
  • Analyzes the generated image to find sprite bounding boxes
  • +
  • Exports standard JSON metadata for game engine integration
  • +
+ """ + ) + } +} \ No newline at end of file From 4e3edece8437d8fa2a0cf242ed861f1e33999f23 Mon Sep 17 00:00:00 2001 From: Andrew Charneski Date: Mon, 22 Dec 2025 12:18:19 -0500 Subject: [PATCH 2/4] wip --- .../cognotik/plan/AbstractTask.kt | 7 +++++++ .../cognotik/plan/tools/RunCodeTask.kt | 2 +- .../cognotik/plan/tools/SelfHealingTask.kt | 4 ++-- .../cognotik/plan/tools/SubPlanningTask.kt | 2 +- .../cognotik/plan/tools/file/AnalysisTask.kt | 2 +- .../plan/tools/file/DataIngestTask.kt | 4 ++-- .../plan/tools/file/FileModificationTask.kt | 2 +- .../tools/file/GeneratePresentationTask.kt | 2 +- .../tools/file/GenerateSpriteSheetTask.kt | 5 +++-- .../plan/tools/file/IllustrateDocumentTask.kt | 4 ++-- .../cognotik/plan/tools/file/WriteHtmlTask.kt | 2 +- .../plan/tools/games/GameEconomyTask.kt | 4 ++-- .../plan/tools/games/GameLevelDesignTask.kt | 12 +++++------ .../tools/games/GameMechanicsDesignTask.kt | 10 +++++----- .../tools/games/GameNarrativeDesignTask.kt | 8 ++++---- .../tools/graph/DataTableCompilationTask.kt | 8 ++++---- .../graph/SoftwareGraphGenerationTask.kt | 4 ++-- .../graph/SoftwareGraphModificationTask.kt | 4 ++-- .../plan/tools/online/CrawlerAgentTask.kt | 2 +- .../DataTableAccumulationStrategy.kt | 6 +++--- .../processing/DefaultSummarizerStrategy.kt | 4 ++-- .../online/processing/FactCheckingStrategy.kt | 6 +++--- .../online/processing/JobMatchingStrategy.kt | 2 +- .../processing/SchemaExtractionStrategy.kt | 6 +++--- .../tools/reasoning/AbductiveReasoningTask.kt | 6 +++--- .../tools/reasoning/AbstractionLadderTask.kt | 2 +- .../reasoning/AdversarialReasoningTask.kt | 2 +- .../reasoning/AnalogicalReasoningTask.kt | 4 ++-- .../plan/tools/reasoning/BrainstormingTask.kt | 4 ++-- .../tools/reasoning/CausalInferenceTask.kt | 2 +- .../tools/reasoning/ChainOfThoughtTask.kt | 6 +++--- .../reasoning/ConstraintRelaxationTask.kt | 2 +- .../reasoning/ConstraintSatisfactionTask.kt | 2 +- .../reasoning/CounterfactualAnalysisTask.kt | 2 +- .../plan/tools/reasoning/DecisionTreeTask.kt | 2 +- .../reasoning/DecompositionSynthesisTask.kt | 4 ++-- .../tools/reasoning/FiniteStateMachineTask.kt | 2 +- .../tools/reasoning/FunctorialMappingTask.kt | 2 +- .../reasoning/GeneticOptimizationTask.kt | 4 ++-- .../reasoning/IsomorphismDiscoveryTask.kt | 2 +- .../tools/reasoning/LateralThinkingTask.kt | 6 +++--- .../reasoning/MathematicalReasoningTask.kt | 2 +- .../reasoning/MetaCognitiveReflectionTask.kt | 2 +- .../tools/reasoning/NeuralNetworkLayerTask.kt | 2 +- .../reasoning/ProbabilisticReasoningTask.kt | 2 +- .../tools/reasoning/SocraticDialogueTask.kt | 2 +- .../StructuralInvariantAnalysisTask.kt | 2 +- .../tools/reasoning/SystemsThinkingTask.kt | 2 +- .../tools/reasoning/TableCompilationTask.kt | 2 +- .../tools/reasoning/TemporalReasoningTask.kt | 4 ++-- .../plan/tools/session/RunShellCommandTask.kt | 2 +- .../tools/social/DialecticalReasoningTask.kt | 2 +- .../plan/tools/social/EthicalReasoningTask.kt | 2 +- .../plan/tools/social/GameTheoryTask.kt | 4 ++-- .../plan/tools/social/LLMExperimentTask.kt | 2 +- .../tools/social/LLMPollSimulationTask.kt | 2 +- .../social/MultiPerspectiveAnalysisTask.kt | 2 +- .../plan/tools/social/PersuasiveEssayTask.kt | 12 +++++------ .../tools/social/PoliticalOptimizationTask.kt | 4 ++-- .../tools/writing/ArticleGenerationTask.kt | 8 ++++---- .../tools/writing/BusinessProposalTask.kt | 20 +++++++++---------- .../tools/writing/ComicBookGenerationTask.kt | 2 +- .../plan/tools/writing/EmailCampaignTask.kt | 12 +++++------ .../tools/writing/InteractiveStoryTask.kt | 6 +++--- .../tools/writing/JournalismReasoningTask.kt | 14 ++++++------- .../tools/writing/NarrativeGenerationTask.kt | 4 ++-- .../tools/writing/ReportGenerationTask.kt | 12 +++++------ .../writing/ResearchPaperGenerationTask.kt | 10 +++++----- .../plan/tools/writing/ScriptwritingTask.kt | 10 +++++----- .../writing/SoftwareDesignDocumentTask.kt | 2 +- .../tools/writing/TechnicalExplanationTask.kt | 6 +++--- .../tools/writing/TutorialGenerationTask.kt | 10 +++++----- 72 files changed, 171 insertions(+), 163 deletions(-) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/AbstractTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/AbstractTask.kt index 3ab5ec99..20776b79 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/AbstractTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/AbstractTask.kt @@ -1,5 +1,6 @@ package com.simiacryptus.cognotik.plan +import com.simiacryptus.cognotik.chat.model.ChatInterface import com.simiacryptus.cognotik.input.getDocumentReader import com.simiacryptus.cognotik.input.isDocumentFile import com.simiacryptus.cognotik.util.FileSelectionUtils @@ -26,6 +27,12 @@ abstract class AbstractTask( get() = executionConfig?.task_type ?.let { task_type -> orchestrationConfig.taskSettings.values.firstOrNull { it.task_type == task_type } as? U } + open val defaultChatter: ChatInterface + get() = typeConfig?.model?.let { orchestrationConfig.instance(it) } ?: orchestrationConfig.defaultChatter + + open val parsingChatter: ChatInterface + get() = orchestrationConfig.parsingChatter + enum class TaskState { Pending, InProgress, diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/RunCodeTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/RunCodeTask.kt index a5202649..70f1aaa3 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/RunCodeTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/RunCodeTask.kt @@ -69,7 +69,7 @@ class RunCodeTask( val semaphore = Semaphore(0) val typeConfig = typeConfig ?: throw RuntimeException() val model = (typeConfig.model?.let { orchestrationConfig.instance(it) } - ?: orchestrationConfig.defaultChatter).getChildClient(task) + ?: defaultChatter).getChildClient(task) // val taskSettings = this.orchestrationConfig.getTaskSettings(TaskType.RunCodeTask) val taskSettings = typeConfig as? RunCodeTaskTypeConfig diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/SelfHealingTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/SelfHealingTask.kt index 1e8dc9a8..4b6afdc5 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/SelfHealingTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/SelfHealingTask.kt @@ -111,7 +111,7 @@ class SelfHealingTask( val task = task.ui.newTask() task.ui.pool.submit { val model = (typeConfig.model?.let { orchestrationConfig.instance(it) } - ?: orchestrationConfig.defaultChatter).getChildClient(task) + ?: defaultChatter).getChildClient(task) CmdPatchApp( root = agent.root, settings = PatchApp.Settings( @@ -140,7 +140,7 @@ class SelfHealingTask( ), files = agent.files, model = model, - parsingModel = orchestrationConfig.parsingChatter, + parsingModel = parsingChatter, processor = orchestrationConfig.processor, ).also { app -> markdownTranscript?.let { transcript -> diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/SubPlanningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/SubPlanningTask.kt index d963bfd3..02f4ceb7 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/SubPlanningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/SubPlanningTask.kt @@ -252,7 +252,7 @@ class SubPlanningTask( // Use an agent to create a summary val typeConfig = typeConfig ?: throw RuntimeException() val model = (typeConfig.model?.let { orchestrationConfig.instance(it) } - ?: orchestrationConfig.defaultChatter).getChildClient(task) + ?: defaultChatter).getChildClient(task) val summaryAgent = ChatAgent( prompt = """ diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/AnalysisTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/AnalysisTask.kt index 6ce218f4..25e9cddd 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/AnalysisTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/AnalysisTask.kt @@ -100,7 +100,7 @@ class AnalysisTask( Ensure the information is accurate, up-to-date, and well-organized to facilitate easy understanding. """.trimIndent(), model = (typeConfig.model?.let { this.orchestrationConfig.instance(it) } - ?: this.orchestrationConfig.defaultChatter).getChildClient(task), + ?: defaultChatter).getChildClient(task), temperature = this.orchestrationConfig.temperature, ) val inquiryResult = if (orchestrationConfig.autoFix || typeConfig.non_interactive) { diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/DataIngestTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/DataIngestTask.kt index 8f026c6e..7a9485e8 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/DataIngestTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/DataIngestTask.kt @@ -128,8 +128,8 @@ DataIngest - Parse unstructured logs/text into structured data log("## Phase 2: Pattern Discovery") val registry = mutableListOf() val unparsedSample = sampleLines.toMutableList() - val parsingChatter = orchestrationConfig.parsingChatter.getChildClient(task) - val defaultChatter = orchestrationConfig.defaultChatter.getChildClient(task) + val parsingChatter = parsingChatter.getChildClient(task) + val defaultChatter = defaultChatter.getChildClient(task) val discoveryTask = task.ui.newTask(false) tabs["Discovery"] = discoveryTask.placeholder diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/FileModificationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/FileModificationTask.kt index 8841ddf0..7f786fbf 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/FileModificationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/FileModificationTask.kt @@ -89,7 +89,7 @@ ${ task.ui.pool.submit { val chatInterface = (typeConfig.model?.let { this.orchestrationConfig.instance(it) } - ?: this.orchestrationConfig.defaultChatter).getChildClient(task) + ?: this.defaultChatter).getChildClient(task) val chatAgent = ChatAgent( name = "FileModification", prompt = """ diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GeneratePresentationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GeneratePresentationTask.kt index 49d4b1b2..5239a883 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GeneratePresentationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GeneratePresentationTask.kt @@ -129,7 +129,7 @@ class GeneratePresentationTask( val newTask = task.ui.newTask(false) val toInput = { it: String -> listOf(it) } val ui = task.ui - val api = orchestrationConfig.defaultChatter + val api = defaultChatter newTask.add(MarkdownUtil.renderMarkdown("## Creating Presentation: `$htmlFile`", ui = ui)) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt index 3baf4586..b42a423a 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt @@ -14,6 +14,7 @@ import com.simiacryptus.cognotik.util.MarkdownUtil import com.simiacryptus.cognotik.util.ValidatedObject import com.simiacryptus.cognotik.webui.session.SessionTask import com.simiacryptus.cognotik.webui.session.SocketManager +import com.simiacryptus.cognotik.webui.session.getChildClient import org.slf4j.Logger import java.io.File import javax.imageio.ImageIO @@ -109,7 +110,7 @@ GenerateSpriteSheet - Create a sprite sheet image and corresponding JSON metadat val imageAgent = ImageProcessingAgent( prompt = "You are a pixel artist and game asset designer.", name = "SpriteGenerator", - model = orchestrationConfig.imageChatChatter, + model = orchestrationConfig.imageChatChatter.getChildClient(task), ) val imageResult = imageAgent.answer(listOf(ImageAndText(imageGenPrompt))) @@ -128,7 +129,7 @@ GenerateSpriteSheet - Create a sprite sheet image and corresponding JSON metadat val parserAgent = ParsedImageAgent( resultClass = SpriteSheetMetadata::class.java, - model = orchestrationConfig.defaultChatter, // Vision model to see the sprites + model = (typeConfig?.model?.let { orchestrationConfig.instance(it) } ?: defaultChatter).getChildClient(task), prompt = """ Identify all distinct sprites in this image. For each sprite, provide: diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/IllustrateDocumentTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/IllustrateDocumentTask.kt index 57b56b9d..082a8ca7 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/IllustrateDocumentTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/IllustrateDocumentTask.kt @@ -181,8 +181,8 @@ IllustrateDocument - Analyze a document and generate images to enhance its conte documentContent, maxImages, isMarkdown, executionConfig.composerDirective ) - val api = orchestrationConfig.defaultChatter ?: return - val parsingChatter = orchestrationConfig.parsingChatter.getChildClient(task) + val api = defaultChatter ?: return + val parsingChatter = parsingChatter.getChildClient(task) val defaultChatter = api.getChildClient(task) val analysisAgent = ParsedAgent( diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/WriteHtmlTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/WriteHtmlTask.kt index 141585a1..4cd19552 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/WriteHtmlTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/WriteHtmlTask.kt @@ -131,7 +131,7 @@ WriteHtml - Create a complete HTML file with embedded CSS and JavaScript val toInput = { it: String -> listOf(it) } val ui = task.ui - val api = orchestrationConfig.defaultChatter.getChildClient(task) + val api = defaultChatter.getChildClient(task) newTask.add(MarkdownUtil.renderMarkdown("## Creating HTML File: `$htmlFile`", ui = ui)) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameEconomyTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameEconomyTask.kt index 546e476c..aa8828d6 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameEconomyTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameEconomyTask.kt @@ -262,7 +262,7 @@ GameEconomy - Design complete game economic systems with progression and monetiz } val ui = task.ui - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val transcript = transcript(task) // Create tabbed display for organized output @@ -865,7 +865,7 @@ Provide this in a clear, structured format suitable for game designers and stake prompt = summaryPrompt, model = api, temperature = 0.2, - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val gameEconomy = parsedAgent.answer(toInput(summaryPrompt)).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameLevelDesignTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameLevelDesignTask.kt index d1bada87..283e5328 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameLevelDesignTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameLevelDesignTask.kt @@ -378,7 +378,7 @@ class GameLevelDesignTask( return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -522,7 +522,7 @@ Keep zone descriptions brief - detailed content will be added later. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var level = structureAgent.answer(listOf("Create level structure")).obj @@ -648,7 +648,7 @@ Return the complete level with all encounters filled in. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) level = encounterAgent.answer(listOf("Design encounters")).obj @@ -759,7 +759,7 @@ Return the complete level with pacing_curve filled in. """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) level = pacingAgent.answer(listOf("Analyze pacing")).obj @@ -865,7 +865,7 @@ Return the complete level with collectibles and secrets filled in. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) level = collectiblesAgent.answer(listOf("Add collectibles and secrets")).obj @@ -960,7 +960,7 @@ Create comprehensive guidance that helps without patronizing. """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val guidance = guidanceAgent.answer(listOf("Design player guidance")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameMechanicsDesignTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameMechanicsDesignTask.kt index 47fc416d..d3e151cc 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameMechanicsDesignTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameMechanicsDesignTask.kt @@ -363,7 +363,7 @@ GameMechanicsDesign - Generate comprehensive game mechanics with balance analysi return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val ui = task.ui val tabs = TabbedDisplay(task) @@ -502,7 +502,7 @@ GameMechanicsDesign - Generate comprehensive game mechanics with balance analysi model = api, temperature = 0.7, name = "MechanicsGenerator", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val mechanics = mechanicsParser.answer(listOf(mechanicsPrompt.toString())).obj.mechanics @@ -594,7 +594,7 @@ GameMechanicsDesign - Generate comprehensive game mechanics with balance analysi model = api, temperature = 0.6, name = "InteractionAnalyzer", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val interactions = interactionsParser.answer(listOf(interactionsPrompt.toString())).obj.interactions @@ -732,7 +732,7 @@ GameMechanicsDesign - Generate comprehensive game mechanics with balance analysi model = api, temperature = 0.6, name = "ProgressionDesigner", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val progression = progressionParser.answer(listOf(progressionPrompt.toString())).obj.levels @@ -868,7 +868,7 @@ GameMechanicsDesign - Generate comprehensive game mechanics with balance analysi model = api, temperature = 0.6, name = "EconomyDesigner", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val economy = economyParser.answer(listOf(economyPrompt.toString())).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameNarrativeDesignTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameNarrativeDesignTask.kt index bd57d0cc..67514c70 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameNarrativeDesignTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/games/GameNarrativeDesignTask.kt @@ -406,7 +406,7 @@ GameNarrativeDesign - Create interactive game narratives with branching storylin return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) val transcript = createTranscript(task, gameTitle) @@ -534,7 +534,7 @@ Ensure the structure supports ${gameConfig.player_agency_level} player agency wi """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val gameNarrative = gameStructureAgent.answer(listOf("Generate game structure")).obj @@ -759,7 +759,7 @@ Ensure each character's dialogue matches their established style. """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val dialogueTrees = dialogueAgent.answer(listOf("Generate dialogue trees")).obj.trees @@ -938,7 +938,7 @@ Make quests feel meaningful, not just filler content. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val sideQuests = sideQuestAgent.answer(listOf("Generate side quests")).obj.quests diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/DataTableCompilationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/DataTableCompilationTask.kt index 30bf23b5..3e0a7118 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/DataTableCompilationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/DataTableCompilationTask.kt @@ -122,7 +122,7 @@ class DataTableCompilationTask( val typeConfig = typeConfig ?: throw RuntimeException() val chatter = (typeConfig.model?.let { orchestrationConfig.instance(it) } - ?: orchestrationConfig.defaultChatter).getChildClient(task) + ?: defaultChatter).getChildClient(task) val columnsResponse = ParsedAgent( name = "ColumnIdentifier", resultClass = Columns::class.java, @@ -154,7 +154,7 @@ class DataTableCompilationTask( 2. Provide a detailed description of what the column represents """.trimIndent(), model = chatter, - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, temperature = orchestrationConfig.temperature, describer = TaskContextYamlDescriber(orchestrationConfig), ).answer( @@ -206,7 +206,7 @@ class DataTableCompilationTask( 2. List the source files that contain data for this row """.trimIndent(), model = chatter, - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, temperature = orchestrationConfig.temperature, describer = TaskContextYamlDescriber(orchestrationConfig), ).answer( @@ -256,7 +256,7 @@ class DataTableCompilationTask( "Special Instructions:\n${executionConfig?.cell_extraction_instructions}\n\n" + "IMPORTANT: Respond with ONLY the single JSON object for the row `${row.id}`. Do NOT return a JSON array.", model = chatter, - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, temperature = orchestrationConfig.temperature, describer = TaskContextYamlDescriber(orchestrationConfig), ).answer( diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/SoftwareGraphGenerationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/SoftwareGraphGenerationTask.kt index 8203de94..192672ed 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/SoftwareGraphGenerationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/SoftwareGraphGenerationTask.kt @@ -103,8 +103,8 @@ class SoftwareGraphGenerationTask( }" } + "\n\nGenerate appropriate NodeId values for each node.\nEnsure all relationships between nodes are properly established.\nFormat the response as a valid SoftwareGraph JSON structure.", model = (typeConfig.model?.let { this.orchestrationConfig.instance(it) } - ?: this.orchestrationConfig.defaultChatter).getChildClient(task), - parsingChatter = this.orchestrationConfig.parsingChatter, + ?: this.defaultChatter).getChildClient(task), + parsingChatter = this.parsingChatter, temperature = this.orchestrationConfig.temperature, describer = describer, ) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/SoftwareGraphModificationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/SoftwareGraphModificationTask.kt index 64bc5cff..1f5afb0e 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/SoftwareGraphModificationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/graph/SoftwareGraphModificationTask.kt @@ -86,8 +86,8 @@ class SoftwareGraphModificationTask( .joinToString("\n") }, model = (typeConfig.model?.let { orchestrationConfig.instance(it) } - ?: orchestrationConfig.defaultChatter).getChildClient(task), - parsingChatter = orchestrationConfig.parsingChatter, + ?: defaultChatter).getChildClient(task), + parsingChatter = parsingChatter, temperature = orchestrationConfig.temperature, describer = TaskContextYamlDescriber(orchestrationConfig), ) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/CrawlerAgentTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/CrawlerAgentTask.kt index b9fda7f1..347760fe 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/CrawlerAgentTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/CrawlerAgentTask.kt @@ -236,7 +236,7 @@ class CrawlerAgentTask( } else null val chatInterface = ( typeConfig?.model?.let { this@CrawlerAgentTask.orchestrationConfig.instance(it) } - ?: this@CrawlerAgentTask.orchestrationConfig.parsingChatter + ?: this@CrawlerAgentTask.parsingChatter ).getChildClient(task) resultFn(innerRun(agent, messages, task, orchestrationConfig, transcriptStream, chatInterface)) } catch (e: Throwable) { diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DataTableAccumulationStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DataTableAccumulationStrategy.kt index 616f0397..87980b22 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DataTableAccumulationStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DataTableAccumulationStrategy.kt @@ -82,7 +82,7 @@ class DataTableAccumulationStrategy : DefaultSummarizerStrategy() { log.debug("Processing page for data table accumulation: $url") val config = try { - val chatInterface = context.orchestrationConfig.parsingChatter.getChildClient(context.task) + val chatInterface = context.parsingChatter.getChildClient(context.task) context.executionConfig.content_queries?.let { queries -> queries.parserCast(chatInterface) } ?: run { @@ -217,7 +217,7 @@ class DataTableAccumulationStrategy : DefaultSummarizerStrategy() { } val model = (context.typeConfig.model?.let { context.orchestrationConfig.instance(it) } - ?: context.orchestrationConfig.parsingChatter).getChildClient(context.task) + ?: context.parsingChatter).getChildClient(context.task) val result = ParsedAgent( prompt = prompt, @@ -408,7 +408,7 @@ class DataTableAccumulationStrategy : DefaultSummarizerStrategy() { val config = try { context.executionConfig.content_queries?.let { queries -> - queries.parserCast(context.orchestrationConfig.parsingChatter.getChildClient(context.task)) + queries.parserCast(context.parsingChatter.getChildClient(context.task)) } ?: DataTableConfig() } catch (e: Exception) { log.error("Failed to parse config for final output", e) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DefaultSummarizerStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DefaultSummarizerStrategy.kt index c3aeceb4..8af6ed46 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DefaultSummarizerStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DefaultSummarizerStrategy.kt @@ -95,7 +95,7 @@ open class DefaultSummarizerStrategy : PageProcessingStrategy { "Keep your response under ${maxFinalOutputSize / 1000}K characters." ).joinToString("\n\n"), model = (context.typeConfig.model?.let { context.orchestrationConfig.instance(it) } - ?: context.orchestrationConfig.parsingChatter).getChildClient(context.task), + ?: context.parsingChatter).getChildClient(context.task), ).answer( listOf("Here are summaries of each analyzed page:\n${analysisResults}"), ) @@ -138,7 +138,7 @@ open class DefaultSummarizerStrategy : PageProcessingStrategy { ): ParsedResponse { return try { val model = (context.typeConfig.model?.let { context.orchestrationConfig.instance(it) } - ?: context.orchestrationConfig.parsingChatter).getChildClient(context.task) + ?: context.parsingChatter).getChildClient(context.task) ParsedAgent( prompt = listOf( "Below are analyses of different parts of a web page related to this goal: $analysisGoal", diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/FactCheckingStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/FactCheckingStrategy.kt index e717092a..dda3addd 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/FactCheckingStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/FactCheckingStrategy.kt @@ -63,7 +63,7 @@ class FactCheckingStrategy : PageProcessingStrategy { context: PageProcessingStrategy.ProcessingContext ): PageProcessingStrategy.PageProcessingResult { val config = - context.executionConfig.content_queries?.parserCast(context.orchestrationConfig.parsingChatter) + context.executionConfig.content_queries?.parserCast(context.parsingChatter) ?: return PageProcessingStrategy.PageProcessingResult( url = url, pageType = CrawlerAgentTask.PageType.Error, @@ -174,8 +174,8 @@ class FactCheckingStrategy : PageProcessingStrategy { val analysis = ParsedAgent( prompt = prompt, resultClass = FactCheckResult::class.java, - model = context.orchestrationConfig.parsingChatter.getChildClient(context.task), - parsingChatter = context.orchestrationConfig.parsingChatter.getChildClient(context.task) + model = context.parsingChatter.getChildClient(context.task), + parsingChatter = context.parsingChatter.getChildClient(context.task) ).answer(listOf(content)) return analysis.obj.copy( diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/JobMatchingStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/JobMatchingStrategy.kt index 13ef805c..689083bb 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/JobMatchingStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/JobMatchingStrategy.kt @@ -144,7 +144,7 @@ class JobMatchingStrategy : DefaultSummarizerStrategy() { context: PageProcessingStrategy.ProcessingContext ) = try { log.debug("Processing page: $url") - val chatInterface = context.orchestrationConfig.parsingChatter.getChildClient(context.task) + val chatInterface = context.parsingChatter.getChildClient(context.task) val config = context.executionConfig.content_queries?.parserCast(chatInterface) ?: run { val errorMsg = "Missing JobMatchingConfig for job matching strategy" diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/SchemaExtractionStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/SchemaExtractionStrategy.kt index 90a30782..5b7c0c4d 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/SchemaExtractionStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/SchemaExtractionStrategy.kt @@ -65,7 +65,7 @@ class SchemaExtractionStrategy : DefaultSummarizerStrategy() { val config = try { context.executionConfig.content_queries?.let { queries -> queries.parserCast( - context.orchestrationConfig.parsingChatter.getChildClient( + context.parsingChatter.getChildClient( context.task ) ) @@ -196,7 +196,7 @@ class SchemaExtractionStrategy : DefaultSummarizerStrategy() { } val model = (context.typeConfig.model?.let { context.orchestrationConfig.instance(it) } - ?: context.orchestrationConfig.parsingChatter).getChildClient(context.task) + ?: context.parsingChatter).getChildClient(context.task) return ParsedAgent( prompt = prompt, @@ -268,7 +268,7 @@ class SchemaExtractionStrategy : DefaultSummarizerStrategy() { ): String { log.info("Generating final aggregated output") val config = try { - val chatInterface = context.orchestrationConfig.parsingChatter.getChildClient(context.task) + val chatInterface = context.parsingChatter.getChildClient(context.task) context.executionConfig.content_queries?.parserCast(chatInterface) ?: SchemaExtractionConfig() } catch (e: Exception) { diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AbductiveReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AbductiveReasoningTask.kt index 3e5af9e0..5dc1ea42 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AbductiveReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AbductiveReasoningTask.kt @@ -134,7 +134,7 @@ AbductiveReasoning - Generate and evaluate explanatory hypotheses return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val ui = task.ui val tabs = TabbedDisplay(task) @@ -726,7 +726,7 @@ AbductiveReasoning - Generate and evaluate explanatory hypotheses prompt = prompt.toString(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val response = parsedAgent.answer(listOf(prompt.toString())).obj @@ -783,7 +783,7 @@ AbductiveReasoning - Generate and evaluate explanatory hypotheses prompt = prompt.toString(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val response = parsedAgent.answer(listOf(prompt.toString())).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AbstractionLadderTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AbstractionLadderTask.kt index 4b088be2..c320db2b 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AbstractionLadderTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AbstractionLadderTask.kt @@ -117,7 +117,7 @@ AbstractionLadder - Traverse abstraction levels to find patterns and design insi val levels = executionConfig.levels.coerceIn(1, 5) val identifyPatterns = executionConfig.identify_patterns - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return // Initialize detailed output file detailedOutputFile = initializeDetailedOutput(task) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AdversarialReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AdversarialReasoningTask.kt index eb420b8c..f34bc8dd 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AdversarialReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AdversarialReasoningTask.kt @@ -134,7 +134,7 @@ AdversarialReasoning - Red team analysis to identify vulnerabilities and weaknes return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val attackVectors = executionConfig.attack_vectors ?: listOf("security", "logic") val adversaryCapability = executionConfig.adversary_capability diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AnalogicalReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AnalogicalReasoningTask.kt index 3a848e50..68001279 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AnalogicalReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/AnalogicalReasoningTask.kt @@ -173,7 +173,7 @@ AnalogicalReasoning - Solve problems by finding and applying analogies from diff log.info("Configuration validated successfully") val tabs = TabbedDisplay(task) - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return // Initialize transcript transcriptStream = task.transcript() transcriptStream?.let { stream -> @@ -283,7 +283,7 @@ AnalogicalReasoning - Solve problems by finding and applying analogies from diff model = api, temperature = 0.7, name = "AnalogicalReasoning", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) var result: AnalogicalReasoningResult? = analogyParser.answer(listOf(analogiesPrompt)).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/BrainstormingTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/BrainstormingTask.kt index 120d355e..7c2c15c4 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/BrainstormingTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/BrainstormingTask.kt @@ -263,8 +263,8 @@ Brainstorming - Generate and analyze multiple solution options inputFileContent ) - val api = orchestrationConfig.defaultChatter ?: return - val parsingChatter = orchestrationConfig.parsingChatter.getChildClient(task) + val api = defaultChatter ?: return + val parsingChatter = parsingChatter.getChildClient(task) val defaultChatter = api.getChildClient(task) val brainstormAgent = ParsedAgent( resultClass = BrainstormResult::class.java, diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/CausalInferenceTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/CausalInferenceTask.kt index c0a2b276..2ff44438 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/CausalInferenceTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/CausalInferenceTask.kt @@ -114,7 +114,7 @@ CausalInference - Identify causal relationships and root causes val toInput = { it: String -> listOf(it) } val ui = task.ui - val api = orchestrationConfig.defaultChatter ?: run { + val api = defaultChatter ?: run { log.error("No default chatter available") markdownTranscript?.write("# Error\n\nNo API available\n".toByteArray()) markdownTranscript?.close() diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ChainOfThoughtTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ChainOfThoughtTask.kt index 65f45a67..35b401dc 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ChainOfThoughtTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ChainOfThoughtTask.kt @@ -121,7 +121,7 @@ class ChainOfThoughtTask( log.info("Configuration: maxSteps=$maxSteps, validateSteps=$validateSteps") val ui = task.ui - val api = orchestrationConfig.defaultChatter + val api = defaultChatter // Create tabbed display for organized output val tabs = TabbedDisplay(task) // Overview tab @@ -589,7 +589,7 @@ class ChainOfThoughtTask( model = api, temperature = 0.3, name = "ReasoningStep$stepNumber", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) var step: ReasoningStep? = reasoningAgent.answer(listOf(question)).obj.copy(step_number = stepNumber) @@ -656,7 +656,7 @@ class ChainOfThoughtTask( model = api, temperature = 0.1, name = "StepValidation", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) var validation: StepValidation? = validationAgent.answer(listOf("Validate step ${step.step_number}")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ConstraintRelaxationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ConstraintRelaxationTask.kt index 22251696..99f1e420 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ConstraintRelaxationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ConstraintRelaxationTask.kt @@ -135,7 +135,7 @@ ConstraintRelaxation - Solve over-constrained problems through progressive const """.trimMargin() ) - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) val transcript = task.transcript("constraint_relaxation") diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ConstraintSatisfactionTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ConstraintSatisfactionTask.kt index a00567d8..317f5eb2 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ConstraintSatisfactionTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ConstraintSatisfactionTask.kt @@ -148,7 +148,7 @@ class ConstraintSatisfactionTask( val toInput = { it: String -> listOf(it) } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return log.info( """ |Starting Constraint Satisfaction Task: diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/CounterfactualAnalysisTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/CounterfactualAnalysisTask.kt index 101162a1..a85548a3 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/CounterfactualAnalysisTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/CounterfactualAnalysisTask.kt @@ -107,7 +107,7 @@ CounterfactualAnalysis - Explore "what-if" scenarios to understand causal relati val toInput = { it: String -> messages + listOf(getInputFileCode(), it).filter { it.isNotBlank() } } val transcript = task.transcript() transcript?.write("# Counterfactual Analysis Transcript\n\n".toByteArray()) - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return try { val tabs = TabbedDisplay(task) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/DecisionTreeTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/DecisionTreeTask.kt index b14a1747..898da75b 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/DecisionTreeTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/DecisionTreeTask.kt @@ -98,7 +98,7 @@ class DecisionTreeTask( } val chatAgent = ChatAgent( - model = orchestrationConfig.defaultChatter.getChildClient(task), + model = defaultChatter.getChildClient(task), temperature = 0.2, prompt = """ You are a Decision Tree Rule Generator. diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/DecompositionSynthesisTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/DecompositionSynthesisTask.kt index 075e4c27..8ccaa3f2 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/DecompositionSynthesisTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/DecompositionSynthesisTask.kt @@ -203,7 +203,7 @@ class DecompositionSynthesisTask( log.error("Failed to initialize transcript", e) null } - val api = orchestrationConfig.defaultChatter ?: run { + val api = defaultChatter ?: run { log.error("No default chatter available") task.complete("ERROR: No API available") resultFn("ERROR: No API available") @@ -801,7 +801,7 @@ class DecompositionSynthesisTask( resultClass = ProblemDecomposition::class.java, prompt = prompt, model = api, - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val decomposition = decompositionAgent.answer(listOf(problem)).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/FiniteStateMachineTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/FiniteStateMachineTask.kt index bc1dace0..cff00f43 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/FiniteStateMachineTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/FiniteStateMachineTask.kt @@ -106,7 +106,7 @@ FiniteStateMachine - Model concepts using finite state machine analysis } val ui = task.ui - val api = orchestrationConfig.defaultChatter ?: run { + val api = defaultChatter ?: run { log.error("No default chatter available") writeToTranscript("## Error\n\nNo API available\n\n") closeTranscript() diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/FunctorialMappingTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/FunctorialMappingTask.kt index 66eadde2..f4d32f27 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/FunctorialMappingTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/FunctorialMappingTask.kt @@ -106,7 +106,7 @@ FunctorialMapping - Translate problems from one category to another val targetDef = executionConfig?.target_category_definition!! val properties = executionConfig?.functor_properties ?: "covariant" - val api = orchestrationConfig.defaultChatter + val api = defaultChatter val tabs = TabbedDisplay(task) val transcript = transcript(task) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/GeneticOptimizationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/GeneticOptimizationTask.kt index bd355f73..131ebd11 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/GeneticOptimizationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/GeneticOptimizationTask.kt @@ -239,7 +239,7 @@ GeneticOptimization - Iteratively evolve and perfect text through genetic algori log.info("Configuration validated: generations=$numGenerations, population=$populationSize, selection=$selectionSize, crossover=$enableCrossover") val tabs = TabbedDisplay(task) - val api = orchestrationConfig.defaultChatter + val api = defaultChatter transcript?.write("# Genetic Optimization Task Transcript\n\n".toByteArray()) // Create overview tab @@ -950,7 +950,7 @@ Use this feedback to guide your mutation: model = api, temperature = 0.8, name = "MutationGenerator", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ).answer( listOf( """ diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/IsomorphismDiscoveryTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/IsomorphismDiscoveryTask.kt index 9a3c8cea..7c64325c 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/IsomorphismDiscoveryTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/IsomorphismDiscoveryTask.kt @@ -138,7 +138,7 @@ IsomorphismDiscovery - Search for and validate structural mappings between two d val verify = executionConfig?.verify_operations ?: true val tabs = TabbedDisplay(task) - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return transcriptStream = task.transcript() writeTranscriptHeader(transcriptStream, sourceDomain, targetDomain, strictness) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/LateralThinkingTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/LateralThinkingTask.kt index aaf86321..bc2967bb 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/LateralThinkingTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/LateralThinkingTask.kt @@ -283,7 +283,7 @@ LateralThinking - Break conventional thinking patterns to find innovative soluti log.info("Configuration: techniques=${techniques.size}, numAlternatives=$numAlternatives, evaluateFeasibility=$evaluateFeasibility") - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -378,7 +378,7 @@ LateralThinking - Break conventional thinking patterns to find innovative soluti model = api.getChildClient(task), temperature = 0.8, name = "LateralThinking_${technique}", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val application = techniqueParser.answer(listOf(techniquePrompt)).obj @@ -615,7 +615,7 @@ Provide a structured evaluation. model = api.getChildClient(task), temperature = 0.4, name = "FeasibilityEvaluation", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) feasibilityEvaluation = feasibilityParser.answer(listOf(feasibilityPrompt)).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/MathematicalReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/MathematicalReasoningTask.kt index 275a457b..07cb3d7e 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/MathematicalReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/MathematicalReasoningTask.kt @@ -216,7 +216,7 @@ MathematicalReasoning - Solve mathematical problems through step-by-step logical val detailLevel = executionConfig?.detail_level ?: "standard" val tabs = TabbedDisplay(task) - val api = orchestrationConfig.defaultChatter + val api = defaultChatter // Create overview tab val overviewTask = task.ui.newTask(false) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/MetaCognitiveReflectionTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/MetaCognitiveReflectionTask.kt index 7a100ec2..255b6257 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/MetaCognitiveReflectionTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/MetaCognitiveReflectionTask.kt @@ -131,7 +131,7 @@ MetaCognitiveReflection - Reflect on and critique reasoning processes return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return // Create transcript file val (transcriptLink, transcript) = initializeTranscript(task) transcript?.let { stream -> diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/NeuralNetworkLayerTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/NeuralNetworkLayerTask.kt index c2a45bc5..235b80ef 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/NeuralNetworkLayerTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/NeuralNetworkLayerTask.kt @@ -386,7 +386,7 @@ class NeuralNetworkLayerTask( val analysisDepth = executionConfig?.analysis_depth ?: "standard" val tabs = TabbedDisplay(task) - val api = orchestrationConfig.defaultChatter + val api = defaultChatter // Overview tab val overviewTask = task.ui.newTask(false) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ProbabilisticReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ProbabilisticReasoningTask.kt index b0d36be4..d36d6fd2 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ProbabilisticReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/ProbabilisticReasoningTask.kt @@ -147,7 +147,7 @@ ProbabilisticReasoning - Reason under uncertainty using Bayesian analysis log.info("Configuration: hypotheses=${hypotheses.size}, evidence=${evidence.size}, context=$decisionContext") - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val ui = task.ui val tabs = TabbedDisplay(task) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/SocraticDialogueTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/SocraticDialogueTask.kt index c5b18836..ad1854ac 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/SocraticDialogueTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/SocraticDialogueTask.kt @@ -139,7 +139,7 @@ class SocraticDialogueTask( log.info("Configuration: maxDepth=$maxDepth, challengeAssumptions=$challengeAssumptions, domainConstraints=$domainConstraints") val ui = task.ui - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return // Create tabbed display for organized output val tabs = TabbedDisplay(task) // Overview tab diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/StructuralInvariantAnalysisTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/StructuralInvariantAnalysisTask.kt index 7aaf37b1..236659fc 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/StructuralInvariantAnalysisTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/StructuralInvariantAnalysisTask.kt @@ -91,7 +91,7 @@ StructuralInvariantAnalysis - Distill an object to immutable properties writeTranscriptHeader(stream, subject, transformations, format) } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return log.info("Starting Structural Invariant Analysis: $subject") val tabbedDisplay = TabbedDisplay(task) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/SystemsThinkingTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/SystemsThinkingTask.kt index 169c5bee..5e87dd59 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/SystemsThinkingTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/SystemsThinkingTask.kt @@ -105,7 +105,7 @@ import java.util.* return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val ui = task.ui val tabs = TabbedDisplay(task) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/TableCompilationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/TableCompilationTask.kt index 1fdb6ec3..3d00ff10 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/TableCompilationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/TableCompilationTask.kt @@ -108,7 +108,7 @@ TableCompilation - Generate structured tables with AI-computed cell values val partitionSize = typeConfig?.partition_size ?: 2 val ui = task.ui - val api = orchestrationConfig.defaultChatter.getChildClient(task) + val api = defaultChatter.getChildClient(task) task.add(MarkdownUtil.renderMarkdown("## Table Compilation", ui = ui)) task.add( diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/TemporalReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/TemporalReasoningTask.kt index 62989397..fda3431a 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/TemporalReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/reasoning/TemporalReasoningTask.kt @@ -144,7 +144,7 @@ TemporalReasoning - Analyze how systems evolve over time and predict future stat return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val ui = task.ui val transcript = task.transcript() @@ -280,7 +280,7 @@ TemporalReasoning - Analyze how systems evolve over time and predict future stat prompt = timelinePrompt, model = api, temperature = 0.3, - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val timelineAnalysis = timelineAgent.answer(listOf(timelinePrompt)).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/session/RunShellCommandTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/session/RunShellCommandTask.kt index 548afdce..2d25d9c4 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/session/RunShellCommandTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/session/RunShellCommandTask.kt @@ -74,7 +74,7 @@ class RunShellCommandTask( val markdownTranscript = task.transcript() val typeConfig = typeConfig ?: throw RuntimeException() val chatter = (typeConfig.model?.let { this.orchestrationConfig.instance(it) } - ?: this.orchestrationConfig.defaultChatter).getChildClient(task) + ?: this.defaultChatter).getChildClient(task) val planTask = this.executionConfig val shellCommandActor = CodeAgent( name = "RunShellCommand", diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/DialecticalReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/DialecticalReasoningTask.kt index 2f71045f..e0de0948 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/DialecticalReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/DialecticalReasoningTask.kt @@ -109,7 +109,7 @@ DialecticalReasoning - Resolve contradictions through thesis-antithesis-synthesi log.info("Configuration: thesis='$thesis', antithesis='$antithesis', context='$context', levels=$synthesisLevels, preserveStrengths=$preserveStrengths") - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val ui = task.ui val tabs = TabbedDisplay(task) transcriptStream = initializeTranscript(task) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/EthicalReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/EthicalReasoningTask.kt index e5cd1c48..2b49bb7a 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/EthicalReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/EthicalReasoningTask.kt @@ -140,7 +140,7 @@ class EthicalReasoningTask( val context = executionConfig?.context ?: "" val ui = task.ui - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) val transcript = transcript(task) val overviewTask = task.ui.newTask(false) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/GameTheoryTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/GameTheoryTask.kt index 16076c36..c76f9d17 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/GameTheoryTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/GameTheoryTask.kt @@ -207,7 +207,7 @@ GameTheory - Analyze strategic interactions using game theory } val ui = task.ui - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val transcript = transcript(task) // Create tabbed display for organized output val tabs = TabbedDisplay(task) @@ -722,7 +722,7 @@ Provide this in a clear, structured format. prompt = summaryPrompt, model = api, temperature = 0.2, - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ) val gameAnalysis = parsedAgent.answer(toInput(summaryPrompt)).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/LLMExperimentTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/LLMExperimentTask.kt index 6ff8749e..cce03237 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/LLMExperimentTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/LLMExperimentTask.kt @@ -113,7 +113,7 @@ class LLMExperimentTask( val repetitions = executionConfig?.repetitions ?: 5 val metrics = executionConfig?.metrics ?: listOf("response_length", "response_time") val statisticalAnalysis = executionConfig?.statistical_analysis ?: true - val api = orchestrationConfig.defaultChatter.getChildClient(task) + val api = defaultChatter.getChildClient(task) val (transcriptLink, transcriptStream) = createTranscriptFile(task) val transcriptWriter = transcriptStream?.bufferedWriter() diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/LLMPollSimulationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/LLMPollSimulationTask.kt index dd10bb2f..00e888ac 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/LLMPollSimulationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/LLMPollSimulationTask.kt @@ -199,7 +199,7 @@ LLMPollSimulation - Simulate polls and surveys with diverse AI personas val profiles = executionConfig?.respondent_profiles ?: listOf() val respondentsPerProfile = executionConfig?.respondents_per_profile ?: 10 val temperature = executionConfig?.temperature ?: 0.7 - val api = orchestrationConfig.defaultChatter.getChildClient(task) + val api = defaultChatter.getChildClient(task) val (transcriptLink, transcriptStream) = createTranscriptFile(task) val transcriptWriter = transcriptStream?.bufferedWriter() diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/MultiPerspectiveAnalysisTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/MultiPerspectiveAnalysisTask.kt index 0030fa2d..49208016 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/MultiPerspectiveAnalysisTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/MultiPerspectiveAnalysisTask.kt @@ -113,7 +113,7 @@ class MultiPerspectiveAnalysisTask( return } - val api = orchestrationConfig.defaultChatter ?: run { + val api = defaultChatter ?: run { log.error("No default chatter available") task.complete("ERROR: No API available") resultFn("ERROR: No API available") diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/PersuasiveEssayTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/PersuasiveEssayTask.kt index 38a6c753..8ea93360 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/PersuasiveEssayTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/PersuasiveEssayTask.kt @@ -234,7 +234,7 @@ class PersuasiveEssayTask( return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) // Generate cover image if enabled @@ -384,7 +384,7 @@ Ensure the outline: """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var outline = outlineAgent.answer(listOf("Generate outline")).obj @@ -518,7 +518,7 @@ Speak directly to the ${executionConfig.target_audience}. """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var introduction = introAgent.answer(listOf("Write introduction")).obj @@ -626,7 +626,7 @@ Aim for approximately ${argOutline.estimated_word_count} words. """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var argumentSection = argumentAgent.answer(listOf("Write argument")).obj @@ -728,7 +728,7 @@ Aim for approximately $counterargumentWords words. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var counterSection = counterAgent.answer(listOf("Write counterarguments")).obj @@ -832,7 +832,7 @@ End on a strong note that reinforces your position. """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var conclusion = conclusionAgent.answer(listOf("Write conclusion")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/PoliticalOptimizationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/PoliticalOptimizationTask.kt index c4726237..7fbe6bc6 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/PoliticalOptimizationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/social/PoliticalOptimizationTask.kt @@ -248,7 +248,7 @@ PoliticalOptimization - Optimize text using multi-perspective political consensu log.info("Configuration: perspectives=${perspectives.size}, criteria=${evaluationCriteria.size}, mode=$consensusMode, generations=$numGenerations") val tabs = TabbedDisplay(task) - val api = orchestrationConfig.defaultChatter + val api = defaultChatter transcript?.write("# Political Optimization Task Transcript\n\n".toByteArray()) // Create overview tab @@ -884,7 +884,7 @@ The perspective field in your response should be: "$perspective" model = api, temperature = 0.4, name = "PerspectiveEvaluator_$perspective", - parsingChatter = orchestrationConfig.parsingChatter, + parsingChatter = parsingChatter, ).answer( listOf( """ diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ArticleGenerationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ArticleGenerationTask.kt index 403c1a00..8eb8c1f8 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ArticleGenerationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ArticleGenerationTask.kt @@ -184,7 +184,7 @@ ArticleGeneration - Generate complete journalistic articles from investigation a ).joinToString("\n\n---\n\n") - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) // Create transcript file @@ -315,7 +315,7 @@ Ensure the structure: """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val structure = structureAgent.answer(listOf("Generate structure")).obj @@ -440,7 +440,7 @@ After writing, provide: prompt = writingPrompt, model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var article = articleAgent.answer(listOf("Write the article")).obj @@ -573,7 +573,7 @@ Make each snippet: """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val socialSnippets = socialAgent.answer(listOf("Generate snippets")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/BusinessProposalTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/BusinessProposalTask.kt index f485ec46..b3f01d03 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/BusinessProposalTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/BusinessProposalTask.kt @@ -372,7 +372,7 @@ BusinessProposal - Generate comprehensive business proposals with ROI analysis a return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -519,7 +519,7 @@ Identify 3-5 key stakeholders who will influence the decision. """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val stakeholderAnalysis = stakeholderAgent.answer(listOf("Analyze stakeholders")).obj @@ -625,7 +625,7 @@ If specific numbers aren't provided, use reasonable estimates based on the propo """.trimIndent(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) roiAnalysis = roiAgent.answer(listOf("Perform ROI analysis")).obj @@ -728,7 +728,7 @@ Be realistic but not alarmist. Focus on actionable mitigation strategies. """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) riskAssessment = riskAgent.answer(listOf("Assess risks")).obj @@ -819,7 +819,7 @@ Be fair to alternatives but make a compelling case for this proposal. """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) competitiveAnalysis = competitiveAgent.answer(listOf("Analyze competition")).obj @@ -917,7 +917,7 @@ Ensure phases flow logically and dependencies are clear. """.trimIndent(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) timelineMilestones = timelineAgent.answer(listOf("Create timeline")).obj @@ -1027,7 +1027,7 @@ Tailor the outline to the ${executionConfig.proposal_type} proposal type and ${e """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val outline = outlineAgent.answer(listOf("Create outline")).obj @@ -1127,7 +1127,7 @@ Target audience: ${executionConfig.decision_makers?.joinToString(", ") ?: "Senio """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var execSummary = execSummaryAgent.answer(listOf("Write executive summary")).obj @@ -1266,7 +1266,7 @@ Aim for approximately ${sectionOutline.estimated_word_count} words. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var sectionContent = sectionAgent.answer(listOf("Write section")).obj @@ -1351,7 +1351,7 @@ Make it action-oriented and compelling. The reader should feel motivated to move """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var conclusion = conclusionAgent.answer(listOf("Write conclusion")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ComicBookGenerationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ComicBookGenerationTask.kt index 5e72b158..64f47d9b 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ComicBookGenerationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ComicBookGenerationTask.kt @@ -119,7 +119,7 @@ ComicBookGeneration - Generate comic book scripts and visuals return } - val api = orchestrationConfig.defaultChatter.getChildClient(task) + val api = defaultChatter.getChildClient(task) val tabs = TabbedDisplay(task) val overviewTask = task.ui.newTask(false).apply { tabs["Overview"] = placeholder } diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/EmailCampaignTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/EmailCampaignTask.kt index 6eddb34b..1b7cbe3a 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/EmailCampaignTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/EmailCampaignTask.kt @@ -277,7 +277,7 @@ EmailCampaign - Generate complete email sequences for marketing, sales, or outre return } - val api = orchestrationConfig.defaultChatter ?: run { + val api = defaultChatter ?: run { transcript?.close() return } @@ -423,7 +423,7 @@ Consider: """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val strategy = strategyAgent.answer(listOf("Develop strategy")).obj @@ -536,7 +536,7 @@ Maintain ${executionConfig.brand_voice} voice and address ${executionConfig.targ """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val outline = outlineAgent.answer(listOf("Create outline")).obj @@ -640,7 +640,7 @@ For each variant, specify the approach used and character count. """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) subjectAgent.answer(listOf("Generate subject lines")).obj.variants @@ -667,7 +667,7 @@ ${if (executionConfig.use_emoji) "- Uses relevant emoji if appropriate" else "- """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) subjectAgent.answer(listOf("Generate subject line")).obj.variants @@ -742,7 +742,7 @@ ${if (executionConfig.include_ps) "- PS section" else ""} """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var emailContent = emailAgent.answer(listOf("Write email")).obj.copy( diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/InteractiveStoryTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/InteractiveStoryTask.kt index 45ff4190..bfe444ce 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/InteractiveStoryTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/InteractiveStoryTask.kt @@ -267,7 +267,7 @@ class InteractiveStoryTask( return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -468,7 +468,7 @@ Focus on structure and connections, not detailed prose. """.trimIndent(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val structure = structureAgent.answer(listOf("Create detailed structure from outline")).obj @@ -638,7 +638,7 @@ Make it immersive and compelling. The reader should feel invested immediately. """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var openingSegment = openingAgent.answer(listOf("Write opening")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/JournalismReasoningTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/JournalismReasoningTask.kt index b88bd41a..15120964 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/JournalismReasoningTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/JournalismReasoningTask.kt @@ -292,7 +292,7 @@ JournalismReasoning - Investigate stories through journalistic principles and me "alternativeAngles=$alternativeAngles, assessNewsworthiness=$assessNewsworthiness" ) - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -428,7 +428,7 @@ Apply rigorous journalistic standards. Be skeptical but fair. """.trimIndent(), model = api, temperature = 0.3, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val factChecks = factAgent.answer(listOf("Verify facts")).obj.facts @@ -557,7 +557,7 @@ Ensure balanced representation of different viewpoints. """.trimIndent(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val perspectives = perspectiveAgent.answer(listOf("Identify perspectives")).obj.sources @@ -662,7 +662,7 @@ Help readers understand why this story matters and how it fits into the bigger p """.trimIndent(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val context = contextAgent.answer(listOf("Analyze context")).obj @@ -756,7 +756,7 @@ Be thorough but fair. Distinguish between legitimate perspective and problematic """.trimIndent(), model = api, temperature = 0.4, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val biasAnalysis = biasAgent.answer(listOf("Analyze biases")).obj @@ -863,7 +863,7 @@ Consider angles that: """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val angles = anglesAgent.answer(listOf("Explore angles")).obj.angles @@ -989,7 +989,7 @@ Prioritize gaps that are most important for understanding the full story. """.trimIndent(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val gaps = gapsAgent.answer(listOf("Find gaps")).obj.gaps diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/NarrativeGenerationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/NarrativeGenerationTask.kt index 503c12e1..37b686c2 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/NarrativeGenerationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/NarrativeGenerationTask.kt @@ -226,7 +226,7 @@ NarrativeGeneration - Generate complete narratives from analysis and outlines } log.debug("Configuration validated - Acts: ${genConfig.number_of_acts}, Scenes/Act: ${genConfig.scenes_per_act}, Style: ${genConfig.writing_style}") - val api = orchestrationConfig.defaultChatter.getChildClient(task) + val api = defaultChatter.getChildClient(task) val tabs = TabbedDisplay(task) // Get input file context @@ -312,7 +312,7 @@ NarrativeGeneration - Generate complete narratives from analysis and outlines val totalScenes = genConfig.number_of_acts * genConfig.scenes_per_act val wordsPerScene = genConfig.target_word_count / totalScenes - val parsingChatter = orchestrationConfig.parsingChatter.getChildClient(task) + val parsingChatter = parsingChatter.getChildClient(task) // Generate cover image first if enabled (to use as seed for other images) var coverImagePath: String? = null if (genConfig.generate_cover_image || genConfig.generate_scene_images) { diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ReportGenerationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ReportGenerationTask.kt index 6ac41ecf..277947f9 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ReportGenerationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ReportGenerationTask.kt @@ -286,7 +286,7 @@ ReportGeneration - Generate comprehensive business reports with data analysis an return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -428,7 +428,7 @@ Be specific with numbers and percentages where available. """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val dataAnalyses = dataAnalysisAgent.answer(listOf("Analyze data")).obj.analyses @@ -531,7 +531,7 @@ Structure should be appropriate for ${executionConfig.target_audience} with a ${ """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val outline = outlineAgent.answer(listOf("Create outline")).obj @@ -684,7 +684,7 @@ Be specific, data-driven, and actionable. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var generatedSection = sectionAgent.answer(listOf("Write section")).obj @@ -779,7 +779,7 @@ Tailor recommendations to ${executionConfig.target_audience}. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val recommendations = recommendationAgent.answer(listOf("Generate recommendations")).obj.recommendations @@ -890,7 +890,7 @@ Be realistic and specific. Focus on risks that ${executionConfig.target_audience """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val riskAssessment = riskAgent.answer(listOf("Assess risks")).obj.risks diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ResearchPaperGenerationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ResearchPaperGenerationTask.kt index 4679e4f8..2cbceefa 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ResearchPaperGenerationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ResearchPaperGenerationTask.kt @@ -248,7 +248,7 @@ ResearchPaperGeneration - Generate comprehensive academic research papers with c return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -434,7 +434,7 @@ Ensure academic rigor appropriate for ${executionConfig.academic_level} level. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val outline = outlineAgent.answer(listOf("Create outline")).obj @@ -563,7 +563,7 @@ Write in a ${executionConfig.academic_level} level academic style. """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var generatedSection = sectionAgent.answer(listOf("Write section")).obj @@ -654,7 +654,7 @@ Ensure all citations are properly formatted and complete. """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val bibliography = bibliographyAgent.answer(listOf("Generate bibliography")).obj.citations @@ -748,7 +748,7 @@ Format as a professional peer review. """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) val review = reviewAgent.answer(listOf("Review the paper")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ScriptwritingTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ScriptwritingTask.kt index e1c0a418..ba73d391 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ScriptwritingTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/ScriptwritingTask.kt @@ -231,7 +231,7 @@ class ScriptwritingTask( return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -374,7 +374,7 @@ Ensure the outline: """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var outline = outlineAgent.answer(listOf("Generate outline")).obj @@ -492,7 +492,7 @@ Ensure the dialogue sounds natural when spoken aloud. """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var hookSegment = hookAgent.answer(listOf("Write opening")).obj @@ -628,7 +628,7 @@ Aim for approximately ${sectionOutline.estimated_duration_seconds} seconds of co """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var sectionSegment = sectionAgent.answer(listOf("Write section")).obj @@ -739,7 +739,7 @@ Target duration: 15-20 seconds. """.trimIndent(), model = api, temperature = 0.8, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var closingSegment = closingAgent.answer(listOf("Write closing")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/SoftwareDesignDocumentTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/SoftwareDesignDocumentTask.kt index a4f2ed98..df486a2a 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/SoftwareDesignDocumentTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/SoftwareDesignDocumentTask.kt @@ -195,7 +195,7 @@ SoftwareDesignDocument - Generate comprehensive software design documentation return } - val api = orchestrationConfig.defaultChatter.getChildClient(task) + val api = defaultChatter.getChildClient(task) val ui = task.ui val tabs = TabbedDisplay(task) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/TechnicalExplanationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/TechnicalExplanationTask.kt index 3034cd08..82850ff6 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/TechnicalExplanationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/TechnicalExplanationTask.kt @@ -249,7 +249,7 @@ TechnicalExplanation - Break down complex technical subjects into clear, digesti return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) // Load input files if specified @@ -441,7 +441,7 @@ Ensure the outline: """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var outline = outlineAgent.answer(listOf("Generate outline")).obj @@ -639,7 +639,7 @@ ${ """.trimIndent(), model = api, temperature = 0.7, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var section = sectionAgent.answer(listOf("Write section")).obj diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/TutorialGenerationTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/TutorialGenerationTask.kt index 412151f0..5f592e64 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/TutorialGenerationTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/writing/TutorialGenerationTask.kt @@ -279,7 +279,7 @@ TutorialGeneration - Create complete, step-by-step tutorials for processes and p return } - val api = orchestrationConfig.defaultChatter ?: return + val api = defaultChatter ?: return val tabs = TabbedDisplay(task) @@ -436,7 +436,7 @@ Ensure the outline: """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var outline = outlineAgent.answer(listOf("Generate outline")).obj @@ -638,7 +638,7 @@ Guidelines: """.trimIndent(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) var tutorialStep = stepAgent.answer(listOf("Write step")).obj @@ -771,7 +771,7 @@ Focus on issues that: """.trimIndent(), model = api, temperature = 0.5, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) troubleshootingSection = troubleshootingAgent.answer(listOf("Create troubleshooting")).obj @@ -869,7 +869,7 @@ Make suggestions: """.trimIndent(), model = api, temperature = 0.6, - parsingChatter = orchestrationConfig.parsingChatter + parsingChatter = parsingChatter ) nextSteps = nextStepsAgent.answer(listOf("Generate next steps")).obj From db4473bb4906f982c20303143fe36b207450df68 Mon Sep 17 00:00:00 2001 From: Andrew Charneski Date: Mon, 22 Dec 2025 13:47:50 -0500 Subject: [PATCH 3/4] wip --- .../cognotik/agents/ParsedImageAgent.kt | 14 +++++- .../cognotik/chat/GeminiSdkChatClient.kt | 2 +- .../tools/file/GenerateSpriteSheetTask.kt | 50 +++++++++++++++++-- .../DataTableAccumulationStrategy.kt | 6 +-- .../processing/DefaultSummarizerStrategy.kt | 4 +- .../online/processing/FactCheckingStrategy.kt | 6 +-- .../online/processing/JobMatchingStrategy.kt | 2 +- .../processing/SchemaExtractionStrategy.kt | 6 +-- .../cognotik/webui/servlet/FileServlet.kt | 1 - .../webui/servlet/SessionFileServlet.kt | 2 +- 10 files changed, 74 insertions(+), 19 deletions(-) diff --git a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedImageAgent.kt b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedImageAgent.kt index e287c49a..0b2f73f9 100644 --- a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedImageAgent.kt +++ b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/agents/ParsedImageAgent.kt @@ -59,7 +59,19 @@ open class ParsedImageAgent( override val text = response(*messages).choices.firstOrNull()?.message?.content ?: throw RuntimeException("No response") - private val _obj: T by lazy { JsonUtil.fromJson(text, resultClass!!) } + private val _obj: T by lazy { JsonUtil.fromJson(unwrap(text), resultClass!!) } + + private fun unwrap(text: String): String { + val trimmed = text.trim() + return if (trimmed.startsWith("```json") && trimmed.endsWith("```")) { + trimmed.removePrefix("```json").removeSuffix("```").trim() + } else if (trimmed.startsWith("```") && trimmed.endsWith("```")) { + trimmed.removePrefix("```").removeSuffix("```").trim() + } else { + trimmed + } + } + override val obj get() = _obj } override fun respond(input: List, vararg messages: ModelSchema.ChatMessage): ParsedResponse = diff --git a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/chat/GeminiSdkChatClient.kt b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/chat/GeminiSdkChatClient.kt index 2616604b..f21873b0 100644 --- a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/chat/GeminiSdkChatClient.kt +++ b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/chat/GeminiSdkChatClient.kt @@ -113,7 +113,7 @@ class GeminiSdkChatClient( log( "
\nSending request to Gemini SDK for model: ${model.modelName} (${requestID})\n\n```json\n${ toJson(config) - }\n```\n\n${ + }\n```\n\nSystem Prompt:\n```\n${config?.systemInstruction()?.getOrNull()?.toString()?.indent(" ")}\n```\n\n${ contents.joinToString("\n\n") { it.toMarkdown() }.indent(" ") diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt index b42a423a..9fa2cfa9 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/file/GenerateSpriteSheetTask.kt @@ -16,6 +16,9 @@ import com.simiacryptus.cognotik.webui.session.SessionTask import com.simiacryptus.cognotik.webui.session.SocketManager import com.simiacryptus.cognotik.webui.session.getChildClient import org.slf4j.Logger +import java.awt.BasicStroke +import java.awt.Color +import java.awt.image.BufferedImage import java.io.File import javax.imageio.ImageIO @@ -154,6 +157,42 @@ GenerateSpriteSheet - Create a sprite sheet image and corresponding JSON metadat val jsonOutputPath = root.resolve(metadataFile) val mapper = jacksonObjectMapper().writerWithDefaultPrettyPrinter() jsonOutputPath.toFile().writeText(mapper.writeValueAsString(metadata)) + // Save Individual Sprites + val baseName = File(imageFile).nameWithoutExtension + val parentDir = File(imageFile).parent ?: "" + val spriteDirRelative = if (parentDir.isEmpty()) baseName else "$parentDir/$baseName" + val spriteDir = root.resolve(spriteDirRelative) + spriteDir.toFile().mkdirs() + val debugImage = BufferedImage(generatedImage.width, generatedImage.height, BufferedImage.TYPE_INT_ARGB) + val g = debugImage.createGraphics() + g.drawImage(generatedImage, 0, 0, null) + g.color = Color.RED + g.stroke = BasicStroke(2f) + val spriteHtml = StringBuilder() + metadata.sprites.forEach { sprite -> + try { + val x = sprite.x.coerceIn(0, generatedImage.width - 1) + val y = sprite.y.coerceIn(0, generatedImage.height - 1) + val w = sprite.width.coerceAtMost(generatedImage.width - x) + val h = sprite.height.coerceAtMost(generatedImage.height - y) + g.drawRect(x, y, w, h) + if (w > 0 && h > 0) { + val subImage = generatedImage.getSubimage(x, y, w, h) + val safeName = sprite.name.replace(Regex("[^a-zA-Z0-9.-]"), "_") + val spriteFileName = "$safeName.png" + ImageIO.write(subImage, "png", spriteDir.resolve(spriteFileName).toFile()) + val spriteLink = task.linkTo("$spriteDirRelative/$spriteFileName") + spriteHtml.append("""
""") + } + } catch (e: Exception) { + log.warn("Failed to save sprite ${sprite.name}", e) + } + } + g.dispose() + val debugFile = if (parentDir.isEmpty()) "${baseName}_debug.png" else "$parentDir/${baseName}_debug.png" + ImageIO.write(debugImage, "png", root.resolve(debugFile).toFile()) + val debugLink = task.linkTo(debugFile) + // Display Results val metadataLink = task.linkTo(metadataFile) @@ -162,6 +201,11 @@ GenerateSpriteSheet - Create a sprite sheet image and corresponding JSON metadat - Image saved to: $imageFile - Metadata saved to: $metadataFile - Identified ${metadata.sprites.size} sprites. + - Individual sprites saved to: `$spriteDirRelative/` + ### Bounding Boxes + + ### Sprites + $spriteHtml """.trimIndent() task.add(MarkdownUtil.renderMarkdown(summary, ui = task.ui)) @@ -171,9 +215,9 @@ GenerateSpriteSheet - Create a sprite sheet image and corresponding JSON metadat "| ${it.name} | ${it.x}, ${it.y} | ${it.width}x${it.height} |" } task.add(MarkdownUtil.renderMarkdown(""" - | Name | Position | Size | - |------|----------|------| - $tableRows +| Name | Position | Size | +|------|----------|------| +$tableRows """.trimIndent(), ui = task.ui)) task.complete("Generated sprite sheet with ${metadata.sprites.size} sprites") diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DataTableAccumulationStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DataTableAccumulationStrategy.kt index 87980b22..616f0397 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DataTableAccumulationStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DataTableAccumulationStrategy.kt @@ -82,7 +82,7 @@ class DataTableAccumulationStrategy : DefaultSummarizerStrategy() { log.debug("Processing page for data table accumulation: $url") val config = try { - val chatInterface = context.parsingChatter.getChildClient(context.task) + val chatInterface = context.orchestrationConfig.parsingChatter.getChildClient(context.task) context.executionConfig.content_queries?.let { queries -> queries.parserCast(chatInterface) } ?: run { @@ -217,7 +217,7 @@ class DataTableAccumulationStrategy : DefaultSummarizerStrategy() { } val model = (context.typeConfig.model?.let { context.orchestrationConfig.instance(it) } - ?: context.parsingChatter).getChildClient(context.task) + ?: context.orchestrationConfig.parsingChatter).getChildClient(context.task) val result = ParsedAgent( prompt = prompt, @@ -408,7 +408,7 @@ class DataTableAccumulationStrategy : DefaultSummarizerStrategy() { val config = try { context.executionConfig.content_queries?.let { queries -> - queries.parserCast(context.parsingChatter.getChildClient(context.task)) + queries.parserCast(context.orchestrationConfig.parsingChatter.getChildClient(context.task)) } ?: DataTableConfig() } catch (e: Exception) { log.error("Failed to parse config for final output", e) diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DefaultSummarizerStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DefaultSummarizerStrategy.kt index 8af6ed46..c3aeceb4 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DefaultSummarizerStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/DefaultSummarizerStrategy.kt @@ -95,7 +95,7 @@ open class DefaultSummarizerStrategy : PageProcessingStrategy { "Keep your response under ${maxFinalOutputSize / 1000}K characters." ).joinToString("\n\n"), model = (context.typeConfig.model?.let { context.orchestrationConfig.instance(it) } - ?: context.parsingChatter).getChildClient(context.task), + ?: context.orchestrationConfig.parsingChatter).getChildClient(context.task), ).answer( listOf("Here are summaries of each analyzed page:\n${analysisResults}"), ) @@ -138,7 +138,7 @@ open class DefaultSummarizerStrategy : PageProcessingStrategy { ): ParsedResponse { return try { val model = (context.typeConfig.model?.let { context.orchestrationConfig.instance(it) } - ?: context.parsingChatter).getChildClient(context.task) + ?: context.orchestrationConfig.parsingChatter).getChildClient(context.task) ParsedAgent( prompt = listOf( "Below are analyses of different parts of a web page related to this goal: $analysisGoal", diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/FactCheckingStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/FactCheckingStrategy.kt index dda3addd..e717092a 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/FactCheckingStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/FactCheckingStrategy.kt @@ -63,7 +63,7 @@ class FactCheckingStrategy : PageProcessingStrategy { context: PageProcessingStrategy.ProcessingContext ): PageProcessingStrategy.PageProcessingResult { val config = - context.executionConfig.content_queries?.parserCast(context.parsingChatter) + context.executionConfig.content_queries?.parserCast(context.orchestrationConfig.parsingChatter) ?: return PageProcessingStrategy.PageProcessingResult( url = url, pageType = CrawlerAgentTask.PageType.Error, @@ -174,8 +174,8 @@ class FactCheckingStrategy : PageProcessingStrategy { val analysis = ParsedAgent( prompt = prompt, resultClass = FactCheckResult::class.java, - model = context.parsingChatter.getChildClient(context.task), - parsingChatter = context.parsingChatter.getChildClient(context.task) + model = context.orchestrationConfig.parsingChatter.getChildClient(context.task), + parsingChatter = context.orchestrationConfig.parsingChatter.getChildClient(context.task) ).answer(listOf(content)) return analysis.obj.copy( diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/JobMatchingStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/JobMatchingStrategy.kt index 689083bb..13ef805c 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/JobMatchingStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/JobMatchingStrategy.kt @@ -144,7 +144,7 @@ class JobMatchingStrategy : DefaultSummarizerStrategy() { context: PageProcessingStrategy.ProcessingContext ) = try { log.debug("Processing page: $url") - val chatInterface = context.parsingChatter.getChildClient(context.task) + val chatInterface = context.orchestrationConfig.parsingChatter.getChildClient(context.task) val config = context.executionConfig.content_queries?.parserCast(chatInterface) ?: run { val errorMsg = "Missing JobMatchingConfig for job matching strategy" diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/SchemaExtractionStrategy.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/SchemaExtractionStrategy.kt index 5b7c0c4d..90a30782 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/SchemaExtractionStrategy.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/plan/tools/online/processing/SchemaExtractionStrategy.kt @@ -65,7 +65,7 @@ class SchemaExtractionStrategy : DefaultSummarizerStrategy() { val config = try { context.executionConfig.content_queries?.let { queries -> queries.parserCast( - context.parsingChatter.getChildClient( + context.orchestrationConfig.parsingChatter.getChildClient( context.task ) ) @@ -196,7 +196,7 @@ class SchemaExtractionStrategy : DefaultSummarizerStrategy() { } val model = (context.typeConfig.model?.let { context.orchestrationConfig.instance(it) } - ?: context.parsingChatter).getChildClient(context.task) + ?: context.orchestrationConfig.parsingChatter).getChildClient(context.task) return ParsedAgent( prompt = prompt, @@ -268,7 +268,7 @@ class SchemaExtractionStrategy : DefaultSummarizerStrategy() { ): String { log.info("Generating final aggregated output") val config = try { - val chatInterface = context.parsingChatter.getChildClient(context.task) + val chatInterface = context.orchestrationConfig.parsingChatter.getChildClient(context.task) context.executionConfig.content_queries?.parserCast(chatInterface) ?: SchemaExtractionConfig() } catch (e: Exception) { diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/webui/servlet/FileServlet.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/webui/servlet/FileServlet.kt index 0df2f523..1f4c1782 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/webui/servlet/FileServlet.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/webui/servlet/FileServlet.kt @@ -43,7 +43,6 @@ abstract class FileServlet : HttpServlet() { val pathSegments = parsePath(req.pathInfo ?: req.servletPath ?: "/") val dir = getDir(req) val file = dir?.let { getFile(it, pathSegments, req) } - when { false == file?.exists() -> { // Check if this is a request for HTML or PDF with an equivalent .md file diff --git a/webui/src/main/kotlin/com/simiacryptus/cognotik/webui/servlet/SessionFileServlet.kt b/webui/src/main/kotlin/com/simiacryptus/cognotik/webui/servlet/SessionFileServlet.kt index 0b828af8..bb86ff5f 100644 --- a/webui/src/main/kotlin/com/simiacryptus/cognotik/webui/servlet/SessionFileServlet.kt +++ b/webui/src/main/kotlin/com/simiacryptus/cognotik/webui/servlet/SessionFileServlet.kt @@ -34,7 +34,7 @@ class SessionFileServlet(val dataStorage: StorageInterface) : FileServlet() { // If not found, check if this is a request for HTML/PDF with an equivalent .md file val requestedFile = getFile(dirs.first(), pathSegments, req) val fileName = requestedFile.name - if (fileName.endsWith(".html") || fileName.endsWith(".pdf")) { + if (fileName.endsWith(".html") || fileName.endsWith(".pdf") || fileName.endsWith(".txt")) { val mdFileName = fileName.substringBeforeLast(".") + ".md" val mdMatch = dirs.firstOrNull { val mdFile = File(getFile(it, pathSegments, req).parentFile, mdFileName) From 9453e0b0087f8701bb726e1a82371cf1bbd39f75 Mon Sep 17 00:00:00 2001 From: Andrew Charneski Date: Wed, 24 Dec 2025 17:23:08 -0500 Subject: [PATCH 4/4] wip --- .../cognotik/chat/OpenAIChatClient.kt | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/chat/OpenAIChatClient.kt b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/chat/OpenAIChatClient.kt index b56e217e..774ae384 100644 --- a/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/chat/OpenAIChatClient.kt +++ b/jo-penai/src/main/kotlin/com/simiacryptus/cognotik/chat/OpenAIChatClient.kt @@ -2,6 +2,7 @@ package com.simiacryptus.cognotik.chat import com.google.common.util.concurrent.ListeningScheduledExecutorService import com.simiacryptus.cognotik.chat.model.ChatModel +import com.simiacryptus.cognotik.chat.model.OpenAIModels import com.simiacryptus.cognotik.models.APIProvider import com.simiacryptus.cognotik.models.ModelSchema import com.simiacryptus.cognotik.models.LLMModel @@ -9,6 +10,7 @@ import com.simiacryptus.cognotik.exceptions.ErrorUtil.checkError import com.simiacryptus.cognotik.util.JsonUtil import org.apache.hc.core5.http.HttpRequest import java.util.concurrent.ExecutorService +import java.util.concurrent.ConcurrentHashMap class OpenAIChatClient( apiKey: String, @@ -62,6 +64,55 @@ class OpenAIChatClient( require(model.modelName?.isNotBlank() == true) { "Model name cannot be blank" } require(chatRequest.model?.isNotBlank() == true) { "Chat request model must be specified" } } + override fun getModels(): List? { + modelsCache[apiBase]?.let { return it } + return try { + val modelsResponse = fetchModels() + val models = modelsResponse.mapNotNull { modelInfo -> + val knownModels = OpenAIModels.values.values + .filter { it.modelName == modelInfo.id } + if (knownModels.isNotEmpty()) { + knownModels.first() + } else if (modelInfo.id.startsWith("gpt") || modelInfo.id.startsWith("o1") || modelInfo.id.startsWith("o3")) { + ChatModel( + name = modelInfo.id, + modelName = modelInfo.id, + provider = APIProvider.OpenAI, + maxTotalTokens = 128000, + inputTokenPricePerK = 0.0, + outputTokenPricePerK = 0.0 + ) + } else { + null + } + } + modelsCache[apiBase] = models + models + } catch (e: Exception) { + log.error("Failed to fetch OpenAI models", e) + null + } + } + private fun fetchModels(): List { + val response = get("${apiBase}/models") + checkError(response) + val listResponse = JsonUtil.objectMapper().readValue(response, OpenAIListModelsResponse::class.java) + return listResponse.data + } + companion object { + private val log = com.simiacryptus.cognotik.util.LoggerFactory.getLogger(OpenAIChatClient::class.java) + private val modelsCache = ConcurrentHashMap>() + data class OpenAIModelInfo( + val id: String, + val `object`: String, + val created: Long, + val owned_by: String + ) + data class OpenAIListModelsResponse( + val `object`: String, + val data: List + ) + }