Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LBKZQUq6vimKuAFsrS2D1s
3.5 KiB
Agenti opencode (DeepSeek V4.1 Flash) orchestrati din Claude Code
Verificat live 15.09.2026, opencode 1.18.31. Docs: https://opencode.ai/docs/server/
Model
opencode-go/deepseek-v4.1-flash (abonament opencode go). In API: {"providerID":"opencode-go","modelID":"deepseek-v4.1-flash"}.
Varianta 1: one-shot (fara comunicare pe parcurs)
opencode run -m opencode-go/deepseek-v4.1-flash --title <lane> "<sarcina>"
opencode run -s <sessionID> "<mesaj urmator>" # continua aceeasi sesiune dupa ce s-a oprit
Varianta 2: server + HTTP (mesaje in timpul lucrului) — recomandat
Pornire (un server pentru toate lane-urile, in directorul proiectului):
opencode serve --port 4096 # 127.0.0.1, fundal
| Actiune | Apel |
|---|---|
| Sesiune noua | POST /session {title} → id |
| Sarcina (nu asteapta) | POST /session/:id/prompt_async {model, parts:[{type:"text",text}]} |
| Mesaj in timpul lucrului | acelasi prompt_async pe sesiunea ocupata |
| Stare | GET /session/status → {id:{type:"busy"}}; sesiunea lipseste cand e libera |
| Rezultat | GET /session/:id/message (parts cu type=text) |
| Oprire | POST /session/:id/abort |
| Evenimente live | GET /event (SSE) |
| Interfata vizuala | opencode attach http://127.0.0.1:4096 (Marius poate urmari sesiunile) |
Comportament verificat: mesajul trimis cat agentul e busy intra in coada si e preluat la
pasul urmator (dupa apelul de tool curent), in aceeasi sesiune; agentul l-a respectat.
Nu intrerupe un tool aflat in executie. Pentru oprire imediata: abort, apoi mesaj nou.
Prompt initial (obligatoriu)
opencode incarca singur CLAUDE.md din proiect si ~/.claude/CLAUDE.md, dar acolo scrie cum sa
orchestreze Claude (delegare, gstack), nu cum sa execute. De aceea fiecare sesiune primeste
COMUN\docs\opencode_prompt_initial.md in campul system (verificat: agentul il respecta):
$sys = [IO.File]::ReadAllText('D:\ROA\<PROIECT>\COMUN\docs\opencode_prompt_initial.md')
$b = @{model=$m; system=$sys; parts=@(@{type='text';text="Lane: <nume>. <sarcina>"})} | ConvertTo-Json -Depth 5
Invoke-RestMethod -Method Post "$u/session/$sid/prompt_async" -ContentType 'application/json; charset=utf-8' -Body ([Text.Encoding]::UTF8.GetBytes($b))
Cu opencode run, fara server: pui promptul ca fisier atasat, -f COMUN\docs\opencode_prompt_initial.md.
Promptul impune: rol de executant, citirea reguli_lucru.md, interdictiile (commit, write-back,
binare, sed -i), censul cp1250 + CRLF, raportul docs\raport_<lane>.md si ultimul mesaj
GATA <lane> / BLOCAT <lane>: motiv.
Permisiuni
Fara configurare, agentul se opreste la fiecare acces in afara proiectului (scratchpad, D:\ROA\UTIL) si asteapta
aprobare. Configurarea e globala, pentru toate proiectele, in %USERPROFILE%\.config\opencode\opencode.jsonc:
"permission": { "edit": "allow", "bash": "allow", "webfetch": "allow", "external_directory": "allow" }
Se aplica la pornirea serverului (opencode serve); un server deja pornit trebuie repornit.
O cerere ramasa in asteptare se aproba prin API: GET /permission → POST /session/:id/permissions/:permissionID {"response":"always"}.
Reguli pentru lane-uri
- Sarcina contine numele lane-ului, fisierele exacte si criteriul de terminare.
- Orchestratorul verifica dupa fiecare lane: diff, octeti cp1252, CRLF, teste.
- Dupa lucru: opreste serverul (PID-ul real e cel care asculta pe port, nu cel din
Start-Process):Stop-Process -Id (Get-NetTCPConnection -LocalPort 4096 -State Listen).OwningProcess