Spaces:
Sleeping
Sleeping
| import os | |
| import logging | |
| from openai import OpenAI | |
| from huggingface_hub import InferenceClient | |
| logger = logging.getLogger(__name__) | |
| # Fallback open-source model via HF Serverless API | |
| HF_MODEL = "facebook/bart-large-cnn" | |
| HF_MAX_INPUT_CHARS = 4000 # truncate input to roughly 1000 tokens to avoid timeouts/limits | |
| # OpenAI | |
| OPENAI_MODEL = "gpt-4o-mini" | |
| OPENAI_MAX_INPUT_CHARS = 40000 # larger context window | |
| def generate_summary(text: str, is_registered: bool = False) -> str: | |
| """ | |
| Generate a summary of the extracted text. | |
| Uses OpenAI for registered users (if key exists), | |
| and Hugging Face Serverless API for anonymous users. | |
| """ | |
| if not text or len(text.strip()) < 50: | |
| return "Not enough text to generate a meaningful summary." | |
| if is_registered: | |
| api_key = os.environ.get("OPENAI_API_KEY") | |
| if api_key: | |
| return _summarize_openai(text, api_key) | |
| else: | |
| logger.warning("OPENAI_API_KEY not found. Falling back to HF Serverless API.") | |
| return _summarize_hf(text) | |
| else: | |
| return _summarize_hf(text) | |
| def _summarize_openai(text: str, api_key: str) -> str: | |
| try: | |
| client = OpenAI(api_key=api_key) | |
| truncated_text = text[:OPENAI_MAX_INPUT_CHARS] | |
| response = client.chat.completions.create( | |
| model=OPENAI_MODEL, | |
| messages=[ | |
| {"role": "system", "content": "You are a professional assistant. Provide a concise, highly readable 2-3 sentence summary of the following document. Focus on the core facts, purpose, or conclusions."}, | |
| {"role": "user", "content": truncated_text} | |
| ], | |
| max_tokens=150, | |
| temperature=0.3 | |
| ) | |
| return response.choices[0].message.content.strip() | |
| except Exception as e: | |
| logger.error(f"OpenAI summarization failed: {e}") | |
| return "" | |
| def _summarize_hf(text: str) -> str: | |
| try: | |
| # Use InferenceClient (uses the HF_TOKEN env var if present in Space, or anonymous if not) | |
| client = InferenceClient() | |
| truncated_text = text[:HF_MAX_INPUT_CHARS] | |
| response = client.summarization(truncated_text, model=HF_MODEL) | |
| if isinstance(response, list) and len(response) > 0: | |
| return response[0].get("summary_text", "").strip() | |
| elif isinstance(response, dict): | |
| return response.get("summary_text", "").strip() | |
| else: | |
| return str(response) | |
| except Exception as e: | |
| logger.error(f"HF summarization failed: {e}") | |
| return "" | |