genai-design-marketing-studio/generative.py (94 lines of code) (raw):

# Copyright 2024 Google, LLC. This software is provided as-is, # without warranty or representation for any use or purpose. Your # use of it is subject to your agreement with Google. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from vertexai.generative_models import GenerativeModel, Part, SafetySetting, GenerationConfig, FinishReason, Tool from vertexai.preview.vision_models import ImageGenerationModel import vertexai.generative_models as generative_models import vertexai import base64 # configuration parameters generation_config = { "max_output_tokens": 8192, "temperature": 1, "top_p": 0.95, } # safety setting safety_settings = [ SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH ), SafetySetting( category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT, threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH ), ] # tool for answers grounding tools = [ Tool.from_google_search_retrieval( google_search_retrieval=generative_models.grounding.GoogleSearchRetrieval() ) ] def generate_llm(model_name: str, system_instruction: str, prompt: str) -> tuple: """ Generic interface for LLM applications :param model_name: name of the model to be used as string :param system_instruction: system instruction as string :param prompt: instructions as string :return: (generated output as string, grounding information) """ # Init the model model = GenerativeModel( model_name, system_instruction=[system_instruction] ) # Get the response response = model.generate_content( [prompt], generation_config = GenerationConfig( temperature=0.0, ), safety_settings=safety_settings, tools=tools, stream=False ) return (response.text, response.candidates[0].grounding_metadata.search_entry_point.rendered_content) def generate_lmm(model_name: str, system_instruction: str, prompt: str, uploaded_metadata: tuple) -> str: """ Generic interface for LMM applications :param model_name: name of the model to be used as string :param system_instruction: system instruction as string :param prompt: instructions as string :param uploaded_metadata: (mime-type, image gcs uri) :return: generated output as string """ # Init the model model = GenerativeModel( model_name, system_instruction=[system_instruction] ) mime_type, uri = uploaded_metadata # Encode the image content image = Part.from_uri( mime_type=mime_type, uri=uri ) # Get the response response = model.generate_content( [image, prompt], generation_config=generation_config, safety_settings=safety_settings, stream=False ) return (response.text) def create_chat_session(model_name: str, system_instruction: str): """ Create a new chat session :param model_name: model name as string :param system_instruction: system instruction as string :return: chat session """ model = GenerativeModel( model_name=model_name, generation_config=generation_config, safety_settings=safety_settings, system_instruction=[system_instruction] ) return model.start_chat(history=[]) def generate_images( model_name: str, prompt: str, number_of_images: int=1, aspect_ratio: str = "1:1", person_generation="allow_all", watermarking: bool=False ): """ Generate Images following prompt. :param model_name: name of the generative model :param prompt: instructions :param number_of_images: number of images to be generated :param aspect_ratio: aspect ratio of the generated images :param person_generation: authorization for person generation :param watermarking: add watermark if True :return: list of images """ # setup of the safety filter safety_filter="block_some" imagen_model = ImageGenerationModel.from_pretrained( model_name ) # generate the images images = imagen_model.generate_images( prompt=prompt, number_of_images=number_of_images, aspect_ratio=aspect_ratio, safety_filter_level=safety_filter, person_generation=person_generation, add_watermark=watermarking ) return images