unit-mesh / auto-dev

🧙‍AutoDev: The AI-powered coding wizard(AI 驱动编程助手)with multilingual support 🌐, auto code generation 🏗️, and a helpful bug-slaying assistant 🐞! Customizable prompts 🎨 and a magic Auto Dev/Testing/Document/Agent feature 🧪 included! 🚀
https://ide.unitmesh.cc/
Mozilla Public License 2.0
2.78k stars 317 forks source link

custom_agent 執行/write 無法產生新檔案 #144

Closed ymli0215 closed 6 months ago

ymli0215 commented 6 months ago

@phodal

正在嘗試透過 custom agent 來做一些連續性的流程,是透過nodejs寫agent

app.post("/api/agent/junit", (req, res) => {
    const reqCtx = req.body.messages[0].content;

    res.type('text/plain');
    res.send( `
/write:len/test.java#L1-L12

\`\`\`java
public class Controller {
    public void method() {
        System.out.println("Hello, World!");
    }
}

\`\`\`
`);
});

上述的寫法,沒有辦法把內容寫到已存在的檔案,也無法產生新檔案

如果改為下方,就是透過 ` devin ``` 將 /write包起來,就可以把內容寫到已存在檔案內,但是依然不能產生新檔案

app.post("/api/agent/junit", (req, res) => {
    const reqCtx = req.body.messages[0].content;
console.log('');
    res.type('text/plain');
    res.send(`
\`\`\`devin  <-  增加這段

/write:len/test.java#L1-L12

\\\`\\\`\\\`java
public class Controller {
    public void method() {
        System.out.println("Hello, World!666");
    }
}
\\\`\\\`\\\`

\`\`\`
`);
});

下方是log內容,看起來也跟 #143有類似的問題


com.intellij.openapi.diagnostic.RuntimeExceptionWithAttachments: Read access is allowed from inside read-action (see Application.runReadAction()); see https://jb.gg/ij-platform-threading for details
Current thread: Thread[DefaultDispatcher-worker-7,6,main] 780236061 (EventQueue.isDispatchThread()=false)
SystemEventQueueThread: Thread[AWT-EventQueue-0,6,main] 1322118874
    at com.intellij.util.concurrency.ThreadingAssertions.createThreadAccessException(ThreadingAssertions.java:149)
    at com.intellij.util.concurrency.ThreadingAssertions.softAssertReadAccess(ThreadingAssertions.java:107)
    at com.intellij.openapi.application.impl.ApplicationImpl.assertReadAccessAllowed(ApplicationImpl.java:1012)
    at com.intellij.psi.impl.source.tree.TreeElement.assertReadAccessAllowed(TreeElement.java:421)
    at com.intellij.psi.impl.source.tree.CompositeElement.textToCharArray(CompositeElement.java:234)
    at com.intellij.psi.impl.source.tree.CompositeElement.getText(CompositeElement.java:217)
    at com.intellij.extapi.psi.ASTDelegatePsiElement.getText(ASTDelegatePsiElement.java:133)
    at cc.unitmesh.devti.language.compiler.DevInsCompiler.processingCommand(DevInsCompiler.kt:170)
    at cc.unitmesh.devti.language.compiler.DevInsCompiler.processUsed(DevInsCompiler.kt:108)
    at cc.unitmesh.devti.language.compiler.DevInsCompiler.compile(DevInsCompiler.kt:51)
    at cc.unitmesh.devti.language.run.flow.DevInsProcessProcessor.executeTask(DevInsProcessProcessor.kt:88)
    at cc.unitmesh.devti.language.run.flow.DevInsProcessProcessor.process(DevInsProcessProcessor.kt:61)
phodal commented 6 months ago

我测试了一下本地是可以的,看一下你的插件更新了没有。

ymli0215 commented 6 months ago

有重新下載安裝 https://github.com/unit-mesh/auto-dev/releases/tag/v1.8.1

測試還是一樣的問題,customer_agent回傳下方內容

```devin

/write:len/test.java#L1-L12

\`\`\`java
public class Controller {
    public void method() {
        System.out.println("Hello, World!666");
    }
}
\`\`\`

`` `

如果檔案存在,雖然會寫入檔案 但是會跳出chat panel image

如果檔案不存在,就會報錯

com.intellij.openapi.diagnostic.RuntimeExceptionWithAttachments: Read access is allowed from inside read-action (see Application.runReadAction()); see https://jb.gg/ij-platform-threading for details
Current thread: Thread[DefaultDispatcher-worker-1,6,main] 1723949919 (EventQueue.isDispatchThread()=false)
SystemEventQueueThread: Thread[AWT-EventQueue-0,6,main] 863239784
    at com.intellij.util.concurrency.ThreadingAssertions.createThreadAccessException(ThreadingAssertions.java:149)
    at com.intellij.util.concurrency.ThreadingAssertions.softAssertReadAccess(ThreadingAssertions.java:107)
    at com.intellij.openapi.application.impl.ApplicationImpl.assertReadAccessAllowed(ApplicationImpl.java:1012)
    at com.intellij.psi.impl.source.PsiFileImpl.assertReadAccessAllowed(PsiFileImpl.java:182)
    at com.intellij.psi.impl.source.PsiFileImpl.loadTreeElement(PsiFileImpl.java:186)
    at com.intellij.psi.impl.source.PsiFileImpl.getTreeElement(PsiFileImpl.java:109)
    at com.intellij.psi.impl.source.PsiFileImpl.calcTreeElement(PsiFileImpl.java:727)
    at com.intellij.psi.impl.source.PsiFileImpl.getNode(PsiFileImpl.java:927)
    at com.intellij.psi.impl.PsiFileFactoryImpl.trySetupPsiForFile(PsiFileFactoryImpl.java:110)
    at com.intellij.psi.impl.PsiFileFactoryImpl.createFileFromText(PsiFileFactoryImpl.java:74)
    at com.intellij.psi.impl.PsiFileFactoryImpl.createFileFromText(PsiFileFactoryImpl.java:59)
    at com.intellij.psi.impl.PsiFileFactoryImpl.createFileFromText(PsiFileFactoryImpl.java:53)
    at com.intellij.psi.impl.PsiFileFactoryImpl.createFileFromText(PsiFileFactoryImpl.java:47)
    at cc.unitmesh.devti.language.psi.DevInFile$Companion.fromString(DevInFile.kt:28)
    at cc.unitmesh.devti.language.run.flow.DevInsProcessProcessor.process(DevInsProcessProcessor.kt:61)
    at cc.unitmesh.devti.language.run.DevInsProgramRunner$doExecute$1.runFinish(DevInsProgramRunner.kt:37)
    at com.intellij.util.messages.impl.MessageBusImplKt.invokeMethod(MessageBusImpl.kt:700)
    at com.intellij.util.messages.impl.MessageBusImplKt.invokeListener(MessageBusImpl.kt:660)
    at com.intellij.util.messages.impl.MessageBusImplKt.deliverMessage(MessageBusImpl.kt:423)
    at com.intellij.util.messages.impl.MessageBusImplKt.pumpWaiting(MessageBusImpl.kt:402)
    at com.intellij.util.messages.impl.MessageBusImplKt.access$pumpWaiting(MessageBusImpl.kt:1)
    at com.intellij.util.messages.impl.MessagePublisher.invoke(MessageBusImpl.kt:461)
    at jdk.proxy15/jdk.proxy15.$Proxy232.runFinish(Unknown Source)
    at cc.unitmesh.devti.language.run.DevInsRunConfigurationProfileState$execute$1.processTerminated(DevInsRunConfigurationProfileState.kt:57)
    at com.intellij.execution.process.ProcessHandler$2.processTerminated(ProcessHandler.java:259)
    at com.intellij.execution.process.ProcessHandler.lambda$notifyTerminated$2(ProcessHandler.java:204)
    at com.intellij.execution.process.ProcessHandler$TasksRunner.execute(ProcessHandler.java:322)
    at com.intellij.execution.process.ProcessHandler.notifyTerminated(ProcessHandler.java:187)
    at com.intellij.execution.process.ProcessHandler.notifyProcessTerminated(ProcessHandler.java:183)
    at cc.unitmesh.devti.language.run.DevInsProcessHandler.detachProcessImpl(DevInsProcessHandler.kt:9)
    at com.intellij.execution.process.ProcessHandler.lambda$detachProcess$1(ProcessHandler.java:140)
    at com.intellij.execution.process.ProcessHandler$TasksRunner.execute(ProcessHandler.java:322)
    at com.intellij.execution.process.ProcessHandler.detachProcess(ProcessHandler.java:137)
    at cc.unitmesh.devti.language.run.DevInsRunConfigurationProfileState$agentRun$1$1.invokeSuspend(DevInsRunConfigurationProfileState.kt:152)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
phodal commented 6 months ago

奇怪,你用的是什么版本 => Intellij IDEA 版本?

ymli0215 commented 6 months ago

IntelliJ IDEA 2023.3.6 Build #IU-233.15026.9

還是請問你用的是啥版本??

phodal commented 6 months ago

对,我这边测试完,好像还行。明天我试试用 233.3.6 的版本

IntelliJ IDEA 2024.1 (Ultimate Edition) Build #IU-241.14494.240, built on March 28, 2024

ymli0215 commented 6 months ago

回報一下,剛剛下載IntelliJ IDEA 2024.1 Build #IU-241.14494.240 來測試

還是一樣的問題,透過custom_agent返回 /write 無法產生新檔案,並且要透過 ` devin ``` 包起來才能寫入

phodal commented 6 months ago

哦,哦,之前理解错了,agent 里只有返回 devin 代码块才能执行:https://ide.unitmesh.cc/devins/orchestration.html

相当于是一种额外执行的规则。

phodal commented 6 months ago

还有一种方式可以适应你的需求,在自定义 AI Agent 中新增:responseAction 为 DevIns,这样默认返回的就是可执行。

 {
   "name": "Internal API Market",
   "url": "http://127.0.0.1:8765/api/agent/api-market",
   "responseAction": "DevIns"
 }
ymli0215 commented 6 months ago

"responseAction": "DevIns" <- 之前有試過這個參數,但是會出現圖中的錯誤 image

忽略它直接執行,會變成不能呼叫custom agent

phodal commented 6 months ago

@ymli0215 这个功能还不支持,如果需要的话,可以加

ymli0215 commented 6 months ago

responseAction 增加 DevIns 我後面再來許願

想要先處理好 agent 回應可以 /write 現在問題就是 https://github.com/unit-mesh/auto-dev/issues/144#issuecomment-2047618270 這邊所提到的情況

phodal commented 6 months ago

@ymli0215 我刚加完了。因为默认会联系对话,所以还是建议放在 ```devin 代码块中。

ymli0215 commented 6 months ago

但是目前版本 我agent 回傳下方內容,他還是會聯繫對話,跳出chat來喔

`` `devin

/write:test.java#L1-L12

\`\`\`java
public class Controller {
    public void method() {
        System.out.println("Hello, World!666");
    }
}
\`\`\`

`` `
phodal commented 6 months ago

@ymli0215 现在好像不能复现:

图片
ymli0215 commented 6 months ago

我整理一下第一個狀況 稍早已經安裝最新版本,支援DevIns @ IntelliJ IDEA 2023.3.6 Build #IU-233.15026.9

image

現在agent會回傳

`` `devin <- should be ```

/write:test.java#L1-L12

\`\`\`java
public class Controller {
    public void method() {
        System.out.println("Hello, World!666");
    }
}
\`\`\`
`` `  <- should be ```

test.java有存在,可以正常寫入,但是會跳出chat panel以及報錯 image

image

error log

com.intellij.openapi.diagnostic.RuntimeExceptionWithAttachments: Read access is allowed from inside read-action (see Application.runReadAction()); see https://jb.gg/ij-platform-threading for details
Current thread: Thread[DefaultDispatcher-worker-9,6,main] 1987186713 (EventQueue.isDispatchThread()=false)
SystemEventQueueThread: Thread[AWT-EventQueue-0,6,main] 145111283
    at com.intellij.util.concurrency.ThreadingAssertions.createThreadAccessException(ThreadingAssertions.java:149)
    at com.intellij.util.concurrency.ThreadingAssertions.softAssertReadAccess(ThreadingAssertions.java:107)
    at com.intellij.openapi.application.impl.ApplicationImpl.assertReadAccessAllowed(ApplicationImpl.java:1012)
    at com.intellij.psi.impl.source.PsiFileImpl.assertReadAccessAllowed(PsiFileImpl.java:182)
    at com.intellij.psi.impl.source.PsiFileImpl.loadTreeElement(PsiFileImpl.java:186)
    at com.intellij.psi.impl.source.PsiFileImpl.getTreeElement(PsiFileImpl.java:109)
    at com.intellij.psi.impl.source.PsiFileImpl.calcTreeElement(PsiFileImpl.java:727)
    at com.intellij.psi.impl.source.PsiFileImpl.getNode(PsiFileImpl.java:927)
    at com.intellij.psi.impl.PsiFileFactoryImpl.trySetupPsiForFile(PsiFileFactoryImpl.java:110)
    at com.intellij.psi.impl.PsiFileFactoryImpl.createFileFromText(PsiFileFactoryImpl.java:74)
    at com.intellij.psi.impl.PsiFileFactoryImpl.createFileFromText(PsiFileFactoryImpl.java:59)
    at com.intellij.psi.impl.PsiFileFactoryImpl.createFileFromText(PsiFileFactoryImpl.java:53)
    at com.intellij.psi.impl.PsiFileFactoryImpl.createFileFromText(PsiFileFactoryImpl.java:47)
    at cc.unitmesh.devti.language.psi.DevInFile$Companion.fromString(DevInFile.kt:28)
phodal commented 6 months ago

如果返回的类型是 DevIns 的话,需要返回 /write 相关的部分就可以了。这个问题我来修一下,应该是和版本有关,create 的时候会有问题。

phodal commented 6 months ago

CI 上 https://github.com/unit-mesh/auto-dev/actions/runs/8642911598 可以下载到最新版本。

ymli0215 commented 6 months ago

回報測試

不加入`devin 可以如預期寫入內容到已存在檔案

那目前剩下最後一個問題,就是希望agent回傳的/write 可以建立新檔案 ( 可以建立新檔案是在.devin檔案中執行) 因為也沒有錯誤,沒辦法提供log

phodal commented 6 months ago

10 分钟前的,新版本也不行,理论上返回的是 DevIn 应该也可以创建新档案了?

ymli0215 commented 6 months ago

怕我自己沒安裝好,再次重新下載安裝,問題還是一樣的

我覺得會不會是agent回去的處理,跑得跟 .devin不同?? 因此沒有建立出新檔案??

phodal commented 6 months ago

不好意思啊,之前处理的时候,有一个异步的数据接收没处理好。所以,拿到的 msg 是空的,就不执行了:

https://github.com/unit-mesh/auto-dev/blob/36923e4e880a4c2b0cef4d70376ea37a3be19736/src/main/kotlin/cc/unitmesh/devti/agent/CustomAgentChatProcessor.kt#L120-L132

等 build 跑完应该 OK 了

ymli0215 commented 6 months ago

我現在抓了新版,233 241都碰到一樣的問題,就是原本可以的都不行了,感覺就是回到我最初的問題

我回去整理一下,會拿之前幾個版本來測試看看,看看到底狀況是甚麼 確認後再來回報

phodal commented 6 months ago

要不重开一个新的? issue ?

ymli0215 commented 6 months ago

已建立issue 這邊要close嗎?

phodal commented 6 months ago

move to https://github.com/unit-mesh/auto-dev/issues/146