افزودن ارائه‌دهندهٔ agy (Google Antigravity) با لاگین headless و پول چرخشی اکانت

- Adapter اکانت‌محور با چرخش round-robin و بنچ‌شدن خودکار روی ۴۲۹/۴۰۱
- ورود ادمین از طریق URL بازگشتی گوگل (PKCE) و ذخیرهٔ رمزنگاری‌شدهٔ refresh token
- صفحهٔ مدیریت اکانت‌های agy در پنل ادمین به همراه تست و فعال/غیرفعال‌سازی
- مهاجرت Alembic b1c2d3e4f5a6 برای ستون‌های اکانت agy
- seed همیشه کاتالوگ agy را می‌سازد و فقط با AI_DEFAULT_PROVIDER=agy مسیریابی می‌شود
This commit is contained in:
mjalmoudy94
2026-10-13 08:20:27 +03:30
parent 54074f10c3
commit 3d1e98f4fb
25 changed files with 3073 additions and 10 deletions
+30
View File
@@ -438,6 +438,36 @@ export const api = {
`/api/admin/providers/${providerId}/credentials`,
{ method: "POST", body },
),
// agy accounts: OAuth login instead of API keys.
agyAccounts: () =>
apiRequest<import("@agy/contracts").AgyAccount[]>("/api/admin/agy/accounts"),
agyStartLogin: () =>
apiRequest<{ login_id: string; auth_url: string }>(
"/api/admin/agy/accounts/login/start",
{ method: "POST" },
),
agyCompleteLogin: (body: { login_id: string; callback_url: string }) =>
apiRequest<import("@agy/contracts").AgyAccount>(
"/api/admin/agy/accounts/login/complete",
{ method: "POST", body },
),
agySetAccountActive: (accountId: string, active: boolean) =>
apiRequest<import("@agy/contracts").AgyAccount>(
`/api/admin/agy/accounts/${accountId}/${active ? "activate" : "deactivate"}`,
{ method: "POST" },
),
agyDeleteAccount: (accountId: string) =>
apiRequest<null>(`/api/admin/agy/accounts/${accountId}`, { method: "DELETE" }),
agyTestAccount: (accountId: string) =>
apiRequest<{
ok: boolean;
detail: string;
model_internal_name: string;
input_tokens: number;
output_tokens: number;
}>(`/api/admin/agy/accounts/${accountId}/test`, { method: "POST" }),
agyModels: () =>
apiRequest<string[]>("/api/admin/agy/models"),
adminModels: () => apiRequest<import("@agy/contracts").AdminModel[]>("/api/admin/models"),
adminCreateModel: (body: {
provider_id: string;