ఫంక్షన్ టూల్స్

ఫంక్షన్ టూల్స్ మీ AI ఏజెంట్లు ఫోన్ కాల్‌ల సమయంలో బాహ్య APIలను అమలు చేయడానికి అనుమతిస్తాయి. కస్టమర్ డేటాను చూడటానికి, లభ్యతను తనిఖీ చేయడానికి, అపాయింట్‌మెంట్‌లను బుక్ చేయడానికి లేదా మీ బ్యాకెండ్ మద్దతిచ్చే ఏ చర్యనైనా నిర్వహించడానికి వాటిని ఉపయోగించండి.

ఇది ఎలా పనిచేస్తుంది

  1. మీరు స్కీమాతో టూల్‌లను నిర్వచిస్తారు (టూల్ స్వీకరించే ఆర్గ్యుమెంట్‌లు)
  2. మీరు endpoint కాన్ఫిగరేషన్‌ను అందిస్తారు (ThunderPhone మీ APIని ఎక్కడ కాల్ చేస్తుంది) — లేదా మీ సంస్థ వెబ్‌హుక్‌లో టూల్ కాల్‌లను స్వీకరించడానికి దాన్ని ఇవ్వకుండా వదిలేయండి
  3. కాల్ సమయంలో, సంభాషణ ఆధారంగా టూల్‌ను ఎప్పుడు ఉపయోగించాలో AI నిర్ణయిస్తుంది
  4. ThunderPhone టూల్ ఆర్గ్యుమెంట్‌లతో మీ ఎండ్‌పాయింట్‌ను కాల్ చేస్తుంది
  5. సంభాషణను కొనసాగించడానికి మీ API ప్రతిస్పందన AIకి తిరిగి అందించబడుతుంది

టూల్ స్కీమా

ప్రతి టూల్ ఈ నిర్మాణాన్ని అనుసరిస్తుంది:

{
  "type": "function",
  "function": {
    "name": "search_appointments",
    "description": "Find available appointment slots for a given date",
    "parameters": {
      "type": "object",
      "properties": {
        "date": {
          "type": "string",
          "description": "Date in YYYY-MM-DD format"
        },
        "service": {
          "type": "string",
          "description": "Type of service (e.g., 'consultation', 'follow-up')"
        }
      },
      "required": ["date"]
    }
  },
  "endpoint": {
    "url": "https://api.example.com/appointments/search",
    "method": "POST",
    "headers": {
      "X-Api-Key": "your-api-key"
    }
  }
}

ఫంక్షన్ నిర్వచనం

ఫీల్డ్రకంఅవసరంవివరణ
nameస్ట్రింగ్అవునుటూల్‌కు ప్రత్యేక గుర్తింపుదారు
descriptionస్ట్రింగ్అవునుఈ టూల్‌ను ఎప్పుడు ఉపయోగించాలో AIకి వివరిస్తుంది
parametersఆబ్జెక్ట్అవునుటూల్ ఆర్గ్యుమెంట్‌ల కోసం JSON స్కీమా

ఎండ్‌పాయింట్ కాన్ఫిగరేషన్

ఫీల్డ్రకంఅవసరంవివరణ
urlస్ట్రింగ్అవునుమీ API ఎండ్‌పాయింట్ URL
methodస్ట్రింగ్కాదుHTTP పద్ధతి (డిఫాల్ట్: POST)
headersఆబ్జెక్ట్కాదుచేర్చాల్సిన అనుకూల హెడర్‌లు

రెండు ఇన్వొకేషన్ మార్గాలు

మీ సర్వర్ స్వీకరించే అభ్యర్థన, టూల్‌కు endpoint ఉందా లేదా అనే దానిపై ఆధారపడి ఉంటుంది:

endpoint ఉన్న టూల్endpoint లేని టూల్
అభ్యర్థన వెళ్లే స్థలంనేరుగా endpoint.urlకుమీ సంస్థ యొక్క లెగసీ వెబ్‌హుక్ URL
బాడీకేవలం టూల్ ఆర్గ్యుమెంట్‌లుtelephony.tool / web.tool ఎన్వలప్
హెడర్‌లుమీ endpoint.headers + X-ThunderPhone-Call-ID + X-ThunderPhone-SignatureContent-Type + X-ThunderPhone-Signature
సైనింగ్ కీసంస్థ వెబ్‌హుక్ సీక్రెట్సంస్థ వెబ్‌హుక్ సీక్రెట్

రెండు మార్గాలు బ్లాకింగ్ — ఫలితం కోసం AI వాక్యం మధ్యలో వేచి ఉంటుంది — మరియు 20 s టైమ్‌అవుట్ కలిగి ఉంటాయి. హ్యాండ్లర్‌లను వేగంగా ఉంచండి. మిశ్రమం కూడా సరే: వెబ్‌హుక్ URL ఉన్న సంస్థకు చెందిన కాల్‌లో, endpoint ఉన్న టూల్‌లు నేరుగా కాల్ చేయబడతాయి మరియు మిగతావి వెబ్‌హుక్‌కు తిరిగి మారుతాయి.

ప్రత్యక్ష ఎండ్‌పాయింట్ కాల్‌లు

AI endpoint ఉన్న టూల్‌ను ఇన్‌వోక్ చేసినప్పుడు, ThunderPhone మీ URL‌కు రిక్వెస్ట్ పంపుతుంది:

రిక్వెస్ట్ హెడర్‌లు

POST /appointments/search HTTP/1.1
Host: api.example.com
Content-Type: application/json
X-ThunderPhone-Signature: abc123...
X-ThunderPhone-Call-ID: 987654321
X-Api-Key: your-api-key

మీ endpoint.headers నుండి కస్టమ్ హెడర్‌లు ఎల్లప్పుడూ యథాతథంగా చేర్చబడతాయి, అలాగే ThunderPhone నేమ్‌స్పేస్‌తో ఉన్న రెండు హెడర్‌లు కూడా:

మీ endpoint.headers దానిని ఓవర్‌రైడ్ చేయనంత వరకు Content-Type: application/json సెట్ చేయబడుతుంది — కస్టమ్ Content-Typeకే ప్రాధాన్యం ఉంటుంది.

రిక్వెస్ట్ బాడీ

POST / PUT / PATCH కోసం, బాడీలో టూల్ ఆర్గ్యుమెంట్‌లు మాత్రమే ఉంటాయి (ర్యాపర్ ఉండదు), కానానికల్‌గా సీరియలైజ్ చేయబడతాయి (కీలను క్రమబద్ధీకరించి, కాంపాక్ట్ సెపరేటర్‌లతో):

{"date":"2025-01-02","service":"consultation"}

GET / DELETE కోసం, ఆర్గ్యుమెంట్‌లు క్వెరీ పారామీటర్‌లుగా పంపబడతాయి మరియు బాడీ ఖాళీగా ఉంటుంది — అప్పుడు సిగ్నేచర్ ఖాళీ బైట్ స్ట్రింగ్‌పై కంప్యూట్ చేయబడుతుంది. చూడండి webhook సిగ్నేచర్‌లను ధృవీకరించండి.

ప్రతిస్పందన

టూల్ ఫలితంతో కూడిన JSON ప్రతిస్పందనను తిరిగి పంపండి:

{
  "available_slots": ["9:00 AM", "2:00 PM", "4:30 PM"],
  "timezone": "America/Los_Angeles"
}

ప్రతిస్పందనను ఫార్మాట్ చేసి, సంభాషణను కొనసాగించడానికి AIకి అందిస్తారు. JSON కాని ప్రతిస్పందనలను {"data": "<text>"}గా ర్యాప్ చేస్తారు; టైమ్‌అవుట్‌లు మరియు కనెక్షన్ వైఫల్యాలను AIకి ఎర్రర్‌లుగా నివేదిస్తారు, కాబట్టి ఏజెంట్ ఆగిపోకుండా క్షమాపణ చెప్పి ముందుకు సాగవచ్చు.

Webhook-మోడ్ డిస్పాచ్

endpoint లేని టూల్‌లు మీ సంస్థ లెగసీ webhook URL‌కు సంతకం చేసిన telephony.tool (ఫోన్ కాల్‌లు) లేదా web.tool (వెబ్ కాల్‌లు) రిక్వెస్ట్‌గా డిస్పాచ్ చేయబడతాయి. ఎగ్జిక్యూషన్ తర్వాత webhook ఎండ్‌పాయింట్‌లకు అందించే ఆడిట్ నోటిఫికేషన్‌లకు భిన్నంగా, ఈ రిక్వెస్ట్‌యే ఎగ్జిక్యూషన్ — మీ HTTP ప్రతిస్పందనే టూల్ ఫలితం.

{
  "type": "telephony.tool",
  "data": {
    "call_id": 987654321,
    "tool_name": "search_appointments",
    "arguments": { "date": "2026-04-21" },
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  }
}

web.tool, from_number / to_numberకు బదులుగా origin_domainను కలిగి ఉంటుంది. టూల్ ఫలితాన్ని JSONగా ప్రతిస్పందించండి — ప్రత్యక్ష ఎండ్‌పాయింట్ కాల్‌లకు ఉన్నదే ప్రతిస్పందన కాంట్రాక్ట్. ప్రతి ఇతర webhook మాదిరిగానే, రిక్వెస్ట్ రా బాడీపై సంస్థ webhook సీక్రెట్‌తో సంతకం చేయబడుతుంది.


సంతకం ధృవీకరణ

ప్రత్యక్ష టూల్ కాల్‌లు వెబ్‌హుక్‌ల మాదిరిగానే సంతకం చేయబడతాయి:

import hmac
import hashlib

def verify_tool_call(body: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

@app.post("/appointments/search")
async def search_appointments(request: Request):
    body = await request.body()
    signature = request.headers.get("X-ThunderPhone-Signature", "")

    if not verify_tool_call(body, signature, WEBHOOK_SECRET):
        raise HTTPException(status_code=401)

    data = json.loads(body)
    date = data["date"]

    # Look up availability
    slots = await get_available_slots(date)

    return {"available_slots": slots}
app.post('/appointments/search', express.raw({type: 'application/json'}), (req, res) => {
  const signature = req.headers['x-thunderphone-signature'] || '';
  const expected = crypto
    .createHmac('sha256', WEBHOOK_SECRET)
    .update(req.body)
    .digest('hex');

  if (!signature ||
      signature.length !== expected.length ||
      !crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
    return res.status(401).send('Invalid signature');
  }

  const { date, service } = JSON.parse(req.body);

  // Look up availability
  const slots = getAvailableSlots(date, service);

  res.json({ available_slots: slots });
});

ఖాళీ-బాడీ సందర్భం మరియు సీక్రెట్ లేని పరిస్థితిపై హెచ్చరికతో సహా పూర్తి విధానాలు వెబ్‌హుక్ సంతకాలను ధృవీకరించండిలో ఉన్నాయి.


ఉదాహరణ: పూర్తి బుకింగ్ ప్రవాహం

పూర్తి అపాయింట్‌మెంట్ బుకింగ్ సిస్టమ్ కోసం టూల్‌ల సమితి ఇది:

{
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "search_appointments",
        "description": "Find available appointment slots",
        "parameters": {
          "type": "object",
          "properties": {
            "date": { "type": "string", "description": "YYYY-MM-DD" },
            "service": { "type": "string" }
          },
          "required": ["date"]
        }
      },
      "endpoint": {
        "url": "https://api.example.com/appointments/search",
        "method": "POST",
        "headers": { "X-Api-Key": "key" }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "book_appointment",
        "description": "Book an appointment at a specific time",
        "parameters": {
          "type": "object",
          "properties": {
            "date": { "type": "string", "description": "YYYY-MM-DD" },
            "time": { "type": "string", "description": "HH:MM format" },
            "customer_name": { "type": "string" },
            "customer_phone": { "type": "string" }
          },
          "required": ["date", "time", "customer_name"]
        }
      },
      "endpoint": {
        "url": "https://api.example.com/appointments/book",
        "method": "POST",
        "headers": { "X-Api-Key": "key" }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "cancel_appointment",
        "description": "Cancel an existing appointment",
        "parameters": {
          "type": "object",
          "properties": {
            "confirmation_number": { "type": "string" }
          },
          "required": ["confirmation_number"]
        }
      },
      "endpoint": {
        "url": "https://api.example.com/appointments/cancel",
        "method": "POST",
        "headers": { "X-Api-Key": "key" }
      }
    }
  ]
}

ఉత్తమ పద్ధతులు

స్పష్టమైన వివరణలు రాయండి

description ఫీల్డ్ టూల్‌ను ఎప్పుడు ఉపయోగించాలో AIకి అర్థం చేసుకోవడంలో సహాయపడుతుంది. అది ఏమి చేస్తుందో, ఎప్పుడు ఉపయోగించడం సముచితమో నిర్దిష్టంగా పేర్కొనండి.

ఎర్రర్‌లను సజావుగా నిర్వహించండి

AI అర్థం చేసుకోగల ఎర్రర్ సందేశాలను అందించండి: సాధారణ 500 ఎర్రర్‌లకు బదులుగా {"error": "No slots available for that date"}.

ప్రతిస్పందనలను సంక్షిప్తంగా ఉంచండి

సంభాషణను కొనసాగించడానికి AIకి అవసరమైనదాన్ని మాత్రమే అందించండి. పెద్ద పేలోడ్‌లు ప్రతిస్పందన సమయాలను నెమ్మదింపజేస్తాయి.

అవసరమైన ఫీల్డ్‌లను వివేకంగా ఉపయోగించండి

నిజంగా అవసరమైనప్పుడు మాత్రమే ఫీల్డ్‌లను requiredగా గుర్తించండి. టూల్‌ను కాల్ చేయడానికి ముందు AI అవసరమైన సమాచారాన్ని వినియోగదారుని అడుగుతుంది.


సంబంధితవి