import os import gradio as gr from groq import Groq import json from datetime import datetime import time class RealTimeFactChecker: def __init__(self): self.client = None self.model_options = ["compound-beta", "compound-beta-mini"] def initialize_client(self, api_key): """Initialize Groq client with API key""" try: self.client = Groq(api_key=api_key) return True, "
✅ API Key validated successfully!
" except Exception as e: return False, f"
❌ Error initializing client: {str(e)}
" def get_system_prompt(self): """Get the system prompt for consistent behavior""" return """You are a Real-time Fact Checker and News Agent. Your primary role is to provide accurate, up-to-date information by leveraging web search when needed. CORE RESPONSIBILITIES: 1. **Fact Verification**: Always verify claims with current, reliable sources 2. **Real-time Information**: Use web search for any information that changes frequently (news, stocks, weather, current events) 3. **Source Transparency**: When using web search, mention the sources or indicate that you've searched for current information 4. **Accuracy First**: If information is uncertain or conflicting, acknowledge this clearly RESPONSE GUIDELINES: - **Structure**: Start with a clear, direct answer, then provide supporting details - **Recency**: Always prioritize the most recent, reliable information - **Clarity**: Use clear, professional language while remaining accessible - **Completeness**: Provide comprehensive answers but stay focused on the query - **Source Awareness**: When you've searched for information, briefly indicate this (e.g., "Based on current reports..." or "Recent data shows...") WHEN TO SEARCH: - Breaking news or current events - Stock prices, market data, or financial information - Weather conditions or forecasts - Recent scientific discoveries or research - Current political developments - Real-time statics or data - Verification of recent claims or rumors RESPONSE FORMAT: - Lead with key facts - Include relevant context - Mention timeframe when relevant (e.g., "as of today", "this week") - If multiple sources conflict, acknowledge this - End with a clear summary for complex topics Remember: Your goal is to be the most reliable, up-to-date source of information possible.""" def query_compound_model(self, query, model, temperature=0.7, custom_system_prompt=None): """Query the compound model and return response with tool execution info""" if not self.client: return "
❌ Please set a valid API key first.
", None, None try: start_time = time.time() system_prompt = custom_system_prompt if custom_system_prompt else self.get_system_prompt() chat_completion = self.client.chat.completions.create( messages=[ { "role": "system", "content": system_prompt }, { "role": "user", "content": query, } ], model=model, temperature=temperature, max_tokens=1500 ) end_time = time.time() response_time = round(end_time - start_time, 2) response_content = chat_completion.choices[0].message.content executed_tools = getattr(chat_completion.choices[0].message, 'executed_tools', None) tool_info = self.format_tool_info(executed_tools) return response_content, tool_info, response_time except Exception as e: return f"
❌ Error querying model: {str(e)}
", None, None def format_tool_info(self, executed_tools): """Format executed tools information for display""" if not executed_tools: return "
Tools Used: None (Used existing knowledge)
" tool_info = "
Tools Used:
" return tool_info def get_example_queries(self): """Return categorized example queries""" return { "Latest News": [ "What are the top 3 news stories today?", "Latest developments in AI technology this week", "Recent political events in the United States", "Breaking news about climate change", "What happened in the stock market today?" ], "Financial Data": [ "Current price of Bitcoin", "Tesla stock price today", "How is the S&P 500 performing today?", "Latest cryptocurrency market trends", "What's the current inflation rate?" ], "Weather Updates": [ "Current weather in New York City", "Weather forecast for London this week", "Is it going to rain in San Francisco today?", "Temperature in Tokyo right now", "Weather conditions in Sydney" ], "Science & Technology": [ "Latest breakthroughs in fusion energy", "Recent discoveries in space exploration", "New developments in quantum computing", "Latest medical research findings", "Recent advances in renewable energy" ], "Sports & Entertainment": [ "Latest football match results", "Who won the recent tennis tournament?", "Box office numbers for this weekend", "Latest movie releases this month", "Recent celebrity news" ], "Fact Checking": [ "Is it true that the Earth's population reached 8 billion?", "Verify: Did company X announce layoffs recently?", "Check if the recent earthquake in Turkey was magnitude 7+", "Confirm the latest unemployment rate statistics", "Verify recent claims about electric vehicle sales" ] } def get_custom_prompt_examples(self): """Return custom system prompt examples""" return { "Fact-Checker": "You are a fact-checker. Always verify claims with multiple sources and clearly indicate confidence levels in your assessments. Use phrases like 'highly confident', 'moderately confident', or 'requires verification' when presenting information.", "News Analyst": "You are a news analyst. Focus on providing balanced, unbiased reporting with multiple perspectives on current events. Always present different viewpoints and avoid partisan language.", "Financial Advisor": "You are a financial advisor. Provide accurate market data with context about trends and implications for investors. Always include disclaimers about market risks and the importance of professional financial advice.", "Research Assistant": "You are a research assistant specializing in scientific and technical information. Provide detailed, evidence-based responses with proper context about methodology and limitations of studies.", "Global News Correspondent": "You are a global news correspondent. Focus on international events and their interconnections. Provide cultural context and explain how events in one region might affect others.", "Market Analyst": "You are a market analyst. Provide detailed financial analysis including technical indicators, market sentiment, and economic factors affecting price movements." } def create_interface(): fact_checker = RealTimeFactChecker() custom_css = """ """ def validate_api_key(api_key): if not api_key or api_key.strip() == "": return "
❌ Please enter a valid API key
", False success, message = fact_checker.initialize_client(api_key.strip()) return message, success def process_query(query, model, temperature, api_key, system_prompt): if not api_key or api_key.strip() == "": return "
❌ Please set your API key first
", "", "" if not query or query.strip() == "": return "
❌ Please enter a query
", "", "" if not fact_checker.client: success, message = fact_checker.initialize_client(api_key.strip()) if not success: return message, "", "" response, tool_info, response_time = fact_checker.query_compound_model( query.strip(), model, temperature, system_prompt.strip() if system_prompt else None ) timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") formatted_response = f"""

Query:

{query}

Response:

{response}

Generated at {timestamp} in {response_time}s

""" return formatted_response, tool_info or "", f"
⚡ Response time: {response_time}s
" def reset_system_prompt(): return fact_checker.get_system_prompt() def load_example(example_text): return example_text def load_custom_prompt(prompt_text): return prompt_text with gr.Blocks(title="Real-time Fact Checker", css=custom_css) as demo: gr.HTML("""

🔍 Real-time Fact Checker

Instantly verify facts and get the latest news with Groq's Compound Models

""") with gr.Row(): with gr.Column(scale=3): with gr.Group(): gr.HTML('
') gr.Markdown("### API Configuration") api_key_input = gr.Textbox( label="Groq API Key", placeholder="Enter your Groq API key...", type="password", info="Obtain your free API key from https://console.groq.com/" ) api_status = gr.HTML( value="
⚠️ Please enter your API key
" ) validate_btn = gr.Button("Validate API Key", variant="secondary") gr.HTML('
') with gr.Group(): gr.HTML('
') gr.Markdown("### System Prompt") with gr.Accordion("Customize System Prompt", open=False): system_prompt_input = gr.Textbox( label="System Prompt", value=fact_checker.get_system_prompt(), lines=6, info="Customize the AI's behavior" ) reset_prompt_btn = gr.Button("Reset to Default", variant="secondary") gr.Markdown("#### Prompt Examples") custom_prompts = fact_checker.get_custom_prompt_examples() for title, prompt in custom_prompts.items(): gr.HTML(f"""
{title}
{prompt[:80]}...
""") gr.HTML('
') with gr.Group(): gr.HTML('
') gr.Markdown("### Your Query") query_input = gr.Textbox( label="Ask a Question", placeholder="e.g., What's the latest news on AI developments?", lines=3 ) with gr.Row(): model_choice = gr.Dropdown( choices=fact_checker.model_options, value="compound-beta", label="Model" ) temperature = gr.Slider( minimum=0.0, maximum=1.0, value=0.7, step=0.1, label="Temperature" ) submit_btn = gr.Button("🔍 Get Answer", variant="primary") clear_btn = gr.Button("Clear", variant="secondary") gr.HTML('
') with gr.Column(scale=2): with gr.Group(): gr.HTML('
') gr.Markdown("### Example Queries") examples = fact_checker.get_example_queries() with gr.Tabs(): for category, queries in examples.items(): with gr.Tab(category): for query in queries: gr.HTML(f'
{query}
') gr.HTML('
') gr.HTML('
') gr.Markdown("### Results") with gr.Row(): with gr.Column(scale=3): response_output = gr.HTML( value="
Enter a query to see results...
" ) with gr.Column(scale=2): tool_info_output = gr.HTML( value="
Tool execution details will appear here...
" ) performance_output = gr.HTML( value="" ) gr.HTML('
') gr.HTML(""" """) validate_btn.click( fn=validate_api_key, inputs=[api_key_input], outputs=[api_status, gr.State()] ) reset_prompt_btn.click( fn=reset_system_prompt, outputs=[system_prompt_input] ) submit_btn.click( fn=process_query, inputs=[query_input, model_choice, temperature, api_key_input, system_prompt_input], outputs=[response_output, tool_info_output, performance_output] ) clear_btn.click( fn=lambda: ("", "
Enter a query to see results...
", "
Tool execution details will appear here...
", ""), outputs=[query_input, response_output, tool_info_output, performance_output] ) return demo if __name__ == "__main__": demo = create_interface() demo.launch( share=True )