acp2openai
v0.1.3
Published
OpenAI-compatible HTTP facade over ACP (Kilo Code + opencode) — point any OpenAI SDK at it.
Maintainers
Readme
acp2openai
OpenAI-compatible HTTP facade over ACP (Kilo Code + opencode). Point any OpenAI SDK at it, get Kilo/opencode routing transparently.
Quickstart
# 1. Start ACP backend (one or both)
kilo serve --port 4780
opencode serve --port 4790
# 2. Start acp2openai
npx acp2openai # defaults: :4800, kilo :4780, opencode :4790
npx acp2openai --port 8080 # custom port
# 3. Point any OpenAI SDK at http://localhost:4800/v1
# Or open http://localhost:4800/ for the built-in live-streaming demoDemo
- Built-in:
http://localhost:4800/when acp2openai is running (no CORS, full streaming) - GH Pages: https://anentrypoint.github.io/acp2openai (browser-blocked from loopback by Chrome PNA — use built-in demo instead)
Usage
import OpenAI from 'openai';
const client = new OpenAI({ baseURL: 'http://localhost:4800/v1', apiKey: 'none' });
const stream = await client.chat.completions.create({
model: 'kilo/x-ai/grok-code-fast-1:optimized:free',
messages: [{ role: 'user', content: 'hi' }],
stream: true,
});
for await (const chunk of stream) process.stdout.write(chunk.choices[0]?.delta?.content || '');Model selection
Model IDs: <backend>/<model> where <backend> ∈ {kilo, opencode}.
Examples:
kilo/x-ai/grok-code-fast-1:optimized:free(free, default)kilo/kilo-auto/freeopencode/minimax-m2.5-free
Bare model IDs (no prefix) route to kilo.
Endpoints
POST /v1/chat/completions— streaming + non-streamingGET /v1/models— live-probes both backendsGET /health
Why
ACP (Kilo/opencode HTTP serve mode) has a custom protocol: POST /session, POST /session/:id/message, SSE /event. Using it from standard OpenAI-SDK code requires rewriting clients. acp2openai maps:
- OpenAI
messages[]→ ACP text part - ACP
message.part.delta→ OpenAIdelta.content/delta.reasoning_content(tracked via partID → part.type lookup) - ACP
toolpart state → OpenAItool_calls - ACP
session.idle/session.turn.close→finish_reason: stop
Streaming uses ACP's true-delta SSE (not accumulating snapshots) for minimum per-token latency.
Config
CLI flags or env:
--port/PORT(4800)--kilo <url>/ACP_KILO_URL(http://localhost:4780)--opencode <url>/ACP_OPENCODE_URL(http://localhost:4790)
License
MIT
