Spaces:
Sleeping
Sleeping
File size: 7,088 Bytes
9b5b26a c19d193 6aae614 8fe992b 9b5b26a 5df72d6 9b5b26a 3d1237b 9b5b26a 8c01ffb 68f6b9e 8c01ffb 6aae614 ae7a494 e121372 bf6d34c 29ec968 fe328e0 13d500a 8c01ffb 9b5b26a 8c01ffb 861422e 9b5b26a 8c01ffb 8fe992b d2f6a24 8c01ffb 861422e 8fe992b 9b5b26a 8c01ffb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
# Below is an example of a tool that does nothing. Amaze us with your creativity !
@tool
def my_custom_tool(arg1:str, arg2:int)-> str: #it's import to specify the return type
#Keep this format for the description / args / args description but feel free to modify the tool
"""A tool that does nothing yet
Args:
arg1: the first argument
arg2: the second argument
"""
return "What magic will you build ?"
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""A tool that fetches the current local time in a specified timezone.
Args:
timezone: A string representing a valid timezone (e.g., 'America/New_York').
"""
try:
# Create timezone object
tz = pytz.timezone(timezone)
# Get current time in that timezone
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"The current local time in {timezone} is: {local_time}"
except Exception as e:
return f"Error fetching time for timezone '{timezone}': {str(e)}"
import numpy as np
@tool
def matrix_multiplication(matrix_a: list[list[float]], matrix_b: list[list[float]]) -> list[list[float]]:
"""计算两个矩阵的乘积。
此工具接受两个矩阵(表示为浮点数列表的列表)作为输入,并返回它们的乘积。
它要求矩阵是有效的乘法(即,第一个矩阵的列数必须等于第二个矩阵的行数)。
Args:
matrix_a: 第一个矩阵,表示为浮点数列表的列表。
matrix_b: 第二个矩阵,表示为浮点数列表的列表。
"""
try:
# 将列表的列表转换为 numpy 数组以实现高效的矩阵乘法
np_matrix_a = np.array(matrix_a)
np_matrix_b = np.array(matrix_b)
# 执行矩阵乘法
result_matrix = np.matmul(np_matrix_a, np_matrix_b)
# 将结果转换回列表的列表以符合返回类型
return result_matrix.tolist()
except ValueError as e:
# 处理矩阵维度不兼容导致无法乘法的情况
raise ValueError(f"矩阵乘法错误:{e}。请确保第一个矩阵的列数等于第二个矩阵的行数。")
except Exception as e:
# 捕获任何其他意外错误
raise Exception(f"矩阵乘法过程中发生意外错误:{e}")
import numpy as np
from decimal import Decimal, getcontext # 用于精确控制小数位数
@tool
def solve_linear_equations(coefficients: list[list[float]], constants: list[float]) -> dict:
"""求解多元一次线性方程组。
此工具接受一个系数矩阵和一个常数向量作为输入,并尝试求解由它们表示的线性方程组。
方程组的通用形式为 Ax = B,其中 A 是 coefficients,B 是 constants。
如果方程组有唯一的解,函数将返回一个字典,其中包含变量名(默认从 x1 开始)和它们对应的解。
解会以字符串形式表示,对于浮点数保留两位小数。
Args:
coefficients: 系数矩阵,表示为浮点数列表的列表。例如,对于 2x + 3y = 7, x - y = 1,
系数矩阵为 [[2, 3], [1, -1]]。
constants: 常数向量,表示为浮点数的列表。例如,对于上述方程组,常数向量为 [7, 1]。
"""
try:
np_coefficients = np.array(coefficients)
np_constants = np.array(constants)
# 检查矩阵是否为方阵,以及常数向量的维度是否匹配
if np_coefficients.shape[0] != np_coefficients.shape[1]:
raise ValueError("系数矩阵必须是方阵(行数和列数必须相等),才能有唯一解。")
if np_coefficients.shape[0] != np_constants.shape[0]:
raise ValueError("系数矩阵的行数必须与常数向量的元素数量相等。")
# 使用 numpy 求解线性方程组
solutions = np.linalg.solve(np_coefficients, np_constants)
# 设置 Decimal 的精度,用于控制小数位数
getcontext().prec = 50 # 设置一个足够大的精度,以防止中间计算的损失
results = {}
for i, sol in enumerate(solutions):
var_name = f"x_{i+1}"
# 使用 Decimal 进行精确的四舍五入到两位小数
# 先转换为 Decimal,然后使用 quantize 方法
decimal_sol = Decimal(str(sol)) # 将浮点数转换为字符串再转换为Decimal,以避免浮点数精度问题
# 将小数部分量化到小数点后两位
# ROUND_HALF_UP 是四舍五入到最近的值,如果距离相等,则向上进位
# '0.01' 表示两位小数的精度
formatted_sol = decimal_sol.quantize(Decimal('0.01'), rounding='ROUND_HALF_UP')
# 检查是否为整数或者浮点数
if formatted_sol == formatted_sol.to_integral_value():
# 如果是整数,显示为整数
results[var_name] = str(int(formatted_sol))
else:
# 否则,显示为两位小数
results[var_name] = str(formatted_sol)
# 注意此版本不直接处理“分式”输出。如果需要分式,需要使用类似 SymPy 的符号计算库。
# 这里对于小数,我们提供格式化为两位小数的字符串。
return results
except np.linalg.LinAlgError:
# 捕获方程组无解或有无穷多解的情况
raise ValueError("方程组无唯一解(可能无解或有无穷多解)。")
except ValueError as e:
# 捕获因输入维度不匹配或其他问题引起的 ValueError
raise ValueError(f"输入错误:{e}")
except Exception as e:
# 捕获其他所有意外错误
raise Exception(f"求解线性方程组时发生意外错误:{e}")
final_answer = FinalAnswerTool()
# If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder:
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded
custom_role_conversions=None,
)
# Import tool from Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
agent = CodeAgent(
model=model,
tools=[final_answer], ## add your tools here (don't remove final answer)
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
GradioUI(agent).launch() |