sequence-ai 0.7.2__tar.gz → 0.7.3__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.
Files changed (31) hide show
  1. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/PKG-INFO +17 -9
  2. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/README.md +16 -8
  3. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/pyproject.toml +10 -1
  4. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/.gitignore +0 -0
  5. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/LICENSE +0 -0
  6. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/__init__.py +0 -0
  7. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/_internal/__init__.py +0 -0
  8. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/_internal/_actions.py +0 -0
  9. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/_internal/_observation.py +0 -0
  10. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/_internal/_policy.py +0 -0
  11. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/_internal/_transport.py +0 -0
  12. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/cli.py +0 -0
  13. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/errors.py +0 -0
  14. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/py.typed +0 -0
  15. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/recipes/__init__.py +0 -0
  16. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/recipes/cosmos3_edge_policy_droid.py +0 -0
  17. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/recipes/pi05_droid.py +0 -0
  18. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/training.py +0 -0
  19. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/sequence_ai/types.py +0 -0
  20. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/smoke_production.py +0 -0
  21. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/conftest.py +0 -0
  22. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_camera_views.py +0 -0
  23. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_chunk_repr.py +0 -0
  24. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_cli.py +0 -0
  25. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_commands_entrance.py +0 -0
  26. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_encode_target.py +0 -0
  27. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_observation.py +0 -0
  28. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_open_loop_horizon.py +0 -0
  29. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_sdk.py +0 -0
  30. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_training.py +0 -0
  31. {sequence_ai-0.7.2 → sequence_ai-0.7.3}/tests/test_warmup_accounting.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sequence-ai
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Summary: Cloud inference for robot policies — a control loop that keeps the connection open and the action buffer full.
5
5
  Project-URL: Homepage, https://generalsequences.com
6
6
  Project-URL: Documentation, https://generalsequences.com/docs/
@@ -280,26 +280,34 @@ Measured end to end, request to first action:
280
280
  | `groot-n1-7-3b` | ~299 s | ~400 ms |
281
281
  | `cosmos3-edge-policy-droid` | ~346 s | 950–1200 ms |
282
282
 
283
- ### The worker stays warm for 30 minutes
283
+ ### The worker stays warm for 10 minutes
284
284
 
285
285
  **This is the number that decides how you structure a session.** After it becomes ready, a
286
- worker is held for **30 minutes past its last request**. Every call inside that window is warm —
286
+ worker is held for **10 minutes past its last request**. Every call inside that window is warm —
287
287
  the table's right-hand column. The clock restarts on each request, so a loop that calls even
288
- once every few minutes never goes cold.
288
+ once a minute never goes cold.
289
289
 
290
- Cross that 30-minute gap with no calls and the worker is released, and the next request pays the
290
+ Cross that 10-minute gap with no calls and the worker is released, and the next request pays the
291
291
  full cold start again.
292
292
 
293
293
  ```
294
- call ──► 180-215 s cold start ──► warm ◄──────── 30 min idle window ────────► released
294
+ call ──► 180-215 s cold start ──► warm ◄──────── 10 min idle window ────────► released
295
295
  ▲ │
296
- └────── any call restarts the 30 min ────────┘
296
+ └────── any call restarts the 10 min ────────┘
297
297
  ```
298
298
 
299
+ **Why ten and not thirty.** A held GPU bills whether or not you call it, and the shape of that
300
+ bill is brutal for a session with thinking time in it: over one real day of use, inference was
301
+ 3% of the GPU seconds paid for, cold starts 19%, and idle holding 77%. Thirty minutes made the
302
+ worst case a session that calls once every twenty-five minutes — never cold, almost never
303
+ working, and billed for all of it. Ten covers a loop and a short pause between runs without
304
+ paying for a coffee break.
305
+ {measured 2026-09-16 across 2,147 calls: 322 s of inference against 7,200 s of idle holding}
306
+
299
307
  The practical consequence, if you are running a batch of experiments: **the gap between them is
300
308
  what costs you, not the number of them.** Ten tasks run back to back pay one cold start. The
301
- same ten with a 40-minute analysis gap between each pay ten — that is up to an hour of waiting
302
- that looks like the model being slow and is actually the fleet being released and rebuilt.
309
+ same ten with a 20-minute analysis gap between each pay ten — that is up to half an hour of
310
+ waiting that looks like the model being slow and is actually the fleet being released and rebuilt.
303
311
 
304
312
  If a gap is unavoidable and you want the worker held, keep it alive with a cheap call inside the
305
313
  window; `wait_until_ready()` is the right one, because it touches no GPU and is not billed.
@@ -246,26 +246,34 @@ Measured end to end, request to first action:
246
246
  | `groot-n1-7-3b` | ~299 s | ~400 ms |
247
247
  | `cosmos3-edge-policy-droid` | ~346 s | 950–1200 ms |
248
248
 
249
- ### The worker stays warm for 30 minutes
249
+ ### The worker stays warm for 10 minutes
250
250
 
251
251
  **This is the number that decides how you structure a session.** After it becomes ready, a
252
- worker is held for **30 minutes past its last request**. Every call inside that window is warm —
252
+ worker is held for **10 minutes past its last request**. Every call inside that window is warm —
253
253
  the table's right-hand column. The clock restarts on each request, so a loop that calls even
254
- once every few minutes never goes cold.
254
+ once a minute never goes cold.
255
255
 
256
- Cross that 30-minute gap with no calls and the worker is released, and the next request pays the
256
+ Cross that 10-minute gap with no calls and the worker is released, and the next request pays the
257
257
  full cold start again.
258
258
 
259
259
  ```
260
- call ──► 180-215 s cold start ──► warm ◄──────── 30 min idle window ────────► released
260
+ call ──► 180-215 s cold start ──► warm ◄──────── 10 min idle window ────────► released
261
261
  ▲ │
262
- └────── any call restarts the 30 min ────────┘
262
+ └────── any call restarts the 10 min ────────┘
263
263
  ```
264
264
 
265
+ **Why ten and not thirty.** A held GPU bills whether or not you call it, and the shape of that
266
+ bill is brutal for a session with thinking time in it: over one real day of use, inference was
267
+ 3% of the GPU seconds paid for, cold starts 19%, and idle holding 77%. Thirty minutes made the
268
+ worst case a session that calls once every twenty-five minutes — never cold, almost never
269
+ working, and billed for all of it. Ten covers a loop and a short pause between runs without
270
+ paying for a coffee break.
271
+ {measured 2026-09-16 across 2,147 calls: 322 s of inference against 7,200 s of idle holding}
272
+
265
273
  The practical consequence, if you are running a batch of experiments: **the gap between them is
266
274
  what costs you, not the number of them.** Ten tasks run back to back pay one cold start. The
267
- same ten with a 40-minute analysis gap between each pay ten — that is up to an hour of waiting
268
- that looks like the model being slow and is actually the fleet being released and rebuilt.
275
+ same ten with a 20-minute analysis gap between each pay ten — that is up to half an hour of
276
+ waiting that looks like the model being slow and is actually the fleet being released and rebuilt.
269
277
 
270
278
  If a gap is unavoidable and you want the worker held, keep it alive with a cheap call inside the
271
279
  window; `wait_until_ready()` is the right one, because it touches no GPU and is not billed.
@@ -90,7 +90,16 @@ name = "sequence-ai"
90
90
  # [CONFIDENCE: CONFIRMED 100% -- read from upstream. The earlier claim of bit-identity came from
91
91
  # a local simulation that used LANCZOS on both sides, so it agreed with itself rather than with
92
92
  # the server.]
93
- version = "0.7.2"
93
+ #
94
+ # 0.7.3: the warm window is 10 minutes, not 30. Raising it to 1800 s the day before fixed a real
95
+ # race between two timers, and then cost more than it saved: over 2,147 real calls the GPU
96
+ # seconds split 3% inference, 19% cold start, 77% idle holding, and that day billed $5.11 against
97
+ # $0.745 earned. Ten minutes still covers a control loop and a pause between runs.
98
+ # {USER 2026-09-16 "CHANGE TO 10 MINS"}
99
+ # {MEASURED 2026-09-16: usage_records against the RunPod balance delta}
100
+ # [CONFIDENCE: CONFIRMED 100% -- both sides read from their own systems. Documentation only in
101
+ # this package; the number itself lives on the endpoints.]
102
+ version = "0.7.3"
94
103
  # The one line PyPI shows in search results. It used to read "A thin client over a public HTTP
95
104
  # API — everything it does, curl can do." That was true and it was the wrong sentence to spend
96
105
  # the slot on: it described the package by what it does not add, so the summary a reader saw
File without changes
File without changes