AiFO AiFO مستندات AiFO

نمای کلی

Files API به شما امکان می‌دهد یک بار فایل را آپلود کنید و با شناسهٔ AiFO (file_…) در درخواست‌های Chat دوباره استفاده کنید. فایل متعلق به workspace کلید API است، خصوصی است، و از مسیر عمومی /media/ سرو نمی‌شود.

  • حداکثر حجم هر فایل: ۲۰ مگابایت
  • purpose فعلی: فقط chat
  • مالکیت: workspace (کلیدهای همان workspace می‌توانند استفاده کنند)
  • مدل‌های OpenRouter با پشتیبانی file در پروفایل مؤثر پشتیبانی می‌شوند
  • OpenAI Chat همچنان ورودی file را رد می‌کند (unsupported_modality)

POST /v1/files

آپلود multipart/form-data با فیلدهای file (باینری) و purpose=chat. پاسخ metadata آماده (READY) است و bucket/object key برنمی‌گردد.

curl https://api.aifoapp.ir/v1/files \
  -H "Authorization: Bearer aifo_sk_live_YOUR_API_KEY" \
  -F "file=@./document.pdf;type=application/pdf" \
  -F "purpose=chat"
import requests

response = requests.post(
    "https://api.aifoapp.ir/v1/files",
    headers={"Authorization": "Bearer aifo_sk_live_YOUR_API_KEY"},
    files={"file": ("document.pdf", open("document.pdf", "rb"), "application/pdf")},
    data={"purpose": "chat"},
)
print(response.json())
const form = new FormData();
form.append("file", fileInput.files[0]); // File from <input type="file">
form.append("purpose", "chat");

const response = await fetch("https://api.aifoapp.ir/v1/files", {
  method: "POST",
  headers: { Authorization: "Bearer aifo_sk_live_YOUR_API_KEY" },
  body: form, // do NOT base64-encode in the browser
});
const file = await response.json();
console.log(file.id); // file_...
import fs from "node:fs";
import FormData from "form-data";

const form = new FormData();
form.append("file", fs.createReadStream("./document.pdf"), {
  filename: "document.pdf",
  contentType: "application/pdf",
});
form.append("purpose", "chat");

const response = await fetch("https://api.aifoapp.ir/v1/files", {
  method: "POST",
  headers: {
    Authorization: "Bearer aifo_sk_live_YOUR_API_KEY",
    ...form.getHeaders(),
  },
  body: form,
});
console.log(await response.json());
{
  "id": "file_...",
  "object": "file",
  "bytes": 12345,
  "created_at": 1710000000,
  "filename": "document.pdf",
  "purpose": "chat",
  "status": "ready",
  "mime_type": "application/pdf"
}

GET /v1/files و GET /v1/files/:id

فهرست فایل‌های workspace جاری (بدون حذف‌شده‌ها) با limit و after برای صفحه‌بندی، و دریافت metadata یک فایل. فایل workspace دیگر همیشه file_not_found برمی‌گرداند.

curl "https://api.aifoapp.ir/v1/files?limit=20" \
  -H "Authorization: Bearer aifo_sk_live_YOUR_API_KEY"

curl "https://api.aifoapp.ir/v1/files/file_..." \
  -H "Authorization: Bearer aifo_sk_live_YOUR_API_KEY"
import requests

headers = {"Authorization": "Bearer aifo_sk_live_YOUR_API_KEY"}
listing = requests.get("https://api.aifoapp.ir/v1/files", headers=headers, params={"limit": 20})
meta = requests.get("https://api.aifoapp.ir/v1/files/file_...", headers=headers)
print(listing.json(), meta.json())
const headers = { Authorization: "Bearer aifo_sk_live_YOUR_API_KEY" };
const listing = await fetch("https://api.aifoapp.ir/v1/files?limit=20", { headers }).then((r) => r.json());
const meta = await fetch("https://api.aifoapp.ir/v1/files/file_...", { headers }).then((r) => r.json());
console.log(listing, meta);
const headers = { Authorization: "Bearer aifo_sk_live_YOUR_API_KEY" };
const listing = await fetch("https://api.aifoapp.ir/v1/files?limit=20", { headers }).then((r) => r.json());
const meta = await fetch("https://api.aifoapp.ir/v1/files/file_...", { headers }).then((r) => r.json());
console.log(listing, meta);

DELETE /v1/files/:id

حذف idempotent در سطح workspace. پس از حذف، استفاده در Chat با file_not_found شکست می‌خورد.

curl -X DELETE "https://api.aifoapp.ir/v1/files/file_..." \
  -H "Authorization: Bearer aifo_sk_live_YOUR_API_KEY"

استفاده از file_id در Chat Completions

curl https://api.aifoapp.ir/v1/chat/completions \
  -H "Authorization: Bearer aifo_sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemini-2.5-flash-lite",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "text", "text": "این سند درباره چیست؟"},
        {"type": "file", "file": {"file_id": "file_..."}}
      ]
    }]
  }'
import requests

response = requests.post(
    "https://api.aifoapp.ir/v1/chat/completions",
    headers={"Authorization": "Bearer aifo_sk_live_YOUR_API_KEY"},
    json={
        "model": "google/gemini-2.5-flash-lite",
        "messages": [{
            "role": "user",
            "content": [
                {"type": "text", "text": "این سند درباره چیست؟"},
                {"type": "file", "file": {"file_id": "file_..."}},
            ],
        }],
    },
)
print(response.json())
const response = await fetch("https://api.aifoapp.ir/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: "Bearer aifo_sk_live_YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "google/gemini-2.5-flash-lite",
    messages: [{
      role: "user",
      content: [
        { type: "text", text: "این سند درباره چیست؟" },
        { type: "file", file: { file_id: "file_..." } },
      ],
    }],
  }),
});
console.log(await response.json());
const response = await fetch("https://api.aifoapp.ir/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: "Bearer aifo_sk_live_YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "google/gemini-2.5-flash-lite",
    messages: [{
      role: "user",
      content: [
        { type: "text", text: "این سند درباره چیست؟" },
        { type: "file", file: { file_id: "file_..." } },
      ],
    }],
  }),
});
console.log(await response.json());