@@ -22,6 +22,27 @@ MLFLOW_VERSION ?= 3.9.0
2222MLFLOW_PORT ?= 5001
2323MLFLOW_DATA ?= $(shell pwd) /.mlflow
2424
25+ # Llama Stack test server configuration (used by mock/test mode only)
26+ TEST_LLAMA_STACK_VERSION ?= 0.6.0
27+ TEST_LLAMA_STACK_PORT ?= 18321
28+ TEST_LLAMA_STACK_DIR ?= testdata/llamastack
29+ TEST_LLAMA_STACK_DATA ?= $(shell pwd) /$(TEST_LLAMA_STACK_DIR ) /.data
30+ TEST_LLAMA_STACK_RECORDINGS ?= $(shell pwd) /$(TEST_LLAMA_STACK_DIR )
31+ TEST_LLAMA_STACK_CONFIG ?= $(TEST_LLAMA_STACK_DIR ) /config.yaml
32+ TEST_LLAMA_STACK_TEST_ID ?= bff/$(TEST_LLAMA_STACK_DIR ) /test.py::record
33+
34+ # Provider and bare model IDs (source of truth, used by config yaml)
35+ TEST_LLAMA_STACK_PROVIDER ?= gemini
36+ TEST_LLAMA_STACK_MODEL_ID ?= models/gemini-2.5-flash
37+ TEST_LLAMA_STACK_EMBEDDING_MODEL_ID ?= models/gemini-embedding-001
38+ TEST_LLAMA_STACK_EMBEDDING_DIMENSION ?= 128
39+ TEST_LLAMA_STACK_SHIELD_MODEL_ID ?= models/gemini-2.5-flash
40+
41+ # Prefixed model refs (derived from above, used by Go tests and shield)
42+ TEST_LLAMA_STACK_MODEL ?= $(TEST_LLAMA_STACK_PROVIDER ) /$(TEST_LLAMA_STACK_MODEL_ID )
43+ TEST_LLAMA_STACK_EMBEDDING_MODEL ?= $(TEST_LLAMA_STACK_PROVIDER ) /$(TEST_LLAMA_STACK_EMBEDDING_MODEL_ID )
44+ TEST_LLAMA_STACK_SHIELD_MODEL ?= $(TEST_LLAMA_STACK_PROVIDER ) /$(TEST_LLAMA_STACK_SHIELD_MODEL_ID )
45+
2546.PHONY : all
2647all : build
2748
@@ -53,6 +74,15 @@ vet: . ## Runs static analysis tools on source files and reports suspicious con
5374test : fmt vet envtest uv # # Runs the full test suite.
5475 ENVTEST_ASSETS=" $( shell $( ENVTEST) use $( ENVTEST_K8S_VERSION) --bin-dir $( LOCALBIN) -p path) " \
5576 MLFLOW_PORT=$(MLFLOW_PORT ) MLFLOW_VERSION=$(MLFLOW_VERSION ) \
77+ LLAMA_STACK_TEST_ID=$(TEST_LLAMA_STACK_TEST_ID ) \
78+ TEST_LLAMA_STACK_PORT=$(TEST_LLAMA_STACK_PORT ) TEST_LLAMA_STACK_VERSION=$(TEST_LLAMA_STACK_VERSION ) \
79+ TEST_LLAMA_STACK_PROVIDER=$(TEST_LLAMA_STACK_PROVIDER ) \
80+ TEST_LLAMA_STACK_MODEL=$(TEST_LLAMA_STACK_MODEL ) \
81+ TEST_LLAMA_STACK_EMBEDDING_MODEL=$(TEST_LLAMA_STACK_EMBEDDING_MODEL ) \
82+ TEST_LLAMA_STACK_MODEL_ID=$(TEST_LLAMA_STACK_MODEL_ID ) \
83+ TEST_LLAMA_STACK_EMBEDDING_MODEL_ID=$(TEST_LLAMA_STACK_EMBEDDING_MODEL_ID ) \
84+ TEST_LLAMA_STACK_EMBEDDING_DIMENSION=$(TEST_LLAMA_STACK_EMBEDDING_DIMENSION ) \
85+ TEST_LLAMA_STACK_SHIELD_MODEL=$(TEST_LLAMA_STACK_SHIELD_MODEL ) \
5686 go test ./...
5787
5888.PHONY : build
@@ -96,6 +126,49 @@ mlflow-clean: mlflow-down ## Remove local MLflow data.
96126 rm -rf $(MLFLOW_DATA ) $(MLFLOW_DATA ) -test
97127 @echo " MLflow data cleaned"
98128
129+ # #@ Llama Stack
130+
131+ .PHONY : llamastack-up
132+ llamastack-up : uv # # Start local Llama Stack server in replay mode (Ctrl+C to stop).
133+ @rm -rf $(TEST_LLAMA_STACK_DATA )
134+ @mkdir -p $(TEST_LLAMA_STACK_DATA )
135+ @echo " Starting Llama Stack in REPLAY mode on port $( TEST_LLAMA_STACK_PORT) ..."
136+ SQLITE_STORE_DIR=$(TEST_LLAMA_STACK_DATA ) \
137+ GEMINI_API_KEY=dummy-key-for-replay \
138+ LLAMA_STACK_TEST_INFERENCE_MODE=replay \
139+ LLAMA_STACK_TEST_RECORDING_DIR=$(TEST_LLAMA_STACK_RECORDINGS ) \
140+ LLAMA_STACK_TEST_STACK_CONFIG_TYPE=server \
141+ LLAMA_STACK_TEST_ID=$(TEST_LLAMA_STACK_TEST_ID ) \
142+ TEST_LLAMA_STACK_PROVIDER=$(TEST_LLAMA_STACK_PROVIDER ) \
143+ TEST_LLAMA_STACK_MODEL_ID=$(TEST_LLAMA_STACK_MODEL_ID ) \
144+ TEST_LLAMA_STACK_EMBEDDING_MODEL_ID=$(TEST_LLAMA_STACK_EMBEDDING_MODEL_ID ) \
145+ TEST_LLAMA_STACK_EMBEDDING_DIMENSION=$(TEST_LLAMA_STACK_EMBEDDING_DIMENSION ) \
146+ TEST_LLAMA_STACK_EMBEDDING_MODEL=$(TEST_LLAMA_STACK_EMBEDDING_MODEL ) \
147+ TEST_LLAMA_STACK_SHIELD_MODEL=$(TEST_LLAMA_STACK_SHIELD_MODEL ) \
148+ $(UV ) run --with llama-stack==$(TEST_LLAMA_STACK_VERSION ) --with-requirements $(TEST_LLAMA_STACK_DIR ) /requirements.txt \
149+ llama stack run $(TEST_LLAMA_STACK_CONFIG ) --port $(TEST_LLAMA_STACK_PORT )
150+
151+ .PHONY : llamastack-down
152+ llamastack-down : # # Stop local Llama Stack server and remove ephemeral data.
153+ @-lsof -t -i :$(TEST_LLAMA_STACK_PORT ) | xargs kill 2> /dev/null || true
154+ @sleep 2
155+ @-lsof -t -i :$(TEST_LLAMA_STACK_PORT ) | xargs kill -9 2> /dev/null || true
156+ @rm -rf $(TEST_LLAMA_STACK_DATA )
157+ @echo " Llama Stack server stopped (runtime data cleaned)"
158+
159+ .PHONY : llamastack-record
160+ llamastack-record : # # Record Llama Stack fixtures by running Go tests against real Gemini (needs GEMINI_API_KEY).
161+ @if [ -z " $$ {GEMINI_API_KEY:-}" ]; then \
162+ echo " ERROR: GEMINI_API_KEY must be set for recording." ; \
163+ echo " Usage: GEMINI_API_KEY=<key> make llamastack-record" ; \
164+ exit 1; \
165+ fi
166+ @rm -rf $(TEST_LLAMA_STACK_RECORDINGS ) /recordings
167+ @echo " Cleared previous recordings"
168+ LLAMA_STACK_TEST_INFERENCE_MODE=record $(MAKE ) test
169+ @COUNT=$$(find $(TEST_LLAMA_STACK_RECORDINGS ) /recordings -name "*.json" 2>/dev/null | wc -l | tr -d ' ' ) ; \
170+ echo " Recording complete! $$ {COUNT} JSON files" ;
171+
99172# #@ Dependencies
100173
101174# # Location to install dependencies to
0 commit comments