คำตอบสั้น
tool calling บน LLMwithCrypto ทำงานอย่างไร?
ส่งฟังก์ชันของคุณใน tools ในรูปแบบ OpenAI เมื่อโมเดลต้องการเรียกฟังก์ชัน LLMwithCrypto จะคืนค่า finish_reason: "tool_calls" พร้อมชื่อฟังก์ชันและอาร์กิวเมนต์แบบ JSON โค้ดของคุณรันฟังก์ชันนั้นแล้วส่งผลลัพธ์กลับเป็นข้อความ tool สำหรับคำตอบแบบมีโครงสร้าง response_format: {"type": "json_object"} จะขอ JSON ที่ถูกต้อง ทั้งสองทำงานบนโมเดลที่รองรับ ตามเอกสาร ณ วันที่ 23 ตุลาคม 2026
โมเดลใดรองรับ tools และ JSON?
Streaming ใช้ได้กับทุกโมเดล; tool calling และ JSON output ขึ้นอยู่กับสิ่งที่แต่ละโมเดลรองรับเอง
ทดสอบสคีมาของคุณเองบนโมเดลที่คุณวางแผนจะใช้ก่อนที่จะพึ่งพามัน โมเดลที่ไม่รองรับ tools จะตอบเป็นข้อความธรรมดาแทนการเรียกฟังก์ชัน ส่วนโมเดลที่ไม่รองรับโหมด JSON จะคืนค่าข้อผิดพลาด 400 สำหรับ response_format
ลูปคืออะไร?
อธิบายฟังก์ชัน
แต่ละ tool มี
name,descriptionที่โมเดลอ่านเพื่อตัดสินใจว่าเมื่อใดควรใช้ และparametersเป็น JSON Schemaส่งบทสนทนาพร้อม tools
โมเดลจะตอบเป็นข้อความ หรือหยุดด้วย
finish_reason: "tool_calls"พร้อมการเรียกหนึ่งครั้งหรือมากกว่าในmessage.tool_callsรันแต่ละการเรียก
แปลง
function.arguments(สตริง JSON) รันฟังก์ชันของคุณ และอย่าเชื่ออาร์กิวเมนต์โดยไม่ตรวจสอบ: ตรวจสอบให้เหมือนกับอินพุตของผู้ใช้ทั่วไปส่งผลลัพธ์กลับ
ต่อท้ายข้อความของ assistant แล้วเพิ่มข้อความ
toolหนึ่งข้อความต่อการเรียกหนึ่งครั้ง พร้อมtool_call_idและผลลัพธ์เป็นข้อความ เรียก API อีกครั้ง ทำซ้ำจนกว่าโมเดลจะตอบเป็นข้อความ
import json
import os
from openai import OpenAI
client = OpenAI(
base_url="https://llmwithcrypto.com/api/v1",
api_key=os.environ["LLMWITHCRYPTO_API_KEY"],
)
tools = [
{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Return the delivery status of an order.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
},
}
]
def get_order_status(order_id):
return {"order_id": order_id, "status": "shipped", "eta": "2026-10-25"}
messages = [{"role": "user", "content": "Where is my order A-1042?"}]
while True:
resp = client.chat.completions.create(model="gpt-oss-120b", messages=messages, tools=tools, max_tokens=300)
msg = resp.choices[0].message
if not msg.tool_calls:
print(msg.content)
break
messages.append(msg)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = get_order_status(**args)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
การเรียก tool ในคำตอบมีหน้าตาอย่างไร?
ข้อความของ assistant ไม่มีข้อความ มีอาร์เรย์ tool_calls และตัวเลือกสิ้นสุดด้วย finish_reason: "tool_calls" อาร์กิวเมนต์มาเป็นสตริง JSON ไม่ใช่ออบเจกต์ id และจำนวนด้านล่างเป็นเพียงตัวอย่าง
{
"id": "chatcmpl-3c9d27e1",
"object": "chat.completion",
"created": 1792742400,
"model": "gpt-oss-120b",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_7f31",
"type": "function",
"function": {
"name": "get_order_status",
"arguments": "{\"order_id\": \"A-1042\"}"
}
}
]
},
"finish_reason": "tool_calls"
}
],
"usage": {
"prompt_tokens": 118,
"completion_tokens": 22,
"total_tokens": 140
}
}
ฉันควบคุมเวลาใช้ tools ได้อย่างไร?
"tool_choice": "auto"(ค่าเริ่มต้นเมื่อตั้งtools): โมเดลเป็นผู้ตัดสินใจ"tool_choice": "none": โมเดลตอบเป็นข้อความแม้จะมี tools ระบุไว้"tool_choice": "required": โมเดลต้องเรียก tool อย่างน้อยหนึ่งตัว{"type": "function", "function": {"name": "get_order_status"}}: โมเดลต้องเรียก tool ตัวนั้นตัวเดียว
คำจำกัดความของ tool ทุกตัวถูกส่งเป็นอินพุตในทุกการเรียก ดังนั้นคำอธิบายที่ยาวและ tools จำนวนมากจะเพิ่มจำนวนโทเค็นอินพุต เก็บคำอธิบายให้สั้นและส่งเฉพาะ tools ที่ขั้นตอนนั้นต้องการ
ฉันจะได้ JSON ที่ถูกต้องกลับมาได้อย่างไร?
ตั้ง response_format เป็น {"type": "json_object"} และอธิบายคีย์ที่คาดหวังใน system message: โหมด JSON รับประกันว่าคำตอบแปลงค่าได้ ไม่ได้รับประกันว่าจะมีคีย์ที่คุณต้องการ ตั้ง temperature ให้ต่ำเพื่อผลลัพธ์ที่เสถียร และตรวจสอบออบเจกต์ที่แปลงแล้วในโค้ดก่อนใช้งาน
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://llmwithcrypto.com/api/v1',
apiKey: process.env.LLMWITHCRYPTO_API_KEY,
});
const resp = await client.chat.completions.create({
model: 'gpt-oss-120b',
messages: [
{ role: 'system', content: 'Reply with a JSON object {"sentiment": "positive" | "negative" | "neutral", "reason": string}.' },
{ role: 'user', content: 'The delivery was late but support fixed it in an hour.' },
],
response_format: { type: 'json_object' },
temperature: 0.2,
max_tokens: 150,
});
const result = JSON.parse(resp.choices[0].message.content);
console.log(result.sentiment, '-', result.reason);
Tools และ JSON: คำถามที่พบบ่อย
การเรียก tool มีค่าใช้จ่ายเพิ่มหรือไม่?
ไม่มีค่าธรรมเนียมของตัวเอง คำจำกัดความของ tool การเรียก และผลลัพธ์ที่คุณส่งกลับ ล้วนเป็นโทเค็นที่คิดค่าบริการเหมือนโทเค็นอื่นๆ คุณจ่ายต่อ token จากยอดคงเหลือ: input และ output tokens ถูกนับด้วย tokenizer ของโมเดลนั้นเองและคิดตามราคาของโมเดลนั้นต่อ 1M tokens การเรียกที่จบด้วย error ไม่มีค่าใช้จ่าย
โมเดลเรียกหลาย tools พร้อมกันได้หรือไม่?
โมเดลบางตัวคืนค่ามากกว่าหนึ่งการเรียกใน tool_calls รันทั้งหมดและส่งข้อความ tool หนึ่งข้อความต่อการเรียกหนึ่งครั้งก่อนคำขอถัดไป
API รันฟังก์ชันของฉันหรือไม่?
ไม่ โมเดลเพียงระบุว่าจะเรียกฟังก์ชันใดและด้วยอาร์กิวเมนต์ใด โค้ดของคุณเป็นตัวรัน ไม่มีสิ่งใดถูกเรียกใช้ฝั่งเรา และไม่มีสิ่งใดจากการแลกเปลี่ยนถูกจัดเก็บ: เราไม่เก็บ prompts ของคุณหรือคำตอบของโมเดล: เมื่อส่งคำตอบแล้ว ข้อความนั้นก็หายไป แต่ละครั้งที่เรียกจะเหลือ log หนึ่งบรรทัดซึ่งมีเวลา บัญชี โมเดล และจำนวน token แล้วลบออกหลัง 30 วัน