Felo APIs
Chat API
Sorgu analizi, web kaynakları ve alıntılarla konuşmaya dayalı AI araması ekleyin.
/v2/chatKimlik doğrulama
Bearer API key
İçerik türü
application/json
Hız sınırı notları
Per API key and per user windows. Read X-RateLimit headers.
Chat API, uygulamalarınıza yapay zeka destekli konuşmaya dayalı arama entegre etmenizi sağlar. Doğal dilde bir sorgu gönderin ve gerçek zamanlı web arama sonuçlarından üretilen akıllı bir yanıt alın.
Hız sınırları, hata yanıtları ve yeniden deneme davranışı için Hatalar, Sınırlar ve Yeniden Denemeler sayfasına bakın.
Genel Bakış
Chat API aşağıdaki işlemleri gerçekleştirir:
- Sorgunuzu analiz eder ve optimize eder
- Web'de ilgili bilgileri arar
- Arama sonuçlarını sıralar ve filtreler
- Kaynaklara dayalı kapsamlı bir yapay zeka yanıtı üretir
- Yanıtı kaynak atıflarıyla birlikte döndürür
Kullanım Alanları:
- Konuşmaya dayalı yapay zeka asistanları
- Araştırma ve bilgi erişim araçları
- Web bilgisine sahip müşteri destek sohbet botları
- Eğitim uygulamaları
- İçerik oluşturma araçları
Kimlik Doğrulama
Chat API'ye yapılan tüm istekler bir API anahtarıyla kimlik doğrulaması gerektirir. API anahtarınızı Authorization başlığına ekleyin:
Authorization: Bearer YOUR_API_KEYAPI anahtarınızı edinme ve kullanma hakkında ayrıntılar için Kimlik Doğrulama Kılavuzu sayfasına bakın.
Yapay Zeka Ajanlarıyla Kullanım
Bir Ajanın Search ve mevcut diğer tüm Felo Skill'lerini kullanmasını istediğinizde tam felo-ai paketini yükleyin. Yükleyici, SKILL.md içeren her paket dizinini dinamik olarak keşfeder; bu nedenle sabit bir alt küme yerine gelecekteki Skill'leri de kapsar. Bunları Ajanınızın yerel dizinine yükleyin: Codex ~/.codex/skills, Claude Code ~/.claude/skills, OpenClaw ~/.agents/skills ve Hermes Agent ~/.hermes/skills kullanır. Her platform için güvenli bağlantı, API anahtarı ve doğrulama adımları hakkında yapay zeka Ajanı manuel kurulum kılavuzuna bakın.
Endpoint
POST https://openapi.felo.ai/v2/chatİstek
HTTP Başlıkları
| Başlık | Zorunlu | Açıklama |
|---|---|---|
Authorization | Evet | API anahtarınız şu biçimde: Bearer YOUR_API_KEY |
Content-Type | Evet | application/json olmalıdır |
İstek Gövdesi Parametreleri
| Parametre | Tür | Zorunlu | Açıklama | Kısıtlamalar |
|---|---|---|---|---|
query | string | Evet | Kullanıcının sorusu veya arama sorgusu | 1-2000 karakter |
Örnek İstek
{
"query": "What are the latest developments in quantum computing?"
}Yanıt
Başarılı Yanıt (200 OK)
İstek başarılı olduğunda API, aşağıdaki yapıya sahip bir JSON yanıtı döndürür:
{
"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..."
}
]
}
}Yanıt Alanları
| Alan | Tür | Açıklama |
|---|---|---|
status | string | number | Yanıt durumu: başarılı olduğunda "ok"; hata yanıtları HTTP durum kodunu sayı olarak kullanır |
message | string | null | Ek mesaj (başarılı isteklerde null) |
data | object | Yanıt verileri (yalnızca status "ok" olduğunda bulunur) |
data.id | string | Bu sohbet oturumu için benzersiz tanımlayıcı |
data.message_id | string | Bu belirli mesaj için benzersiz tanımlayıcı |
data.answer | string | Sorguya yapay zeka tarafından üretilen yanıt |
data.query_analysis | object | Kullanıcının sorgusunun analizi |
data.query_analysis.queries | string[] | Kullanıcının girdisinden türetilen optimize edilmiş arama sorguları |
data.resources | array | Yanıtı üretmek için kullanılan web kaynaklarının listesi |
data.resources[].link | string | Kaynağın URL'si |
data.resources[].title | string | Kaynak sayfanın başlığı |
data.resources[].snippet | string | Kaynaktan ilgili alıntı |
Hata Yanıtı
Bir hata oluştuğunda API, paylaşılan hata zarfını döndürür:
{
"status": 401,
"code": "UNAUTHORIZED",
"message": "API Key is required",
"request_id": "..."
}Hata Yanıtı Alanları
| Alan | Tür | Açıklama |
|---|---|---|
status | number | HTTP durum kodu; başarılı yanıtlar "ok" kullanır |
code | string | Hata türünü tanımlayan hata kodu |
message | string | İnsan tarafından okunabilir hata açıklaması |
request_id | string | Bu istek için benzersiz tanımlayıcı (destek için kullanışlıdır) |
Hata Kodları
| HTTP | Kod | Anlamı |
|---|---|---|
| 400 | Endpoint doğrulama kodu | query alanı eksik, boş veya çok uzun; belirli sorun için message alanını okuyun |
| 401 | UNAUTHORIZED | API anahtarı eksik, geçersiz veya iptal edilmiş |
| 429 | RATE_LIMITED | Bir hız sınırı aşıldı |
| 502 | CHAT_FAILED | Dahili hizmet hatası |
| 503 | SERVICE_UNAVAILABLE | Hizmet geçici olarak kullanılamıyor |
Paylaşılan zarf, diğer hata kodları ve yeniden deneme kuralları için Hatalar, Sınırlar ve Yeniden Denemeler sayfasına bakın.
Örnekler
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?"
}'Yanıt:
{
"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)
}
}Hız Sınırları
Etkin ücretli Felo aboneliği olan kullanıcılar (kurumsal abonelikler dahil), hem API anahtarı hem de OAuth kimlik doğrulaması için tüm /v2/chat hız sınırlarından muaftır. Muaf yanıtlar X-RateLimit-* başlıklarını içermez.
Ücretli aboneliği olmayan kullanıcılar üç boyutta hız sınırlarına tabidir. Abonelik durumu doğrulanamazsa bu sınırlar yine de geçerlidir:
- API Anahtarı Başına - tek bir API anahtarıyla yapılan istekleri 1 dakikalık bir pencere içinde sınırlar.
- Kullanıcı Başına (dakika) - bir kullanıcının sahip olduğu tüm API anahtarları üzerinden toplam istekleri 1 dakikalık bir pencere içinde sınırlar.
- Kullanıcı Başına (saat) - bir kullanıcının sahip olduğu tüm API anahtarları üzerinden toplam istekleri 1 saatlik bir pencere içinde sınırlar.
Herhangi bir boyutun aşılması 429 Too Many Requests yanıtını tetikler.
Kesin sayısal sınırlar zaman içinde değişebilir. Bunları belge anlık görüntülerinden değil, her zaman aşağıdaki yanıt başlıklarından okuyun.
Yanıt başlıkları (hız sınırına tabi yanıtlar, 429 dahil):
| Başlık | Anlamı |
|---|---|
X-RateLimit-Limit | Şu anda yürürlükte olan en kısıtlayıcı boyutun sınırı |
X-RateLimit-Remaining | Üç boyut genelinde kalan minimum kota |
X-RateLimit-Reset | Geçerli pencerenin sıfırlandığı Unix zaman damgası (saniye) |
429 durumunda ayrıca:
| Başlık | Anlamı |
|---|---|
Retry-After | Önerilen yeniden deneme gecikmesi (saniye) |
Örnek 429 gövdesi (message alanı, istek anında yapılandırılmış geçerli sınırları yansıtır):
{
"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": "..."
}İstemci davranışı: Mevcut olduğunda X-RateLimit-Remaining değerini okuyun ve proaktif olarak geri çekilin. 429 durumunda, yeniden denemeden önce en az Retry-After saniye (veya X-RateLimit-Reset değerine kadar) bekleyin. Sınır değerlerini koda sabit yazmayın.
Tam yeniden deneme ilkesi ve geri çekilme yönergeleri için Hatalar, Sınırlar ve Yeniden Denemeler sayfasına bakın. Daha yüksek hız sınırlarına ihtiyacınız varsa [email protected] adresine ulaşın.
En İyi Uygulamalar
1. Hataları Düzgün Ele Alın
Her zaman yanıt durumunu kontrol edin ve hataları uygun şekilde ele alın:
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. Yeniden Deneme Mantığı Uygulayın
Geçici hatalar (5xx durum kodları) için üstel geri çekilme uygulayın:
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. Yanıtları Önbelleğe Alın
API çağrılarını azaltmak ve yanıt sürelerini iyileştirmek için aynı sorgulara ait yanıtları önbelleğe almayı düşünün.
4. Girdiyi Doğrulayın
Kullanıcı girdisini API'ye göndermeden önce doğrulayın:
- Sorgunun boş olmadığından emin olun
- Sorgu uzunluğunu kontrol edin (1-2000 karakter)
- Enjeksiyon saldırılarını önlemek için girdiyi temizleyin
5. Kullanımı İzleyin
Hız sınırları içinde kalmak ve maliyetleri optimize etmek için API kullanımınızı takip edin:
- İstek sayılarını ve yanıt sürelerini günlüğe kaydedin
- Hata oranlarını izleyin
- Olağandışı kalıplar için uyarılar kurun
Destek
Chat API ile ilgili yardıma mı ihtiyacınız var?
- Başlangıç Kılavuzu sayfasını inceleyin
- Kimlik Doğrulama Belgeleri sayfasına bakın
- İstek kimliğinizle birlikte [email protected] adresine ulaşın
Değişiklik Günlüğü
v2.0.0 (Güncel)
- Chat API'nin ilk sürümü
- Doğal dil sorguları desteği
- Gerçek zamanlı web arama entegrasyonu
- Kaynak atıflarıyla yapay zeka tarafından üretilen yanıtlar