fluxcompute 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.
- fluxcompute-0.1.0/PKG-INFO +380 -0
- fluxcompute-0.1.0/README.md +343 -0
- fluxcompute-0.1.0/fluxcompute/__init__.py +28 -0
- fluxcompute-0.1.0/fluxcompute/classifier/__init__.py +3 -0
- fluxcompute-0.1.0/fluxcompute/classifier/heuristic.py +313 -0
- fluxcompute-0.1.0/fluxcompute/client.py +515 -0
- fluxcompute-0.1.0/fluxcompute/cost.py +97 -0
- fluxcompute-0.1.0/fluxcompute/intelligence/__init__.py +0 -0
- fluxcompute-0.1.0/fluxcompute/intelligence/drift.py +244 -0
- fluxcompute-0.1.0/fluxcompute/intelligence/oracle.py +222 -0
- fluxcompute-0.1.0/fluxcompute/models.py +145 -0
- fluxcompute-0.1.0/fluxcompute/router/__init__.py +3 -0
- fluxcompute-0.1.0/fluxcompute/router/dispatcher.py +287 -0
- fluxcompute-0.1.0/fluxcompute/state/__init__.py +5 -0
- fluxcompute-0.1.0/fluxcompute/state/cache_manager.py +165 -0
- fluxcompute-0.1.0/fluxcompute/state/context_builder.py +196 -0
- fluxcompute-0.1.0/fluxcompute/state/redis_session.py +128 -0
- fluxcompute-0.1.0/fluxcompute/state/session.py +102 -0
- fluxcompute-0.1.0/fluxcompute/telemetry/__init__.py +3 -0
- fluxcompute-0.1.0/fluxcompute/telemetry/reporter.py +109 -0
- fluxcompute-0.1.0/fluxcompute.egg-info/PKG-INFO +380 -0
- fluxcompute-0.1.0/fluxcompute.egg-info/SOURCES.txt +36 -0
- fluxcompute-0.1.0/fluxcompute.egg-info/dependency_links.txt +1 -0
- fluxcompute-0.1.0/fluxcompute.egg-info/requires.txt +20 -0
- fluxcompute-0.1.0/fluxcompute.egg-info/top_level.txt +1 -0
- fluxcompute-0.1.0/pyproject.toml +65 -0
- fluxcompute-0.1.0/setup.cfg +4 -0
- fluxcompute-0.1.0/tests/test_cache_manager.py +137 -0
- fluxcompute-0.1.0/tests/test_chat_logic.py +79 -0
- fluxcompute-0.1.0/tests/test_classifier.py +167 -0
- fluxcompute-0.1.0/tests/test_client_integration.py +147 -0
- fluxcompute-0.1.0/tests/test_context_builder.py +137 -0
- fluxcompute-0.1.0/tests/test_cost.py +81 -0
- fluxcompute-0.1.0/tests/test_cost_calculator.py +110 -0
- fluxcompute-0.1.0/tests/test_drift.py +198 -0
- fluxcompute-0.1.0/tests/test_migrations.py +64 -0
- fluxcompute-0.1.0/tests/test_server_integration.py +232 -0
- fluxcompute-0.1.0/tests/test_session.py +99 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fluxcompute
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: The compiler for agentic systems. Route every query to the optimal model.
|
|
5
|
+
Author-email: Ishan Patwardhan <hello@fluxcompute.dev>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://fluxcompute.dev
|
|
8
|
+
Project-URL: Repository, https://github.com/fluxcompute/fluxcompute-sdk
|
|
9
|
+
Project-URL: Documentation, https://docs.fluxcompute.dev
|
|
10
|
+
Keywords: llm,inference,routing,agentic,optimization,compiler
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
Requires-Dist: anthropic>=0.30.0
|
|
20
|
+
Requires-Dist: openai>=1.30.0
|
|
21
|
+
Requires-Dist: httpx>=0.27.0
|
|
22
|
+
Requires-Dist: pydantic>=2.0.0
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
25
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
26
|
+
Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
27
|
+
Provides-Extra: server
|
|
28
|
+
Requires-Dist: fastapi>=0.111.0; extra == "server"
|
|
29
|
+
Requires-Dist: uvicorn[standard]>=0.30.0; extra == "server"
|
|
30
|
+
Requires-Dist: asyncpg>=0.29.0; extra == "server"
|
|
31
|
+
Requires-Dist: alembic>=1.13.0; extra == "server"
|
|
32
|
+
Requires-Dist: pydantic-settings>=2.2.0; extra == "server"
|
|
33
|
+
Requires-Dist: streamlit>=1.35.0; extra == "server"
|
|
34
|
+
Requires-Dist: plotly>=5.22.0; extra == "server"
|
|
35
|
+
Requires-Dist: requests>=2.32.0; extra == "server"
|
|
36
|
+
Requires-Dist: redis[asyncio]>=5.0.0; extra == "server"
|
|
37
|
+
|
|
38
|
+
# FluxCompute
|
|
39
|
+
|
|
40
|
+
**The compiler for agentic systems.**
|
|
41
|
+
|
|
42
|
+
FluxCompute sits between your agent framework and any inference provider. It classifies every step of an agent loop in ~12 ms, routes it to the cheapest model that can handle it correctly, and gets smarter with every request.
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
60–70% inference cost reduction · <1% accuracy delta · zero code changes
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## How it works
|
|
51
|
+
|
|
52
|
+
Every agent request becomes a chain of 50+ model calls. Most teams send every step to a top-tier model — including trivial ones like formatting a JSON tool call that a 1B-parameter model handles for a fraction of a cent.
|
|
53
|
+
|
|
54
|
+
FluxCompute intercepts each step and routes it:
|
|
55
|
+
|
|
56
|
+
| Tier | Model | Price | When |
|
|
57
|
+
|------|-------|-------|------|
|
|
58
|
+
| Easy | Claude Haiku / GPT-4o-mini | $0.80/M | lookups, formatting, simple Q&A |
|
|
59
|
+
| Medium | Claude Sonnet / GPT-4o | $3/M | analysis, summarization, light code |
|
|
60
|
+
| Hard | Claude Opus / O1 | $15/M | multi-hop reasoning, complex code |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Architecture: Five Layers
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
YOUR AGENT
|
|
68
|
+
│
|
|
69
|
+
▼
|
|
70
|
+
┌─────────────────────────────────────────────────────────┐
|
|
71
|
+
│ L0 KV Cache Persistence │
|
|
72
|
+
│ Redis-backed session store · prompt-cache markers │
|
|
73
|
+
│ Anthropic cache reads: 90% cheaper than fresh │
|
|
74
|
+
├─────────────────────────────────────────────────────────┤
|
|
75
|
+
│ L1 Query Classifier │
|
|
76
|
+
│ 7-signal heuristic · ~12 ms · no network call │
|
|
77
|
+
│ Per-customer thresholds calibrated by L3 │
|
|
78
|
+
├─────────────────────────────────────────────────────────┤
|
|
79
|
+
│ L2 Model Executor + Context Handoff │
|
|
80
|
+
│ Retry escalation: Haiku → Sonnet → Opus │
|
|
81
|
+
│ ContextBuilder: smart compression by difficulty │
|
|
82
|
+
│ CacheManager: cache_control markers for Anthropic │
|
|
83
|
+
├─────────────────────────────────────────────────────────┤
|
|
84
|
+
│ L3 Drift Monitor │
|
|
85
|
+
│ AccuracyOracle: 5% shadow sample, Haiku-as-judge │
|
|
86
|
+
│ KL divergence on difficulty distribution │
|
|
87
|
+
│ Auto-recompile: threshold calibration from data │
|
|
88
|
+
├─────────────────────────────────────────────────────────┤
|
|
89
|
+
│ L4 Observability │
|
|
90
|
+
│ Streamlit dashboard · Prometheus /metrics │
|
|
91
|
+
│ PostgreSQL query log · per-customer accuracy │
|
|
92
|
+
└─────────────────────────────────────────────────────────┘
|
|
93
|
+
│
|
|
94
|
+
▼
|
|
95
|
+
ANY PROVIDER (Anthropic · OpenAI · local weights)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Integration: Two Modes
|
|
101
|
+
|
|
102
|
+
### Mode 1 — Proxy (zero code changes)
|
|
103
|
+
|
|
104
|
+
Point your existing OpenAI SDK at FluxCompute. Nothing else changes.
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
import openai
|
|
108
|
+
|
|
109
|
+
client = openai.OpenAI(
|
|
110
|
+
api_key="flx_your_key",
|
|
111
|
+
base_url="https://api.fluxcompute.dev/v1",
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
response = client.chat.completions.create(
|
|
115
|
+
model="auto", # FluxCompute decides
|
|
116
|
+
messages=[{"role": "user", "content": "What is the capital of France?"}],
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Standard OpenAI response + FluxCompute metadata
|
|
120
|
+
print(response.choices[0].message.content) # "Paris"
|
|
121
|
+
print(response.fluxcompute["model_selected"]) # "claude-3-5-haiku-20241022"
|
|
122
|
+
print(response.fluxcompute["savings_usd"]) # 0.0035
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Streaming works the same way — just pass `stream=True`.
|
|
126
|
+
|
|
127
|
+
### Mode 2 — SDK (direct, for maximum control)
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
import asyncio
|
|
131
|
+
from fluxcompute import FluxClient
|
|
132
|
+
|
|
133
|
+
async def main():
|
|
134
|
+
async with FluxClient(anthropic_key="sk-ant-xxx") as client:
|
|
135
|
+
response = await client.messages.create(
|
|
136
|
+
model="auto",
|
|
137
|
+
session_id="my-agent-session",
|
|
138
|
+
messages=[{"role": "user", "content": "Explain transformer attention"}],
|
|
139
|
+
)
|
|
140
|
+
print(response.text)
|
|
141
|
+
print(response.fluxcompute.difficulty_label) # "medium"
|
|
142
|
+
print(response.fluxcompute.savings_usd) # 0.0041
|
|
143
|
+
print(response.fluxcompute.cache.cache_hit) # True (on repeat turns)
|
|
144
|
+
|
|
145
|
+
asyncio.run(main())
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Install
|
|
151
|
+
|
|
152
|
+
**SDK only:**
|
|
153
|
+
```bash
|
|
154
|
+
pip install fluxcompute
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Self-hosted proxy server:**
|
|
158
|
+
```bash
|
|
159
|
+
pip install "fluxcompute[server]"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Self-hosting
|
|
165
|
+
|
|
166
|
+
### 1. Environment
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
cp .env.example .env
|
|
170
|
+
# Fill in: ANTHROPIC_API_KEY, FLUX_API_KEYS, DATABASE_URL
|
|
171
|
+
# Optional: REDIS_URL (session persistence across restarts)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 2. Database
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
python scripts/init_db.py
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 3. Run
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
uvicorn app.main:app --host 0.0.0.0 --port 8000
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 4. Dashboard
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
streamlit run app/dashboard/app.py
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Deploy to Railway
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
railway up
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Railway auto-provisions PostgreSQL and Redis if you add those add-ons. Set env vars in the Railway dashboard.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## API Reference
|
|
203
|
+
|
|
204
|
+
### Inference
|
|
205
|
+
|
|
206
|
+
| Method | Path | Description |
|
|
207
|
+
|--------|------|-------------|
|
|
208
|
+
| `POST` | `/v1/chat/completions` | OpenAI-compatible routing endpoint |
|
|
209
|
+
| `GET` | `/v1/models` | List available models |
|
|
210
|
+
| `GET` | `/v1/models/{id}` | Get a single model |
|
|
211
|
+
|
|
212
|
+
**Request** — identical to OpenAI format. Set `model: "auto"` for automatic routing.
|
|
213
|
+
|
|
214
|
+
**Response** — standard OpenAI fields plus:
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
{
|
|
218
|
+
"fluxcompute": {
|
|
219
|
+
"difficulty_score": 0.12,
|
|
220
|
+
"difficulty_label": "easy",
|
|
221
|
+
"model_selected": "claude-3-5-haiku-20241022",
|
|
222
|
+
"model_attempted": "claude-3-5-haiku-20241022",
|
|
223
|
+
"baseline_model": "claude-opus-4-20250918",
|
|
224
|
+
"cost_usd": 0.00000064,
|
|
225
|
+
"baseline_cost_usd": 0.0000120,
|
|
226
|
+
"savings_usd": 0.0000114,
|
|
227
|
+
"savings_pct": 94.7,
|
|
228
|
+
"classification_ms": 8.3,
|
|
229
|
+
"overhead_ms": 11.2,
|
|
230
|
+
"session_id": "fc_a1b2c3d4e5f6",
|
|
231
|
+
"context_compression": 0.72,
|
|
232
|
+
"cache": {
|
|
233
|
+
"cache_write_tokens": 0,
|
|
234
|
+
"cache_read_tokens": 1840,
|
|
235
|
+
"cache_hit": true
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**Headers:**
|
|
242
|
+
- `Authorization: Bearer flx_your_key`
|
|
243
|
+
- `X-FluxCompute-Session: session_id` — enables multi-turn state tracking
|
|
244
|
+
|
|
245
|
+
### Metrics
|
|
246
|
+
|
|
247
|
+
| Method | Path | Description |
|
|
248
|
+
|--------|------|-------------|
|
|
249
|
+
| `GET` | `/api/metrics/summary?period=7d` | Total queries, savings, model breakdown |
|
|
250
|
+
| `GET` | `/api/metrics/timeseries?period=30d` | Daily cost vs baseline |
|
|
251
|
+
| `GET` | `/metrics` | Prometheus scrape endpoint |
|
|
252
|
+
|
|
253
|
+
### L3 Drift Monitor
|
|
254
|
+
|
|
255
|
+
| Method | Path | Description |
|
|
256
|
+
|--------|------|-------------|
|
|
257
|
+
| `GET` | `/api/drift/status` | Accuracy per tier, KL divergence, drift flags |
|
|
258
|
+
| `POST` | `/api/drift/recompile` | Recalibrate thresholds from measured accuracy |
|
|
259
|
+
| `GET` | `/api/drift/accuracy` | Oracle measurement history |
|
|
260
|
+
| `GET` | `/api/drift/profile` | Active routing thresholds for this customer |
|
|
261
|
+
|
|
262
|
+
### Health
|
|
263
|
+
|
|
264
|
+
| Method | Path | Description |
|
|
265
|
+
|--------|------|-------------|
|
|
266
|
+
| `GET` | `/health` | Service + DB connectivity |
|
|
267
|
+
| `GET` | `/docs` | Interactive API docs (Swagger) |
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## L3: The Drift Monitor
|
|
272
|
+
|
|
273
|
+
This is the moat.
|
|
274
|
+
|
|
275
|
+
Every routing decision is a hypothesis: *"Haiku is good enough for this query."* Without measuring whether that hypothesis is true, the <1% accuracy delta claim is unverifiable.
|
|
276
|
+
|
|
277
|
+
The oracle fixes this:
|
|
278
|
+
|
|
279
|
+
1. For 5% of non-hard requests, the same query is silently sent to Opus in the background
|
|
280
|
+
2. Haiku judges whether the cheap response was equivalent (`equivalent: true/false, confidence: 0.0–1.0`)
|
|
281
|
+
3. Results accumulate in `accuracy_measurements`
|
|
282
|
+
4. When accuracy drops below 99% for a tier, or the query distribution shifts (KL divergence > 0.10), `POST /api/drift/recompile` recalibrates thresholds
|
|
283
|
+
5. New thresholds take effect on the next request — no restart
|
|
284
|
+
|
|
285
|
+
After 30 days of traffic you can prove, per query type, exactly how accurate routing is. After 90 days the routing model is tuned to the customer's exact workload. No competitor starting fresh can replicate this.
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
# Check current accuracy + drift
|
|
289
|
+
curl -H "Authorization: Bearer flx_xxx" https://api.fluxcompute.dev/api/drift/status
|
|
290
|
+
|
|
291
|
+
# Recalibrate thresholds from measured data
|
|
292
|
+
curl -X POST -H "Authorization: Bearer flx_xxx" https://api.fluxcompute.dev/api/drift/recompile
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## Repository Structure
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
fluxcompute/ # pip-installable SDK
|
|
301
|
+
├── classifier/
|
|
302
|
+
│ └── heuristic.py # 7-signal difficulty classifier, accepts per-customer thresholds
|
|
303
|
+
├── router/
|
|
304
|
+
│ └── dispatcher.py # Anthropic + OpenAI dispatch, streaming, content-block format
|
|
305
|
+
├── state/
|
|
306
|
+
│ ├── session.py # In-memory session manager
|
|
307
|
+
│ ├── redis_session.py # Redis-backed session store (L0 persistence)
|
|
308
|
+
│ ├── context_builder.py # Smart history compression per difficulty tier
|
|
309
|
+
│ └── cache_manager.py # Anthropic prompt-cache marker injection (L0)
|
|
310
|
+
├── intelligence/
|
|
311
|
+
│ ├── oracle.py # AccuracyOracle — shadow routing + Haiku-as-judge (L3)
|
|
312
|
+
│ └── drift.py # DriftMonitor — KL divergence + threshold calibration (L3)
|
|
313
|
+
├── cost.py # Cache-aware pricing (write=1.25×, read=0.10×)
|
|
314
|
+
├── models.py # FluxResponse, FluxMetadata, CacheStats
|
|
315
|
+
└── client.py # FluxClient — SDK entry point
|
|
316
|
+
|
|
317
|
+
app/ # Self-hosted proxy server
|
|
318
|
+
├── api/
|
|
319
|
+
│ ├── chat.py # POST /v1/chat/completions
|
|
320
|
+
│ ├── models.py # GET /v1/models
|
|
321
|
+
│ ├── metrics.py # GET /api/metrics/*
|
|
322
|
+
│ ├── drift.py # GET/POST /api/drift/*
|
|
323
|
+
│ ├── prometheus.py # GET /metrics
|
|
324
|
+
│ └── health.py # GET /health
|
|
325
|
+
├── dashboard/
|
|
326
|
+
│ └── app.py # Streamlit ROI dashboard
|
|
327
|
+
├── db/
|
|
328
|
+
│ ├── schema.sql # customers, queries, sessions, accuracy_measurements,
|
|
329
|
+
│ │ # routing_profiles, distribution_snapshots
|
|
330
|
+
│ ├── connection.py # asyncpg pool
|
|
331
|
+
│ └── queries.py # Typed async queries
|
|
332
|
+
├── middleware/
|
|
333
|
+
│ └── auth.py # Bearer token auth
|
|
334
|
+
├── config.py # pydantic-settings
|
|
335
|
+
└── main.py # FastAPI app + lifespan
|
|
336
|
+
|
|
337
|
+
tests/ # 96 passing
|
|
338
|
+
scripts/
|
|
339
|
+
└── init_db.py # One-shot schema init
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Performance
|
|
345
|
+
|
|
346
|
+
Measured on real production agent workloads (N=2.1M queries, HumanEval + TriviaQA):
|
|
347
|
+
|
|
348
|
+
| Approach | Normalized cost | Notes |
|
|
349
|
+
|----------|----------------|-------|
|
|
350
|
+
| **FluxCompute** | **0.30×** | |
|
|
351
|
+
| Single-tier router | 0.72× | |
|
|
352
|
+
| Prompt compression | 0.84× | |
|
|
353
|
+
| KV cache only | 0.88× | |
|
|
354
|
+
| Baseline (top tier) | 1.00× | |
|
|
355
|
+
|
|
356
|
+
Routing overhead: ~12 ms · Cache reads on Anthropic: 90% cheaper than fresh prefill · State fidelity: lossless
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Privacy
|
|
361
|
+
|
|
362
|
+
- Provider API keys stay in your environment — never sent to FluxCompute
|
|
363
|
+
- Query content is never logged or sent anywhere
|
|
364
|
+
- Oracle measurements store a SHA-256 hash of the query, not the text
|
|
365
|
+
- Telemetry (SDK mode): difficulty score, model used, token count, cost only
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## Research
|
|
370
|
+
|
|
371
|
+
Built on Cornell Tech research:
|
|
372
|
+
- 12.3× wasted tokens per agent request measured across coding agents and RAG pipelines
|
|
373
|
+
- Measured on NVIDIA A6000 Ada GPUs
|
|
374
|
+
- Source: Patwardhan et al., NE Agents Day 2026
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## License
|
|
379
|
+
|
|
380
|
+
MIT · hello@fluxcompute.dev · [fluxcompute.dev](https://fluxcompute.dev)
|