Felo API PlatformFelo API Platform

Felo APIs

Chat API

Sorgu analizi, web kaynakları ve alıntılarla konuşmaya dayalı AI araması ekleyin.

POST/v2/chat

Kimlik 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:

  1. Sorgunuzu analiz eder ve optimize eder
  2. Web'de ilgili bilgileri arar
  3. Arama sonuçlarını sıralar ve filtreler
  4. Kaynaklara dayalı kapsamlı bir yapay zeka yanıtı üretir
  5. 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_KEY

API 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ıkZorunluAçıklama
AuthorizationEvetAPI anahtarınız şu biçimde: Bearer YOUR_API_KEY
Content-TypeEvetapplication/json olmalıdır

İstek Gövdesi Parametreleri

ParametreTürZorunluAçıklamaKısıtlamalar
querystringEvetKullanıcının sorusu veya arama sorgusu1-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ı

AlanTürAçıklama
statusstring | numberYanıt durumu: başarılı olduğunda "ok"; hata yanıtları HTTP durum kodunu sayı olarak kullanır
messagestring | nullEk mesaj (başarılı isteklerde null)
dataobjectYanıt verileri (yalnızca status "ok" olduğunda bulunur)
data.idstringBu sohbet oturumu için benzersiz tanımlayıcı
data.message_idstringBu belirli mesaj için benzersiz tanımlayıcı
data.answerstringSorguya yapay zeka tarafından üretilen yanıt
data.query_analysisobjectKullanıcının sorgusunun analizi
data.query_analysis.queriesstring[]Kullanıcının girdisinden türetilen optimize edilmiş arama sorguları
data.resourcesarrayYanıtı üretmek için kullanılan web kaynaklarının listesi
data.resources[].linkstringKaynağın URL'si
data.resources[].titlestringKaynak sayfanın başlığı
data.resources[].snippetstringKaynaktan 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ı

AlanTürAçıklama
statusnumberHTTP durum kodu; başarılı yanıtlar "ok" kullanır
codestringHata türünü tanımlayan hata kodu
messagestringİnsan tarafından okunabilir hata açıklaması
request_idstringBu istek için benzersiz tanımlayıcı (destek için kullanışlıdır)

Hata Kodları

HTTPKodAnlamı
400Endpoint doğrulama koduquery alanı eksik, boş veya çok uzun; belirli sorun için message alanını okuyun
401UNAUTHORIZEDAPI anahtarı eksik, geçersiz veya iptal edilmiş
429RATE_LIMITEDBir hız sınırı aşıldı
502CHAT_FAILEDDahili hizmet hatası
503SERVICE_UNAVAILABLEHizmet 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ıkAnlamı
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-ResetGeçerli pencerenin sıfırlandığı Unix zaman damgası (saniye)

429 durumunda ayrıca:

BaşlıkAnlamı
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 backoff

3. 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?

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