Add HTTPS serving option

This commit is contained in:
Ashwin Bharambe 2025-02-06 16:04:25 -08:00
parent e6c9f2a485
commit 4f3c19114c
5 changed files with 88 additions and 6 deletions

View file

@ -55,6 +55,16 @@ class StackRun(Subcommand):
default=[],
metavar="KEY=VALUE",
)
self.parser.add_argument(
"--ssl-keyfile",
type=str,
help="Path to SSL key file for HTTPS",
)
self.parser.add_argument(
"--ssl-certfile",
type=str,
help="Path to SSL certificate file for HTTPS",
)
def _run_stack_run_cmd(self, args: argparse.Namespace) -> None:
import importlib.resources
@ -178,4 +188,7 @@ class StackRun(Subcommand):
return
run_args.extend(["--env", f"{key}={value}"])
if args.ssl_keyfile and args.ssl_certfile:
run_args.extend(["--ssl-keyfile", args.ssl_keyfile, "--ssl-certfile", args.ssl_certfile])
run_with_pty(run_args)

View file

@ -117,6 +117,21 @@ class Provider(BaseModel):
config: Dict[str, Any]
class ServerConfig(BaseModel):
port: int = Field(
default=8321,
description="Port to listen on",
)
ssl_certfile: Optional[str] = Field(
default=None,
description="Path to SSL certificate file for HTTPS",
)
ssl_keyfile: Optional[str] = Field(
default=None,
description="Path to SSL key file for HTTPS",
)
class StackRunConfig(BaseModel):
version: str = LLAMA_STACK_RUN_CONFIG_VERSION
@ -159,6 +174,11 @@ a default SQLite store will be used.""",
eval_tasks: List[EvalTaskInput] = Field(default_factory=list)
tool_groups: List[ToolGroupInput] = Field(default_factory=list)
server: ServerConfig = Field(
default_factory=ServerConfig,
description="Configuration for the HTTP(S) server",
)
class BuildConfig(BaseModel):
version: str = LLAMA_STACK_BUILD_CONFIG_VERSION

View file

@ -282,6 +282,19 @@ def main():
action="append",
help="Environment variables in KEY=value format. Can be specified multiple times.",
)
parser.add_argument(
"--ssl-keyfile",
help="Path to SSL key file for HTTPS",
)
parser.add_argument(
"--ssl-certfile",
help="Path to SSL certificate file for HTTPS",
)
if args.ssl_keyfile and not args.ssl_certfile:
parser.error("You must provide both --ssl-keyfile and --ssl-certfile when using HTTPS")
if args.ssl_certfile and not args.ssl_keyfile:
parser.error("You must provide both --ssl-keyfile and --ssl-certfile when using HTTPS")
args = parser.parse_args()
if args.env:
@ -381,11 +394,36 @@ def main():
import uvicorn
# FYI this does not do hot-reloads
# Configure SSL if certificates are provided
port = args.port or config.server.port
ssl_config = None
if args.ssl_keyfile:
keyfile = args.ssl_keyfile
certfile = args.ssl_certfile
else:
keyfile = config.server.ssl_keyfile
certfile = config.server.ssl_certfile
if keyfile and certfile:
ssl_config = {
"ssl_keyfile": keyfile,
"ssl_certfile": certfile,
}
print(f"HTTPS enabled with certificates:\n Key: {keyfile}\n Cert: {certfile}")
listen_host = ["::", "0.0.0.0"] if not args.disable_ipv6 else "0.0.0.0"
print(f"Listening on {listen_host}:{args.port}")
uvicorn.run(app, host=listen_host, port=args.port)
print(f"Listening on {listen_host}:{port}")
uvicorn_config = {
"app": app,
"host": listen_host,
"port": port,
}
if ssl_config:
uvicorn_config.update(ssl_config)
uvicorn.run(**uvicorn_config)
def extract_path_params(route: str) -> List[str]:

View file

@ -34,6 +34,7 @@ shift
# Process environment variables from --env arguments
env_vars=""
other_args=""
while [[ $# -gt 0 ]]; do
case "$1" in
--env)
@ -48,6 +49,7 @@ while [[ $# -gt 0 ]]; do
fi
;;
*)
other_args="$other_args $1"
shift
;;
esac
@ -61,4 +63,5 @@ $CONDA_PREFIX/bin/python \
-m llama_stack.distribution.server.server \
--yaml-config "$yaml_config" \
--port "$port" \
$env_vars
$env_vars \
$other_args

View file

@ -40,8 +40,12 @@ shift
port="$1"
shift
# Initialize other_args
other_args=""
# Process environment variables from --env arguments
env_vars=""
while [[ $# -gt 0 ]]; do
case "$1" in
--env)
@ -55,6 +59,7 @@ while [[ $# -gt 0 ]]; do
fi
;;
*)
other_args="$other_args $1"
shift
;;
esac
@ -93,5 +98,8 @@ $CONTAINER_BINARY run $CONTAINER_OPTS -it \
-v "$yaml_config:/app/config.yaml" \
$mounts \
--env LLAMA_STACK_PORT=$port \
--entrypoint='["python", "-m", "llama_stack.distribution.server.server", "--yaml-config", "/app/config.yaml"]' \
$container_image:$version_tag
--entrypoint python \
$container_image:$version_tag \
-m llama_stack.distribution.server.server \
--yaml-config /app/config.yaml \
$other_args