| import gradio as gr |
| import os |
| from openai import OpenAI |
| import requests |
| from PIL import Image |
| import io |
| import tempfile |
| import base64 |
|
|
| def analyze_environmental_impact(api_key, analysis_type, image=None, text_input=None, location=None, product_info=None): |
| """ |
| Analyze environmental impact based on user inputs using Gemini 2.5 Pro through OpenRouter. |
| """ |
| if not api_key: |
| return "Please provide an OpenRouter API key." |
| |
| client = OpenAI( |
| base_url="https://openrouter.ai/api/v1", |
| api_key=api_key, |
| ) |
| |
| |
| if analysis_type == "Image Analysis": |
| if image is None: |
| return "Please upload an image for analysis." |
| |
| |
| temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") |
| image_path = temp_file.name |
| image.save(image_path) |
| |
| |
| with open(image_path, "rb") as img_file: |
| image_base64 = base64.b64encode(img_file.read()).decode("utf-8") |
| |
| |
| os.unlink(image_path) |
| |
| prompt = """ |
| Analyze this image for environmental impact factors. Consider: |
| 1. Visible ecosystems, wildlife, or natural resources |
| 2. Human infrastructure and its potential environmental footprint |
| 3. Evidence of pollution, waste, or environmental degradation |
| 4. Sustainable or eco-friendly elements |
| |
| Provide a comprehensive environmental impact assessment and suggest ways to improve |
| sustainability based on what you see. |
| """ |
| |
| messages = [ |
| { |
| "role": "user", |
| "content": [ |
| { |
| "type": "text", |
| "text": prompt |
| }, |
| { |
| "type": "image_url", |
| "image_url": { |
| "url": f"data:image/jpeg;base64,{image_base64}" |
| } |
| } |
| ] |
| } |
| ] |
| |
| elif analysis_type == "Geographical Assessment": |
| if not location: |
| return "Please provide a location for geographical assessment." |
| |
| prompt = f""" |
| Provide an environmental impact assessment for the location: {location}. |
| |
| Include information about: |
| 1. Current environmental conditions (air quality, water resources, biodiversity) |
| 2. Major environmental challenges and threats |
| 3. Sustainability initiatives and progress |
| 4. Carbon footprint and emissions data |
| 5. Recommendations for improving environmental sustainability in this area |
| |
| Present the information in a structured format with clear sections for each aspect. |
| """ |
| |
| messages = [ |
| { |
| "role": "user", |
| "content": prompt |
| } |
| ] |
| |
| elif analysis_type == "Product Assessment": |
| if not product_info: |
| return "Please provide product information for assessment." |
| |
| prompt = f""" |
| Analyze the environmental impact of the following product: |
| |
| {product_info} |
| |
| Include in your assessment: |
| 1. Materials and resources used |
| 2. Manufacturing process impact |
| 3. Transportation and distribution footprint |
| 4. Usage phase environmental impact |
| 5. End-of-life considerations |
| 6. Overall sustainability score on a scale of 1-10 |
| 7. Recommendations for improving the product's environmental footprint |
| |
| Be specific and provide actionable insights. |
| """ |
| |
| messages = [ |
| { |
| "role": "user", |
| "content": prompt |
| } |
| ] |
| |
| elif analysis_type == "Custom Query": |
| if not text_input: |
| return "Please provide a query for custom environmental analysis." |
| |
| prompt = f""" |
| Provide an environmental impact analysis based on the following information: |
| |
| {text_input} |
| |
| Include in your response: |
| 1. Key environmental concerns identified |
| 2. Potential ecological impacts - short and long term |
| 3. Carbon footprint considerations |
| 4. Waste and pollution factors |
| 5. Biodiversity impacts |
| 6. Actionable recommendations for sustainability |
| 7. References to relevant environmental principles or frameworks |
| |
| Be specific, thorough, and provide practical advice. |
| """ |
| |
| messages = [ |
| { |
| "role": "user", |
| "content": prompt |
| } |
| ] |
| |
| |
| try: |
| completion = client.chat.completions.create( |
| extra_headers={ |
| "HTTP-Referer": "https://environmental-impact-analyzer.app", |
| "X-Title": "Smart Environmental Impact Analyzer", |
| }, |
| model="google/gemini-2.5-pro-exp-03-25:free", |
| messages=messages |
| ) |
| |
| |
| if completion and hasattr(completion, 'choices') and completion.choices and len(completion.choices) > 0: |
| if hasattr(completion.choices[0], 'message') and completion.choices[0].message: |
| return completion.choices[0].message.content |
| else: |
| return "Error: Received empty message from API." |
| else: |
| return "Error: Received incomplete response from API." |
| |
| except Exception as e: |
| return f"Error during analysis: {str(e)}" |
|
|
| |
| with gr.Blocks(title="Smart Environmental Impact Analyzer") as app: |
| gr.Markdown("# 🌍 Smart Environmental Impact Analyzer") |
| gr.Markdown(""" |
| This tool analyzes environmental impacts using Gemini 2.5 Pro AI. |
| Choose an analysis type and provide the required information. |
| """) |
|
|
| with gr.Accordion("Sample Example Inputs", open=False): |
| gr.Markdown(""" |
| ### API Key Input: |
| First, you'll need an OpenRouter API key. If you don't have one, you can get it from [openrouter.ai](https://openrouter.ai). This should be entered in the "OpenRouter API Key" field. |
| Sample API key format (not a real key): |
| ``` |
| sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ``` |
| |
| ### Image Analysis Tab: |
| Upload an image like: |
| - A cityscape with visible pollution |
| - A forest or natural area |
| - An industrial facility |
| - A solar farm or wind turbines |
| - A beach with visible plastic waste |
| |
| For testing purposes, you could use public domain environmental images from sites like [Unsplash](https://unsplash.com) or [Pexels](https://www.pexels.com). |
| |
| ### Geographical Assessment Tab: |
| Sample location inputs: |
| - **New York City, USA** |
| - **Copenhagen, Denmark** |
| - **Amazon Rainforest, Brazil** |
| - **Great Barrier Reef, Australia** |
| |
| ### Product Assessment Tab: |
| Sample product descriptions: |
| 1. **Plastic water bottle** made from PET plastic. Single-use design with a plastic cap. Manufactured in China and shipped globally. Typical lifecycle includes production, distribution, single use, and disposal, with most bottles ending up in landfills or as litter. |
| 2. **Electric car** with a 75kWh lithium-ion battery. Aluminum and steel body with leather interior. Manufactured in California, USA. Average lifespan of 15 years or 200,000 miles. Battery requires rare earth minerals from mining operations. |
| 3. **Organic cotton t-shirt**, grown without pesticides or synthetic fertilizers. Made in India using natural dyes. Packaged in recycled paper. Designed to last approximately 50 washes. |
| |
| ### Custom Query Tab: |
| Sample queries: |
| 1. What is the environmental impact of bitcoin mining and cryptocurrency operations? How does it compare to traditional banking systems? |
| 2. How would switching to a plant-based diet for one year affect my personal carbon footprint? What specific food choices would have the biggest positive impact? |
| 3. What are the environmental trade-offs between paper packaging and plastic packaging for food products? When is each option more sustainable? |
| 4. How does fast fashion impact water resources? What sustainable alternatives exist? |
| """) |
|
|
| with gr.Accordion("About the project!", open=False): |
| gr.Markdown(""" |
| ### Image Analysis: |
| Users can upload an image to analyze environmental impacts, such as: |
| - Pollution |
| - Ecosystems |
| - Human infrastructure |
| |
| ### Geographical Assessment: |
| This section allows users to input a location and receive an analysis of: |
| - Environmental conditions |
| - Challenges |
| - Sustainability efforts |
| |
| ### Product Assessment: |
| Users can input product details to analyze the environmental impact throughout the product’s lifecycle, including: |
| - Materials used |
| - Manufacturing process |
| - Disposal |
| |
| ### Custom Query: |
| This section allows users to input any custom environmental query to receive a detailed analysis, covering: |
| - Carbon footprint |
| - Waste and pollution |
| - Sustainability practices |
| """) |
| |
| api_key = gr.Textbox(label="OpenRouter API Key", placeholder="Enter your OpenRouter API key", type="password") |
| |
| with gr.Tabs(): |
| with gr.TabItem("Image Analysis"): |
| image_input = gr.Image(type="pil", label="Upload an image for environmental analysis") |
| image_submit = gr.Button("Analyze Image") |
| image_output = gr.Textbox(label="Analysis Results", lines=15) |
| image_clear = gr.Button("Clear Response") |
| |
| image_submit.click( |
| analyze_environmental_impact, |
| inputs=[ |
| api_key, |
| gr.Textbox(value="Image Analysis", visible=False), |
| image_input, |
| gr.Textbox(value="", visible=False), |
| gr.Textbox(value="", visible=False), |
| gr.Textbox(value="", visible=False) |
| ], |
| outputs=image_output |
| ) |
| |
| image_clear.click( |
| lambda: "", |
| inputs=[], |
| outputs=image_output |
| ) |
| |
| with gr.TabItem("Geographical Assessment"): |
| location_input = gr.Textbox(label="Location (city, region, or country)", placeholder="e.g., Paris, France") |
| location_submit = gr.Button("Analyze Location") |
| location_output = gr.Textbox(label="Analysis Results", lines=15) |
| location_clear = gr.Button("Clear Response") |
| |
| location_submit.click( |
| analyze_environmental_impact, |
| inputs=[ |
| api_key, |
| gr.Textbox(value="Geographical Assessment", visible=False), |
| gr.Image(value=None, visible=False, type="pil"), |
| gr.Textbox(value="", visible=False), |
| location_input, |
| gr.Textbox(value="", visible=False) |
| ], |
| outputs=location_output |
| ) |
| |
| location_clear.click( |
| lambda: "", |
| inputs=[], |
| outputs=location_output |
| ) |
| |
| with gr.TabItem("Product Assessment"): |
| product_info = gr.Textbox( |
| label="Product Information", |
| placeholder="Describe the product, materials, manufacturing process, lifecycle, etc.", |
| lines=5 |
| ) |
| product_submit = gr.Button("Analyze Product") |
| product_output = gr.Textbox(label="Analysis Results", lines=15) |
| product_clear = gr.Button("Clear Response") |
| |
| product_submit.click( |
| analyze_environmental_impact, |
| inputs=[ |
| api_key, |
| gr.Textbox(value="Product Assessment", visible=False), |
| gr.Image(value=None, visible=False, type="pil"), |
| gr.Textbox(value="", visible=False), |
| gr.Textbox(value="", visible=False), |
| product_info |
| ], |
| outputs=product_output |
| ) |
| |
| product_clear.click( |
| lambda: "", |
| inputs=[], |
| outputs=product_output |
| ) |
| |
| with gr.TabItem("Custom Query"): |
| custom_input = gr.Textbox( |
| label="Custom Environmental Query", |
| placeholder="Enter your environmental question or describe a scenario to analyze", |
| lines=5 |
| ) |
| custom_submit = gr.Button("Analyze") |
| custom_output = gr.Textbox(label="Analysis Results", lines=15) |
| custom_clear = gr.Button("Clear Response") |
| |
| custom_submit.click( |
| analyze_environmental_impact, |
| inputs=[ |
| api_key, |
| gr.Textbox(value="Custom Query", visible=False), |
| gr.Image(value=None, visible=False, type="pil"), |
| custom_input, |
| gr.Textbox(value="", visible=False), |
| gr.Textbox(value="", visible=False) |
| ], |
| outputs=custom_output |
| ) |
| |
| custom_clear.click( |
| lambda: "", |
| inputs=[], |
| outputs=custom_output |
| ) |
| |
| gr.Markdown(""" |
| ### Privacy Notice |
| Your API key is used only for making requests to OpenRouter and is not stored or logged. |
| The images and text you submit are processed by Gemini 2.5 Pro through OpenRouter's API. |
| |
| ### Usage Instructions |
| 1. Enter your OpenRouter API key (get one from https://openrouter.ai) |
| 2. Select the type of analysis you want to perform |
| 3. Provide the required information (image, location, product details, or custom query) |
| 4. Click the "Analyze" button for your selected tab |
| """) |
|
|
| |
| if __name__ == "__main__": |
| app.launch() |
|
|