TypeScript + Python: un inginer, două ecosisteme, un singur contract

2026-09-10

Tot mai multe produse la care lucrez au două componente. Una este partea cu care interacționează oamenii: o interfață Next.js, un API Node.js, autentificare și plăți. Cealaltă ține de modele: inferență, embeddings, audio și procesarea datelor. Prima vorbește TypeScript, a doua Python. A le stăpâni pe amândouă nu înseamnă să colecționezi limbaje, ci să-ți asumi zona de legătură dintre ele — tocmai locul unde se defectează multe produse AI.

Vestea bună este că cele două ecosisteme seamănă mai mult decât credem. Zod are corespondentul Pydantic; tsc, pe mypy și pyright; ESLint și Prettier, pe Ruff; npm și pnpm, pe uv și Poetry. FastAPI joacă un rol similar cu Express și NestJS și generează OpenAPI din modele tipizate. Aplic aceeași disciplină pe ambele părți: tipuri stricte, un formatter asupra căruia nu există dispute, dependențe fixate și teste în CI.

Contractul dintre ele este cel mai important fișier din sistem. Îl definesc o singură dată și generez restul: modelele Pydantic din FastAPI produc o schemă OpenAPI, din care se generează clientul TypeScript și tipurile sale. Redenumești un câmp în Python, iar buildul Next.js eșuează înainte ca un utilizator să vadă undefined. Pentru munca asincronă, contractul este un payload de job cu o schemă la ambele capete, nu un JSON liber interpretat diferit de fiecare parte.

Împărțirea responsabilităților rămâne strictă. TypeScript se ocupă de identitate, permisiuni, bani și UI. Python se ocupă doar de model: primește un job, execută munca grea — o voce StyleTTS2, un lot de embeddings sau parsarea unui document — și returnează rezultatul. Serviciul Python nu comunică niciodată cu browserul și nu decide cine are voie să facă ce. Apelurile rapide trec prin HTTP, cele lente printr-o coadă, cu timeout-uri, retry-uri și idempotență pe ambele părți.

Contează și diferențele, iar respectarea lor face parte din muncă. Python este bun pentru prototipare în notebook, dar notebook-ul nu este producție: codul funcțional ajunge într-un modul cu teste. Concurența din Python nu este event loop-ul Node; inferența intensivă pentru CPU trebuie să ruleze în procese worker sau într-un serviciu GPU, nu într-un handler asincron. Diferă și unitățile de deployment — o imagine Node compactă față de o imagine Python cu CUDA și ponderile modelului — deci diferă scalarea, cache-ul și costurile.

Pentru client, avantajul unui singur inginer pe ambele părți este clar: nu există un strat de traducere între „omul de AI” și „omul de web” și nici un API de care fiecare îl învinovățește pe celălalt. Dacă ai un model care funcționează într-un notebook și o aplicație web care încă nu știe să-l folosească, trimite-mi ambele. Îți voi propune contractul dintre ele și prima versiune pe care aș livra-o.

Oferă-i următorului produs cuiva care rămâne.

Ești gata să începem? Trimite-mi un mesaj - pot începe acum și pot rămâne alături de produs. Colaborări pe termen lung, nu o predare în două săptămâni. Să discutăm proiectul, cerințele și cea mai bună cale de urmat.

Întreabă despre experiență sau servicii