peak-sdk 1.6.0__py3-none-any.whl → 1.8.0__py3-none-any.whl

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 (57) hide show
  1. peak/_metadata.py +78 -58
  2. peak/_version.py +1 -1
  3. peak/callbacks.py +22 -2
  4. peak/cli/args.py +19 -0
  5. peak/cli/helpers.py +12 -8
  6. peak/cli/press/apps/deployments.py +72 -18
  7. peak/cli/press/apps/specs.py +29 -11
  8. peak/cli/press/blocks/deployments.py +71 -18
  9. peak/cli/press/blocks/specs.py +95 -35
  10. peak/cli/press/deployments.py +40 -1
  11. peak/cli/press/specs.py +2 -2
  12. peak/cli/resources/alerts/emails.py +4 -5
  13. peak/cli/resources/artifacts.py +9 -9
  14. peak/cli/resources/images.py +29 -18
  15. peak/cli/resources/services.py +6 -7
  16. peak/cli/resources/tenants.py +4 -2
  17. peak/cli/resources/users.py +3 -3
  18. peak/cli/resources/webapps.py +6 -6
  19. peak/cli/resources/workflows.py +24 -25
  20. peak/compression.py +28 -13
  21. peak/exceptions.py +15 -1
  22. peak/handler.py +5 -1
  23. peak/helpers.py +38 -0
  24. peak/output.py +13 -6
  25. peak/press/apps.py +43 -3
  26. peak/press/blocks.py +450 -138
  27. peak/press/deployments.py +25 -0
  28. peak/resources/images.py +309 -86
  29. peak/sample_yaml/press/apps/specs/create_app_spec.yaml +2 -0
  30. peak/sample_yaml/press/apps/specs/create_app_spec_release.yaml +2 -0
  31. peak/sample_yaml/press/blocks/specs/service/api/create_block_spec.yaml +102 -0
  32. peak/sample_yaml/press/blocks/specs/service/api/create_block_spec_release.yaml +88 -0
  33. peak/sample_yaml/press/blocks/specs/service/webapp/create_block_spec.yaml +103 -0
  34. peak/sample_yaml/press/blocks/specs/service/webapp/create_block_spec_release.yaml +89 -0
  35. peak/sample_yaml/press/blocks/specs/{create_block_spec.yaml → workflow/create_block_spec.yaml} +20 -1
  36. peak/sample_yaml/press/blocks/specs/{create_block_spec_release.yaml → workflow/create_block_spec_release.yaml} +20 -1
  37. peak/sample_yaml/resources/images/dockerfile/create_image.yaml +3 -0
  38. peak/sample_yaml/resources/images/dockerfile/create_image_version.yaml +3 -0
  39. peak/sample_yaml/resources/images/dockerfile/update_version.yaml +3 -0
  40. peak/sample_yaml/resources/images/github/create_image.yaml +3 -0
  41. peak/sample_yaml/resources/images/github/create_image_version.yaml +3 -0
  42. peak/sample_yaml/resources/images/github/update_version.yaml +3 -0
  43. peak/sample_yaml/resources/images/upload/create_image.yaml +3 -0
  44. peak/sample_yaml/resources/images/upload/create_image_version.yaml +3 -0
  45. peak/sample_yaml/resources/images/upload/create_or_update_image.yaml +3 -0
  46. peak/sample_yaml/resources/images/upload/update_version.yaml +3 -0
  47. peak/sample_yaml/resources/workflows/create_or_update_workflow.yaml +9 -1
  48. peak/sample_yaml/resources/workflows/create_workflow.yaml +9 -1
  49. peak/sample_yaml/resources/workflows/patch_workflow.yaml +9 -1
  50. peak/sample_yaml/resources/workflows/update_workflow.yaml +9 -1
  51. peak/session.py +1 -1
  52. peak/template.py +21 -2
  53. {peak_sdk-1.6.0.dist-info → peak_sdk-1.8.0.dist-info}/METADATA +18 -18
  54. {peak_sdk-1.6.0.dist-info → peak_sdk-1.8.0.dist-info}/RECORD +57 -53
  55. {peak_sdk-1.6.0.dist-info → peak_sdk-1.8.0.dist-info}/LICENSE +0 -0
  56. {peak_sdk-1.6.0.dist-info → peak_sdk-1.8.0.dist-info}/WHEEL +0 -0
  57. {peak_sdk-1.6.0.dist-info → peak_sdk-1.8.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,88 @@
1
+ # block_spec_release.yaml
2
+
3
+ body:
4
+ release:
5
+ version: 2.0.0
6
+ notes: This is a new release
7
+ config:
8
+ serviceType: api
9
+ image:
10
+ dockerfile: Dockerfile
11
+ context: "."
12
+ version: 0.0.1
13
+ parameters:
14
+ env:
15
+ param1: value1
16
+ param2: value2
17
+ secrets:
18
+ - secret1
19
+ - secret2
20
+ resources:
21
+ instanceTypeId: "@param:instance_type_id"
22
+ healthCheckURL: "@param:health_check_url"
23
+ entrypoint: |
24
+ python
25
+ app.py
26
+ minInstances: 1
27
+ parameters:
28
+ build:
29
+ - defaultValue: /health
30
+ description: Enter the health check URL
31
+ name: health_check_url
32
+ required: true
33
+ title: Health Check URL
34
+ type: string
35
+ hideValue: false
36
+ - defaultValue: 20
37
+ description: Select an instance type
38
+ name: instance_type_id
39
+ options:
40
+ - title: Pico (0.125CPU, 0.125GB RAM)
41
+ value: 20
42
+ - title: Nano (0.25CPU, 0.5GB RAM)
43
+ value: 21
44
+ - title: Micro (0.5CPU, 1GB RAM)
45
+ value: 22
46
+ required: true
47
+ title: Instance Type ID
48
+ type: number
49
+ run:
50
+ - defaultValue: AVG
51
+ description: Select an aggregation function (e.g., AVG, SUM, COUNT)
52
+ name: agg_type
53
+ required: false
54
+ title: Agg Type
55
+ type: string
56
+ hideValue: true
57
+ - defaultValue: false
58
+ description: Enable email notifications
59
+ name: email_notifications
60
+ required: false
61
+ title: Email Notifications
62
+ type: boolean
63
+ - defaultValue: 10
64
+ description: Select the number of iterations
65
+ name: num_iterations
66
+ options:
67
+ - title: Low
68
+ value: 10
69
+ - title: Medium
70
+ value: 50
71
+ - title: High
72
+ value: 100
73
+ required: false
74
+ title: Number of Iterations
75
+ type: number
76
+ - defaultValue:
77
+ - input.csv
78
+ - output.csv
79
+ description: Specify input and output file names
80
+ name: file_names
81
+ required: true
82
+ title: File Names
83
+ type: string_array
84
+ artifact:
85
+ path: "."
86
+ ignore_files:
87
+ - ".gitignore"
88
+ - ".dockerignore"
@@ -0,0 +1,103 @@
1
+ body:
2
+ version: 1
3
+ kind: service
4
+ metadata:
5
+ name: webapp-service-block
6
+ title: Web App Service Block
7
+ summary: Web App Service Block
8
+ description: Creating a new service block spec of type web-app.
9
+ descriptionContentType: text/markdown
10
+ imageUrl: https://my-block-pics.com/image-0.jpg
11
+ tags:
12
+ - name: CLI
13
+ release:
14
+ version: 1.0.0
15
+ notes: This is the original release
16
+ config:
17
+ serviceType: web-app
18
+ image:
19
+ dockerfile: Dockerfile
20
+ context: "."
21
+ version: 0.0.1
22
+ parameters:
23
+ env:
24
+ param1: value1
25
+ param2: value2
26
+ secrets:
27
+ - secret1
28
+ - secret2
29
+ resources:
30
+ instanceTypeId: "@param:instance_type_id"
31
+ healthCheckURL: "@param:health_check_url"
32
+ sessionStickiness: false
33
+ entrypoint: |
34
+ python
35
+ app.py
36
+ minInstances: 1
37
+ parameters:
38
+ build:
39
+ - defaultValue: /health
40
+ description: Enter the health check URL
41
+ name: health_check_url
42
+ required: true
43
+ title: Health Check URL
44
+ type: string
45
+ hideValue: false
46
+ - defaultValue: 43
47
+ description: Select an instance type
48
+ name: instance_type_id
49
+ options:
50
+ - title: Pico (0.25CPU, 0.5GB RAM)
51
+ value: 43
52
+ - title: Nano (0.25CPU, 1GB RAM)
53
+ value: 44
54
+ - title: Micro (0.5CPU, 1GB RAM)
55
+ value: 45
56
+ required: true
57
+ title: Instance Type ID
58
+ type: number
59
+ run:
60
+ - defaultValue: AVG
61
+ description: Select an aggregation function (e.g., AVG, SUM, COUNT)
62
+ name: agg_type
63
+ required: false
64
+ title: Agg Type
65
+ type: string
66
+ hideValue: true
67
+ - defaultValue: false
68
+ description: Enable email notifications
69
+ name: email_notifications
70
+ required: false
71
+ title: Email Notifications
72
+ type: boolean
73
+ - defaultValue: 10
74
+ description: Select the number of iterations
75
+ name: num_iterations
76
+ options:
77
+ - title: Low
78
+ value: 10
79
+ - title: Medium
80
+ value: 50
81
+ - title: High
82
+ value: 100
83
+ required: false
84
+ title: Number of Iterations
85
+ type: number
86
+ - defaultValue:
87
+ - input.csv
88
+ - output.csv
89
+ description: Specify input and output file names
90
+ name: file_names
91
+ required: true
92
+ title: File Names
93
+ type: string_array
94
+ artifact:
95
+ path: "."
96
+ ignore_files:
97
+ - ".gitignore"
98
+ - ".dockerignore"
99
+ featured: true
100
+ scope: shared
101
+ tenants:
102
+ - tenant1
103
+ - tenant2
@@ -0,0 +1,89 @@
1
+ # block_spec_release.yaml
2
+
3
+ body:
4
+ release:
5
+ version: 2.0.0
6
+ notes: This is a new release
7
+ config:
8
+ serviceType: web-app
9
+ image:
10
+ dockerfile: Dockerfile
11
+ context: "."
12
+ version: 0.0.1
13
+ parameters:
14
+ env:
15
+ param1: value1
16
+ param2: value2
17
+ secrets:
18
+ - secret1
19
+ - secret2
20
+ resources:
21
+ instanceTypeId: "@param:instance_type_id"
22
+ healthCheckURL: "@param:health_check_url"
23
+ sessionStickiness: false
24
+ entrypoint: |
25
+ python
26
+ app.py
27
+ minInstances: 1
28
+ parameters:
29
+ build:
30
+ - defaultValue: /health
31
+ description: Enter the health check URL
32
+ name: health_check_url
33
+ required: true
34
+ title: Health Check URL
35
+ type: string
36
+ hideValue: false
37
+ - defaultValue: 43
38
+ description: Select an instance type
39
+ name: instance_type_id
40
+ options:
41
+ - title: Pico (0.25CPU, 0.5GB RAM)
42
+ value: 43
43
+ - title: Nano (0.25CPU, 1GB RAM)
44
+ value: 44
45
+ - title: Micro (0.5CPU, 1GB RAM)
46
+ value: 45
47
+ required: true
48
+ title: Instance Type ID
49
+ type: number
50
+ run:
51
+ - defaultValue: AVG
52
+ description: Select an aggregation function (e.g., AVG, SUM, COUNT)
53
+ name: agg_type
54
+ required: false
55
+ title: Agg Type
56
+ type: string
57
+ hideValue: true
58
+ - defaultValue: false
59
+ description: Enable email notifications
60
+ name: email_notifications
61
+ required: false
62
+ title: Email Notifications
63
+ type: boolean
64
+ - defaultValue: 10
65
+ description: Select the number of iterations
66
+ name: num_iterations
67
+ options:
68
+ - title: Low
69
+ value: 10
70
+ - title: Medium
71
+ value: 50
72
+ - title: High
73
+ value: 100
74
+ required: false
75
+ title: Number of Iterations
76
+ type: number
77
+ - defaultValue:
78
+ - input.csv
79
+ - output.csv
80
+ description: Specify input and output file names
81
+ name: file_names
82
+ required: true
83
+ title: File Names
84
+ type: string_array
85
+ artifact:
86
+ path: "."
87
+ ignore_files:
88
+ - ".gitignore"
89
+ - ".dockerignore"
@@ -38,7 +38,25 @@ body:
38
38
  - webhook:
39
39
  name: info
40
40
  url: https://abc.com/post
41
- payload: '{ "pingback-url": "https:/workflow/123" }'
41
+ payload: |
42
+ {
43
+ "system": "external_system",
44
+ "action": "update",
45
+ "data": {
46
+ "field": "value",
47
+ "timestamp": "2024-05-20T12:00:00Z"
48
+ }
49
+ }
50
+ events:
51
+ success: false
52
+ fail: true
53
+ runtimeExceeded: "@param:runtime_exceeded"
54
+ - email:
55
+ name: "email-watcher-1"
56
+ recipients:
57
+ to:
58
+ - "user1@peak.ai"
59
+ - "user2@peak.ai"
42
60
  events:
43
61
  success: false
44
62
  fail: true
@@ -112,6 +130,7 @@ artifact:
112
130
  - ".gitignore"
113
131
  - ".dockerignore"
114
132
  featured: true
133
+ autoRunOnDeploy: true
115
134
  scope: shared
116
135
  tenants:
117
136
  - tenant1
@@ -27,7 +27,25 @@ body:
27
27
  - webhook:
28
28
  name: info
29
29
  url: https://abc.com/post
30
- payload: '{ "pingback-url": "https:/workflow/123" }'
30
+ payload: |
31
+ {
32
+ "system": "external_system",
33
+ "action": "update",
34
+ "data": {
35
+ "field": "value",
36
+ "timestamp": "2024-05-20T12:00:00Z"
37
+ }
38
+ }
39
+ events:
40
+ success: false
41
+ fail: true
42
+ runtimeExceeded: "@param:runtime_exceeded"
43
+ - email:
44
+ name: "email-watcher-1"
45
+ recipients:
46
+ to:
47
+ - "user1@peak.ai"
48
+ - "user2@peak.ai"
31
49
  events:
32
50
  success: false
33
51
  fail: true
@@ -100,3 +118,4 @@ artifact:
100
118
  ignore_files:
101
119
  - ".gitignore"
102
120
  - ".dockerignore"
121
+ autoRunOnDeploy: true
@@ -13,4 +13,7 @@ body:
13
13
  value: param1
14
14
  - name: PARAM2
15
15
  value: param2
16
+ secrets:
17
+ - SECRET1
18
+ - SECRET2
16
19
  dockerfile: "FROM nginx"
@@ -11,4 +11,7 @@ body:
11
11
  value: param1
12
12
  - name: PARAM2
13
13
  value: param2
14
+ secrets:
15
+ - SECRET1
16
+ - SECRET2
14
17
  dockerfile: "FROM nginx"
@@ -10,4 +10,7 @@ body:
10
10
  value: param1
11
11
  - name: PARAM2
12
12
  value: param2
13
+ secrets:
14
+ - SECRET1
15
+ - SECRET2
13
16
  dockerfile: "FROM nginx"
@@ -16,4 +16,7 @@ body:
16
16
  value: param1
17
17
  - name: PARAM2
18
18
  value: param2
19
+ secrets:
20
+ - SECRET1
21
+ - SECRET2
19
22
  useCache: true
@@ -14,4 +14,7 @@ body:
14
14
  value: param1
15
15
  - name: PARAM2
16
16
  value: param2
17
+ secrets:
18
+ - SECRET1
19
+ - SECRET2
17
20
  useCache: true
@@ -13,4 +13,7 @@ body:
13
13
  value: param1
14
14
  - name: PARAM2
15
15
  value: param2
16
+ secrets:
17
+ - SECRET1
18
+ - SECRET2
16
19
  useCache: true
@@ -13,6 +13,9 @@ body:
13
13
  value: param1
14
14
  - name: PARAM2
15
15
  value: param2
16
+ secrets:
17
+ - SECRET1
18
+ - SECRET2
16
19
  context: .
17
20
  artifact:
18
21
  path: "."
@@ -12,6 +12,9 @@ body:
12
12
  value: param1
13
13
  - name: PARAM2
14
14
  value: param2
15
+ secrets:
16
+ - SECRET1
17
+ - SECRET2
15
18
  useCache: true
16
19
  artifact:
17
20
  path: "."
@@ -13,6 +13,9 @@ body:
13
13
  value: param1
14
14
  - name: PARAM2
15
15
  value: param2
16
+ secrets:
17
+ - SECRET1
18
+ - SECRET2
16
19
  useCache: true
17
20
  artifact:
18
21
  path: "."
@@ -9,6 +9,9 @@ body:
9
9
  buildArguments:
10
10
  - name: PARAM1
11
11
  value: param1
12
+ secrets:
13
+ - SECRET1
14
+ - SECRET2
12
15
  useCache: true
13
16
  artifact:
14
17
  path: "."
@@ -12,7 +12,15 @@ body:
12
12
  - webhook:
13
13
  name: info
14
14
  url: "https://abc.com/post"
15
- payload: '{ "pingback-url": "https:/workflow/123" }'
15
+ payload: |
16
+ {
17
+ "system": "external_system",
18
+ "action": "update",
19
+ "data": {
20
+ "field": "value",
21
+ "timestamp": "2024-05-20T12:00:00Z"
22
+ }
23
+ }
16
24
  events:
17
25
  success: false
18
26
  fail: true
@@ -12,7 +12,15 @@ body:
12
12
  - webhook:
13
13
  name: info
14
14
  url: "https://abc.com/post"
15
- payload: '{ "pingback-url": "https:/workflow/123" }'
15
+ payload: |
16
+ {
17
+ "system": "external_system",
18
+ "action": "update",
19
+ "data": {
20
+ "field": "value",
21
+ "timestamp": "2024-05-20T12:00:00Z"
22
+ }
23
+ }
16
24
  events:
17
25
  success: false
18
26
  fail: true
@@ -12,7 +12,15 @@ body:
12
12
  - webhook:
13
13
  name: info
14
14
  url: "https://abc.com/post"
15
- payload: '{ "pingback-url": "https:/workflow/123" }'
15
+ payload: |
16
+ {
17
+ "system": "external_system",
18
+ "action": "update",
19
+ "data": {
20
+ "field": "value",
21
+ "timestamp": "2024-05-20T12:00:00Z"
22
+ }
23
+ }
16
24
  events:
17
25
  success: false
18
26
  fail: true
@@ -12,7 +12,15 @@ body:
12
12
  - webhook:
13
13
  name: info
14
14
  url: "https://abc.com/post"
15
- payload: '{ "pingback-url": "https:/workflow/123" }'
15
+ payload: |
16
+ {
17
+ "system": "external_system",
18
+ "action": "update",
19
+ "data": {
20
+ "field": "value",
21
+ "timestamp": "2024-05-20T12:00:00Z"
22
+ }
23
+ }
16
24
  events:
17
25
  success: false
18
26
  fail: true
peak/session.py CHANGED
@@ -179,7 +179,7 @@ class Session:
179
179
  page_count = response["pageCount"]
180
180
  yield from response[response_key]
181
181
  page_number += 1
182
- return f"No more {response_key} to list"
182
+ return f"No more {response_key} to list" # type: ignore[return-value]
183
183
 
184
184
  def create_download_request(
185
185
  self,
peak/template.py CHANGED
@@ -19,6 +19,7 @@
19
19
  # # along with this program. If not, see <https://apache.org/licenses/LICENSE-2.0>
20
20
  #
21
21
  """Template module which handles all things related to templates."""
22
+
22
23
  from __future__ import annotations
23
24
 
24
25
  import os
@@ -32,7 +33,7 @@ from jinja2 import Environment
32
33
  from jinja2.ext import Extension
33
34
 
34
35
  from peak import exceptions
35
- from peak.helpers import remove_none_values
36
+ from peak.helpers import convert_keys_to_snake_case, remove_none_values
36
37
 
37
38
 
38
39
  def _parse_jinja_template(template_path: Path, params: Dict[str, Any]) -> str:
@@ -53,6 +54,9 @@ def load_template(
53
54
  file: Union[Path, str],
54
55
  params: Optional[Dict[str, Any]] = None,
55
56
  description: Optional[str] = None,
57
+ markdown_data: Optional[Dict[str, str]] = None,
58
+ *,
59
+ convert_to_snake_case: Optional[bool] = False,
56
60
  ) -> Dict[str, Any]:
57
61
  """Load a template file through `Jinja` into a dictionary.
58
62
 
@@ -66,7 +70,10 @@ def load_template(
66
70
  Args:
67
71
  file (Union[Path, str]): Path to the templated `YAML` file to be loaded.
68
72
  params (Dict[str, Any] | None, optional): Named parameters to be passed to Jinja. Defaults to `{}`.
69
- description ([str]): The description from the file extracted and added to the payload.
73
+ description (str, optional): Description of press entities in markdown format. Defaults to `None`. Note that this parameter will soon be deprecated. Use `markdown_data` instead.
74
+ markdown_data (Dict[str, str] | None, optional): Dictionary containing the markdown data to be inserted into the template.
75
+ The key is a colon-separated string representing the nested key path (e.g., "body:metadata:description"), and the value is the markdown content.
76
+ convert_to_snake_case (Optional[bool], optional): Convert the keys of the dictionary to snake_case. Defaults to `False`.
70
77
 
71
78
  Returns:
72
79
  Dict[str, Any]: Dictionary containing the rendered YAML file
@@ -75,9 +82,21 @@ def load_template(
75
82
  file = Path(file)
76
83
  template: str = _parse_jinja_template(file, params)
77
84
  parsed_data: Dict[str, Any] = yaml.safe_load(template)
85
+
86
+ if convert_to_snake_case:
87
+ parsed_data = convert_keys_to_snake_case(parsed_data)
88
+
78
89
  if description:
79
90
  parsed_data["body"]["metadata"]["description"] = description
80
91
 
92
+ if markdown_data:
93
+ for key, markdown_content in markdown_data.items():
94
+ keys = key.split(":")
95
+ target_dict = parsed_data
96
+ for k in keys[:-1]:
97
+ target_dict = target_dict.setdefault(k, {})
98
+ target_dict[keys[-1]] = markdown_content
99
+
81
100
  return remove_none_values(parsed_data)
82
101
 
83
102
 
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: peak-sdk
3
- Version: 1.6.0
3
+ Version: 1.8.0
4
4
  Summary: Python SDK for interacting with the Peak platform
5
- Home-page: https://docs.peak.ai/sdk
5
+ Home-page: https://docs.peak.ai/sdk/latest/
6
6
  License: Apache-2.0
7
7
  Author: Peak
8
8
  Author-email: support@peak.ai
@@ -21,23 +21,23 @@ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
21
21
  Classifier: Typing :: Typed
22
22
  Requires-Dist: certifi (>=2024.2.2)
23
23
  Requires-Dist: jinja2 (>=3.1,<4.0)
24
- Requires-Dist: orjson (>=3.9.15,<4.0.0)
24
+ Requires-Dist: orjson (>=3.10,<4.0)
25
25
  Requires-Dist: pathspec
26
26
  Requires-Dist: pyyaml (>=6.0,<7.0)
27
- Requires-Dist: requests (>=2.31,<3.0)
27
+ Requires-Dist: requests (>=2.32,<3.0)
28
28
  Requires-Dist: requests-toolbelt (>=1.0,<2.0)
29
29
  Requires-Dist: shellingham (<1.5.4)
30
- Requires-Dist: structlog (>=24.1.0,<25.0.0)
31
- Requires-Dist: typer[all] (>=0.9,<0.10)
30
+ Requires-Dist: structlog (>=24.2.0,<25.0.0)
31
+ Requires-Dist: typer (>=0.12.3,<0.13.0)
32
32
  Requires-Dist: urllib3 (<2)
33
- Project-URL: Documentation, https://docs.peak.ai/sdk/
33
+ Project-URL: Documentation, https://docs.peak.ai/sdk/latest/
34
34
  Description-Content-Type: text/markdown
35
35
 
36
36
  # Peak SDK
37
37
 
38
38
  [![PyPI](https://img.shields.io/pypi/v/peak-sdk.svg)](https://pypi.org/project/peak-sdk/)
39
- [![Python Version](https://img.shields.io/pypi/pyversions/peak-sdk)](https://docs.peak.ai/sdk/#platform-support)
40
- [![License](https://img.shields.io/pypi/l/peak-sdk)](https://docs.peak.ai/sdk/license.html)
39
+ [![Python Version](https://img.shields.io/pypi/pyversions/peak-sdk)](https://docs.peak.ai/sdk/latest/#platform-support)
40
+ [![License](https://img.shields.io/pypi/l/peak-sdk)](https://docs.peak.ai/sdk/latest/license.html)
41
41
 
42
42
  ## What is Peak SDK?
43
43
 
@@ -104,15 +104,15 @@ Follow these steps to create a virtual environment using Python's built-in `venv
104
104
 
105
105
  ### Documentation
106
106
 
107
- You can access the documentation for the SDK and CLI at [https://docs.peak.ai/sdk/](https://docs.peak.ai/sdk/).
107
+ You can access the documentation for the SDK and CLI at [https://docs.peak.ai/sdk/latest/](https://docs.peak.ai/sdk/latest/).
108
108
  Here are some quick links to help you navigate easily:
109
109
 
110
- - [SDK Reference](https://docs.peak.ai/sdk/reference.html)
111
- - [CLI Reference](https://docs.peak.ai/sdk/cli/reference.html)
112
- - [Usage](https://docs.peak.ai/sdk/usage.html)
113
- - [CLI Usage](https://docs.peak.ai/sdk/cli/usage.html)
114
- - [Migration Guide](https://docs.peak.ai/sdk/migration-guide.html)
115
- - [FAQ](https://docs.peak.ai/sdk/faq.html)
110
+ - [SDK Reference](https://docs.peak.ai/sdk/latest/reference.html)
111
+ - [CLI Reference](https://docs.peak.ai/sdk/latest/cli/reference.html)
112
+ - [Usage](https://docs.peak.ai/sdk/latest/usage.html)
113
+ - [CLI Usage](https://docs.peak.ai/sdk/latest/cli/usage.html)
114
+ - [Migration Guide](https://docs.peak.ai/sdk/latest/migration-guide.html)
115
+ - [FAQ](https://docs.peak.ai/sdk/latest/faq.html)
116
116
 
117
117
  ### Platform Support
118
118
 
@@ -194,6 +194,6 @@ Here are some quick links to help you navigate easily:
194
194
 
195
195
  ## More Resources
196
196
 
197
- - [License](https://docs.peak.ai/sdk/license.html)
198
- - [Changelog](https://docs.peak.ai/sdk/changelog.html)
197
+ - [License](https://docs.peak.ai/sdk/latest/license.html)
198
+ - [Changelog](https://docs.peak.ai/sdk/latest/changelog.html)
199
199