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