Skip to content

Commit 7b5f6cb

Browse files
committed
✨(summary) add multi-tenant support and v2 tasks / API
Add multitenancy support to Summary sub-app. The V1 routes / tasks behave like before, with the default tenant being "meet". V2 routes / tasks support being called frm any tenant, and don't have meet related logic. V2 tasks are created in separate queues to avoid mix / match,i
1 parent c0ddcff commit 7b5f6cb

23 files changed

Lines changed: 1296 additions & 89 deletions

.github/workflows/meet.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,8 @@ jobs:
306306
working-directory: src/summary
307307

308308
env:
309-
APP_API_TOKEN: "test-api-token"
309+
V1_TENANT_ID: 'test-tenant'
310+
AUTHORIZED_TENANTS: '[{"id": "test-tenant", "api_key": "test-api-token", "webhook_url": "https://example.com/webhook", "webhook_api_key": "test-webhook-api-key"}]'
310311
AWS_STORAGE_BUCKET_NAME: "http://meet-media-storage"
311312
AWS_S3_ENDPOINT_URL: "minio:9000"
312313
AWS_S3_ACCESS_KEY_ID: "meet"
@@ -318,8 +319,6 @@ jobs:
318319
LLM_BASE_URL: "https://configure-your-url.com"
319320
LLM_API_KEY: "test-llm-secret"
320321
LLM_MODEL: "test-llm-model"
321-
WEBHOOK_API_TOKEN: "test-webhook-secret"
322-
WEBHOOK_URL: "https://configure-your-url.com"
323322

324323
steps:
325324
- name: Checkout repository

bin/Tiltfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ k8s_resource('minio-bucket', resource_deps=['minio'])
107107
k8s_resource('meet-backend', resource_deps=['postgresql', 'minio', 'redis', 'livekit-livekit-server'])
108108
k8s_resource('meet-celery-backend', resource_deps=['redis'])
109109
k8s_resource('meet-celery-summarize', resource_deps=['redis'])
110+
k8s_resource('meet-celery-summary-backend', resource_deps=['redis'])
110111
k8s_resource('meet-celery-transcribe', resource_deps=['redis'])
111112
k8s_resource('meet-backend-migrate', resource_deps=['meet-backend'])
112113
k8s_resource('livekit-livekit-server', resource_deps=['redis'])

src/helm/env.d/dev-dinum/values.meet.yaml.gotmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ _summaryEnvVars: &summaryEnvVars
2424
secretKeyRef:
2525
name: secret-dev
2626
key: LLM_API_KEY
27-
LLM_MODEL: meta-llama/Llama-3.1-8B-Instruct
27+
LLM_MODEL: Qwen/Qwen3-Coder-30B-A3B-Instruct
2828
WEBHOOK_API_TOKEN: password
2929
WEBHOOK_URL: https://www.mock-impress.com/webhook/
3030
CELERY_BROKER_URL: redis://default:pass@redis-master:6379/1

src/helm/env.d/dev-keycloak/values.meet.yaml.gotmpl

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ _summaryEnvVars: &summaryEnvVars
66
AWS_S3_ACCESS_KEY_ID: meet
77
AWS_S3_SECRET_ACCESS_KEY: password
88
AWS_S3_SECURE_ACCESS: False
9+
AUTHORIZED_TENANTS: '[{"id": "dictaphone", "api_key": "dictaphone_token", "webhook_url": "http://dictaphone-backend.dictaphone.svc.cluster.local/api/v1.0/files/ai-webhook/", "webhook_api_key": "token_summary"}]'
910
WHISPERX_API_KEY:
1011
secretKeyRef:
1112
name: secret-dev
@@ -24,13 +25,14 @@ _summaryEnvVars: &summaryEnvVars
2425
secretKeyRef:
2526
name: secret-dev
2627
key: LLM_API_KEY
27-
LLM_MODEL: meta-llama/Llama-3.1-8B-Instruct
28+
LLM_MODEL: Qwen/Qwen3-Coder-30B-A3B-Instruct
2829
WEBHOOK_API_TOKEN: password
2930
WEBHOOK_URL: https://www.mock-impress.com/webhook/
3031
CELERY_BROKER_URL: redis://default:pass@redis-master:6379/1
3132
CELERY_RESULT_BACKEND: redis://default:pass@redis-master:6379/1
3233
TASK_TRACKER_REDIS_URL: redis://default:pass@redis-master:6379/1
3334

35+
3436
_summaryImage: &summaryImage
3537
repository: localhost:5001/meet-summary
3638
pullPolicy: Always
@@ -215,7 +217,7 @@ celeryTranscribe:
215217
- "--pool=solo"
216218
- "--loglevel=info"
217219
- "-Q"
218-
- "transcribe-queue"
220+
- "transcribe-queue,transcribe-queue-v2"
219221

220222
celerySummarize:
221223
replicas: 1
@@ -230,7 +232,27 @@ celerySummarize:
230232
- "--pool=solo"
231233
- "--loglevel=info"
232234
- "-Q"
233-
- "summarize-queue"
235+
- "summarize-queue,summarize-queue-v2"
236+
237+
celerySummaryBackend:
238+
replicas: 1
239+
envVars:
240+
<<: *summaryEnvVars
241+
242+
image:
243+
repository: localhost:5001/meet-summary
244+
pullPolicy: Always
245+
tag: "latest"
246+
247+
command:
248+
- "celery"
249+
- "-A"
250+
- "summary.core.celery_worker"
251+
- "worker"
252+
- "--pool=solo"
253+
- "--loglevel=info"
254+
- "-Q"
255+
- "call-webhook-queue-v2"
234256

235257
agents:
236258
replicas: 1

src/helm/meet/templates/_helpers.tpl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,16 @@ Requires top level scope
202202
{{ include "meet.fullname" . }}-celery-summarize
203203
{{- end }}
204204

205+
{{/*
206+
Full name for the Celery Summary Backend
207+
208+
Requires top level scope
209+
*/}}
210+
{{- define "meet.celerySummaryBackend.fullname" -}}
211+
{{ include "meet.fullname" . }}-celery-summary-backend
212+
{{- end }}
213+
214+
205215
{{/*
206216
Full name for the agents
207217
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
{{- $envVars := include "meet.common.env" (list . .Values.celerySummaryBackend) -}}
2+
{{- $fullName := include "meet.celerySummaryBackend.fullname" . -}}
3+
{{- $component := "celery-summary-backend" -}}
4+
apiVersion: apps/v1
5+
kind: Deployment
6+
metadata:
7+
name: {{ $fullName }}
8+
annotations:
9+
{{- with .Values.celerySummaryBackend.dpAnnotations }}
10+
{{- toYaml . | nindent 4 }}
11+
{{- end }}
12+
namespace: {{ .Release.Namespace | quote }}
13+
labels:
14+
{{- include "meet.common.labels" (list . $component) | nindent 4 }}
15+
spec:
16+
replicas: {{ .Values.celerySummaryBackend.replicas }}
17+
selector:
18+
matchLabels:
19+
{{- include "meet.common.selectorLabels" (list . $component) | nindent 6 }}
20+
template:
21+
metadata:
22+
annotations:
23+
{{- with .Values.celerySummaryBackend.podAnnotations }}
24+
{{- toYaml . | nindent 8 }}
25+
{{- end }}
26+
labels:
27+
{{- include "meet.common.selectorLabels" (list . $component) | nindent 8 }}
28+
spec:
29+
{{- if $.Values.image.credentials }}
30+
imagePullSecrets:
31+
- name: {{ include "meet.secret.dockerconfigjson.name" (dict "fullname" (include "meet.fullname" .) "imageCredentials" $.Values.image.credentials) }}
32+
{{- end }}
33+
shareProcessNamespace: {{ .Values.celerySummaryBackend.shareProcessNamespace }}
34+
containers:
35+
{{- with .Values.celerySummaryBackend.sidecars }}
36+
{{- toYaml . | nindent 8 }}
37+
{{- end }}
38+
- name: {{ .Chart.Name }}
39+
image: "{{ (.Values.celerySummaryBackend.image | default dict).repository | default .Values.image.repository }}:{{ (.Values.celerySummaryBackend.image | default dict).tag | default .Values.image.tag }}"
40+
imagePullPolicy: {{ (.Values.celerySummaryBackend.image | default dict).pullPolicy | default .Values.image.pullPolicy }}
41+
{{- with .Values.celerySummaryBackend.command }}
42+
command:
43+
{{- toYaml . | nindent 12 }}
44+
{{- end }}
45+
{{- with .Values.celerySummaryBackend.args }}
46+
args:
47+
{{- toYaml . | nindent 12 }}
48+
{{- end }}
49+
env:
50+
{{- if $envVars }}
51+
{{- $envVars | indent 12 }}
52+
{{- end }}
53+
{{- with .Values.celerySummaryBackend.securityContext }}
54+
securityContext:
55+
{{- toYaml . | nindent 12 }}
56+
{{- end }}
57+
ports:
58+
- name: http
59+
containerPort: {{ .Values.celerySummaryBackend.service.targetPort }}
60+
protocol: TCP
61+
{{- if .Values.celerySummaryBackend.probes.liveness }}
62+
livenessProbe:
63+
{{- include "meet.probes.abstract" (merge .Values.celerySummaryBackend.probes.liveness (dict "targetPort" .Values.celerySummaryBackend.service.targetPort )) | nindent 12 }}
64+
{{- end }}
65+
{{- if .Values.celerySummaryBackend.probes.readiness }}
66+
readinessProbe:
67+
{{- include "meet.probes.abstract" (merge .Values.celerySummaryBackend.probes.readiness (dict "targetPort" .Values.celerySummaryBackend.service.targetPort )) | nindent 12 }}
68+
{{- end }}
69+
{{- if .Values.celerySummaryBackend.probes.startup }}
70+
startupProbe:
71+
{{- include "meet.probes.abstract" (merge .Values.celerySummaryBackend.probes.startup (dict "targetPort" .Values.celerySummaryBackend.service.targetPort )) | nindent 12 }}
72+
{{- end }}
73+
{{- with .Values.celerySummaryBackend.resources }}
74+
resources:
75+
{{- toYaml . | nindent 12 }}
76+
{{- end }}
77+
volumeMounts:
78+
{{- range $index, $value := .Values.mountFiles }}
79+
- name: "files-{{ $index }}"
80+
mountPath: {{ $value.path }}
81+
subPath: content
82+
{{- end }}
83+
{{- range $name, $volume := .Values.celerySummaryBackend.persistence }}
84+
- name: "{{ $name }}"
85+
mountPath: "{{ $volume.mountPath }}"
86+
{{- end }}
87+
{{- range .Values.celerySummaryBackend.extraVolumeMounts }}
88+
- name: {{ .name }}
89+
mountPath: {{ .mountPath }}
90+
subPath: {{ .subPath | default "" }}
91+
readOnly: {{ .readOnly }}
92+
{{- end }}
93+
{{- with .Values.celerySummaryBackend.nodeSelector }}
94+
nodeSelector:
95+
{{- toYaml . | nindent 8 }}
96+
{{- end }}
97+
{{- with .Values.celerySummaryBackend.affinity }}
98+
affinity:
99+
{{- toYaml . | nindent 8 }}
100+
{{- end }}
101+
{{- with .Values.celerySummaryBackend.tolerations }}
102+
tolerations:
103+
{{- toYaml . | nindent 8 }}
104+
{{- end }}
105+
volumes:
106+
{{- range $index, $value := .Values.mountFiles }}
107+
- name: "files-{{ $index }}"
108+
configMap:
109+
name: "{{ include "meet.fullname" $ }}-files-{{ $index }}"
110+
{{- end }}
111+
{{- range $name, $volume := .Values.celerySummaryBackend.persistence }}
112+
- name: "{{ $name }}"
113+
{{- if eq $volume.type "emptyDir" }}
114+
emptyDir: {}
115+
{{- else }}
116+
persistentVolumeClaim:
117+
claimName: "{{ $fullName }}-{{ $name }}"
118+
{{- end }}
119+
{{- end }}
120+
{{- range .Values.celerySummaryBackend.extraVolumes }}
121+
- name: {{ .name }}
122+
{{- if .existingClaim }}
123+
persistentVolumeClaim:
124+
claimName: {{ .existingClaim }}
125+
{{- else if .hostPath }}
126+
hostPath:
127+
{{ toYaml .hostPath | nindent 12 }}
128+
{{- else if .csi }}
129+
csi:
130+
{{- toYaml .csi | nindent 12 }}
131+
{{- else if .configMap }}
132+
configMap:
133+
{{- toYaml .configMap | nindent 12 }}
134+
{{- else if .emptyDir }}
135+
emptyDir:
136+
{{- toYaml .emptyDir | nindent 12 }}
137+
{{- else }}
138+
emptyDir: {}
139+
{{- end }}
140+
{{- end }}
141+
---
142+
{{ if .Values.celerySummaryBackend.pdb.enabled }}
143+
apiVersion: policy/v1
144+
kind: PodDisruptionBudget
145+
metadata:
146+
name: {{ $fullName }}
147+
namespace: {{ .Release.Namespace | quote }}
148+
spec:
149+
maxUnavailable: 1
150+
selector:
151+
matchLabels:
152+
{{- include "meet.common.selectorLabels" (list . $component) | nindent 6 }}
153+
{{ end }}

0 commit comments

Comments
 (0)