Skip to content

Commit 9938d92

Browse files
committed
add version, auto unload
1 parent 8410ef5 commit 9938d92

File tree

13 files changed

+279
-107
lines changed

13 files changed

+279
-107
lines changed

.github/workflows/build-publish.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ jobs:
6363
- name: Build and Push HoML Server CPU Image
6464
working-directory: ./server
6565
run: |
66+
VERSION=${GITHUB_REF##*/}
6667
docker buildx build \
68+
--build-arg HOML_SERVER_VERSION=$VERSION \
6769
-t ghcr.io/${{ github.repository_owner }}/homl/server:latest-cpu \
6870
-f Dockerfile.cpu.app \
6971
. \
@@ -91,7 +93,9 @@ jobs:
9193
- name: Build and Push HoML Server CUDA Image
9294
working-directory: ./server
9395
run: |
96+
VERSION=${GITHUB_REF##*/}
9497
docker buildx build \
98+
--build-arg HOML_SERVER_VERSION=$VERSION \
9599
-t ghcr.io/${{ github.repository_owner }}/homl/server:latest-cuda \
96100
-f Dockerfile.cuda \
97101
. \
@@ -118,7 +122,9 @@ jobs:
118122
- name: Build and Push HoML Server CUDA Image
119123
working-directory: ./server
120124
run: |
125+
VERSION=${GITHUB_REF##*/}
121126
docker buildx build \
127+
--build-arg HOML_SERVER_VERSION=$VERSION \
122128
-t ghcr.io/${{ github.repository_owner }}/homl/server:latest-cuda-gptoss \
123129
-f Dockerfile.cuda-gptoss \
124130
. \

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,4 @@ cython_debug/
205205
marimo/_static/
206206
marimo/_lsp/
207207
__marimo__/
208+
cli/homl_cli/__version.txt

cli/build.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,17 @@ ENTRY_POINT="homl_cli/main.py"
2222
DATA_FILE="homl_cli/docker-compose.yml.template"
2323
# The binary will be named 'homl'
2424
BINARY_NAME="homl"
25+
if [ -z "$CLI_VERSION" ]; then
26+
# If CLI_VERSION is not set, default to 'dev'
27+
CLI_VERSION="dev"
28+
fi
29+
echo "$CLI_VERSION" > homl_cli/__version.txt
2530

2631
pyinstaller \
2732
--name "$BINARY_NAME" \
2833
--onefile \
2934
--console \
35+
--add-data "homl_cli/__version.txt:." \
3036
--add-data "$DATA_FILE:." \
3137
"$ENTRY_POINT"
3238

cli/homl_cli/daemon_pb2.py

Lines changed: 35 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cli/homl_cli/daemon_pb2_grpc.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ def __init__(self, channel):
6060
request_serializer=daemon__pb2.ListLocalModelsRequest.SerializeToString,
6161
response_deserializer=daemon__pb2.ListLocalModelsResponse.FromString,
6262
_registered_method=True)
63+
self.Version = channel.unary_unary(
64+
'/homl.Daemon/Version',
65+
request_serializer=daemon__pb2.VersionRequest.SerializeToString,
66+
response_deserializer=daemon__pb2.VersionResponse.FromString,
67+
_registered_method=True)
6368

6469

6570
class DaemonServicer(object):
@@ -101,6 +106,12 @@ def ListLocalModels(self, request, context):
101106
context.set_details('Method not implemented!')
102107
raise NotImplementedError('Method not implemented!')
103108

109+
def Version(self, request, context):
110+
"""Missing associated documentation comment in .proto file."""
111+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
112+
context.set_details('Method not implemented!')
113+
raise NotImplementedError('Method not implemented!')
114+
104115

105116
def add_DaemonServicer_to_server(servicer, server):
106117
rpc_method_handlers = {
@@ -129,6 +140,11 @@ def add_DaemonServicer_to_server(servicer, server):
129140
request_deserializer=daemon__pb2.ListLocalModelsRequest.FromString,
130141
response_serializer=daemon__pb2.ListLocalModelsResponse.SerializeToString,
131142
),
143+
'Version': grpc.unary_unary_rpc_method_handler(
144+
servicer.Version,
145+
request_deserializer=daemon__pb2.VersionRequest.FromString,
146+
response_serializer=daemon__pb2.VersionResponse.SerializeToString,
147+
),
132148
}
133149
generic_handler = grpc.method_handlers_generic_handler(
134150
'homl.Daemon', rpc_method_handlers)
@@ -275,3 +291,30 @@ def ListLocalModels(request,
275291
timeout,
276292
metadata,
277293
_registered_method=True)
294+
295+
@staticmethod
296+
def Version(request,
297+
target,
298+
options=(),
299+
channel_credentials=None,
300+
call_credentials=None,
301+
insecure=False,
302+
compression=None,
303+
wait_for_ready=None,
304+
timeout=None,
305+
metadata=None):
306+
return grpc.experimental.unary_unary(
307+
request,
308+
target,
309+
'/homl.Daemon/Version',
310+
daemon__pb2.VersionRequest.SerializeToString,
311+
daemon__pb2.VersionResponse.FromString,
312+
options,
313+
channel_credentials,
314+
insecure,
315+
call_credentials,
316+
compression,
317+
wait_for_ready,
318+
timeout,
319+
metadata,
320+
_registered_method=True)

cli/homl_cli/main.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,26 @@ def auth():
6363
main.add_command(auth)
6464
main.add_command(server)
6565

66+
@main.command()
67+
def version():
68+
"""Show CLI and server version."""
69+
version_file = get_resource_path("__version.txt")
70+
cli_version = "dev"
71+
if version_file.exists():
72+
with open(version_file, 'r') as f:
73+
cli_version = f.read().strip()
74+
click.echo(f"HoML CLI version: {cli_version}")
75+
# Try to get server version via gRPC
76+
stub = get_client_stub()
77+
if stub:
78+
try:
79+
resp = stub.Version(daemon_pb2.VersionRequest())
80+
click.echo(f"HoML Server version: {resp.version}")
81+
except Exception:
82+
click.echo("HoML Server version: unavailable (gRPC error)")
83+
else:
84+
click.echo("HoML Server version: unavailable (daemon not running)")
85+
6686
def check_and_install_docker():
6787
"""Checks for Docker and Docker Compose and asks to install if missing."""
6888
# Check for 'docker' and 'docker compose' (not 'docker-compose')
@@ -305,6 +325,7 @@ def run(model_name):
305325
"""Starts a model with the vLLM server."""
306326
stub = get_client_stub()
307327
if stub:
328+
click.echo(f"Starting model '{model_name}' (vLLM is a bit slow to start)...")
308329
response = stub.StartModel(daemon_pb2.StartModelRequest(model_name=model_name))
309330
click.echo(response.message)
310331

protos/daemon.proto

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,18 @@ service Daemon {
2222

2323
// Lists locally available models.
2424
rpc ListLocalModels (ListLocalModelsRequest) returns (ListLocalModelsResponse) {}
25+
26+
rpc Version (VersionRequest) returns (VersionResponse) {}
2527
}
2628

29+
30+
2731
// --- Messages ---
32+
message VersionRequest {
33+
}
34+
message VersionResponse {
35+
string version = 1;
36+
}
2837

2938
message PullModelRequest {
3039
string model_name = 1;

server/Dockerfile.cpu.app

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ RUN pip install -r requirements.txt
1919
# Copy our application source code
2020
COPY ./homl_server ./
2121

22+
ARG HOML_SERVER_VERSION=dev
23+
ENV HOML_SERVER_VERSION=$HOML_SERVER_VERSION
2224

2325
# Start the server directly from main.py
2426
CMD ["python3", "-u", "main.py"]

server/Dockerfile.cuda

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ COPY ./homl_server ./homl_server
2121
WORKDIR /app/homl_server
2222
# The base image exposes port 8000, so we don't need to do it again.
2323
# EXPOSE 8000
24+
ARG HOML_SERVER_VERSION=dev
25+
ENV HOML_SERVER_VERSION=$HOML_SERVER_VERSION
2426

2527
# We overwrite the base image's entrypoint to run our custom Ray Serve
2628
# application, which provides dynamic model management.

server/Dockerfile.cuda-gptoss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ WORKDIR /app/homl_server
2222
# The base image exposes port 8000, so we don't need to do it again.
2323
# EXPOSE 8000
2424

25+
ARG HOML_SERVER_VERSION=dev
26+
ENV HOML_SERVER_VERSION=$HOML_SERVER_VERSION
27+
2528
# We overwrite the base image's entrypoint to run our custom Ray Serve
2629
# application, which provides dynamic model management.
2730
ENTRYPOINT [ "python3", "-u", "main.py"]

0 commit comments

Comments
 (0)