Felo API PlatformFelo API Platform

Felo APIs

Chat API

কোয়েরি বিশ্লেষণ, ওয়েব রিসোর্স ও citations সহ AI কথোপকথনভিত্তিক সার্চ যুক্ত করুন।

POST/v2/chat

অথেন্টিকেশন

Bearer API key

কনটেন্ট টাইপ

application/json

রেট সংক্রান্ত নোট

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

Chat API আপনাকে আপনার অ্যাপ্লিকেশনে AI-চালিত কথোপকথনমূলক সার্চ যুক্ত করতে দেয়। একটি প্রাকৃতিক ভাষার query পাঠান এবং রিয়েল-টাইম ওয়েব সার্চ ফলাফল থেকে তৈরি বুদ্ধিদীপ্ত উত্তর পান।

রেট সীমা, ত্রুটি রেসপন্স ও রিট্রাই আচরণের জন্য Errors, Limits, and Retries দেখুন।

এক নজরে

Chat API নিচের অপারেশনগুলো করে:

  1. আপনার query বিশ্লেষণ ও অপ্টিমাইজ করে
  2. প্রাসঙ্গিক তথ্যের জন্য ওয়েব সার্চ করে
  3. সার্চ ফলাফল র‍্যাংক ও ফিল্টার করে
  4. সূত্রের ভিত্তিতে একটি বিস্তারিত AI উত্তর তৈরি করে
  5. সূত্রের উদ্ধৃতিসহ উত্তর ফেরত দেয়

ব্যবহারের ক্ষেত্র:

  • কথোপকথনমূলক AI অ্যাসিস্ট্যান্ট
  • গবেষণা ও তথ্য রিট্রিভাল টুল
  • ওয়েব জ্ঞানসম্পন্ন কাস্টমার সাপোর্ট chatbot
  • শিক্ষামূলক অ্যাপ্লিকেশন
  • কনটেন্ট তৈরির টুল

প্রমাণীকরণ

Chat API-তে সব অনুরোধের API Key দিয়ে প্রমাণীকরণ প্রয়োজন। Authorization header-এ আপনার API Key অন্তর্ভুক্ত করুন:

Authorization: Bearer YOUR_API_KEY

আপনার API Key নেওয়া ও ব্যবহারের বিস্তারিত জানতে Authentication গাইড দেখুন।

AI এজেন্টের সাথে ব্যবহার

একটি Agent-কে Search এবং অন্যান্য সব উপলব্ধ Felo Skill ব্যবহার করতে দিতে চাইলে সম্পূর্ণ felo-ai প্যাকেজ ইনস্টল করুন। ইনস্টলার গতিশীলভাবে SKILL.md থাকা প্রতিটি প্যাকেজ ডিরেক্টরি আবিষ্কার করে, তাই নির্দিষ্ট উপসেটের বদলে ভবিষ্যতের Skills-ও অন্তর্ভুক্ত হয়। আপনার Agent-এর নেটিভ ডিরেক্টরিতে সেগুলো ইনস্টল করুন: Codex ~/.codex/skills, Claude Code ~/.claude/skills, OpenClaw ~/.agents/skills এবং Hermes Agent ~/.hermes/skills ব্যবহার করে। প্রতিটি প্ল্যাটফর্মের নিরাপদ লিংক, API key ও যাচাইয়ের ধাপের জন্য ম্যানুয়াল AI Agent সেটআপ গাইড দেখুন।

Endpoint

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

অনুরোধ

Headerআবশ্যকবর্ণনা
Authorizationহ্যাঁBearer YOUR_API_KEY ফরম্যাটে আপনার API Key
Content-Typeহ্যাঁঅবশ্যই application/json হতে হবে

Body প্যারামিটার

প্যারামিটারধরনআবশ্যকবর্ণনাসীমাবদ্ধতা
querystringহ্যাঁব্যবহারকারীর প্রশ্ন বা সার্চ query1-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অতিরিক্ত message (সফল অনুরোধে null)
dataobjectরেসপন্স ডেটা (status "ok" হলে কেবল তখনই থাকে)
data.idstringএই chat সেশনের অনন্য শনাক্তকারী
data.message_idstringএই নির্দিষ্ট message-এর অনন্য শনাক্তকারী
data.answerstringquery-র AI-উৎপন্ন উত্তর
data.query_analysisobjectব্যবহারকারীর query-র বিশ্লেষণ
data.query_analysis.queriesstring[]ব্যবহারকারীর ইনপুট থেকে উদ্ভূত অপ্টিমাইজ করা সার্চ query
data.resourcesarrayউত্তর তৈরিতে ব্যবহৃত ওয়েব উৎসের তালিকা
data.resources[].linkstringউৎসের URL
data.resources[].titlestringউৎস পেজের শিরোনাম
data.resources[].snippetstringউৎস থেকে প্রাসঙ্গিক অংশ

ত্রুটি রেসপন্স

ত্রুটি ঘটলে API শেয়ার করা error envelope ফেরত দেয়:

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

ত্রুটি রেসপন্স ফিল্ড

ফিল্ডধরনবর্ণনা
statusnumberHTTP স্ট্যাটাস কোড; সফল রেসপন্স "ok" ব্যবহার করে
codestringত্রুটির ধরন শনাক্তকারী error code
messagestringমানুষ-পাঠযোগ্য ত্রুটির বর্ণনা
request_idstringএই অনুরোধের অনন্য শনাক্তকারী (সহায়তার জন্য উপযোগী)

Error Codes (ত্রুটি কোড)

HTTPকোডঅর্থ
400Endpoint ভ্যালিডেশন কোডquery ফিল্ড অনুপস্থিত, খালি বা অতিরিক্ত দীর্ঘ; নির্দিষ্ট সমস্যার জন্য message পড়ুন
401UNAUTHORIZEDAPI key অনুপস্থিত, অবৈধ বা প্রত্যাহৃত
429RATE_LIMITEDএকটি রেট সীমা অতিক্রম হয়েছে
502CHAT_FAILEDঅভ্যন্তরীণ সার্ভিস ত্রুটি
503SERVICE_UNAVAILABLEসার্ভিস সাময়িকভাবে অনুপলব্ধ

শেয়ার করা envelope, অন্যান্য error code ও রিট্রাই নিয়মের জন্য Errors, Limits, and Retries দেখুন।

উদাহরণ

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 সাবস্ক্রিপশন (এন্টারপ্রাইজ সাবস্ক্রিপশনসহ) থাকা ব্যবহারকারীরা API Key ও OAuth প্রমাণীকরণ—উভয়ের জন্যই সব /v2/chat রেট সীমা থেকে ব্যতিক্রম। ব্যতিক্রমী রেসপন্সে X-RateLimit-* header থাকে না।

পেইড সাবস্ক্রিপশন না থাকা ব্যবহারকারীরা তিনটি মাত্রায় রেট সীমার অধীন। সাবস্ক্রিপশন অবস্থা যাচাই করা না গেলে এই সীমাগুলো প্রযোজ্য থাকে:

  • প্রতি API Key - 1 মিনিটের উইন্ডোতে একটি API Key দিয়ে করা অনুরোধ সীমিত করে।
  • প্রতি ব্যবহারকারী (মিনিট) - 1 মিনিটের উইন্ডোতে একজন ব্যবহারকারীর মালিকানার সব API Key জুড়ে সম্মিলিত অনুরোধ সীমিত করে।
  • প্রতি ব্যবহারকারী (ঘণ্টা) - 1 ঘণ্টার উইন্ডোতে একজন ব্যবহারকারীর মালিকানার সব API Key জুড়ে সম্মিলিত অনুরোধ সীমিত করে।

যেকোনো মাত্রা অতিক্রম করলে 429 Too Many Requests রেসপন্স আসে।

সঠিক সাংখ্যিক সীমা সময়ের সাথে বদলাতে পারে। এগুলো সবসময় নিচের রেসপন্স header থেকে পড়ুন, ডকুমেন্টেশনের স্ন্যাপশট থেকে নয়।

রেসপন্স header (রেট সীমার অধীন রেসপন্স, 429 সহ):

Headerঅর্থ
X-RateLimit-Limitবর্তমানে কার্যকর সবচেয়ে কঠোর মাত্রার সীমা
X-RateLimit-Remainingতিনটি মাত্রা জুড়ে ন্যূনতম অবশিষ্ট কোটা
X-RateLimit-Resetবর্তমান উইন্ডো রিসেট হওয়ার Unix টাইমস্ট্যাম্প (সেকেন্ড)

429-এ অতিরিক্তভাবে:

Headerঅর্থ
Retry-Afterপ্রস্তাবিত রিট্রাই বিলম্ব (সেকেন্ড)

উদাহরণ 429 body (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 পর্যন্ত) অপেক্ষা করুন। সীমার মান হার্ডকোড করবেন না।

সম্পূর্ণ রিট্রাই নীতি ও ব্যাকঅফ নির্দেশনার জন্য Errors, Limits, and Retries দেখুন। উচ্চতর রেট সীমা প্রয়োজন হলে [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 করুন

API কল কমাতে এবং রেসপন্সের সময় উন্নত করতে অভিন্ন query-র রেসপন্স cache করার কথা ভাবুন।

4. ইনপুট যাচাই করুন

API-তে পাঠানোর আগে ব্যবহারকারীর ইনপুট যাচাই করুন:

  • query খালি নয় তা নিশ্চিত করুন
  • query-র দৈর্ঘ্য দেখুন (1-2000 অক্ষর)
  • ইনজেকশন আক্রমণ প্রতিরোধে ইনপুট স্যানিটাইজ করুন

5. ব্যবহার পর্যবেক্ষণ করুন

রেট সীমার মধ্যে থাকতে এবং খরচ অপ্টিমাইজ করতে আপনার API ব্যবহার ট্র্যাক করুন:

  • অনুরোধের সংখ্যা ও রেসপন্সের সময় লগ করুন
  • ত্রুটির হার পর্যবেক্ষণ করুন
  • অস্বাভাবিক প্যাটার্নের জন্য সতর্কতা সেট করুন

সহায়তা

Chat API-তে সহায়তা দরকার?

Changelog

v2.0.0 (Current)

  • Chat API-র প্রাথমিক রিলিজ
  • প্রাকৃতিক ভাষার query সমর্থন
  • রিয়েল-টাইম ওয়েব সার্চ ইন্টিগ্রেশন
  • সূত্রের উদ্ধৃতিসহ AI-উৎপন্ন উত্তর