Switch call recorder post-call transcription to Gladia with code switching (#23532)
## What
Switches the Call Recorder app's post-meeting transcription provider
from Recall.ai's built-in transcription (`recallai_async`) to Gladia
(`gladia_v2_async`), with code switching enabled so mixed-language calls
transcribe correctly.
## Changes
- `create_transcript` requests now send `provider: { gladia_v2_async: {
language_config: { code_switching: true } } }` instead of
`recallai_async` with `language_code: 'auto'`. Gladia auto-detects the
spoken language by default, and code switching re-detects it per
utterance for calls that mix languages.
- The provider payload is extracted into a
`RECALL_ASYNC_TRANSCRIPT_PROVIDER` constant so a future
provider-selection variable can slot in without touching the request
code.
- SETUP.md documents the new operational requirement: a Gladia API key
must be added in the Recall.ai dashboard (Transcription > Gladia) for
each region in use, otherwise transcripts fail.
<img width="2810" height="1656" alt="CleanShot 2026-07-30 at 15 00
27@2x"
src="https://github.com/user-attachments/assets/c702ab09-eea8-4c54-8e5a-4941951391c9"
/>
tested on twenty dev recall workspace
<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/23532?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
This commit is contained in:
@@ -16,6 +16,7 @@ and to receive recordings back. Two things must be configured:
|
||||
update, and cancel bots.
|
||||
2. A **webhook** from Recall.ai back to your deployment, so the app learns when
|
||||
a recording is ready and can ingest it.
|
||||
3. A **Gladia API key** in the Recall.ai dashboard (**Transcription → Gladia**, per region) — transcripts fail without it.
|
||||
|
||||
## Server variables
|
||||
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
export const RECALL_ASYNC_TRANSCRIPT_PROVIDER = {
|
||||
gladia_v2_async: {
|
||||
language_config: { code_switching: true },
|
||||
},
|
||||
} as const;
|
||||
+3
-1
@@ -568,7 +568,9 @@ describe('recall bot api', () => {
|
||||
expect.objectContaining({ method: 'POST' }),
|
||||
);
|
||||
expect(JSON.parse(fetchMock.mock.calls[0][1].body)).toEqual({
|
||||
provider: { recallai_async: { language_code: 'auto' } },
|
||||
provider: {
|
||||
gladia_v2_async: { language_config: { code_switching: true } },
|
||||
},
|
||||
diarization: { use_separate_streams_when_available: true },
|
||||
});
|
||||
});
|
||||
|
||||
+2
-1
@@ -1,5 +1,6 @@
|
||||
import { isString } from '@sniptt/guards';
|
||||
|
||||
import { RECALL_ASYNC_TRANSCRIPT_PROVIDER } from 'src/logic-functions/constants/recall-async-transcript-provider';
|
||||
import { type RecallBotOperationFailure } from 'src/logic-functions/types/recall-bot-operation-result.type';
|
||||
import { getRecallApiConfig } from 'src/logic-functions/recall-api/get-recall-api-config.util';
|
||||
import { recallBotApiRequest } from 'src/logic-functions/recall-api/recall-bot-api-request.util';
|
||||
@@ -24,7 +25,7 @@ export const createAsyncRecallTranscript = async ({
|
||||
path: `/recording/${externalRecordingId}/create_transcript/`,
|
||||
method: 'POST',
|
||||
body: {
|
||||
provider: { recallai_async: { language_code: 'auto' } },
|
||||
provider: RECALL_ASYNC_TRANSCRIPT_PROVIDER,
|
||||
diarization: { use_separate_streams_when_available: true },
|
||||
},
|
||||
maxAttempts: 1,
|
||||
|
||||
Reference in New Issue
Block a user