Spaces:
Running
Running
from .search import GoogleSearch | |
from .vqa import VQA | |
from .image_gen import Dalle3 | |
from .llm import LLM | |
from .ppt_gen import SlideAgent | |
from pptx.util import Inches, Pt | |
from pptx.dml.color import RGBColor | |
from pptx.enum.text import MSO_AUTO_SIZE | |
from pptx.dml.color import RGBColor | |
def search_result(question: str, screenshot_path: str = "screenshot.png") -> str: | |
""" | |
Search a question on Google, and take a screenshot of the search result. | |
Save the screenshot to screenshot_path, and return the path. | |
""" | |
return GoogleSearch.search_result(question, screenshot_path) | |
def search_image(query: str, save_path: str = 'top_images') -> str: | |
""" | |
Search for an image on Google and download the result to download_path. | |
Return download_path. | |
""" | |
return GoogleSearch.search_image(query, save_path) | |
def get_answer(question: str) -> str: | |
""" | |
Calls the LLM by inputing a question, | |
then get the response of the LLM as the answer | |
""" | |
return LLM.get_answer(question) | |
def get_code(request:str, examples:str = "") -> str: | |
""" | |
Calls the LLM to generate code for a request. | |
request: the task that the model should conduct | |
examples: few-shot code examples for the request | |
""" | |
return LLM.get_answer(request, examples) | |
def generate_image(key: str, query: str, save_path: str = "downloaded_image.png") -> str: | |
""" | |
Generate an image based on a text query, save the image to the save_path | |
Return the path of the saved image. | |
""" | |
return Dalle3.generate_image(key, query, save_path) | |
def add_title( | |
slide, text: str, font_size: int = 44, | |
font_color: tuple[int, int, int] = (0, 0, 0), | |
background_color: tuple[int, int, int] = None, | |
): | |
"""Add a title text to the slide with custom font size and font color (RGB tuple). | |
Args: | |
slide: Slide object as in pptx library | |
text: str, Title text to be added | |
font_size: int, Font size in int (point size), e.g., 44 | |
font_color: tuple(int,int,int), RGB color, e.g., (0, 0, 0) | |
background_color: Optional, tuple(int,int,int), RGB color, e.g., (255, 255, 255) | |
Rets: | |
slide: Slide object with the title added | |
""" | |
title_shape = slide.shapes.title | |
if title_shape is None: | |
# Add a new text box as the title if no placeholder is found | |
title_shape = slide.shapes.add_textbox(Inches(1), Inches(0.5), Inches(8), Inches(1)) | |
title_shape.text = text | |
for paragraph in title_shape.text_frame.paragraphs: | |
paragraph.font.size = Pt(font_size) | |
paragraph.font.color.rgb = RGBColor(*font_color) | |
if background_color is not None: | |
title_shape.fill.solid() | |
title_shape.fill.fore_color.rgb = RGBColor(*background_color) | |
return slide | |
def add_text( | |
slide, text: str, coords: list[float], | |
font_size: int = 20, bold: bool = False, | |
color: tuple[int, int, int] = (0, 0, 0), | |
background_color: tuple[int, int, int] = None, | |
auto_size: bool = True, | |
): | |
"""Add a text box at a specified location with custom text and color settings. | |
Args: | |
slide: Slide object as in pptx library | |
text: str, Text to be added | |
coords: list(float), [left, top, width, height] in inches | |
font_size: int, Font size in int (point size), e.g., 20 | |
bold: bool, True if bold-type the text, False otherwise | |
color: tuple(int,int,int), RGB color, e.g., (0, 0, 0) | |
background_color: Optional, tuple(int,int,int), RGB color, e.g., (255, 255, 255) | |
auto_size: bool, True if auto-size the text box, False otherwise | |
Rets: | |
slide: Slide object with the text box added | |
""" | |
# Create the text box shape | |
left, top, width, height = coords | |
text_box = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height)) | |
# Set background color if provided | |
if background_color: | |
text_box.fill.solid() | |
text_box.fill.fore_color.rgb = RGBColor(*background_color) | |
else: | |
text_box.fill.background() # No fill if no color is specified | |
# Handle line breaks and adjust height | |
lines = text.split("\n") | |
adjusted_height = height * len(lines) # Adjust height based on the number of lines | |
text_box.height = Inches(adjusted_height) | |
# Set text and format it | |
text_frame = text_box.text_frame | |
text_frame.word_wrap = True | |
if auto_size: | |
text_frame.auto_size = MSO_AUTO_SIZE.SHAPE_TO_FIT_TEXT # Automatically fit the text box to the text | |
p = text_frame.add_paragraph() | |
p.text = text | |
p.font.size = Pt(font_size) | |
p.font.bold = bold | |
p.font.color.rgb = RGBColor(*color) | |
return slide | |
def add_bullet_points( | |
slide, bullet_points: list[str], coords: list[float], | |
font_size: int = 18, color: tuple[int, int, int] = (0, 0, 0), | |
background_color: tuple[int, int, int] = None, | |
): | |
"""Add a text box with bullet points. | |
Args: | |
slide: Slide object as in pptx library | |
bullet_points: list(str), List of texts to be added as bullet points | |
coords: list(float), [left, top, width, height] in inches | |
font_size: int, Font size in int (point size), e.g., 18 | |
color: tuple(int,int,int), RGB color, e.g., (0, 0, 0) | |
background_color: Optional, tuple(int,int,int), RGB color, e.g., (255, 255, 255) | |
Rets: | |
slide: Slide object with the bullet points added | |
""" | |
left, top, width, height = coords | |
text_box = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height)) | |
# Set background color if provided | |
if background_color: | |
text_box.fill.solid() | |
text_box.fill.fore_color.rgb = RGBColor(*background_color) | |
else: | |
text_box.fill.background() # No fill if no color is specified | |
text_frame = text_box.text_frame | |
text_frame.word_wrap = True | |
text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE | |
for point in bullet_points: | |
p = text_frame.add_paragraph() | |
p.text = point | |
p.font.size = Pt(font_size) | |
p.font.color.rgb = RGBColor(*color) | |
# p.level = bullet_points.index(point) | |
return slide | |
def add_image(slide, image_path: str, coords: list[float]): | |
"""Add an image in the provided path to the specified coords and sizes. | |
Args: | |
slide: Slide object as in pptx library | |
image_path: str, Path to the image file | |
coords: list(float), [left, top, width, height] in inches | |
Rets: | |
slide: Slide object with the image added | |
""" | |
left, top, width, height = coords | |
slide.shapes.add_picture(image_path, Inches(left), Inches(top), Inches(width), Inches(height)) | |
return slide | |
def set_background_color(slide, color: tuple[int, int, int]): | |
"""Set background color for the current slide. | |
Args: | |
slide: Slide object as in pptx library | |
color: tuple(int, int, int), RGB color, e.g., (255, 255, 255) | |
Returns: | |
modified slide object | |
""" | |
fill = slide.background.fill | |
fill.solid() | |
fill.fore_color.rgb = RGBColor(*color) # Convert tuple to RGBColor | |
return slide |