Python 3.15 rc3 in CI: test your Sume job poll logic before Oct 9
Python 3.15.0rc3 is out and the final is planned for Oct 9. Add a CI job that runs a stdlib unittest on your Sume status-poll decision function.

Add a CI job on Python 3.15.0rc3 that runs a plain unittest against the one function that decides what your Sume poller does next. The rc3 announcement says 3.15.0rc3 was released on October 2, 2026, with the final release planned for October 9, 2026. It also says there are no ABI changes from this point, and that it is a preview, not for production use.
That makes it the right week for a cheap check. You are not moving production; you are finding out now whether your own code behaves the same on the interpreter you will get next week. A poll-decision function is a good candidate because it is pure: a status document goes in, an action and a wait come out, and no network is needed.
What to put under test
Sume's GET /v1/jobs/{id}/status returns a document with status, terminal, result_ready and next_poll_after_seconds, described in the jobs and results docs. The wait hint is null once a job is terminal, which is a classic crash for loops that sleep on it unconditionally. Treat the wait as a hint with a floor, not a promise: if the server asks for a longer pause, wait longer, and if it sends nothing, fall back to your own minimum. A test that feeds each shape of document through your decision function catches that class of bug on every Python version you support.
| Item | Value | Source |
|---|---|---|
| 3.15.0rc3 released | Oct 2, 2026 | Python blog |
| 3.15.0 final planned | Oct 9, 2026 | Python blog |
| ABI | No changes from rc3 onward | Python blog |
| Status when terminal | next_poll_after_seconds is null | Sume jobs docs |
| Done and ready | terminal true and result_ready true, then GET /result | Sume jobs docs |
Steps
- Pull the decision into a function with no I/O, as below, so the test needs no mock server. Pass the floor in as a parameter so a test can change it.
- Run
python -m unittestin your matrix on 3.14 and on the 3.15 release candidate. Mark the 3.15 row as allowed to fail until the final lands. - After October 9, switch the row to the final release and make it required.
- Keep a second, slower test elsewhere that calls the real API with a cheap request, after reading the quick start for key setup.
Sample
This file defines the decision function and four tests. We ran it on Python 3.14.7; it uses only the standard library and syntax that is valid on 3.14, so it should behave the same on 3.15. We have not run it on 3.15 itself.
import unittest
def next_step(doc: dict, floor: float = 2.0) -> tuple[str, float]:
data = doc["data"]
if data["terminal"]:
return ("fetch_result" if data["result_ready"] else "stop", 0.0)
wait = data.get("next_poll_after_seconds") or floor
return ("poll", max(float(wait), floor))
class NextStepTest(unittest.TestCase):
def doc(self, **kw):
base = {"terminal": False, "result_ready": False, "next_poll_after_seconds": None}
return {"data": base | kw}
def test_waits_for_server_hint(self):
self.assertEqual(next_step(self.doc(next_poll_after_seconds=7)), ("poll", 7.0))
def test_floor_when_hint_missing(self):
self.assertEqual(next_step(self.doc()), ("poll", 2.0))
def test_completed_fetches_result(self):
done = self.doc(terminal=True, result_ready=True)
self.assertEqual(next_step(done), ("fetch_result", 0.0))
def test_failed_stops(self):
self.assertEqual(next_step(self.doc(terminal=True)), ("stop", 0.0))
if __name__ == "__main__":
unittest.main()What Sume does not do
Sume does not certify any Python version. The docs describe the HTTP API, and any client that can send HTTPS requests works. The runtime claims in this post come from the Python announcement, and the status fields come from the Sume docs. If your poller depends on a library, test that library on 3.15 too, because wheels are the more common source of surprises than your own code.
Sources
Related posts
More in Developers
- Python argparse CLI that checks seconds per Sume model first
A 25-line argparse CLI: choices reject unknown models, a duration check uses the documented limits, and --dry-run prints the body. Runs offline.
- Python asyncio price check: one Omni Flash clip at four resolutions
A runnable Python script submits a 3-second Omni Flash clip at 360p, 720p, 1080p and 4K together and prints usage.cost. Expect $2.20 in total.
- Python check: is this MP4 over TikTok's 516 kbps? Size and duration
A short Python function turns file bytes and duration_seconds into average kbps and tests TikTok's 516 kbps floor, 500 MB cap and 10-minute limit.
- Python fallback chain for Sume video models: 404 and 503 only
After the Sora API shutdown, a model chain must not retry everything. This Python function moves on at 404 and 503 and stops on 429, 402, 400, 409.
Written by Sume