| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | import jsonimport googleimport google.genaiclass gemini_search:    def __init__(self, apikey: str) -> None:        self.__apikey = apikey    @property    def __client(self) -> google.genai.Client:        return google.genai.Client(api_key = self.__apikey)    @property    def __model(self) -> str:        return "gemini-2.5-flash-preview-05-20"    def __user(self, barcode: str) -> google.genai.types.Content:        return google.genai.types.Content(            role = "user",            parts = [                google.genai.types.Part.from_text(                    text = barcode                )            ]        )    @property    def __instructions(self) -> str:        return (            "Find a product with the given EAN code. Write a short " \            + "description of this product (about 200 characters) in " \            + "the native language of the country where the product " \            + "comes from. Write only the truth."        )    @property    def __research(self) -> google.genai.types.GenerateContentConfig:        return google.genai.types.GenerateContentConfig(            response_mime_type = "text/plain",            thinking_config = google.genai.types.ThinkingConfig(                thinking_budget = 0,            ),            tools = [                google.genai.types.Tool(                    google_search = google.genai.types.GoogleSearch()                )            ],            system_instruction = [                google.genai.types.Part.from_text(                    text = self.__instructions                )            ]        )    @property    def __process(self) -> google.genai.types.GenerateContentConfig:        return google.genai.types.GenerateContentConfig(            thinking_config = google.genai.types.ThinkingConfig(                thinking_budget = 0,            ),            response_mime_type = "application/json",            response_schema = google.genai.types.Schema(                type = google.genai.types.Type.OBJECT,                required = ["title", "description", "author"],                properties = {                    "title": google.genai.types.Schema(                        type = google.genai.types.Type.STRING,                    ),                    "description": google.genai.types.Schema(                        type = google.genai.types.Type.STRING,                    ),                    "author": google.genai.types.Schema(                        type = google.genai.types.Type.STRING,                    ),                },            ),            system_instruction = [                google.genai.types.Part.from_text(                    text = self.__instructions                )            ],        )    def __request(        self,         barcode: str,        conf: google.genai.types.GenerateContentConfig,        addon: str | None = None    ) -> str:        content = ""        contents = [            self.__user(barcode)        ]        if addon is not None:            contents.append(                google.genai.types.Content(                    role = "model",                    parts = [                        google.genai.types.Part.from_text(                            text = addon                        )                    ]                )            )            contents.append(                self.__user(barcode)            )        for count in self.__client.models.generate_content_stream(            model = self.__model,            contents = contents,            config = conf        ):            content = content + count.text        return content    def search(self, barcode: str) -> dict:        research = self.__request(barcode, self.__research)        model = self.__request(barcode, self.__process, research)        return json.loads(model)    
 |