33import com.github.simiacryptus.aicoder.AppServer
44import com.github.simiacryptus.aicoder.actions.BaseAction
55import com.github.simiacryptus.aicoder.actions.generic.MultiStepPatchAction.AutoDevApp.Settings
6+ import com.github.simiacryptus.aicoder.config.AppSettingsState
67import com.github.simiacryptus.aicoder.util.UITools
7- import com.simiacryptus.diff.addApplyFileDiffLinks
8- import com.simiacryptus.diff.addSaveLinks
98import com.intellij.openapi.actionSystem.ActionUpdateThread
109import com.intellij.openapi.actionSystem.AnActionEvent
1110import com.intellij.openapi.actionSystem.PlatformDataKeys
1211import com.intellij.openapi.vfs.VirtualFile
12+ import com.simiacryptus.diff.addApplyFileDiffLinks
13+ import com.simiacryptus.diff.addSaveLinks
1314import com.simiacryptus.jopenai.API
1415import com.simiacryptus.jopenai.ApiModel
1516import com.simiacryptus.jopenai.ApiModel.Role
16- import com.simiacryptus.jopenai.models.ChatModels
17+ import com.simiacryptus.jopenai.GPT4Tokenizer
1718import com.simiacryptus.jopenai.util.ClientUtil.toContentList
1819import com.simiacryptus.skyenet.Discussable
19- import com.simiacryptus.skyenet.core.actors.ActorSystem
20- import com.simiacryptus.skyenet.core.actors.BaseActor
2120import com.simiacryptus.skyenet.core.actors.SimpleActor
22- import com.simiacryptus.skyenet.core.platform.*
21+ import com.simiacryptus.skyenet.core.platform.ClientManager
22+ import com.simiacryptus.skyenet.core.platform.Session
23+ import com.simiacryptus.skyenet.core.platform.StorageInterface
24+ import com.simiacryptus.skyenet.core.platform.User
2325import com.simiacryptus.skyenet.webui.application.ApplicationInterface
2426import com.simiacryptus.skyenet.webui.application.ApplicationServer
2527import com.simiacryptus.skyenet.webui.chat.ChatServer
@@ -37,7 +39,6 @@ class MultiDiffChatAction : BaseAction() {
3739 val path = " /multiDiffChat"
3840
3941 override fun handle (event : AnActionEvent ) {
40-
4142 var root: Path ? = null
4243 val codeFiles: MutableSet <Path > = mutableSetOf ()
4344 fun codeSummary () = codeFiles.filter {
@@ -64,11 +65,8 @@ class MultiDiffChatAction : BaseAction() {
6465
6566 val files = getFiles(virtualFiles, root!! )
6667 codeFiles.addAll(files)
67-
6868 val session = StorageInterface .newGlobalID()
69-
7069 agents[session] = PatchApp (event, root!! .toFile(), { codeSummary() }, codeFiles)
71-
7270 val server = AppServer .getServer(event.project)
7371 val app = initApp(server, path)
7472 app.sessions[session] = app.newSession(null , session)
@@ -95,48 +93,8 @@ class MultiDiffChatAction : BaseAction() {
9593 ) {
9694 override val singleInput = false
9795 override val stickyInput = true
98-
99- override fun userMessage (
100- session : Session ,
101- user : User ? ,
102- userMessage : String ,
103- ui : ApplicationInterface ,
104- api : API
105- ) {
106- val settings = getSettings(session, user) ? : Settings ()
107- if (api is ClientManager .MonitoredClient ) api.budget = settings.budget ? : 2.00
108- PatchAgent (
109- api = api,
110- dataStorage = dataStorage,
111- session = session,
112- user = user,
113- ui = ui,
114- model = settings.model!! ,
115- event = event,
116- root = root,
117- codeSummary = { codeSummary() },
118- codeFiles = { codeFiles },
119- ).start(
120- userMessage = userMessage,
121- )
122- }
123- }
124-
125- enum class ActorTypes {
126- MainActor ,
127- }
128-
129- inner class PatchAgent (
130- val api : API ,
131- dataStorage : StorageInterface ,
132- session : Session ,
133- user : User ? ,
134- val ui : ApplicationInterface ,
135- val model : ChatModels ,
136- val codeSummary : () -> String ,
137- val codeFiles : () -> Set <Path >,
138- actorMap : Map <ActorTypes , BaseActor <* , * >> = mapOf(
139- ActorTypes .MainActor to SimpleActor (
96+ private val mainActor: SimpleActor
97+ get() = SimpleActor (
14098 prompt = """
14199 |You are a helpful AI that helps people with coding.
142100 |
@@ -179,31 +137,34 @@ class MultiDiffChatAction : BaseAction() {
179137 |
180138 |If needed, new files can be created by using code blocks labeled with the filename in the same manner.
181139 """ .trimMargin(),
182- model = model
183- ),
184- ),
185- val event: AnActionEvent ,
186- val root: File ,
187- ) : ActorSystem <ActorTypes >(
188- actorMap.map { it.key.name to it.value }.toMap(), dataStorage, user, session
189- ) {
190-
191- private val mainActor by lazy { getActor(ActorTypes .MainActor ) as SimpleActor }
140+ model = AppSettingsState .instance.defaultSmartModel()
141+ )
192142
193- fun start(
143+ override fun userMessage (
144+ session : Session ,
145+ user : User ? ,
194146 userMessage : String ,
147+ ui : ApplicationInterface ,
148+ api : API
195149 ) {
150+ val settings = getSettings(session, user) ? : Settings ()
151+ if (api is ClientManager .MonitoredClient ) api.budget = settings.budget ? : 2.00
152+
196153 val task = ui.newTask()
154+ val codex = GPT4Tokenizer ()
155+ task.header(renderMarkdown(codeFiles.joinToString(" \n " ) { path ->
156+ " * $path - ${codex.estimateTokenCount(root.resolve(path.toFile()).readText())} tokens"
157+ }))
197158 val toInput = { it: String -> listOf (codeSummary(), it) }
198159 Discussable (
199160 task = task,
200161 userMessage = { userMessage },
201- heading = userMessage,
162+ heading = renderMarkdown( userMessage) ,
202163 initialResponse = { it: String -> mainActor.answer(toInput(it), api = api) },
203164 outputFn = { design: String ->
204165 var markdown = ui.socketManager.addApplyFileDiffLinks(
205166 root = root.toPath(),
206- code = { codeFiles() .associateWith { root.resolve(it.toFile()).readText(Charsets .UTF_8 ) } },
167+ code = { codeFiles.associateWith { root.resolve(it.toFile()).readText(Charsets .UTF_8 ) } },
207168 response = design,
208169 handle = { newCodeMap ->
209170 newCodeMap.forEach { (path, newCode) ->
@@ -237,6 +198,7 @@ class MultiDiffChatAction : BaseAction() {
237198 }
238199 }
239200
201+
240202 private fun getFiles (
241203 virtualFiles : Array <out VirtualFile >? ,
242204 root : Path
0 commit comments