پایگاه دانش داخلی
برای هر تیم یک فضای کاری، تا پرسشهای کارکنان از روی سندهای داخلی پاسخ بگیرد.
کارکنان از سیاستها، راهنماها و قراردادهایی میپرسند که تیمشان مالک آنهاست — و به سندهای تیم دیگر دسترسی ندارند.
معماری
برای هر تیم یک فضای کاری. چون بازیابی هرگز از مرز فضای کاری عبور نمیکند، قاعدهٔ دسترسی را خود مرز اعمال میکند، نه فیلتری که باید یادتان بماند اعمالش کنید.
- هر تیم را در پیکربندی خودتان به یک شناسهٔ فضای کاری نگاشت کنید.
- پیش از انتخاب فضای کاری، تیم کارمندی که وارد شده را مشخص کنید.
- شناسهٔ کارمندی را بهعنوان external_user_id بفرستید تا تاریخچه شخصی بماند.
راهاندازی
برای هر تیم یک فضای کاری بسازید و سندهای همان تیم را در آن بارگذاری کنید. نگاشت را در پیکربندی خودتان نگه دارید، نه اینکه از عنوان فضای کاری استخراجش کنید — عنوانها قابل ویرایشاند.
کد
جستوجوی تیم پیش از هر درخواستی انجام میشود تا تیم ناشناخته زود شکست بخورد، نه اینکه از مجموعهٔ اشتباهی بپرسد:
const BASE = "https://api.daneshyar.info/api/v1";
const KEY = process.env.DANESHYAR_API_KEY;
/**
* One workspace per team. Staff in Engineering never retrieve HR's documents,
* because retrieval cannot cross a workspace boundary — you don't filter, the
* boundary does it.
*/
const TEAM_WORKSPACES = {
engineering: "8f14e45f-ceea-467a-9f4c-1a2b3c4d5e6f",
people: "1d4c7b90-3e58-4a21-bf06-9c2e5d8a7f43",
};
export async function askAsEmployee({ employeeId, team, question }) {
const workspaceId = TEAM_WORKSPACES[team];
if (!workspaceId) throw new Error(`Unknown team: ${team}`);
const res = await fetch(`${BASE}/workspaces/${workspaceId}/chat/`, {
method: "POST",
headers: { "X-API-Key": KEY, "Content-Type": "application/json" },
body: JSON.stringify({
// A stable employee id — not an email, which changes on a name change.
external_user_id: employeeId,
message: question,
}),
});
if (!res.ok) {
const body = await res.json().catch(() => ({}));
throw new Error(body.message ?? body.detail ?? `HTTP ${res.status}`);
}
const { data } = await res.json();
return data.assistant_message;
}
/** Their own history, and only theirs. */
export async function historyFor({ employeeId, team }) {
const url = new URL(`${BASE}/workspaces/${TEAM_WORKSPACES[team]}/chat/sessions/`);
url.searchParams.set("external_user_id", employeeId);
const res = await fetch(url, { headers: { "X-API-Key": KEY } });
const { data } = await res.json();
return data.results;
}نتیجه
هر کارمند پاسخها را دقیقاً از سندهایی میگیرد که تیمش اجازهٔ دیدنشان را دارد، با تاریخچهٔ گفتوگوی خودش — و اضافه کردن یک تیم یعنی یک فضای کاری و یک خط پیکربندی.