Coverage for agentos/cli/errors.py: 17%

109 statements  

« prev     ^ index     » next       coverage.py v7.14.3, created at 2026-07-02 09:59 +0800

1""" 

2AgentOS CLI — 友好错误提示。 

3 

4所有面向用户的错误信息统一由本模块生成, 

5确保错误可读、有引导、有修复建议。 

6""" 

7 

8from __future__ import annotations 

9 

10import os 

11import sys 

12 

13 

14def _dim(text: str) -> str: 

15 """终端灰色文字。""" 

16 return f"\033[2m{text}\033[0m" 

17 

18 

19def _bold(text: str) -> str: 

20 return f"\033[1m{text}\033[0m" 

21 

22 

23def _yellow(text: str) -> str: 

24 return f"\033[33m{text}\033[0m" 

25 

26 

27def _red(text: str) -> str: 

28 return f"\033[31m{text}\033[0m" 

29 

30 

31def _green(text: str) -> str: 

32 return f"\033[32m{text}\033[0m" 

33 

34 

35def _cyan(text: str) -> str: 

36 return f"\033[36m{text}\033[0m" 

37 

38 

39# ── 错误场景定义 ────────────────────────────────────────── 

40 

41 

42def no_provider_configured(): 

43 """当没有任何 LLM Provider 配置 API Key 时。""" 

44 print() 

45 print(f" {_red('✗')} {_bold('未检测到 LLM API Key')}") 

46 print() 

47 print(f" AgentOS 需要至少一个 LLM 服务商的 API Key 才能运行。") 

48 print() 

49 print(f" 支持的服务商:") 

50 print(f" {_cyan('OpenAI')} — gpt-4o-mini / gpt-4o / o3-mini") 

51 print(f" {_cyan('DeepSeek')} — deepseek-chat / deepseek-reasoner") 

52 print(f" {_cyan('Anthropic')}— claude-sonnet-4 / claude-opus-4") 

53 print() 

54 print(f" {_bold('快速配置(推荐):')}") 

55 print(f" {_green('$ agentos init')}") 

56 print() 

57 print(f" 或手动设置环境变量:") 

58 print(f" export OPENAI_API_KEY=sk-xxx") 

59 print() 

60 sys.exit(1) 

61 

62 

63def single_provider_failed(provider_name: str, error: str = ""): 

64 """单一 Provider API 调用失败。""" 

65 print() 

66 print(f" {_red('✗')} {_bold(provider_name)} API 调用失败") 

67 if error: 

68 print(f" {_dim(error)}") 

69 print() 

70 print(f" 常见原因:") 

71 print(f" 1. API Key 过期或无效 → 运行 {_green('agentos init')} 重新配置") 

72 print(f" 2. 网络不通 → 检查代理/防火墙设置") 

73 print(f" 3. 余额不足 → 检查服务商账户余额") 

74 print() 

75 print(f" 或切换到其他 Provider:") 

76 print(f" export OPENAI_API_KEY=sk-xxx # 备用") 

77 print() 

78 sys.exit(1) 

79 

80 

81def all_providers_failed(failures: list[tuple[str, str]]): 

82 """所有已配置 Provider 都调用失败。""" 

83 print() 

84 print(f" {_red('✗')} {_bold('所有已配置的 LLM 服务商均调用失败')}") 

85 print() 

86 print(f" 失败列表:") 

87 for name, err in failures: 

88 print(f" - {_yellow(name)}: {_dim(err)}") 

89 print() 

90 print(f" 建议:") 

91 print(f" 1. 运行 {_green('agentos init')} 重新配置 API Key") 

92 print(f" 2. 检查网络连接和代理设置") 

93 print(f" 3. 检查各服务商账户余额") 

94 print() 

95 sys.exit(1) 

96 

97 

98def no_task_provided(): 

99 """没有提供任务描述。""" 

100 print() 

101 print(f" {_yellow('!')} 请提供任务描述。") 

102 print() 

103 print(f" 用法:") 

104 print(f" {_green('agentos run')} \"列出当前目录的文件\"") 

105 print(f" {_green('agentos')} \"写一个 Python 脚本用于...\"") 

106 print() 

107 print(f" 更多帮助:") 

108 print(f" {_green('agentos --help')}") 

109 print(f" {_green('agentos demo')} # 运行天气演示") 

110 print(f" {_green('agentos hello')} # 一分钟快速体验") 

111 print() 

112 sys.exit(1) 

113 

114 

115def feature_disabled(feature: str, mode: str = "当前运行模式"): 

116 """功能在当前模式下不可用。""" 

117 print() 

118 print(f" {_yellow('!')} {_bold(feature)} 在{mode}下暂不可用") 

119 print() 

120 print(f" 如需完整功能,请在桌面端运行 AgentOS。") 

121 print() 

122 

123 

124def import_error(module: str): 

125 """依赖缺失。""" 

126 print() 

127 print(f" {_red('✗')} 缺少依赖:{_bold(module)}") 

128 print() 

129 print(f" 修复:pip install nexus-agentos[{module}]") 

130 print(f" 或:pip install nexus-agentos[all]") 

131 print() 

132 

133 

134def config_error(message: str): 

135 """配置格式错误。""" 

136 print() 

137 print(f" {_red('✗')} 配置错误") 

138 print(f" {_dim(message)}") 

139 print() 

140 print(f" 运行 {_green('agentos init')} 可自动修复配置。") 

141 print() 

142 sys.exit(1) 

143 

144 

145def tool_execution_failed(tool_name: str, error: str): 

146 """工具执行失败。""" 

147 print() 

148 print(f" {_yellow('!')} 工具 {_yellow(tool_name)} 执行失败") 

149 print(f" {_dim(error)}") 

150 print() 

151 

152 

153def welcome(): 

154 """打印欢迎信息。""" 

155 from agentos import __version__ 

156 print(f" {_cyan('Nexus AgentOS')} v{__version__}") 

157 if os.environ.get("OPENAI_API_KEY") or os.environ.get("DEEPSEEK_API_KEY"): 

158 print(f" {_green('●')} 已配置 API Key,可以直接使用。") 

159 else: 

160 print(f" {_yellow('●')} 尚未配置 API Key,运行 agentos init 开始配置。") 

161 print()