
Eco²
Backend · Cloud infrastructure
Upute za razvrstavanje otpada iz jedne fotografije i razgovora.
Sveobuhvatni AI asistent koji razumije kako funkcionira razvrstavanje otpada u Koreji.
Eco² vocabulary
- edge
- auth offload
- domain api
- task queue
- scan pipeline
- chat agent
- event bus
- cluster
- gitops
- autoscaling
- observability
- load test
- evaluation
Edge: ROUTE 53 · ALB · HTTPS 443 · internet-facing · external-dns · istio-ingressgateway · NodePort · eco2-gateway · VirtualService · x-canary · AuthorizationPolicy · ENVOY SIDECAR · kiali-serverAuth Offload: AuthorizationPolicy · action: CUSTOM · notPaths · envoyExtAuthzGrpc · failOpen: false · CheckRequest · x-user-id · BlacklistCache · BootstrapFromRedis · outbox:blacklist · blacklist.events · UsersServiceDomain API: VirtualService · x-user-id · /api/v1/scan · X-Idempotency-Key · job_id · stream_url · 202 ACCEPTED · Retry-After · ScanTask · UsersService · ImageService · ENVOY SIDECARTask Queue: outbox:blacklist · blacklist.events · RabbitmqCluster · scan.direct · reward.events · dlx · x-dead-letter-exchange · chat.process · AioPikaBroker · task_acks_late · apply_async · gevent · scan.vision · scan.rule · scan.answer · scan.reward · CELERY CHAIN · QueueLength · inspect ping · QUEUE SATURATIONScan Pipeline: ScanTask · scan.direct · reward.events · apply_async · gevent · scan.vision · scan.rule · scan.answer · scan.reward · CELERY CHAIN · RewardStep · item_class_list.yaml · situation_tags.yaml · LITE RAG · JsonRegulationRetriever · PipelineStage · waste_rag · XADD · domain: worker-ai · pipeline_duration · vision_stage_durationChat Agent: ImageService · chat.process · AioPikaBroker · create_chat_graph · route_by_intent · MULTI-INTENT FANOUT · waste_rag · recyclable_price · collection_point · image_generation · aggregator · thread_id · SyncableRedisSaver · AsyncPostgresSaver · LANGSMITH_TRACING · regenerateEvent Bus: job_id · stream_url · PipelineStage · XADD · scan:events:{shard} · XREADGROUP · XACK · XAUTOCLAIM · PendingReclaimer · STATE KV · scan:state:{job_id} · sse:events:{shard} · SSEBroadcastManager · Last-Event-ID · scan_sse_connections_active · ServiceMonitor · traceparentCluster: NodePort · kubeadm init · kubeadm join · vxlanMode · BGPConfiguration · module "vpc" · worker_ai · nodeSelector · domain: worker-ai · NoSchedule · 24-NODE CLUSTERGitOps: external-dns · x-canary · dev-root · ApplicationSet · sync-wave · selfHeal · ignoreDifferences · argocd-image-updater · update-strategy: digest · write-back-method · targetRevision · ci-services.ymlAutoscaling: ignoreDifferences · ScaledObject · QueueLength · cooldownPeriod · pollingInterval · fallback · maxReplicaCount · stabilizationWindowSeconds · HorizontalPodAutoscaler · scan_sse_connections_active · prometheus-adapterObservability: 24-NODE CLUSTER · prometheus-adapter · FLUENT BIT · Elasticsearch · Kibana · kube-prometheus-stack · AlertmanagerConfig · ServiceMonitor · JAEGER · OPENTELEMETRY · traceparent · kiali-server · LANGSMITH_TRACINGLoad Test: k6 · ramping-vus · thresholds · pipeline_duration · vision_stage_duration · poll_timeout · inspect ping · WORKER RESTART · POLLING TIMEOUT · QUEUE SATURATIONEvaluation: EvalConfig · eval_mode · eval_sample_rate · eval_cost_budget_daily_usd · EvalResult · EvalGrade · code_grader · llm_grader · CUSUM · regenerate · OpenAIBARSEvaluator
Kako su 24 čvora stvarno povezana, tijek po tijek.
Samostalno upravljani Kubernetes izgrađen s kubeadmom. Karta smješta 24 fizička čvora i radna opterećenja na njima unutar pet slojeva iz README-a i povezuje ih stvarnim vezama. Odaberite tijek i bit će istaknut samo taj put s numeriranim koracima.
Prepoznaje otpad na fotografiji i objašnjava kako ga odložiti, a u razgovoru poziva alate za lokacije, vrijeme, cijene sekundarnih sirovina i pretraživanje weba te generira slike. U ovom timskom projektu počeo sam s klasterom i temeljem za postavljanje, a zatim proširio svoje područje na domenski backend, asinkronu obradu, konverzacijskog agenta i verifikaciju.
Od razvoja za natjecanje do jačanja backenda i rada sustava
Usluga je završila s radom; snimljeni demo i tehničko izvješće prikazuju je u radu.
Zahtjev Scan → isporuka uživo
Zahtjev za analizu fotografije postaje posao u redu, a njegovi se događaji napretka vraćaju u isti preglednik.
PreglednikDNS upit: DNS upitRoute 53
Iz zapisa Route 53 razrješava se samo ime. Zahtjevi ne prolaze kroz DNS.
Pregledniktok podataka: HTTPS 443AWS ALB
TLS završava na ALB-u.
AWS ALBtok podataka: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPredaje se Istio ingress Envoyju preko NodePorta EC2 instance targeta.
Istio ingress Envoy
k8s-ingress-gatewaytok podataka: VirtualServiceScan APIk8s-api-scanUsmjerava se na Scan API, koji stavlja posao u red i odmah vraća job_id; upit za rezultat odgovara s 202 dok posao ne završi.
Scan API
k8s-api-scantok podataka: Zadatak CeleryRabbitMQk8s-rabbitmqZadatak Scan ide u RabbitMQ.
RabbitMQ
k8s-rabbitmqtok podataka: consumescan-workerk8s-worker-ai · k8s-worker-ai-2scan-worker (Celery · gevent) u AI poolu preuzima ga i izvodi Vision → Rule → Answer → Reward. Četiri faze ulančani su zadaci Celery, a ne čvorovi.
AI pool
k8s-worker-ai · k8s-worker-ai-2tok podataka: HTTPSLLM APIWorkeri scan i chat pozivaju API-je OpenAI i Google.
scan-worker
k8s-worker-ai · k8s-worker-ai-2tok podataka: XADD scan:eventsStreamsk8s-redis-streamsDogađaji napretka zapisuju se u jedan od četiri sharda Streams.
Streams
k8s-redis-streamstok podataka: XREADGROUPEvent Routerk8s-event-routerEvent Router čita ih kao consumer group i nakon obrade izvodi XACK; pending i reclaim održavaju isporuku at-least-once.
Event Router
k8s-event-routertok podataka: SETEX stateState KVk8s-redis-streamsZapisuje najnovije stanje i oznaku dvostruke obrade u State KV na istom čvoru Redis.
Event Router
k8s-event-routertok podataka: PUBLISHPub/Subk8s-redis-pubsubIsporučuje se u stvarnom vremenu kanalom posla u shardiranom Pub/Subu.
Pub/Sub
k8s-redis-pubsubtok podataka: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway se pretplaćuje preko jednog dijeljenog listenera po procesu i raspodjeljuje svakom povezanom pregledniku.
SSE Gateway
k8s-sse-gatewaytok podataka: SSE tokPreglednikVeza otvorena istim putom kroz ALB i ingress. Isporuka je at-least-once; duplikati se obrađuju idempotentno.
State KV
k8s-redis-streamstok podataka: Oporavak pri ponovnom povezivanjuSSE Gatewayk8s-sse-gatewayPri ponovnom povezivanju s Last-Event-ID State KV i sačuvani Streams popunjavaju propuštene događaje.
Chat · tokeni i pohrana
Tokeni Chata idu istim putom događaja kao Scan; kontrolne točke i poruke spremaju dva različita radna opterećenja.
Pregledniktok podataka: HTTPS 443AWS ALB
TLS završava na ALB-u.
AWS ALBtok podataka: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPredaje se Istio ingress Envoyju preko NodePorta EC2 instance targeta.
Istio ingress Envoy
k8s-ingress-gatewaytok podataka: VirtualServiceChat APIk8s-api-chatUsmjerava se na Chat API.
Chat API
k8s-api-chattok podataka: Zadatak TaskiqRabbitMQk8s-rabbitmqZadatak Chat ide u RabbitMQ.
RabbitMQ
k8s-rabbitmqtok podataka: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) s LangGraphom klasificira namjeru, zatim po potrebi izvodi vision, odabrane alate, aggregator i po potrebi sažetak te odgovara. Svaki zahtjev izvodi samo grane koje su mu potrebne.
AI pool
k8s-worker-ai · k8s-worker-ai-2tok podataka: HTTPSLLM APIWorkeri scan i chat pozivaju API-je OpenAI i Google.
chat-worker
k8s-worker-ai · k8s-worker-ai-2tok podataka: XADD chat:eventsStreamsk8s-redis-streamsTokeni i događaji faza zapisuju se u četiri sharda Streams; odatle je put isporuke isti kao kod Scana.
Streams
k8s-redis-streamstok podataka: XREADGROUPEvent Routerk8s-event-routerEvent Router čita ih kao consumer group i nakon obrade izvodi XACK; pending i reclaim održavaju isporuku at-least-once.
Event Router
k8s-event-routertok podataka: PUBLISHPub/Subk8s-redis-pubsubIsporučuje se u stvarnom vremenu kanalom posla u shardiranom Pub/Subu.
Pub/Sub
k8s-redis-pubsubtok podataka: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway se pretplaćuje preko jednog dijeljenog listenera po procesu i raspodjeljuje svakom povezanom pregledniku.
SSE Gateway
k8s-sse-gatewaytok podataka: SSE tokPreglednikVeza otvorena istim putom kroz ALB i ingress. Isporuka je at-least-once; duplikati se obrađuju idempotentno.
chat-worker
k8s-worker-ai · k8s-worker-ai-2tok podataka: checkpointCachek8s-redis-cacheKontrolna točka LangGrapha čuva se u Redis Cacheu.
Cache
k8s-redis-cachetok podataka: čitanje kontrolne točkecheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer čita kontrolnu točku iz Redisa.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2tok podataka: sinkronizacija s PostgreSQL-omPostgreSQLk8s-postgresqlAsyncPostgresSaver je asinkrono sprema u PostgreSQL.
Streams
k8s-redis-streamstok podataka: chat-persistence grouppersistence consumerk8s-api-chatpersistence consumer na čvoru Chat čita događaje done kao consumer group.
persistence consumer
k8s-api-chattok podataka: spremanje porukaPostgreSQLk8s-postgresqlPoruke Chata spremaju se u PostgreSQL. To je drugo radno opterećenje od checkpoint-syncera.
Ulaz · autentikacija
Sinkroni put od ulaza u klaster do domenskog API-ja. Samo putovi pod politikom najprije provjeravaju autentikaciju; promet podova između čvorova ide preko Calico VXLAN-a.
PreglednikDNS upit: DNS upitRoute 53
Iz zapisa Route 53 razrješava se samo ime. Zahtjevi ne prolaze kroz DNS.
Pregledniktok podataka: HTTPS 443AWS ALB
TLS završava na ALB-u.
AWS ALBtok podataka: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPredaje se Istio ingress Envoyju preko NodePorta EC2 instance targeta.
Istio ingress Envoy
k8s-ingress-gatewaytok podataka: ext-authz · gRPC 50051ext-authzk8s-api-authSamo putovi pod politikom CUSTOM najprije pitaju Go ext-authz (timeout 2 s, failOpen false). Putovi poput login, health i docs izuzeti su.
ext-authz
k8s-api-authtok podataka: provjera crne listeblacklistk8s-redis-authToken se provjerava prema crnoj listi u Redisu.
Istio ingress Envoy
k8s-ingress-gatewaytok podataka: VirtualServiceChat APIk8s-api-chatUsmjerava se na Chat API.
Chat API
k8s-api-chattok podataka: gRPCimages APIk8s-api-imageSinkroni poziv chat → images naveden u README-u.
auth API
k8s-api-authtok podataka: gRPCusers APIk8s-api-usersSinkroni poziv auth → users naveden u README-u.
Storage pool · asinkrono spremanje
Crnu listu autentikacije i vlasništvo nad likovima spremaju workeri storage poola koji preuzimaju posao iz RabbitMQ-a.
blacklist
k8s-redis-authtok podataka: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (auth-Bus u README-u) čita Redis outbox.
auth-relay
k8s-worker-storage · k8s-worker-storage-2tok podataka: blacklist.eventsRabbitMQk8s-rabbitmqPonovno objavljuje u RabbitMQ, s ponovnim pokušajima i DLQ-om.
RabbitMQ
k8s-rabbitmqtok podataka: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker prima događaje crne liste.
auth-worker
k8s-worker-storage · k8s-worker-storage-2tok podataka: spremanje crne listeblacklistk8s-redis-authSpremaju se u crnu listu u Redisu.
RabbitMQ
k8s-rabbitmqtok podataka: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker prima poslove vlasništva nad likovima u paketima.
users-worker
k8s-worker-storage · k8s-worker-storage-2tok podataka: UPSERTPostgreSQLk8s-postgresqlPrimjenjuju se u PostgreSQL-u.
Konfiguracija · skaliranje · promatranje
Platform Layer nije korak kroz koji prolaze zahtjevi; on postavlja, konfigurira, skalira i promatra ostale slojeve. Čvorovi su EC2 instance izrađene Terraformom, s kubeadmom i Calicom instaliranima pomoću Ansiblea; CI samo provjerava Terraform i nikad ga ne primjenjuje automatski.
GitHub Actions · Docker Hubkonfiguracija · skaliranje: slika · revizija manifestaArgo CD image updater
k8s-masterArgo CD usklađuje konfiguraciju klastera kroz App-of-Apps i Sync Waves. Potvrđen je samo smještaj image updatera na control-planeu.
ALB Controller · ExternalDNS
k8s-masterkonfiguracija · skaliranje: Ingress → ALB · DNS zapisiUpravlja AWSALB Controller i ExternalDNS konfiguriraju resurse na strani AWS-a. To nije put kojim prolaze zahtjevi.
Istiod
k8s-masterkonfiguracija · skaliranje: xDS konfiguracijaIstio ingress Envoyk8s-ingress-gatewayIstiod šalje konfiguraciju Gateway, VirtualService i EnvoyFilter preko xDS-a ingress Envoyju i Envoy sidecaru svakog API-ja.
KEDA
k8s-monitoringkonfiguracija · skaliranje: broj podovaAI poolk8s-worker-ai · k8s-worker-ai-2KEDA prilagođava broj podova workera. Broj čvorova se ne mijenja.
KEDA
k8s-monitoringkonfiguracija · skaliranje: broj podovastorage poolk8s-worker-storage · k8s-worker-storage-2Podovi workera u storage poolu skaliraju se na isti način.
Fluent Bitopažljivost: zapisniciElasticsearch
k8s-loggingFluent Bit je DaemonSet na svakom čvoru i šalje zapisnike u Elasticsearch.
AI pool
k8s-worker-ai · k8s-worker-ai-2opažljivost: praćenje izvođenja LLM-aLangSmithTragovi poziva LLM-a idu u LangSmith, vanjski SaaS.
Sve veze iste debljine. Odaberite tijek kako biste istaknuli samo njegov put s numeriranim koracima.
- Puna crta · smjer kojim teku zahtjevi, poslovi, događaji i zapisivanja
- Točkasta crta · DNS upit; zahtjevi ne prolaze kroz njega
- Isprekidana crta · konfiguracija ili skaliranje; nije put podataka
- Duga crta-točka · zapisnici i praćenje izvođenja
- Debela crna crta · odabrani tijek; brojevi daju redoslijed
- Okvir · fizički čvor, naziv hosta u zaglavlju
- Unutarnja pločica · radno opterećenje na tom čvoru
- Isprekidani okvir · pool za raspoređivanje s dva čvora
- Isprekidani okvir · izvan klastera, ne broji se kao čvor
- Narančasti obrub · mjesto gdje model odlučuje
- Control plane1 čvor
- Domain API8 čvorova
- AI pool2 čvora
- storage pool2 čvora
- Data5 čvorova
- Platform6 čvorova
Pet slojeva iz README-a (pojasevi) i fizičke skupine (nijansa zaglavlja svakog čvora) različito grupiraju istih 24 čvora. State KV dijeli čvor sa Streams i ne broji se zasebno; Route 53, ALB i usluge izvan klastera nisu čvorovi. Pool je raspon raspoređivanja, a ne tvrdnja da svaki pod radi na oba čvora.
24čvorova
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd te kontroleri platforme.
- k8s-master
8Domain API
domain: <usluga>Jedan čvor po domeni. Interni pozivi koriste gRPC.
- k8s-api-auth
- k8s-api-users
- k8s-api-scan
- k8s-api-character
- k8s-api-location
- k8s-api-image
- k8s-api-chat
- k8s-api-info
4Execution worker
Dva poola za raspoređivanje s po dva čvora. KEDA mijenja broj podova; broj čvorova ostaje isti.
storage pool
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
AI pool
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis je prema namjeni podijeljen na četiri čvora. Pohrana za PostgreSQL je EBS CSI · gp3.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Razmjena poruka, opažljivost, ingress i isporuka u stvarnom vremenu imaju svaki svoj čvor.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Svaki čvor
- Fluent Bit · DaemonSet
- Calico
Konfigurirani modeli · po pružatelju
Usluga je ugašena, pa su to modeli konfigurirani u repozitoriju, a ne izbori dostupni danas. Svaka je uloga navedena zasebno; ovo nije popis provjerenih izvođenja.
OpenAI
Zadani pružatelj Chata
Chat
openai/gpt-5.2zadano
Zadani model je gpt-5.2; model naveden u zahtjevu koristi se umjesto njega.
Scan
gpt-5.2zadanogpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
Modeli izvan mapiranja od 13 modela odbijaju se.
Mapiranje slika
gpt-image-1.5
Odvojeno od gpt-5.2, modela za orkestraciju Responses. Generiranje slika prema zadanim je postavkama isključeno.
Evaluacija
gpt-4o-minizadano
LLM grader za evaluaciju razgovora, odvojen od modela Chata.
Google
Kad Chat odabere Google
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
Kad je odabran Google, zadan je gemini-3-flash-preview.
Scan
gemini-3-pro-previewgemini-3-flash-previewgemini-2.5-progemini-2.5-flashgemini-2.5-flash-litegemini-2.0-flashgemini-2.0-flash-lite
Mapiranje slika
gemini-3-pro-image-preview
Izvorbackend main d8840c7Javni commit September 29, 2026 · provjereno October 8, 2026