1"""

2 AgentOS CLI — 友好错误提示。

3

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

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

6"""

7

8 from __future__ import annotations

9

10 import os

11 import sys

12

13

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

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

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

17

18

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

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

21

22

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

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

25

26

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

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

29

30

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

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

33

34

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

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

37

38

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

40

41

42 def 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

63 def 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

81 def 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

98 def 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

115 def 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

124 def 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

134 def 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

145 def 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

153 def 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()