Skip to content

Commit c77d967

Browse files
wanhakimCopilot
andauthored
Add LLM Evaluation Feature (#90)
* fixed tgi depreciated issue Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> * cleanup frontend and update tgi version Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> * initial push evaluation on development compose Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> * implement eval into k8 cluster Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> * enable pulling judge model from UI Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> * improving UX/UI and fixing bugs Co-authored-by: Copilot <copilot@github.com> Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> * upversion pnpm in studio-frontend dockerfile Co-authored-by: Copilot <copilot@github.com> Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> * fix globalization to default to english instead of mandarin Co-authored-by: Copilot <copilot@github.com> Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> * fix finetuning playwright Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> --------- Signed-off-by: wwanarif <wan.abdul.hakim.b.wan.arif@intel.com> Co-authored-by: Copilot <copilot@github.com>
1 parent 5f54898 commit c77d967

150 files changed

Lines changed: 10846 additions & 40308 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
test-results/
22
**.log
33
**/report.html
4+
.env
45
docker-compose
56
**/node_modules/
6-
7-
*.pyc
8-
7+
**.venv/
8+
**pycache**/
99
.DS_Store
1010
.env.development
11-
__pycache__/
12-
*.pyc
11+
*.pyc

setup-scripts/build-image-to-registry/buildpush-genaistudio-images.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
--build-arg http_proxy="{{ http_proxy }}"
1111
--build-arg https_proxy="{{ http_proxy }}"
1212
--build-arg no_proxy="{{ no_proxy }}"
13+
--build-context sample_workflows="../sample-workflows"
1314
-t "{{ container_registry }}/{{ item.image_name }}:{{ container_tag }}" .
1415
args:
1516
chdir: "{{ item.directory }}"
@@ -20,6 +21,7 @@
2021
loop:
2122
- { directory: '../../studio-frontend/', image_name: 'studio-frontend' }
2223
- { directory: '../../studio-backend/', image_name: 'studio-backend' }
24+
- { directory: '../../studio-eval/', image_name: 'studio-eval' }
2325
- { directory: '../../app-frontend/', image_name: 'app-frontend' }
2426
- { directory: '../../app-backend/', image_name: 'app-backend' }
2527
register: build_results
@@ -33,6 +35,7 @@
3335
loop:
3436
- { image_name: 'studio-frontend' }
3537
- { image_name: 'studio-backend' }
38+
- { image_name: 'studio-eval' }
3639
- { image_name: 'app-frontend' }
3740
- { image_name: 'app-backend' }
3841

@@ -42,5 +45,6 @@
4245
loop:
4346
- { image_name: 'studio-frontend' }
4447
- { image_name: 'studio-backend' }
48+
- { image_name: 'studio-eval' }
4549
- { image_name: 'app-frontend' }
4650
- { image_name: 'app-backend' }
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# =============================================================================
2+
# GenAI Studio — Local Development Environment
3+
# docker compose -f docker-compose.local.yml reads this file automatically
4+
# Copy this file to .env and adjust values for your environment
5+
# =============================================================================
6+
7+
# --- Proxy (leave blank if not behind a proxy) ---
8+
http_proxy=
9+
https_proxy=
10+
no_proxy=localhost,127.0.0.1,mysql,studio-backend,studio-eval,ollama,finetuning-server
11+
12+
# --- Container images for sandbox deployments ---
13+
APP_FRONTEND_IMAGE=opea/app-frontend:latest
14+
APP_BACKEND_IMAGE=opea/app-backend:latest
15+
16+
# --- MySQL (shared by studio-frontend and studio-eval) ---
17+
MYSQL_HOST=mysql
18+
MYSQL_PORT=3306
19+
MYSQL_ROOT_PASSWORD=password
20+
MYSQL_FLOWISE_DB=flowise
21+
MYSQL_EVAL_DB=eval
22+
MYSQL_USER=root
23+
MYSQL_PASSWORD=password
24+
25+
# --- Service endpoints ---
26+
# studio-frontend server-side code runs inside Docker, so it should use Docker DNS.
27+
# The browser-side UI should use the Vite /studio-backend proxy on port 8088
28+
STUDIO_SERVER_URL=http://studio-backend:5000
29+
30+
# studio-frontend UI dev flags
31+
NODE_TLS_REJECT_UNAUTHORIZED=0
32+
NODE_ENV=development
33+
VITE_DISABLE_KEYCLOAK=true
34+
VITE_HOST=0.0.0.0
35+
VITE_PORT=8088
36+
37+
# studio-backend -> studio-eval (host:port, no scheme)
38+
EVAL_SERVICE_DNS=studio-eval:8000
39+
40+
# Local compose: skip Grafana dashboard import/delete during sandbox lifecycle.
41+
DISABLE_GRAFANA_DASHBOARD_SYNC=true
42+
43+
# --- Sandbox routing from local-nginx to K8s namespaces ---
44+
# CoreDNS ClusterIP of your cluster (kubeadm commonly 10.96.0.10, k3s 10.43.0.10)
45+
K8S_DNS_RESOLVER=10.96.0.10
46+
47+
# studio-eval -> Ollama (host:port, no scheme)
48+
OLLAMA_DNS=ollama:11434
49+
50+
# --- Finetuning service ---
51+
# host:port, no scheme
52+
FINETUNING_SERVICE_DNS=finetuning-server:8015
53+
FINETUNING_RAY_DNS=finetuning-server:8265
54+
55+
# studio-eval -> sandbox app-backend via kubectl port-forward on host.
56+
# This mirrors app-backend behavior while bypassing local Docker->K8s DNS issues.
57+
# Ensure you have `kubectl -n <namespace> port-forward --address <docker bridge IP> service/app-backend 18899:8899` running on your host.
58+
# To get docker bridge IP: docker network inspect bridge --format '{{range .IPAM.Config}}{{.Gateway}}{{end}}'
59+
APP_BACKEND_URL_TEMPLATE=http://host.docker.internal:18899/v1/app-backend
Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
# Local development compose — simulates K8s studio namespace
2+
# Sandbox deploy can target a real cluster when studio-backend has a working
3+
# kubeconfig and any cluster-side dependencies it calls are reachable.
4+
# Run: docker compose -f docker-compose.local.yml up -d
5+
6+
services:
7+
8+
studio-frontend:
9+
build:
10+
context: ../../studio-frontend
11+
additional_contexts:
12+
sample_workflows: ../../sample-workflows
13+
target: builder
14+
args:
15+
http_proxy: ${http_proxy}
16+
https_proxy: ${https_proxy}
17+
no_proxy: ${no_proxy}
18+
container_name: studio-frontend
19+
ports:
20+
- "3000:3000"
21+
- "8088:8088"
22+
volumes:
23+
- ../../studio-frontend:/usr/src
24+
- ./.env:/usr/src/packages/server/.env:ro
25+
- ./.env:/usr/src/packages/ui/.env:ro
26+
- ../../sample-workflows:/usr/src/sample-workflows:ro
27+
- node_modules:/usr/src/node_modules
28+
- pnpm-store:/usr/src/.pnpm-store
29+
- /usr/src/packages/ui/build
30+
- finetuning-output:/tmp/finetuning/output
31+
command: ["sh", "/usr/src/docker-entrypoint.dev.sh"]
32+
environment:
33+
- http_proxy=${http_proxy}
34+
- https_proxy=${https_proxy}
35+
- no_proxy=${no_proxy},studio-backend,studio-eval,mysql,ollama,finetuning-server,local-nginx,.svc.cluster.local,.cluster.local
36+
- STUDIO_SERVER_URL=${STUDIO_SERVER_URL:-http://studio-backend:5000}
37+
- PREPARE_DOC_REDIS_PREP_DNS=${PREPARE_DOC_REDIS_PREP_DNS:-local-nginx}
38+
- CHOKIDAR_USEPOLLING=1
39+
- FINETUNING_SERVICE_DNS=${FINETUNING_SERVICE_DNS:-finetuning-server:8015}
40+
- FINETUNING_RAY_DNS=${FINETUNING_RAY_DNS:-finetuning-server:8265}
41+
- DATABASE_TYPE=mysql
42+
- DATABASE_HOST=${MYSQL_HOST:-mysql}
43+
- DATABASE_PORT=${MYSQL_PORT:-3306}
44+
- DATABASE_NAME=${MYSQL_FLOWISE_DB:-flowise}
45+
- DATABASE_USER=${MYSQL_USER:-root}
46+
- DATABASE_PASSWORD=${MYSQL_PASSWORD:-root}
47+
ulimits:
48+
nofile:
49+
soft: 65536
50+
hard: 65536
51+
stdin_open: true
52+
tty: true
53+
networks:
54+
- studio-local
55+
depends_on:
56+
- studio-backend
57+
restart: unless-stopped
58+
59+
studio-backend:
60+
build:
61+
context: ../../studio-backend
62+
args:
63+
http_proxy: ${http_proxy}
64+
https_proxy: ${https_proxy}
65+
no_proxy: ${no_proxy}
66+
container_name: studio-backend
67+
ports:
68+
- "5001:5000"
69+
volumes:
70+
- ../../studio-backend/app:/usr/src/app
71+
- ${HOME}/.kube:/root/.kube:ro
72+
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "5000", "--reload"]
73+
environment:
74+
- STUDIO_EVAL_DNS=${STUDIO_EVAL_DNS:-studio-eval:8000}
75+
- GRAFANA_DNS=${GRAFANA_DNS:-grafana:3000}
76+
- DISABLE_GRAFANA_DASHBOARD_SYNC=${DISABLE_GRAFANA_DASHBOARD_SYNC:-true}
77+
- CLICKHOUSE_DNS=${CLICKHOUSE_DNS:-clickhouse:9000}
78+
- APP_FRONTEND_IMAGE=${APP_FRONTEND_IMAGE:-opea/app-frontend:latest}
79+
- APP_BACKEND_IMAGE=${APP_BACKEND_IMAGE:-opea/app-backend:latest}
80+
- SBX_HTTP_PROXY=${http_proxy}
81+
- SBX_NO_PROXY=${no_proxy},studio-eval,mysql,ollama,studio-frontend,finetuning-server,grafana,clickhouse,.svc.cluster.local,.cluster.local
82+
- http_proxy=${http_proxy}
83+
- https_proxy=${https_proxy}
84+
- no_proxy=${no_proxy},studio-eval,mysql,ollama,studio-frontend,finetuning-server,grafana,clickhouse,.svc.cluster.local,.cluster.local
85+
networks:
86+
- studio-local
87+
depends_on:
88+
mysql:
89+
condition: service_healthy
90+
restart: unless-stopped
91+
92+
studio-eval:
93+
build:
94+
context: ../../studio-eval
95+
args:
96+
http_proxy: ${http_proxy}
97+
https_proxy: ${https_proxy}
98+
no_proxy: ${no_proxy}
99+
container_name: studio-eval
100+
ports:
101+
- "8000:8000"
102+
volumes:
103+
- ../../studio-eval/app:/app/app
104+
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
105+
environment:
106+
- OLLAMA_DNS=${OLLAMA_DNS:-ollama:11434}
107+
- MYSQL_HOST=${MYSQL_HOST:-mysql}
108+
- MYSQL_USER=${MYSQL_USER:-root}
109+
- MYSQL_PASSWORD=${MYSQL_PASSWORD:-password}
110+
- MYSQL_DB=${MYSQL_EVAL_DB:-eval}
111+
- APP_BACKEND_URL_TEMPLATE=${APP_BACKEND_URL_TEMPLATE:-http://local-nginx/v1/app-backend?ns={sandbox_id}}
112+
- http_proxy=${http_proxy}
113+
- https_proxy=${https_proxy}
114+
- no_proxy=${no_proxy},host.docker.internal,localhost,127.0.0.1,ollama,mysql,studio-backend,studio-frontend,finetuning-server,.svc.cluster.local,.cluster.local
115+
extra_hosts:
116+
- "host.docker.internal:host-gateway"
117+
networks:
118+
- studio-local
119+
depends_on:
120+
mysql:
121+
condition: service_healthy
122+
ollama:
123+
condition: service_started
124+
restart: unless-stopped
125+
126+
ollama:
127+
image: ollama/ollama:latest
128+
container_name: ollama
129+
ports:
130+
- "11434:11434"
131+
volumes:
132+
- ollama-models:/root/.ollama
133+
environment:
134+
- http_proxy=${http_proxy}
135+
- https_proxy=${https_proxy}
136+
- no_proxy=${no_proxy},studio-eval,studio-backend,studio-frontend,mysql,finetuning-server
137+
- HTTP_PROXY=${http_proxy}
138+
- HTTPS_PROXY=${https_proxy}
139+
- NO_PROXY=${no_proxy},studio-eval,studio-backend,studio-frontend,mysql,finetuning-server
140+
- OLLAMA_INSECURE=true
141+
networks:
142+
- studio-local
143+
# Pull models after startup (OLLAMA_HOST must be overridden for docker exec to work):
144+
# docker exec -e OLLAMA_HOST=http://127.0.0.1:11434 ollama ollama pull nomic-embed-text
145+
# docker exec -e OLLAMA_HOST=http://127.0.0.1:11434 ollama ollama pull qwen2.5:14b
146+
restart: unless-stopped
147+
148+
mysql:
149+
image: mysql:8.0
150+
container_name: mysql
151+
ports:
152+
- "3306:3306"
153+
environment:
154+
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-password}
155+
- MYSQL_DATABASE=${MYSQL_FLOWISE_DB:-flowise}
156+
volumes:
157+
- mysql-data:/var/lib/mysql
158+
configs:
159+
- source: mysql-init-sql
160+
target: /docker-entrypoint-initdb.d/01-create-eval-db.sql
161+
networks:
162+
- studio-local
163+
healthcheck:
164+
test: ["CMD", "mysql", "-uroot", "-ppassword", "-e", "SELECT 1"]
165+
interval: 10s
166+
timeout: 5s
167+
retries: 10
168+
start_period: 60s
169+
restart: unless-stopped
170+
171+
# Local equivalent of studio-nginx in studio-manifest.yaml.
172+
# Routes /?ns=<sandbox-namespace> to app-frontend in the deployed K8s sandbox,
173+
# and everything else to studio-frontend.
174+
# Access the studio via http://localhost:30010 (not localhost:8088) so that
175+
# the ?ns= routing works correctly when opening sandbox app-frontends.
176+
local-nginx:
177+
image: nginx:1.27.1
178+
container_name: local-nginx
179+
ports:
180+
- "30010:80"
181+
volumes:
182+
- ./local-nginx/nginx.conf.template:/tmp/nginx.conf.template:ro
183+
# Mirror the studio-manifest init-container approach: envsubst only *_DNS and
184+
# K8S_DNS_RESOLVER so that nginx's own $namespace, $host, etc. are preserved.
185+
command:
186+
- /bin/sh
187+
- -c
188+
- >-
189+
envsubst '$$STUDIO_FRONTEND_DNS $$APP_FRONTEND_DNS $$APP_BACKEND_DNS
190+
$$GRAFANA_DNS $$APP_CHATHISTORY_DNS $$PREPARE_DOC_REDIS_PREP_DNS
191+
$$STUDIO_BACKEND_DNS $$K8S_DNS_RESOLVER'
192+
< /tmp/nginx.conf.template > /etc/nginx/conf.d/default.conf &&
193+
nginx -g 'daemon off;'
194+
environment:
195+
# Local docker service names for studio-layer services
196+
- STUDIO_FRONTEND_DNS=studio-frontend:8088
197+
- STUDIO_BACKEND_DNS=studio-backend:5000
198+
- GRAFANA_DNS=${GRAFANA_DNS:-grafana:3000}
199+
# K8s cluster DNS names — $namespace is left as a literal nginx variable
200+
# ($$namespace in compose becomes $namespace in the container, which
201+
# envsubst leaves untouched so nginx resolves it per-request)
202+
- APP_FRONTEND_DNS=app-frontend.$$namespace.svc.cluster.local:5275
203+
- APP_BACKEND_DNS=app-backend.$$namespace.svc.cluster.local:8899
204+
- APP_CHATHISTORY_DNS=chathistory-mongo.$$namespace.svc.cluster.local:6012
205+
- PREPARE_DOC_REDIS_PREP_DNS=opea-prepare-doc-redis-prep-0.$$namespace.svc.cluster.local:6007
206+
# CoreDNS ClusterIP of your K8s cluster — required for nginx to resolve
207+
# *.svc.cluster.local names at request time.
208+
# Common values: 10.96.0.10 (kubeadm), 10.43.0.10 (k3s)
209+
- K8S_DNS_RESOLVER=${K8S_DNS_RESOLVER:?K8S_DNS_RESOLVER must be set to the CoreDNS ClusterIP (e.g. 10.96.0.10)}
210+
networks:
211+
- studio-local
212+
depends_on:
213+
- studio-frontend
214+
restart: unless-stopped
215+
216+
finetuning-server:
217+
image: opea/finetuning:latest
218+
container_name: finetuning-server
219+
user: "0:0"
220+
ipc: host
221+
ports:
222+
- "8015:8015"
223+
- "8265:8265"
224+
environment:
225+
- http_proxy=${http_proxy}
226+
- https_proxy=${https_proxy}
227+
- NO_PROXY=${no_proxy}
228+
volumes:
229+
- finetuning-output:/home/user/comps/finetuning/src/output
230+
networks:
231+
- studio-local
232+
restart: unless-stopped
233+
234+
networks:
235+
studio-local:
236+
driver: bridge
237+
238+
configs:
239+
mysql-init-sql:
240+
content: |
241+
CREATE DATABASE IF NOT EXISTS ${MYSQL_EVAL_DB:-eval};
242+
243+
volumes:
244+
ollama-models:
245+
mysql-data:
246+
node_modules:
247+
pnpm-store:
248+
finetuning-output:

0 commit comments

Comments
 (0)