From e37bde0103b62c953f5023e1f1963502ee45d232 Mon Sep 17 00:00:00 2001 From: Franklin Date: Fri, 6 Feb 2026 23:20:50 -0500 Subject: [PATCH] adding pi for gigacode --- gigacode/README.md | 10 +++++----- server/packages/sandbox-agent/src/opencode_compat.rs | 1 + .../sandbox-agent/tests/opencode-compat/models.test.ts | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/gigacode/README.md b/gigacode/README.md index 3ebbd89..bc18d95 100644 --- a/gigacode/README.md +++ b/gigacode/README.md @@ -2,7 +2,7 @@ Gigacode. Use OpenCode's UI with any coding agent.

-

Supports Claude Code, Codex, and Amp.

+

Supports Claude Code, Codex, Pi, and Amp.

This is not a fork (and never will be).
It's powered by Sandbox Agent SDK's wizardry.
Experimental & just for fun.
@@ -19,23 +19,23 @@ ┌─ Gigacode ────────────────────────────────────────────────────────┐ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ OpenCode TUI │───▶│ Sandbox Agent │───▶│ Claude Code / │ │ -│ │ │ │ │ │ Codex / Amp │ │ +│ │ │ │ │ │ Codex / Pi / Amp │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ └───────────────────────────────────────────────────────────────────┘ ``` -- [Sandbox Agent SDK](https://sandboxagent.dev) provides a universal HTTP API for controlling Claude Code, Codex, and Amp +- [Sandbox Agent SDK](https://sandboxagent.dev) provides a universal HTTP API for controlling Claude Code, Codex, Pi, and Amp - Sandbox Agent SDK exposes an [OpenCode-compatible endpoint](https://sandboxagent.dev/docs/opencode-compatibility) so OpenCode can talk to any agent - OpenCode connects to Sandbox Agent SDK via [`attach`](https://opencode.ai/docs/cli/#attach) ## OpenCode Models vs Gigacode Agents - **OpenCode** supports **switching between inference providers** (Anthropic, OpenAI, etc.). This is OpenCode talking directly to the models with its own tools, system prompts, and agentic loop. -- **Gigacode** automates other coding agent harnesses, so it's using the **exact same logic that you would if you ran Claude Code**, Codex, or Amp natively. +- **Gigacode** automates other coding agent harnesses, so it's using the **exact same logic that you would if you ran Claude Code**, Codex, Pi, or Amp natively. ``` OpenCode (native): Model → OpenCode's tool loop → result -Gigacode: Model → Claude Code / Codex / Amp CLI → result +Gigacode: Model → Claude Code / Codex / Pi / Amp CLI → result ``` This means you get each agent's specialized capabilities (such as Claude Code's `Read`/`Write`/`Bash` tools, Codex's sandboxed execution, and Amp's permission rules) rather than a single tool loop with different models behind it. diff --git a/server/packages/sandbox-agent/src/opencode_compat.rs b/server/packages/sandbox-agent/src/opencode_compat.rs index 1393f94..357c81f 100644 --- a/server/packages/sandbox-agent/src/opencode_compat.rs +++ b/server/packages/sandbox-agent/src/opencode_compat.rs @@ -614,6 +614,7 @@ fn available_agent_ids() -> Vec { AgentId::Codex, AgentId::Opencode, AgentId::Amp, + AgentId::Pi, AgentId::Mock, ] } diff --git a/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts b/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts index 43a270d..1bd6fde 100644 --- a/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts +++ b/server/packages/sandbox-agent/tests/opencode-compat/models.test.ts @@ -31,10 +31,12 @@ describe("OpenCode-compatible Model API", () => { const providers = response.data?.all ?? []; const mockProvider = providers.find((entry) => entry.id === "mock"); const ampProvider = providers.find((entry) => entry.id === "amp"); + const piProvider = providers.find((entry) => entry.id === "pi"); const sandboxProvider = providers.find((entry) => entry.id === "sandbox-agent"); expect(sandboxProvider).toBeUndefined(); expect(mockProvider).toBeDefined(); expect(ampProvider).toBeDefined(); + expect(piProvider).toBeDefined(); const mockModels = mockProvider?.models ?? {}; expect(mockModels["mock"]).toBeDefined(); @@ -57,6 +59,7 @@ describe("OpenCode-compatible Model API", () => { expect(providerIds.has("claude")).toBe(true); expect(providerIds.has("codex")).toBe(true); + expect(providerIds.has("pi")).toBe(true); expect( providerIds.has("opencode") || Array.from(providerIds).some((id) => id.startsWith("opencode:")) ).toBe(true);