function regenerate_minutes
Flask route handler that regenerates meeting minutes from a previous session using modified instructions, model selection, and configuration parameters.
/tf/active/vicechatdev/leexi/app.py
297 - 396
complex
Purpose
This endpoint allows users to regenerate meeting minutes from an existing session with different AI model settings, custom instructions, rigor levels, and detail preferences. It loads the original transcript and PowerPoint data from a saved session, applies new generation parameters, validates the output for potential truncation issues, and saves the regenerated minutes as a new session while preserving the original data.
Source Code
def regenerate_minutes():
"""Regenerate meeting minutes with modified instructions"""
try:
session_id = request.form.get('session_id')
new_instructions = request.form.get('new_instructions', '')
new_model = request.form.get('new_model', 'gpt-4o')
# Get new configuration options (use defaults if not provided)
new_rigor_level = request.form.get('new_rigor_level', 'balanced')
new_detail_level = request.form.get('new_detail_level', 'comprehensive')
# Load session data
session_file = REPORTS_FOLDER / f"session_{session_id}.json"
if not session_file.exists():
return jsonify({'error': 'Session not found'}), 404
with open(session_file, 'r') as f:
session_data = json.load(f)
# Initialize generator with new model
generator = EnhancedMeetingMinutesGenerator(model=new_model)
# Load original data
with open(session_data['transcript_path'], 'r', encoding='utf-8') as f:
transcript = f.read()
# Process PowerPoint if available
ppt_content = None
if session_data['powerpoint_path']:
ppt_content = generator.process_powerpoint_content(session_data['powerpoint_path'])
# Extract previous reports summary if available
previous_reports_summary = ""
if session_data['previous_reports']:
previous_reports_summary = extract_previous_reports_summary(session_data['previous_reports'])
# Generate with new instructions and configuration
minutes = generator.generate_meeting_minutes_with_config(
transcript=transcript,
ppt_content=ppt_content,
meeting_title=session_data['meeting_title'],
previous_reports_summary=previous_reports_summary,
user_instructions=new_instructions,
rigor_level=new_rigor_level,
detail_level=new_detail_level,
action_focus=session_data.get('action_focus', 'standard'),
output_style=session_data.get('output_style', 'professional')
)
# Check for potential truncation issues
validation_notes = []
if "## Meeting Agenda" in minutes and "## Meeting Discussion by Agenda Item" in minutes:
agenda_section = minutes.split("## Meeting Agenda")[1].split("##")[0]
agenda_items = [line.strip() for line in agenda_section.split('\n') if line.strip() and any(line.strip().startswith(f'{i}.') for i in range(1, 10))]
discussion_section = minutes.split("## Meeting Discussion by Agenda Item")[1].split("## Action Items")[0] if "## Action Items" in minutes else minutes.split("## Meeting Discussion by Agenda Item")[1]
discussion_items = [line.strip() for line in discussion_section.split('\n') if line.strip().startswith('###')]
if len(agenda_items) > len(discussion_items):
validation_notes.append(f"⚠️ WARNING: Agenda lists {len(agenda_items)} items but only {len(discussion_items)} discussion sections generated.")
validation_notes.append("This may indicate output truncation due to token limits. Consider regenerating or breaking into smaller sections.")
# Add validation warnings to the output if needed
if validation_notes:
minutes += "\n\n## Generation Validation Warnings\n"
for note in validation_notes:
minutes += f"- {note}\n"
# Save new report
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
report_filename = f"meeting_minutes_{timestamp}_regenerated.md"
report_path = REPORTS_FOLDER / report_filename
with open(report_path, 'w', encoding='utf-8') as f:
f.write(minutes)
# Convert to HTML
html_content = markdown.markdown(minutes, extensions=['tables', 'fenced_code'])
# Update session data
session_data['user_instructions'] = new_instructions
session_data['model'] = new_model
session_data['report_path'] = str(report_path)
new_session_id = timestamp
new_session_file = REPORTS_FOLDER / f"session_{new_session_id}.json"
with open(new_session_file, 'w') as f:
json.dump(session_data, f)
return jsonify({
'success': True,
'html_content': html_content,
'markdown_content': minutes,
'report_path': str(report_path),
'session_id': new_session_id
})
except Exception as e:
logger.error(f"Error regenerating minutes: {str(e)}")
return jsonify({'error': f'Error regenerating minutes: {str(e)}'}), 500
Return Value
Returns a Flask JSON response. On success (200): {'success': True, 'html_content': string (HTML-formatted minutes), 'markdown_content': string (raw markdown), 'report_path': string (file path to saved report), 'session_id': string (new session identifier)}. On error (404 if session not found, 500 for other errors): {'error': string (error message)}.
Dependencies
flaskmarkdownloggingpathlibdatetimejsonopenai
Required Imports
from flask import request, jsonify
import markdown
import json
from datetime import datetime
from pathlib import Path
import logging
Conditional/Optional Imports
These imports are only needed under specific conditions:
from enhanced_meeting_minutes_generator import EnhancedMeetingMinutesGenerator
Condition: Required custom module for generating meeting minutes with AI
Required (conditional)from document_extractor import DocumentExtractor
Condition: May be used indirectly through EnhancedMeetingMinutesGenerator for PowerPoint processing
Required (conditional)Usage Example
# Example POST request to regenerate minutes
import requests
# Assuming Flask app is running on localhost:5000
response = requests.post(
'http://localhost:5000/regenerate',
data={
'session_id': '20240115_143022',
'new_instructions': 'Focus more on action items and deadlines',
'new_model': 'gpt-4o',
'new_rigor_level': 'thorough',
'new_detail_level': 'comprehensive'
}
)
if response.status_code == 200:
result = response.json()
print(f"Success! New session ID: {result['session_id']}")
print(f"Report saved to: {result['report_path']}")
# Access HTML content: result['html_content']
# Access markdown: result['markdown_content']
else:
print(f"Error: {response.json()['error']}")
Best Practices
- Always validate that session_id exists before attempting regeneration to avoid 404 errors
- Monitor the validation_notes in the output for warnings about potential truncation due to token limits
- Consider breaking large meetings into smaller sections if truncation warnings appear
- Preserve original session data by creating new session files rather than overwriting
- Use appropriate error handling when calling this endpoint as it can fail due to missing files, AI API errors, or file I/O issues
- Ensure REPORTS_FOLDER has write permissions for saving new reports and session files
- Be aware that regeneration creates a new session_id and report file, so track both old and new sessions if needed
- The function validates agenda items against discussion sections to detect incomplete generation
- Use markdown extensions ['tables', 'fenced_code'] when converting to HTML to maintain formatting
Tags
Similar Components
AI-powered semantic similarity - components with related functionality:
-
function generate_minutes 81.5% similar
-
function handle_potential_truncation 65.0% similar
-
class MeetingMinutesGenerator 64.4% similar
-
class MeetingMinutesGenerator_v1 63.1% similar
-
function test_web_ui 62.2% similar