Felo APIs
Chat API
שלבו חיפוש שיחתי מבוסס AI עם ניתוח שאילתות, משאבי אינטרנט וציטוטים.
/v2/chatאימות
Bearer API key
סוג תוכן
application/json
הערות תעריף
Per API key and per user windows. Read X-RateLimit headers.
ה-Chat API מאפשר לכם לשלב חיפוש שיחתי מבוסס AI באפליקציות שלכם. שלחו שאילתה בשפה טבעית וקבלו תשובה חכמה שנוצרה מתוצאות חיפוש באינטרנט בזמן אמת.
למגבלות קצב, תגובות שגיאה והתנהגות ניסיונות חוזרים, ראו שגיאות, מגבלות וניסיונות חוזרים.
סקירה
ה-Chat API מבצע את הפעולות הבאות:
- מנתח ומשפר את השאילתה שלכם
- מחפש באינטרנט מידע רלוונטי
- מדרג ומסנן תוצאות חיפוש
- יוצר תשובת AI מקיפה על בסיס המקורות
- מחזיר את התשובה יחד עם ציטוטי מקורות
מקרי שימוש:
- עוזרי 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 |
פרמטרים בגוף הבקשה
| פרמטר | סוג | חובה | תיאור | אילוצים |
|---|---|---|---|---|
query | string | כן | השאלה או שאילתת החיפוש של המשתמש | 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..."
}
]
}
}שדות התגובה
| שדה | סוג | תיאור |
|---|---|---|
status | string | number | סטטוס התגובה: "ok" בהצלחה; תגובות שגיאה משתמשות בקוד סטטוס ה-HTTP כמספר |
message | string | null | הודעה נוספת (null בבקשות מוצלחות) |
data | object | נתוני התגובה (קיים רק כשהסטטוס הוא "ok") |
data.id | string | מזהה ייחודי להפעלת השיחה הזו |
data.message_id | string | מזהה ייחודי להודעה הספציפית הזו |
data.answer | string | תשובת AI שנוצרה לשאילתה |
data.query_analysis | object | ניתוח השאילתה של המשתמש |
data.query_analysis.queries | string[] | שאילתות חיפוש משופרות שנגזרו מקלט המשתמש |
data.resources | array | רשימת מקורות אינטרנט ששימשו ליצירת התשובה |
data.resources[].link | string | כתובת ה-URL של המקור |
data.resources[].title | string | כותרת עמוד המקור |
data.resources[].snippet | string | קטע רלוונטי מהמקור |
תגובת שגיאה
כשאירעה שגיאה, ה-API מחזיר את מעטפת השגיאה המשותפת:
{
"status": 401,
"code": "UNAUTHORIZED",
"message": "API Key is required",
"request_id": "..."
}שדות תגובת השגיאה
| שדה | סוג | תיאור |
|---|---|---|
status | number | קוד סטטוס HTTP; תגובות הצלחה משתמשות ב-"ok" |
code | string | קוד שגיאה שמזהה את סוג השגיאה |
message | string | תיאור שגיאה קריא לאדם |
request_id | string | מזהה ייחודי לבקשה הזו (שימושי לתמיכה) |
Error Codes (קודי שגיאה)
| HTTP | קוד | משמעות |
|---|---|---|
| 400 | קוד אימות של נקודת הקצה | שדה query חסר, ריק או ארוך מדי; קראו את message לבעיה הספציפית |
| 401 | UNAUTHORIZED | מפתח API חסר, לא חוקי או שבוטל |
| 429 | RATE_LIMITED | מגבלת קצב נחצתה |
| 502 | CHAT_FAILED | שגיאת שירות פנימית |
| 503 | SERVICE_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 backoff3. שמירה ב-cache של תגובות
שקלו לשמור ב-cache תגובות לשאילתות זהות כדי לצמצם קריאות API ולשפר זמני תגובה.
4. אימות קלט
אמתו את קלט המשתמש לפני שליחה ל-API:
- ודאו שהשאילתה אינה ריקה
- בדקו את אורך השאילתה (1-2000 תווים)
- נקו את הקלט כדי למנוע התקפות הזרקה
5. ניטור שימוש
עקבו אחרי השימוש ב-API שלכם כדי להישאר בגבולות מגבלות הקצב ולמטב עלויות:
- תעדו בלוג מספרי בקשות וזמני תגובה
- נטרו שיעורי שגיאות
- הגדירו התראות לדפוסים חריגים
תמיכה
צריכים עזרה עם Chat API?
- עיינו במדריך התחלה מהירה
- בדקו את תיעוד האימות
- צרו קשר עם התמיכה בכתובת [email protected] וצרפו את מזהה הבקשה שלכם
יומן שינויים
v2.0.0 (Current)
- מהדורה ראשונית של Chat API
- תמיכה בשאילתות בשפה טבעית
- שילוב חיפוש באינטרנט בזמן אמת
- תשובות AI עם ציטוטי מקורות