Files
PythonLearn/01_python基础/1_14_python基础综合项目/agent_manager.py
2026-08-03 17:42:04 +08:00

195 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 1-14 课完整示例:命令行 Agent 管理系统
#
# 本项目综合使用变量、字符串、列表、字典、条件判断、循环和函数。
# 建议先运行程序体验功能,再按照讲义中的开发顺序阅读代码。
def print_separator():
"""输出分隔线,让菜单和结果更容易阅读。"""
print("=" * 30)
def print_menu():
"""输出主菜单;本函数只负责显示,不需要返回值。"""
print_separator()
print("命令行 Agent 管理系统")
print("1. 查看全部 Agent")
print("2. 新增 Agent")
print("3. 修改 Agent 状态")
print("4. 删除 Agent")
print("5. 查看 Agent 工具")
print("0. 退出程序")
print_separator()
def get_status_text(enabled):
"""把布尔状态转换成适合显示的中文文本。"""
if enabled:
return "启用"
return "停用"
def print_agents(agents):
"""按照统一格式输出列表中的全部 Agent。"""
if not agents:
print("当前没有 Agent。")
return
print("全部 Agent")
for number, agent in enumerate(agents, start=1):
status_text = get_status_text(agent["enabled"])
print(
f"{number}. {agent['name']}"
f"模型:{agent['model']}"
f"状态:{status_text}"
)
def find_agent_by_name(agents, name):
"""按名称查找 Agent找到时返回字典否则返回 None。"""
for agent in agents:
if agent["name"] == name:
return agent
return None
def parse_tools(tools_text):
"""把英文逗号分隔的文本转换成没有空字符串的工具列表。"""
tools = []
for tool in tools_text.split(","):
clean_tool = tool.strip()
# 只添加非空工具,同时避免同一个工具重复出现。
if clean_tool and clean_tool not in tools:
tools.append(clean_tool)
return tools
def add_agent(agents):
"""接收用户输入,检查名称后新增 Agent。"""
name = input("请输入 Agent 名称:").strip()
if not name:
print("Agent 名称不能为空。")
return
if find_agent_by_name(agents, name) is not None:
print("该 Agent 已存在。")
return
model = input("请输入模型名称:").strip()
tools_text = input("请输入工具,多个工具使用英文逗号分隔:")
tools = parse_tools(tools_text)
new_agent = {
"name": name,
"model": model,
"enabled": True,
"tools": tools,
}
agents.append(new_agent)
print("Agent 新增成功。")
def change_agent_status(agents):
"""查找指定 Agent并反转它的启用状态。"""
name = input("请输入需要修改状态的 Agent 名称:").strip()
agent = find_agent_by_name(agents, name)
if agent is None:
print("未找到该 Agent。")
return
agent["enabled"] = not agent["enabled"]
status_text = get_status_text(agent["enabled"])
print(f"状态修改成功,当前状态:{status_text}")
def delete_agent(agents):
"""查找并删除指定 Agent。"""
name = input("请输入需要删除的 Agent 名称:").strip()
agent = find_agent_by_name(agents, name)
if agent is None:
print("未找到该 Agent。")
return
agents.remove(agent)
print("Agent 已删除。")
def print_agent_tools(agents):
"""输出指定 Agent 的全部工具。"""
name = input("请输入需要查看工具的 Agent 名称:").strip()
agent = find_agent_by_name(agents, name)
if agent is None:
print("未找到该 Agent。")
return
tools = agent.get("tools", [])
if not tools:
print("该 Agent 暂无工具。")
return
print(f"{agent['name']}的工具:")
for number, tool in enumerate(tools, start=1):
print(f"{number}. {tool}")
def create_initial_agents():
"""创建程序启动时使用的初始 Agent 数据。"""
return [
{
"name": "代码助手",
"model": "gpt-5",
"enabled": True,
"tools": ["搜索", "终端"],
},
{
"name": "聊天助手",
"model": "o3",
"enabled": False,
"tools": ["搜索"],
},
]
def main():
"""创建数据并通过循环组织整个菜单流程。"""
agents = create_initial_agents()
while True:
print_menu()
choice = input("请输入菜单编号:").strip()
if choice == "1":
print_agents(agents)
elif choice == "2":
add_agent(agents)
elif choice == "3":
change_agent_status(agents)
elif choice == "4":
delete_agent(agents)
elif choice == "5":
print_agent_tools(agents)
elif choice == "0":
print("程序已退出。")
break
else:
print("无效选项,请重新输入。")
# 只有直接运行当前文件时才启动菜单。
# 后续“模块与包”课程会进一步解释 __name__ 的作用。
if __name__ == "__main__":
main()