ข้ามไปยังเนื้อหาหลัก

Kimi K3: คุณสมบัติ ผลทดสอบ API และ 5 ตัวอย่างแบบลงมือทำ

เรียนรู้ว่า Kimi K3 คืออะไร วิธีเข้าถึง และวิธีจัดการการให้เหตุผล เครื่องมือ บริบทยาว และวิสัยทัศน์ผ่าน 5 ตัวอย่างแบบลงมือทำ
อัปเดตแล้ว 21 ก.ค. 2569  · 12 นาที อ่าน

สำรวจด้วย AI

เปิดใน ChatGPTเปิดใน Claudeเปิดใน Perplexity

การแข่งขันโมเดลเปิดขยับอีกครั้งเมื่อวันที่ 16 กรกฎาคม 2026 เมื่อ Moonshot AI เปิดตัว Kimi K3 โมเดลขนาด 2.8 ล้านล้านพารามิเตอร์พร้อมหน้าต่างบริบท 1 ล้านโทเคนและความสามารถด้านวิสัยทัศน์โดยกำเนิด นี่คือโมเดลเปิดที่ใหญ่ที่สุดที่ Moonshot ส่งออก เกินกว่า Kimi K2 อย่างมาก และเป็นตัวแรกที่พวกเขาอธิบายว่าเข้าสู่ระดับ 3 ล้านล้านพารามิเตอร์

หากต้องการเรื่องราวการเปิดตัว เจาะสถาปัตยกรรม กราฟผลทดสอบ การเปรียบเทียบกับ Claude, GPT และห้องทดลองในจีนอื่น ๆ รวมถึงรายการข้อจำกัดของ Moonshot เรายกไว้ในบล็อกโพสต์ Kimi K3 บทความนี้เป็นฝั่งลงมือทำ รวมถึงวิธีเข้าถึงและพฤติกรรมของโมเดลเมื่อใช้งานจริง ผู้เขียนจะพาไปดู 5 ตัวอย่างเล็ก ๆ สี่ตัวอย่างผ่าน API ซึ่งแสดงการใช้โทเคนและต้นทุนจริง และสองตัวอย่างในเว็บแอป kimi.com โดยรวมแล้วครอบคลุมว่่า K3 จัดการกับ:

  • การเรียกใช้เครื่องมือและการส่งคืน JSON แบบเคร่งครัด
  • การโหลดคำนิยามเครื่องมือแบบฉับพลัน
  • การลดต้นทุนบริบทยาวด้วยการแคชอัตโนมัติ
  • การอ่านสกรีนช็อตและแก้ไขเลย์เอาต์
  • การสร้างแดชบอร์ดแบบโต้ตอบด้วยพรอมป์ตเดียว

สี่ตัวอย่างผ่าน API รันเมื่อวันที่ 17 กรกฎาคม 2026 บนโมเดล kimi-k3 และมีค่าใช้จ่ายราว 11 เซนต์ในการรันครั้งแรก หรือไม่กี่เซนต์เมื่อการแคชเริ่มทำงาน

วิธีเข้าถึง Kimi K3

ทางที่เร็วที่สุดในการลองโมเดลคือ kimi.com ซึ่งเว็บแอปและแอปบนมือถือรัน Kimi K3 สำหรับงานเอเจนต์ทั่วไปโดยไม่ต้องตั้งค่า

สำหรับงานหนักขึ้นอย่างรายงานและแดชบอร์ด มี Kimi Work เป็นแอปเดสก์ท็อป

หากทำงานในเทอร์มินัล Kimi Code เป็นเอเจนต์ช่วยเขียนโค้ดที่ติดตั้งจาก npm ในชื่อ @moonshot-ai/kimi-code และสามารถเลือกโมเดลได้ด้วยคำสั่ง /model การใช้ K3 ใน Kimi Code ต้องเป็นสมาชิกแบบชำระเงิน และหน้าต่าง 1 ล้านโทเคนเต็มต้องใช้ระดับสมาชิกที่สูงกว่า

บทความนี้เน้นที่ API ตรงและเว็บแอป แต่ก็มีเอเจนต์เทอร์มินัลให้ใช้หากต้องการ

อย่างไรก็ดี K3 ไม่ได้มาแทนพี่น้องของมัน ตารางด้านล่างแสดงว่าไลน์อัปปัจจุบันแบ่งบทบาทกันอย่างไร

โมเดล

หน้าต่างบริบท

เหมาะที่สุดสำหรับ

kimi-k3

1,048,576 โทเคน

งานธงเรือ: โค้ดยาว วิสัยทัศน์ งานความรู้

kimi-k2.7-code

262,144 โทเคน

งานโค้ดโดยเฉพาะ พร้อมตัวเลือกความเร็วสูงที่เร็วกว่า

kimi-k2.6

262,144 โทเคน

แชตข้อความ รูปภาพ และวิดีโอทั่วไป

สรุปสั้น ๆ คือ K3 เป็นโมเดลที่ควรเริ่มต้นเมื่อมีงานที่ผสมโค้ด เครื่องมือ เอกสาร และรูปภาพ หรือเมื่อจำเป็นต้องใช้หน้าต่าง 1 ล้านโทเคนจริง ๆ สำหรับการสร้างโค้ดล้วนที่ความเร็วสำคัญกว่าบริบท kimi-k2.7-code ยังเป็นตัวเลือกที่สมเหตุสมผลกว่า ดังนั้นอย่าคิดว่าโมเดลใหม่ล่าสุดจะเหมาะเสมอไป

ตั้งค่า Kimi K3 API

API เข้ากันได้กับ OpenAI SDK ดังนั้นหากเคยใช้มาก่อน เกือบไม่มีอะไรใหม่ ต้องมี Python 3.9 ขึ้นไปและคีย์ API

ขั้นตอนที่ 1: สร้างคีย์ API

ก่อนอื่น ลงชื่อเข้าใช้แพลตฟอร์ม Kimi และเปิด หน้าคีย์ API ในคอนโซล สร้างคีย์ คัดลอกครั้งเดียว และเก็บไว้ในที่ปลอดภัย เพราะจะไม่เห็นอีก นอกจากนี้ต้องมียอดเงินเล็กน้อยในบัญชีเพื่อทำการเรียกใช้ สำหรับบทความนี้ไม่กี่ดอลลาร์ก็เพียงพอ

หน้าคอนโซลแพลตฟอร์ม Kimi ส่วนคีย์ API แสดงปุ่มสร้างคีย์ API

การสร้างคีย์ API ของ Kimi K3 ภาพโดยผู้เขียน

ขั้นตอนที่ 2: ติดตั้ง SDK

ต่อไป ติดตั้ง OpenAI SDK ลงในสภาพแวดล้อม คำสั่งเดียวก็เสร็จ

python -m pip install --upgrade "openai>=1.0"

คำสั่งนี้ดึงไลบรารีไคลเอนต์ที่ใช้ในตัวอย่างที่เหลือ และไม่มีอะไรเฉพาะของ Kimi ที่ต้องติดตั้งเพิ่ม

ขั้นตอนที่ 3: เก็บคีย์และเริ่มต้นไคลเอนต์

การอ่านคีย์จากตัวแปรสภาพแวดล้อมดีกว่าการวางลงในโค้ด กำหนดค่า MOONSHOT_API_KEY ในเชลล์หรือไฟล์ .env จากนั้นชี้ไคลเอนต์ไปยัง base URL ของ Moonshot

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["MOONSHOT_API_KEY"],
    base_url="https://api.moonshot.ai/v1",
)

มีเพียงสองอย่างที่ต่างจากการตั้งค่า OpenAI มาตรฐานคือ base_url และชื่อโมเดลคือ kimi-k3 เมื่อเรียบร้อย ก็พร้อมทำการเรียกครั้งแรก

ขั้นตอนที่ 4: ทำการเรียกครั้งแรก

มาลองคำขอแรก ผู้เขียนขอให้โมเดลแนะนำตัวเอง ซึ่งกลายเป็นช่วงเวลาตรงไปตรงมาน่าประทับใจ

completion = client.chat.completions.create(
    model="kimi-k3",
    messages=[{"role": "user", "content": "Introduce Kimi K3 in one sentence."}],
    max_completion_tokens=800,
)
print(completion.choices[0].message.content)

คำตอบคือการปฏิเสธอย่างสุภาพที่จะคาดเดา: โมเดลระบุว่าไม่มีข้อมูลที่เชื่อถือได้เกี่ยวกับ Kimi K3 เนื่องจากถูกฝึกมาก่อนที่ตัวมันเองจะเปิดตัว และชี้ไปที่ประกาศของ Moonshot แทน นี่เป็นการเตือนที่ดีว่าโมเดลไม่รู้เรื่องตัวเอง คำเรียก API นี้มีค่าใช้จ่ายประมาณเจ็ดในสิบของเซนต์ สังเกตการกำหนดเพดาน max_completion_tokens ซึ่งผู้เขียนตั้งไว้ทุกคำเรียกในบทความเพื่อกันเอาต์พุตยืดยาวจนค่าใช้จ่ายพุ่ง

ผลลัพธ์ในเทอร์มินัลที่ Kimi K3 ระบุว่าไม่มีข้อมูลที่เชื่อถือได้เกี่ยวกับตัวเอง

ผลลัพธ์การเรียก API ครั้งแรกของ Kimi K3 ภาพโดยผู้เขียน

ตัวอย่างที่ 1: การสตรีมการให้เหตุผลและคำตอบสุดท้าย

K3 ให้เหตุผลเสมอ และ API จะส่งการให้เหตุผลผ่านช่องแยกจากคำตอบ เมื่อสตรีม แต่ละชิ้นอาจมี reasoning_content, contentสุดท้าย หรือทั้งสองอย่าง จึงสามารถแยกพื้นที่แสดงความคิดและคำตอบได้

stream = client.chat.completions.create(
    model="kimi-k3",
    messages=[{"role": "user", "content": "A bat and a ball cost $1.10 together. The bat costs $1.00 more than the ball. How much is the ball?"}],
    max_completion_tokens=1200,
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in stream:
    if not chunk.choices:
        continue
    delta = chunk.choices[0].delta
    reasoning = getattr(delta, "reasoning_content", None)
    if reasoning:
        print(reasoning, end="", flush=True)
    if delta.content:
        print(delta.content, end="", flush=True)

โมเดลสตรีมการทำงานก่อน: รู้จักโจทย์ไม้เบสบอลกับลูกบอลว่าเป็นแบบทดสอบ Cognitive Reflection Test คลาสสิก ระบุคำตอบ直สัญชาตญาณที่ผิดคือ $0.10 จากนั้นแก้อัลเจบราจนได้ว่าลูกบอลราคา $0.05 และตรวจสอบว่า $1.05 บวก $0.05 ได้ $1.10 ส่วนที่มีประโยชน์คือการแยกส่วน: ในแอปจริงจะแสดง content ให้ผู้ใช้ และเก็บ reasoning_contentไว้สำหรับล็อก เพราะการแสดงเหตุผลดิบในโปรดักชันมักไม่ใช่สิ่งที่ต้องการ คำเรียกนี้ใช้เอาต์พุต 488 โทเคนและมีค่าใช้จ่ายไม่ถึงหนึ่งเซนต์

เทอร์มินัลแสดง Kimi K3 สตรีมเหตุผลทีละขั้นตอนและคำตอบสุดท้ายว่าลูกบอลราคา 5 เซนต์

สตรีมเหตุผลแล้วตามด้วยคำตอบสุดท้าย ภาพโดยผู้เขียน

ตัวอย่างที่ 2: การเรียกใช้เครื่องมือพร้อมเอาต์พุตแบบมีโครงสร้าง

Kimi K3 เป็นโมเดลในไลน์อัปที่รองรับ tool_choice="required" ซึ่งบังคับให้เกิดการเรียกเครื่องมืออย่างน้อยหนึ่งครั้งในเทิร์น นั่นมีประโยชน์เมื่ออยากให้โมเดลดึงข้อมูลมาก่อนแทนการเดา ที่นี่ผู้เขียนให้เครื่องมือจำลองสองตัว คือการค้นหาราคาและตรวจสต็อก บังคับให้เรียกเครื่องมือ รันเครื่องมือในเครื่อง แล้วขอผลลัพธ์เป็น JSON แบบเคร่งครัดด้วย response_format

first = client.chat.completions.create(
    model="kimi-k3",
    messages=messages,
    tools=TOOLS,
    tool_choice="required",
    max_completion_tokens=2500,
)
assistant_message = first.choices[0].message
messages.append(assistant_message)

for tool_call in assistant_message.tool_calls or []:
    args = json.loads(tool_call.function.arguments)
    messages.append({"role": "tool", "tool_call_id": tool_call.id, "content": run_tool(tool_call.function.name, args)})

โมเดลเรียกทั้งสองเครื่องมือด้วยรหัสสินค้าที่ถูกต้อง แล้วส่งสรุปคำสั่งซื้อที่สะอาดตาเป็น JSON: คีย์บอร์ดเชิงกล 5 ตัว ชิ้นละ $89 รวม $445 และตั้งค่าสถานะสต็อกเป็น true รายละเอียดสองอย่างที่ทำให้ใช้งานได้จริงคือ ต้องผนวกข้อความผู้ช่วยทั้งก้อนกลับเข้าบทสนทนาก่อนเพิ่มผลเครื่องมือ และควรแยกวิเคราะห์เฉพาะ content สำหรับ JSON ห้ามใช้ฟิลด์ reasoning คำเรียกคู่กันนี้มีค่าใช้จ่ายรวมกันไม่ถึงหนึ่งเซนต์

เทอร์มินัลแสดงการเรียกเครื่องมือสองครั้ง ตามด้วยสรุปคำสั่งซื้อแบบ JSON ที่รวมยอดสี่ร้อยสี่สิบห้าเหรียญ

การเรียกเครื่องมือและเอาต์พุต JSON แบบมีโครงสร้าง ภาพโดยผู้เขียน

ตัวอย่างที่ 3: โหลดเครื่องมือแบบไดนามิก

หากมีเครื่องมือหลายสิบตัว การส่งคำนิยามทั้งหมดทุกคำขอทำให้เปลืองโทเคนและรกพรอมป์ต Kimi K3 ให้ฉีดคำนิยามเครื่องมือระหว่างบทสนทนาด้วยข้อความ system ที่มีฟิลด์ tools และไม่มี content เครื่องมือจะพร้อมใช้งานตั้งแต่นั้นไป ช่วยกันไม่ให้แค็ตตาล็อกเครื่องมือขนาดใหญ่เข้าไปอยู่ในพรีฟิกซ์ที่แคชไว้จนกว่าจะต้องใช้จริง

messages = [
    {"role": "user", "content": "Convert 100 US dollars to euros at a rate of 0.92."},
    {"role": "system", "tools": [{
        "type": "function",
        "function": {
            "name": "convert_currency",
            "description": "Convert an amount from one currency to another",
            "parameters": {
                "type": "object",
                "properties": {"amount": {"type": "number"}, "rate": {"type": "number"}},
                "required": ["amount", "rate"],
            },
        },
    }]},
]
completion = client.chat.completions.create(model="kimi-k3", messages=messages)
print(completion.choices[0].message.tool_calls)

K3 รับเครื่องมือที่เพิ่งโหลดและเรียกใช้ convert_currency ด้วย amount เท่ากับ 100 และ rate 0.92 ตามที่ตั้งใจไว้ สิ่งหนึ่งที่ต้องจำคือเซิร์ฟเวอร์จะไม่เก็บคำนิยามนี้ไว้ให้ จึงต้องส่งข้อความ system ซ้ำในคำขอถัด ๆ ไปหากอยากให้เครื่องมือยังพร้อมใช้งาน คำเรียกนี้ถูกที่สุดในชุดที่ประมาณสองในสิบของเซนต์

เทอร์มินัลแสดง Kimi K3 เรียกใช้เครื่องมือแปลงสกุลเงินที่โหลดแบบไดนามิกพร้อมพารามิเตอร์ amount และ rate

การเรียกใช้เครื่องมือแปลงสกุลเงินที่โหลดแบบไดนามิก ภาพโดยผู้เขียน

ตัวอย่างที่ 4: ลดต้นทุนบริบทยาวด้วยการแคช

ตัวอย่างนี้คือจุดที่หน้าต่าง 1 ล้านโทเคนใช้งานได้จริง การแคชบริบท เป็นแบบอัตโนมัติ ไม่มี ID แคชและไม่มีอายุการเก็บที่ต้องจัดการ ส่งพรีฟิกซ์ขนาดใหญ่ รักษาให้เหมือนเดิมเป๊ะในคำขอถัดไป และส่วนที่ซ้ำจะคิดค่าบริการในอัตรา cache hit แทน cache miss เพื่อให้เห็นความต่าง ผู้เขียนใช้ฐานความรู้ราว 33,000 โทเคนและถามคำถามเกี่ยวกับมัน

knowledge = Path("knowledge_base.md").read_text(encoding="utf-8")
completion = client.chat.completions.create(
    model="kimi-k3",
    messages=[
        {"role": "system", "content": knowledge},
        {"role": "user", "content": "What is the rated payload of the Atlas robot?"},
    ],
    max_completion_tokens=600,
)

ครั้งแรกที่ส่งพรีฟิกซ์นั้น ไม่มีส่วนไหนถูกแคช และคำขอมีค่าใช้จ่ายราว 9.9 เซนต์สำหรับอินพุตประมาณ 33,000 โทเคน หลังจากพรีฟิกซ์ถูกเห็นแล้ว คำขอเดียวกันชนแคชในพรีฟิกซ์ 32,512 โทเคนทั้งหมดและมีค่าใช้จ่ายราว 1.1 เซนต์ ลดลงเกือบเก้าเท่า เหตุผลคือช่องว่างราคา: อินพุตที่แคชแล้วคิด $0.30 ต่อหนึ่งล้านโทเคน เทียบกับ $3.00 สำหรับที่ไม่ได้แคช ข้อสังเกตคือการเขียนแคชเป็นแบบอะซิงก์ จึงยังไม่เกิด hit ในคำขอที่ยิงติดกันทันที จะมีผลในคำขอถัดไป ดังนั้นรันสคริปต์สองครั้งห่างกันหนึ่งนาทีจะเห็น miss ก่อนแล้วจึง hit

การรันสคริปต์แคชสองครั้งในเทอร์มินัล แสดงค่าใช้จ่าย cache miss ใกล้สิบเซนต์และ cache hit ใกล้หนึ่งเซนต์

ค่าใช้จ่ายเมื่อพลาดแคชเทียบกับเมื่อชนแคช ภาพโดยผู้เขียน

ตัวอย่างที่ 5: จับบั๊กเลย์เอาต์จากสกรีนช็อต

K3 รองรับวิสัยทัศน์โดยกำเนิด และ API เป็นวิธีใช้ที่สะอาด แม้จะไม่รับ URL รูปภาพสาธารณะ ต้องส่งรูปเป็น data URL แบบ base64 และทำให้ content ของข้อความเป็นอาร์เรย์ของอ็อบเจ็กต์ แยกส่วนรูปภาพและข้อความ ผู้เขียนเรนเดอร์แดชบอร์ดเล็ก ๆ พร้อมบั๊กเลย์เอาต์ตั้งใจไว้ สกรีนช็อต แล้วถาม K3 ว่าผิดอะไร

สกรีนช็อตแดชบอร์ดที่มีการ์ดเยื้องแนว ป้ายทับตัวเลข และแท่งกราฟล้นออกนอกกราฟ

แดชบอร์ดที่มีบั๊กเลย์เอาต์ตั้งใจไว้ ภาพโดยผู้เขียน

import base64
from pathlib import Path

image_data = base64.b64encode(Path("broken_dashboard.png").read_bytes()).decode()
completion = client.chat.completions.create(
    model="kimi-k3",
    messages=[{
        "role": "user",
        "content": [
            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_data}"}},
            {"type": "text", "text": "List the layout and alignment problems you can see, and give a short CSS fix for each."},
        ],
    }],
    max_completion_tokens=3500,
)
print(completion.choices[0].message.content)

K3 อ่านรูปได้ดี มันจับได้ว่าการ์ดหนึ่งใบวางต่ำกว่าบรรทัดและซ้อนทับกับการ์ดข้าง ๆ ป้ายไปค้างบนตัวเลข (ถึงขั้นอ่านเลข 3,910 ที่ถูกปิดเป็น 5,910 ซึ่งเป็นบั๊กที่ยืนยันตัวเอง) ช่องว่างก่อนการ์ดใบสุดท้ายไม่เท่ากัน แท่งกราฟล้นขึ้นไปชนการ์ดด้านบน และทูลทิปทับอยู่เหนือแท่ง พร้อมให้วิธีแก้ CSS สั้น ๆ สำหรับแต่ละข้อ เช่น ย้ายการ์ดมาอยู่ในกริดเดียวกัน อย่างไรก็ตาม มันข้ามซับไตเติลที่คอนทราสต์ต่ำแทบมองไม่เห็น ดังนั้นวิสัยทัศน์จะจับสิ่งที่เตะตาได้ดีกว่ารายละเอียดเล็กน้อย คำเรียกนี้มีค่าใช้จ่ายราวสองเซนต์

ข้อจำกัดของ Kimi K3

ตัวอย่าง API เป็นไปได้ด้วยดี แต่มีขอบขรุขระบางอย่างที่ควรเอ่ยไว้เพื่อจะได้ไม่แปลกใจ ผู้เขียนพบส่วนใหญ่โดยตรง

  • ตอนนี้มีเพียง reasoning_effort="max" เท่านั้น จึงยังปรับลดการคิดเพื่อลดค่าใช้จ่ายไม่ได้

  • การตั้งค่าการสุ่มตัวอย่างถูกล็อก ค่าอย่าง temperature, top_p และค่า penalty ต่าง ๆ ถูกล็อก จึงควรงดส่งค่าเหล่านี้แทนการจูน

  • เอาต์พุตอาจยาวและมีค่าใช้จ่ายสูง กำหนดเพดาน max_completion_tokens ตามในตัวอย่าง และตรวจสอบลูปของเอเจนต์ให้ดี

  • API ไม่รองรับ URL รูปภาพสาธารณะ จึงวางแผนใช้ base64 หรืออัปโหลดไฟล์สำหรับงานวิสัยทัศน์

ไม่มีข้อใดถึงขั้นเป็นดีลเบรกเกอร์ แต่มีผลต่อวิธีใช้งานโมเดล สิ่งที่ควรจับตาที่สุดคือค่าเอาต์พุต

บทสรุป

จากที่ลองใช้งาน มีสองอย่างที่โดดเด่น การเรียกเครื่องมือและเอาต์พุตแบบมีโครงสร้างไม่ต้องรีทราย และการแคชสำคัญกว่าที่คาด เพราะการใช้พรีฟิกซ์ยาวเดิมซ้ำทำให้คำขอขนาดใหญ่ส่งซ้ำได้ในราคาถูก ดังนั้นสำหรับการวิเคราะห์ระดับรีโพซิทอรี การเรียกบริบทยาวซ้ำ ๆ หรือวิศวกรรมมัลติโหมด K3 เป็นค่าเริ่มต้นที่สมเหตุสมผล; สำหรับแชตรวดเร็วราคาต่ำหรือควบคุมการสุ่มตัวอย่างอย่างแม่นยำ โมเดลที่เล็กกว่าจะง่ายกว่า รายละเอียดน้ำหนักเปิดและสัญญาอนุญาตที่กล่าวไว้ก่อนหน้า ควรชัดเจนขึ้นหลังการปล่อยวันที่ 27 กรกฎาคม

สำหรับพื้นหลังเพิ่มเติมเกี่ยวกับแพตเทิร์นที่ตัวอย่างเหล่านี้ใช้ ดูคอร์ส Developing AI Systems with the OpenAI API ของเรา ซึ่งครอบคลุมการเรียกฟังก์ชันและการเชื่อมโมเดลเข้ากับเครื่องมือภายนอกใน Python

หัวข้อ

เรียนรู้กับ DataCamp

Tracks

วิศวกร AI ระดับ Associate สำหรับนักพัฒนา

26 ชม.
เรียนรู้วิธีผสาน AI เข้ากับแอปพลิเคชันซอฟต์แวร์โดยใช้ API และไลบรารีโอเพนซอร์ส เริ่มต้นเส้นทางสู่การเป็น AI Engineer ของคุณวันนี้!
ดูรายละเอียดRight Arrow
เริ่มหลักสูตร

Tracks

AI สำหรับวิศวกรรมซอฟต์แวร์

7 ชม.
เขียนโค้ดและสร้างแอปพลิเคชันซอฟต์แวร์ได้เร็วขึ้นกว่าที่เคยด้วยเครื่องมือสำหรับนักพัฒนา AI ล่าสุด รวมถึง GitHub Copilot, Windsurf และ Replit.
ดูเพิ่มเติมRight Arrow