feat(python基础): 完成基础综合项目
This commit is contained in:
194
01_python基础/1_14_python基础综合项目/agent_manager.py
Normal file
194
01_python基础/1_14_python基础综合项目/agent_manager.py
Normal file
@@ -0,0 +1,194 @@
|
||||
# 第 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()
|
||||
Reference in New Issue
Block a user