6.8 KiB
6.8 KiB
Plan - PoC cc-agent-proxy + programme Lua opencc
A executer ailleurs, pas sur cette machine. Deploiement HTTPS, reverse proxy, firewall et exposition publique geres separement par Guillaume.
1. Objectif
Piloter un agent OpenCode depuis une turtle ComputerCraft sur Minecraft / ATM10.
Turtle --HTTP + token--> cc-agent-proxy --HTTP Basic Auth--> opencode serve
opencc.lua Node/TypeScript proxy OpenCode headless
2. Faisabilite
opencode serve lance un serveur HTTP headless exposant une spec OpenAPI 3.1 sur /doc.
Routes utiles pour le PoC :
| Methode | Route | Usage |
|---|---|---|
GET |
/global/health |
healthcheck amont |
POST |
/session |
cree une session |
POST |
/session/:id/message |
envoie un message et attend la reponse |
POST |
/session/:id/prompt_async |
envoie en asynchrone |
GET |
/session/:id/message |
liste les messages |
GET |
/event |
flux SSE |
Conclusion : le proxy n'est pas strictement necessaire, mais il rend le client Lua beaucoup plus simple.
3. Pourquoi garder le proxy
- Expose une API turtle simple :
POST /ask { prompt, sessionId? }vers{ sessionId, reply }. - Gere le Basic Auth OpenCode cote Node.
- Garde cote turtle un token Bearer simple.
- Aplatit les reponses OpenCode pour limiter RAM et complexite Lua.
- Permet plus tard async, polling, logs, quotas ou allowlist sans changer le programme Lua.
4. Partie A - cc-agent-proxy
Creer un dossier cc-agent-proxy/ dans le repo.
Stack :
- Node 20+.
- TypeScript strict.
- Fastify.
- Vitest.
- Zod.
- Config via env validee, avec
.env.example.
Arborescence :
cc-agent-proxy/
package.json
tsconfig.json
.env.example
src/
config.ts
opencode.ts
auth.ts
server.ts
index.ts
test/
config.test.ts
opencode.test.ts
auth.test.ts
server.test.ts
Config :
| Variable | Defaut | Role |
|---|---|---|
PROXY_HOST |
0.0.0.0 |
interface d'ecoute |
PROXY_PORT |
7070 |
port du proxy |
PROXY_TOKEN |
requis | secret turtle <-> proxy |
OPENCODE_BASE_URL |
http://127.0.0.1:4096 |
URL OpenCode |
OPENCODE_USERNAME |
opencode |
user Basic Auth |
OPENCODE_PASSWORD |
requis | password Basic Auth |
OPENCODE_MODEL |
optionnel | modele a passer a OpenCode |
Routes proxy :
| Methode | Route | Auth | Usage |
|---|---|---|---|
GET |
/health |
non | etat proxy + opencode.health() |
POST |
/ask |
oui | cree/reutilise session, envoie prompt, retourne reponse |
POST |
/session |
oui, optionnel | cree une session explicite |
Client OpenCode :
health()appelleGET /global/health.createSession(title?)appellePOST /session.sendMessage(sessionId, text)appellePOST /session/:id/message.Authorization: Basic base64(username:password).- Body message :
{ parts: [{ type: "text", text }], model?: ... }. - Extraire les
partstexte de la reponse. - A valider au premier run reel : format exact des
parts.
Auth proxy :
- Accepter
Authorization: Bearer <token>. - Accepter aussi
X-Proxy-Tokenpour simplicite CC si besoin. - Comparaison constant-time avec
crypto.timingSafeEqual. - Reponse
401si absent ou invalide. - Ne jamais logger le token.
Tests Node en scope du PoC :
config.test.ts: valeurs par defaut, erreurs si secrets manquants.opencode.test.ts:fetchmocke pour health/session/message/parsing.auth.test.ts: token valide, invalide, absent.server.test.ts:app.inject()pour/health,/ask,401sans token.
5. Partie B - programme Lua opencc
Creer :
apis/libopencc.lua
programs/opencc.lua
tests/opencc.lua
Programme :
opencc --help.opencc --version.opencc "prompt"ou prompt interactif viaread().- Appelle
http://<host>:<port>/ask. - Header
Content-Type: application/json. - Header
Authorization: Bearer <token>. - Body
textutils.serialiseJSON({ prompt = prompt, sessionId = sessionId }). - Parse la reponse JSON.
- Affiche
reply. - Memorise
sessionIdpour reutilisation si on choisit une session persistante.
Config Lua :
- Utiliser
settingsComputerCraft en priorite : opencc.proxy_url.opencc.proxy_token.opencc.session_id.opencc.timeout, si applicable.- Autoriser un fallback hardcode uniquement pour PoC local, mais ne pas committer de secret reel.
- Stockage session possible dans un petit fichier local, par exemple
/.opencc-session, si plus simple quesettings.
Tests Lua :
- En scope si simple : tester
libopenccsans vraie requete HTTP via injection d'un faux clienthttp. - Tester construction URL, headers, body JSON, parsing succes, parsing erreur.
- Hors scope PoC si trop couteux : test end-to-end avec vrai proxy Node et vrai OpenCode.
- Le test reel HTTP se fera manuellement via CraftOS-PC puis en jeu.
Note repo :
- Le reseau existant
apis/net.luaest oriente modem/rednet/router, pas HTTP sortant. - Pour ce PoC, garder
http.postdirect cote Lua est le bon choix. - Le packaging existant du repo est
ccpm/packages/*/ccpm.json, pascube. - Ne pas integrer au packaging tant que le PoC n'est pas valide ; ajouter ensuite un package dedie type
tos-agentsi utile.
6. Pre-requis CC:Tweaked / ATM10
- API
httpactivee. - Hote/IP du proxy autorise dans les
http.rulescote serveur ATM10. - Pas de CORS, car ce n'est pas un navigateur.
- Prompts courts pour le PoC, car
POST /session/:id/messagepeut etre long.
Evolution hors PoC :
- Proxy utilise
prompt_async. - Turtle appelle
POST /askpuis pollGET /ask/:id/status. - Le proxy ecoute eventuellement
/eventSSE cote OpenCode.
7. Ordre d'execution
- Bootstrap
cc-agent-proxy. - Implementer
config.ts+ tests. - Implementer
opencode.ts+ tests avecfetchmocke. - Implementer
auth.ts,server.ts,/health,/ask+ testsapp.inject(). - Valider manuellement avec
opencode serve+curl. - Implementer
apis/libopencc.lua+programs/opencc.lua. - Ajouter
tests/opencc.luasi l'injection HTTP reste simple. - Tester via CraftOS-PC.
- Tester en jeu sur ATM10 apres configuration
http.rules. - Documenter les commandes de lancement et les pre-requis.
8. Validation manuelle
OPENCODE_SERVER_PASSWORD=xxx opencode serve \
--hostname 127.0.0.1 \
--port 4096
curl -s http://localhost:7070/health
curl -s -X POST http://localhost:7070/ask \
-H "Authorization: Bearer $PROXY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"prompt":"dis bonjour"}'
9. Points de vigilance
- Format reel des
partsOpenCode a valider au premier run. - OpenCode doit avoir un provider authentifie.
- Timeouts longs cote agent vs limites HTTP CC:Tweaked.
http.rulescote serveur ATM10.PROXY_TOKENjamais committe.OPENCODE_PASSWORDjamais committe.- Le proxy doit rester minimal tant que le PoC n'a pas prouve la boucle complete.