feat(discord-bridge): imagini si fisiere text din Discord ajung la Claude
Puntea trimitea doar `content`-ul mesajului; orice atasament disparea tacut, iar un mesaj fara text (doar poza) era respins ca "empty". Acum mesajul de utilizator se construieste ca blocuri, in formatul pe care CLI-ul il accepta pe `--input-format stream-json` (verificat pe CLI real: Claude descrie corect o imagine trimisa asa). - imagini png/jpeg/gif/webp -> blocuri `image` base64, max 4, max 3,5 MB brut (base64 umfla cu ~4/3, iar API-ul refuza peste ~5 MB codate) - fisiere text (mime `text/*`, `application/json`, sau extensie cunoscuta) -> continutul intra in prompt, max 4, trunchiat la 100 KB - restul (PDF, Office, arhive, svg, heic) -> doar numite, cu motivul Detalii care conteaza: - `image/jpg` si `image/png; charset=...` se normalizeaza; cand Discord nu trimite content_type cadem pe extensie - marimea se verifica de doua ori: cea declarata (ca sa nu descarcam degeaba) si cea reala dupa descarcare - nimic nu dispare tacut: ce n-a putut fi citit apare in prompt ca "Atasamente ignorate: ..."; o imagine stricata nu anuleaza restul mesajului - merge si mid-tur: o poza trimisa in timpul unui tur intra pe stdin ca steering 31 de teste noi in tests/test_attachments.py (normalizare tipuri, limite, trunchiere, erori de descarcare, integrare prin punte, steering). Suita: 426 pass. README: sectiune "Atasamente" + limitarea veche corectata (ramane doar vocea). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY
This commit is contained in:
@@ -72,6 +72,27 @@ echivalenta. Orice alt mesaj din canal pleaca la Claude ca prompt, ca inainte.
|
||||
Un fir de Discord = o sesiune Claude. Canalul principal are si el sesiunea lui, cea
|
||||
implicita. Subsolul fiecarui raspuns arata modelul, durata si costul.
|
||||
|
||||
### Atasamente
|
||||
|
||||
Pozele si fisierele text trimise pe Discord ajung la Claude in acelasi tur cu mesajul.
|
||||
Un mesaj **doar** cu atasament, fara text, e valid — nu mai e respins ca gol. Merge si
|
||||
mid-tur: o poza trimisa in timpul unui tur intra pe stdin ca steering, nu deschide tur nou.
|
||||
|
||||
| Tip | Ce se intampla | Limite |
|
||||
|-----|----------------|--------|
|
||||
| Imagini `png`, `jpeg`, `gif`, `webp` | Devin blocuri `image` — Claude le vede | max 4/mesaj, max 3,5 MB fiecare |
|
||||
| Fisiere text (`.txt`, `.md`, `.log`, `.csv`, `.json`, `.sql`, `.py`, `.sh`, …) | Continutul e inserat in prompt | max 4/mesaj, max 100 KB fiecare (peste atat, trunchiat) |
|
||||
| Orice altceva (PDF, Office, arhive, `svg`, `heic`) | Doar numit in prompt, cu motivul | — |
|
||||
|
||||
Nimic nu dispare tacut: ce n-a putut fi citit (prea mare, tip neacceptat, descarcare
|
||||
esuata) apare la finalul promptului intr-o linie „Atasamente ignorate: …", deci Claude
|
||||
stie ca ai trimis ceva si poate cere altceva. O imagine stricata nu anuleaza restul
|
||||
mesajului.
|
||||
|
||||
Limita de 3,5 MB e pe octetii bruti fiindca base64 umfla cu ~4/3, iar API-ul refuza
|
||||
imaginile peste ~5 MB codate. Marimea e verificata de doua ori: intai cea declarata de
|
||||
Discord (ca sa nu descarcam degeaba), apoi cea reala, dupa descarcare.
|
||||
|
||||
### Despre `/cleanup`
|
||||
|
||||
`KillMode=control-group` opreste arborele serviciului la restart, dar **nu prinde ce s-a
|
||||
@@ -348,7 +369,9 @@ baza pe ele ca pe o bariera.
|
||||
Lista `NEVER_KILL` din `cleanup.py` protejeaza infrastructura sesiunii (systemd, sshd,
|
||||
tmux, code-server) — deci un proces cu un asemenea nume in linia de comanda nu va fi
|
||||
oprit niciodata, chiar daca e orfan.
|
||||
- **Fara voce, imagini sau atasamente** catre Claude in v1.
|
||||
- **Fara voce.** Mesajele audio nu ajung la Claude. Imaginile si fisierele text
|
||||
ajung (vezi „Atasamente" mai sus); PDF, Office, arhive si celelalte tipuri sunt
|
||||
doar numite in prompt, nu citite.
|
||||
- **Fara dashboard web** — exista deja pe MoltBot, puntea nu-l duplica.
|
||||
- **Un singur container.** Daca LXC 171 e oprit, puntea e oprita. Nu are redundanta si
|
||||
nu e in HA.
|
||||
@@ -359,7 +382,7 @@ baza pe ele ca pe o bariera.
|
||||
|
||||
| Fisier | Ce e | Lane |
|
||||
|--------|------|------|
|
||||
| `bot.py` | adaptorul Discord: allowlist, comenzi, butoane | A |
|
||||
| `bot.py` | adaptorul Discord: allowlist, comenzi, butoane, atasamente | A |
|
||||
| `session_store.py` | `state.json`: scriere atomica, lock per fir, PID reuse | A |
|
||||
| `runner.py` | proces persistent per fir, stdin JSONL, reaper | A |
|
||||
| `stream.py` | parser tolerant de stream JSONL | A |
|
||||
|
||||
Reference in New Issue
Block a user