Felo API PlatformFelo API Platform

Felo APIs

Chat API

שלבו חיפוש שיחתי מבוסס AI עם ניתוח שאילתות, משאבי אינטרנט וציטוטים.

POST/v2/chat

אימות

Bearer API key

סוג תוכן

application/json

הערות תעריף

Per API key and per user windows. Read X-RateLimit headers.

ה-Chat API מאפשר לכם לשלב חיפוש שיחתי מבוסס AI באפליקציות שלכם. שלחו שאילתה בשפה טבעית וקבלו תשובה חכמה שנוצרה מתוצאות חיפוש באינטרנט בזמן אמת.

למגבלות קצב, תגובות שגיאה והתנהגות ניסיונות חוזרים, ראו שגיאות, מגבלות וניסיונות חוזרים.

סקירה

ה-Chat API מבצע את הפעולות הבאות:

  1. מנתח ומשפר את השאילתה שלכם
  2. מחפש באינטרנט מידע רלוונטי
  3. מדרג ומסנן תוצאות חיפוש
  4. יוצר תשובת AI מקיפה על בסיס המקורות
  5. מחזיר את התשובה יחד עם ציטוטי מקורות

מקרי שימוש:

  • עוזרי AI שיחתיים
  • כלי מחקר ואחזור מידע
  • צ׳אטבוטים לתמיכת לקוחות עם ידע מהאינטרנט
  • אפליקציות חינוכיות
  • כלי יצירת תוכן

אימות

כל הבקשות ל-Chat API דורשות אימות באמצעות מפתח API. כללו את מפתח ה-API בכותרת Authorization:

Authorization: Bearer YOUR_API_KEY

ראו את מדריך האימות לפרטים על השגת מפתח API ושימוש בו.

שימוש עם סוכני AI

התקינו את החבילה המלאה felo-ai כשרוצים שסוכן ישתמש ב-Search ובכל Felo Skill זמין אחר. המתקין מגלה באופן דינמי כל תיקיית חבילה שמכילה SKILL.md, כך שהוא כולל Skills עתידיים ולא תת-קבוצה קבועה. התקינו אותם בתיקייה הייעודית של הסוכן שלכם: Codex משתמש ב-~/.codex/skills, Claude Code משתמש ב-~/.claude/skills, OpenClaw משתמש ב-~/.agents/skills, ו-Hermes Agent משתמש ב-~/.hermes/skills. ראו את מדריך ההגדרה הידנית לסוכני AI לשלבי הקישור הבטוח, מפתח ה-API והאימות בכל פלטפורמה.

Endpoint

POST https://openapi.felo.ai/v2/chat

בקשה

כותרות

כותרתחובהתיאור
Authorizationכןמפתח ה-API שלכם בפורמט: Bearer YOUR_API_KEY
Content-Typeכןחייב להיות application/json

פרמטרים בגוף הבקשה

פרמטרסוגחובהתיאוראילוצים
querystringכןהשאלה או שאילתת החיפוש של המשתמש1-2000 תווים

דוגמת בקשה

{
  "query": "What are the latest developments in quantum computing?"
}

תגובה

תגובת הצלחה (200 OK)

כשהבקשה מצליחה, ה-API מחזיר תגובת JSON במבנה הבא:

{
  "status": "ok",
  "message": null,
  "data": {
    "id": "HabCj883yHLSXc8mWqu4Eq",
    "message_id": "18ea8517-5559-4f48-a355-1f8a79e73b71",
    "answer": "Recent developments in quantum computing include...",
    "query_analysis": {
      "queries": [
        "quantum computing latest developments 2025",
        "quantum computing breakthroughs"
      ]
    },
    "resources": [
      {
        "link": "https://example.com/quantum-news",
        "title": "Latest Quantum Computing Breakthroughs",
        "snippet": "Scientists have achieved a major milestone..."
      },
      {
        "link": "https://example.com/quantum-research",
        "title": "Quantum Computing Research 2025",
        "snippet": "New quantum algorithms show promise..."
      }
    ]
  }
}

שדות התגובה

שדהסוגתיאור
statusstring | numberסטטוס התגובה: "ok" בהצלחה; תגובות שגיאה משתמשות בקוד סטטוס ה-HTTP כמספר
messagestring | nullהודעה נוספת (null בבקשות מוצלחות)
dataobjectנתוני התגובה (קיים רק כשהסטטוס הוא "ok")
data.idstringמזהה ייחודי להפעלת השיחה הזו
data.message_idstringמזהה ייחודי להודעה הספציפית הזו
data.answerstringתשובת AI שנוצרה לשאילתה
data.query_analysisobjectניתוח השאילתה של המשתמש
data.query_analysis.queriesstring[]שאילתות חיפוש משופרות שנגזרו מקלט המשתמש
data.resourcesarrayרשימת מקורות אינטרנט ששימשו ליצירת התשובה
data.resources[].linkstringכתובת ה-URL של המקור
data.resources[].titlestringכותרת עמוד המקור
data.resources[].snippetstringקטע רלוונטי מהמקור

תגובת שגיאה

כשאירעה שגיאה, ה-API מחזיר את מעטפת השגיאה המשותפת:

{
  "status": 401,
  "code": "UNAUTHORIZED",
  "message": "API Key is required",
  "request_id": "..."
}

שדות תגובת השגיאה

שדהסוגתיאור
statusnumberקוד סטטוס HTTP; תגובות הצלחה משתמשות ב-"ok"
codestringקוד שגיאה שמזהה את סוג השגיאה
messagestringתיאור שגיאה קריא לאדם
request_idstringמזהה ייחודי לבקשה הזו (שימושי לתמיכה)

Error Codes (קודי שגיאה)

HTTPקודמשמעות
400קוד אימות של נקודת הקצהשדה query חסר, ריק או ארוך מדי; קראו את message לבעיה הספציפית
401UNAUTHORIZEDמפתח API חסר, לא חוקי או שבוטל
429RATE_LIMITEDמגבלת קצב נחצתה
502CHAT_FAILEDשגיאת שירות פנימית
503SERVICE_UNAVAILABLEהשירות אינו זמין זמנית

למעטפת המשותפת, קודי שגיאה אחרים וכללי ניסיונות חוזרים, ראו שגיאות, מגבלות וניסיונות חוזרים.

דוגמאות

cURL

curl -X POST https://openapi.felo.ai/v2/chat \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "What are the benefits of renewable energy?"
  }'

תגובה:

{
  "status": "ok",
  "message": null,
  "data": {
    "id": "HabCj883yHLSXc8mWqu4Eq",
    "message_id": "18ea8517-5559-4f48-a355-1f8a79e73b71",
    "answer": "Renewable energy offers numerous benefits including reduced greenhouse gas emissions, decreased air pollution, energy independence, job creation, and long-term cost savings. Solar, wind, and hydroelectric power are sustainable alternatives to fossil fuels that help combat climate change while providing reliable electricity.",
    "query_analysis": {
      "queries": [
        "renewable energy benefits",
        "advantages of renewable energy sources"
      ]
    },
    "resources": [
      {
        "link": "https://example.com/renewable-benefits",
        "title": "Top Benefits of Renewable Energy",
        "snippet": "Renewable energy sources provide clean, sustainable power..."
      }
    ]
  }
}

Python

import requests
import os

# Get API key from environment variable
api_key = os.environ.get('FELO_API_KEY')

url = 'https://openapi.felo.ai/v2/chat'
headers = {
    'Authorization': f'Bearer {api_key}',
    'Content-Type': 'application/json'
}
data = {
    'query': 'What are the benefits of renewable energy?'
}

try:
    response = requests.post(url, headers=headers, json=data)
    response.raise_for_status()  # Raise exception for HTTP errors

    result = response.json()

    if result['status'] == 'ok':
        print('Answer:', result['data']['answer'])
        print('\nSources:')
        for resource in result['data']['resources']:
            print(f"- {resource['title']}: {resource['link']}")
    else:
        print(f"Error: {result['code']} - {result['message']}")

except requests.exceptions.RequestException as e:
    print(f'Request failed: {e}')

JavaScript (Node.js)

const fetch = require('node-fetch');

const apiKey = process.env.FELO_API_KEY;
const url = 'https://openapi.felo.ai/v2/chat';

const headers = {
  'Authorization': `Bearer ${apiKey}`,
  'Content-Type': 'application/json'
};

const body = JSON.stringify({
  query: 'What are the benefits of renewable energy?'
});

fetch(url, { method: 'POST', headers, body })
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return response.json();
  })
  .then(data => {
    if (data.status === 'ok') {
      console.log('Answer:', data.data.answer);
      console.log('\nSources:');
      data.data.resources.forEach(resource => {
        console.log(`- ${resource.title}: ${resource.link}`);
      });
    } else {
      console.error(`Error: ${data.code} - ${data.message}`);
    }
  })
  .catch(error => {
    console.error('Request failed:', error);
  });

JavaScript (Browser/Fetch API)

const apiKey = 'YOUR_API_KEY'; // In production, get this from your backend

fetch('https://openapi.felo.ai/v2/chat', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    query: 'What are the benefits of renewable energy?'
  })
})
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return response.json();
  })
  .then(data => {
    if (data.status === 'ok') {
      console.log('Answer:', data.data.answer);

      // Display sources
      const sourcesList = data.data.resources.map(resource =>
        `<li><a href="${resource.link}">${resource.title}</a></li>`
      ).join('');

      document.getElementById('answer').innerHTML = data.data.answer;
      document.getElementById('sources').innerHTML = sourcesList;
    } else {
      console.error(`Error: ${data.code} - ${data.message}`);
    }
  })
  .catch(error => {
    console.error('Request failed:', error);
  });

Go

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
)

type ChatRequest struct {
    Query string `json:"query"`
}

type ChatResponse struct {
    Status  string `json:"status"`
    Message string `json:"message,omitempty"`
    Data    struct {
        ID            string `json:"id"`
        MessageID     string `json:"message_id"`
        Answer        string `json:"answer"`
        QueryAnalysis struct {
            Queries []string `json:"queries"`
        } `json:"query_analysis"`
        Resources []struct {
            Link    string `json:"link"`
            Title   string `json:"title"`
            Snippet string `json:"snippet"`
        } `json:"resources"`
    } `json:"data,omitempty"`
    Code      string `json:"code,omitempty"`
    RequestID string `json:"request_id,omitempty"`
}

func main() {
    apiKey := os.Getenv("FELO_API_KEY")
    url := "https://openapi.felo.ai/v2/chat"

    requestBody := ChatRequest{
        Query: "What are the benefits of renewable energy?",
    }

    jsonData, err := json.Marshal(requestBody)
    if err != nil {
        fmt.Printf("Error marshaling request: %v\n", err)
        return
    }

    req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
    if err != nil {
        fmt.Printf("Error creating request: %v\n", err)
        return
    }

    req.Header.Set("Authorization", "Bearer "+apiKey)
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Printf("Error making request: %v\n", err)
        return
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("Error reading response: %v\n", err)
        return
    }

    var chatResp ChatResponse
    err = json.Unmarshal(body, &chatResp)
    if err != nil {
        fmt.Printf("Error unmarshaling response: %v\n", err)
        return
    }

    if chatResp.Status == "ok" {
        fmt.Println("Answer:", chatResp.Data.Answer)
        fmt.Println("\nSources:")
        for _, resource := range chatResp.Data.Resources {
            fmt.Printf("- %s: %s\n", resource.Title, resource.Link)
        }
    } else {
        fmt.Printf("Error: %s - %s\n", chatResp.Code, chatResp.Message)
    }
}

Rate Limiting (מגבלת קצב)

משתמשים עם מינוי Felo בתשלום בתוקף (כולל מינויים ארגוניים) פטורים מכל מגבלות הקצב של /v2/chat, הן עבור אימות API Key והן עבור אימות OAuth. תגובות פטורות אינן כוללות כותרות X-RateLimit-*.

משתמשים בלי מינוי בתשלום כפופים למגבלות קצב בשלושה ממדים. אם לא ניתן לאמת את מצב המינוי, המגבלות האלה עדיין חלות:

  • לפי מפתח API - מגביל בקשות שנעשות עם מפתח API אחד בתוך חלון של דקה.
  • לפי משתמש (דקה) - מגביל את סך הבקשות בכל מפתחות ה-API שבבעלות משתמש בתוך חלון של דקה.
  • לפי משתמש (שעה) - מגביל את סך הבקשות בכל מפתחות ה-API שבבעלות משתמש בתוך חלון של שעה.

חריגה בכל ממד מפעילה תגובת 429 Too Many Requests.

המגבלות המספריות המדויקות עשויות להשתנות עם הזמן. תמיד קראו אותן מכותרות התגובה שלמטה, ולא מתצלומי תיעוד.

כותרות תגובה (תגובות הכפופות למגבלת קצב, כולל 429):

כותרתמשמעות
X-RateLimit-Limitהמגבלה של הממד ההדוק ביותר שפועל כעת
X-RateLimit-Remainingהמכסה הנותרת המינימלית מבין שלושת הממדים
X-RateLimit-Resetחותמת זמן Unix (בשניות) שבה החלון הנוכחי מתאפס

בתגובת 429, בנוסף:

כותרתמשמעות
Retry-Afterהשהיית הניסיון החוזר המומלצת (בשניות)

דוגמת גוף 429 (ה-message משקף את המגבלות המוגדרות בזמן הבקשה):

{
  "status": 429,
  "code": "RATE_LIMITED",
  "message": "Too many requests. Limit: <N>/min per API key, <M>/min per user, <H>/hour per user.",
  "request_id": "..."
}

התנהגות הלקוח: כשהן קיימות, קראו את X-RateLimit-Remaining והגדילו את ההמתנה באופן יזום. בתגובת 429, המתינו לפחות Retry-After שניות (או עד X-RateLimit-Reset) לפני ניסיון חוזר. אל תקבעו ערכי מגבלה בקוד.

למדיניות הניסיונות החוזרים המלאה והנחיות ההשהיה, ראו שגיאות, מגבלות וניסיונות חוזרים. אם אתם צריכים מגבלות קצב גבוהות יותר, צרו קשר בכתובת [email protected].

שיטות עבודה מומלצות

1. טיפול חינני בשגיאות

תמיד בדקו את סטטוס התגובה וטפלו בשגיאות כראוי:

if result['status'] == 'ok':
    # Process successful response
    answer = result['data']['answer']
else:
    # Handle error
    error_code = result['code']
    error_message = result['message']
    # Log error, show user-friendly message, etc.

2. יישום לוגיקת ניסיונות חוזרים

עבור שגיאות זמניות (קודי סטטוס 5xx), יישמו השהיה אקספוננציאלית:

import time

max_retries = 3
retry_delay = 1  # seconds

for attempt in range(max_retries):
    response = requests.post(url, headers=headers, json=data)

    if response.status_code < 500:
        break  # Success or client error, don't retry

    if attempt < max_retries - 1:
        time.sleep(retry_delay * (2 ** attempt))  # Exponential backoff

3. שמירה ב-cache של תגובות

שקלו לשמור ב-cache תגובות לשאילתות זהות כדי לצמצם קריאות API ולשפר זמני תגובה.

4. אימות קלט

אמתו את קלט המשתמש לפני שליחה ל-API:

  • ודאו שהשאילתה אינה ריקה
  • בדקו את אורך השאילתה (1-2000 תווים)
  • נקו את הקלט כדי למנוע התקפות הזרקה

5. ניטור שימוש

עקבו אחרי השימוש ב-API שלכם כדי להישאר בגבולות מגבלות הקצב ולמטב עלויות:

  • תעדו בלוג מספרי בקשות וזמני תגובה
  • נטרו שיעורי שגיאות
  • הגדירו התראות לדפוסים חריגים

תמיכה

צריכים עזרה עם Chat API?

יומן שינויים

v2.0.0 (Current)

  • מהדורה ראשונית של Chat API
  • תמיכה בשאילתות בשפה טבעית
  • שילוב חיפוש באינטרנט בזמן אמת
  • תשובות AI עם ציטוטי מקורות