Felo APIs
Chat API
কোয়েরি বিশ্লেষণ, ওয়েব রিসোর্স ও citations সহ AI কথোপকথনভিত্তিক সার্চ যুক্ত করুন।
/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 নিচের অপারেশনগুলো করে:
- আপনার query বিশ্লেষণ ও অপ্টিমাইজ করে
- প্রাসঙ্গিক তথ্যের জন্য ওয়েব সার্চ করে
- সার্চ ফলাফল র্যাংক ও ফিল্টার করে
- সূত্রের ভিত্তিতে একটি বিস্তারিত AI উত্তর তৈরি করে
- সূত্রের উদ্ধৃতিসহ উত্তর ফেরত দেয়
ব্যবহারের ক্ষেত্র:
- কথোপকথনমূলক 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
| Header | আবশ্যক | বর্ণনা |
|---|---|---|
Authorization | হ্যাঁ | Bearer YOUR_API_KEY ফরম্যাটে আপনার API Key |
Content-Type | হ্যাঁ | অবশ্যই application/json হতে হবে |
Body প্যারামিটার
| প্যারামিটার | ধরন | আবশ্যক | বর্ণনা | সীমাবদ্ধতা |
|---|---|---|---|---|
query | string | হ্যাঁ | ব্যবহারকারীর প্রশ্ন বা সার্চ query | 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 | অতিরিক্ত message (সফল অনুরোধে null) |
data | object | রেসপন্স ডেটা (status "ok" হলে কেবল তখনই থাকে) |
data.id | string | এই chat সেশনের অনন্য শনাক্তকারী |
data.message_id | string | এই নির্দিষ্ট message-এর অনন্য শনাক্তকারী |
data.answer | string | query-র AI-উৎপন্ন উত্তর |
data.query_analysis | object | ব্যবহারকারীর query-র বিশ্লেষণ |
data.query_analysis.queries | string[] | ব্যবহারকারীর ইনপুট থেকে উদ্ভূত অপ্টিমাইজ করা সার্চ query |
data.resources | array | উত্তর তৈরিতে ব্যবহৃত ওয়েব উৎসের তালিকা |
data.resources[].link | string | উৎসের URL |
data.resources[].title | string | উৎস পেজের শিরোনাম |
data.resources[].snippet | string | উৎস থেকে প্রাসঙ্গিক অংশ |
ত্রুটি রেসপন্স
ত্রুটি ঘটলে API শেয়ার করা error envelope ফেরত দেয়:
{
"status": 401,
"code": "UNAUTHORIZED",
"message": "API Key is required",
"request_id": "..."
}ত্রুটি রেসপন্স ফিল্ড
| ফিল্ড | ধরন | বর্ণনা |
|---|---|---|
status | number | HTTP স্ট্যাটাস কোড; সফল রেসপন্স "ok" ব্যবহার করে |
code | string | ত্রুটির ধরন শনাক্তকারী error code |
message | string | মানুষ-পাঠযোগ্য ত্রুটির বর্ণনা |
request_id | string | এই অনুরোধের অনন্য শনাক্তকারী (সহায়তার জন্য উপযোগী) |
Error Codes (ত্রুটি কোড)
| HTTP | কোড | অর্থ |
|---|---|---|
| 400 | Endpoint ভ্যালিডেশন কোড | query ফিল্ড অনুপস্থিত, খালি বা অতিরিক্ত দীর্ঘ; নির্দিষ্ট সমস্যার জন্য message পড়ুন |
| 401 | UNAUTHORIZED | API key অনুপস্থিত, অবৈধ বা প্রত্যাহৃত |
| 429 | RATE_LIMITED | একটি রেট সীমা অতিক্রম হয়েছে |
| 502 | CHAT_FAILED | অভ্যন্তরীণ সার্ভিস ত্রুটি |
| 503 | SERVICE_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 backoff3. রেসপন্স cache করুন
API কল কমাতে এবং রেসপন্সের সময় উন্নত করতে অভিন্ন query-র রেসপন্স cache করার কথা ভাবুন।
4. ইনপুট যাচাই করুন
API-তে পাঠানোর আগে ব্যবহারকারীর ইনপুট যাচাই করুন:
- query খালি নয় তা নিশ্চিত করুন
- query-র দৈর্ঘ্য দেখুন (1-2000 অক্ষর)
- ইনজেকশন আক্রমণ প্রতিরোধে ইনপুট স্যানিটাইজ করুন
5. ব্যবহার পর্যবেক্ষণ করুন
রেট সীমার মধ্যে থাকতে এবং খরচ অপ্টিমাইজ করতে আপনার API ব্যবহার ট্র্যাক করুন:
- অনুরোধের সংখ্যা ও রেসপন্সের সময় লগ করুন
- ত্রুটির হার পর্যবেক্ষণ করুন
- অস্বাভাবিক প্যাটার্নের জন্য সতর্কতা সেট করুন
সহায়তা
Chat API-তে সহায়তা দরকার?
- Getting Started গাইড দেখুন
- Authentication ডকুমেন্টেশন দেখুন
- আপনার request ID সহ [email protected]তে সহায়তার সাথে যোগাযোগ করুন
Changelog
v2.0.0 (Current)
- Chat API-র প্রাথমিক রিলিজ
- প্রাকৃতিক ভাষার query সমর্থন
- রিয়েল-টাইম ওয়েব সার্চ ইন্টিগ্রেশন
- সূত্রের উদ্ধৃতিসহ AI-উৎপন্ন উত্তর