Spaces:
Sleeping
Sleeping
import logging | |
from transformers import pipeline | |
import asyncio | |
class TextGenerationHandler: | |
def __init__(self): | |
# Initialize the text generation pipeline | |
self.pipe = pipeline( | |
"text2text-generation", | |
model="google/flan-t5-small", | |
max_length=2048, # Increase max length for longer responses | |
num_return_sequences=1 | |
) | |
self.logger = logging.getLogger(__name__) | |
async def generate_response(self, prompt: str) -> str: | |
""" | |
Generate a complete response using the T5 model pipeline | |
Args: | |
prompt (str): Input text to generate from | |
Returns: | |
str: Generated text output | |
""" | |
try: | |
# Break down the generation into sections for better coherence | |
sections = [ | |
"1. Executive Summary", | |
"2. Project Scope and Objectives", | |
"3. Architecture Overview", | |
"4. Component Design", | |
"5. Security and Compliance", | |
"6. Deployment Strategy", | |
"7. Team Requirements", | |
"8. Cost Estimates", | |
"9. Project Timeline" | |
] | |
complete_response = [] | |
for section in sections: | |
section_prompt = f"{prompt}\nGenerate content for: {section}" | |
self.logger.info(f"Generating section: {section}") | |
self.logger.debug(f"Section prompt: {section_prompt}") | |
output = self.pipe( | |
section_prompt, | |
max_length=512, | |
do_sample=True, | |
temperature=0.7, | |
repetition_penalty=1.2, | |
no_repeat_ngram_size=3 | |
) | |
section_text = output[0]['generated_text'].strip() | |
self.logger.info(f"Generated text for {section}:\n{section_text}\n") | |
complete_response.append(f"{section}\n{section_text}") | |
final_response = "\n\n".join(complete_response) | |
self.logger.info(f"Complete response:\n{final_response}") | |
return final_response | |
except Exception as e: | |
self.logger.error(f"Error generating text: {str(e)}", exc_info=True) | |
raise | |
async def stream_response(self, prompt: str): | |
""" | |
Stream the generated response section by section | |
Args: | |
prompt (str): Input text to generate from | |
Yields: | |
dict: Response chunks with type and content | |
""" | |
try: | |
# Generate complete response first | |
response = await self.generate_response(prompt) | |
# Stream each section | |
accumulated_response = "" | |
sections = response.split('\n\n') | |
for section in sections: | |
accumulated_response += section + "\n\n" | |
self.logger.debug(f"Streaming section:\n{section}\n") | |
yield { | |
"type": "content", | |
"content": accumulated_response.strip() | |
} | |
await asyncio.sleep(0.1) | |
except Exception as e: | |
self.logger.error(f"Error in stream_response: {str(e)}", exc_info=True) | |
yield { | |
"type": "error", | |
"content": str(e) | |
} | |
# Configure logging | |
logging.basicConfig( | |
level=logging.INFO, | |
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', | |
handlers=[ | |
logging.StreamHandler(), | |
logging.FileHandler('f5_model.log') | |
] | |
) | |
f5_model = TextGenerationHandler() | |