Meeting transcripts sit in folders unused. This pipeline parses transcripts into structured memory: decisions made, action items assigned, topics discussed, and external references mentioned. It then enriches external references via search to give agents full context. Each enrichment lookup costs $0.005.
Prerequisites
- Python 3.8+
- requests library
- A Scavio API key from scavio.dev
- Meeting transcript text files
Walkthrough
Step 1: Parse transcript into structured sections
Extract decisions, action items, and topics from raw transcript text.
import os, requests, json, re
API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
def parse_transcript(text):
"""Extract structured data from meeting transcript."""
memory = {'decisions': [], 'action_items': [], 'topics': [], 'references': []}
lines = text.split('\n')
for line in lines:
line_lower = line.lower().strip()
if any(w in line_lower for w in ['decided', 'agreed', 'approved', 'confirmed']):
memory['decisions'].append(line.strip())
if any(w in line_lower for w in ['will do', 'action:', 'todo:', 'assigned to', 'by friday', 'by next']):
memory['action_items'].append(line.strip())
urls = re.findall(r'https?://[^\s]+', line)
memory['references'].extend(urls)
# Extract mentioned tools/companies
for word in line.split():
if word[0:1].isupper() and len(word) > 3 and word.isalpha():
if word not in ['The', 'This', 'That', 'They', 'What', 'When', 'Where']:
memory['topics'].append(word)
memory['topics'] = list(set(memory['topics']))[:10]
memory['references'] = list(set(memory['references']))
return memory
# Test with sample transcript
sample = """John: We decided to switch from Tavily to a cheaper search API.
Sarah: Agreed. I will do the migration by next Friday.
John: Let's use Scavio. See https://scavio.dev for docs.
Sarah: Action: update the n8n workflow to use new API.
John: Confirmed the budget is $50/month for search."""
memory = parse_transcript(sample)
for key, items in memory.items():
print(f'{key}: {items}')Step 2: Enrich references with search context
Look up mentioned tools and URLs to add context to the memory.
def enrich_memory(memory):
"""Add search context for mentioned topics and references."""
enriched = []
# Enrich topics with current info
for topic in memory.get('topics', [])[:5]:
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': f'{topic} latest 2026', 'country_code': 'us', 'num_results': 2}).json()
results = data.get('organic_results', [])
if results:
enriched.append({
'topic': topic,
'context': results[0].get('snippet', '')[:150],
'url': results[0].get('link', '')
})
memory['enriched_topics'] = enriched
print(f'Enriched {len(enriched)} topics')
for e in enriched:
print(f' {e["topic"]}: {e["context"][:60]}...')
print(f'Enrichment cost: ${len(enriched) * 0.005:.3f}')
return memory
memory = enrich_memory(memory)
print(f'\nFull memory keys: {list(memory.keys())}')Step 3: Store as agent-readable memory format
Save the structured memory in a format agents can query later.
def save_memory(memory, meeting_date='2026-05-20', filename='meeting_memory.json'):
"""Save structured meeting memory for agent consumption."""
record = {
'date': meeting_date,
'type': 'meeting_transcript',
'decisions': memory.get('decisions', []),
'action_items': memory.get('action_items', []),
'topics': memory.get('topics', []),
'enriched_context': memory.get('enriched_topics', []),
'references': memory.get('references', []),
}
with open(filename, 'w') as f:
json.dump(record, f, indent=2)
print(f'Meeting memory saved to {filename}')
print(f'\n=== Memory Summary ===')
print(f' Date: {record["date"]}')
print(f' Decisions: {len(record["decisions"])}')
print(f' Action items: {len(record["action_items"])}')
print(f' Topics: {len(record["topics"])}')
print(f' Enriched context: {len(record["enriched_context"])}')
print(f'\n Decisions:')
for d in record['decisions']:
print(f' - {d[:60]}')
print(f' Action items:')
for a in record['action_items']:
print(f' - {a[:60]}')
return record
save_memory(memory)Python Example
import os, requests, json
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def enrich_topic(topic):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': f'{topic} 2026', 'country_code': 'us', 'num_results': 2}).json()
r = data.get('organic_results', [{}])[0]
return f'{r.get("title", "N/A")}: {r.get("snippet", "")[:80]}'
for topic in ['Scavio', 'Tavily', 'n8n']:
print(f'{topic}: {enrich_topic(topic)}')
print('Cost: $0.015')JavaScript Example
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function enrichTopic(topic) {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query: `${topic} 2026`, country_code: 'us', num_results: 2 })
}).then(r => r.json());
const r = (data.organic_results || [])[0] || {};
console.log(`${topic}: ${r.title || 'N/A'}`);
}
for (const t of ['Scavio', 'Tavily']) await enrichTopic(t);Expected Output
decisions: ['John: We decided to switch from Tavily to a cheaper search API.']
action_items: ['Sarah: Agreed. I will do the migration by next Friday.', 'Sarah: Action: update the n8n workflow to use new API.']
topics: ['Scavio', 'Tavily', 'John', 'Sarah']
references: ['https://scavio.dev']
Enriched 4 topics
Scavio: Scavio is a search API for AI agents offering structured...
Tavily: Tavily search API acquired by Nebius in 2026...
Enrichment cost: $0.020
=== Memory Summary ===
Decisions: 1
Action items: 2
Topics: 4
Enriched context: 4