webapi / app.py
mgokg's picture
Update app.py
437d052 verified
import os
import gradio as gr
from google import genai
from google.genai import types
# Client initialization
client_genai = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))
def generate_with_history(input_text, history):
"""
- input_text: The new message from JS
- history: A list of previous messages [user, model, user, model...]
"""
if history is None:
history = []
# Build the contents list including history
# Gemini API expects a list of Content objects
contents = []
for msg in history:
contents.append(types.Content(
role=msg["role"],
parts=[types.Part.from_text(text=msg["content"])]
))
# Add the current user prompt
contents.append(types.Content(
role="user",
parts=[types.Part.from_text(text=input_text)]
))
tools = [types.Tool(google_search=types.GoogleSearch())]
config = types.GenerateContentConfig(tools=tools)
try:
response = client_genai.models.generate_content(
model="gemini-flash-lite-latest",
contents=contents,
config=config,
)
response_text = response.text
# Update history: add the current exchange
history.append({"role": "user", "content": input_text})
history.append({"role": "model", "content": response_text})
# Return the response for JS and the updated history for the State
return response_text, history
except Exception as e:
return f"Error: {str(e)}", history
# Building the Blocks interface
with gr.Blocks() as demo:
# State component (always invisible)
history_state = gr.State([])
# Change visible=False to True (or remove it)
input_box = gr.Textbox(label="Input", visible=True)
output_box = gr.Markdown(label="Response", visible=True)
btn = gr.Button("Submit", visible=True)
btn.click(
fn=generate_with_history,
inputs=[input_box, history_state],
outputs=[output_box, history_state],
api_name="generate"
)
if __name__ == "__main__":
demo.launch()