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()