راهنماها
نمونههای پیادهسازی
الگوهای امتحانشده برای صدا زدن مهوش از اپلیکیشن خودتان، بههمراه سناریوهای کاملی که چند فراخوانی API را با مراحل کنترل دسترسی، ذخیرهسازی و بازبینی ترکیب میکنند؛ همان چیزی که محصولات واقعی لازم دارند.
یک سناریوی واقعی انتخاب کنید
هر سناریوی زیر یک قابلیت کامل محصول را توضیح میدهد: جایگاه مهوش، آنچه یک بار آماده میکنید، آنچه در هر request رخ میدهد، یک پیادهسازی سمت سرور و روش مدیریت خطاها. هر سناریو با یک مثال واقعی از یک کسبوکار شروع میشود و یک request واقعی را از ابتدا تا انتها دنبال میکند.
| اگر میخواهید… | از این شروع کنید | قابلیتهای اصلی مهوش |
|---|---|---|
| به کارشناسان پشتیبانی کمک کنید سریعتر و یکدستتر پاسخ دهند | دستیار پشتیبانی در سیستم تیکت | retrieval همراه با ارجاع، moderation، پیشنویس idempotent |
| به مشتریان اجازه دهید دربارهٔ اسناد خودشان بپرسند | پرتال اسناد مشتری | Vector store، file_search، ارجاع |
| تماس تلفنی را به متن و پیگیری تبدیل کنید | میز پشتیبانی صوتی | تبدیل گفتار به متن، response، تبدیل متن به گفتار |
| حجم بزرگی از سوابق را یکشبه تحلیل یا برچسبگذاری کنید | پردازش انبوه تیکتها | Batch، خروجی JSON ساختاریافته |
| به محصولی که مشتریان زیادی دارد AI اضافه کنید | اتصال SaaS چندمشتری | پروژه، API key ثابت، محدودیت برای هر مشتری |
| روی سایت یا اپ خود دستیار چت زنده داشته باشید | چت تعاملی پشتیبانی | Stream، حفظ وضعیت گفتوگو، پیوست فایل |
با نزدیکترین سناریو به محصولتان شروع کنید و برای فیلدهای دقیق از عملیات API پیوندشده استفاده کنید.
اپلیکیشن سمت سرور
پایهٔ همهٔ یکپارچهسازیها این است: مرورگر یا اپ موبایل با بکاند شما صحبت میکند و بکاند شما با مهوش.
- کاربر خودتان را احراز کنید و تصمیم بگیرید اجازهٔ استفاده از این قابلیت را دارد یا نه.
- prompt را در سرور از دادههای مطمئن و ورودی کاربر بسازید؛ prompt کامل، مدل یا پروژه را بدون بررسی از مرورگر نپذیرید.
- مهوش را با API key پروژه، یک idempotency key و یک timeout صدا بزنید.
- نتیجهای کنترلشده برگردانید (مثلاً متن، وضعیت و شناسههای خودتان)، نه پاسخ خام مهوش را.
// Run on your server. Never send the project key to the browser.
export async function answerQuestion(question) {
const response = await fetch("https://api.mahvashai.ir/v1/responses", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.MAHVASH_API_KEY,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({ model: "auto", input: question }),
});
if (!response.ok) throw new Error("Mahvash HTTP " + response.status);
const result = await response.json();
return { id: result.id, output: result.output };
}کلاینت سازگار با OpenAI SDK
اگر از قبل از OpenAI SDK استفاده میکنید، فقط دو تنظیم را عوض کنید: آدرس پایه (https://api.mahvashai.ir/v1) و کلید (API key پروژهٔ مهوش). عملیات پشتیبانیشدهٔ /v1 بدون تغییر کار میکنند. برای endpointهای مدیریت فضای کاری زیر /api/v1 از HTTP مستقیم استفاده کنید.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MAHVASH_API_KEY,
baseURL: "https://api.mahvashai.ir/v1",
});
const response = await client.responses.create({
model: "auto",
input: "Say hello in one sentence.",
});
console.log(response.output_text);یک فایل برای چند request
وقتی کاربران در چند نوبت به یک فایل اشاره میکنند (مثلاً یک قرارداد در یک گفتوگو یا یک بریف در ابزار نگارش)، آن را یک بار بهعنوان asset پروژه آپلود کنید، UUID آن را کنار گفتوگو ذخیره کنید و هر بار لازم شد در asset_ids بفرستید. شناسهٔ asset فقط در همان پروژه معتبر است؛ هرگز آن را بین پروژهها یا مشتریان مختلف به کار نبرید.
curl https://api.mahvashai.ir/api/v1/chat/assets/upload \
-H "Authorization: Bearer $MAHVASH_API_KEY" \
-F 'file=@./brief.pdf'
# Keep the returned asset UUID in ASSET_ID, then use it in a supported request:
curl https://api.mahvashai.ir/v1/responses \
-H "Authorization: Bearer $MAHVASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"auto","input":"Summarize this file","asset_ids":["<asset-uuid>"]}'رابط کاربری با stream
stream: true بفرستید، رویدادها را پیوسته بخوانید، response.output_text.delta را به پاسخ در حال نمایش اضافه کنید و با رسیدن response.completed، response.incomplete یا response.failed کار را تمام کنید. قطع شدن stream به معنای شکست نیست: شناسهٔ response را از response.created نگه دارید و نتیجه را با آن بازیابی کنید.
const response = await fetch("https://api.mahvashai.ir/v1/responses", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.MAHVASH_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ model: "auto", input: "Say hello", stream: true }),
});
if (!response.ok || !response.body) throw new Error("HTTP " + response.status);
const reader = response.body.getReader();
const decoder = new TextDecoder();
let pending = "";
let terminal = false;
while (!terminal) {
const { value, done } = await reader.read();
if (done) break;
pending += decoder.decode(value, { stream: true });
const frames = pending.split(/\r?\n\r?\n/);
pending = frames.pop() ?? "";
for (const frame of frames) {
const data = frame.split(/\r?\n/).filter(line => line.startsWith("data:"))
.map(line => line.slice(5).trim()).join("\n");
if (!data || data === "[DONE]") continue;
const event = JSON.parse(data);
if (event.type === "response.output_text.delta") process.stdout.write(event.delta);
if (["response.completed", "response.incomplete", "response.failed"].includes(event.type)) terminal = true;
}
}
if (!terminal) throw new Error("Stream disconnected; inspect the response before retrying.");worker پسزمینه و webhook
برای کاری که کسی منتظرش نیست، request را با background: true بفرستید، شناسهٔ response را در جدول کارهای خودتان ذخیره کنید و هر وقت خواندن وضعیت یا یک webhook معتبر، وضعیت پایانی را گزارش کرد، کار را تمامشده علامت بزنید. پیش از بهروزرسانی وضعیت در سیستم خودتان، رویدادهای تکراری webhook را بر اساس شناسه کنار بگذارید.
curl https://api.mahvashai.ir/v1/responses \
-H "Authorization: Bearer $MAHVASH_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: <unique-job-id>" \
-d '{"model":"auto","input":"Summarize this document","background":true}'
# Save the returned response ID, then retrieve its current status:
curl https://api.mahvashai.ir/v1/responses/<response-id> \
-H "Authorization: Bearer $MAHVASH_API_KEY"