सीधे सामग्री पर जाएँ

फ़ंक्शन कॉलिंग

LLM को 299 एंडपॉइंट के लिए 299 टूल दे देना सबसे सीधा तरीक़ा लगता है, पर यही गलत है। यहाँ वह ढाँचा है जो काम करता है, और वे चार गलतियाँ जिनसे बचकर डिज़ाइन करना चाहिए।

299 टूल मत बनाइए

टूल की सूची जितनी लंबी होती है, हर बड़े प्रदाता का मॉडल उतना कमज़ोर पड़ता है। बातचीत शुरू होने से पहले ही स्कीमा संदर्भ की जगह भर देते हैं, और जब कई टूल के विवरण मिलते-जुलते हों तो सही टूल चुनने की सटीकता गिर जाती है। 299 एंडपॉइंट में से ज़्यादातर एक जैसे चार फ़ील्ड लेते हैं। ऐसे में आप हर बार हज़ारों टोकन खर्च करके मॉडल को चुनने में और खराब बना रहे होंगे।

एक टूल बनाइए, या दो। मॉडल सैकड़ों स्कीमा में से चुनने के बजाय रूट को एक आर्ग्युमेंट के रूप में भरता है।

एक टूल वाला ढाँचा

टूल की परिभाषा
{
  "name": "occult_api",
  "description":
    "Vedic astrology calculations from the Occult API. Call this for anything involving a birth chart, panchanga, dasha, muhurta, matching or numerology. Do not compute astrology yourself - planetary positions require an ephemeris and cannot be derived from a date.",
  "input_schema": {
    "type": "object",
    "properties": {
      "route": {
        "type": "string",
        "description": "Endpoint path, e.g. /api/astro/panchanga/. Use the catalogue at https://occultapi.com/llms.txt to choose one."
      },
      "body": {
        "type": "object",
        "description": "Request body. Always include date_time (ISO 8601 with offset), latitude, longitude, timezone_as_float. Batch calculations with a keys array where the endpoint supports it."
      }
    },
    "required": ["route", "body"]
  }
}

विवरण दो काम करता है। वह बताता है कि टूल कब इस्तेमाल करना है, और यह भी कि गणना ख़ुद नहीं करनी है। यह जितना लगता है उससे ज़्यादा ज़रूरी है। नक्षत्र पूछे जाने पर मॉडल अपने ट्रेनिंग डेटा से सच जैसा दिखने वाला कोई भी नक्षत्र बता देगा, अगर उसे कोई न बताए कि ग्रहों की स्थिति के लिए एफ़ेमेरिस चाहिए।

हैंडलर

node
async function occultApi({ route, body }) {
  const response = await fetch(`${process.env.OCCULT_API_BASE}${route}`, {
    method: "POST",
    headers: {
      "X-API-Key": process.env.OCCULT_API_KEY,   // server-side only
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
  });

  const payload = await response.json();

  // 402 means out of credits. It is NOT transient - retrying spends nothing
  // and fixes nothing, so surface it rather than backing off.
  if (response.status === 402) {
    return { error: "insufficient_credits", retryable: false };
  }

  // The envelope is the same on every endpoint: branch on is_error, and hand
  // the model the message rather than a stack trace it cannot act on.
  if (payload.is_error) {
    return { error: payload.message, retryable: false };
  }

  return payload.data;
}

इसे अपने हिसाब से बदलते समय इसकी तीन बातें बनाए रखिए। कुंजी सर्वर पर पढ़ी जाती है: ब्राउज़र के कोड में रखी कुंजी अब कोई और खर्च कर रहा होगा। 402 पर दोबारा कोशिश नहीं होती: इसका मतलब है कि बैलेंस ख़ाली है, इसलिए रुक-रुककर कोशिश करने वाला लूप सिर्फ़ समय बर्बाद करता है, कुछ ठीक नहीं करता। त्रुटि का संदेश आगे भेजा जाता है: API बताता है कि कौन-सा फ़ील्ड गलत था, और यह जानकर मॉडल अगली बार अपना अनुरोध ख़ुद ठीक कर लेता है।

दो टूल वाला ढाँचा, जब मॉडल को खोजना पड़े

अगर आपके उपयोगकर्ता खुले सवाल पूछते हैं, तो मॉडल को पता नहीं होगा कि कौन-सा रूट चाहिए। उसे एक खोज वाला टूल भी दीजिए। खोजने में कोई क्रेडिट नहीं लगता, इसलिए खोजबीन मुफ़्त है और बिल सिर्फ़ जवाब का बनता है।

टूल की परिभाषाएँ
[
  {
    "name": "occult_search",
    "description": "Find the right Occult API endpoint by name or by what it calculates, e.g. 'manglik' or 'sunrise'. Returns routes and their request fields. Costs nothing.",
    "input_schema": {
      "type": "object",
      "properties": { "query": { "type": "string" } },
      "required": ["query"]
    }
  },
  {
    "name": "occult_call",
    "description": "Call an Occult API endpoint found with occult_search. One credit per successful call (the PDF reports and chat cost 25); failures are free.",
    "input_schema": {
      "type": "object",
      "properties": {
        "route": { "type": "string" },
        "body": { "type": "object" }
      },
      "required": ["route", "body"]
    }
  }
]

occult_search को /llms.txt या ज़्यादा विस्तृत /llms-full.txt से जोड़िए। दोनों इसी काम के लिए बने हैं। अगर आपका फ़्रेमवर्क स्पेक से टूल बनाता है, तो OpenAPI 3.1 स्पेक भी मौजूद है।

चार गलतियाँ, जिनसे बचकर डिज़ाइन करें

  • हर गणना के लिए अलग कॉल। ज़्यादातर एंडपॉइंट keys सूची लेते हैं और एक अनुरोध में, एक क्रेडिट में, कई गणनाएँ कर देते हैं। मॉडल को अपने हाल पर छोड़ें, तो वह चार बार कॉल करके चार क्रेडिट खर्च करेगा। टूल के विवरण में यह साफ़ लिख दीजिए।
  • 402 पर दोबारा कोशिश। यह बैलेंस की समस्या है, नेटवर्क की नहीं। हैंडलर में इसे दोबारा कोशिश न करने लायक चिह्नित कीजिए, क्योंकि सिर्फ़ स्टेटस कोड से मॉडल यह फ़र्क़ नहीं समझ सकता।
  • कुंजी का क्लाइंट तक पहुँचना। टूल आपके सर्वर पर चलने चाहिए। मॉडल को कुंजी देखने की कभी ज़रूरत नहीं। जिस डिज़ाइन में वह कुंजी देख सकता है, वहाँ एक प्रॉम्प्ट इंजेक्शन से कुंजी लीक हो सकती है।
  • मनगढ़ंत फ़ील्ड नाम। मॉडल date या lat जैसे नाम अंदाज़े से लिखते हैं। असली फ़ील्ड हैं date_time, latitude, longitude और timezone_as_float। इन्हें विवरण में ही लिख दीजिए, ताकि मॉडल को 400 खाकर न सीखना पड़े।

असली कॉल कैसी दिखती है

curl
curl -X POST https://api.occultapi.com/api/astro/panchanga/ \
  -H 'X-API-Key: yt_live_your_key_here' \
  -H 'Content-Type: application/json' \
  -d '{
    "date_time": "2026-09-17T06:00:00+05:30",
    "latitude": 26.9124,
    "longitude": 75.7873,
    "timezone_as_float": 5.5,
    "keys": ["tithi", "nakshatra_segments", "yogam", "karana"]
  }'

चार गणनाएँ, एक क्रेडिट। उत्तर में X-Credits-Charged और X-Credits-Remaining हेडर आते हैं। अपने UI में चलता हुआ खर्च दिखाने का यही सबसे आसान तरीक़ा है।

आगे