podstack 1.3.5__tar.gz → 1.3.6__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 (32) hide show
  1. {podstack-1.3.5 → podstack-1.3.6}/PKG-INFO +1 -1
  2. {podstack-1.3.5 → podstack-1.3.6}/podstack/gpu_runner.py +14 -5
  3. {podstack-1.3.5 → podstack-1.3.6}/podstack.egg-info/PKG-INFO +1 -1
  4. {podstack-1.3.5 → podstack-1.3.6}/pyproject.toml +1 -1
  5. {podstack-1.3.5 → podstack-1.3.6}/LICENSE +0 -0
  6. {podstack-1.3.5 → podstack-1.3.6}/README.md +0 -0
  7. {podstack-1.3.5 → podstack-1.3.6}/podstack/__init__.py +0 -0
  8. {podstack-1.3.5 → podstack-1.3.6}/podstack/annotations.py +0 -0
  9. {podstack-1.3.5 → podstack-1.3.6}/podstack/client.py +0 -0
  10. {podstack-1.3.5 → podstack-1.3.6}/podstack/exceptions.py +0 -0
  11. {podstack-1.3.5 → podstack-1.3.6}/podstack/execution.py +0 -0
  12. {podstack-1.3.5 → podstack-1.3.6}/podstack/models.py +0 -0
  13. {podstack-1.3.5 → podstack-1.3.6}/podstack/notebook.py +0 -0
  14. {podstack-1.3.5 → podstack-1.3.6}/podstack/registry/__init__.py +0 -0
  15. {podstack-1.3.5 → podstack-1.3.6}/podstack/registry/client.py +0 -0
  16. {podstack-1.3.5 → podstack-1.3.6}/podstack/registry/exceptions.py +0 -0
  17. {podstack-1.3.5 → podstack-1.3.6}/podstack/registry/experiment.py +0 -0
  18. {podstack-1.3.5 → podstack-1.3.6}/podstack/registry/model.py +0 -0
  19. {podstack-1.3.5 → podstack-1.3.6}/podstack/registry/model_utils.py +0 -0
  20. {podstack-1.3.5 → podstack-1.3.6}/podstack.egg-info/SOURCES.txt +0 -0
  21. {podstack-1.3.5 → podstack-1.3.6}/podstack.egg-info/dependency_links.txt +0 -0
  22. {podstack-1.3.5 → podstack-1.3.6}/podstack.egg-info/requires.txt +0 -0
  23. {podstack-1.3.5 → podstack-1.3.6}/podstack.egg-info/top_level.txt +0 -0
  24. {podstack-1.3.5 → podstack-1.3.6}/podstack_gpu/__init__.py +0 -0
  25. {podstack-1.3.5 → podstack-1.3.6}/podstack_gpu/app.py +0 -0
  26. {podstack-1.3.5 → podstack-1.3.6}/podstack_gpu/exceptions.py +0 -0
  27. {podstack-1.3.5 → podstack-1.3.6}/podstack_gpu/image.py +0 -0
  28. {podstack-1.3.5 → podstack-1.3.6}/podstack_gpu/runner.py +0 -0
  29. {podstack-1.3.5 → podstack-1.3.6}/podstack_gpu/secret.py +0 -0
  30. {podstack-1.3.5 → podstack-1.3.6}/podstack_gpu/utils.py +0 -0
  31. {podstack-1.3.5 → podstack-1.3.6}/podstack_gpu/volume.py +0 -0
  32. {podstack-1.3.5 → podstack-1.3.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: podstack
3
- Version: 1.3.5
3
+ Version: 1.3.6
4
4
  Summary: Official Python SDK for Podstack GPU Notebook Platform
5
5
  Author-email: Podstack <support@podstack.ai>
6
6
  License-Expression: MIT
@@ -205,10 +205,17 @@ class GPUExecutionResult:
205
205
 
206
206
  @classmethod
207
207
  def from_dict(cls, data: Dict[str, Any]) -> "GPUExecutionResult":
208
+ # The result API returns output as []ExecutionOutputResponse objects.
209
+ # Join their content fields into a single string.
210
+ raw_output = data.get("output", "")
211
+ if isinstance(raw_output, list):
212
+ output = "".join(item.get("content", "") for item in raw_output if item.get("content"))
213
+ else:
214
+ output = raw_output or ""
208
215
  return cls(
209
216
  execution_id=data.get("execution_id", ""),
210
217
  status=data.get("status", "unknown"),
211
- output=data.get("output", ""),
218
+ output=output,
212
219
  error=data.get("error"),
213
220
  gpu_seconds=data.get("gpu_seconds", 0.0),
214
221
  cost_paise=data.get("cost_cents", data.get("cost_paise", data.get("actual_cost_paise", 0))),
@@ -812,10 +819,12 @@ _stream_install(
812
819
  raise ConnectionError(f"Failed to get result after {max_retries} attempts: {e}")
813
820
  time.sleep(2 * (attempt + 1))
814
821
 
815
- # Prefer the streamed output over the API result's output field,
816
- # since __PODSTACK_RESULT__ is printed to stdout during execution.
817
- if output_buffer:
818
- result.output = "".join(output_buffer)
822
+ # If the API result's output doesn't have the result marker but the
823
+ # streaming buffer does (e.g. race between completed status and last
824
+ # stdout event), use the streaming buffer instead.
825
+ streamed = "".join(output_buffer)
826
+ if "__PODSTACK_RESULT__" not in result.output and "__PODSTACK_RESULT__" in streamed:
827
+ result.output = streamed
819
828
 
820
829
  if result.success:
821
830
  print(f"\n[Podstack] Completed in {result.gpu_seconds:.1f}s (cost: ₹{result.cost_paise/100:.2f})")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: podstack
3
- Version: 1.3.5
3
+ Version: 1.3.6
4
4
  Summary: Official Python SDK for Podstack GPU Notebook Platform
5
5
  Author-email: Podstack <support@podstack.ai>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "podstack"
7
- version = "1.3.5"
7
+ version = "1.3.6"
8
8
  description = "Official Python SDK for Podstack GPU Notebook Platform"
9
9
  readme = "README.md"
10
10
  license = "MIT"
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
File without changes
File without changes