Meeting recordings contain critical decisions, action items, and context. Graphlit transcribes audio/video, extracts entities (attendees, topics), and makes meetings searchable.
What You'll Learn
- Audio/video transcription
- Speaker identification
- Entity extraction (attendees, action items)
- Meeting search patterns
- Building meeting summaries
Part 1: Transcription Workflow
import { Graphlit } from 'graphlit-client';
import {
FilePreparationServiceTypes,
EntityExtractionServiceTypes,
ObservableTypes,
EnrichmentServiceTypes
} from 'graphlit-client/dist/generated/graphlit-types';
const graphlit = new Graphlit();
// Meeting transcription + entity extraction + summary
const meetingWorkflow = await graphlit.createWorkflow({
name: "Meeting Intelligence",
preparation: {
jobs: [{
connector: {
type: FilePreparationServiceTypes.ModelAudio // Transcribe
}
}]
},
extraction: {
jobs: [{
connector: {
type: EntityExtractionServiceTypes.ModelText,
extractedTypes: [
ObservableTypes.Person, // Attendees
ObservableTypes.Event, // Mentioned meetings
ObservableTypes.Product, // Products discussed
ObservableTypes.Organization
]
}
}]
},
enrichment: {
jobs: [{
connector: {
type: EnrichmentServiceTypes.ModelSummarization,
prompt: "Summarize: meeting topic, key decisions, action items, attendees."
}
}]
}
});
Part 2: Ingest Meeting Recording
// Ingest Zoom/Teams recording
const meeting = await graphlit.ingestUri(
'https://example.com/meeting-recording.mp4',
'Q4 Planning Meeting',
undefined,
undefined,
undefined,
{ id: meetingWorkflow.createWorkflow.id }
);
// Wait for transcription
let isDone = false;
while (!isDone) {
const status = await graphlit.isContentDone(meeting.ingestUri.id);
isDone = status.isContentDone.result;
await new Promise(r => setTimeout(r, 5000));
}
console.log('✓ Meeting transcribed and analyzed');
Part 3: Extract Meeting Insights
// Get meeting content
const content = await graphlit.getContent(meeting.ingestUri.id);
// Transcript
const transcript = content.content.pages?.[0]?.chunks?.map(c => c.text).join('\n');
console.log('Transcript:', transcript);
// Summary
console.log('Summary:', content.content.summary);
// Extracted entities
const attendees = content.content.observations?.filter(
obs => obs.type === ObservableTypes.Person
);
console.log('Attendees:', attendees?.map(a => a.observable.name));
const topics = content.content.observations?.filter(
obs => obs.type === ObservableTypes.Product
);
console.log('Topics discussed:', topics?.map(t => t.observable.name));
Part 4: Search Meetings
import { ContentTypes, FileTypes } from 'graphlit-client/dist/generated/graphql-types';
// Search meeting transcripts
const results = await graphlit.queryContents({
search: 'budget allocation',
filter: {
types: [ContentTypes.File],
fileTypes: [FileTypes.Audio, FileTypes.Video]
}
});
results.contents.results.forEach(meeting => {
console.log(meeting.name);
console.log('Duration:', meeting.audio?.duration || meeting.video?.duration);
});
Part 5: Meeting RAG
// Chat with meeting history
const conversation = await graphlit.createConversation('Meeting Assistant');
const response = await graphlit.promptConversation(
'What were the key decisions in the Q4 planning meeting?',
conversation.createConversation.id
);
console.log(response.promptConversation?.message?.message);
Production Patterns
Auto-Generate Meeting Notes
// After meeting transcription
const content = await graphlit.getContent(meetingId);
const notes = `
# ${content.content.name}
**Summary:**
${content.content.summary}
**Attendees:**
${content.content.observations
?.filter(o => o.type === ObservableTypes.Person)
.map(p => `- ${p.observable.name}`)
.join('\n')}
**Topics Discussed:**
${content.content.observations
?.filter(o => o.type === ObservableTypes.Product)
.map(p => `- ${p.observable.name}`)
.join('\n')}
`;
console.log(notes);
Related Guides
- Workflows and Processing - Transcription workflows
- Building Knowledge Graphs - Entity extraction