# 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 "" opencode run -s "" # continua aceeasi sesiune dupa ce s-a oprit ``` ## Varianta 2: server + HTTP (mesaje in timpul lucrului) — recomandat Pornire (un server per proiect, pentru toate lane-urile lui, in directorul proiectului): ``` opencode serve --port # 127.0.0.1, fundal ``` **Port fix per proiect.** Proiectele ROA ruleaza in paralel; pe acelasi port, oprirea serverului dintr-un proiect opreste lane-urile celuilalt si le poate muta directorul de lucru (verificat 15.09.2026: lane ROACONT ajuns in ROAFACTURARE). | Proiect | Port | |---|---| | ROAFACTURARE | 4096 | | ROACONT | 4196 | | ROAIMOB | 4296 | | btgo-playwright | 4396 | Proiect nou: urmatorul port liber din tabel (+100), trecut aici inainte de pornire. In API trimite si `?directory=`. | 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:` (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): ```powershell $sys = [IO.File]::ReadAllText('D:\ROA\\COMUN\docs\opencode_prompt_initial.md') $b = @{model=$m; system=$sys; parts=@(@{type='text';text="Lane: . "})} | 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_.md` si ultimul mesaj `GATA ` / `BLOCAT : 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`: ```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 -State Listen).OwningProcess` - doar portul propriu.