Skip to content

Commit 008b2f9

Browse files
authored
Merge branch 'main' into abizar/pipeline-v2-code
2 parents 29e4642 + b8c0bd6 commit 008b2f9

File tree

27 files changed

+355
-195
lines changed

27 files changed

+355
-195
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,5 @@ checkpoints/
238238
*.schema.sql
239239

240240
*.zip
241+
242+
*.bak

Makefile

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@ SHELL := /bin/bash
22

33
export PATH := $(PATH):/opt/homebrew/opt/postgresql@16/bin
44
export SUPABASE_WORKDIR := migrations/db
5+
export CALL_DB_WORKDIR := migrations/db/call_db
6+
export PAYMENT_DB_WORKDIR := migrations/db/payment_db
57

6-
staging_SUPABASE_PROJECT_REF := uthrzeaxepdbwwewyaep
7-
production_SUPABASE_PROJECT_REF := jtuyprjjgxbgmtjiykoa
8+
STAGING_SUPABASE_PROJECT_REF := uthrzeaxepdbwwewyaep
9+
PRODUCTION_SUPABASE_PROJECT_REF := jtuyprjjgxbgmtjiykoa
10+
11+
STAGING_NEON_PROJECT_REF := ep-shrill-hill-a6dmyk5l
12+
PRODUCTION_NEON_PROJECT_REF := ep-summer-snow-a6v87ljk
13+
14+
STAGING_NEON_PROJECT_REF := ep-shrill-hill-a6dmyk5l.us-west-2.aws.neon.tech
15+
PRODUCTION_SUPABASE_PROJECT_REF := ep-summer-snow-a6v87ljk.us-west-2.aws.neon.tech
816

917
.DEFAULT_GOAL := help
1018

@@ -18,7 +26,11 @@ mac-setup: ## Setup Mac with dev tools. Idempotent, so can be run if new softwar
1826
supabase/tap/supabase \
1927
go \
2028
jq \
21-
yq
29+
yq \
30+
openjdk@17 \
31+
liquibase
32+
sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk \
33+
/Library/Java/JavaVirtualMachines/openjdk-17.jdk
2234

2335
TOOLS=$$(cat .tool-versions| cut -f 1 -d ' ') && \
2436
for tool in $$TOOLS; do \
@@ -81,6 +93,36 @@ supabase-link-%: ## Link supabase to a project ("staging", "production")
8193
secrets-show-%: ## Show secrets of dev/staging/production.
8294
npx dotenvx decrypt -f .env.$(*F) --stdout
8395

96+
.PHONY: neon-migrate-call-%
97+
neon-migrate-call-%: ## Perform migrations for the call_db in (staging/production)
98+
export CALL_DB_HOST=$$(npx dotenvx get CALL_DB_HOST -f .env.$(*F)); \
99+
export CALL_DB_USER=$$(npx dotenvx get CALL_DB_USER -f .env.$(*F)); \
100+
export CALL_DB_PASS=$$(npx dotenvx get CALL_DB_PASS -f .env.$(*F)); \
101+
export CALL_DB_PORT=$$(npx dotenvx get CALL_DB_PORT -f .env.$(*F)); \
102+
export CALL_DB_NAME=$$(npx dotenvx get CALL_DB_NAME -f .env.$(*F)); \
103+
export DB_OPTIONS="user=$$CALL_DB_USER&password=$$CALL_DB_PASS&sslmode=require"; \
104+
pushd migrations/db/call_db && \
105+
echo "Updating liquibase.properties..." && \
106+
printf "url=jdbc:postgresql://$$CALL_DB_HOST/$$CALL_DB_NAME?$$DB_OPTIONS" >> liquibase.properties && \
107+
liquibase update && \
108+
sed -i.bak '/^url=/d' liquibase.properties && \
109+
popd
110+
111+
.PHONY: neon-migrate-payment-%
112+
neon-migrate-payment-%: ## Perform migrations for the payment_db in (staging/production)
113+
export PAYMENT_DB_HOST=$$(npx dotenvx get PAYMENT_DB_HOST -f .env.$(*F)); \
114+
export PAYMENT_DB_USER=$$(npx dotenvx get PAYMENT_DB_USER -f .env.$(*F)); \
115+
export PAYMENT_DB_PASS=$$(npx dotenvx get PAYMENT_DB_PASS -f .env.$(*F)); \
116+
export PAYMENT_DB_PORT=$$(npx dotenvx get PAYMENT_DB_PORT -f .env.$(*F)); \
117+
export PAYMENT_DB_NAME=$$(npx dotenvx get PAYMENT_DB_NAME -f .env.$(*F)); \
118+
export DB_OPTIONS="user=$$PAYMENT_DB_USER&password=$$PAYMENT_DB_PASS&sslmode=require"; \
119+
pushd migrations/db/payment_db && \
120+
echo "Updating liquibase.properties..." && \
121+
printf "url=jdbc:postgresql://$$PAYMENT_DB_HOST/$$PAYMENT_DB_NAME?$$DB_OPTIONS" >> liquibase.properties && \
122+
liquibase update && \
123+
sed -i.bak '/^url=/d' liquibase.properties && \
124+
popd
125+
84126

85127
.PHONY: kube-sync
86128
kube-sync: ## Update all local kubeconfigs with all accessible clusters.

apps/adminWorker/src/main.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import {
6464
orgStripeSubscriptionCancel,
6565
orgToSubscriptionMigrate,
6666
} from 'functions/orgFunctions';
67+
import { deleteOldCallLogs } from 'dbFunctions/logsDbFunctions';
6768

6869
const worker = new Worker<AdminQueueJobData, any, keyof typeof ADMIN_QUEUE_JOB>(
6970
'admin',
@@ -293,6 +294,9 @@ const worker = new Worker<AdminQueueJobData, any, keyof typeof ADMIN_QUEUE_JOB>(
293294
case 'statusChecksInit': {
294295
return adminCacheKeySet(CALL_USAGE_CHECKED_AT_KEY, String(Date.now()));
295296
}
297+
case 'cleanUpCallLogs': {
298+
return deleteOldCallLogs();
299+
}
296300
default: {
297301
throw new Error(`Unknown Job: ${job.name}`);
298302
}

apps/dashboard/src/AuthSwitcher/Dashboard/Pages/VoiceLibrary/VoiceLibrarySearch.tsx

Lines changed: 99 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { VoiceLibraryAccent } from '@/api';
22
import { DEFAULT_QUERY_OPTIONS } from '@/api/config';
33
import { client } from '@/client';
4-
import { Button } from '@/components/ui/button';
54
import { Input } from '@/components/ui/input';
65
import {
76
Select,
@@ -25,6 +24,7 @@ interface AccentSelectProps {
2524
accents: { accent: string }[] | null;
2625
filterParams: FilterParams;
2726
setFilterParams: (filterParams: FilterParams) => void;
27+
provider: string;
2828
}
2929

3030
export interface FilterParams {
@@ -40,7 +40,7 @@ export const FILTER_PARAMS_DEFAULT = {
4040
page: 1,
4141
};
4242
interface VoiceLibrarySearchProps {
43-
accents: string[];
43+
voices: any[];
4444
handleProviderChange: (provider: VOICE_PROVIDERS) => void;
4545
provider: VOICE_PROVIDERS;
4646
filterParams: FilterParams;
@@ -53,8 +53,10 @@ interface SearchInputProps {
5353
}
5454

5555
interface GenderSelectProps {
56+
voices: any[];
5657
filterParams: FilterParams;
5758
setFilterParams: (filterParams: FilterParams) => void;
59+
provider: string;
5860
}
5961

6062
const useSelectFilter = (
@@ -74,8 +76,7 @@ const useSelectFilter = (
7476
const timeout = setTimeout(() => {
7577
if (value !== filterParams?.[property]) {
7678
if (value === '' || emptyCondition?.includes(value)) {
77-
const newFilterParams = { ...filterParams };
78-
delete newFilterParams[property];
79+
const { [property]: removed, ...newFilterParams } = filterParams;
7980
setFilterParams(newFilterParams);
8081
} else {
8182
setFilterParams({ ...filterParams, [property]: value });
@@ -149,32 +150,70 @@ const ProviderSelect: React.FC<ProviderSelectProps> = ({
149150
};
150151

151152
const GenderSelect: React.FC<GenderSelectProps> = ({
153+
voices,
152154
filterParams,
153155
setFilterParams,
156+
provider,
154157
}) => {
155158
const [value, setValue] = useSelectFilter(
156159
filterParams,
157160
setFilterParams,
158161
'gender',
159-
0,
160-
VOICE_GENDERS.All,
161-
[VOICE_GENDERS.All],
162+
1,
163+
undefined,
162164
);
163165

166+
const handleClear = (e: React.MouseEvent) => {
167+
e.stopPropagation();
168+
setValue(undefined);
169+
const { accent, ...rest } = filterParams;
170+
setFilterParams(rest);
171+
};
172+
173+
const hasGender = voices?.some((voice) => voice.gender);
174+
let accentList = [
175+
VOICE_GENDERS.Male,
176+
VOICE_GENDERS.Female,
177+
...(voices
178+
?.filter((voices) => voices.gender)
179+
?.map((voices) => voices.gender) ?? []),
180+
];
181+
if (provider === VOICE_PROVIDERS.ELEVEN_LABS) {
182+
accentList.push(VOICE_GENDERS.Neutral);
183+
}
184+
accentList = Array.from(new Set(accentList));
164185
return (
165-
<div className="w-[20%]">
166-
<Select value={value} onValueChange={(value) => setValue(value)}>
186+
<div className="w-[20%] relative">
187+
<Select
188+
key={`gender-select-${provider}-${value}`}
189+
value={value}
190+
onValueChange={(newValue) => setValue(newValue)}
191+
disabled={!hasGender}
192+
>
167193
<SelectTrigger>
168194
<SelectValue placeholder="Select Gender" />
169195
</SelectTrigger>
170196
<SelectContent>
171-
{Object.values(VOICE_GENDERS).map((gender) => (
197+
{accentList.map((gender) => (
172198
<SelectItem key={gender} value={gender}>
173199
{gender}
174200
</SelectItem>
175201
))}
176202
</SelectContent>
177203
</Select>
204+
{value && (
205+
<button
206+
type="button"
207+
className="absolute right-10 top-1/2 transform -translate-y-1/2"
208+
onClick={handleClear}
209+
>
210+
<IconXmarkCircle
211+
className="fill-gray-400 w-[14px]"
212+
width={14}
213+
height={14}
214+
/>
215+
</button>
216+
)}
178217
</div>
179218
);
180219
};
@@ -183,50 +222,79 @@ const AccentSelect: React.FC<AccentSelectProps> = ({
183222
accents,
184223
filterParams,
185224
setFilterParams,
225+
provider,
186226
}) => {
187227
const [value, setValue] = useSelectFilter(
188228
filterParams,
189229
setFilterParams,
190230
'accent',
191-
0,
231+
1,
192232
undefined,
193233
);
194234

235+
const handleClear = (e: React.MouseEvent) => {
236+
e.stopPropagation();
237+
setValue(undefined);
238+
const { accent, ...rest } = filterParams;
239+
setFilterParams(rest);
240+
};
241+
242+
const accentList = Array.from(
243+
new Set(
244+
accents?.filter((accent) => accent.accent).map((accent) => accent.accent),
245+
),
246+
);
247+
195248
return (
196-
<div className="w-[20%]">
197-
<Select value={value} onValueChange={(value) => setValue(value)}>
249+
<div className="w-[20%] relative">
250+
<Select
251+
key={`accent-select-${provider}-${value}`}
252+
disabled={accentList.length === 0}
253+
value={value}
254+
onValueChange={(newValue) => setValue(newValue)}
255+
>
198256
<SelectTrigger>
199257
<SelectValue placeholder="Select Accent" />
200258
</SelectTrigger>
201259
<SelectContent className="max-h-[200px]">
202-
{accents &&
203-
accents.length &&
204-
accents
205-
.filter((accent) => accent.accent !== '')
206-
.map((accent, index) => (
207-
<SelectItem key={index} value={accent.accent}>
208-
{accent.accent}
209-
</SelectItem>
210-
))}
260+
{accentList.map((accent, index) => (
261+
<SelectItem key={index} value={accent}>
262+
{accent}
263+
</SelectItem>
264+
))}
211265
</SelectContent>
212266
</Select>
267+
{value && (
268+
<button
269+
type="button"
270+
className="absolute right-10 top-1/2 transform -translate-y-1/2"
271+
onClick={handleClear}
272+
>
273+
<IconXmarkCircle
274+
className="fill-gray-400 w-[14px]"
275+
width={14}
276+
height={14}
277+
/>
278+
</button>
279+
)}
213280
</div>
214281
);
215282
};
216283

217284
const VoiceLibrarySearch: React.FC<VoiceLibrarySearchProps> = ({
285+
voices,
218286
handleProviderChange,
219287
provider,
220288
filterParams,
221289
setFilterParams,
222290
}) => {
223291
const [accents, setAccents] = useState<VoiceLibraryAccent[]>([]);
224292

225-
const { data: dataAccents } = useQuery({
293+
const { data: dataAccents, refetch } = useQuery({
226294
queryKey: ['accents', provider],
227295
queryFn: async () => {
228296
const response =
229-
await client.voiceLibrary.voiceLibraryControllerAccentsGetByProvider(
297+
await client.voiceLibrary.voiceLibraryControllerVoiceGetAccentsByProvider(
230298
provider,
231299
);
232300
if (response.data) {
@@ -240,6 +308,10 @@ const VoiceLibrarySearch: React.FC<VoiceLibrarySearchProps> = ({
240308
useEffect(() => {
241309
setAccents(dataAccents);
242310
}, [dataAccents]);
311+
useEffect(() => {
312+
refetch();
313+
}, [provider, refetch]);
314+
243315
return (
244316
provider && (
245317
<>
@@ -255,26 +327,16 @@ const VoiceLibrarySearch: React.FC<VoiceLibrarySearchProps> = ({
255327
<GenderSelect
256328
filterParams={filterParams}
257329
setFilterParams={setFilterParams}
330+
provider={provider}
331+
voices={voices}
258332
/>
259333
<AccentSelect
260334
accents={accents}
261335
filterParams={filterParams}
262336
setFilterParams={setFilterParams}
337+
provider={provider}
263338
/>
264339
</div>
265-
<div className="flex mt-24 mb-4 justify-end px-4">
266-
{Object.prototype.hasOwnProperty.call(filterParams, 'gender') ||
267-
(Object.prototype.hasOwnProperty.call(filterParams, 'accent') && (
268-
<Button
269-
size="sm"
270-
className="w-[100px] text-gray-500 text-xs"
271-
variant="ghost"
272-
onClick={() => setFilterParams(FILTER_PARAMS_DEFAULT)}
273-
>
274-
Clear Filters
275-
</Button>
276-
))}
277-
</div>
278340
</>
279341
)
280342
);

apps/dashboard/src/AuthSwitcher/Dashboard/Pages/VoiceLibrary/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ function VoiceLibraryPage() {
126126
/>
127127
</div>
128128
<VoiceLibrarySearch
129-
accents={[]}
129+
voices={voiceData || []}
130130
handleProviderChange={handleProviderChange}
131131
provider={provider}
132132
filterParams={filterParams}

apps/dashboard/src/types/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ export const MODELS = [
1414
];
1515

1616
export enum VOICE_GENDERS {
17-
All = 'all',
1817
Male = 'male',
1918
Female = 'female',
2019
Neutral = 'neutral',

libs/core/src/components/liveCallManager.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ import { isWebCallWithVideo } from 'util/callUtil/callUtil.isWebCallWithVideo';
6666
import * as CallMetrics from '../monitoring/callMetrics';
6767
import { say } from 'functions/liveCallFunctions/liveCallFunctions.say';
6868
import { bytesToGb, processRssMemoryGet } from 'util/memoryUtil';
69-
import type { OpenAICompatibleCredential } from 'types/credential.types';
7069

7170
export class LiveCallManager {
7271
private logger?: Logger;
@@ -461,20 +460,12 @@ export class LiveCallManager {
461460
cost: Cost | undefined,
462461
error: string | undefined;
463462
if (destination.transferPlan?.mode.includes('summary')) {
464-
const llmCredential = this.call.credentials?.find(
465-
(credential) =>
466-
credential.provider ===
467-
this.pipeline.ctx.activeAssistant.model.provider,
468-
);
469-
470463
({ summary, cost, error } = await summaryGet(
471464
destination.transferPlan.summaryPlan ??
472465
this.pipeline.ctx.activeAssistant.analysisPlan.summaryPlan,
473466
transcript,
474467
systemPrompt,
475468
this.logger,
476-
this.pipeline.ctx.activeAssistant.model,
477-
llmCredential as OpenAICompatibleCredential,
478469
));
479470
if (error || !summary || !cost) {
480471
warnWithClock(

0 commit comments

Comments
 (0)