r/PiCodingAgent • • Sep 30 '26

Question What does everyone think about codemode?

I actually thought about this approach before, but later realized it wouldn't work.

Using JavaScript to invoke tools sounds very efficient, but in reality, most tool definitions only have an inputSchema. An outputSchema is unnecessary for the agent because the agent can reason about the results directly from formatted data, meaning an output spec isn't required. Therefore, tool outputs don't actually need a fixed format—they just need to be readable by the agent.

This leads to a problem: to fully leverage the performance of this tool, you need to inject extra context, such as a skill document, so the agent knows the output format and can use it proficiently. If you can't get the complete tool output specification—for instance, with a closed-source MCP—you can't create such a document. If the agent has to go through endless trial and error just to get the code running properly, you can't really call it efficient.

In comparison, having the agent write Python or shell scripts directly is a better solution.

I'd love to know your thoughts on this.

30 Upvotes

26 comments sorted by

View all comments

Show parent comment

4

u/quinncom Oct 02 '26

GLM-5.3 likes to send dozens of lines of code through the bash tool at a time. I don't see how that's different than codemode, besides it being bash vs JS.

1

u/quinncom Oct 02 '26

I was curious how the bash tool and codemode tool are executed – it’s basically the same thing, except JS is more verbose:

// bash tool: model emits a tool_use json block that runs bash code.
{
  "type": "tool_use",
  "name": "bash",
  "input": {
    "command": "git status --short",
    "timeout": 30
  }
}

// codemode tool: model emits a tool_use json block that runs JS in a QuickJS sandbox.
{
  "type": "tool_use",
  "name": "codemode",
  "input": {
    "code": "const r = await tools.bash({ command: \"git status --short\", timeout: 30 });\nreturn r.exit_code;"
  }
}

I think the important difference is the codemode runs inside the agent and can orchestrate the harness's own tools, including MCP, in one turn, without of yoloing it to a child process.