Skip to content

Commit dada642

Browse files
committed
largeoutputactor
1 parent 2b7a5e0 commit dada642

File tree

18 files changed

+162
-209
lines changed

18 files changed

+162
-209
lines changed

webui/src/main/kotlin/com/simiacryptus/skyenet/webui/actors/LargeOutputActor.kt renamed to core/src/main/kotlin/com/simiacryptus/skyenet/core/actors/LargeOutputActor.kt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.simiacryptus.skyenet.webui.actors
1+
package com.simiacryptus.skyenet.core.actors
22

33
import com.google.common.base.Strings
44
import com.simiacryptus.jopenai.API
@@ -8,7 +8,8 @@ import com.simiacryptus.jopenai.models.OpenAIModels
88
import com.simiacryptus.jopenai.models.TextModel
99
import com.simiacryptus.jopenai.util.ClientUtil.toChatMessage
1010
import com.simiacryptus.jopenai.util.ClientUtil.toContentList
11-
import com.simiacryptus.skyenet.core.actors.BaseActor
11+
import com.simiacryptus.skyenet.core.util.SimpleDiffApplier
12+
import org.slf4j.LoggerFactory
1213

1314
/**
1415
* An actor that handles large outputs by using recursive replacement.
@@ -26,7 +27,14 @@ class LargeOutputActor(
2627
""".trimIndent(),
2728
name: String? = null,
2829
model: TextModel = OpenAIModels.GPT4o,
29-
temperature: Double = 0.3, private val maxIterations: Int = 3, private val namedEllipsisPattern: Regex = Regex("""\.\.\.(?<sectionName>[\w\s-_]+?)\.\.\.""")
30+
temperature: Double = 0.3,
31+
private val maxIterations: Int = 3,
32+
private val namedEllipsisPattern: Regex = Regex("""\.\.\.(?<sectionName>[\w\s-_]+?)\.\.\."""),
33+
val refinementSteps: List<Pair<String, String>> = listOf(
34+
"RedundancyReviewer" to "Review the text to identify and remove instances of redundant text or unnecessary framing language. Provide changes as a diff.",
35+
"NarrativeEnhancer" to "Review and enhance the text's narrative quality and flow. Provide changes as a diff.",
36+
"StyleConsistencyReviewer" to "Review and improve consistency in style, tone and terminology. Provide changes as a diff."
37+
)
3038
) : BaseActor<List<String>, String>(
3139
prompt = prompt, name = name, model = model, temperature = temperature
3240
) {
@@ -104,6 +112,26 @@ class LargeOutputActor(
104112
}
105113
iterations++
106114
}
115+
// Apply refinement steps after content expansion
116+
val diffApplier = SimpleDiffApplier()
117+
refinementSteps.forEach { (name, prompt) ->
118+
val refinementResponse = response(
119+
ApiModel.ChatMessage(
120+
role = ApiModel.Role.system,
121+
content = (prompt + "\n\n" + SimpleDiffApplier.patchEditorPrompt).toContentList()
122+
),
123+
ApiModel.ChatMessage(
124+
role = ApiModel.Role.user,
125+
content = accumulatedResponse.toContentList()
126+
),
127+
api = api
128+
)
129+
try {
130+
accumulatedResponse = diffApplier.apply(accumulatedResponse, refinementResponse.choices.first().message?.content ?: "")
131+
} catch (e: Exception) {
132+
log.warn("Error applying $name refinement", e)
133+
}
134+
}
107135
return accumulatedResponse
108136
}
109137

@@ -114,9 +142,13 @@ class LargeOutputActor(
114142
model = model,
115143
temperature = this.temperature,
116144
maxIterations = this.maxIterations,
117-
namedEllipsisPattern = this.namedEllipsisPattern
145+
namedEllipsisPattern = this.namedEllipsisPattern,
146+
refinementSteps = this.refinementSteps
118147
)
119148
}
149+
companion object {
150+
private val log = LoggerFactory.getLogger(LargeOutputActor::class.java)
151+
}
120152
}
121153

122154

webui/src/main/kotlin/com/simiacryptus/diff/FileValidationUtils.kt renamed to core/src/main/kotlin/com/simiacryptus/skyenet/core/util/FileValidationUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.simiacryptus.diff
1+
package com.simiacryptus.skyenet.core.util
22

33
import java.io.File
44
import java.nio.file.Path

webui/src/main/kotlin/com/simiacryptus/diff/IterativePatchUtil.kt renamed to core/src/main/kotlin/com/simiacryptus/skyenet/core/util/IterativePatchUtil.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
@file:Suppress("LoggingSimilarMessage")
22

3-
package com.simiacryptus.diff
3+
package com.simiacryptus.skyenet.core.util
44

5-
import com.simiacryptus.diff.IterativePatchUtil.LineType.*
5+
import com.simiacryptus.skyenet.core.util.IterativePatchUtil.LineType.*
66
import org.apache.commons.text.similarity.LevenshteinDistance
77
import org.slf4j.LoggerFactory
88
import kotlin.math.floor
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package com.simiacryptus.skyenet.core.util
2+
3+
class SimpleDiffApplier {
4+
companion object {
5+
val log = org.slf4j.LoggerFactory.getLogger(SimpleDiffApplier::class.java)
6+
7+
private const val MAX_DIFF_SIZE_CHARS = 100000
8+
9+
private val DIFF_PATTERN = """(?s)(?<![^\n])```diff\n(.*?)\n```""".toRegex()
10+
11+
val patchEditorPrompt = """
12+
Response should use one or more code patches in diff format within ```diff code blocks.
13+
Each diff should be preceded by a header that identifies the file being modified.
14+
The diff format should use + for line additions, - for line deletions.
15+
The diff should include 2 lines of context before and after every change.
16+
17+
Example:
18+
19+
Here are the patches:
20+
21+
### src/utils/exampleUtils.js
22+
```diff
23+
// Utility functions for example feature
24+
const b = 2;
25+
function exampleFunction() {
26+
- return b + 1;
27+
+ return b + 2;
28+
}
29+
```
30+
31+
### tests/exampleUtils.test.js
32+
```diff
33+
// Unit tests for exampleUtils
34+
const assert = require('assert');
35+
const { exampleFunction } = require('../src/utils/exampleUtils');
36+
37+
describe('exampleFunction', () => {
38+
- it('should return 3', () => {
39+
+ it('should return 4', () => {
40+
assert.equal(exampleFunction(), 3);
41+
});
42+
});
43+
```
44+
45+
If needed, new files can be created by using code blocks labeled with the filename in the same manner.
46+
""".trimIndent()
47+
48+
}
49+
50+
private fun validateDiffSize(diff: String): Boolean {
51+
return diff.length <= MAX_DIFF_SIZE_CHARS
52+
}
53+
54+
fun apply(
55+
code: String,
56+
response: String,
57+
): String {
58+
val matches = DIFF_PATTERN.findAll(response).distinct()
59+
var currentCode = code
60+
61+
matches.forEach { diffBlock ->
62+
val diffVal: String = diffBlock.groupValues[1]
63+
try {
64+
if (!validateDiffSize(diffVal)) {
65+
throw IllegalArgumentException("Diff size exceeds maximum limit")
66+
}
67+
68+
val isParenthesisBalanced = FileValidationUtils.isParenthesisBalanced(currentCode)
69+
val isQuoteBalanced = FileValidationUtils.isQuoteBalanced(currentCode)
70+
val isSingleQuoteBalanced = FileValidationUtils.isSingleQuoteBalanced(currentCode)
71+
val isCurlyBalanced = FileValidationUtils.isCurlyBalanced(currentCode)
72+
val isSquareBalanced = FileValidationUtils.isSquareBalanced(currentCode)
73+
74+
val newCode = IterativePatchUtil.applyPatch(currentCode, diffVal).replace("\r", "")
75+
76+
val isParenthesisBalancedNew = FileValidationUtils.isParenthesisBalanced(newCode)
77+
val isQuoteBalancedNew = FileValidationUtils.isQuoteBalanced(newCode)
78+
val isSingleQuoteBalancedNew = FileValidationUtils.isSingleQuoteBalanced(newCode)
79+
val isCurlyBalancedNew = FileValidationUtils.isCurlyBalanced(newCode)
80+
val isSquareBalancedNew = FileValidationUtils.isSquareBalanced(newCode)
81+
82+
val isError = (isCurlyBalanced && !isCurlyBalancedNew) ||
83+
(isSquareBalanced && !isSquareBalancedNew) ||
84+
(isParenthesisBalanced && !isParenthesisBalancedNew) ||
85+
(isQuoteBalanced && !isQuoteBalancedNew) ||
86+
(isSingleQuoteBalanced && !isSingleQuoteBalancedNew)
87+
88+
if (isError) {
89+
val error = StringBuilder()
90+
if (!isCurlyBalancedNew) error.append("Curly braces are not balanced\n")
91+
if (!isSquareBalancedNew) error.append("Square braces are not balanced\n")
92+
if (!isParenthesisBalancedNew) error.append("Parenthesis are not balanced\n")
93+
if (!isQuoteBalancedNew) error.append("Quotes are not balanced\n")
94+
if (!isSingleQuoteBalancedNew) error.append("Single quotes are not balanced\n")
95+
throw IllegalStateException(error.toString())
96+
}
97+
98+
currentCode = newCode
99+
} catch (e: Throwable) {
100+
log.error("Error applying diff", e)
101+
throw e
102+
}
103+
}
104+
105+
return currentCode
106+
}
107+
}

webui/src/main/kotlin/com/simiacryptus/diff/AddApplyDiffLinks.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.simiacryptus.diff
22

33
import com.simiacryptus.skyenet.AgentPatterns.displayMapInTabs
4+
import com.simiacryptus.skyenet.core.util.FileValidationUtils
5+
import com.simiacryptus.skyenet.core.util.IterativePatchUtil
46
import com.simiacryptus.skyenet.set
57
import com.simiacryptus.skyenet.util.MarkdownUtil.renderMarkdown
68
import com.simiacryptus.skyenet.webui.application.ApplicationInterface

webui/src/main/kotlin/com/simiacryptus/diff/AddApplyFileDiffLinks.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
package com.simiacryptus.diff
22

3-
import com.simiacryptus.diff.FileValidationUtils.Companion.isGitignore
3+
import com.simiacryptus.skyenet.core.util.FileValidationUtils.Companion.isGitignore
44
import com.simiacryptus.jopenai.API
55
import com.simiacryptus.jopenai.OpenAIClient
66
import com.simiacryptus.jopenai.models.ChatModel
77
import com.simiacryptus.jopenai.models.OpenAIModels
88
import com.simiacryptus.skyenet.AgentPatterns.displayMapInTabs
9-
import com.simiacryptus.skyenet.core.actors.ParsedActor
109
import com.simiacryptus.skyenet.core.actors.SimpleActor
10+
import com.simiacryptus.skyenet.core.util.FileValidationUtils
11+
import com.simiacryptus.skyenet.core.util.IterativePatchUtil
1112
import com.simiacryptus.skyenet.set
1213
import com.simiacryptus.skyenet.util.MarkdownUtil.renderMarkdown
1314
import com.simiacryptus.skyenet.webui.application.ApplicationInterface
1415
import com.simiacryptus.skyenet.webui.session.SocketManagerBase
15-
import com.simiacryptus.util.JsonUtil
16-
import kotlinx.coroutines.withTimeout
1716
import java.io.File
18-
import java.io.IOException
1917
import java.nio.file.Path
20-
import java.util.concurrent.TimeoutException
2118
import java.util.concurrent.atomic.AtomicReference
2219
import kotlin.io.path.readText
2320

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
package com.simiacryptus.diff
22

3+
import com.simiacryptus.skyenet.core.util.IterativePatchUtil
4+
35
typealias PatchUtil = IterativePatchUtil

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.simiacryptus.skyenet.apps.general
22

33

4-
import com.simiacryptus.diff.FileValidationUtils
4+
import com.simiacryptus.skyenet.core.util.FileValidationUtils
55
import com.simiacryptus.jopenai.ChatClient
66
import com.simiacryptus.jopenai.models.ChatModel
77
import com.simiacryptus.skyenet.set

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.simiacryptus.skyenet.apps.general
22

3-
import com.simiacryptus.diff.FileValidationUtils
3+
import com.simiacryptus.skyenet.core.util.FileValidationUtils
44
import com.simiacryptus.jopenai.ChatClient
55
import com.simiacryptus.jopenai.models.ChatModel
66
import com.simiacryptus.skyenet.core.platform.Session

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import com.simiacryptus.jopenai.util.GPT4Tokenizer
1010
import com.simiacryptus.skyenet.TabbedDisplay
1111
import com.simiacryptus.skyenet.apps.general.OutlineManager.NodeList
1212
import com.simiacryptus.skyenet.core.actors.ActorSystem
13-
import com.simiacryptus.skyenet.webui.actors.LargeOutputActor
13+
import com.simiacryptus.skyenet.core.actors.LargeOutputActor
1414
import com.simiacryptus.skyenet.core.actors.ParsedActor
1515
import com.simiacryptus.skyenet.core.platform.Session
1616
import com.simiacryptus.skyenet.core.platform.model.StorageInterface

0 commit comments

Comments
 (0)