🎯 ภารกิจ — สายนักพัฒนา: API และ Claude Code

ลงมือทำจริงใน Claude หรือ Gemini แล้วติ๊กรายการที่ทำได้ครบ ภารกิจที่มีป้าย “บังคับ” ต้องผ่านทุกข้อจึงจะเลื่อนระดับ

ภารกิจบังคับ 0/4

  1. เรียก API ครั้งแรกพร้อมบันทึกค่าใช้จ่าย

    บังคับ

    สิ่งที่ต้องทำ

    ตั้ง ANTHROPIC_API_KEY เป็น env var แล้วเขียนสคริปต์ที่ถามคำถาม 3 ข้อ เก็บ token และค่าใช้จ่ายโดยประมาณของแต่ละครั้งลงไฟล์ cost_log.csv ลองเปลี่ยน effort เป็น low กับ high แล้วเทียบ token และคุณภาพคำตอบ

    prompt เริ่มต้น

    ลองในClaude ↗
    import csv, datetime
    import anthropic
    
    MODEL = "claude-opus-5-5"
    PRICE_IN, PRICE_OUT = 4.00, 20.00  # USD ต่อ 1M token (ตรวจราคาล่าสุดในหน้า pricing)
    QUESTIONS = [
        "สรุปข้อดีข้อเสียของการผ่อนรถ 48 งวดกับ 60 งวด สั้นๆ",
        "เขียนข้อความแจ้งลูกค้าว่าระบบชำระเงินปิดปรับปรุงคืนนี้ 2 บรรทัด",
        "อธิบาย prompt caching ให้เด็กมัธยมเข้าใจใน 3 บรรทัด",
    ]
    
    client = anthropic.Anthropic()
    with open("cost_log.csv", "a", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        for effort in ["low", "high"]:
            for q in QUESTIONS:
                r = client.messages.create(
                    model=MODEL, max_tokens=4096,
                    messages=[{"role": "user", "content": q}],
                    output_config={"effort": effort},
                )
                cost = r.usage.input_tokens / 1e6 * PRICE_IN + r.usage.output_tokens / 1e6 * PRICE_OUT
                writer.writerow([datetime.datetime.now().isoformat(), MODEL, effort, r.stop_reason,
                                 r.usage.input_tokens, r.usage.output_tokens, f"{cost:.6f}"])
                print(effort, r.stop_reason, f"${cost:.5f}", q[:30])

    เช็กลิสต์

  2. แปลงอีเมลซัพพอร์ตเป็น JSON ที่ผ่าน Pydantic

    บังคับ

    สิ่งที่ต้องทำ

    ใช้สคริปต์ทดลอง A บท 02 เป็นฐาน แยก support-emails.txt เป็น tickets.json เพิ่มการตรวจค่าด้วยโค้ดเอง (เลขออเดอร์ต้องเป็นตัวอักษร 1 ตัว + เลข 4 หลัก หรือ null) แล้วตรวจผลเทียบกับอีเมลต้นฉบับด้วยตาทีละฉบับ

    prompt เริ่มต้น

    ลองในClaude ↗
    import json, re
    # ... วาง class Ticket, TicketList และโค้ดเรียก client.messages.parse จากทดลอง A บท 02 ไว้ตรงนี้ ...
    
    tickets = response.parsed_output.tickets
    problems = [t for t in tickets if t.order_id and not re.fullmatch(r"[A-Z]\d{4}", t.order_id)]
    print("จำนวน ticket:", len(tickets), "| เลขออเดอร์ผิดรูปแบบ:", len(problems))
    with open("tickets.json", "w", encoding="utf-8") as f:
        json.dump([t.model_dump() for t in tickets], f, ensure_ascii=False, indent=2)

    เช็กลิสต์

  3. สคริปต์ใช้เครื่องมือเรียก API สาธารณะจริง

    บังคับ

    สิ่งที่ต้องทำ

    สร้างผู้ช่วยตอบเรื่องอากาศที่เรียกบริการพยากรณ์อากาศจริง (Open-Meteo ไม่ต้องใช้คีย์) ผ่าน Tool Runner ตรวจ input ทุกครั้ง ใส่ timeout และจัดการ error แล้วถามคำถามที่ต้องเรียกเครื่องมือมากกว่า 1 ครั้ง

    prompt เริ่มต้น

    ลองในClaude ↗
    import anthropic
    import requests
    from anthropic import beta_tool
    
    CITIES = {"กรุงเทพ": (13.75, 100.50), "เชียงใหม่": (18.79, 98.98), "ภูเก็ต": (7.88, 98.39)}
    
    @beta_tool
    def get_weather(city: str) -> str:
        """ดูอุณหภูมิและความชื้นปัจจุบันของเมืองในไทย
    
        Args:
            city: ชื่อเมือง ต้องเป็นหนึ่งใน กรุงเทพ, เชียงใหม่, ภูเก็ต
        """
        if city not in CITIES:  # whitelist ไม่ให้ AI ส่งค่าอะไรก็ได้
            return f"ไม่รองรับเมือง {city} รองรับเฉพาะ {', '.join(CITIES)}"
        lat, lon = CITIES[city]
        try:
            r = requests.get(
                "https://api.open-meteo.com/v1/forecast",
                params={"latitude": lat, "longitude": lon, "current": "temperature_2m,relative_humidity_2m"},
                timeout=10,
            )
            r.raise_for_status()
            cur = r.json()["current"]
            return f"{city}: {cur['temperature_2m']}°C ความชื้น {cur['relative_humidity_2m']}%"
        except (requests.RequestException, KeyError) as e:
            return f"เรียกบริการอากาศไม่สำเร็จ: {e}"
    
    client = anthropic.Anthropic()
    runner = client.beta.messages.tool_runner(
        model="claude-opus-5-5",
        max_tokens=16000,
        tools=[get_weather],
        messages=[{"role": "user", "content": "ตอนนี้เชียงใหม่กับภูเก็ตที่ไหนร้อนกว่ากัน ควรพกร่มไหม"}],
    )
    for message in runner:
        for block in message.content:
            if block.type == "tool_use":
                print("→ เรียก", block.name, block.input)
            elif block.type == "text":
                print(block.text)

    เช็กลิสต์

  4. ส่งฟีเจอร์เล็กๆ ในโปรเจกต์ตัวเองด้วย Claude Code

    บังคับ

    สิ่งที่ต้องทำ

    ใน repo ของคุณเอง: สร้าง branch ใหม่, เขียน CLAUDE.md (เริ่มจาก /init แล้วตัดให้สั้น), ตั้ง deny rule กันอ่าน .env, แล้วใช้ plan mode ทำฟีเจอร์หรือแก้บั๊กเล็กๆ 1 อย่างจนเทสต์ผ่าน

    prompt เริ่มต้น

    ลองในClaude ↗
    ฉันต้องการ [อธิบายฟีเจอร์/บั๊ก 1-2 ประโยค]
    ไฟล์ที่น่าจะเกี่ยว: [path หรือ "ไม่แน่ใจ ช่วยหา"]
    เสร็จแล้วต้อง: [เช่น npm test ผ่าน และหน้า /about แสดงปุ่มใหม่]
    ห้ามแตะ: [เช่น ไฟล์ migration, .env, ระบบชำระเงิน]
    สำรวจโค้ดก่อน แล้วเสนอแผนเป็นข้อๆ (ไฟล์ที่จะแก้ เทสต์ที่จะเพิ่ม ความเสี่ยง) รอฉันอนุมัติก่อนแก้

    เช็กลิสต์

  5. ย้ายงานหนึ่งไปลอง Gemini API แล้วเทียบผล

    โบนัส

    สิ่งที่ต้องทำ

    ใช้ wrapper ask() จากบท 05 หรือทดลอง A บท 05 รันงานแยกอีเมลกับทั้ง Claude และ Gemini ด้วย schema Pydantic เดียวกัน แล้วทำตารางเทียบ

    prompt เริ่มต้น

    ลองในClaude ↗Gemini ↗
    | เกณฑ์ | Claude | Gemini |
    |---|---|---|
    | จัดหมวดถูก (จาก 9 ฉบับ) | | |
    | จับอีเมลแฝงคำสั่งได้ไหม | | |
    | ผ่าน Pydantic ครั้งแรกไหม | | |
    | เวลาที่ใช้ (วินาที) | | |
    | token / ค่าใช้จ่ายโดยประมาณ | | |
    | ความยากในการเขียนโค้ด | | |
    สรุป: งานนี้ควรใช้ [ค่าย/รุ่น] เพราะ [เหตุผลจากตัวเลขข้างบน]

    เช็กลิสต์