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:
nitin
2026-07-30 16:12:14 +05:30
committed by GitHub
parent 079e9b8e56
commit c862a2a43d
4 changed files with 11 additions and 2 deletions
@@ -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
@@ -0,0 +1,5 @@
export const RECALL_ASYNC_TRANSCRIPT_PROVIDER = {
gladia_v2_async: {
language_config: { code_switching: true },
},
} as const;
@@ -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 },
});
});
@@ -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,