
Eco²
Backend · Cloud infrastructure
คำแนะนำการแยกขยะจากรูปถ่ายหนึ่งใบและบทสนทนา
ผู้ช่วย AI แบบครบวงจรที่เข้าใจวิธีการแยกขยะรีไซเคิลในเกาหลี ระบุประเภทขยะจากรูปถ่ายและอธิบายวิธีทิ้ง ในบทสนทนาจะเรียกเครื่องมือค้นหาสถานที่ สภาพอากาศ ราคารับซื้อของรีไซเคิล และการค้นหาเว็บ และสร้างภาพได้ ในโปรเจกต์ทีมนี้ เริ่มจากคลัสเตอร์และฐานการดีพลอย แล้วขยายขอบเขตไปสู่แบ็กเอนด์ของโดเมน การประมวลผลแบบอะซิงโครนัส เอเจนต์สนทนา และการตรวจยืนยัน
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
โหนดทั้ง 24 เชื่อมต่อกันจริงอย่างไร ทีละโฟลว์
Kubernetes ที่จัดการเองซึ่งสร้างด้วย kubeadm แผนที่วางโหนดกายภาพ 24 โหนดและเวิร์กโหลดบนโหนดเหล่านั้นไว้ในห้าเลเยอร์ของ README และเชื่อมด้วยการเชื่อมต่อจริง เลือกโฟลว์แล้วจะไฮไลต์เฉพาะเส้นทางนั้นพร้อมขั้นตอนที่มีหมายเลข
ตั้งแต่การพัฒนาช่วงการแข่งขันจนถึงการเสริมความแข็งแกร่งด้านแบ็กเอนด์และการดูแลระบบ
บริการสิ้นสุดการให้บริการแล้ว วิดีโอเดโมที่บันทึกไว้และรายงานทางเทคนิคแสดงการทำงานของมัน
คำขอ Scan → การส่งแบบเรียลไทม์
คำขอวิเคราะห์รูปภาพกลายเป็นงานที่เข้าคิว และอีเวนต์ความคืบหน้ากลับมายังเบราว์เซอร์เดิม
เบราว์เซอร์การค้นหา DNS: การค้นหา DNSRoute 53
แปลงเพียงชื่อจากเรคคอร์ด Route 53 คำขอไม่ได้ผ่าน DNS
เบราว์เซอร์การไหลของข้อมูล: HTTPS 443AWS ALB
TLS สิ้นสุดที่ ALB
AWS ALBการไหลของข้อมูล: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayส่งต่อไปยัง Istio ingress Envoy ผ่าน NodePort ของ EC2 instance target
Istio ingress Envoy
k8s-ingress-gatewayการไหลของข้อมูล: VirtualServiceScan APIk8s-api-scanกำหนดเส้นทางไปยัง Scan API ซึ่งใส่งานลงคิวและคืน job_id ทันที การเรียกดูผลจะได้คำตอบ 202 จนกว่างานจะเสร็จ
Scan API
k8s-api-scanการไหลของข้อมูล: งาน CeleryRabbitMQk8s-rabbitmqงาน Scan ถูกใส่ลง RabbitMQ
RabbitMQ
k8s-rabbitmqการไหลของข้อมูล: consumescan-workerk8s-worker-ai · k8s-worker-ai-2scan-worker (Celery · gevent) ในพูล AI รับงานและรัน Vision → Rule → Answer → Reward สี่ขั้นนี้เป็น Celery task ที่ต่อกันเป็น chain ไม่ใช่โหนด
พูล AI
k8s-worker-ai · k8s-worker-ai-2การไหลของข้อมูล: HTTPSLLM APIscan worker และ chat worker เรียก API ของ OpenAI และ Google
scan-worker
k8s-worker-ai · k8s-worker-ai-2การไหลของข้อมูล: XADD scan:eventsStreamsk8s-redis-streamsอีเวนต์ความคืบหน้าถูกเขียนลงหนึ่งในสี่ shard ของ Streams
Streams
k8s-redis-streamsการไหลของข้อมูล: XREADGROUPEvent Routerk8s-event-routerEvent Router อ่านในฐานะ consumer group และ XACK หลังประมวลผล pending และ reclaim รักษาการส่งแบบ at-least-once
Event Router
k8s-event-routerการไหลของข้อมูล: SETEX stateState KVk8s-redis-streamsเขียนสถานะล่าสุดและเครื่องหมายการประมวลผลซ้ำลงใน State KV บนโหนด Redis เดียวกัน
Event Router
k8s-event-routerการไหลของข้อมูล: PUBLISHPub/Subk8s-redis-pubsubส่งแบบเรียลไทม์บนช่องของงานใน shard Pub/Sub
Pub/Sub
k8s-redis-pubsubการไหลของข้อมูล: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway subscribe ผ่าน listener ที่ใช้ร่วมกันหนึ่งตัวต่อโปรเซส แล้วกระจายไปยังเบราว์เซอร์แต่ละตัวที่เชื่อมต่ออยู่
SSE Gateway
k8s-sse-gatewayการไหลของข้อมูล: สตรีม SSEเบราว์เซอร์การเชื่อมต่อที่เปิดผ่านเส้นทาง ALB และ ingress เดียวกัน การส่งเป็นแบบ at-least-once และจัดการรายการซ้ำแบบ idempotent
State KV
k8s-redis-streamsการไหลของข้อมูล: การกู้คืนเมื่อเชื่อมต่อใหม่SSE Gatewayk8s-sse-gatewayเมื่อเชื่อมต่อใหม่ด้วย Last-Event-ID แล้ว State KV และ Streams ที่เก็บไว้จะเติมอีเวนต์ที่พลาดไป
Chat · โทเค็นและการจัดเก็บ
โทเค็นของ Chat ใช้เส้นทางอีเวนต์เดียวกับ Scan ส่วน checkpoint และข้อความถูกจัดเก็บโดยเวิร์กโหลดสองตัวที่ต่างกัน
เบราว์เซอร์การไหลของข้อมูล: HTTPS 443AWS ALB
TLS สิ้นสุดที่ ALB
AWS ALBการไหลของข้อมูล: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayส่งต่อไปยัง Istio ingress Envoy ผ่าน NodePort ของ EC2 instance target
Istio ingress Envoy
k8s-ingress-gatewayการไหลของข้อมูล: VirtualServiceChat APIk8s-api-chatกำหนดเส้นทางไปยัง Chat API
Chat API
k8s-api-chatการไหลของข้อมูล: งาน TaskiqRabbitMQk8s-rabbitmqงาน Chat ถูกใส่ลง RabbitMQ
RabbitMQ
k8s-rabbitmqการไหลของข้อมูล: consumechat-workerk8s-worker-ai · k8s-worker-ai-2chat-worker (Taskiq · asyncio) จำแนกเจตนาด้วย LangGraph แล้วรัน vision หากจำเป็น เครื่องมือที่เลือก aggregator และการสรุปหากจำเป็น แล้วจึงตอบ แต่ละคำขอรันเฉพาะแขนงที่ต้องใช้
พูล AI
k8s-worker-ai · k8s-worker-ai-2การไหลของข้อมูล: HTTPSLLM APIscan worker และ chat worker เรียก API ของ OpenAI และ Google
chat-worker
k8s-worker-ai · k8s-worker-ai-2การไหลของข้อมูล: XADD chat:eventsStreamsk8s-redis-streamsโทเค็นและอีเวนต์ขั้นตอนถูกเขียนลงสี่ shard ของ Streams จากนั้นเส้นทางการส่งเหมือนกับของ Scan
Streams
k8s-redis-streamsการไหลของข้อมูล: XREADGROUPEvent Routerk8s-event-routerEvent Router อ่านในฐานะ consumer group และ XACK หลังประมวลผล pending และ reclaim รักษาการส่งแบบ at-least-once
Event Router
k8s-event-routerการไหลของข้อมูล: PUBLISHPub/Subk8s-redis-pubsubส่งแบบเรียลไทม์บนช่องของงานใน shard Pub/Sub
Pub/Sub
k8s-redis-pubsubการไหลของข้อมูล: SUBSCRIBESSE Gatewayk8s-sse-gatewaySSE Gateway subscribe ผ่าน listener ที่ใช้ร่วมกันหนึ่งตัวต่อโปรเซส แล้วกระจายไปยังเบราว์เซอร์แต่ละตัวที่เชื่อมต่ออยู่
SSE Gateway
k8s-sse-gatewayการไหลของข้อมูล: สตรีม SSEเบราว์เซอร์การเชื่อมต่อที่เปิดผ่านเส้นทาง ALB และ ingress เดียวกัน การส่งเป็นแบบ at-least-once และจัดการรายการซ้ำแบบ idempotent
chat-worker
k8s-worker-ai · k8s-worker-ai-2การไหลของข้อมูล: checkpointCachek8s-redis-cachecheckpoint ของ LangGraph ถูกเก็บใน Redis Cache
Cache
k8s-redis-cacheการไหลของข้อมูล: อ่าน checkpointcheckpoint-syncerk8s-worker-ai · k8s-worker-ai-2checkpoint-syncer อ่าน checkpoint จาก Redis
checkpoint-syncer
k8s-worker-ai · k8s-worker-ai-2การไหลของข้อมูล: ซิงก์ไปยัง PostgreSQLPostgreSQLk8s-postgresqlAsyncPostgresSaver จัดเก็บลงใน PostgreSQL แบบอะซิงโครนัส
Streams
k8s-redis-streamsการไหลของข้อมูล: chat-persistence grouppersistence consumerk8s-api-chatpersistence consumer บนโหนด Chat อ่านอีเวนต์ done ในฐานะ consumer group
persistence consumer
k8s-api-chatการไหลของข้อมูล: จัดเก็บข้อความPostgreSQLk8s-postgresqlข้อความแชตถูกจัดเก็บลงใน PostgreSQL นี่เป็นเวิร์กโหลดที่ต่างจาก checkpoint-syncer
ทางเข้า · การยืนยันตัวตน
เส้นทางแบบซิงโครนัสจากทางเข้าของคลัสเตอร์ไปถึง domain API เฉพาะเส้นทางที่มีนโยบายป้องกันจะตรวจการยืนยันตัวตนก่อน ทราฟฟิกของพ็อดระหว่างโหนดวิ่งบน Calico VXLAN
เบราว์เซอร์การค้นหา DNS: การค้นหา DNSRoute 53
แปลงเพียงชื่อจากเรคคอร์ด Route 53 คำขอไม่ได้ผ่าน DNS
เบราว์เซอร์การไหลของข้อมูล: HTTPS 443AWS ALB
TLS สิ้นสุดที่ ALB
AWS ALBการไหลของข้อมูล: HTTP · NodePortIstio ingress Envoy
k8s-ingress-gatewayส่งต่อไปยัง Istio ingress Envoy ผ่าน NodePort ของ EC2 instance target
Istio ingress Envoy
k8s-ingress-gatewayการไหลของข้อมูล: ext-authz · gRPC 50051ext-authzk8s-api-authเฉพาะเส้นทางภายใต้นโยบาย CUSTOM ที่ถาม ext-authz ของ Go ก่อน (timeout 2 s, failOpen false) เส้นทางเช่น login, health และ docs ถูกยกเว้น
ext-authz
k8s-api-authการไหลของข้อมูล: ค้นหา blacklistblacklistk8s-redis-authโทเค็นถูกตรวจกับ blacklist ใน Redis
Istio ingress Envoy
k8s-ingress-gatewayการไหลของข้อมูล: VirtualServiceChat APIk8s-api-chatกำหนดเส้นทางไปยัง Chat API
Chat API
k8s-api-chatการไหลของข้อมูล: gRPCimages APIk8s-api-imageการเรียกแบบซิงโครนัส chat → images ที่ระบุไว้ใน README
auth API
k8s-api-authการไหลของข้อมูล: gRPCusers APIk8s-api-usersการเรียกแบบซิงโครนัส auth → users ที่ระบุไว้ใน README
พูล storage · การเขียนแบบอะซิงโครนัส
blacklist ของการยืนยันตัวตนและความเป็นเจ้าของตัวละครถูกจัดเก็บโดย worker ในพูล storage ซึ่งรับงานจาก RabbitMQ
blacklist
k8s-redis-authการไหลของข้อมูล: outbox:blacklistauth-relayk8s-worker-storage · k8s-worker-storage-2auth-relay (auth-Bus ใน README) อ่าน outbox ของ Redis
auth-relay
k8s-worker-storage · k8s-worker-storage-2การไหลของข้อมูล: blacklist.eventsRabbitMQk8s-rabbitmqเผยแพร่ซ้ำไปยัง RabbitMQ พร้อมการลองใหม่และ DLQ
RabbitMQ
k8s-rabbitmqการไหลของข้อมูล: blacklist.eventsauth-workerk8s-worker-storage · k8s-worker-storage-2auth-worker รับอีเวนต์ blacklist
auth-worker
k8s-worker-storage · k8s-worker-storage-2การไหลของข้อมูล: จัดเก็บ blacklistblacklistk8s-redis-authจัดเก็บลงใน blacklist ของ Redis
RabbitMQ
k8s-rabbitmqการไหลของข้อมูล: Celery batchusers-workerk8s-worker-storage · k8s-worker-storage-2users-worker รับงานความเป็นเจ้าของตัวละครเป็นชุด
users-worker
k8s-worker-storage · k8s-worker-storage-2การไหลของข้อมูล: UPSERTPostgreSQLk8s-postgresqlนำไปใช้กับ PostgreSQL
ตั้งค่า · ปรับขนาด · สังเกตการณ์
Platform Layer ไม่ใช่ขั้นที่คำขอผ่าน แต่ดีพลอย ตั้งค่า ปรับขนาด และสังเกตการณ์เลเยอร์อื่น โหนดเป็นอินสแตนซ์ EC2 ที่สร้างด้วย Terraform โดยติดตั้ง kubeadm และ Calico ด้วย Ansible CI เพียงตรวจความถูกต้องของ Terraform และไม่ apply โดยอัตโนมัติ
GitHub Actions · Docker Hubกำหนดค่า · สเกล: อิมเมจ · revision ของ manifestArgo CD image updater
k8s-masterArgo CD ปรับการตั้งค่าคลัสเตอร์ให้ตรงกันผ่าน App-of-Apps และ Sync Waves ยืนยันตำแหน่งบน control-plane เฉพาะของ image updater
ALB Controller · ExternalDNS
k8s-masterกำหนดค่า · สเกล: Ingress → ALB · เรคคอร์ด DNSAWS แบบ managedALB Controller และ ExternalDNS ตั้งค่าทรัพยากรฝั่ง AWS นี่ไม่ใช่เส้นทางที่คำขอผ่าน
Istiod
k8s-masterกำหนดค่า · สเกล: การตั้งค่า xDSIstio ingress Envoyk8s-ingress-gatewayIstiod ส่งการตั้งค่า Gateway, VirtualService และ EnvoyFilter ผ่าน xDS ไปยัง ingress Envoy และ Envoy sidecar ของแต่ละ API
KEDA
k8s-monitoringกำหนดค่า · สเกล: จำนวน podพูล AIk8s-worker-ai · k8s-worker-ai-2KEDA ปรับจำนวน pod ของ worker จำนวนโหนดไม่เปลี่ยน
KEDA
k8s-monitoringกำหนดค่า · สเกล: จำนวน podพูล storagek8s-worker-storage · k8s-worker-storage-2pod ของ worker ในพูล storage ถูกปรับขนาดแบบเดียวกัน
Fluent Bitการสังเกตการณ์: ล็อกElasticsearch
k8s-loggingFluent Bit เป็น DaemonSet บนทุกโหนดและส่งล็อกไปยัง Elasticsearch
พูล AI
k8s-worker-ai · k8s-worker-ai-2การสังเกตการณ์: การติดตามการรัน LLMLangSmithtrace ของการเรียก LLM ไปที่ LangSmith ซึ่งเป็น SaaS ภายนอก
ทุกการเชื่อมต่อมีน้ำหนักเท่ากัน เลือกโฟลว์เพื่อไฮไลต์เฉพาะเส้นทางของโฟลว์นั้นพร้อมขั้นตอนที่มีหมายเลข
- เส้นทึบ · ทิศทางที่คำขอ งาน อีเวนต์ และการเขียนไหลไป
- เส้นจุด · การค้นหา DNS คำขอไม่ได้ผ่านทางนี้
- เส้นประ · กำหนดค่าหรือสเกล ไม่ใช่เส้นทางข้อมูล
- เส้นประยาวสลับจุด · ล็อกและการติดตามการรัน
- เส้นดำหนา · โฟลว์ที่เลือก ตัวเลขบอกลำดับ
- กล่อง · โหนดทางกายภาพ ชื่อโฮสต์อยู่ที่หัวกล่อง
- ชิปด้านใน · เวิร์กโหลดที่รันบนโหนดนั้น
- กรอบเส้นประ · พูลการจัดตารางสองโหนด
- กล่องเส้นประ · อยู่นอกคลัสเตอร์ ไม่นับเป็นโหนด
- เส้นขอบสีส้ม · จุดที่โมเดลตัดสินใจ
- Control plane1 โหนด
- Domain API8 โหนด
- พูล AI2 โหนด
- พูล storage2 โหนด
- Data5 โหนด
- Platform6 โหนด
ห้าเลเยอร์ของ README (แถบ) และกลุ่มกายภาพ (สีส่วนหัวของแต่ละโหนด) จัดกลุ่มโหนด 24 โหนดชุดเดียวกันต่างกัน State KV ใช้โหนดร่วมกับ Streams และไม่ถูกนับแยก Route 53, ALB และบริการนอกคลัสเตอร์ไม่ใช่โหนด พูลคือขอบเขตการจัดตาราง ไม่ได้หมายความว่าทุก pod รันบนทั้งสองโหนด
24โหนด
24 = 1 control plane + 8 API + 4 worker + 5 data + 6 platform
1Control plane
role: control-planekube-apiserver · scheduler · controller-manager · etcd รวมถึงคอนโทรลเลอร์ของแพลตฟอร์ม
- k8s-master
8Domain API
domain: <บริการ>หนึ่งโหนดต่อหนึ่งโดเมน การเรียกภายในใช้ 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
พูลการจัดตารางสองพูล พูลละสองโหนด KEDA เปลี่ยนจำนวน pod ส่วนจำนวนโหนดคงเดิม
พูล storage
domain: worker-storage- k8s-worker-storage
- k8s-worker-storage-2
พูล AI
domain: worker-ai- k8s-worker-ai
- k8s-worker-ai-2
5Data
Redis แยกไว้บนสี่โหนดตามวัตถุประสงค์ ที่จัดเก็บของ PostgreSQL คือ EBS CSI · gp3
- k8s-postgresql
- k8s-redis-auth
- k8s-redis-streams
- k8s-redis-cache
- k8s-redis-pubsub
6Platform
การส่งข้อความ การสังเกตการณ์ ทางเข้า และการส่งแบบเรียลไทม์ แต่ละอย่างมีโหนดของตัวเอง
- k8s-rabbitmq
- k8s-monitoring
- k8s-logging
- k8s-ingress-gateway
- k8s-sse-gateway
- k8s-event-router
- ทุกโหนด
- Fluent Bit · DaemonSet
- Calico
โมเดลที่ตั้งค่าไว้ · ตามผู้ให้บริการ
บริการปิดตัวแล้ว รายการนี้จึงเป็นโมเดลที่ตั้งค่าไว้ในรีโพซิทอรี ไม่ใช่ตัวเลือกที่ใช้ได้ในวันนี้ แต่ละบทบาทแสดงแยกกัน และนี่ไม่ใช่รายการการรันที่ตรวจยืนยันแล้ว
OpenAI
ผู้ให้บริการเริ่มต้นของ Chat
Chat
openai/gpt-5.2ค่าเริ่มต้น
โมเดลเริ่มต้นคือ gpt-5.2 หากคำขอระบุโมเดล จะใช้โมเดลนั้นแทน
Scan
gpt-5.2ค่าเริ่มต้นgpt-5.2-progpt-5.1gpt-5gpt-5-progpt-5-mini
โมเดลที่อยู่นอกการแมป 13 โมเดลจะถูกปฏิเสธ
การแมปรูปภาพ
gpt-image-1.5
แยกจาก gpt-5.2 ซึ่งเป็นโมเดลออร์เคสเตรชันของ Responses การสร้างรูปภาพปิดอยู่เป็นค่าเริ่มต้น
การประเมิน
gpt-4o-miniค่าเริ่มต้น
LLM grader สำหรับการประเมินบทสนทนา แยกจากโมเดลของ Chat
Google
เมื่อ Chat เลือก Google
Chat
google/gemini-3-pro-previewgoogle/gemini-3-flash-preview
เมื่อเลือก Google ค่าเริ่มต้นคือ 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
การแมปรูปภาพ
gemini-3-pro-image-preview
แหล่งที่มาbackend main d8840c7คอมมิตสาธารณะ September 29, 2026 · ตรวจเมื่อ October 8, 2026