wavespeed 2.0.0__tar.gz → 2.0.2__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 (38) hide show
  1. {wavespeed-2.0.0 → wavespeed-2.0.2}/.github/workflows/python-publish.yml +9 -3
  2. {wavespeed-2.0.0 → wavespeed-2.0.2}/CHANGELOG.md +8 -0
  3. {wavespeed-2.0.0 → wavespeed-2.0.2}/PKG-INFO +9 -2
  4. {wavespeed-2.0.0 → wavespeed-2.0.2}/README.md +5 -0
  5. {wavespeed-2.0.0 → wavespeed-2.0.2}/pyproject.toml +3 -1
  6. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed/_version.py +1 -1
  7. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed/api/client.py +7 -5
  8. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed.egg-info/PKG-INFO +9 -2
  9. wavespeed-2.0.2/src/wavespeed.egg-info/scm_version.json +8 -0
  10. {wavespeed-2.0.0 → wavespeed-2.0.2}/tests/test_api.py +8 -3
  11. wavespeed-2.0.0/src/wavespeed.egg-info/scm_version.json +0 -8
  12. {wavespeed-2.0.0 → wavespeed-2.0.2}/.github/workflows/claude.yml +0 -0
  13. {wavespeed-2.0.0 → wavespeed-2.0.2}/.github/workflows/pre-commit.yml +0 -0
  14. {wavespeed-2.0.0 → wavespeed-2.0.2}/.github/workflows/python-packages.yml +0 -0
  15. {wavespeed-2.0.0 → wavespeed-2.0.2}/.github/workflows/tests.yml +0 -0
  16. {wavespeed-2.0.0 → wavespeed-2.0.2}/.gitignore +0 -0
  17. {wavespeed-2.0.0 → wavespeed-2.0.2}/.pre-commit-config.yaml +0 -0
  18. {wavespeed-2.0.0 → wavespeed-2.0.2}/CLAUDE.md +0 -0
  19. {wavespeed-2.0.0 → wavespeed-2.0.2}/LICENSE +0 -0
  20. {wavespeed-2.0.0 → wavespeed-2.0.2}/MANIFEST.in +0 -0
  21. {wavespeed-2.0.0 → wavespeed-2.0.2}/VERSIONING.md +0 -0
  22. {wavespeed-2.0.0 → wavespeed-2.0.2}/assets/wavespeed-logo-dark.svg +0 -0
  23. {wavespeed-2.0.0 → wavespeed-2.0.2}/assets/wavespeed-logo-light.svg +0 -0
  24. {wavespeed-2.0.0 → wavespeed-2.0.2}/pytest.ini +0 -0
  25. {wavespeed-2.0.0 → wavespeed-2.0.2}/setup.cfg +0 -0
  26. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed/__init__.py +0 -0
  27. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed/_config_module.py +0 -0
  28. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed/api/__init__.py +0 -0
  29. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed/config.py +0 -0
  30. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed.egg-info/SOURCES.txt +0 -0
  31. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed.egg-info/dependency_links.txt +0 -0
  32. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed.egg-info/not-zip-safe +0 -0
  33. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed.egg-info/requires.txt +0 -0
  34. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed.egg-info/scm_file_list.json +0 -0
  35. {wavespeed-2.0.0 → wavespeed-2.0.2}/src/wavespeed.egg-info/top_level.txt +0 -0
  36. {wavespeed-2.0.0 → wavespeed-2.0.2}/tests/__init__.py +0 -0
  37. {wavespeed-2.0.0 → wavespeed-2.0.2}/tests/conftest.py +0 -0
  38. {wavespeed-2.0.0 → wavespeed-2.0.2}/tests/test_config.py +0 -0
@@ -8,9 +8,15 @@
8
8
 
9
9
  name: python-publish
10
10
 
11
+ # Triggered by the tag push itself, not by the GitHub Release.
12
+ # python-packages.yml creates that Release using GITHUB_TOKEN, and GitHub's
13
+ # anti-recursion rule means events produced by GITHUB_TOKEN never start another
14
+ # workflow — so `release: published` silently never fired here and the package
15
+ # was never uploaded, while every other check went green.
11
16
  on:
12
- release:
13
- types: [published]
17
+ push:
18
+ tags:
19
+ - "v[0-9]+*"
14
20
  workflow_dispatch:
15
21
 
16
22
  permissions:
@@ -20,7 +26,7 @@ jobs:
20
26
  deploy:
21
27
  if: >-
22
28
  github.repository == 'WaveSpeedAI/wavespeed-python' &&
23
- ((github.event_name == 'release' && github.ref_type == 'tag' &&
29
+ ((github.event_name == 'push' && github.ref_type == 'tag' &&
24
30
  startsWith(github.ref, 'refs/tags/v')) ||
25
31
  (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main'))
26
32
  runs-on: ubuntu-latest
@@ -4,6 +4,14 @@ All notable changes to this project are documented here.
4
4
 
5
5
  Versions are derived from Git tags via `setuptools_scm` — see [VERSIONING.md](VERSIONING.md).
6
6
 
7
+ ## 2.0.1
8
+
9
+ ### Changed
10
+
11
+ - PyPI project links now point at the product rather than only at the repository. `Homepage` is
12
+ `https://wavespeed.ai` (it was the GitHub repo), and `Documentation` and `Changelog` entries were
13
+ added. No code changes — packaging metadata only.
14
+
7
15
  ## 2.0.0
8
16
 
9
17
  ### Removed — BREAKING
@@ -1,12 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wavespeed
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: WaveSpeed Python Client — Official Python SDK for the WaveSpeed inference platform
5
5
  Author-email: WaveSpeedAI <support@wavespeed.ai>
6
6
  License: MIT
7
- Project-URL: Homepage, https://github.com/WaveSpeedAI/wavespeed-python
7
+ Project-URL: Homepage, https://wavespeed.ai
8
+ Project-URL: Documentation, https://wavespeed.ai/docs/
8
9
  Project-URL: Repository, https://github.com/WaveSpeedAI/wavespeed-python
9
10
  Project-URL: Issues, https://github.com/WaveSpeedAI/wavespeed-python/issues
11
+ Project-URL: Changelog, https://github.com/WaveSpeedAI/wavespeed-python/blob/main/CHANGELOG.md
10
12
  Classifier: Development Status :: 3 - Alpha
11
13
  Classifier: Intended Audience :: Developers
12
14
  Classifier: License :: OSI Approved :: MIT License
@@ -165,3 +167,8 @@ python -m pytest tests/test_api.py::TestClient::test_run_success -v
165
167
  ## License
166
168
 
167
169
  MIT
170
+
171
+ ---
172
+
173
+ **[WaveSpeed AI](https://wavespeed.ai/)** — AI image & video generation platform.
174
+ Try it in the browser: **[Image generator](https://wavespeed.ai/image-generator)** · **[Video generator](https://wavespeed.ai/video-generator)**
@@ -138,3 +138,8 @@ python -m pytest tests/test_api.py::TestClient::test_run_success -v
138
138
  ## License
139
139
 
140
140
  MIT
141
+
142
+ ---
143
+
144
+ **[WaveSpeed AI](https://wavespeed.ai/)** — AI image & video generation platform.
145
+ Try it in the browser: **[Image generator](https://wavespeed.ai/image-generator)** · **[Video generator](https://wavespeed.ai/video-generator)**
@@ -30,9 +30,11 @@ dependencies = [
30
30
  ]
31
31
 
32
32
  [project.urls]
33
- Homepage = "https://github.com/WaveSpeedAI/wavespeed-python"
33
+ Homepage = "https://wavespeed.ai"
34
+ Documentation = "https://wavespeed.ai/docs/"
34
35
  Repository = "https://github.com/WaveSpeedAI/wavespeed-python"
35
36
  Issues = "https://github.com/WaveSpeedAI/wavespeed-python/issues"
37
+ Changelog = "https://github.com/WaveSpeedAI/wavespeed-python/blob/main/CHANGELOG.md"
36
38
 
37
39
  [project.optional-dependencies]
38
40
  test = ["pytest"]
@@ -1,2 +1,2 @@
1
1
  # This file is automatically generated by setuptools_scm
2
- __version__ = "2.0.0"
2
+ __version__ = "2.0.2"
@@ -330,7 +330,7 @@ class Client:
330
330
  if status == "completed":
331
331
  return {"outputs": data.get("outputs", [])}
332
332
 
333
- if status in ("failed", "cancelled", "timeout"):
333
+ if status in ("failed", "cancelled", "timeout", "deleted"):
334
334
  error = data.get("error") or "Unknown error"
335
335
  raise RuntimeError(
336
336
  f"Prediction {status} (task_id: {request_id}): {error}"
@@ -371,13 +371,15 @@ class Client:
371
371
 
372
372
  return False
373
373
 
374
- @staticmethod
375
- def _format_sync_mode_error(data: dict[str, Any]) -> str:
374
+ def _format_sync_mode_error(self, data: dict[str, Any]) -> str:
376
375
  """Build an actionable error for a non-completed sync-mode response."""
377
376
  request_id = data.get("id") or "unknown"
378
377
  error = data.get("error") or "Unknown error"
379
- urls = data.get("urls") or {}
380
- result_url = urls.get("get") if isinstance(urls, dict) else None
378
+ result_url = (
379
+ f"{self.base_url}/api/v3/predictions/{request_id}/result"
380
+ if request_id != "unknown"
381
+ else None
382
+ )
381
383
 
382
384
  is_sync_timeout = data.get("code") == 5004 or (
383
385
  data.get("status") == "processing" and "Sync mode timed out" in error
@@ -1,12 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wavespeed
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: WaveSpeed Python Client — Official Python SDK for the WaveSpeed inference platform
5
5
  Author-email: WaveSpeedAI <support@wavespeed.ai>
6
6
  License: MIT
7
- Project-URL: Homepage, https://github.com/WaveSpeedAI/wavespeed-python
7
+ Project-URL: Homepage, https://wavespeed.ai
8
+ Project-URL: Documentation, https://wavespeed.ai/docs/
8
9
  Project-URL: Repository, https://github.com/WaveSpeedAI/wavespeed-python
9
10
  Project-URL: Issues, https://github.com/WaveSpeedAI/wavespeed-python/issues
11
+ Project-URL: Changelog, https://github.com/WaveSpeedAI/wavespeed-python/blob/main/CHANGELOG.md
10
12
  Classifier: Development Status :: 3 - Alpha
11
13
  Classifier: Intended Audience :: Developers
12
14
  Classifier: License :: OSI Approved :: MIT License
@@ -165,3 +167,8 @@ python -m pytest tests/test_api.py::TestClient::test_run_success -v
165
167
  ## License
166
168
 
167
169
  MIT
170
+
171
+ ---
172
+
173
+ **[WaveSpeed AI](https://wavespeed.ai/)** — AI image & video generation platform.
174
+ Try it in the browser: **[Image generator](https://wavespeed.ai/image-generator)** · **[Video generator](https://wavespeed.ai/video-generator)**
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2.0.2",
3
+ "distance": 0,
4
+ "node": "gac985323c284a8d135a6396b7dc2ac6f9f5e7fd4",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-26"
8
+ }
@@ -253,7 +253,6 @@ class TestClient(unittest.TestCase):
253
253
  "Sync mode timed out after 90 seconds. The prediction is "
254
254
  "still processing asynchronously."
255
255
  ),
256
- "urls": {"get": result_url},
257
256
  }
258
257
  }
259
258
  mock_post.return_value = mock_post_response
@@ -314,7 +313,7 @@ class TestModuleLevelRun(unittest.TestCase):
314
313
 
315
314
 
316
315
  class TestTerminalStatuses(unittest.TestCase):
317
- """Tests for cancelled/timeout terminal statuses in the wait loop."""
316
+ """Tests for non-success terminal statuses in the wait loop."""
318
317
 
319
318
  def _run_with_status(self, status):
320
319
  with patch("wavespeed.api.client.requests.post") as mock_post, patch(
@@ -349,6 +348,13 @@ class TestTerminalStatuses(unittest.TestCase):
349
348
  self.assertIn("Task timeout by server", str(ctx.exception))
350
349
  self.assertIn("req-123", str(ctx.exception))
351
350
 
351
+ def test_deleted_is_terminal(self):
352
+ """Test that a deleted status raises with the API's error text."""
353
+ with self.assertRaises(RuntimeError) as ctx:
354
+ self._run_with_status("deleted")
355
+ self.assertIn("Task deleted by server", str(ctx.exception))
356
+ self.assertIn("req-123", str(ctx.exception))
357
+
352
358
 
353
359
  class TestRunNoThrow(unittest.TestCase):
354
360
  """Tests for Client.run_no_throw and the module-level run_no_throw."""
@@ -417,7 +423,6 @@ class TestRunNoThrow(unittest.TestCase):
417
423
  "Sync mode timed out after 90 seconds. The prediction is "
418
424
  "still processing asynchronously."
419
425
  ),
420
- "urls": {"get": result_url},
421
426
  }
422
427
  }
423
428
  mock_post.return_value = mock_post_response
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "2.0.0",
3
- "distance": 0,
4
- "node": "g78cae9fc88719fddd44412a5ae5f6e7d1c9d283e",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-08-20"
8
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes