|
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() |
|
|