s-accountpoolkit 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- s_accountpoolkit-0.0.1/.gitignore +8 -0
- s_accountpoolkit-0.0.1/.gitlab-ci.yml +31 -0
- s_accountpoolkit-0.0.1/PKG-INFO +68 -0
- s_accountpoolkit-0.0.1/README.md +50 -0
- s_accountpoolkit-0.0.1/pyproject.toml +55 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/__init__.py +209 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/cli.py +501 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/compat.py +253 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/egress.py +825 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/io.py +621 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/model.py +584 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/providers.py +572 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/ratelimit.py +502 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/rotation.py +523 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/selector.py +574 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/service.py +889 -0
- s_accountpoolkit-0.0.1/src/accountpoolkit/store.py +441 -0
- s_accountpoolkit-0.0.1/tests/test_boundary.py +92 -0
- s_accountpoolkit-0.0.1/tests/test_cli.py +387 -0
- s_accountpoolkit-0.0.1/tests/test_compat.py +234 -0
- s_accountpoolkit-0.0.1/tests/test_egress.py +497 -0
- s_accountpoolkit-0.0.1/tests/test_io.py +422 -0
- s_accountpoolkit-0.0.1/tests/test_model.py +242 -0
- s_accountpoolkit-0.0.1/tests/test_providers.py +410 -0
- s_accountpoolkit-0.0.1/tests/test_ratelimit.py +316 -0
- s_accountpoolkit-0.0.1/tests/test_rotation.py +487 -0
- s_accountpoolkit-0.0.1/tests/test_selector.py +493 -0
- s_accountpoolkit-0.0.1/tests/test_service.py +615 -0
- s_accountpoolkit-0.0.1/tests/test_store.py +214 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Автопубликация на PyPI по семвер-тегу vX.Y.Z через Trusted Publishing (OIDC).
|
|
2
|
+
# Токены НИГДЕ не хранятся: GitLab выдаёт короткоживущий OIDC-токен (PYPI_ID_TOKEN),
|
|
3
|
+
# он одноразово обменивается на PyPI API-токен. Издатель настраивается на pypi.org:
|
|
4
|
+
# Manage -> Publishing -> GitLab (namespace=S-kits, project=accountpoolkit,
|
|
5
|
+
# top-level pipeline file=.gitlab-ci.yml, environment — пусто).
|
|
6
|
+
# Запускается ТОЛЬКО на тег vX.Y.Z (обычный push на main ничего не публикует).
|
|
7
|
+
stages: [publish]
|
|
8
|
+
|
|
9
|
+
publish-pypi:
|
|
10
|
+
stage: publish
|
|
11
|
+
image: ghcr.io/astral-sh/uv:python3.12-bookworm
|
|
12
|
+
rules:
|
|
13
|
+
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/
|
|
14
|
+
id_tokens:
|
|
15
|
+
PYPI_ID_TOKEN:
|
|
16
|
+
aud: pypi
|
|
17
|
+
script:
|
|
18
|
+
- uv build
|
|
19
|
+
# обмен GitLab OIDC -> одноразовый PyPI API-токен (Trusted Publishing):
|
|
20
|
+
- |
|
|
21
|
+
export UV_PUBLISH_TOKEN=$(python3 - <<'PY'
|
|
22
|
+
import json, os, urllib.request
|
|
23
|
+
req = urllib.request.Request(
|
|
24
|
+
"https://pypi.org/_/oidc/mint-token",
|
|
25
|
+
data=json.dumps({"token": os.environ["PYPI_ID_TOKEN"]}).encode(),
|
|
26
|
+
headers={"Content-Type": "application/json"},
|
|
27
|
+
)
|
|
28
|
+
print(json.load(urllib.request.urlopen(req))["token"])
|
|
29
|
+
PY
|
|
30
|
+
)
|
|
31
|
+
- uv publish
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: s-accountpoolkit
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Зрелый пул аккаунтов/сессий поверх librarykit: статус-машина аккаунта, quota/подписки, rate-limit + circuit-breaker, OAuth-ротация (single-flight DCL-lock), egress-пул с quarantine, import/export, headless-фасад. Обобщение gemini-balancer в переиспользуемый доменный слой.
|
|
5
|
+
Author: Dmitry
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Requires-Dist: pydantic>=2.6
|
|
9
|
+
Requires-Dist: s-librarykit>=0.1.17
|
|
10
|
+
Provides-Extra: cli
|
|
11
|
+
Requires-Dist: s-clikit>=0.1; extra == 'cli'
|
|
12
|
+
Provides-Extra: egress
|
|
13
|
+
Requires-Dist: s-librarykit[antibot]>=0.1.17; extra == 'egress'
|
|
14
|
+
Provides-Extra: rest
|
|
15
|
+
Requires-Dist: starlette>=0.37; extra == 'rest'
|
|
16
|
+
Requires-Dist: uvicorn>=0.30; extra == 'rest'
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
|
|
19
|
+
# s-accountpoolkit
|
|
20
|
+
|
|
21
|
+
Зрелый **пул аккаунтов/сессий** поверх [`s-librarykit`](https://gitlab.com/S-kits/librarykit) — доменный слой над `SessionStore`/`SessionPool`/`RateLimiter`/`RotatingAuth`/antibot-транспортами. Обобщение gemini-balancer в переиспользуемый кит.
|
|
22
|
+
|
|
23
|
+
**import-имя** `accountpoolkit` · **dist-имя** `s-accountpoolkit` (как s-librarykit → librarykit).
|
|
24
|
+
|
|
25
|
+
## Что даёт (сверх librarykit)
|
|
26
|
+
|
|
27
|
+
- **Account со статус-машиной** — `available / cooldown / quota_exhausted / disabled / blocked` с причинами и таймстемпами (не строка+`is_active`).
|
|
28
|
+
- **Quota / подписки** — `QuotaData` union (dual-window weekly+5h / header-based / JWT-claims), приоритет `ULTRA > PRO > FREE`, model-level изоляция.
|
|
29
|
+
- **Rate-limit + circuit-breaker** — разбор 429/403/5xx/Retry-After, exp-backoff по причинам, cooldown отдельно от CB-open, авто-recovery.
|
|
30
|
+
- **Selector** — двухслойный (жёсткий eligibility-фильтр → Power-of-Two-Choices), приоритет-каскад подписка→квота→health→reset, sticky-сессии, slow-start.
|
|
31
|
+
- **OAuth-ротация** — single-flight (double-checked-locking) на аккаунт, атомарный rolling-refresh, fallback-цепочка OAuth-клиентов, `invalid_grant` → карантин, проактивный фоновый рефреш, keyring-экспорт токена.
|
|
32
|
+
- **Egress-пул** — привязка аккаунт↔прокси (sticky IP) vs глобальный пул, стратегии (RR/Weighted/LeastConn/Priority/P2C), health-check, **настоящий per-proxy circuit-breaker/quarantine**.
|
|
33
|
+
- **Import/export** — версионированный конверт, идемпотентный upsert, чтение чужих сторов.
|
|
34
|
+
- **Headless `AccountService`-фасад** + `clikit` CLI (json-by-default); опц. REST admin (`[rest]`) + cloudflared tunnel (`[tunnel]`).
|
|
35
|
+
|
|
36
|
+
Секреты — только через librarykit `SessionStore` (envelope KEK/DEK) / `SecretStore` (keyring+fallback). Никакого plaintext.
|
|
37
|
+
|
|
38
|
+
Провайдер-специфика (gemini / codex / …) — через `AccountProvider` Protocol-плагины; ядро её не знает.
|
|
39
|
+
|
|
40
|
+
## Установка
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
uv add s-accountpoolkit # ядро
|
|
44
|
+
uv add "s-accountpoolkit[egress]" # + antibot health-транспорт для egress-пула
|
|
45
|
+
uv add "s-accountpoolkit[cli]" # + CLI `accountpool` (json-by-default)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
import-имя — `accountpoolkit`. `AccountService` — headless-фасад над всеми слоями:
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
import accountpoolkit as apk
|
|
52
|
+
from librarykit.sessions import SessionStore
|
|
53
|
+
|
|
54
|
+
store = apk.AccountStore(SessionStore(root=None, encrypt=True), social="myservice")
|
|
55
|
+
pool = apk.AccountPool(store, tracker=apk.RateLimitTracker())
|
|
56
|
+
svc = apk.AccountService(store=store, pool=pool)
|
|
57
|
+
|
|
58
|
+
choice = await svc.acquire(require_tier=apk.SubscriptionTier.PRO)
|
|
59
|
+
if choice:
|
|
60
|
+
... # запрос через choice.proxy (egress) + choice.account (device/creds)
|
|
61
|
+
await svc.report(choice.ref, response=resp) # 429/5xx → cooldown/circuit-breaker
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Статус
|
|
65
|
+
|
|
66
|
+
Ядро стабильно: статус-машина аккаунта, quota/подписки, rate-limit + circuit-breaker,
|
|
67
|
+
OAuth-ротация (single-flight), egress-пул, import/export, `AccountService`-фасад + CLI.
|
|
68
|
+
Провайдер-плагины подключаются через entry-points `accountpoolkit.providers`.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# s-accountpoolkit
|
|
2
|
+
|
|
3
|
+
Зрелый **пул аккаунтов/сессий** поверх [`s-librarykit`](https://gitlab.com/S-kits/librarykit) — доменный слой над `SessionStore`/`SessionPool`/`RateLimiter`/`RotatingAuth`/antibot-транспортами. Обобщение gemini-balancer в переиспользуемый кит.
|
|
4
|
+
|
|
5
|
+
**import-имя** `accountpoolkit` · **dist-имя** `s-accountpoolkit` (как s-librarykit → librarykit).
|
|
6
|
+
|
|
7
|
+
## Что даёт (сверх librarykit)
|
|
8
|
+
|
|
9
|
+
- **Account со статус-машиной** — `available / cooldown / quota_exhausted / disabled / blocked` с причинами и таймстемпами (не строка+`is_active`).
|
|
10
|
+
- **Quota / подписки** — `QuotaData` union (dual-window weekly+5h / header-based / JWT-claims), приоритет `ULTRA > PRO > FREE`, model-level изоляция.
|
|
11
|
+
- **Rate-limit + circuit-breaker** — разбор 429/403/5xx/Retry-After, exp-backoff по причинам, cooldown отдельно от CB-open, авто-recovery.
|
|
12
|
+
- **Selector** — двухслойный (жёсткий eligibility-фильтр → Power-of-Two-Choices), приоритет-каскад подписка→квота→health→reset, sticky-сессии, slow-start.
|
|
13
|
+
- **OAuth-ротация** — single-flight (double-checked-locking) на аккаунт, атомарный rolling-refresh, fallback-цепочка OAuth-клиентов, `invalid_grant` → карантин, проактивный фоновый рефреш, keyring-экспорт токена.
|
|
14
|
+
- **Egress-пул** — привязка аккаунт↔прокси (sticky IP) vs глобальный пул, стратегии (RR/Weighted/LeastConn/Priority/P2C), health-check, **настоящий per-proxy circuit-breaker/quarantine**.
|
|
15
|
+
- **Import/export** — версионированный конверт, идемпотентный upsert, чтение чужих сторов.
|
|
16
|
+
- **Headless `AccountService`-фасад** + `clikit` CLI (json-by-default); опц. REST admin (`[rest]`) + cloudflared tunnel (`[tunnel]`).
|
|
17
|
+
|
|
18
|
+
Секреты — только через librarykit `SessionStore` (envelope KEK/DEK) / `SecretStore` (keyring+fallback). Никакого plaintext.
|
|
19
|
+
|
|
20
|
+
Провайдер-специфика (gemini / codex / …) — через `AccountProvider` Protocol-плагины; ядро её не знает.
|
|
21
|
+
|
|
22
|
+
## Установка
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
uv add s-accountpoolkit # ядро
|
|
26
|
+
uv add "s-accountpoolkit[egress]" # + antibot health-транспорт для egress-пула
|
|
27
|
+
uv add "s-accountpoolkit[cli]" # + CLI `accountpool` (json-by-default)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
import-имя — `accountpoolkit`. `AccountService` — headless-фасад над всеми слоями:
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
import accountpoolkit as apk
|
|
34
|
+
from librarykit.sessions import SessionStore
|
|
35
|
+
|
|
36
|
+
store = apk.AccountStore(SessionStore(root=None, encrypt=True), social="myservice")
|
|
37
|
+
pool = apk.AccountPool(store, tracker=apk.RateLimitTracker())
|
|
38
|
+
svc = apk.AccountService(store=store, pool=pool)
|
|
39
|
+
|
|
40
|
+
choice = await svc.acquire(require_tier=apk.SubscriptionTier.PRO)
|
|
41
|
+
if choice:
|
|
42
|
+
... # запрос через choice.proxy (egress) + choice.account (device/creds)
|
|
43
|
+
await svc.report(choice.ref, response=resp) # 429/5xx → cooldown/circuit-breaker
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Статус
|
|
47
|
+
|
|
48
|
+
Ядро стабильно: статус-машина аккаунта, quota/подписки, rate-limit + circuit-breaker,
|
|
49
|
+
OAuth-ротация (single-flight), egress-пул, import/export, `AccountService`-фасад + CLI.
|
|
50
|
+
Провайдер-плагины подключаются через entry-points `accountpoolkit.providers`.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "s-accountpoolkit"
|
|
3
|
+
version = "0.0.1"
|
|
4
|
+
description = "Зрелый пул аккаунтов/сессий поверх librarykit: статус-машина аккаунта, quota/подписки, rate-limit + circuit-breaker, OAuth-ротация (single-flight DCL-lock), egress-пул с quarantine, import/export, headless-фасад. Обобщение gemini-balancer в переиспользуемый доменный слой."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = { text = "MIT" }
|
|
7
|
+
requires-python = ">=3.11"
|
|
8
|
+
authors = [{ name = "Dmitry" }]
|
|
9
|
+
# Ядро: librarykit (SessionStore envelope-крипто/атомик, SessionPool, RateLimiter,
|
|
10
|
+
# RotatingAuth, RetryPolicy, SecretStore, antibot proxy-транспорты) + pydantic (модель).
|
|
11
|
+
dependencies = [
|
|
12
|
+
"s-librarykit>=0.1.17",
|
|
13
|
+
"pydantic>=2.6",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
[project.optional-dependencies]
|
|
17
|
+
# rest — headless admin REST (ASGI), tunnel — cloudflared quick-tunnel. Тяжёлое —
|
|
18
|
+
# только с extra, ядро остаётся лёгким (lazy-import).
|
|
19
|
+
rest = ["starlette>=0.37", "uvicorn>=0.30"]
|
|
20
|
+
egress = ["s-librarykit[antibot]>=0.1.17"]
|
|
21
|
+
# cli — clikit pool-CLI (typer+command_kit). Тонкий фасад поверх AccountService;
|
|
22
|
+
# ядро/фасад без него не тянут typer (lazy — cli.py импортирует clikit локально).
|
|
23
|
+
cli = ["s-clikit>=0.1"]
|
|
24
|
+
|
|
25
|
+
[project.scripts]
|
|
26
|
+
accountpool = "accountpoolkit.cli:app"
|
|
27
|
+
|
|
28
|
+
[dependency-groups]
|
|
29
|
+
dev = [
|
|
30
|
+
"pytest>=8.2",
|
|
31
|
+
"pytest-asyncio>=0.23",
|
|
32
|
+
"respx>=0.21",
|
|
33
|
+
"ruff>=0.4",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
[build-system]
|
|
37
|
+
requires = ["hatchling"]
|
|
38
|
+
build-backend = "hatchling.build"
|
|
39
|
+
|
|
40
|
+
[tool.hatch.build.targets.wheel]
|
|
41
|
+
packages = ["src/accountpoolkit"]
|
|
42
|
+
|
|
43
|
+
[tool.ruff]
|
|
44
|
+
line-length = 100
|
|
45
|
+
target-version = "py311"
|
|
46
|
+
src = ["src"]
|
|
47
|
+
|
|
48
|
+
[tool.ruff.lint]
|
|
49
|
+
select = ["E", "F", "I", "B", "UP", "N", "SIM", "RUF"]
|
|
50
|
+
# RUF002/003 — кириллица в докстрингах/комментах намеренная; RUF022 — __all__
|
|
51
|
+
# сгруппирован по модулям осознанно (как в librarykit).
|
|
52
|
+
ignore = ["RUF002", "RUF003", "RUF022"]
|
|
53
|
+
|
|
54
|
+
[tool.pytest.ini_options]
|
|
55
|
+
asyncio_mode = "auto"
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""accountpoolkit — зрелый пул аккаунтов/сессий поверх librarykit.
|
|
2
|
+
|
|
3
|
+
Доменный слой над librarykit-примитивами (SessionStore/SessionPool/RateLimiter/
|
|
4
|
+
RotatingAuth/antibot): статус-машина аккаунта, quota/подписки, rate-limit +
|
|
5
|
+
circuit-breaker, OAuth-ротация с single-flight (DCL) lock, egress-пул с настоящим
|
|
6
|
+
quarantine, import/export, headless AccountService-фасад + CLI. НЕ переписывает
|
|
7
|
+
librarykit — оборачивает его. Провайдер-специфика (gemini/codex/…) подключается
|
|
8
|
+
через Protocol-плагины, ядро её не знает.
|
|
9
|
+
|
|
10
|
+
dist-имя ``s-accountpoolkit`` · import-имя ``accountpoolkit`` (как s-librarykit →
|
|
11
|
+
librarykit). Публичная поверхность собирается здесь по мере наполнения срезов.
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from accountpoolkit import compat
|
|
16
|
+
from accountpoolkit.egress import (
|
|
17
|
+
DEFAULT_FAILURE_THRESHOLD,
|
|
18
|
+
DEFAULT_HEALTH_INTERVAL,
|
|
19
|
+
DEFAULT_HEALTH_TIMEOUT,
|
|
20
|
+
DEFAULT_HEALTH_URL,
|
|
21
|
+
EgressPool,
|
|
22
|
+
EgressStrategy,
|
|
23
|
+
HealthChecker,
|
|
24
|
+
LeastConnStrategy,
|
|
25
|
+
PowerOfTwoStrategy,
|
|
26
|
+
PriorityStrategy,
|
|
27
|
+
Proxy,
|
|
28
|
+
ProxyEntry,
|
|
29
|
+
ProxyState,
|
|
30
|
+
RoundRobinStrategy,
|
|
31
|
+
WeightedStrategy,
|
|
32
|
+
)
|
|
33
|
+
from accountpoolkit.io import (
|
|
34
|
+
CURRENT_FORMAT,
|
|
35
|
+
FORMAT_V1,
|
|
36
|
+
AccountRecord,
|
|
37
|
+
CodexAuthReader,
|
|
38
|
+
ForeignStoreReader,
|
|
39
|
+
FormatMigrator,
|
|
40
|
+
ImportError,
|
|
41
|
+
ImportReport,
|
|
42
|
+
ProtobufReader,
|
|
43
|
+
SqliteReader,
|
|
44
|
+
export,
|
|
45
|
+
import_,
|
|
46
|
+
)
|
|
47
|
+
from accountpoolkit.model import (
|
|
48
|
+
Account,
|
|
49
|
+
AccountState,
|
|
50
|
+
CircuitBreaker,
|
|
51
|
+
ClaimsQuota,
|
|
52
|
+
DeviceProfile,
|
|
53
|
+
DualWindowQuota,
|
|
54
|
+
HeaderQuota,
|
|
55
|
+
ModelWindow,
|
|
56
|
+
ProxyBinding,
|
|
57
|
+
QuotaData,
|
|
58
|
+
SubscriptionTier,
|
|
59
|
+
TokenMeta,
|
|
60
|
+
)
|
|
61
|
+
from accountpoolkit.providers import (
|
|
62
|
+
PROVIDER_ENTRY_POINT_GROUP,
|
|
63
|
+
AccountProvider,
|
|
64
|
+
GeminiProvider,
|
|
65
|
+
NullProvider,
|
|
66
|
+
ProviderRegistry,
|
|
67
|
+
)
|
|
68
|
+
from accountpoolkit.ratelimit import (
|
|
69
|
+
LimitReason,
|
|
70
|
+
LimitSignal,
|
|
71
|
+
RateLimitTracker,
|
|
72
|
+
ResponseLike,
|
|
73
|
+
)
|
|
74
|
+
from accountpoolkit.rotation import (
|
|
75
|
+
DEFAULT_AHEAD_SECONDS,
|
|
76
|
+
DEFAULT_GRACE_SECONDS,
|
|
77
|
+
DEFAULT_SKEW_SECONDS,
|
|
78
|
+
InvalidGrantError,
|
|
79
|
+
OAuthClient,
|
|
80
|
+
OAuthClientMismatch,
|
|
81
|
+
ProactiveRefreshScheduler,
|
|
82
|
+
RefreshError,
|
|
83
|
+
RefreshExhausted,
|
|
84
|
+
RefreshManager,
|
|
85
|
+
RefreshResult,
|
|
86
|
+
RefreshTransportError,
|
|
87
|
+
)
|
|
88
|
+
from accountpoolkit.selector import (
|
|
89
|
+
DEFAULT_PRIORITY_BAND,
|
|
90
|
+
SLOW_START_SECONDS,
|
|
91
|
+
AccountChoice,
|
|
92
|
+
AccountPool,
|
|
93
|
+
EgressResolver,
|
|
94
|
+
)
|
|
95
|
+
from accountpoolkit.service import (
|
|
96
|
+
PROVENANCE_META_KEY,
|
|
97
|
+
SECRET_ALLOW_LIST,
|
|
98
|
+
AccountService,
|
|
99
|
+
AccountView,
|
|
100
|
+
Provenance,
|
|
101
|
+
correlation_id,
|
|
102
|
+
redact,
|
|
103
|
+
with_correlation_id,
|
|
104
|
+
)
|
|
105
|
+
from accountpoolkit.store import (
|
|
106
|
+
APK_META_KEY,
|
|
107
|
+
CREDS_STATE_KEY,
|
|
108
|
+
LOCK_FILENAME,
|
|
109
|
+
AccountStore,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# compat (срез 9) — namespace-модуль back-compat фасада gemini-balancer: символы
|
|
113
|
+
# под `compat.*` (дублируют librarykit-примитивы, нужны лишь gemini-shim). cli
|
|
114
|
+
# (срез 9) НЕ реэкспортируем в корень — он тянет typer/clikit ([cli]-экстра);
|
|
115
|
+
# точка входа `accountpoolkit.cli:app` (project.scripts).
|
|
116
|
+
|
|
117
|
+
__version__ = "0.0.1"
|
|
118
|
+
|
|
119
|
+
__all__ = [
|
|
120
|
+
"__version__",
|
|
121
|
+
# model (срез 1)
|
|
122
|
+
"Account",
|
|
123
|
+
"AccountState",
|
|
124
|
+
"SubscriptionTier",
|
|
125
|
+
"QuotaData",
|
|
126
|
+
"DualWindowQuota",
|
|
127
|
+
"HeaderQuota",
|
|
128
|
+
"ClaimsQuota",
|
|
129
|
+
"ModelWindow",
|
|
130
|
+
"TokenMeta",
|
|
131
|
+
"ProxyBinding",
|
|
132
|
+
"DeviceProfile",
|
|
133
|
+
"CircuitBreaker",
|
|
134
|
+
# store (срез 1)
|
|
135
|
+
"AccountStore",
|
|
136
|
+
"APK_META_KEY",
|
|
137
|
+
"CREDS_STATE_KEY",
|
|
138
|
+
"LOCK_FILENAME",
|
|
139
|
+
# ratelimit (срез 2)
|
|
140
|
+
"RateLimitTracker",
|
|
141
|
+
"LimitReason",
|
|
142
|
+
"LimitSignal",
|
|
143
|
+
"ResponseLike",
|
|
144
|
+
# selector (срез 3)
|
|
145
|
+
"AccountPool",
|
|
146
|
+
"AccountChoice",
|
|
147
|
+
"EgressResolver",
|
|
148
|
+
"DEFAULT_PRIORITY_BAND",
|
|
149
|
+
"SLOW_START_SECONDS",
|
|
150
|
+
# egress (срез 5)
|
|
151
|
+
"EgressPool",
|
|
152
|
+
"Proxy",
|
|
153
|
+
"ProxyEntry",
|
|
154
|
+
"ProxyState",
|
|
155
|
+
"EgressStrategy",
|
|
156
|
+
"RoundRobinStrategy",
|
|
157
|
+
"WeightedStrategy",
|
|
158
|
+
"LeastConnStrategy",
|
|
159
|
+
"PriorityStrategy",
|
|
160
|
+
"PowerOfTwoStrategy",
|
|
161
|
+
"HealthChecker",
|
|
162
|
+
"DEFAULT_HEALTH_URL",
|
|
163
|
+
"DEFAULT_HEALTH_TIMEOUT",
|
|
164
|
+
"DEFAULT_HEALTH_INTERVAL",
|
|
165
|
+
"DEFAULT_FAILURE_THRESHOLD",
|
|
166
|
+
# rotation (срез 4)
|
|
167
|
+
"RefreshManager",
|
|
168
|
+
"ProactiveRefreshScheduler",
|
|
169
|
+
"OAuthClient",
|
|
170
|
+
"RefreshResult",
|
|
171
|
+
"RefreshError",
|
|
172
|
+
"InvalidGrantError",
|
|
173
|
+
"OAuthClientMismatch",
|
|
174
|
+
"RefreshTransportError",
|
|
175
|
+
"RefreshExhausted",
|
|
176
|
+
"DEFAULT_SKEW_SECONDS",
|
|
177
|
+
"DEFAULT_GRACE_SECONDS",
|
|
178
|
+
"DEFAULT_AHEAD_SECONDS",
|
|
179
|
+
# providers (срез 6)
|
|
180
|
+
"AccountProvider",
|
|
181
|
+
"ProviderRegistry",
|
|
182
|
+
"NullProvider",
|
|
183
|
+
"GeminiProvider",
|
|
184
|
+
"PROVIDER_ENTRY_POINT_GROUP",
|
|
185
|
+
# io (срез 7)
|
|
186
|
+
"export",
|
|
187
|
+
"import_",
|
|
188
|
+
"AccountRecord",
|
|
189
|
+
"ImportReport",
|
|
190
|
+
"ImportError",
|
|
191
|
+
"FormatMigrator",
|
|
192
|
+
"ForeignStoreReader",
|
|
193
|
+
"SqliteReader",
|
|
194
|
+
"CodexAuthReader",
|
|
195
|
+
"ProtobufReader",
|
|
196
|
+
"FORMAT_V1",
|
|
197
|
+
"CURRENT_FORMAT",
|
|
198
|
+
# service (срез 8)
|
|
199
|
+
"AccountService",
|
|
200
|
+
"AccountView",
|
|
201
|
+
"Provenance",
|
|
202
|
+
"PROVENANCE_META_KEY",
|
|
203
|
+
"SECRET_ALLOW_LIST",
|
|
204
|
+
"correlation_id",
|
|
205
|
+
"with_correlation_id",
|
|
206
|
+
"redact",
|
|
207
|
+
# compat (срез 9) — namespace-модуль back-compat фасада gemini
|
|
208
|
+
"compat",
|
|
209
|
+
]
|