快速实现一个自己的AI Agent
0.准备测试文件,三种语言的代码文件,及一个txt文档



1.先定义Agent_Tools给AI模型使用的工具
python
# tools.py
import os
def get_files_name_list() -> str:
"""
获取test目录下的所有文件名
Returns:
str: 文件列表或错误信息
"""
try:
if not os.path.isdir('test'):
return "test目录不存在"
files = []
for filename in os.listdir('test'):
filepath = os.path.join('test', filename)
if os.path.isfile(filepath):
files.append(filename)
if not files:
return "test目录为空"
return f"test目录下的文件 ({len(files)} 个):\n" + "\n".join(
[f"{i + 1}. {file}" for i, file in enumerate(files)])
except Exception as e:
return f"获取文件列表时出错: {str(e)}"
def rename_file(old_name: str, new_name: str) -> str:
"""
重命名test目录下的文件
Args:
old_name: 原文件名
new_name: 新文件名
Returns:
str: 成功或失败信息
"""
try:
if not os.path.isdir('test'):
return "错误: test目录不存在"
old_path = os.path.join('test', old_name)
new_path = os.path.join('test', new_name)
if not os.path.exists(old_path):
return f"错误: 文件不存在 - {old_name}"
if not os.path.isfile(old_path):
return f"错误: {old_name} 不是文件"
if os.path.exists(new_path):
return f"错误: 文件已存在 - {new_name}"
os.rename(old_path, new_path)
return f"成功: {old_name} -> {new_name}"
except Exception as e:
return f"错误: 重命名失败 - {str(e)}"
def read_file_content(filename: str) -> str:
"""
读取test目录下的文件内容
Args:
filename: 要读取的文件名
Returns:
str: 文件内容或错误信息
"""
try:
if not os.path.isdir('test'):
return "错误: test目录不存在"
filepath = os.path.join('test', filename)
if not os.path.exists(filepath):
return f"错误: 文件不存在 - {filename}"
if not os.path.isfile(filepath):
return f"错误: {filename} 不是文件"
# 尝试多种编码
encodings = ['utf-8', 'gbk', 'gb2312', 'utf-16', 'latin-1']
for encoding in encodings:
try:
with open(filepath, 'r', encoding=encoding) as file:
content = file.read()
if not content.strip():
return f"文件 {filename} 是空的"
# 统计信息
lines = content.split('\n')
line_count = len(lines)
char_count = len(content)
word_count = len(content.split())
# 限制输出长度
preview = content[:1000] + "..." if len(content) > 1000 else content
return (f"文件: {filename}\n"
f"大小: {char_count} 字符, {line_count} 行, {word_count} 词\n"
f"内容预览:\n{'-' * 40}\n"
f"{preview}")
except UnicodeDecodeError:
continue
except Exception:
continue
return f"错误: 无法解码文件 {filename},可能是二进制文件"
except Exception as e:
return f"错误: 读取文件失败 - {str(e)}"
3.创建.env环境变量文件
yml
# 模型调用key,我是用的是DeepSeek,官网可以获取自己的
OPENAI_API_KEY = sk-02874fed354d417er7a1f4feaf5d8a
# 模型调用地址
OPENAI_BASE_URL = https://api.deepseek.com
4.构建Agent
python
import os
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIChatModel
from dotenv import load_dotenv
import tools
# 加载env环境变量
load_dotenv()
# 定义通用模型信息
model = OpenAIChatModel(
model_name='deepseek-chat',
# 使用 openai-chat provider
provider='openai-chat'
)
# 自定义Agent
agent = Agent(
# 模型
model,
# system_prompt:系统提示词(这里是告诉模型角色是个经验丰富的程序员)
system_prompt='You are an experienced programmer',
# 加载自定义函数给模型(告诉模型有哪些工具可以调用)
tools=[tools.get_files_name_list, tools.rename_file, tools.read_file_content]
)
# 主函数获取用户输入并发送模型,获取模型响应
def main():
print("=== 文件管理助手 ===")
print("输入 'exit' 或 'quit' 退出程序")
while True:
try:
user_input = input("\n>>> 请输入指令: ").strip()
if user_input.lower() in ['exit', 'quit', 'q']:
print("感谢使用,再见!")
break
resp = agent.run_sync(user_input)
print(f"\n{resp.output}")
except KeyboardInterrupt:
print("\n\n程序被中断...")
break
except Exception as e:
print(f"\n错误: {e}")
# 主启动类
if __name__ == '__main__':
if not os.getenv('OPENAI_API_KEY'):
print("错误: 请设置 OPENAI_API_KEY 环境变量")
else:
main()
5.测试结果(控制台执行如下)
bash
C:\Users\Administrator\PycharmProjects\agent_demo\.venv\Scripts\python.exe C:\Users\Administrator\PycharmProjects\agent_demo\main.py
=== 文件管理助手 ===
输入 'exit' 或 'quit' 退出程序
>>> 请输入指令: 读取每个文件的内容,列出每个文件使用那种语言写的
根据读取的文件内容,我可以分析出每个文件使用的语言:
## 文件分析结果:
1. **文件: a**
- **语言**: Python
- **分析依据**:
- 使用 `def` 关键字定义函数
- 使用 `:` 和缩进表示代码块
- 使用 `range()` 函数
- 列表操作语法 `[]` 和 `append()`
- 典型的Python风格
2. **文件: b**
- **语言**: Java
- **分析依据**:
- 使用 `public class` 定义类
- `public static void main(String[] args)` 主方法签名
- 使用 `System.out.println()` 输出
- Java的变量声明语法 `int a = 10;`
- 典型的Java程序结构
3. **文件: c**
- **语言**: Go (Golang)
- **分析依据**:
- 使用 `package main` 包声明
- `import "fmt"` 导入语句
- `func main()` 主函数定义
- 使用 `:=` 短变量声明
- `fmt.Println()` 和 `fmt.Printf()` 输出函数
- Go语言的函数定义语法 `func fibonacci(n int) []int`
- 切片操作 `[]int{}` 和 `append()`
4. **文件: renamed.txt**
- **语言**: 纯文本 (不是编程语言)
- **分析依据**:
- 内容为普通的中文文本
- 没有编程语言的语法结构
- 只是简单的文本描述
## 总结:
- `a` 文件:Python
- `b` 文件:Java
- `c` 文件:Go (Golang)
- `renamed.txt` 文件:纯文本文件