pipecatcloud 0.2.3__tar.gz → 0.2.5__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 (55) hide show
  1. pipecatcloud-0.2.5/.github/workflows/publish-pypi.yml +78 -0
  2. pipecatcloud-0.2.5/.github/workflows/publish-test.yml +51 -0
  3. pipecatcloud-0.2.5/.github/workflows/tests.yml +41 -0
  4. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/CHANGELOG.md +30 -0
  5. {pipecatcloud-0.2.3/src/pipecatcloud.egg-info → pipecatcloud-0.2.5}/PKG-INFO +2 -2
  6. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/README.md +1 -1
  7. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/pyproject.toml +18 -1
  8. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/__init__.py +4 -0
  9. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/_utils/deploy_utils.py +15 -3
  10. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/agent.py +26 -0
  11. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/api.py +1 -0
  12. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/commands/agent.py +13 -1
  13. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/commands/deploy.py +8 -0
  14. pipecatcloud-0.2.5/src/pipecatcloud/cli/commands/docker.py +344 -0
  15. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/commands/init.py +8 -8
  16. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/entry_point.py +2 -0
  17. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/config.py +1 -1
  18. pipecatcloud-0.2.5/src/pipecatcloud/smallwebrtc/session_manager.py +87 -0
  19. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5/src/pipecatcloud.egg-info}/PKG-INFO +2 -2
  20. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud.egg-info/SOURCES.txt +6 -3
  21. pipecatcloud-0.2.5/tests/test_docker_commands.py +169 -0
  22. pipecatcloud-0.2.5/tests/test_managed_keys.py +437 -0
  23. pipecatcloud-0.2.3/.github/workflows/publish-pypi.yml +0 -66
  24. pipecatcloud-0.2.3/.github/workflows/publish-test.yml +0 -67
  25. pipecatcloud-0.2.3/.github/workflows/python-publish.yml +0 -40
  26. pipecatcloud-0.2.3/dev-requirements.txt +0 -8
  27. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/.gitignore +0 -0
  28. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/LICENSE +0 -0
  29. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/pipecat-cloud.png +0 -0
  30. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/pytest.ini +0 -0
  31. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/setup.cfg +0 -0
  32. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/__main__.py +0 -0
  33. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/__version__.py +0 -0
  34. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/_utils/__init__.py +0 -0
  35. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/_utils/async_utils.py +0 -0
  36. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/_utils/auth_utils.py +0 -0
  37. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/_utils/console_utils.py +0 -0
  38. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/_utils/local_runner.py +0 -0
  39. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/__init__.py +0 -0
  40. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/api.py +0 -0
  41. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/commands/__init__.py +0 -0
  42. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/commands/auth.py +0 -0
  43. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/commands/organizations.py +0 -0
  44. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/commands/run.py +0 -0
  45. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/commands/secrets.py +0 -0
  46. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/cli/config.py +0 -0
  47. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/exception.py +0 -0
  48. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/py.typed +0 -0
  49. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud/session.py +0 -0
  50. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud.egg-info/dependency_links.txt +0 -0
  51. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud.egg-info/entry_points.txt +0 -0
  52. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud.egg-info/requires.txt +0 -0
  53. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/src/pipecatcloud.egg-info/top_level.txt +0 -0
  54. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/tests/__init__.py +0 -0
  55. {pipecatcloud-0.2.3 → pipecatcloud-0.2.5}/tests/test_agent_sessions.py +0 -0
@@ -0,0 +1,78 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ gitref:
7
+ type: string
8
+ description: 'what git tag to build (e.g. v0.0.74)'
9
+ required: true
10
+
11
+ jobs:
12
+ build:
13
+ name: 'Build and upload wheels'
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout repo
17
+ uses: actions/checkout@v4
18
+ with:
19
+ ref: ${{ github.event.inputs.gitref }}
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v3
23
+ with:
24
+ version: 'latest'
25
+ - name: Set up Python
26
+ run: uv python install 3.12
27
+ - name: Install development dependencies
28
+ run: uv sync --group dev
29
+ - name: Build project
30
+ run: uv build
31
+ - name: Upload wheels
32
+ uses: actions/upload-artifact@v4
33
+ with:
34
+ name: wheels
35
+ path: ./dist
36
+
37
+ publish-to-pypi:
38
+ name: 'Publish to PyPI'
39
+ runs-on: ubuntu-latest
40
+ needs: [build]
41
+ environment:
42
+ name: pypi
43
+ url: https://pypi.org/p/pipecatcloud
44
+ permissions:
45
+ id-token: write
46
+ steps:
47
+ - name: Download wheels
48
+ uses: actions/download-artifact@v4
49
+ with:
50
+ name: wheels
51
+ path: ./dist
52
+ - name: Publish to PyPI
53
+ uses: pypa/gh-action-pypi-publish@release/v1
54
+ with:
55
+ verbose: true
56
+ print-hash: true
57
+
58
+ publish-to-test-pypi:
59
+ name: 'Publish to Test PyPI'
60
+ runs-on: ubuntu-latest
61
+ needs: [build]
62
+ environment:
63
+ name: testpypi
64
+ url: https://test.pypi.org/p/pipecatcloud
65
+ permissions:
66
+ id-token: write
67
+ steps:
68
+ - name: Download wheels
69
+ uses: actions/download-artifact@v4
70
+ with:
71
+ name: wheels
72
+ path: ./dist
73
+ - name: Publish to Test PyPI
74
+ uses: pypa/gh-action-pypi-publish@release/v1
75
+ with:
76
+ verbose: true
77
+ print-hash: true
78
+ repository-url: https://test.pypi.org/legacy/
@@ -0,0 +1,51 @@
1
+ name: Publish to TEST PyPI
2
+
3
+ on: workflow_dispatch
4
+
5
+ jobs:
6
+ build:
7
+ name: 'Build and upload wheels'
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - name: Checkout repo
11
+ uses: actions/checkout@v4
12
+ with:
13
+ fetch-tags: true
14
+ fetch-depth: 100
15
+ - name: Install uv
16
+ uses: astral-sh/setup-uv@v3
17
+ with:
18
+ version: 'latest'
19
+ - name: Set up Python
20
+ run: uv python install 3.12
21
+ - name: Install development dependencies
22
+ run: uv sync --group dev
23
+ - name: Build project
24
+ run: uv build
25
+ - name: Upload wheels
26
+ uses: actions/upload-artifact@v4
27
+ with:
28
+ name: wheels
29
+ path: ./dist
30
+
31
+ publish-to-test-pypi:
32
+ name: 'Publish to Test PyPI'
33
+ runs-on: ubuntu-latest
34
+ needs: [build]
35
+ environment:
36
+ name: testpypi
37
+ url: https://test.pypi.org/p/pipecatcloud
38
+ permissions:
39
+ id-token: write
40
+ steps:
41
+ - name: Download wheels
42
+ uses: actions/download-artifact@v4
43
+ with:
44
+ name: wheels
45
+ path: ./dist
46
+ - name: Publish to Test PyPI
47
+ uses: pypa/gh-action-pypi-publish@release/v1
48
+ with:
49
+ verbose: true
50
+ print-hash: true
51
+ repository-url: https://test.pypi.org/legacy/
@@ -0,0 +1,41 @@
1
+ name: tests
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ branches:
7
+ - main
8
+ pull_request:
9
+ branches:
10
+ - '**'
11
+
12
+ concurrency:
13
+ group: build-test-${{ github.event.pull_request.number || github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ test:
18
+ name: 'Unit Tests'
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - name: Checkout repo
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v3
26
+ with:
27
+ version: 'latest'
28
+
29
+ - name: Set up Python
30
+ run: uv python install 3.12
31
+
32
+ - name: Install dependencies
33
+ run: |
34
+ uv sync --group dev
35
+
36
+ - name: Test Docker commands
37
+ run: |
38
+ uv run pytest tests/test_docker_commands.py -v
39
+
40
+ # Note: test_agent_sessions.py is excluded because it requires complex
41
+ # API mocking for CI. These tests can be run locally with proper auth.
@@ -5,6 +5,36 @@ All notable changes to **Pipecat Cloud** will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.5] - 2025-10-02
9
+
10
+ ### Added
11
+
12
+ - Added a `body` parameter to the fallback type, `WebsocketRunnerArguments`.
13
+
14
+ - Added `SmallWebRTCSessionManager`, a Session Manager to simplify bot creation
15
+ in Pipecat Cloud using `SmallWebRTCTransport`.
16
+ - Added a `SmallWebRTCSessionArguments` dataclass.
17
+
18
+ - `deploy` command now accepts a `--enable-managed-keys` flag which enables
19
+ properly configured agents to use Daily's API keys for supported upstream
20
+ services. This can also be enabled via `pcc-deploy.toml` by adding the
21
+ `enable_managed_keys` attribute and a boolean value.
22
+
23
+ - `agent status` now reflects the state of the managed keys feature.
24
+
25
+ ## [0.2.4] - 2025-08-26
26
+
27
+ ### Added
28
+
29
+ - Added `docker build-push` command for building, tagging, and pushing Docker
30
+ images. Automatically parses registry information from the `image` field in
31
+ `pcc-deploy.toml` and supports both Docker Hub and custom registries. Includes
32
+ real-time build output and helpful authentication error hints.
33
+
34
+ ### Changed
35
+
36
+ - `pcc init` now points to https://github.com/pipecat-ai/pipecat-quickstart.
37
+
8
38
  ## [0.2.3] - 2025-08-19
9
39
 
10
40
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipecatcloud
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: Cloud hosting for Pipecat AI applications
5
5
  License: BSD 2-Clause License
6
6
  Project-URL: Website, https://docs.pipecat.daily.co/
@@ -63,7 +63,7 @@ pcc auth login
63
63
 
64
64
  2. Login to your account `pcc auth login`
65
65
 
66
- 3. (Optional): Clone the starter agent [here](https://github.com/daily-co/pipecat-cloud-starter)
66
+ 3. (Optional): Clone the quickstart repo [here](https://github.com/pipecat-ai/pipecat-quickstart)
67
67
 
68
68
  4. Build your agent `docker build --platform linux/arm64 -t your-agent-name .`
69
69
 
@@ -40,7 +40,7 @@ pcc auth login
40
40
 
41
41
  2. Login to your account `pcc auth login`
42
42
 
43
- 3. (Optional): Clone the starter agent [here](https://github.com/daily-co/pipecat-cloud-starter)
43
+ 3. (Optional): Clone the quickstart repo [here](https://github.com/pipecat-ai/pipecat-quickstart)
44
44
 
45
45
  4. Build your agent `docker build --platform linux/arm64 -t your-agent-name .`
46
46
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pipecatcloud"
7
- version = "0.2.3"
7
+ dynamic = ["version"]
8
8
  requires-python = ">=3.10"
9
9
  description = "Cloud hosting for Pipecat AI applications"
10
10
  license = { text = "BSD 2-Clause License" }
@@ -25,6 +25,19 @@ dependencies = [
25
25
  [project.optional-dependencies]
26
26
  pipecat = ["pipecat-ai>=0.0.79"]
27
27
 
28
+ [dependency-groups]
29
+ dev = [
30
+ "build~=1.2.2",
31
+ "grpcio-tools~=1.67.1",
32
+ "pre-commit~=4.2.0",
33
+ "pyright~=1.1.402",
34
+ "pytest~=8.4.1",
35
+ "pytest-asyncio~=1.0.0",
36
+ "ruff~=0.12.1",
37
+ "setuptools~=78.1.1",
38
+ "setuptools_scm~=8.3.1",
39
+ ]
40
+
28
41
  [project.scripts]
29
42
  pcc = "pipecatcloud.__main__:main"
30
43
  pipecatcloud = "pipecatcloud.__main__:main"
@@ -45,3 +58,7 @@ line-length = 100
45
58
 
46
59
  [project.urls]
47
60
  Website = "https://docs.pipecat.daily.co/"
61
+
62
+ [tool.setuptools_scm]
63
+ local_scheme = "no-local-version"
64
+ fallback_version = "0.0.0-dev"
@@ -13,6 +13,7 @@ from pipecatcloud.agent import (
13
13
  DailySessionArguments,
14
14
  PipecatSessionArguments,
15
15
  SessionArguments,
16
+ SmallWebRTCRunnerArguments,
16
17
  WebSocketSessionArguments,
17
18
  )
18
19
  from pipecatcloud.exception import (
@@ -25,6 +26,7 @@ from pipecatcloud.exception import (
25
26
  InvalidError,
26
27
  )
27
28
  from pipecatcloud.session import Session, SessionParams
29
+ from pipecatcloud.smallwebrtc.session_manager import SmallWebRTCSessionManager
28
30
 
29
31
  logger.remove()
30
32
  logger.add(sys.stderr, level=str(os.getenv("PCC_LOG_LEVEL", "INFO")))
@@ -35,10 +37,12 @@ __all__ = [
35
37
  "DailySessionArguments",
36
38
  "PipecatSessionArguments",
37
39
  "SessionArguments",
40
+ "SmallWebRTCRunnerArguments",
38
41
  "WebSocketSessionArguments",
39
42
  # Session classes
40
43
  "Session",
41
44
  "SessionParams",
45
+ "SmallWebRTCSessionManager",
42
46
  # Exception classes
43
47
  "AgentNotHealthyError",
44
48
  "AgentStartError",
@@ -4,9 +4,9 @@
4
4
  # SPDX-License-Identifier: BSD 2-Clause License
5
5
  #
6
6
 
7
- import os
8
7
  import functools
9
- from typing import Optional, Callable, Any
8
+ import os
9
+ from typing import Callable, Optional
10
10
 
11
11
  import toml
12
12
  from attr import dataclass, field
@@ -64,6 +64,8 @@ class DeployConfigParams:
64
64
  secret_set: Optional[str] = None
65
65
  scaling: ScalingParams = ScalingParams()
66
66
  enable_krisp: bool = False
67
+ enable_managed_keys: bool = False
68
+ docker_config: dict = field(factory=dict)
67
69
 
68
70
  def __attrs_post_init__(self):
69
71
  if self.image is not None and ":" not in self.image:
@@ -77,6 +79,8 @@ class DeployConfigParams:
77
79
  "secret_set": self.secret_set,
78
80
  "scaling": self.scaling.to_dict() if self.scaling else None,
79
81
  "enable_krisp": self.enable_krisp,
82
+ "enable_managed_keys": self.enable_managed_keys,
83
+ "docker_config": self.docker_config,
80
84
  }
81
85
 
82
86
 
@@ -97,10 +101,14 @@ def load_deploy_config_file() -> Optional[DeployConfigParams]:
97
101
  scaling_data = config_data.pop("scaling", {})
98
102
  scaling_params = ScalingParams(**scaling_data)
99
103
 
104
+ # Extract docker configuration if present
105
+ docker_data = config_data.pop("docker", {})
106
+
100
107
  # Create DeployConfigParams with validated data
101
108
  validated_config = DeployConfigParams(
102
109
  **config_data,
103
110
  scaling=scaling_params,
111
+ docker_config=docker_data,
104
112
  )
105
113
 
106
114
  # Check for unexpected keys
@@ -111,6 +119,8 @@ def load_deploy_config_file() -> Optional[DeployConfigParams]:
111
119
  "secret_set",
112
120
  "scaling",
113
121
  "enable_krisp",
122
+ "enable_managed_keys",
123
+ "docker",
114
124
  }
115
125
  unexpected_keys = set(config_data.keys()) - expected_keys
116
126
  if unexpected_keys:
@@ -128,13 +138,15 @@ def with_deploy_config(func: Callable) -> Callable:
128
138
  Decorator that loads the deploy config file and injects it into the function.
129
139
  If the config file exists, it will be loaded and passed to the function as `deploy_config`.
130
140
  """
141
+
131
142
  @functools.wraps(func)
132
143
  def wrapper(*args, **kwargs):
133
144
  try:
134
145
  deploy_config = load_deploy_config_file()
135
- kwargs['deploy_config'] = deploy_config
146
+ kwargs["deploy_config"] = deploy_config
136
147
  except Exception as e:
137
148
  logger.error(f"Error loading deploy config: {e}")
138
149
  raise ConfigFileError(str(e))
139
150
  return func(*args, **kwargs)
151
+
140
152
  return wrapper
@@ -16,6 +16,7 @@ try:
16
16
  DailyRunnerArguments,
17
17
  RunnerArguments,
18
18
  WebSocketRunnerArguments,
19
+ SmallWebRTCRunnerArguments,
19
20
  )
20
21
 
21
22
  _PIPECAT_RUNNER_TYPES_AVAILABLE = True
@@ -62,6 +63,17 @@ except ImportError:
62
63
  """
63
64
 
64
65
  websocket: WebSocket
66
+ body: Any
67
+
68
+ @dataclass
69
+ class SmallWebRTCRunnerArguments(RunnerArguments):
70
+ """Fallback Small WebRTC transport session arguments for the runner.
71
+
72
+ Parameters:
73
+ webrtc_connection: Pre-configured WebRTC peer connection
74
+ """
75
+
76
+ webrtc_connection: Any
65
77
 
66
78
 
67
79
  def _warn_standalone_usage():
@@ -131,3 +143,17 @@ class WebSocketSessionArguments(WebSocketRunnerArguments, SessionArguments):
131
143
  def __post_init__(self):
132
144
  WebSocketRunnerArguments.__post_init__(self)
133
145
  _warn_standalone_usage()
146
+
147
+ @dataclass
148
+ class SmallWebRTCSessionArguments(SmallWebRTCRunnerArguments, SessionArguments):
149
+ """SmallWebRTCTransport based agent session arguments.
150
+
151
+ Inherits from SmallWebRTCRunnerArguments for compatibility with pipecat-ai runner.
152
+ When pipecat-ai is not installed, uses a fallback implementation (deprecated).
153
+
154
+ For best compatibility, install: pip install pipecatcloud[pipecat]
155
+ """
156
+
157
+ def __post_init__(self):
158
+ SmallWebRTCRunnerArguments.__post_init__(self)
159
+ _warn_standalone_usage()
@@ -321,6 +321,7 @@ class _API:
321
321
  "maxAgents": deploy_config.scaling.max_agents,
322
322
  },
323
323
  "enableKrisp": deploy_config.enable_krisp,
324
+ "enableIntegratedKeysProxy": deploy_config.enable_managed_keys, # API expects this field name
324
325
  }
325
326
 
326
327
  # Remove None values recursively
@@ -5,7 +5,6 @@
5
5
  #
6
6
 
7
7
  import json
8
- import statistics
9
8
  from enum import Enum
10
9
 
11
10
  import aiohttp
@@ -132,6 +131,19 @@ async def status(
132
131
  "[bold]Updated At:[/bold]",
133
132
  str(data.get("updatedAt", "N/A")),
134
133
  )
134
+
135
+ # Check for Managed Keys status
136
+ # API returns integratedKeysProxy but we display as "Managed Keys"
137
+ integrated_keys = data.get("deployment", {}).get("manifest", {}).get("spec", {}).get("integratedKeysProxy", {})
138
+ if isinstance(integrated_keys, dict):
139
+ integrated_keys_enabled = integrated_keys.get("enabled", False)
140
+ else:
141
+ integrated_keys_enabled = bool(integrated_keys)
142
+
143
+ deployment_table.add_row(
144
+ "[bold]Managed Keys:[/bold]",
145
+ "[green]Enabled[/green]" if integrated_keys_enabled else "[dim]Disabled[/dim]",
146
+ )
135
147
 
136
148
  # Autoscaling info
137
149
  autoscaling_data = data.get("autoScaling", None)
@@ -279,6 +279,12 @@ def create_deploy_command(app: typer.Typer):
279
279
  help="Enable Krisp integration for this deployment",
280
280
  rich_help_panel="Deployment Configuration",
281
281
  ),
282
+ managed_keys: bool = typer.Option(
283
+ False,
284
+ "--enable-managed-keys",
285
+ help="Enable Managed Keys for this deployment",
286
+ rich_help_panel="Deployment Configuration",
287
+ ),
282
288
  skip_confirm: bool = typer.Option(
283
289
  False,
284
290
  "--force",
@@ -345,6 +351,7 @@ def create_deploy_command(app: typer.Typer):
345
351
  else partial_config.scaling.max_agents,
346
352
  )
347
353
  partial_config.enable_krisp = krisp or partial_config.enable_krisp
354
+ partial_config.enable_managed_keys = managed_keys or partial_config.enable_managed_keys
348
355
 
349
356
  # Assert agent name and image are provided
350
357
  if not partial_config.agent_name:
@@ -382,6 +389,7 @@ def create_deploy_command(app: typer.Typer):
382
389
  (f"[bold white]Secret set:[/bold white] {'[dim]None[/dim]' if not partial_config.secret_set else '[green] '+ partial_config.secret_set + '[/green]'}"),
383
390
  (f"[bold white]Image pull secret:[/bold white] {'[dim]None[/dim]' if not partial_config.image_credentials else '[green]' + partial_config.image_credentials + '[/green]'}"),
384
391
  (f"[bold white]Krisp:[/bold white] {'[dim]Disabled[/dim]' if not partial_config.enable_krisp else '[green]Enabled[/green]'}"),
392
+ (f"[bold white]Managed Keys:[/bold white] {'[dim]Disabled[/dim]' if not partial_config.enable_managed_keys else '[green]Enabled[/green]'}"),
385
393
  "\n[dim]Scaling configuration:[/dim]",
386
394
  table,
387
395
  *