Skip to content

Commit 587e186

Browse files
committed
wip
1 parent 632326f commit 587e186

File tree

12 files changed

+352
-153
lines changed

12 files changed

+352
-153
lines changed

webui/src/main/kotlin/com/simiacryptus/skyenet/apps/general/OutlineApp.kt

Lines changed: 92 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.simiacryptus.skyenet.apps.general
22

33
import com.simiacryptus.jopenai.API
4+
import com.simiacryptus.jopenai.ChatClient
45
import com.simiacryptus.jopenai.describe.JsonDescriber
56
import com.simiacryptus.jopenai.models.ChatModel
67
import com.simiacryptus.jopenai.models.OpenAIModels
@@ -21,6 +22,8 @@ import com.simiacryptus.skyenet.webui.session.SessionTask
2122
import com.simiacryptus.util.JsonUtil
2223
import org.intellij.lang.annotations.Language
2324
import org.slf4j.LoggerFactory
25+
import java.io.File
26+
import java.util.*
2427
import java.util.concurrent.atomic.AtomicInteger
2528

2629
open 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

Comments
 (0)