-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMakefile
More file actions
231 lines (200 loc) · 13.2 KB
/
Makefile
File metadata and controls
231 lines (200 loc) · 13.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
export LANG
.PHONY: Pipfile.lock
Pipfile.lock: # Locks Pipfile and updates the Pipfile.lock on the local file system
docker compose --progress=plain build --no-cache --build-arg RUN_PIPENV_LOCK=true language-model-gateway && \
docker compose --progress=plain run language-model-gateway sh -c "cp -f /tmp/Pipfile.lock /usr/src/language_model_gateway/Pipfile.lock"
.PHONY:devsetup
devsetup: ## one time setup for devs
brew install mkcert && \
make up && \
make setup-pre-commit && \
make tests && \
make up
.PHONY:build
build: ## Builds the docker for dev
docker compose build --parallel
.PHONY: up
up: ## starts docker containers
docker compose up --build -d && \
echo "waiting for language-model-gateway service to become healthy" && \
while [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway`" != "healthy" ] && [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway`" != "unhealthy" ] && [ "`docker inspect --format {{.State.Status}} language-model-gateway`" != "restarting" ]; do printf "." && sleep 2; done && \
if [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway`" != "healthy" ]; then docker ps && docker logs language-model-gateway && printf "========== ERROR: language-model-gateway did not start. Run docker logs language-model-gateway =========\n" && exit 1; fi && \
echo ""
@echo language-model-gateway Service: http://localhost:5050/graphql
.PHONY: up-integration
up-integration: ## starts docker containers
docker compose -f docker-compose.yml -f docker-compose-integration.yml up --build -d && \
echo "waiting for language-model-gateway service to become healthy" && \
while [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway`" != "healthy" ] && [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway`" != "unhealthy" ] && [ "`docker inspect --format {{.State.Status}} language-model-gateway`" != "restarting" ]; do printf "." && sleep 2; done && \
if [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway`" != "healthy" ]; then docker ps && docker logs language-model-gateway && printf "========== ERROR: language-model-gateway did not start. Run docker logs language-model-gateway =========\n" && exit 1; fi && \
echo ""
@echo language-model-gateway Service: http://localhost:5050/graphql
.PHONY: up-open-webui
up-open-webui: clean-database ## starts docker containers
docker compose --progress=plain -f docker-compose-openwebui.yml up --build -d
echo "waiting for open-webui service to become healthy" && \
while [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway-open-webui-1`" != "healthy" ]; do printf "." && sleep 2; done && \
while [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway-open-webui-1`" != "healthy" ] && [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway-open-webui-1`" != "unhealthy" ] && [ "`docker inspect --format {{.State.Status}} language-model-gateway-open-webui-1`" != "restarting" ]; do printf "." && sleep 2; done && \
if [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway-open-webui-1`" != "healthy" ]; then docker ps && docker logs language-model-gateway-open-webui-1 && printf "========== ERROR: language-model-gateway-open-webui-1 did not start. Run docker logs language-model-gateway-open-webui-1 =========\n" && exit 1; fi && \
echo ""
@echo OpenWebUI: http://localhost:3050
.PHONY: up-open-webui-ssl
up-open-webui-ssl: clean-database ## starts docker containers
docker compose --progress=plain -f docker-compose-openwebui.yml -f docker-compose-openwebui-ssl.yml up --build -d
echo "waiting for open-webui service to become healthy" && \
while [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway-open-webui-1`" != "healthy" ]; do printf "." && sleep 2; done && \
while [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway-open-webui-1`" != "healthy" ] && [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway-open-webui-1`" != "unhealthy" ] && [ "`docker inspect --format {{.State.Status}} language-model-gateway-open-webui-1`" != "restarting" ]; do printf "." && sleep 2; done && \
if [ "`docker inspect --format {{.State.Health.Status}} language-model-gateway-open-webui-1`" != "healthy" ]; then docker ps && docker logs language-model-gateway-open-webui-1 && printf "========== ERROR: language-model-gateway-open-webui-1 did not start. Run docker logs language-model-gateway-open-webui-1 =========\n" && exit 1; fi && \
echo ""
@echo OpenWebUI: http://localhost:3050 https://open-webui.localhost
.PHONY: up-open-webui-auth
up-open-webui-auth: create-certs ## starts docker containers
docker compose --progress=plain \
-f docker-compose-keycloak.yml \
-f docker-compose.yml \
-f docker-compose-openwebui.yml -f docker-compose-openwebui-ssl.yml -f docker-compose-openwebui-auth.yml \
-f docker-compose-mcp-server-gateway.yml \
up -d
echo "waiting for open-webui service to become healthy" && \
max_attempts=30 && \
attempt=0 && \
while [ $$attempt -lt $$max_attempts ]; do \
container_status=$$(docker inspect --format '{{.State.Health.Status}}' language-model-gateway-open-webui-1 2>/dev/null) && \
container_state=$$(docker inspect --format '{{.State.Status}}' language-model-gateway-open-webui-1 2>/dev/null) && \
if [ "$$container_status" = "healthy" ]; then \
echo "" && \
break; \
elif [ "$$container_status" = "unhealthy" ] || [ "$$container_state" = "restarting" ]; then \
echo "" && \
echo "========== ERROR: Container became unhealthy ==========" && \
docker ps && \
docker logs language-model-gateway-open-webui-1 && \
printf "========== ERROR: language-model-gateway-open-webui-1 is unhealthy. Run docker logs language-model-gateway-open-webui-1 =========\n" && \
exit 1; \
fi; \
printf "." && \
sleep 2 && \
attempt=$$((attempt + 1)); \
done && \
if [ $$attempt -ge $$max_attempts ]; then \
echo "" && \
echo "========== ERROR: Container did not become healthy within timeout ==========" && \
docker ps && \
docker logs language-model-gateway-open-webui-1 && \
printf "========== ERROR: language-model-gateway-open-webui-1 did not start. Run docker logs language-model-gateway-open-webui-1 =========\n" && \
exit 1; \
fi
echo "waiting for mcp-server-gateway to become healthy" && \
while [ "`docker inspect --format {{.State.Health.Status}} mcp-server-gateway`" != "healthy" ]; do printf "." && sleep 2; done && \
while [ "`docker inspect --format {{.State.Health.Status}} mcp-server-gateway`" != "healthy" ] && [ "`docker inspect --format {{.State.Health.Status}} mcp-server-gateway`" != "unhealthy" ] && [ "`docker inspect --format {{.State.Status}} mcp-server-gateway`" != "restarting" ]; do printf "." && sleep 2; done && \
if [ "`docker inspect --format {{.State.Health.Status}} mcp-server-gateway`" != "healthy" ]; then docker ps && docker logs mcp-server-gateway && printf "========== ERROR: mcp-server-gateway did not start. Run docker logs mcp-server-gateway =========\n" && exit 1; fi
make insert-admin-user && make insert-admin-user-2 && make import-open-webui-pipe
@echo "======== Services are up and running ========"
@echo OpenWebUI: https://open-webui.localhost
@echo Click 'Continue with Keycloak' to login
@echo Use the following credentials:
@echo Admin User: admin/password
@echo Normal User: tester/password
@echo Keycloak: http://keycloak:8080 admin/password
@echo OIDC debugger: http://localhost:8085
@echo Language Model Gateway Auth Test: http://localhost:5050/auth/login
@echo OpenWebUI API docs: https://open-webui.localhost//docs
.PHONY: down
down: ## stops docker containers
docker compose --progress=plain \
-f docker-compose-keycloak.yml \
-f docker-compose.yml \
-f docker-compose-openwebui.yml -f docker-compose-openwebui-ssl.yml -f docker-compose-openwebui-auth.yml \
-f docker-compose-mcp-server-gateway.yml \
down --remove-orphans
.PHONY:update
update: Pipfile.lock setup-pre-commit ## Updates all the packages using Pipfile
make build && \
make run-pre-commit && \
echo "In PyCharm, do File -> Invalidate Caches/Restart to refresh" && \
echo "If you encounter issues with remote sources being out of sync, click on the 'Remote Python' feature on" && \
echo "the lower status bar and reselect the same interpreter and it will rebuild the remote source cache." && \
echo "See this link for more details:" && \
echo "https://intellij-support.jetbrains.com/hc/en-us/community/posts/205813579-Any-way-to-force-a-refresh-of-external-libraries-on-a-remote-interpreter-?page=2#community_comment_360002118020"
.DEFAULT_GOAL := help
.PHONY: help
help: ## Show this help.
# from https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.PHONY:tests
tests: ## Runs all the tests
docker compose run --rm --name language-model-gateway_tests language-model-gateway pytest tests
.PHONY:tests-integration
tests-integration: ## Runs all the tests
docker compose run --rm -e RUN_TESTS_WITH_REAL_LLM=1 --name language-model-gateway_tests language-model-gateway pytest tests
.PHONY:shell
shell: ## Brings up the bash shell in dev docker
docker compose run --rm --name language-model-gateway_shell language-model-gateway /bin/sh
.PHONY:clean-pre-commit
clean-pre-commit: ## removes pre-commit hook
rm -f .git/hooks/pre-commit
.PHONY:setup-pre-commit
setup-pre-commit:
cp ./pre-commit-hook ./.git/hooks/pre-commit
.PHONY:run-pre-commit
run-pre-commit: setup-pre-commit ## runs pre-commit on all files
./.git/hooks/pre-commit pre_commit_all_files
.PHONY: clean
clean: down clean-database ## Cleans all the local docker setup
.PHONY: clean-database
clean-database: down ## Cleans all the local docker setup
ifneq ($(shell docker volume ls | grep "language-model-gateway"| awk '{print $$2}'),)
docker volume ls | grep "language-model-gateway" | awk '{print $$2}' | xargs docker volume rm
endif
.PHONY: insert-admin-user
insert-admin-user: ## Inserts an admin user with email 'admin@localhost' if it does not already exist
docker exec -i language-model-gateway-open-webui-db-1 psql -U myapp_user -d myapp_db -p 5431 -c \
"INSERT INTO public.\"user\" (id,name,email,\"role\",profile_image_url,api_key,created_at,updated_at,last_active_at,settings,info,oauth_sub) \
SELECT '8d967d73-99b8-40ff-ac3b-c71ac19e1286','User','admin@localhost','admin','/user.png',NULL,1735089600,1735089600,1735089609,'{"ui": {"version": "0.4.8"}}','null',NULL \
WHERE NOT EXISTS (SELECT 1 FROM public.\"user\" WHERE id = '8d967d73-99b8-40ff-ac3b-c71ac19e1286');"
.PHONY: insert-admin-user-2
insert-admin-user-2: ## Inserts an admin user with email 'admin@tester.com' and api_key 'sk-my-api-key' if it does not already exist
docker exec -i language-model-gateway-open-webui-db-1 psql -U myapp_user -d myapp_db -p 5431 -c \
"INSERT INTO public.user (id, name, email, role, profile_image_url, api_key, created_at, updated_at, last_active_at, settings, info, oauth_sub, username, bio, gender, date_of_birth) \
SELECT 'f841d162-89a8-46f7-89c2-bf112029d19c', 'admin@tester.com', 'admin@tester.com', 'admin', '/user.png', 'sk-my-api-key', 1756681388, 1756681388, 1756681389, 'null', 'null', 'oidc@admin', NULL, NULL, NULL, NULL \
WHERE NOT EXISTS (SELECT 1 FROM public.\"user\" WHERE email='admin@tester.com');"
.PHONY: set-admin-user-role
set-admin-user-role: ## Sets the role of the user 'admin@tester.com' to admin
docker exec -i language-model-gateway-open-webui-db-1 psql -U myapp_user -d myapp_db -p 5431 -c \
"UPDATE public.\"user\" SET \"role\"='admin' WHERE name='admin@tester.com';"
CERT_DIR := certs
CERT_KEY := $(CERT_DIR)/open-webui.localhost-key.pem
CERT_CRT := $(CERT_DIR)/open-webui.localhost.pem
.PHONY: all install-ca create-certs
# Install local Certificate Authority
install-ca: ## Installs a local CA using mkcert
mkcert -install
# Create certificates
create-certs: install-ca ## Creates self-signed certificates for open-webui.localhost
@if [ ! -f "$(CERT_CRT)" ]; then \
mkdir -p $(CERT_DIR); \
mkcert open-webui.localhost localhost 127.0.0.1 ::1; \
mv ./open-webui.localhost+3.pem $(CERT_CRT); \
mv ./open-webui.localhost+3-key.pem $(CERT_KEY); \
echo "Certificates generated in $(CERT_DIR)"; \
else \
echo "Certificates already exist at $(CERT_CRT)"; \
fi
clean_certs:
rm -rf $(CERT_DIR)
.PHONY: import-open-webui-pipe
import-open-webui-pipe: ## Imports the OpenWebUI function pipe into OpenWebUI
docker exec -i language-model-gateway-open-webui-db-1 psql -U myapp_user -d myapp_db -p 5431 -c \
"DELETE FROM public.function WHERE id='language_model_gateway';"
docker run --rm -it --name openid-function-creator \
--network language-model-gateway_web \
--mount type=bind,source="${PWD}"/openwebui-config/functions,target=/app \
python:3.12-alpine \
sh -c "pip install --root-user-action=ignore --upgrade pip && \
pip install --root-user-action=ignore authlib requests && \
cd /app && \
python3 import_pipe.py \
--url 'http://language-model-gateway-open-webui-1:8080' \
--api-key 'sk-my-api-key' \
--json 'language_model_gateway_pipe.json' \
--file 'language_model_gateway_pipe.py'"