File size: 8,769 Bytes
cbaa30f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | from flask import Flask, render_template, request
from markupsafe import Markup
import google.generativeai as genai
from openai import OpenAI
import os
import dotenv
dotenv.load_dotenv()
app = Flask(__name__)
# API Keys
GEMINI_API_KEY = os.getenv('GEMINI_API_KEY')
NVIDIA_API_KEY = os.getenv('NVIDIA_API_KEY')
# Initialize Gemini
if GEMINI_API_KEY:
genai.configure(api_key=GEMINI_API_KEY)
# Initialize NVIDIA
nvidia_client = None
if NVIDIA_API_KEY:
nvidia_client = OpenAI(
base_url="https://integrate.api.nvidia.com/v1",
api_key=NVIDIA_API_KEY
)
def call_llm(prompt):
"""Call LLM with Gemini -> NVIDIA fallback."""
# 1. Gemini Fallback
if GEMINI_API_KEY:
for model_name in ["gemini-2.5-flash", "gemini-2.5-flash-lite"]:
try:
print(f" >> Trying Gemini {model_name}...")
model = genai.GenerativeModel(model_name)
response = model.generate_content(prompt)
if response and response.text:
print(f" >> SUCCESS with {model_name}")
return response.text
except Exception as e:
print(f" >> {model_name} failed: {e}")
continue
# 2. NVIDIA Fallback
if nvidia_client:
nvidia_models = ["meta/llama-3.1-405b-instruct", "meta/llama-3.1-70b-instruct", "google/gemma-3-27b-it"]
for model_name in nvidia_models:
try:
print(f" >> Trying NVIDIA {model_name}...")
response = nvidia_client.chat.completions.create(
model=model_name,
messages=[{"role": "user", "content": prompt}],
max_tokens=4096,
temperature=0.3
)
print(f" >> SUCCESS with {model_name}")
return response.choices[0].message.content
except Exception as e:
print(f" >> {model_name} failed: {e}")
continue
return "<p>Error: All AI models failed. Please check API keys.</p>"
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
# Retrieve farm details
location = request.form.get('location')
total_area = request.form.get('total_area')
language = request.form.get('language', 'English')
# Retrieve crop details structure
crop_seasons = request.form.getlist('crop_season')
crop_names = request.form.getlist('crop_name')
crop_areas = request.form.getlist('crop_area')
crops = []
for s, n, a in zip(crop_seasons, crop_names, crop_areas):
if n.strip() and a.strip():
crops.append(f"{s}: {n.strip()} ({a.strip()} acres)")
current_plan = " | ".join(crops)
prompt = f"""
You are an advanced agricultural economist. I will provide the farmer's **Current Annual Crop Cycle**.
Your task is to generate a **3-Year Optimization Plan** and explicitly explain **WHY their current plan is losing money/underperforming** compared to the potential.
**Inputs:**
- Location: {location}
- Total Area: {total_area} acres
- Current Annual Plan: {current_plan}
**OUTPUT FORMAT INSTRUCTIONS:**
Generate ONLY the HTML content inside `<div>` tags. Use the specific CSS classes below.
**Structure & CSS Classes to Use:**
1. **Executive Summary (2 Cards):**
Use `<div class="stats-grid" style="grid-template-columns: 1fr 1fr; max-width: 700px; margin: 0 auto 1.5rem;">` containing:
- Card 1: **Projected Annual Net Profit** (Value in `stat-value`)
- Card 2: **Revenue Increase** (Value in `stat-value` with `color: #1a5d3a`)
2. **GAP ANALYSIS (Why the Loss?):**
Header: `<h3><i class="bi bi-search"></i> Input Strategy Analysis</h3>`
Use `<div class="gap-analysis-card">` (I will add this CSS):
- `<h4><i class="bi bi-exclamation-circle"></i> Inefficiencies Detected in Current Plan:</h4>`
- `<ul>`
- `<li><b>[Factor 1]:</b> [Explanation, e.g., 'Monoculture of Wheat increases pest risk and fertilizer cost by 20%']</li>`
- `<li><b>[Factor 2]:</b> [Explanation, e.g., 'Missing Zaid season leaves 4 months of revenue potential on the table']</li>`
- `<li><b>[Factor 3]:</b> [Explanation]</li>`
- `</ul>`
3. **Annual Financial Breakdown (Single Bar):**
Header: `<h3><i class="bi bi-pie-chart"></i> Projected Financials</h3>`
Use `<div class="breakdown-section">`:
- Title: `<div class="breakdown-title"><span>Breakdown (Avg Annual)</span> <span>Total Rev: [Value]</span></div>`
- Stacked Bar: `<div class="stacked-bar-container">`
- `<div class="bar-cost" style="width: [Cost%]%">Cost [Value]</div>`
- `<div class="bar-profit" style="width: [Profit%]%">Profit [Value]</div>`
- Legend included below.
4. **3-Year Crop Rotation (Vertical Stalk):**
Header: `<h3><i class="bi bi-bezier2"></i> Crop Rotation Journey</h3>`
Use `<div class="growth-timeline">`:
- **For EACH Year (1, 2, 3):**
`<div class="growth-node">`
`<div class="growth-card">`
`<div class="growth-header">`
`<span>Year 1</span>`
`<span>Est. Income: [Value]</span>`
`</div>`
`<table class="annual-table">`
`<thead><tr><th>Season</th><th>Crop</th><th>Exp/Rev/Profit</th></tr></thead>`
`<tbody>`
`<tr>`
`<td><span class="season-badge">Kharif</span></td>`
`<td><b>[Crop Name]</b></td>`
`<td>Exp: [Val]<br>Prof: <b>[Val]</b></td>`
`</tr>`
`<tr>`
`<td><span class="season-badge">Rabi</span></td>`
`<td><b>[Crop Name]</b></td>`
`<td>Exp: [Val]<br>Prof: <b>[Val]</b></td>`
`</tr>`
`<tr>`
`<td><span class="season-badge">Zaid</span></td>`
`<td><b>[Crop Name]</b></td>`
`<td>Exp: [Val]<br>Prof: <b>[Val]</b></td>`
`</tr>`
`</tbody>`
`</table>`
`</div>`
`</div>`
5. **Comparison Table:**
Header: `<h3><i class="bi bi-table"></i> Strategy Comparison</h3>`
Use `<div class="smart-table-container">` with `<table class="smart-table">`.
- Columns: Metric, Current Annual Plan, Proposed (Avg Annual), Change.
- Rows: Gross Revenue, Total Cost, Net Profit.
- **COLOR LOGIC:**
- **Total Cost:** Identify if Cost Increases or Decreases. Mark "Cost Increase" as `<span class="negative">` (Red). Mark "Cost Decrease" as `<span class="positive">` (Green).
- **Net Profit:** Increase = Positive (Green).
**Guidelines:**
- **Language:** {language}
- **REALISM:** Ensure the gap isn't exaggerated. If the current plan is decent, say so. If it's bad, explain EXACTLY why (e.g., pests, soil depletion, unused seasons).
"""
try:
print(f"\n[CROP REVENUE] Generating report for {location}...")
result_html = call_llm(prompt)
result_html = result_html.strip()
# Remove markdown code blocks
if result_html.startswith("```html"):
result_html = result_html[7:]
if result_html.startswith("```"):
result_html = result_html[3:]
if result_html.endswith("```"):
result_html = result_html[:-3]
return render_template('index.html', result=Markup(result_html.strip()))
except Exception as e:
error_message = f"Error generating crop strategy: {str(e)}"
return render_template('index.html', error=error_message)
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True, port=5003) |