docker demo, migration, speedup inference using cv2
This commit is contained in:
109
demo/gui_agent/llm_utils/llm_utils.py
Normal file
109
demo/gui_agent/llm_utils/llm_utils.py
Normal file
@@ -0,0 +1,109 @@
|
||||
import os
|
||||
import re
|
||||
import ast
|
||||
import base64
|
||||
|
||||
|
||||
def is_image_path(text):
|
||||
# Checking if the input text ends with typical image file extensions
|
||||
image_extensions = (".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".tif")
|
||||
if text.endswith(image_extensions):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def encode_image(image_path):
|
||||
"""Encode image file to base64."""
|
||||
with open(image_path, "rb") as image_file:
|
||||
return base64.b64encode(image_file.read()).decode("utf-8")
|
||||
|
||||
|
||||
def is_url_or_filepath(input_string):
|
||||
# Check if input_string is a URL
|
||||
url_pattern = re.compile(
|
||||
r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
|
||||
)
|
||||
if url_pattern.match(input_string):
|
||||
return "URL"
|
||||
|
||||
# Check if input_string is a file path
|
||||
file_path = os.path.abspath(input_string)
|
||||
if os.path.exists(file_path):
|
||||
return "File path"
|
||||
|
||||
return "Invalid"
|
||||
|
||||
|
||||
def extract_data(input_string, data_type):
|
||||
# Regular expression to extract content starting from '```python' until the end if there are no closing backticks
|
||||
pattern = f"```{data_type}" + r"(.*?)(```|$)"
|
||||
# Extract content
|
||||
# re.DOTALL allows '.' to match newlines as well
|
||||
matches = re.findall(pattern, input_string, re.DOTALL)
|
||||
# Return the first match if exists, trimming whitespace and ignoring potential closing backticks
|
||||
return matches[0][0].strip() if matches else input_string
|
||||
|
||||
|
||||
def parse_input(code):
|
||||
"""Use AST to parse the input string and extract the function name, arguments, and keyword arguments."""
|
||||
|
||||
def get_target_names(target):
|
||||
"""Recursively get all variable names from the assignment target."""
|
||||
if isinstance(target, ast.Name):
|
||||
return [target.id]
|
||||
elif isinstance(target, ast.Tuple):
|
||||
names = []
|
||||
for elt in target.elts:
|
||||
names.extend(get_target_names(elt))
|
||||
return names
|
||||
return []
|
||||
|
||||
def extract_value(node):
|
||||
"""提取 AST 节点的实际值"""
|
||||
if isinstance(node, ast.Constant):
|
||||
return node.value
|
||||
elif isinstance(node, ast.Name):
|
||||
# TODO: a better way to handle variables
|
||||
raise ValueError(
|
||||
f"Arguments should be a Constant, got a variable {node.id} instead."
|
||||
)
|
||||
# 添加其他需要处理的 AST 节点类型
|
||||
return None
|
||||
|
||||
try:
|
||||
tree = ast.parse(code)
|
||||
for node in ast.walk(tree):
|
||||
if isinstance(node, ast.Assign):
|
||||
targets = []
|
||||
for t in node.targets:
|
||||
targets.extend(get_target_names(t))
|
||||
if isinstance(node.value, ast.Call):
|
||||
func_name = node.value.func.id
|
||||
args = [ast.dump(arg) for arg in node.value.args]
|
||||
kwargs = {
|
||||
kw.arg: extract_value(kw.value) for kw in node.value.keywords
|
||||
}
|
||||
print(f"Input: {code.strip()}")
|
||||
print(f"Output Variables: {targets}")
|
||||
print(f"Function Name: {func_name}")
|
||||
print(f"Arguments: {args}")
|
||||
print(f"Keyword Arguments: {kwargs}")
|
||||
elif isinstance(node, ast.Expr) and isinstance(node.value, ast.Call):
|
||||
targets = []
|
||||
func_name = extract_value(node.value.func)
|
||||
args = [extract_value(arg) for arg in node.value.args]
|
||||
kwargs = {kw.arg: extract_value(kw.value) for kw in node.value.keywords}
|
||||
|
||||
except SyntaxError:
|
||||
print(f"Input: {code.strip()}")
|
||||
print("No match found")
|
||||
|
||||
return targets, func_name, args, kwargs
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import json
|
||||
s='{"Reasoning": "The Docker icon has been successfully clicked, and the Docker application should now be opening. No further actions are required.", "Next Action": None}'
|
||||
json_str = json.loads(s)
|
||||
print(json_str)
|
||||
Reference in New Issue
Block a user