Function calling กับ Gemini 3.8 Flash: call_id, iterative tool loops และวิธีทดสอบ

การเรียกใช้ฟังก์ชันของ Gemini 3.8 Flash ทีละขั้นตอน: ประกาศเครื่องมือ, อ่านขั้นตอน function_call, ส่งคืน function_result พร้อม call_id และชื่อ, จำกัดลูป, ทดสอบ

Ashley Goolam

Ashley Goolam

3 September 2026

Function calling กับ Gemini 3.8 Flash: call_id, iterative tool loops และวิธีทดสอบ

Apidog สำหรับองค์กร

การติดตั้งแบบ On-Premises

SSO & RBAC

รองรับมาตรฐาน SOC 2

สำรวจ Apidog Enterprise

Gemini 3.8 Flash เปิดตัวเมื่อวันที่ 2 กันยายน 2026 และ Google สร้างขึ้นเพื่อ "เรียกใช้เครื่องมือซ้ำๆ": ในงานที่ยาก มันจะทำการเรียก, ตรวจสอบผลลัพธ์, และทำการเรียกอีกครั้ง แทนที่จะคาดเดาทุกอย่างในครั้งเดียว นี่เป็นข่าวดีสำหรับเอเจนต์และเป็นปัญหาใหม่สำหรับใครก็ตามที่เคยปรับแต่ง Tool Loop สำหรับ 3.7 Flash รายละเอียด API สองประการสำคัญกว่าสิ่งอื่นใด ผลลัพธ์ของฟังก์ชันทุกอย่างต้องมีทั้ง call_id และ name และ Interactions API ไม่ใช่ generateContent ตอนนี้เป็นวิธีหลักในการรัน Loop

คู่มือนี้จะอธิบายขั้นตอนการทำงานแบบสองรอบบน Interactions API, แสดงรูปแบบ generateContent แบบเก่าที่คุณอาจยังคงใช้งานอยู่, อธิบายว่าทำไมโมเดลใหม่ถึงใช้รอบและโทเค็นมากขึ้นกับเครื่องมือ, และจบด้วยการตั้งค่าทดสอบที่คุณสามารถรันได้ทุกวัน: จำลองแบ็คเอนด์ของเครื่องมือ, เชื่อมโยงทั้งสองรอบ, และยืนยันว่า call_id ถูกส่งกลับไปกลับมา หากคุณต้องการภาพรวมของโมเดลก่อน, เริ่มต้นด้วย Gemini 3.8 Flash คืออะไร ชื่อฟิลด์ด้านล่างมาจาก เอกสาร Function Calling ของ Google

ทุกคำขอในที่นี้เป็น HTTP ธรรมดาพร้อม JSON ดังนั้นคุณสามารถสร้างและดีบักได้ใน Apidog ก่อนที่จะนำไปใช้ในโค้ดแอปพลิเคชัน

Function Calling บน Gemini 3.8 Flash โดยสรุป

รายการ Gemini 3.8 Flash
รหัสโมเดล gemini-3.8-flash (เสถียร, ไม่มีส่วนต่อท้ายพรีวิว)
API หลัก Interactions API (POST /v1beta/interactions); generateContent เป็นแบบเก่าแต่ยังรองรับเต็มที่
การประกาศเครื่องมือ tools: [{"type": "function", "name", "description", "parameters"}]
การเรียกของโมเดล ขั้นตอน function_call พร้อม id, name, arguments
การตอบกลับของคุณ function_result พร้อม call_id + name (จำเป็นทั้งคู่) และ previous_interaction_id
การคิด thinking_level low / medium (ค่าเริ่มต้น) / high; minimal จะคืนค่าข้อผิดพลาดในการตรวจสอบ
คะแนนการใช้เครื่องมือ Tau3-Banking 45%, +12 คะแนนเหนือ 3.7 Flash (Artificial Analysis, อิสระ)
ค่าใช้จ่ายโทเค็น ประมาณ 48k โทเค็นเอาต์พุตต่องานบนดัชนี AA, +30% เทียบกับ 3.7 Flash
ราคา $0.75 สำหรับอินพุต / $3.75 สำหรับเอาต์พุต ต่อ 1M โทเค็นจนถึง 31 ธันวาคม 2026; การคิดถูกเรียกเก็บเงินเป็นเอาต์พุต

ขั้นตอนที่ 1: ประกาศเครื่องมือ

บน Interactions API เครื่องมือคืออ็อบเจกต์แบบเรียบ: มี type เป็น function, มี name, มี description ที่โมเดลอ่านเพื่อตัดสินใจว่าจะเรียกใช้เมื่อใด และมี JSON Schema ภายใต้ parameters รักษาคำอธิบายให้เฉพาะเจาะจง "ค้นหาสถานะการจัดส่งปัจจุบันของคำสั่งซื้อด้วย ID" จะถูกเรียกใช้ในเวลาที่เหมาะสม; "order helper" จะถูกเรียกใช้แบบสุ่ม

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.8-flash",
    "input": "Where is order A1029 right now?",
    "generation_config": {"thinking_level": "low"},
    "tools": [{
      "type": "function",
      "name": "get_order_status",
      "description": "Look up the current shipping status of an order by its ID.",
      "parameters": {
        "type": "object",
        "properties": {"order_id": {"type": "string"}},
        "required": ["order_id"]
      }
    }]
  }'

สองทางเลือกในคำขอนี้เป็นสิ่งที่ตั้งใจ thinking_level เป็น low เพราะการค้นหาเดียวไม่จำเป็นต้องใช้ค่าเริ่มต้น medium; คู่มือระดับการคิด ครอบคลุมถึงเวลาที่ควรเพิ่ม และไม่มี temperature คำแนะนำของ Google Gemini 3 คือให้ใช้ค่าเริ่มต้น 1.0 เพราะการลดลงอาจทำให้เกิดการวนซ้ำ ซึ่งเป็นสิ่งสุดท้ายที่คุณต้องการใน Tool Loop

ขั้นตอนที่ 2: อ่านขั้นตอน function_call

Interactions API ไม่ได้ตอบกลับด้วยข้อความเดียว แต่จะคืนค่า id ของ Interaction เอง พร้อมด้วยรายการขั้นตอนการดำเนินการ: ความคิดของโมเดล, การเรียกเครื่องมือ, และสุดท้ายขั้นตอน model_output เมื่อโมเดลมีคำตอบ เมื่อโมเดลตัดสินใจว่าต้องการเครื่องมือของคุณ รายการจะมีขั้นตอน function_call แทน model_output:

{
  "type": "function_call",
  "id": "call_8f2d...",
  "name": "get_order_status",
  "arguments": {"order_id": "A1029"}
}

สามฟิลด์ และคุณต้องการทั้งสาม id คือ handle ที่คุณส่งกลับเป็น call_id name บอกคุณว่าฟังก์ชันใดที่จะรันและต้องส่งกลับด้วย arguments เป็น JSON ที่ถูกแยกวิเคราะห์แล้ว ดังนั้นตรวจสอบความถูกต้องตามกฎของคุณเองก่อนที่จะดำเนินการใดๆ; โมเดลจะเติมตามรูปแบบที่คุณประกาศ แต่ไม่รู้ว่า order ID ของคุณยาวห้าตัวอักษร

เก็บ id ของ Interaction จากด้านบนสุดของ Response ในเวลาเดียวกัน มันจะกลายเป็น previous_interaction_id ในรอบถัดไป

ขั้นตอนที่ 3: คืนค่าผลลัพธ์ด้วย call_id และ name

รันฟังก์ชันของคุณ แล้วส่งคำขอที่สองซึ่ง input คือ function_result ทั้ง call_id และ name เป็นสิ่งที่จำเป็นบน Gemini 3.8 Flash หากขาดสิ่งใดสิ่งหนึ่ง การเรียกจะล้มเหลว ซึ่งเป็นปัญหาที่พบบ่อยที่สุดเมื่อทีมย้าย Loop ที่เขียนขึ้นสำหรับโมเดลเก่า

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.8-flash",
    "previous_interaction_id": "<interaction id from step 2>",
    "input": [{
      "type": "function_result",
      "name": "get_order_status",
      "call_id": "call_8f2d...",
      "result": [{"type": "text", "text": "{\"status\":\"in_transit\",\"eta\":\"2026-09-05\"}"}]
    }]
  }'

result คือรายการส่วนเนื้อหา และส่วนข้อความมี JSON ของคุณเป็นสตริง เนื่องจาก previous_interaction_id ชี้ไปยังรอบก่อนหน้า เซิร์ฟเวอร์จึงเก็บ prompt ดั้งเดิม, การประกาศเครื่องมือ, และเหตุผลของโมเดลอยู่แล้ว; คุณไม่จำเป็นต้องส่งสิ่งเหล่านี้ซ้ำ การตอบกลับคือรายการขั้นตอนอีกครั้ง หากจบลงด้วย model_output คุณก็ทำเสร็จแล้ว และ SDK จะแสดงข้อความเป็น interaction.output_text หากมี function_call อีกครั้ง ให้กลับไปที่ขั้นตอนที่ 2 Loop นั้นคือรูปแบบทั้งหมด

ใน Python การทำงานคือ client.interactions.create(model="gemini-3.8-flash", input=..., ...) โดยมีฟิลด์ JSON เดียวกันเป็น keyword arguments จากนั้น create ครั้งที่สองพร้อม previous_interaction_id และรายการ function_result เป็น input วิธีใช้ Gemini 3.8 Flash API ครอบคลุมคีย์, การสตรีม, และการอ่านการใช้โทเค็น หาก endpoint นี้เป็นสิ่งใหม่สำหรับคุณ

รูปแบบ generateContent แบบเก่า

โค้ด Gemini ส่วนใหญ่ที่ใช้งานอยู่ยังคงเรียกใช้ models/gemini-3.8-flash:generateContent และ Google ระบุว่า "ยังคงรองรับเต็มที่" โดยไม่มีกำหนดการสิ้นสุด คำศัพท์ที่ใช้แตกต่างกัน; กฎยังคงเหมือนเดิม เครื่องมือถูกประกาศภายใต้ functionDeclarations โมเดลตอบกลับด้วยส่วน functionCall และคุณตอบกลับด้วยส่วน functionResponse บนรูปแบบเก่า ส่วน functionCall ของโมเดลมี id และส่วน functionResponse ของคุณต้องสะท้อนค่าเดียวกันนั้นในฟิลด์ id ของตัวเองพร้อมกับ name และ response มันคือสัญญาเดียวกันกับ call_id บน Interactions API ภายใต้ชื่อฟิลด์ที่แตกต่างกัน และคำแนะนำของ Google Gemini 3 ระบุชัดเจนว่าทั้ง ID และชื่อจำเป็นต้องมี

ความแตกต่างในทางปฏิบัติสองประการ ประการแรก generateContent เป็นแบบ stateless ดังนั้นคุณต้องดูแลการสนทนาด้วยตัวเอง: ประวัติ contents ทั้งหมดจะถูกส่งกลับในทุกๆ รอบ รวมถึงส่วน functionCall ของโมเดลและลายเซ็นความคิดใดๆ ที่มันส่งกลับ ประการที่สอง การกำหนดค่าการคิดจะอยู่ภายใต้ generationConfig.thinkingConfig.thinkingLevel แทนที่จะเป็น generation_config.thinking_level:

{"generationConfig": {"thinkingConfig": {"thinkingLevel": "low"}}}

โทเค็นการคิดจะปรากฏเป็น usageMetadata.thoughtsTokenCount ในการตอบกลับและถูกเรียกเก็บเงินเป็นเอาต์พุต หากคุณกำลังเลือกระหว่างสอง API สำหรับโปรเจกต์ใหม่ ให้เลือก Interactions: สถานะฝั่งเซิร์ฟเวอร์ช่วยขจัดข้อผิดพลาดที่ประวัติที่ถูกส่งซ้ำขาดลายเซ็นหรือ call_id

ทำไม 3.8 Flash จึงเรียกใช้เครื่องมือซ้ำๆ และวิธีจำกัด Loop

โพสต์เปิดตัวของ Google ระบุว่าโมเดล "ทำงานหนักขึ้น": ในงานที่ซับซ้อน "มันจะดำเนินการขั้นตอนการให้เหตุผลเพิ่มเติม และเรียกใช้เครื่องมือซ้ำๆ" โดยใช้ "ขั้นตอนการให้เหตุผลที่เล็กลง" และตรวจสอบงานของมันไปพร้อมกัน Google ยังระบุว่า "สามารถใช้โทเค็นมากขึ้นในงานที่ใช้เวลานานและซับซ้อนขึ้น ตามการออกแบบ" Artificial Analysis ได้วัดผลกระทบ: ประมาณ 48k โทเค็นเอาต์พุตต่องานบนดัชนีของพวกเขา เพิ่มขึ้น 30% จาก 3.7 Flash และมีค่าใช้จ่ายต่องานอยู่ที่ $0.58 ที่ระดับ high เทียบกับ $0.40 สำหรับ 3.7 Flash ที่ราคาต่อโทเค็นเท่ากัน ระดับ Medium อยู่ที่ $0.41 และระดับ low อยู่ที่ $0.24

สำหรับ Tool Loop นี่หมายถึงขั้นตอน function_call ที่มากขึ้นต่องาน ข้อดีคือจริง: Tau3-Banking ซึ่งเป็นการประเมินการใช้เครื่องมือของ AA เพิ่มขึ้น 12 จุดเป็น 45% ข้อเสียคือ Loop ที่ไม่มีขีดจำกัดจะทำงานนานขึ้นกว่าเมื่อเดือนสิงหาคม การควบคุมสี่ประการตามลำดับที่จะใช้:

หากงบประมาณของคุณไม่สามารถรองรับจำนวนรอบที่เพิ่มขึ้นได้ คู่มือการย้ายข้อมูลจาก 3.7 ไป 3.8 Flash ครอบคลุมการรักษา 3.7 Flash ซึ่งยังคงรองรับเต็มที่ ไว้ภายใต้ config flag

Thought Signatures, Parallel Calls และ Structured Outputs

Thought signatures. โมเดล Gemini 3 จะแนบลายเซ็นเข้ากับเหตุผลของมัน ด้วยกระบวนการ Interactions ที่เก็บข้อมูลตามค่าเริ่มต้น previous_interaction_id จะจัดการให้คุณ หากคุณตั้งค่า store: false สำหรับการตั้งค่าแบบ stateless หรือคุณใช้ generateContent คุณต้องส่งบล็อกความคิดและลายเซ็นกลับไปตามที่ได้รับเป๊ะๆ ในทุกประเภทส่วน อย่าตัด, จัดเรียงใหม่, หรือสร้าง serialized ใหม่; ลายเซ็นเป็นสิ่งที่ไม่โปร่งใสและการแก้ไขใดๆ จะทำให้มันไม่ถูกต้อง เอกสาร Interactions API ของ Google ครอบคลุมการแลกเปลี่ยนระหว่างแบบเก็บข้อมูลกับแบบ stateless

Parallel calls. การตอบกลับเป็นรายการ ดังนั้นจึงสามารถมีขั้นตอน function_call ได้มากกว่าหนึ่งรายการเมื่อโมเดลต้องการการค้นหาอิสระหลายอย่างพร้อมกัน เอกสาร function calling ของ Google ยืนยันว่าโมเดล Gemini 3 จะคืนค่า ID ที่ไม่ซ้ำกันพร้อมกับการเรียกแต่ละครั้ง เพื่อให้ผลลัพธ์สามารถกลับมาในลำดับใดก็ได้ จัดการโดยการคืนค่า function_result หนึ่งรายการต่อการเรียกในอาร์เรย์ input เดียวกัน โดยแต่ละรายการจับคู่กับ call_id ของตัวเอง การจับคู่ด้วย name เพียงอย่างเดียวไม่เพียงพอ; การเรียกสองครั้งไปยังฟังก์ชันเดียวกันต้องใช้ค่า call_id ที่แตกต่างกันสองค่า

Structured outputs. 3.8 Flash รองรับ structured outputs และ function calling บนโมเดลเดียวกัน รูปแบบที่ชัดเจนคือเครื่องมือสำหรับ loop และ JSON schema สำหรับคำตอบสุดท้าย เพื่อให้ model_output ที่ปิด loop สามารถอ่านได้ด้วยเครื่องจักรแทนที่จะเป็นข้อความ เอกสาร function-calling และ structured-output ของ Google ได้บันทึกการกำหนดค่านี้ไว้ อย่าปลอมแปลงด้วยการประกาศเครื่องมือ dummy และอ่าน arguments ของมัน; นั่นจะทำให้เกิดข้อผิดพลาดทันทีที่โมเดลตัดสินใจว่าไม่มีอะไรจะเรียก

ทุกสิ่งข้างต้นสมมติว่าโมเดลเข้าถึงระบบของคุณผ่านฟังก์ชันที่ประกาศไว้ Google ยังแสดงรายการ Computer use (Preview) สำหรับ 3.8 Flash; สำหรับกรณีที่ API แบบโครงสร้างดีกว่าการควบคุมเอเจนต์ผ่านหน้าจอ ดูที่ computer use vs structured APIs

การทดสอบ Tool Loop ใน Apidog

Tool Loop มีสามจุดที่จะเกิดข้อผิดพลาดได้แก่: การประกาศ, การส่ง ID ไปกลับ, และคำตอบสุดท้าย คุณสามารถครอบคลุมทั้งสามสิ่งใน Apidog โดยไม่ต้องแตะแบ็คเอนด์จริงของคุณ

1. จำลองแบ็คเอนด์ของเครื่องมือ กำหนด GET /orders/{order_id} เป็น endpoint และเปิด mock server ของมัน กำหนดให้มีการตอบกลับแบบตายตัว {"status": "in_transit", "eta": "2026-09-05"} เพื่อให้ทุกการรันได้รับอินพุตที่เหมือนกัน และการเปลี่ยนแปลงใดๆ ในคำตอบสุดท้ายของโมเดลเกิดจากการทำงานของโมเดล ไม่ใช่ฐานข้อมูลของคุณ ระบบของคุณจะชี้ไปที่ mock URL ในสภาพแวดล้อมการทดสอบและไปยังบริการจริงในการผลิต

2. เชื่อมโยงสองรอบในสถานการณ์ทดสอบ จัดเก็บ GEMINI_API_KEY เป็นตัวแปรสภาพแวดล้อมและอ้างอิงเป็น {{GEMINI_API_KEY}} ในเฮดเดอร์ x-goog-api-key จากนั้นสร้างสถานการณ์ที่มีสามขั้นตอน:

3. ยืนยันสิ่งที่สำคัญ

กำหนดเวลาให้สถานการณ์นี้รันทุกวัน พฤติกรรมของโมเดลอาจเปลี่ยนแปลงไปกับการอัปเดตแบบเงียบๆ และ loop ที่เคยปิดได้ในหนึ่งรอบเมื่อสัปดาห์ที่แล้วอาจเริ่มต้องการสองรอบ คู่มือการทดสอบ AI Agent API จะเจาะลึกเกี่ยวกับการยืนยันหลายขั้นตอน และคุณสามารถ ดาวน์โหลด Apidog เพื่อสร้างสถานการณ์นี้กับ free tier ก่อนที่คุณจะใช้จ่ายแม้แต่สตางค์เดียว

คำถามที่พบบ่อย

จำเป็นต้องมี call_id บน Gemini 3.8 Flash หรือไม่? ใช่ บน Interactions API ทุก function_result ต้องการ call_id และ name; บน generateContent ทุก functionResponse ต้องการ id และ name ของการเรียก โค้ดเก่าที่ส่งเพียงชื่อจะล้มเหลวบนโมเดล Gemini 3

ทำไม Tool Loop ของฉันถึงทำงานหลายรอบบน 3.8 Flash มากกว่า 3.7? เป็นการออกแบบ Google ระบุว่าโมเดล "เรียกใช้เครื่องมือซ้ำๆ" และ "สามารถใช้โทเค็นมากขึ้นในงานที่ใช้เวลานานและซับซ้อนขึ้น" จำกัดจำนวนรอบในระบบของคุณและลด thinking_level; คู่มือระดับการคิด มีค่าใช้จ่ายที่วัดได้ในแต่ละระดับ

ฉันยังสามารถใช้ generateContent สำหรับ function calling ได้หรือไม่? ใช่ Google เรียกมันว่าเป็นแบบเก่าแต่ระบุว่า "ยังคงรองรับเต็มที่" โดยไม่มีกำหนดการสิ้นสุด คุณต้องดูแลประวัติด้วยตัวเอง รวมถึงลายเซ็นความคิด และ call id (สะกด id บน API นี้) พร้อมกับ name ยังคงใช้ได้

thinking_level "minimal" ทำงานกับเครื่องมือได้หรือไม่? ไม่ มันจะคืนค่าข้อผิดพลาดในการตรวจสอบบน 3.8 Flash ใช้ low

งานที่ใช้เครื่องมือหนักๆ มีค่าใช้จ่ายเท่าไหร่? ราคาต่อโทเค็นคือ $0.75 อินพุตและ $3.75 เอาต์พุตต่อ 1M โทเค็นจนถึง 31 ธันวาคม 2026 โดยการคิดถูกเรียกเก็บเงินเป็นเอาต์พุต Artificial Analysis วัดได้ $0.58 ต่องานที่ระดับ high, $0.41 ที่ระดับ medium, และ $0.24 ที่ระดับ low บนดัชนีของพวกเขา งานของคุณจะแตกต่างกัน ดังนั้นให้ยืนยันจำนวนโทเค็นและวัดผล

นำ Loop ออกใช้พร้อมกับการจำกัด

ประกาศเครื่องมือ, อ่านขั้นตอน function_call, และคืนค่า function_result พร้อมทั้ง call_id และ name ภายใต้ previous_interaction_id นี่คือสัญญาฉบับสมบูรณ์ สิ่งที่เปลี่ยนแปลงกับ Gemini 3.8 Flash คือความเต็มใจของโมเดลที่จะทำงานวนซ้ำ ดังนั้นระบบจึงจำเป็นต้องมีขีดจำกัดจำนวนรอบ, thinking_level ต่อเส้นทาง, และการหมดเวลาก่อนที่จะนำไปใช้จริง จำลองแบ็คเอนด์, เชื่อมโยงสองรอบ, ยืนยันว่า ID ถูกส่งกลับไปกลับมา, และกำหนดเวลารัน หน้า What’s new in Gemini 3.8 Flash ของ Google มีบันทึกการย้ายข้อมูล; คู่มือหลัก มีทุกสิ่งทุกอย่างเกี่ยวกับโมเดล

ฝึกการออกแบบ API แบบ Design-first ใน Apidog

ค้นพบวิธีที่ง่ายขึ้นในการสร้างและใช้ API