
Eco²
Backend · Cloud infrastructure
Rady k třídění odpadu z jedné fotky a rozhovoru.
Univerzální asistent AI, který rozumí tomu, jak funguje třídění odpadu v 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
Jak se 24 uzlů skutečně propojuje, tok po toku.
Samostatně spravovaný Kubernetes sestavený pomocí kubeadm. Mapa umisťuje 24 fyzických uzlů a workloady na nich do pěti vrstev z README a spojuje je skutečnými spojeními. Výběr toku zvýrazní jen tuto cestu s očíslovanými kroky.
Rozpozná odpad na fotografii a vysvětlí, jak s ním naložit, a v konverzaci volá nástroje pro místa, počasí, výkupní ceny druhotných surovin a vyhledávání na webu a generuje obrázky. V tomto týmovém projektu začal můj rozsah u clusteru a základu nasazení a postupně se rozšířil o doménový backend, asynchronní zpracování, konverzačního agenta a ověřování.
Od soutěžního vývoje po zpevnění backendu a provozu
Služba ukončila provoz; nahrané demo a technická zpráva ji ukazují v činnosti.
Požadavek Scan → živé doručení
Požadavek na analýzu fotografie se stane prací ve frontě a jeho události o postupu se vracejí do stejného prohlížeče.
Prohlížečdotaz DNS: dotaz DNSRoute 53
Ze záznamů Route 53 se překládá jen název. Požadavky přes DNS neprocházejí.
Prohlížečdatový tok: HTTPS 443AWS ALB
TLS končí na ALB.
AWS ALBdatový tok: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPředáno ingress Envoy Istio přes NodePort cíle typu instance EC2.
Istio ingress Envoy
k8s-ingress-gatewaydatový tok: VirtualServiceScan APIk8s-api-scanSměrováno do Scan API, které práci zařadí do fronty a okamžitě vrátí job_id; dotaz na výsledek odpovídá 202, dokud úloha neskončí.
Scan API
k8s-api-scandatový tok: Úloha CeleryRabbitMQk8s-rabbitmqÚloha Scan jde do RabbitMQ.
RabbitMQ
k8s-rabbitmqdatový tok: consumescan-workerk8s-worker-ai · k8s-worker-ai-2scan-worker (Celery · gevent) v poolu AI ji převezme a spustí Vision → Rule → Answer → Reward. Čtyři fáze jsou zřetězené úlohy Celery, nikoli uzly.
Pool AI
k8s-worker-ai · k8s-worker-ai-2datový tok: HTTPSLLM APIWorkery scan a chat volají API OpenAI a Google.
scan-worker
k8s-worker-ai · k8s-worker-ai-2datový tok: XADD scan:eventsStreamsk8s-redis-streamsUdálosti o postupu se zapisují do jednoho ze čtyř shardů Streams.
Streams
k8s-redis-streamsdatový tok: XREADGROUPEvent Routerk8s-event-routerEvent Router je čte jako consumer group a po zpracování provede XACK; pending a reclaim udržují doručení typu at-least-once.
Event Router
k8s-event-routerdatový tok: SETEX stateState KVk8s-redis-streamsZapisuje nejnovější stav a značku duplicitního zpracování do State KV na stejném uzlu Redis.
Event Router
k8s-event-routerdatový tok: PUBLISHPub/Subk8s-redis-pubsubDoručováno v reálném čase na kanálu úlohy ve shardovaném Pub/Sub.
Pub/Sub
k8s-redis-pubsubdatový tok: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway se přihlašuje k odběru přes jeden sdílený listener na proces a rozesílá do každého připojeného prohlížeče.
SSE Gateway
k8s-sse-gatewaydatový tok: Stream SSEProhlížečSpojení otevřené stejnou cestou přes ALB a ingress. Doručení typu at-least-once; duplicity se zpracovávají idempotentně.
State KV
k8s-redis-streamsdatový tok: Obnova po opětovném připojeníSSE Gatewayk8s-sse-gatewayPo opětovném připojení s Last-Event-ID doplní State KV a uchované Streams zmeškané události.
Chat · tokeny a ukládání
Tokeny Chat jdou stejnou cestou událostí jako Scan; checkpointy a zprávy ukládají dva různé workloady.
Prohlížečdatový tok: HTTPS 443AWS ALB
TLS končí na ALB.
AWS ALBdatový tok: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPředáno ingress Envoy Istio přes NodePort cíle typu instance EC2.
Istio ingress Envoy
k8s-ingress-gatewaydatový tok: VirtualServiceChat APIk8s-api-chatSměrováno do Chat API.
Chat API
k8s-api-chatdatový tok: Úloha TaskiqRabbitMQk8s-rabbitmqÚloha Chat jde do RabbitMQ.
RabbitMQ
k8s-rabbitmqdatový tok: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) klasifikuje záměr pomocí LangGraph, poté podle potřeby spustí vision, vybrané nástroje, aggregator a podle potřeby shrnutí a odpoví. Každý požadavek spouští jen větve, které potřebuje.
Pool AI
k8s-worker-ai · k8s-worker-ai-2datový tok: HTTPSLLM APIWorkery scan a chat volají API OpenAI a Google.
chat-worker
k8s-worker-ai · k8s-worker-ai-2datový tok: XADD chat:eventsStreamsk8s-redis-streamsTokeny a události fází se zapisují do čtyř shardů Streams; odtud je cesta doručení stejná jako u Scan.
Streams
k8s-redis-streamsdatový tok: XREADGROUPEvent Routerk8s-event-routerEvent Router je čte jako consumer group a po zpracování provede XACK; pending a reclaim udržují doručení typu at-least-once.
Event Router
k8s-event-routerdatový tok: PUBLISHPub/Subk8s-redis-pubsubDoručováno v reálném čase na kanálu úlohy ve shardovaném Pub/Sub.
Pub/Sub
k8s-redis-pubsubdatový tok: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway se přihlašuje k odběru přes jeden sdílený listener na proces a rozesílá do každého připojeného prohlížeče.
SSE Gateway
k8s-sse-gatewaydatový tok: Stream SSEProhlížečSpojení otevřené stejnou cestou přes ALB a ingress. Doručení typu at-least-once; duplicity se zpracovávají idempotentně.
chat-worker
k8s-worker-ai · k8s-worker-ai-2datový tok: checkpointCachek8s-redis-cacheCheckpoint LangGraph se uchovává v Redis Cache.
Cache
k8s-redis-cachedatový tok: čtení checkpointucheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer čte checkpoint z Redis.
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2datový tok: synchronizace do PostgreSQLPostgreSQLk8s-postgresqlAsyncPostgresSaver ho asynchronně ukládá do PostgreSQL.
Streams
k8s-redis-streamsdatový tok: chat-persistence grouppersistence consumerk8s-api-chatPersistence consumer na uzlu Chat čte události done jako consumer group.
persistence consumer
k8s-api-chatdatový tok: uložení zprávPostgreSQLk8s-postgresqlZprávy Chat se ukládají do PostgreSQL. Je to jiný workload než checkpoint-syncer.
Vstup · autentizace
Synchronní cesta od vstupu do clusteru k doménovému API. Autentizaci nejprve kontrolují jen cesty chráněné politikou; provoz podů mezi uzly běží na Calico VXLAN.
Prohlížečdotaz DNS: dotaz DNSRoute 53
Ze záznamů Route 53 se překládá jen název. Požadavky přes DNS neprocházejí.
Prohlížečdatový tok: HTTPS 443AWS ALB
TLS končí na ALB.
AWS ALBdatový tok: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayPředáno ingress Envoy Istio přes NodePort cíle typu instance EC2.
Istio ingress Envoy
k8s-ingress-gatewaydatový tok: ext-authz · gRPC 50051ext-authzk8s-api-authJen cesty pod politikou CUSTOM se nejprve ptají Go ext-authz (timeout 2 s, failOpen false). Cesty jako přihlášení, health a docs jsou vyloučeny.
ext-authz
k8s-api-authdatový tok: vyhledání v blacklistublacklistk8s-redis-authToken se kontroluje proti blacklistu v Redis.
Istio ingress Envoy
k8s-ingress-gatewaydatový tok: VirtualServiceChat APIk8s-api-chatSměrováno do Chat API.
Chat API
k8s-api-chatdatový tok: gRPCimages APIk8s-api-imageSynchronní volání chat → images uvedené v README.
auth API
k8s-api-authdatový tok: gRPCusers APIk8s-api-usersSynchronní volání auth → users uvedené v README.
Pool storage · asynchronní zápisy
Blacklist autentizace a vlastnictví postav ukládají workery poolu storage, které berou práci z RabbitMQ.
blacklist
k8s-redis-authdatový tok: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (auth-Bus z README) čte outbox v Redis.
auth-relay
k8s-worker-storage · k8s-worker-storage-2datový tok: blacklist.eventsRabbitMQk8s-rabbitmqZnovu publikuje do RabbitMQ, s opakováním a DLQ.
RabbitMQ
k8s-rabbitmqdatový tok: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker přijímá události blacklistu.
auth-worker
k8s-worker-storage · k8s-worker-storage-2datový tok: uložení blacklistublacklistk8s-redis-authUkládají se do blacklistu v Redis.
RabbitMQ
k8s-rabbitmqdatový tok: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker přijímá práci na vlastnictví postav v dávkách.
users-worker
k8s-worker-storage · k8s-worker-storage-2datový tok: UPSERTPostgreSQLk8s-postgresqlTa se promítá do PostgreSQL.
Konfigurace · škálování · pozorování
Platform Layer není krokem, kterým procházejí požadavky; nasazuje, konfiguruje, škáluje a pozoruje ostatní vrstvy. Uzly jsou instance EC2 vytvořené pomocí Terraform, s kubeadm a Calico nainstalovanými přes Ansible; CI Terraform jen validuje a nikdy ho automaticky neaplikuje.
GitHub Actions · Docker Hubkonfigurace · škálování: obraz · revize manifestuArgo CD image updater
k8s-masterArgo CD sjednocuje konfiguraci clusteru přes App-of-Apps a Sync Waves. Potvrzeno bylo jen umístění image updateru na control-plane.
ALB Controller · ExternalDNS
k8s-masterkonfigurace · škálování: Ingress → ALB · záznamy DNSSpravováno AWSALB Controller a ExternalDNS konfigurují prostředky na straně AWS. Nejde o cestu, kterou procházejí požadavky.
Istiod
k8s-masterkonfigurace · škálování: konfigurace xDSIstio ingress Envoyk8s-ingress-gatewayIstiod posílá konfiguraci Gateway, VirtualService a EnvoyFilter přes xDS do ingress Envoy a do sidecaru Envoy každého API.
KEDA
k8s-monitoringkonfigurace · škálování: počet podůPool AIk8s-worker-ai · k8s-worker-ai-2KEDA upravuje počet podů workerů. Počet uzlů se nemění.
KEDA
k8s-monitoringkonfigurace · škálování: počet podůpool storagek8s-worker-storage · k8s-worker-storage-2Pody workerů v poolu storage se škálují stejně.
Fluent Bitpozorovatelnost: logyElasticsearch
k8s-loggingFluent Bit je DaemonSet na každém uzlu a posílá logy do Elasticsearch.
Pool AI
k8s-worker-ai · k8s-worker-ai-2pozorovatelnost: trasování běhů LLMLangSmithStopy volání LLM jdou do LangSmith, externí služby SaaS.
Každé spojení se stejnou váhou. Výběr toku zvýrazní jen jeho cestu s očíslovanými kroky.
- Plná čára · směr toku požadavků, práce, událostí a zápisů
- Tečkovaná · dotaz DNS; požadavky jím neprocházejí
- Přerušovaná čára · konfigurace nebo škálování; není to datová cesta
- Dlouhá čerchovaná · logy a trasování běhů
- Silná černá čára · zvolený tok; čísla udávají pořadí
- Rámeček · fyzický uzel, název hostitele v záhlaví
- Vnitřní štítek · workload běžící na tomto uzlu
- Přerušovaný rám · dvouuzlový plánovací pool
- Přerušovaný rámeček · mimo cluster, nepočítá se jako uzel
- Oranžový obrys · místo, kde rozhoduje model
- Control plane1 uzel
- Domain API8 uzlů
- Pool AI2 uzly
- pool storage2 uzly
- Data5 uzlů
- Platform6 uzlů
Pět vrstev z README (pásy) a fyzické skupiny (odstín záhlaví každého uzlu) seskupují tytéž 24 uzly jinak. State KV sdílí uzel se Streams a nepočítá se zvlášť; Route 53, ALB a služby mimo cluster nejsou uzly. Pool je rozsah plánování, nikoli tvrzení, že každý pod běží na obou uzlech.
24uzlů
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd a platformní kontrolery.
- k8s-master
8Domain API
domain: <služba>Jeden uzel na doménu. Interní volání používají 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 plánovací pooly po dvou uzlech. KEDA mění počet podů; počet uzlů zůstává stejný.
pool storage
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
Pool AI
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis je rozdělen podle účelu na čtyři uzly. Úložiště PostgreSQL je EBS CSI · gp3.
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
Zasílání zpráv, pozorovatelnost, ingress a doručování v reálném čase mají každé vlastní uzel.
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- Každý uzel
- Fluent Bit · DaemonSet
- Calico
Nastavené modely · podle poskytovatele
Služba byla ukončena, takže jde o modely nastavené v repozitáři, nikoli o dnes dostupné volby. Každá role je uvedena zvlášť; nejde o seznam ověřených běhů.
OpenAI
Výchozí poskytovatel Chat
Chat
openai/gpt-5.2výchozí
Výchozím modelem je gpt-5.2; model uvedený v požadavku má přednost.
Scan
gpt-5.2výchozígpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
Modely mimo mapování 13 modelů se odmítají.
Mapování obrázků
gpt-image-1.5
Oddělený od gpt-5.2, orchestračního modelu Responses. Generování obrázků je ve výchozím stavu vypnuté.
Evaluace
gpt-4o-minivýchozí
Hodnotitel LLM pro evaluaci konverzací, oddělený od modelu Chat.
Google
Když Chat zvolí Google
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
Při zvoleném Google je výchozí 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
Mapování obrázků
gemini-3-pro-image-preview
Zdrojbackend main d8840c7Veřejný commit September 29, 2026 · ověřeno October 8, 2026