runloop-api-client 0.1.0a20__tar.gz → 0.1.0a22__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 (128) hide show
  1. runloop_api_client-0.1.0a22/.release-please-manifest.json +3 -0
  2. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/CHANGELOG.md +43 -0
  3. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/CONTRIBUTING.md +28 -24
  4. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/PKG-INFO +16 -1
  5. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/README.md +15 -0
  6. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/pyproject.toml +1 -1
  7. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/requirements-dev.lock +3 -3
  8. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_base_client.py +63 -48
  9. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_compat.py +2 -0
  10. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/_utils.py +4 -3
  11. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_version.py +1 -1
  12. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/blueprints.py +38 -16
  13. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/devboxes/devboxes.py +40 -10
  14. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/devboxes/executions.py +26 -4
  15. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/devboxes/logs.py +22 -0
  16. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/functions/functions.py +22 -0
  17. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/functions/invocations.py +22 -0
  18. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/projects/logs.py +22 -0
  19. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/projects/projects.py +22 -0
  20. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_build_log.py +4 -4
  21. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +3 -3
  22. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_build_parameters.py +3 -3
  23. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_create_params.py +4 -4
  24. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_list_view.py +4 -4
  25. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_preview_params.py +4 -4
  26. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_preview_view.py +2 -2
  27. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_view.py +8 -8
  28. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/code_mount_parameters.py +8 -8
  29. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/code_mount_parameters_param.py +9 -9
  30. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +5 -5
  31. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_create_params.py +3 -0
  32. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +4 -4
  33. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_execute_async_params.py +2 -2
  34. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_execute_sync_params.py +2 -2
  35. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_execution_detail_view.py +7 -7
  36. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_list_view.py +4 -4
  37. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_read_file_contents_params.py +2 -2
  38. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_view.py +36 -18
  39. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_write_file_params.py +3 -3
  40. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +10 -10
  41. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +2 -2
  42. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +2 -2
  43. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/project_list_view.py +7 -7
  44. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/resource_size.py +1 -1
  45. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/shared/project_logs_view.py +6 -6
  46. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/devboxes/test_executions.py +16 -0
  47. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/test_blueprints.py +68 -44
  48. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/test_devboxes.py +50 -42
  49. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_client.py +96 -0
  50. runloop_api_client-0.1.0a20/.release-please-manifest.json +0 -3
  51. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/.gitignore +0 -0
  52. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/LICENSE +0 -0
  53. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/SECURITY.md +0 -0
  54. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/api.md +0 -0
  55. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/bin/check-release-environment +0 -0
  56. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/bin/publish-pypi +0 -0
  57. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/examples/.keep +0 -0
  58. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/mypy.ini +0 -0
  59. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/noxfile.py +0 -0
  60. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/release-please-config.json +0 -0
  61. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/requirements.lock +0 -0
  62. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop/lib/.keep +0 -0
  63. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/__init__.py +0 -0
  64. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_client.py +0 -0
  65. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_constants.py +0 -0
  66. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_exceptions.py +0 -0
  67. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_files.py +0 -0
  68. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_models.py +0 -0
  69. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_qs.py +0 -0
  70. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_resource.py +0 -0
  71. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_response.py +0 -0
  72. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_streaming.py +0 -0
  73. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_types.py +0 -0
  74. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/__init__.py +0 -0
  75. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/_logs.py +0 -0
  76. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/_proxy.py +0 -0
  77. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/_reflection.py +0 -0
  78. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/_streams.py +0 -0
  79. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/_sync.py +0 -0
  80. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/_transform.py +0 -0
  81. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/_utils/_typing.py +0 -0
  82. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/lib/.keep +0 -0
  83. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/py.typed +0 -0
  84. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/__init__.py +0 -0
  85. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  86. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/functions/__init__.py +0 -0
  87. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/resources/projects/__init__.py +0 -0
  88. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/__init__.py +0 -0
  89. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  90. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_list_params.py +0 -0
  91. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  92. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  93. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  94. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  95. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  96. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/function_invoke_async_params.py +0 -0
  97. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/function_invoke_sync_params.py +0 -0
  98. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/function_list_view.py +0 -0
  99. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/functions/__init__.py +0 -0
  100. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/functions/function_invocation_list_view.py +0 -0
  101. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/functions/invocation_list_params.py +0 -0
  102. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/projects/__init__.py +0 -0
  103. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/shared/__init__.py +0 -0
  104. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/src/runloop_api_client/types/shared/function_invocation_execution_detail_view.py +0 -0
  105. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/__init__.py +0 -0
  106. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/__init__.py +0 -0
  107. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/devboxes/__init__.py +0 -0
  108. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/devboxes/test_logs.py +0 -0
  109. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/functions/__init__.py +0 -0
  110. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/functions/test_invocations.py +0 -0
  111. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/projects/__init__.py +0 -0
  112. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/projects/test_logs.py +0 -0
  113. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/test_functions.py +0 -0
  114. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/api_resources/test_projects.py +0 -0
  115. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/conftest.py +0 -0
  116. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/sample_file.txt +0 -0
  117. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_deepcopy.py +0 -0
  118. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_extract_files.py +0 -0
  119. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_files.py +0 -0
  120. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_models.py +0 -0
  121. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_qs.py +0 -0
  122. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_required_args.py +0 -0
  123. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_response.py +0 -0
  124. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_streaming.py +0 -0
  125. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_transform.py +0 -0
  126. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_utils/test_proxy.py +0 -0
  127. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/test_utils/test_typing.py +0 -0
  128. {runloop_api_client-0.1.0a20 → runloop_api_client-0.1.0a22}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.1.0-alpha.22"
3
+ }
@@ -1,5 +1,48 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0-alpha.22 (2024-10-01)
4
+
5
+ Full Changelog: [v0.1.0-alpha.21...v0.1.0-alpha.22](https://github.com/runloopai/api-client-python/compare/v0.1.0-alpha.21...v0.1.0-alpha.22)
6
+
7
+ ### Features
8
+
9
+ * **api:** OpenAPI spec update via Stainless API ([#174](https://github.com/runloopai/api-client-python/issues/174)) ([83ea2bc](https://github.com/runloopai/api-client-python/commit/83ea2bc3a8e222ab35f23145ba30a003574719a8))
10
+
11
+ ## 0.1.0-alpha.21 (2024-10-01)
12
+
13
+ Full Changelog: [v0.1.0-alpha.20...v0.1.0-alpha.21](https://github.com/runloopai/api-client-python/compare/v0.1.0-alpha.20...v0.1.0-alpha.21)
14
+
15
+ ### Features
16
+
17
+ * **api:** OpenAPI spec update via Stainless API ([#156](https://github.com/runloopai/api-client-python/issues/156)) ([1594f34](https://github.com/runloopai/api-client-python/commit/1594f3430e0ad1f1441fdeaaf374760b9e2edfe6))
18
+ * **api:** OpenAPI spec update via Stainless API ([#160](https://github.com/runloopai/api-client-python/issues/160)) ([ee5dccc](https://github.com/runloopai/api-client-python/commit/ee5dccc7797e5786d627c5df12c9ccdf9bcf46c5))
19
+ * **api:** OpenAPI spec update via Stainless API ([#161](https://github.com/runloopai/api-client-python/issues/161)) ([47f9ac6](https://github.com/runloopai/api-client-python/commit/47f9ac690ce50b93675eab8bfa0d17b9059b8a44))
20
+ * **api:** OpenAPI spec update via Stainless API ([#162](https://github.com/runloopai/api-client-python/issues/162)) ([0ac9009](https://github.com/runloopai/api-client-python/commit/0ac900945faa6d3d273011e1928be6601e8497bb))
21
+ * **api:** OpenAPI spec update via Stainless API ([#163](https://github.com/runloopai/api-client-python/issues/163)) ([c819584](https://github.com/runloopai/api-client-python/commit/c8195846f3185b500783ece288d3252690c75ab9))
22
+ * **api:** OpenAPI spec update via Stainless API ([#167](https://github.com/runloopai/api-client-python/issues/167)) ([3a84eea](https://github.com/runloopai/api-client-python/commit/3a84eea63b488bde4821fe8787aa4c5a3abb98a0))
23
+ * **api:** OpenAPI spec update via Stainless API ([#168](https://github.com/runloopai/api-client-python/issues/168)) ([c9a19cb](https://github.com/runloopai/api-client-python/commit/c9a19cb521ce8168566f01373039d555dde6ff08))
24
+ * **api:** OpenAPI spec update via Stainless API ([#171](https://github.com/runloopai/api-client-python/issues/171)) ([d814a44](https://github.com/runloopai/api-client-python/commit/d814a441646b587ad10d985cc8e38c2e2e5399a4))
25
+ * **client:** send retry count header ([#170](https://github.com/runloopai/api-client-python/issues/170)) ([8390f52](https://github.com/runloopai/api-client-python/commit/8390f52895f48665cf09c3a87e61fef2cc0c3027))
26
+
27
+
28
+ ### Bug Fixes
29
+
30
+ * **client:** handle domains with underscores ([#169](https://github.com/runloopai/api-client-python/issues/169)) ([8485f86](https://github.com/runloopai/api-client-python/commit/8485f8692c5bcb94cbc4f4389b6e30117c0231aa))
31
+
32
+
33
+ ### Chores
34
+
35
+ * add docstrings to raw response properties ([#158](https://github.com/runloopai/api-client-python/issues/158)) ([762a6b3](https://github.com/runloopai/api-client-python/commit/762a6b3ae34b6b4f3797e56a0464c421d66edeb8))
36
+ * **internal:** bump pyright / mypy version ([#166](https://github.com/runloopai/api-client-python/issues/166)) ([69bc4f3](https://github.com/runloopai/api-client-python/commit/69bc4f338353430426ca64873bff8fff5a40313a))
37
+ * **internal:** bump ruff ([#165](https://github.com/runloopai/api-client-python/issues/165)) ([1085a1c](https://github.com/runloopai/api-client-python/commit/1085a1cbd2f039c971b337827bb87e35d9f9941f))
38
+ * **internal:** codegen related update ([#172](https://github.com/runloopai/api-client-python/issues/172)) ([b2e05d5](https://github.com/runloopai/api-client-python/commit/b2e05d5f307c618a0407a55744c97c9a44721f60))
39
+
40
+
41
+ ### Documentation
42
+
43
+ * **readme:** add section on determining installed version ([#159](https://github.com/runloopai/api-client-python/issues/159)) ([9f23958](https://github.com/runloopai/api-client-python/commit/9f239589e7a058b54ef79d25944f43a49621940b))
44
+ * update CONTRIBUTING.md ([#164](https://github.com/runloopai/api-client-python/issues/164)) ([169ef14](https://github.com/runloopai/api-client-python/commit/169ef149c8db980beb50b72823d4b2b87c202846))
45
+
3
46
  ## 0.1.0-alpha.20 (2024-09-06)
4
47
 
5
48
  Full Changelog: [v0.1.0-alpha.19...v0.1.0-alpha.20](https://github.com/runloopai/api-client-python/compare/v0.1.0-alpha.19...v0.1.0-alpha.20)
@@ -2,9 +2,13 @@
2
2
 
3
3
  ### With Rye
4
4
 
5
- We use [Rye](https://rye.astral.sh/) to manage dependencies so we highly recommend [installing it](https://rye.astral.sh/guide/installation/) as it will automatically provision a Python environment with the expected Python version.
5
+ We use [Rye](https://rye.astral.sh/) to manage dependencies because it will automatically provision a Python environment with the expected Python version. To set it up, run:
6
6
 
7
- After installing Rye, you'll just have to run this command:
7
+ ```sh
8
+ $ ./scripts/bootstrap
9
+ ```
10
+
11
+ Or [install Rye manually](https://rye.astral.sh/guide/installation/) and run:
8
12
 
9
13
  ```sh
10
14
  $ rye sync --all-features
@@ -31,25 +35,25 @@ $ pip install -r requirements-dev.lock
31
35
 
32
36
  ## Modifying/Adding code
33
37
 
34
- Most of the SDK is generated code, and any modified code will be overridden on the next generation. The
35
- `src/runloop_api_client/lib/` and `examples/` directories are exceptions and will never be overridden.
38
+ Most of the SDK is generated code. Modifications to code will be persisted between generations, but may
39
+ result in merge conflicts between manual patches and changes from the generator. The generator will never
40
+ modify the contents of the `src/runloop_api_client/lib/` and `examples/` directories.
36
41
 
37
42
  ## Adding and running examples
38
43
 
39
- All files in the `examples/` directory are not modified by the Stainless generator and can be freely edited or
40
- added to.
44
+ All files in the `examples/` directory are not modified by the generator and can be freely edited or added to.
41
45
 
42
- ```bash
46
+ ```py
43
47
  # add an example to examples/<your-example>.py
44
48
 
45
49
  #!/usr/bin/env -S rye run python
46
50
  …
47
51
  ```
48
52
 
49
- ```
50
- chmod +x examples/<your-example>.py
53
+ ```sh
54
+ $ chmod +x examples/<your-example>.py
51
55
  # run the example against your api
52
- ./examples/<your-example>.py
56
+ $ ./examples/<your-example>.py
53
57
  ```
54
58
 
55
59
  ## Using the repository from source
@@ -58,8 +62,8 @@ If you’d like to use the repository from source, you can either install from g
58
62
 
59
63
  To install via git:
60
64
 
61
- ```bash
62
- pip install git+ssh://git@github.com/runloopai/api-client-python.git
65
+ ```sh
66
+ $ pip install git+ssh://git@github.com/runloopai/api-client-python.git
63
67
  ```
64
68
 
65
69
  Alternatively, you can build from source and install the wheel file:
@@ -68,29 +72,29 @@ Building this package will create two files in the `dist/` directory, a `.tar.gz
68
72
 
69
73
  To create a distributable version of the library, all you have to do is run this command:
70
74
 
71
- ```bash
72
- rye build
75
+ ```sh
76
+ $ rye build
73
77
  # or
74
- python -m build
78
+ $ python -m build
75
79
  ```
76
80
 
77
81
  Then to install:
78
82
 
79
83
  ```sh
80
- pip install ./path-to-wheel-file.whl
84
+ $ pip install ./path-to-wheel-file.whl
81
85
  ```
82
86
 
83
87
  ## Running tests
84
88
 
85
89
  Most tests require you to [set up a mock server](https://github.com/stoplightio/prism) against the OpenAPI spec to run the tests.
86
90
 
87
- ```bash
91
+ ```sh
88
92
  # you will need npm installed
89
- npx prism mock path/to/your/openapi.yml
93
+ $ npx prism mock path/to/your/openapi.yml
90
94
  ```
91
95
 
92
- ```bash
93
- rye run pytest
96
+ ```sh
97
+ $ ./scripts/test
94
98
  ```
95
99
 
96
100
  ## Linting and formatting
@@ -100,14 +104,14 @@ This repository uses [ruff](https://github.com/astral-sh/ruff) and
100
104
 
101
105
  To lint:
102
106
 
103
- ```bash
104
- rye run lint
107
+ ```sh
108
+ $ ./scripts/lint
105
109
  ```
106
110
 
107
111
  To format and fix all ruff issues automatically:
108
112
 
109
- ```bash
110
- rye run format
113
+ ```sh
114
+ $ ./scripts/format
111
115
  ```
112
116
 
113
117
  ## Publishing and releases
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 0.1.0a20
3
+ Version: 0.1.0a22
4
4
  Summary: The official Python library for the runloop API
5
5
  Project-URL: Homepage, https://github.com/runloopai/api-client-python
6
6
  Project-URL: Repository, https://github.com/runloopai/api-client-python
@@ -335,6 +335,21 @@ We take backwards-compatibility seriously and work hard to ensure you can rely o
335
335
 
336
336
  We are keen for your feedback; please open an [issue](https://www.github.com/runloopai/api-client-python/issues) with questions, bugs, or suggestions.
337
337
 
338
+ ### Determining the installed version
339
+
340
+ If you've upgraded to the latest version but aren't seeing any new features you were expecting then your python environment is likely still using an older version.
341
+
342
+ You can determine the version that is being used at runtime with:
343
+
344
+ ```py
345
+ import runloop_api_client
346
+ print(runloop_api_client.__version__)
347
+ ```
348
+
338
349
  ## Requirements
339
350
 
340
351
  Python 3.7 or higher.
352
+
353
+ ## Contributing
354
+
355
+ See [the contributing documentation](https://github.com/runloopai/api-client-python/tree/main/./CONTRIBUTING.md).
@@ -301,6 +301,21 @@ We take backwards-compatibility seriously and work hard to ensure you can rely o
301
301
 
302
302
  We are keen for your feedback; please open an [issue](https://www.github.com/runloopai/api-client-python/issues) with questions, bugs, or suggestions.
303
303
 
304
+ ### Determining the installed version
305
+
306
+ If you've upgraded to the latest version but aren't seeing any new features you were expecting then your python environment is likely still using an older version.
307
+
308
+ You can determine the version that is being used at runtime with:
309
+
310
+ ```py
311
+ import runloop_api_client
312
+ print(runloop_api_client.__version__)
313
+ ```
314
+
304
315
  ## Requirements
305
316
 
306
317
  Python 3.7 or higher.
318
+
319
+ ## Contributing
320
+
321
+ See [the contributing documentation](./CONTRIBUTING.md).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "runloop_api_client"
3
- version = "0.1.0-alpha.20"
3
+ version = "0.1.0-alpha.22"
4
4
  description = "The official Python library for the runloop API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
@@ -49,7 +49,7 @@ markdown-it-py==3.0.0
49
49
  # via rich
50
50
  mdurl==0.1.2
51
51
  # via markdown-it-py
52
- mypy==1.10.1
52
+ mypy==1.11.2
53
53
  mypy-extensions==1.0.0
54
54
  # via mypy
55
55
  nodeenv==1.8.0
@@ -70,7 +70,7 @@ pydantic-core==2.18.2
70
70
  # via pydantic
71
71
  pygments==2.18.0
72
72
  # via rich
73
- pyright==1.1.374
73
+ pyright==1.1.380
74
74
  pytest==7.1.1
75
75
  # via pytest-asyncio
76
76
  pytest-asyncio==0.21.1
@@ -80,7 +80,7 @@ pytz==2023.3.post1
80
80
  # via dirty-equals
81
81
  respx==0.20.2
82
82
  rich==13.7.1
83
- ruff==0.5.6
83
+ ruff==0.6.5
84
84
  setuptools==68.2.2
85
85
  # via nodeenv
86
86
  six==1.16.0
@@ -400,14 +400,7 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
400
400
  ) -> _exceptions.APIStatusError:
401
401
  raise NotImplementedError()
402
402
 
403
- def _remaining_retries(
404
- self,
405
- remaining_retries: Optional[int],
406
- options: FinalRequestOptions,
407
- ) -> int:
408
- return remaining_retries if remaining_retries is not None else options.get_max_retries(self.max_retries)
409
-
410
- def _build_headers(self, options: FinalRequestOptions) -> httpx.Headers:
403
+ def _build_headers(self, options: FinalRequestOptions, *, retries_taken: int = 0) -> httpx.Headers:
411
404
  custom_headers = options.headers or {}
412
405
  headers_dict = _merge_mappings(self.default_headers, custom_headers)
413
406
  self._validate_headers(headers_dict, custom_headers)
@@ -419,6 +412,11 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
419
412
  if idempotency_header and options.method.lower() != "get" and idempotency_header not in headers:
420
413
  headers[idempotency_header] = options.idempotency_key or self._idempotency_key()
421
414
 
415
+ # Don't set the retry count header if it was already set or removed by the caller. We check
416
+ # `custom_headers`, which can contain `Omit()`, instead of `headers` to account for the removal case.
417
+ if "x-stainless-retry-count" not in (header.lower() for header in custom_headers):
418
+ headers["x-stainless-retry-count"] = str(retries_taken)
419
+
422
420
  return headers
423
421
 
424
422
  def _prepare_url(self, url: str) -> URL:
@@ -440,6 +438,8 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
440
438
  def _build_request(
441
439
  self,
442
440
  options: FinalRequestOptions,
441
+ *,
442
+ retries_taken: int = 0,
443
443
  ) -> httpx.Request:
444
444
  if log.isEnabledFor(logging.DEBUG):
445
445
  log.debug("Request options: %s", model_dump(options, exclude_unset=True))
@@ -455,7 +455,7 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
455
455
  else:
456
456
  raise RuntimeError(f"Unexpected JSON data type, {type(json_data)}, cannot merge with `extra_body`")
457
457
 
458
- headers = self._build_headers(options)
458
+ headers = self._build_headers(options, retries_taken=retries_taken)
459
459
  params = _merge_mappings(self.default_query, options.params)
460
460
  content_type = headers.get("Content-Type")
461
461
  files = options.files
@@ -489,12 +489,17 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
489
489
  if not files:
490
490
  files = cast(HttpxRequestFiles, ForceMultipartDict())
491
491
 
492
+ prepared_url = self._prepare_url(options.url)
493
+ if "_" in prepared_url.host:
494
+ # work around https://github.com/encode/httpx/discussions/2880
495
+ kwargs["extensions"] = {"sni_hostname": prepared_url.host.replace("_", "-")}
496
+
492
497
  # TODO: report this error to httpx
493
498
  return self._client.build_request( # pyright: ignore[reportUnknownMemberType]
494
499
  headers=headers,
495
500
  timeout=self.timeout if isinstance(options.timeout, NotGiven) else options.timeout,
496
501
  method=options.method,
497
- url=self._prepare_url(options.url),
502
+ url=prepared_url,
498
503
  # the `Query` type that we use is incompatible with qs'
499
504
  # `Params` type as it needs to be typed as `Mapping[str, object]`
500
505
  # so that passing a `TypedDict` doesn't cause an error.
@@ -933,12 +938,17 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
933
938
  stream: bool = False,
934
939
  stream_cls: type[_StreamT] | None = None,
935
940
  ) -> ResponseT | _StreamT:
941
+ if remaining_retries is not None:
942
+ retries_taken = options.get_max_retries(self.max_retries) - remaining_retries
943
+ else:
944
+ retries_taken = 0
945
+
936
946
  return self._request(
937
947
  cast_to=cast_to,
938
948
  options=options,
939
949
  stream=stream,
940
950
  stream_cls=stream_cls,
941
- remaining_retries=remaining_retries,
951
+ retries_taken=retries_taken,
942
952
  )
943
953
 
944
954
  def _request(
@@ -946,7 +956,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
946
956
  *,
947
957
  cast_to: Type[ResponseT],
948
958
  options: FinalRequestOptions,
949
- remaining_retries: int | None,
959
+ retries_taken: int,
950
960
  stream: bool,
951
961
  stream_cls: type[_StreamT] | None,
952
962
  ) -> ResponseT | _StreamT:
@@ -958,8 +968,8 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
958
968
  cast_to = self._maybe_override_cast_to(cast_to, options)
959
969
  options = self._prepare_options(options)
960
970
 
961
- retries = self._remaining_retries(remaining_retries, options)
962
- request = self._build_request(options)
971
+ remaining_retries = options.get_max_retries(self.max_retries) - retries_taken
972
+ request = self._build_request(options, retries_taken=retries_taken)
963
973
  self._prepare_request(request)
964
974
 
965
975
  kwargs: HttpxSendArgs = {}
@@ -977,11 +987,11 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
977
987
  except httpx.TimeoutException as err:
978
988
  log.debug("Encountered httpx.TimeoutException", exc_info=True)
979
989
 
980
- if retries > 0:
990
+ if remaining_retries > 0:
981
991
  return self._retry_request(
982
992
  input_options,
983
993
  cast_to,
984
- retries,
994
+ retries_taken=retries_taken,
985
995
  stream=stream,
986
996
  stream_cls=stream_cls,
987
997
  response_headers=None,
@@ -992,11 +1002,11 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
992
1002
  except Exception as err:
993
1003
  log.debug("Encountered Exception", exc_info=True)
994
1004
 
995
- if retries > 0:
1005
+ if remaining_retries > 0:
996
1006
  return self._retry_request(
997
1007
  input_options,
998
1008
  cast_to,
999
- retries,
1009
+ retries_taken=retries_taken,
1000
1010
  stream=stream,
1001
1011
  stream_cls=stream_cls,
1002
1012
  response_headers=None,
@@ -1019,13 +1029,13 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1019
1029
  except httpx.HTTPStatusError as err: # thrown on 4xx and 5xx status code
1020
1030
  log.debug("Encountered httpx.HTTPStatusError", exc_info=True)
1021
1031
 
1022
- if retries > 0 and self._should_retry(err.response):
1032
+ if remaining_retries > 0 and self._should_retry(err.response):
1023
1033
  err.response.close()
1024
1034
  return self._retry_request(
1025
1035
  input_options,
1026
1036
  cast_to,
1027
- retries,
1028
- err.response.headers,
1037
+ retries_taken=retries_taken,
1038
+ response_headers=err.response.headers,
1029
1039
  stream=stream,
1030
1040
  stream_cls=stream_cls,
1031
1041
  )
@@ -1044,26 +1054,26 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1044
1054
  response=response,
1045
1055
  stream=stream,
1046
1056
  stream_cls=stream_cls,
1047
- retries_taken=options.get_max_retries(self.max_retries) - retries,
1057
+ retries_taken=retries_taken,
1048
1058
  )
1049
1059
 
1050
1060
  def _retry_request(
1051
1061
  self,
1052
1062
  options: FinalRequestOptions,
1053
1063
  cast_to: Type[ResponseT],
1054
- remaining_retries: int,
1055
- response_headers: httpx.Headers | None,
1056
1064
  *,
1065
+ retries_taken: int,
1066
+ response_headers: httpx.Headers | None,
1057
1067
  stream: bool,
1058
1068
  stream_cls: type[_StreamT] | None,
1059
1069
  ) -> ResponseT | _StreamT:
1060
- remaining = remaining_retries - 1
1061
- if remaining == 1:
1070
+ remaining_retries = options.get_max_retries(self.max_retries) - retries_taken
1071
+ if remaining_retries == 1:
1062
1072
  log.debug("1 retry left")
1063
1073
  else:
1064
- log.debug("%i retries left", remaining)
1074
+ log.debug("%i retries left", remaining_retries)
1065
1075
 
1066
- timeout = self._calculate_retry_timeout(remaining, options, response_headers)
1076
+ timeout = self._calculate_retry_timeout(remaining_retries, options, response_headers)
1067
1077
  log.info("Retrying request to %s in %f seconds", options.url, timeout)
1068
1078
 
1069
1079
  # In a synchronous context we are blocking the entire thread. Up to the library user to run the client in a
@@ -1073,7 +1083,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1073
1083
  return self._request(
1074
1084
  options=options,
1075
1085
  cast_to=cast_to,
1076
- remaining_retries=remaining,
1086
+ retries_taken=retries_taken + 1,
1077
1087
  stream=stream,
1078
1088
  stream_cls=stream_cls,
1079
1089
  )
@@ -1491,12 +1501,17 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1491
1501
  stream_cls: type[_AsyncStreamT] | None = None,
1492
1502
  remaining_retries: Optional[int] = None,
1493
1503
  ) -> ResponseT | _AsyncStreamT:
1504
+ if remaining_retries is not None:
1505
+ retries_taken = options.get_max_retries(self.max_retries) - remaining_retries
1506
+ else:
1507
+ retries_taken = 0
1508
+
1494
1509
  return await self._request(
1495
1510
  cast_to=cast_to,
1496
1511
  options=options,
1497
1512
  stream=stream,
1498
1513
  stream_cls=stream_cls,
1499
- remaining_retries=remaining_retries,
1514
+ retries_taken=retries_taken,
1500
1515
  )
1501
1516
 
1502
1517
  async def _request(
@@ -1506,7 +1521,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1506
1521
  *,
1507
1522
  stream: bool,
1508
1523
  stream_cls: type[_AsyncStreamT] | None,
1509
- remaining_retries: int | None,
1524
+ retries_taken: int,
1510
1525
  ) -> ResponseT | _AsyncStreamT:
1511
1526
  if self._platform is None:
1512
1527
  # `get_platform` can make blocking IO calls so we
@@ -1521,8 +1536,8 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1521
1536
  cast_to = self._maybe_override_cast_to(cast_to, options)
1522
1537
  options = await self._prepare_options(options)
1523
1538
 
1524
- retries = self._remaining_retries(remaining_retries, options)
1525
- request = self._build_request(options)
1539
+ remaining_retries = options.get_max_retries(self.max_retries) - retries_taken
1540
+ request = self._build_request(options, retries_taken=retries_taken)
1526
1541
  await self._prepare_request(request)
1527
1542
 
1528
1543
  kwargs: HttpxSendArgs = {}
@@ -1538,11 +1553,11 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1538
1553
  except httpx.TimeoutException as err:
1539
1554
  log.debug("Encountered httpx.TimeoutException", exc_info=True)
1540
1555
 
1541
- if retries > 0:
1556
+ if remaining_retries > 0:
1542
1557
  return await self._retry_request(
1543
1558
  input_options,
1544
1559
  cast_to,
1545
- retries,
1560
+ retries_taken=retries_taken,
1546
1561
  stream=stream,
1547
1562
  stream_cls=stream_cls,
1548
1563
  response_headers=None,
@@ -1553,11 +1568,11 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1553
1568
  except Exception as err:
1554
1569
  log.debug("Encountered Exception", exc_info=True)
1555
1570
 
1556
- if retries > 0:
1571
+ if retries_taken > 0:
1557
1572
  return await self._retry_request(
1558
1573
  input_options,
1559
1574
  cast_to,
1560
- retries,
1575
+ retries_taken=retries_taken,
1561
1576
  stream=stream,
1562
1577
  stream_cls=stream_cls,
1563
1578
  response_headers=None,
@@ -1575,13 +1590,13 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1575
1590
  except httpx.HTTPStatusError as err: # thrown on 4xx and 5xx status code
1576
1591
  log.debug("Encountered httpx.HTTPStatusError", exc_info=True)
1577
1592
 
1578
- if retries > 0 and self._should_retry(err.response):
1593
+ if remaining_retries > 0 and self._should_retry(err.response):
1579
1594
  await err.response.aclose()
1580
1595
  return await self._retry_request(
1581
1596
  input_options,
1582
1597
  cast_to,
1583
- retries,
1584
- err.response.headers,
1598
+ retries_taken=retries_taken,
1599
+ response_headers=err.response.headers,
1585
1600
  stream=stream,
1586
1601
  stream_cls=stream_cls,
1587
1602
  )
@@ -1600,26 +1615,26 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1600
1615
  response=response,
1601
1616
  stream=stream,
1602
1617
  stream_cls=stream_cls,
1603
- retries_taken=options.get_max_retries(self.max_retries) - retries,
1618
+ retries_taken=retries_taken,
1604
1619
  )
1605
1620
 
1606
1621
  async def _retry_request(
1607
1622
  self,
1608
1623
  options: FinalRequestOptions,
1609
1624
  cast_to: Type[ResponseT],
1610
- remaining_retries: int,
1611
- response_headers: httpx.Headers | None,
1612
1625
  *,
1626
+ retries_taken: int,
1627
+ response_headers: httpx.Headers | None,
1613
1628
  stream: bool,
1614
1629
  stream_cls: type[_AsyncStreamT] | None,
1615
1630
  ) -> ResponseT | _AsyncStreamT:
1616
- remaining = remaining_retries - 1
1617
- if remaining == 1:
1631
+ remaining_retries = options.get_max_retries(self.max_retries) - retries_taken
1632
+ if remaining_retries == 1:
1618
1633
  log.debug("1 retry left")
1619
1634
  else:
1620
- log.debug("%i retries left", remaining)
1635
+ log.debug("%i retries left", remaining_retries)
1621
1636
 
1622
- timeout = self._calculate_retry_timeout(remaining, options, response_headers)
1637
+ timeout = self._calculate_retry_timeout(remaining_retries, options, response_headers)
1623
1638
  log.info("Retrying request to %s in %f seconds", options.url, timeout)
1624
1639
 
1625
1640
  await anyio.sleep(timeout)
@@ -1627,7 +1642,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1627
1642
  return await self._request(
1628
1643
  options=options,
1629
1644
  cast_to=cast_to,
1630
- remaining_retries=remaining,
1645
+ retries_taken=retries_taken + 1,
1631
1646
  stream=stream,
1632
1647
  stream_cls=stream_cls,
1633
1648
  )
@@ -136,12 +136,14 @@ def model_dump(
136
136
  exclude: IncEx = None,
137
137
  exclude_unset: bool = False,
138
138
  exclude_defaults: bool = False,
139
+ warnings: bool = True,
139
140
  ) -> dict[str, Any]:
140
141
  if PYDANTIC_V2:
141
142
  return model.model_dump(
142
143
  exclude=exclude,
143
144
  exclude_unset=exclude_unset,
144
145
  exclude_defaults=exclude_defaults,
146
+ warnings=warnings,
145
147
  )
146
148
  return cast(
147
149
  "dict[str, Any]",
@@ -363,12 +363,13 @@ def file_from_path(path: str) -> FileTypes:
363
363
 
364
364
  def get_required_header(headers: HeadersLike, header: str) -> str:
365
365
  lower_header = header.lower()
366
- if isinstance(headers, Mapping):
367
- for k, v in headers.items():
366
+ if is_mapping_t(headers):
367
+ # mypy doesn't understand the type narrowing here
368
+ for k, v in headers.items(): # type: ignore
368
369
  if k.lower() == lower_header and isinstance(v, str):
369
370
  return v
370
371
 
371
- """ to deal with the case where the header looks like Stainless-Event-Id """
372
+ # to deal with the case where the header looks like Stainless-Event-Id
372
373
  intercaps_header = re.sub(r"([^\w])(\w)", lambda pat: pat.group(1) + pat.group(2).upper(), header.capitalize())
373
374
 
374
375
  for normalized_header in [header, lower_header, header.upper(), intercaps_header]:
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "runloop_api_client"
4
- __version__ = "0.1.0-alpha.20" # x-release-please-version
4
+ __version__ = "0.1.0-alpha.22" # x-release-please-version