Spaces:
Running
on
Zero
Running
on
Zero
from typing import List, Union, Optional | |
from indexify_extractor_sdk import Content, Extractor, Feature | |
from pydantic import BaseModel, Field | |
import os | |
import google.generativeai as genai | |
from pdf2image import convert_from_path | |
import tempfile | |
import mimetypes | |
class GeminiExtractorConfig(BaseModel): | |
model_name: Optional[str] = Field(default='gemini-1.5-flash-latest') | |
key: Optional[str] = Field(default=None) | |
prompt: str = Field(default='You are a helpful assistant.') | |
query: Optional[str] = Field(default=None) | |
class GeminiExtractor(Extractor): | |
name = "tensorlake/gemini" | |
description = "An extractor that let's you use LLMs from Gemini." | |
system_dependencies = [] | |
input_mime_types = ["text/plain", "application/pdf", "image/jpeg", "image/png"] | |
def __init__(self): | |
super(GeminiExtractor, self).__init__() | |
def extract(self, content: Content, params: GeminiExtractorConfig) -> List[Union[Feature, Content]]: | |
contents = [] | |
model_name = params.model_name | |
key = params.key | |
prompt = params.prompt | |
query = params.query | |
if content.content_type in ["application/pdf"]: | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_file: | |
temp_file.write(content.data) | |
file_path = temp_file.name | |
images = convert_from_path(file_path) | |
image_files = [] | |
for i in range(len(images)): | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_image_file: | |
images[i].save(temp_image_file.name, 'JPEG') | |
image_files.append(temp_image_file.name) | |
elif content.content_type in ["image/jpeg", "image/png"]: | |
image_files = [] | |
suffix = mimetypes.guess_extension(content.content_type) | |
with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as temp_image_file: | |
temp_image_file.write(content.data) | |
file_path = temp_image_file.name | |
image_files.append(file_path) | |
else: | |
text = content.data.decode("utf-8") | |
if query is None: | |
query = text | |
file_path = None | |
def upload_to_gemini(path, mime_type=None): | |
file = genai.upload_file(path, mime_type=mime_type) | |
print(f"Uploaded file '{file.display_name}' as: {file.uri}") | |
return file | |
if ('GEMINI_API_KEY' not in os.environ) and (key is None): | |
response_content = "The GEMINI_API_KEY environment variable is not present." | |
else: | |
if ('GEMINI_API_KEY' in os.environ) and (key is None): | |
genai.configure(api_key=os.environ["GEMINI_API_KEY"]) | |
else: | |
genai.configure(api_key=key) | |
generation_config = { "temperature": 1, "top_p": 0.95, "top_k": 64, "max_output_tokens": 8192, "response_mime_type": "text/plain", } | |
model = genai.GenerativeModel( model_name=model_name, generation_config=generation_config, ) | |
if file_path: | |
files = [upload_to_gemini(image_file, mime_type="image/jpeg") for image_file in image_files] | |
chat_session = model.start_chat( history=[ { "role": "user", "parts": files, }, ] ) | |
response = chat_session.send_message(prompt) | |
else: | |
chat_session = model.start_chat( history=[ ] ) | |
response = chat_session.send_message(prompt + " " + query) | |
response_content = response.text | |
contents.append(Content.from_text(response_content)) | |
return contents |