Genetic tag: repo.platform.sdk.project_context.gen1
EN: PROJECT_CONTEXT.md
Почти каждый tenant API привязан к проекту. SDK хранит scope как projectId в конфиге и заголовок X-Project-ID.
| Слой | Как |
|---|---|
| Конструктор | new AgentStackSDK({ projectId: 42, … }) |
| После login | project_id сессии → HTTPClient.updateConfig (в AgentAuth.login) |
| Смена workspace | sdk.updateProjectId(42) |
| Браузер SPA | localStorage / sessionStorage: project_id, ap_project_id, as_project_id |
| Заголовок | headers: { 'X-Project-ID': '42' } на запрос |
| URL / body | /api/projects/{id}/…, home_project_id, query project_id |
Чтение: sdk.getProjectId() · guard: sdk.requireProjectId() · AI: assertProjectIdConfigured(sdk).
/auth/login— заголовокX-Project-ID: 1(bootstrap экосистемы). В bodyproject_idвыбирает проект сессии.- Остальные маршруты — если заголовок не задан, SDK шлёт
String(config.projectId). /storage/*— приproject_idв query заголовок выравнивается.- Модули с path — project в path/args, напр.
sdk.platform.economy.ledger.getBalance(projectId, …).
import {
AgentStackSDK,
resolveAgentStackApiBase,
assertProjectIdConfigured,
} from '@agentstack/sdk';
const sdk = new AgentStackSDK({
apiBase: resolveAgentStackApiBase(),
apiKey: process.env.AGENTSTACK_API_KEY,
projectId: Number(process.env.AGENTSTACK_PROJECT_ID),
});
await sdk.platform.auth.login({
email: process.env.AGENTSTACK_EMAIL!,
password: process.env.AGENTSTACK_PASSWORD!,
project_id: Number(process.env.AGENTSTACK_PROJECT_ID),
});
const projectId = assertProjectIdConfigured(sdk);const projects = await sdk.platform.api.getProjects();
sdk.updateProjectId(projects[0].id);createMessengerEmbed() берёт httpClient.getConfig().projectId → ecosystemProjectId.
Admin (sdkAudience: platform_operator, project_id=1) — отдельно: INTEGRATOR_SCOPE_ru.md.
normalizeProjectId(value)readProjectIdFromBrowserStorage()resolveEffectiveProjectId(configProjectId)