synthesis-atlas-cli 0.1.0__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.
- synthesis_atlas_cli-0.1.0/PKG-INFO +110 -0
- synthesis_atlas_cli-0.1.0/README.md +95 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/__init__.py +117 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/auth.py +28 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/client.py +1146 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/errors.py +99 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/__init__.py +139 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/auth.py +25 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/benchmarks.py +40 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/dashboard.py +101 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/datasets.py +54 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/evaluation.py +122 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/executions.py +123 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/health.py +34 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/history.py +40 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/leaderboard.py +107 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/models.py +33 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/projects.py +29 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/reports.py +100 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/responses.py +38 -0
- synthesis_atlas_cli-0.1.0/atlas_sdk/models/search.py +24 -0
- synthesis_atlas_cli-0.1.0/cli/__init__.py +3 -0
- synthesis_atlas_cli-0.1.0/cli/agent/__init__.py +7 -0
- synthesis_atlas_cli-0.1.0/cli/agent/loop.py +185 -0
- synthesis_atlas_cli-0.1.0/cli/agent/prompt.py +73 -0
- synthesis_atlas_cli-0.1.0/cli/agent/provider.py +361 -0
- synthesis_atlas_cli-0.1.0/cli/agent/repl.py +221 -0
- synthesis_atlas_cli-0.1.0/cli/agent/router.py +151 -0
- synthesis_atlas_cli-0.1.0/cli/agent/state.py +111 -0
- synthesis_atlas_cli-0.1.0/cli/agent/tools/__init__.py +6 -0
- synthesis_atlas_cli-0.1.0/cli/agent/tools/authoring.py +317 -0
- synthesis_atlas_cli-0.1.0/cli/agent/tools/base.py +106 -0
- synthesis_atlas_cli-0.1.0/cli/agent/tools/datasets.py +328 -0
- synthesis_atlas_cli-0.1.0/cli/agent/tools/evaluation.py +355 -0
- synthesis_atlas_cli-0.1.0/cli/agent/tools/library.py +566 -0
- synthesis_atlas_cli-0.1.0/cli/agent/tools/registry.py +148 -0
- synthesis_atlas_cli-0.1.0/cli/app.py +241 -0
- synthesis_atlas_cli-0.1.0/cli/client.py +38 -0
- synthesis_atlas_cli-0.1.0/cli/commands/__init__.py +1 -0
- synthesis_atlas_cli-0.1.0/cli/commands/activity.py +152 -0
- synthesis_atlas_cli-0.1.0/cli/commands/auth.py +156 -0
- synthesis_atlas_cli-0.1.0/cli/commands/benchmark.py +179 -0
- synthesis_atlas_cli-0.1.0/cli/commands/dashboard.py +131 -0
- synthesis_atlas_cli-0.1.0/cli/commands/health.py +99 -0
- synthesis_atlas_cli-0.1.0/cli/commands/leaderboard.py +313 -0
- synthesis_atlas_cli-0.1.0/cli/commands/models.py +88 -0
- synthesis_atlas_cli-0.1.0/cli/commands/report.py +329 -0
- synthesis_atlas_cli-0.1.0/cli/commands/run.py +576 -0
- synthesis_atlas_cli-0.1.0/cli/config.py +168 -0
- synthesis_atlas_cli-0.1.0/cli/errors.py +61 -0
- synthesis_atlas_cli-0.1.0/cli/output/__init__.py +17 -0
- synthesis_atlas_cli-0.1.0/cli/output/errors.py +33 -0
- synthesis_atlas_cli-0.1.0/cli/output/json.py +41 -0
- synthesis_atlas_cli-0.1.0/cli/output/quiet.py +9 -0
- synthesis_atlas_cli-0.1.0/cli/output/schema.py +60 -0
- synthesis_atlas_cli-0.1.0/cli/output/table.py +89 -0
- synthesis_atlas_cli-0.1.0/packages/__init__.py +10 -0
- synthesis_atlas_cli-0.1.0/packages/llm/__init__.py +9 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/__init__.py +5 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/adapter.py +197 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/base.py +41 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/gemini.py +105 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/grok.py +98 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/groq.py +108 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/mistral.py +98 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/nvidia.py +105 -0
- synthesis_atlas_cli-0.1.0/packages/llm/clients/ollama.py +94 -0
- synthesis_atlas_cli-0.1.0/packages/llm/config.py +4 -0
- synthesis_atlas_cli-0.1.0/packages/llm/exceptions.py +28 -0
- synthesis_atlas_cli-0.1.0/packages/llm/models/__init__.py +5 -0
- synthesis_atlas_cli-0.1.0/packages/llm/models/model_types.py +9 -0
- synthesis_atlas_cli-0.1.0/packages/llm/models/prompt.py +11 -0
- synthesis_atlas_cli-0.1.0/packages/llm/models/response.py +16 -0
- synthesis_atlas_cli-0.1.0/packages/llm/prompt_builder.py +47 -0
- synthesis_atlas_cli-0.1.0/packages/llm/prompt_genealogy.py +33 -0
- synthesis_atlas_cli-0.1.0/packages/llm/registry.py +168 -0
- synthesis_atlas_cli-0.1.0/pyproject.toml +72 -0
- synthesis_atlas_cli-0.1.0/setup.cfg +4 -0
- synthesis_atlas_cli-0.1.0/synthesis_atlas_cli.egg-info/PKG-INFO +110 -0
- synthesis_atlas_cli-0.1.0/synthesis_atlas_cli.egg-info/SOURCES.txt +82 -0
- synthesis_atlas_cli-0.1.0/synthesis_atlas_cli.egg-info/dependency_links.txt +1 -0
- synthesis_atlas_cli-0.1.0/synthesis_atlas_cli.egg-info/entry_points.txt +2 -0
- synthesis_atlas_cli-0.1.0/synthesis_atlas_cli.egg-info/requires.txt +8 -0
- synthesis_atlas_cli-0.1.0/synthesis_atlas_cli.egg-info/top_level.txt +3 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synthesis-atlas-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Atlas CLI — first-class programmatic interface to the Atlas control plane.
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: click>=8.1.0
|
|
9
|
+
Requires-Dist: httpx>=0.28.1
|
|
10
|
+
Requires-Dist: pydantic[email]>=2.0.0
|
|
11
|
+
Provides-Extra: dev
|
|
12
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
13
|
+
Requires-Dist: ruff>=0.16.0; extra == "dev"
|
|
14
|
+
Requires-Dist: mypy>=2.0.0; extra == "dev"
|
|
15
|
+
|
|
16
|
+
# Atlas CLI
|
|
17
|
+
|
|
18
|
+
Command-line interface for the Atlas evaluation platform.
|
|
19
|
+
|
|
20
|
+
`atlas` talks to the Atlas control-plane API to manage benchmarks, models, runs, and
|
|
21
|
+
reports. The CLI distribution bundles the Atlas SDK (`atlas_sdk`) and the
|
|
22
|
+
internal LLM layer (`packages.llm`) that powers the agent brain, so a single
|
|
23
|
+
`pip install synthesis-atlas-cli` is fully self-contained.
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install synthesis-atlas-cli
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
- Python 3.11+ is required.
|
|
32
|
+
- No `atlas-sdk` dependency is pulled from PyPI — the SDK ships inside the wheel
|
|
33
|
+
(the PyPI `atlas-sdk` name belongs to an unrelated project).
|
|
34
|
+
|
|
35
|
+
## Quick start
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# 1. Verify the install
|
|
39
|
+
atlas --version
|
|
40
|
+
|
|
41
|
+
# 2. Point at the Atlas API (defaults to http://localhost:8000)
|
|
42
|
+
export ATLAS_BASE_URL="https://api.example.com"
|
|
43
|
+
|
|
44
|
+
# 3. Authenticate (token is saved in %APPDATA%\Atlas\config.toml, never in the repo)
|
|
45
|
+
atlas login
|
|
46
|
+
|
|
47
|
+
# 4. Confirm your identity
|
|
48
|
+
atlas whoami
|
|
49
|
+
|
|
50
|
+
# 5. Browse the full command list
|
|
51
|
+
atlas --help
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Commands
|
|
55
|
+
|
|
56
|
+
- `atlas health` — check API health
|
|
57
|
+
- `atlas leaderboard` — model / benchmark leaderboards
|
|
58
|
+
- `atlas benchmark` — benchmark operations
|
|
59
|
+
- `atlas model` — model operations
|
|
60
|
+
- `atlas report` — execution reports
|
|
61
|
+
- `atlas run` — start executions
|
|
62
|
+
- `atlas dashboard` — dashboard summaries
|
|
63
|
+
- `atlas activity` — recent activity
|
|
64
|
+
|
|
65
|
+
These are deterministic, scriptable operations (human, JSON, or quiet output via
|
|
66
|
+
`--output`). Run `atlas --help` for the full command list.
|
|
67
|
+
|
|
68
|
+
## Agent
|
|
69
|
+
|
|
70
|
+
The agentic side of the CLI runs an LLM brain directly in your terminal. It
|
|
71
|
+
comes in two shapes:
|
|
72
|
+
|
|
73
|
+
- **Interactive REPL** — run bare `atlas` in a terminal to start a
|
|
74
|
+
Gemini-CLI-style conversation:
|
|
75
|
+
```bash
|
|
76
|
+
atlas
|
|
77
|
+
```
|
|
78
|
+
- **One-shot task** — run a single quoted task non-interactively:
|
|
79
|
+
```bash
|
|
80
|
+
atlas agent "List the available benchmarks"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The agent brain uses an LLM provider. Set one of:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
export GEMINI_API_KEY="..."
|
|
87
|
+
export GROQ_API_KEY="..."
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
With no key configured the agent refuses to start and points you at the missing
|
|
91
|
+
environment variable.
|
|
92
|
+
|
|
93
|
+
## Development
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pip install -e ./sdk/python -e ./cli # editable install from the monorepo
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This installs the CLI and SDK as editable packages; `packages.llm` resolves to
|
|
100
|
+
the bundled copy inside the CLI layout (see `pyproject.toml`).
|
|
101
|
+
|
|
102
|
+
The CLI version is defined once in `cli/cli/__init__.py` (`__version__`) and is
|
|
103
|
+
picked up dynamically by `pyproject.toml`. See
|
|
104
|
+
[docs/guides/atlas-cli-release.md](../docs/guides/atlas-cli-release.md) for the
|
|
105
|
+
release-time staging build, offline artifact validation, and the (not yet enabled)
|
|
106
|
+
PyPI publishing workflow.
|
|
107
|
+
|
|
108
|
+
## License
|
|
109
|
+
|
|
110
|
+
Copyright (c) 2026. All rights reserved.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Atlas CLI
|
|
2
|
+
|
|
3
|
+
Command-line interface for the Atlas evaluation platform.
|
|
4
|
+
|
|
5
|
+
`atlas` talks to the Atlas control-plane API to manage benchmarks, models, runs, and
|
|
6
|
+
reports. The CLI distribution bundles the Atlas SDK (`atlas_sdk`) and the
|
|
7
|
+
internal LLM layer (`packages.llm`) that powers the agent brain, so a single
|
|
8
|
+
`pip install synthesis-atlas-cli` is fully self-contained.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
pip install synthesis-atlas-cli
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- Python 3.11+ is required.
|
|
17
|
+
- No `atlas-sdk` dependency is pulled from PyPI — the SDK ships inside the wheel
|
|
18
|
+
(the PyPI `atlas-sdk` name belongs to an unrelated project).
|
|
19
|
+
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 1. Verify the install
|
|
24
|
+
atlas --version
|
|
25
|
+
|
|
26
|
+
# 2. Point at the Atlas API (defaults to http://localhost:8000)
|
|
27
|
+
export ATLAS_BASE_URL="https://api.example.com"
|
|
28
|
+
|
|
29
|
+
# 3. Authenticate (token is saved in %APPDATA%\Atlas\config.toml, never in the repo)
|
|
30
|
+
atlas login
|
|
31
|
+
|
|
32
|
+
# 4. Confirm your identity
|
|
33
|
+
atlas whoami
|
|
34
|
+
|
|
35
|
+
# 5. Browse the full command list
|
|
36
|
+
atlas --help
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Commands
|
|
40
|
+
|
|
41
|
+
- `atlas health` — check API health
|
|
42
|
+
- `atlas leaderboard` — model / benchmark leaderboards
|
|
43
|
+
- `atlas benchmark` — benchmark operations
|
|
44
|
+
- `atlas model` — model operations
|
|
45
|
+
- `atlas report` — execution reports
|
|
46
|
+
- `atlas run` — start executions
|
|
47
|
+
- `atlas dashboard` — dashboard summaries
|
|
48
|
+
- `atlas activity` — recent activity
|
|
49
|
+
|
|
50
|
+
These are deterministic, scriptable operations (human, JSON, or quiet output via
|
|
51
|
+
`--output`). Run `atlas --help` for the full command list.
|
|
52
|
+
|
|
53
|
+
## Agent
|
|
54
|
+
|
|
55
|
+
The agentic side of the CLI runs an LLM brain directly in your terminal. It
|
|
56
|
+
comes in two shapes:
|
|
57
|
+
|
|
58
|
+
- **Interactive REPL** — run bare `atlas` in a terminal to start a
|
|
59
|
+
Gemini-CLI-style conversation:
|
|
60
|
+
```bash
|
|
61
|
+
atlas
|
|
62
|
+
```
|
|
63
|
+
- **One-shot task** — run a single quoted task non-interactively:
|
|
64
|
+
```bash
|
|
65
|
+
atlas agent "List the available benchmarks"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The agent brain uses an LLM provider. Set one of:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
export GEMINI_API_KEY="..."
|
|
72
|
+
export GROQ_API_KEY="..."
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
With no key configured the agent refuses to start and points you at the missing
|
|
76
|
+
environment variable.
|
|
77
|
+
|
|
78
|
+
## Development
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install -e ./sdk/python -e ./cli # editable install from the monorepo
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This installs the CLI and SDK as editable packages; `packages.llm` resolves to
|
|
85
|
+
the bundled copy inside the CLI layout (see `pyproject.toml`).
|
|
86
|
+
|
|
87
|
+
The CLI version is defined once in `cli/cli/__init__.py` (`__version__`) and is
|
|
88
|
+
picked up dynamically by `pyproject.toml`. See
|
|
89
|
+
[docs/guides/atlas-cli-release.md](../docs/guides/atlas-cli-release.md) for the
|
|
90
|
+
release-time staging build, offline artifact validation, and the (not yet enabled)
|
|
91
|
+
PyPI publishing workflow.
|
|
92
|
+
|
|
93
|
+
## License
|
|
94
|
+
|
|
95
|
+
Copyright (c) 2026. All rights reserved.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""atlas-sdk: Python SDK for the Atlas control-plane API.
|
|
2
|
+
|
|
3
|
+
A thin HTTP client containing zero Atlas business logic.
|
|
4
|
+
CLI → atlas-sdk → HTTP → /api/v1.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from atlas_sdk.auth import StaticTokenSupplier, TokenSupplier
|
|
8
|
+
from atlas_sdk.client import AtlasClient
|
|
9
|
+
from atlas_sdk.errors import (
|
|
10
|
+
ApiError,
|
|
11
|
+
AuthError,
|
|
12
|
+
ConflictError,
|
|
13
|
+
ForbiddenError,
|
|
14
|
+
NetworkError,
|
|
15
|
+
NotFoundError,
|
|
16
|
+
RateLimitedError,
|
|
17
|
+
ServerError,
|
|
18
|
+
ValidationError,
|
|
19
|
+
)
|
|
20
|
+
from atlas_sdk.models.benchmarks import (
|
|
21
|
+
BenchmarkRead,
|
|
22
|
+
BenchmarkVersionRead,
|
|
23
|
+
PageResponse,
|
|
24
|
+
)
|
|
25
|
+
from atlas_sdk.models.dashboard import (
|
|
26
|
+
DashboardActivity,
|
|
27
|
+
DashboardCapability,
|
|
28
|
+
DashboardCapabilityScore,
|
|
29
|
+
DashboardHierarchy,
|
|
30
|
+
DashboardItem,
|
|
31
|
+
DashboardRuntime,
|
|
32
|
+
DashboardSnapshot,
|
|
33
|
+
DashboardSummary,
|
|
34
|
+
)
|
|
35
|
+
from atlas_sdk.models.executions import (
|
|
36
|
+
ArtifactResponse,
|
|
37
|
+
ExecutionAttemptResponse,
|
|
38
|
+
ExecutionCreateRequest,
|
|
39
|
+
ExecutionListResponse,
|
|
40
|
+
ExecutionPage,
|
|
41
|
+
ExecutionResponse,
|
|
42
|
+
ExecutionState,
|
|
43
|
+
)
|
|
44
|
+
from atlas_sdk.models.history import ExecutionHistoryRead, ModelActivityRead
|
|
45
|
+
from atlas_sdk.models.leaderboard import (
|
|
46
|
+
LeaderboardEntryRead,
|
|
47
|
+
LeaderboardRead,
|
|
48
|
+
LeaderboardType,
|
|
49
|
+
ModelBenchmarkHistory,
|
|
50
|
+
ModelBenchmarkVersionHistory,
|
|
51
|
+
ModelSummary,
|
|
52
|
+
TrendPoint,
|
|
53
|
+
)
|
|
54
|
+
from atlas_sdk.models.models import ModelRead, ModelStatus
|
|
55
|
+
from atlas_sdk.models.projects import OrganizationRead, ProjectRead
|
|
56
|
+
from atlas_sdk.models.reports import (
|
|
57
|
+
CapabilityScoreRead,
|
|
58
|
+
DownloadResult,
|
|
59
|
+
PaginatedReportRunsRead,
|
|
60
|
+
ReportRunEntryRead,
|
|
61
|
+
ReportRunStatus,
|
|
62
|
+
ReportSummaryRead,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
__all__ = [
|
|
66
|
+
"AtlasClient",
|
|
67
|
+
"ApiError",
|
|
68
|
+
"AuthError",
|
|
69
|
+
"ArtifactResponse",
|
|
70
|
+
"BenchmarkRead",
|
|
71
|
+
"BenchmarkVersionRead",
|
|
72
|
+
"ConflictError",
|
|
73
|
+
"DashboardActivity",
|
|
74
|
+
"DashboardCapability",
|
|
75
|
+
"DashboardCapabilityScore",
|
|
76
|
+
"DashboardHierarchy",
|
|
77
|
+
"DashboardItem",
|
|
78
|
+
"DashboardRuntime",
|
|
79
|
+
"DashboardSnapshot",
|
|
80
|
+
"DashboardSummary",
|
|
81
|
+
"ExecutionAttemptResponse",
|
|
82
|
+
"ExecutionCreateRequest",
|
|
83
|
+
"ExecutionHistoryRead",
|
|
84
|
+
"ExecutionListResponse",
|
|
85
|
+
"ExecutionPage",
|
|
86
|
+
"ExecutionResponse",
|
|
87
|
+
"ExecutionState",
|
|
88
|
+
"ForbiddenError",
|
|
89
|
+
"LeaderboardEntryRead",
|
|
90
|
+
"LeaderboardRead",
|
|
91
|
+
"LeaderboardType",
|
|
92
|
+
"ModelActivityRead",
|
|
93
|
+
"ModelBenchmarkHistory",
|
|
94
|
+
"ModelBenchmarkVersionHistory",
|
|
95
|
+
"ModelRead",
|
|
96
|
+
"ModelStatus",
|
|
97
|
+
"ModelSummary",
|
|
98
|
+
"OrganizationRead",
|
|
99
|
+
"ProjectRead",
|
|
100
|
+
"TrendPoint",
|
|
101
|
+
"NetworkError",
|
|
102
|
+
"NotFoundError",
|
|
103
|
+
"PaginatedReportRunsRead",
|
|
104
|
+
"PageResponse",
|
|
105
|
+
"RateLimitedError",
|
|
106
|
+
"ReportRunEntryRead",
|
|
107
|
+
"ReportRunStatus",
|
|
108
|
+
"CapabilityScoreRead",
|
|
109
|
+
"ReportSummaryRead",
|
|
110
|
+
"DownloadResult",
|
|
111
|
+
"ServerError",
|
|
112
|
+
"StaticTokenSupplier",
|
|
113
|
+
"TokenSupplier",
|
|
114
|
+
"ValidationError",
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
__version__ = "0.1.0"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Token supply strategies for SDK authentication.
|
|
2
|
+
|
|
3
|
+
The SDK owns *attaching* credentials to HTTP requests.
|
|
4
|
+
The CLI owns credential *storage and configuration*.
|
|
5
|
+
|
|
6
|
+
A ``TokenSupplier`` is a zero-argument callable that returns a bearer token
|
|
7
|
+
string. The ``AtlasClient`` calls it before every request.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from typing import Protocol
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TokenSupplier(Protocol):
|
|
16
|
+
"""Protocol for token supply — any callable ``() -> str``."""
|
|
17
|
+
|
|
18
|
+
def __call__(self) -> str: ... # pragma: no cover
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class StaticTokenSupplier:
|
|
22
|
+
"""Returns a fixed token. Useful for testing and CI environments."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, token: str) -> None:
|
|
25
|
+
self._token = token
|
|
26
|
+
|
|
27
|
+
def __call__(self) -> str:
|
|
28
|
+
return self._token
|