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 "
Error: All AI models failed. Please check API keys.
" @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 `