راهنماها
سازمانها و پروژهها
هر request داخل یک سازمان و یک پروژه اجرا میشود. در این صفحه میبینید سازمان و پروژه چه هستند، request چطور آنها را انتخاب میکند، چه کسی به کدام پروژه دسترسی دارد و فضای کاری محصولتان را چطور سازماندهی کنید.
مدل مالکیت
مهوش هرچه میسازید را در یک ساختار دوسطحی نگه میدارد:
- سازمان مرز اصلی جداسازی است. اعضایی با نقش مشخص، یک کیف پول که هزینهٔ همهٔ کارها را میپردازد، و محدودیتهای مصرف و بودجه دارد. هیچ سازمانی از وجود سازمانهای دیگر خبر ندارد.
- پروژه فضای کاری داخل سازمان است. هر response، گفتوگو، فایل، asset، vector store، prompt، منبع داده، webhook و API key دقیقاً به یک پروژه تعلق دارد.
ساختار معمول یک شرکت چیزی شبیه این است:
Organization "Acme" tenant, members, wallet, limits
├─ Members Sara (ADMIN), Ali (MEMBER), Nadia (VIEWER)
├─ Teams Support, Marketing
├─ Project "default" open to every member requests with no selector land here
├─ Project "support" open to every member support copilot: keys, files, prompts
└─ Project "campaigns" restricted: Marketing team only granted teams can reach itهر حساب با یک سازمان شخصی و یک پروژهٔ پیشفرض ساخته میشود؛ پس اگر بهتنهایی کار میکنید، لازم نیست نگران این صفحه باشید: requestهایی که سازمان یا پروژهای مشخص نکنند، در همان پروژهٔ پیشفرض اجرا میشوند. این ساختار وقتی اهمیت پیدا میکند که همتیمی اضافه کنید، به چند مشتری سرویس بدهید یا بخواهید محیطها را از هم جدا کنید.
نکته:مالکیت تغییر نمیکند. پروژه هیچوقت به سازمان دیگری منتقل نمیشود و هیچ منبعی هم به پروژهٔ دیگری نمیرود. برای جابهجایی، منبع تازه را در محل جدید بسازید.
پروژه چه چیزی به شما میدهد
پروژه ابزار اصلی شما برای جداسازی داخل یک سازمان است. هرچه داخل یک پروژه باشد، این موارد را مشترک دارد:
- داده: فایل، vector store یا response یک پروژه از پروژهٔ دیگر دیده نمیشود. اگر شناسهای متعلق به پروژهٔ دیگر بفرستید، پاسخ
404میگیرید؛ درست مثل شناسهای که هرگز وجود نداشته است. - credential: هر API key فقط به یک پروژه دسترسی دارد.
- تنظیمات: دستورالعملهای پیشفرض، promptها، منابع داده برای بازیابی، تنظیمات ابزارهای مدیریتشده و محل پیشفرض نگهداری ایندکسها.
- محدودیت و بودجه: سقف تعداد request، تعداد کارهای همزمان و سقف هزینهٔ ماهانه را میتوان برای هر پروژه جداگانه تعیین کرد.
روشهای رایج برای تقسیم کار بین پروژهها:
- یک پروژه برای هر قابلیت محصول؛ مثلاً دستیار پشتیبانی و ابزار جستوجوی داخلی، داده و prompt متفاوتی دارند؛
- یک پروژه برای هر محیط؛
stagingوproductionهیچوقت کلید یا سند مشترک ندارند؛ - یک پروژه برای هر مشتری، وقتی یک SaaS چندمشتری میسازید. سناریوی اتصال SaaS چندمشتری را ببینید.
request چطور سازمان و پروژه را انتخاب میکند
مهوش اول سازمان و بعد پروژه را مشخص میکند؛ آن هم پیش از اینکه هیچ دادهای را بخواند یا کاری را شروع کند. دو header اختیاری این انتخاب را تعیین میکنند:
| header | با JWT کاربر | با API key پروژه |
|---|---|---|
X-Mahvash-Organization | یکی از سازمانهایی را که عضو فعالش هستید، با UUID یا slug انتخاب میکند | از قبل روی کلید ثبت شده؛ مقدار متفاوت رد میشود |
X-Mahvash-Project | یکی از پروژههای در دسترس شما در همان سازمان را، با UUID یا slug انتخاب میکند | از قبل روی کلید ثبت شده؛ مقدار متفاوت رد میشود |
| بدون این headerها | سازمان شخصی شما و پروژهٔ پیشفرض آن | سازمان و پروژهای که روی کلید ثبت شده است |
این انتخاب همیشه به همین ترتیب انجام میشود:
| ترتیب | سازمان از کجا تعیین میشود | پروژه از کجا تعیین میشود |
|---|---|---|
| ۱ | سازمانی که روی API key ثبت شده است | پروژهای که روی API key ثبت شده است |
| ۲ | X-Mahvash-Organization، از میان سازمانهایی که عضو فعالشان هستید | X-Mahvash-Project، از میان پروژههایی که به آنها دسترسی دارید |
| ۳ | سازمان شخصی شما | فیلد project در body، اگر endpoint آن را بپذیرد (باید با header یکی باشد) |
| ۴ | — | پروژهٔ پیشفرض سازمان |
چند نکتهٔ مهم:
X-Mahvash-Organizationفقط از میان سازمانهایی انتخاب میکند که شما عضو فعال آنها هستید. با آن نمیتوان به سازمانی رسید که عضوش نیستید.X-Mahvash-Projectدامنهٔ request را محدودتر میکند؛ هرگز دسترسی بیشتری نمیدهد.- اگر سازمان یا پروژهٔ ناشناختهای بفرستید، پاسخ
404میگیرید و request بیصدا به حالت پیشفرض برنمیگردد. کلاینتی که فکر میکند برای یک شرکت کار میکند، نباید بیخبر در شرکت دیگری کار کند. - اگر endpointی فیلد
projectرا در body بپذیرد، مقدار آن باید با header یکی باشد. - ادامهٔ گفتوگو با
previous_response_idیاchat_idهمیشه در پروژهای انجام میشود که صاحب آن گفتوگوست.
# A person working in the "support" project of the "acme" organization
curl https://api.mahvashai.ir/v1/responses \
-H "Authorization: Bearer $MAHVASH_USER_JWT" \
-H "X-Mahvash-Organization: acme" \
-H "X-Mahvash-Project: support" \
-H "Content-Type: application/json" \
-d '{"model": "auto", "input": "Summarize today\u0027s open tickets."}'
# A project API key already knows its organization and project
curl https://api.mahvashai.ir/v1/responses \
-H "Authorization: Bearer $MAHVASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "auto", "input": "Summarize today\u0027s open tickets."}'نقشها و دسترسی به پروژه
هر عضو یک نقش در سازمان دارد. نقشها به این ترتیب از کم به زیاد هستند: VIEWER < MEMBER < ADMIN < OWNER.
| نقش | تواناییهای معمول |
|---|---|
VIEWER | دیدن پروژهها، گفتوگوها، فایلها، vector storeها و promptهایی که به آنها دسترسی دارد |
MEMBER | همهٔ کارهای viewer، بهعلاوهٔ ساختن response، فایل، vector store، batch و prompt |
ADMIN | همهٔ کارهای member، بهعلاوهٔ مدیریت پروژهها، API keyها، grantها، webhookها، اعضا، تیمها، سابقهٔ تغییرات و گزارشهای مصرف |
OWNER | کنترل کامل سازمان؛ آخرین مالک سازمان را نمیتوان حذف کرد یا نقشش را پایین آورد |
هیچکس نمیتواند نقشی بالاتر از نقش خودش به دیگران بدهد و هر سازمان همیشه دستکم یک مالک (owner) دارد.
پروژههای عمومی و محدود
بهطور پیشفرض، هر پروژه برای همهٔ اعضای فعال سازمان و با همان نقش سازمانیشان باز است. در سازمانهایی که از پروژهٔ محدود (restricted) استفاده میکنند، چنین پروژهای فقط برای مالکان، مدیران و تیمها یا اعضایی باز است که در یک grant نامشان آمده باشد:
# Create a team, then give it access to one restricted project
curl -X POST https://api.mahvashai.ir/api/v1/tenancy/teams \
-H "Authorization: Bearer $MAHVASH_USER_JWT" \
-H "X-Mahvash-Organization: acme" \
-H "Content-Type: application/json" \
-d '{"name": "Marketing"}'
curl -X POST https://api.mahvashai.ir/api/v1/tenancy/projects/<project-uuid>/grants \
-H "Authorization: Bearer $MAHVASH_USER_JWT" \
-H "X-Mahvash-Organization: acme" \
-H "Content-Type: application/json" \
-d '{"team": "<team-uuid>", "role": "MEMBER"}'دو نکته که بهراحتی اشتباه برداشت میشوند:
- grant فقط تعیین میکند به کجا دسترسی دارید، نه اینکه آنجا چه کاری میتوانید بکنید. نقش نهایی، پایینترینِ نقش سازمانی و نقش grant است؛ پس
VIEWERی که grant با نقشMEMBERدارد، همچنان فقط میتواند بخواند. - پروژهای که به آن دسترسی ندارید، طوری رفتار میکند که انگار وجود ندارد. پاسخ آن
404است، نه403؛ تا از روی فهرستها یا شناسهها نتوان فهمید تیمهای دیگر چه دارند.
محدودیتها و بودجه
برای سازمان، هر پروژه و حتی هر API key میتوانید سقف تعداد request در دقیقه (requests_per_minute) و سقف کارهای همزمان (max_active_runs) تعیین کنید؛ برای سازمان و پروژه هم میتوانید بودجهٔ ماهانه و آستانهٔ هشدار بگذارید:
curl -X PATCH https://api.mahvashai.ir/api/v1/tenancy/organizations/settings \
-H "Authorization: Bearer $MAHVASH_USER_JWT" \
-H "X-Mahvash-Organization: acme" \
-H "Content-Type: application/json" \
-d '{"requests_per_minute": 120, "max_active_runs": 4, "monthly_budget_usd": "500.00", "budget_alert_percent": 80}'- سختگیرانهترین محدودیت اعمال میشود. پروژه نمیتواند محدودیت سازمان را بالا ببرد و کلید هم نمیتواند محدودیت پروژه را. سادهترین راه برای کنترل کلیدی که به یک شریک تجاری میدهید، گذاشتن محدودیت کوچک روی همان کلید است.
- مقدار
nullیعنی «از سطح بالاتر پیروی کن»، نه «بدون محدودیت». - اگر از سقف تعداد request عبور کنید، پاسخ
429همراه باRetry-Afterمیگیرید؛ اگر از سقف کارهای همزمان عبور کنید، کار تازه همان ابتدا پذیرفته نمیشود. monthly_budget_usdسقفی قطعی برای هر ماه میلادی به وقت UTC است و کاری که از آن عبور کند پذیرفته نمیشود.budget_alert_percentفقط هشدار میدهد و جلوی هیچ کاری را نمیگیرد.
مدیریت فضای کاری از طریق API
فضای کاری را با endpointهای /api/v1/tenancy و JWT کاربر مدیریت میکنید؛ هرگز با API key پروژه. با X-Mahvash-Organization مشخص کنید کدام سازمان را مدیریت میکنید. یک اسکریپت راهاندازی معمولی این مراحل را دارد:
- ۱با
GET /api/v1/tenancy/organizationsسازمانهایی را که عضوشان هستید ببینید و باGET /api/v1/tenancy/organizationبررسی کنید request به کدام سازمان و پروژه میرسد. - ۲با
POST /api/v1/tenancy/projectsپروژه بسازید. - ۳در صورت نیاز پروژه را تنظیم کنید: promptها، منابع داده و ابزارهای مدیریتشده.
- ۴API key پروژه را صادر کنید و در سامانهٔ مدیریت secretها نگه دارید.
- ۵کلید را به سرویسی بدهید که قرار است requestهای هوش مصنوعی را بفرستد.
curl https://api.mahvashai.ir/api/v1/tenancy/organizations \
-H "Authorization: Bearer $MAHVASH_USER_JWT"
# Which organization, project and role did this request resolve to?
curl https://api.mahvashai.ir/api/v1/tenancy/organization \
-H "Authorization: Bearer $MAHVASH_USER_JWT" \
-H "X-Mahvash-Organization: acme"curl -X POST https://api.mahvashai.ir/api/v1/tenancy/projects \
-H "Authorization: Bearer $MAHVASH_USER_JWT" \
-H "X-Mahvash-Organization: acme" \
-H "Content-Type: application/json" \
-d '{"name": "Support assistant", "slug": "support", "description": "Ticket drafting"}'ساخت پروژه، صدور کلید و مدیریت grantها و webhookها به نقش ADMIN نیاز دارد. پروژهٔ پیشفرض قابل بایگانی یا حذف نیست، چون requestهایی که پروژهای مشخص نمیکنند به آن میرسند. حذف هر پروژهٔ دیگر در واقع آن را بایگانی میکند و سوابقش برای حسابداری باقی میماند.
صفحههای مرتبط در مرجع API: سازمانها، پروژهها، API credentialها، اعضا، تیمها و grantهای دسترسی.