11package com.simiacryptus.skyenet.apps.general
22
33import com.simiacryptus.jopenai.API
4+ import com.simiacryptus.jopenai.ChatClient
45import com.simiacryptus.jopenai.describe.JsonDescriber
56import com.simiacryptus.jopenai.models.ChatModel
67import com.simiacryptus.jopenai.models.OpenAIModels
@@ -21,6 +22,8 @@ import com.simiacryptus.skyenet.webui.session.SessionTask
2122import com.simiacryptus.util.JsonUtil
2223import org.intellij.lang.annotations.Language
2324import org.slf4j.LoggerFactory
25+ import java.io.File
26+ import java.util.*
2427import java.util.concurrent.atomic.AtomicInteger
2528
2629open class OutlineApp (
@@ -130,74 +133,106 @@ class OutlineAgent(
130133 private val tokenizer = GPT4Tokenizer (false )
131134
132135 fun buildMap () {
133- val message = ui.newTask(false )
134- tabbedDisplay[" Content" ] = message.placeholder
136+ val task = ui.newTask(false )
137+ val api = (api as ChatClient ).getChildClient().apply {
138+ val createFile = task.createFile(" .logs/api-${UUID .randomUUID()} .log" )
139+ createFile.second?.apply {
140+ logStreams + = this .outputStream().buffered()
141+ log.debug(" Created API log file" )
142+ task.verbose(" API log: <a href=\" file:///$this \" >$this </a>" )
143+ }
144+ }
145+ tabbedDisplay[" Content" ] = task.placeholder
135146 val outlineManager = try {
136- message .echo(renderMarkdown(this .userMessage, ui = ui))
147+ task .echo(renderMarkdown(this .userMessage, ui = ui))
137148 val root = initial.answer(listOf (this .userMessage), api = api)
138- message .add(renderMarkdown(root.text, ui = ui))
139- message .verbose(JsonUtil .toJson(root.obj))
140- message .complete()
149+ task .add(renderMarkdown(root.text, ui = ui))
150+ task .verbose(JsonUtil .toJson(root.obj))
151+ task .complete()
141152 OutlineManager (OutlineManager .OutlinedText (root.text, root.obj))
142153 } catch (e: Exception ) {
143- message .error(ui, e)
154+ task .error(ui, e)
144155 throw e
145156 }
146157
147158 if (models.isNotEmpty()) {
148- processRecursive(outlineManager, outlineManager.rootNode, models, message )
159+ processRecursive(outlineManager, outlineManager.rootNode, models, task )
149160 while (activeThreadCounter.get() == 0 ) Thread .sleep(100 ) // Wait for at least one thread to start
150161 while (activeThreadCounter.get() > 0 ) Thread .sleep(100 ) // Wait for all threads to finish
151162 }
152163
153164 val sessionDir = dataStorage.getSessionDir(user, session)
154165 sessionDir.resolve(" nodes.json" ).writeText(JsonUtil .toJson(outlineManager.nodes))
155166
167+ val finalOutline = finalOutline(outlineManager, sessionDir)
168+
169+ if (showProjector) {
170+ showProjector(api, outlineManager, finalOutline)
171+ }
172+
173+ if (writeFinalEssay) {
174+ finalEssay(finalOutline, outlineManager, sessionDir)
175+ }
176+ tabbedDisplay.update()
177+ }
178+
179+ private fun finalOutline (
180+ outlineManager : OutlineManager ,
181+ sessionDir : File
182+ ): List <OutlineManager .Node > {
156183 val finalOutlineMessage = ui.newTask(false )
157184 tabbedDisplay[" Outline" ] = finalOutlineMessage.placeholder
158185 finalOutlineMessage.header(" Final Outline" )
159186 val finalOutline = outlineManager.buildFinalOutline()
160187 finalOutlineMessage.verbose(JsonUtil .toJson(finalOutline))
161- val textOutline = finalOutline?. let { NodeList (it) }? .getTextOutline() ? : " "
188+ val textOutline = NodeList (finalOutline) .getTextOutline()
162189 finalOutlineMessage.complete(renderMarkdown(textOutline, ui = ui))
163190 sessionDir.resolve(" finalOutline.json" ).writeText(JsonUtil .toJson(finalOutline))
164191 sessionDir.resolve(" textOutline.md" ).writeText(textOutline)
192+ return finalOutline
193+ }
165194
166- if (showProjector) {
167- val projectorMessage = ui.newTask(false )
168- tabbedDisplay[" Projector" ] = projectorMessage.placeholder
169- projectorMessage.header(" Embedding Projector" )
170- try {
171- val response = TensorflowProjector (
172- api = api,
173- dataStorage = dataStorage,
174- sessionID = session,
175- session = ui,
176- userId = user,
177- ).writeTensorflowEmbeddingProjectorHtml(
178- * outlineManager.getLeafDescriptions(finalOutline?.let { NodeList (it) }!! ).toTypedArray()
179- )
180- projectorMessage.complete(response)
181- } catch (e: Exception ) {
182- log.warn(" Error" , e)
183- projectorMessage.error(ui, e)
184- }
195+ private fun showProjector (
196+ api : ChatClient ,
197+ outlineManager : OutlineManager ,
198+ finalOutline : List <OutlineManager .Node >
199+ ) {
200+ val projectorMessage = ui.newTask(false )
201+ tabbedDisplay[" Projector" ] = projectorMessage.placeholder
202+ projectorMessage.header(" Embedding Projector" )
203+ try {
204+ val response = TensorflowProjector (
205+ api = api,
206+ dataStorage = dataStorage,
207+ sessionID = session,
208+ session = ui,
209+ userId = user,
210+ ).writeTensorflowEmbeddingProjectorHtml(
211+ * outlineManager.getLeafDescriptions(NodeList (finalOutline)).toTypedArray()
212+ )
213+ projectorMessage.complete(response)
214+ } catch (e: Exception ) {
215+ log.warn(" Error" , e)
216+ projectorMessage.error(ui, e)
185217 }
218+ }
186219
187- if (writeFinalEssay) {
188- val finalRenderMessage = ui.newTask(false )
189- tabbedDisplay[" Final Essay" ] = finalRenderMessage.placeholder
190- finalRenderMessage.header(" Final Render" )
191- try {
192- val finalEssay = buildFinalEssay(finalOutline?.let { NodeList (it) }!! , outlineManager)
193- sessionDir.resolve(" finalEssay.md" ).writeText(finalEssay)
194- finalRenderMessage.complete(renderMarkdown(finalEssay, ui = ui))
195- } catch (e: Exception ) {
196- log.warn(" Error" , e)
197- finalRenderMessage.error(ui, e)
198- }
220+ private fun finalEssay (
221+ finalOutline : List <OutlineManager .Node >,
222+ outlineManager : OutlineManager ,
223+ sessionDir : File
224+ ) {
225+ val finalRenderMessage = ui.newTask(false )
226+ tabbedDisplay[" Final Essay" ] = finalRenderMessage.placeholder
227+ finalRenderMessage.header(" Final Render" )
228+ try {
229+ val finalEssay = buildFinalEssay(NodeList (finalOutline), outlineManager)
230+ sessionDir.resolve(" finalEssay.md" ).writeText(finalEssay)
231+ finalRenderMessage.complete(renderMarkdown(finalEssay, ui = ui))
232+ } catch (e: Exception ) {
233+ log.warn(" Error" , e)
234+ finalRenderMessage.error(ui, e)
199235 }
200- tabbedDisplay.update()
201236 }
202237
203238 private fun buildFinalEssay (
@@ -226,25 +261,33 @@ class OutlineAgent(
226261 }
227262 for ((item, childNode) in terminalNodeMap) {
228263 activeThreadCounter.incrementAndGet()
229- val message = ui.newTask(false )
230- tabbedDisplay[item] = message.placeholder
264+ val task = ui.newTask(false )
265+ val api = (api as ChatClient ).getChildClient().apply {
266+ val createFile = task.createFile(" .logs/api-${UUID .randomUUID()} .log" )
267+ createFile.second?.apply {
268+ logStreams + = this .outputStream().buffered()
269+ log.debug(" Created API log file" )
270+ task.verbose(" API log: <a href=\" file:///$this \" >$this </a>" )
271+ }
272+ }
273+ tabbedDisplay[item] = task.placeholder
231274 pool.submit {
232275 try {
233- val newNode = processNode(node, item, manager, message , models.first()) ? : return @submit
276+ val newNode = processNode(node, item, manager, task , models.first(), api ) ? : return @submit
234277 synchronized(manager.expansionMap) {
235278 if (! manager.expansionMap.containsKey(childNode)) {
236279 manager.expansionMap[childNode] = newNode
237280 } else {
238281 val existingNode = manager.expansionMap[childNode]!!
239282 val errorMessage = " Conflict: ${existingNode} vs ${newNode} "
240283 log.warn(errorMessage)
241- message .error(ui, RuntimeException (errorMessage))
284+ task .error(ui, RuntimeException (errorMessage))
242285 }
243286 }
244- if (models.size > 1 ) processRecursive(manager, newNode, models.drop(1 ), message )
287+ if (models.size > 1 ) processRecursive(manager, newNode, models.drop(1 ), task )
245288 } catch (e: Exception ) {
246289 log.warn(" Error in processRecursive" , e)
247- message .error(ui, e)
290+ task .error(ui, e)
248291 } finally {
249292 activeThreadCounter.decrementAndGet()
250293 }
@@ -259,6 +302,7 @@ class OutlineAgent(
259302 outlineManager : OutlineManager ,
260303 message : SessionTask ,
261304 model : ChatModel ,
305+ api : API ,
262306 ): OutlineManager .OutlinedText ? {
263307 if (tokenizer.estimateTokenCount(parent.text) <= minSize) {
264308 log.debug(" Skipping: ${parent.text} " )
@@ -338,7 +382,7 @@ interface OutlineActors {
338382 exampleInstance = exampleNodeList(),
339383 )
340384
341- private fun finalWriter (temperature : Double , model : ChatModel , maxIterations : Int = 5 ) = LargeOutputActor (
385+ private fun finalWriter (temperature : Double , model : ChatModel , maxIterations : Int ) = LargeOutputActor (
342386 model = model,
343387 temperature = temperature,
344388 maxIterations = maxIterations,
0 commit comments