افزودن ارائه‌دهندهٔ 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
+11
View File
@@ -132,6 +132,17 @@ class AiModelCredentialRow(Base):
encrypted_api_key: Mapped[str] = mapped_column(Text, default="", nullable=False)
is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
created_at: Mapped[datetime] = _created()
# --- agy account columns (empty for API-key credentials) -----------------
#: Google account email this credential belongs to; also the rotation label.
email: Mapped[str] = mapped_column(String(320), default="", nullable=False)
#: Antigravity ``cloudaicompanionProject`` id resolved during login.
project_id: Mapped[str] = mapped_column(String(160), default="", nullable=False)
#: ``active`` | ``cooldown`` | ``error`` — see ``CredentialStatus``.
status: Mapped[str] = mapped_column(String(16), default="active", nullable=False)
#: When set and in the future, the rotation pool skips this account.
cooldown_until: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
last_error: Mapped[str] = mapped_column(String(512), default="", nullable=False)
last_used_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
class AiModelRow(Base):