|
|
|
|
|
""" |
|
|
Created on Sat Oct 26 15:35:19 2024 |
|
|
|
|
|
@author: BM109X32G-10GPU-02 |
|
|
""" |
|
|
|
|
|
from langchain_community.embeddings import OllamaEmbeddings |
|
|
from langchain.tools import BaseTool |
|
|
from langchain_openai import ChatOpenAI |
|
|
from langchain_core.messages import HumanMessage, SystemMessage |
|
|
from langchain.base_language import BaseLanguageModel |
|
|
import base64 |
|
|
from io import BytesIO |
|
|
from PIL import Image |
|
|
import os |
|
|
|
|
|
|
|
|
def convert_to_base64(pil_image): |
|
|
buffered = BytesIO() |
|
|
pil_image.save(buffered, format="PNG") |
|
|
img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") |
|
|
return img_str |
|
|
|
|
|
|
|
|
class Imageanalysis(BaseTool): |
|
|
name: str = "Imageanalysis" |
|
|
description: str = ( |
|
|
"Useful to answer questions according to the image, figure, diagram or graph. " |
|
|
"Useful to analysis the information in the image, figure, diagram or graph. " |
|
|
"Input query about image/figure/graph/diagram, return the response" |
|
|
) |
|
|
return_direct: bool = True |
|
|
llm: BaseLanguageModel = None |
|
|
path : str = None |
|
|
|
|
|
def __init__(self, path): |
|
|
super().__init__( ) |
|
|
self.llm = ChatOpenAI(model="gpt-5",api_key=os.getenv("OPENAI_API_KEY"), |
|
|
base_url=os.getenv("OPENAI_API_BASE")) |
|
|
self.path = path |
|
|
|
|
|
|
|
|
def _run(self, query ) -> str: |
|
|
try: |
|
|
pil_image = Image.open(self.path) |
|
|
rgb_im = pil_image.convert('RGB') |
|
|
image_b64 = convert_to_base64(pil_image) |
|
|
message = HumanMessage( |
|
|
content=[ |
|
|
{"type": "text", "text": query}, |
|
|
{ |
|
|
"type": "image_url", |
|
|
"image_url": {"url":f"data:image/jpeg;base64,{image_b64}"}, |
|
|
}, |
|
|
],) |
|
|
response = self.llm.invoke([message]) |
|
|
return response.content |
|
|
|
|
|
except Exception as e: |
|
|
return str(e) |
|
|
|
|
|
|
|
|
async def _arun(self, query) -> str: |
|
|
"""Use the tool asynchronously.""" |
|
|
raise NotImplementedError("this tool does not support async") |
|
|
|
|
|
|