Coverage for agentos/config/presets.py: 69%

32 statements  

« prev     ^ index     » next       coverage.py v7.14.3, created at 2026-07-06 19:15 +0800

1""" 

2Config Presets — Ready-to-use configuration profiles for common AgentOS scenarios. # noqa: E501 

3 

4Each preset provides sensible defaults for specific use cases: 

5development, production, testing, and budget-constrained environments. 

6""" 

7 

8from __future__ import annotations 

9 

10from dataclasses import dataclass 

11 

12 

13@dataclass 

14class AgentOSPreset: 

15 """A named preset configuration for AgentOS.""" 

16 

17 name: str 

18 description: str 

19 model: str = "gpt-4o-mini" 

20 max_iterations: int = 10 

21 temperature: float = 0.7 

22 enable_cache: bool = True 

23 enable_rate_limit: bool = True 

24 enable_guardrails: bool = False 

25 enable_streaming: bool = False 

26 enable_cost_tracking: bool = True 

27 memory_window_size: int = 20 

28 max_retries: int = 3 

29 log_level: str = "INFO" 

30 

31 

32PRESETS: dict[str, AgentOSPreset] = { 

33 "development": AgentOSPreset( 

34 name="development", 

35 description="Local development with verbose logging, guardrails disabled, and GPT-4o-mini for fast iteration.", 

36 model="gpt-4o-mini", 

37 max_iterations=15, 

38 temperature=0.8, 

39 enable_cache=True, 

40 enable_rate_limit=False, 

41 enable_guardrails=False, 

42 enable_streaming=True, 

43 enable_cost_tracking=True, 

44 memory_window_size=30, 

45 max_retries=2, 

46 log_level="DEBUG", 

47 ), 

48 "production": AgentOSPreset( 

49 name="production", 

50 description="Production deployment with guardrails, rate limiting, and cost tracking. Uses GPT-4o for reliability.", # noqa: E501 

51 model="gpt-4o", 

52 max_iterations=20, 

53 temperature=0.3, 

54 enable_cache=True, 

55 enable_rate_limit=True, 

56 enable_guardrails=True, 

57 enable_streaming=False, 

58 enable_cost_tracking=True, 

59 memory_window_size=50, 

60 max_retries=5, 

61 log_level="WARNING", 

62 ), 

63 "testing": AgentOSPreset( 

64 name="testing", 

65 description="Testing environment with determinism (temperature=0), guardrails off, and mock-friendly settings.", 

66 model="gpt-4o-mini", 

67 max_iterations=5, 

68 temperature=0.0, 

69 enable_cache=False, 

70 enable_rate_limit=False, 

71 enable_guardrails=False, 

72 enable_streaming=False, 

73 enable_cost_tracking=False, 

74 memory_window_size=10, 

75 max_retries=1, 

76 log_level="ERROR", 

77 ), 

78 "budget": AgentOSPreset( 

79 name="budget", 

80 description="Cost-optimized: GPT-4o-mini, minimal iterations, aggressive caching, rate limits enabled.", 

81 model="gpt-4o-mini", 

82 max_iterations=5, 

83 temperature=0.5, 

84 enable_cache=True, 

85 enable_rate_limit=True, 

86 enable_guardrails=True, 

87 enable_streaming=False, 

88 enable_cost_tracking=True, 

89 memory_window_size=10, 

90 max_retries=2, 

91 log_level="WARNING", 

92 ), 

93 "creative": AgentOSPreset( 

94 name="creative", 

95 description="Creative mode: high temperature, streaming, Claude 3.5 Sonnet for nuanced output.", 

96 model="claude-3.5-sonnet", 

97 max_iterations=12, 

98 temperature=0.95, 

99 enable_cache=True, 

100 enable_rate_limit=False, 

101 enable_guardrails=False, 

102 enable_streaming=True, 

103 enable_cost_tracking=True, 

104 memory_window_size=25, 

105 max_retries=3, 

106 log_level="INFO", 

107 ), 

108 "deep_research": AgentOSPreset( 

109 name="deep_research", 

110 description="Deep research: Claude 3 Opus, many iterations, large memory window, guardrails off for exploration.", # noqa: E501 

111 model="claude-3-opus", 

112 max_iterations=30, 

113 temperature=0.4, 

114 enable_cache=True, 

115 enable_rate_limit=True, 

116 enable_guardrails=False, 

117 enable_streaming=False, 

118 enable_cost_tracking=True, 

119 memory_window_size=80, 

120 max_retries=5, 

121 log_level="INFO", 

122 ), 

123 "gemini_fast": AgentOSPreset( 

124 name="gemini_fast", 

125 description="High-speed: Gemini 2.0 Flash, many iterations, streaming enabled, minimal cost.", 

126 model="gemini-2.0-flash", 

127 max_iterations=25, 

128 temperature=0.7, 

129 enable_cache=True, 

130 enable_rate_limit=True, 

131 enable_guardrails=True, 

132 enable_streaming=True, 

133 enable_cost_tracking=True, 

134 memory_window_size=40, 

135 max_retries=4, 

136 log_level="INFO", 

137 ), 

138 "gemini_pro": AgentOSPreset( 

139 name="gemini_pro", 

140 description="Gemini Pro with 2M context: massive memory window, guardrails enabled, streaming.", 

141 model="gemini-1.5-pro", 

142 max_iterations=20, 

143 temperature=0.5, 

144 enable_cache=True, 

145 enable_rate_limit=True, 

146 enable_guardrails=True, 

147 enable_streaming=True, 

148 enable_cost_tracking=True, 

149 memory_window_size=100, 

150 max_retries=4, 

151 log_level="INFO", 

152 ), 

153} 

154 

155 

156def get_preset(name: str) -> AgentOSPreset | None: 

157 """Get a preset by name. Returns None if not found.""" 

158 return PRESETS.get(name.lower()) 

159 

160 

161def list_presets() -> list[AgentOSPreset]: 

162 """List all available presets.""" 

163 return list(PRESETS.values()) 

164 

165 

166def get_preset_names() -> list[str]: 

167 """List all preset names.""" 

168 return list(PRESETS.keys()) 

169 

170 

171def apply_preset(preset_name: str, config: dict) -> dict: 

172 """ 

173 Apply a preset to an existing config dict. 

174 

175 Only overrides keys present in the preset; preserves all other keys. 

176 

177 Args: 

178 preset_name: Name of the preset to apply. 

179 config: Existing configuration dict. 

180 

181 Returns: 

182 Updated configuration dict. 

183 """ 

184 preset = get_preset(preset_name) 

185 if not preset: 

186 raise ValueError(f"Unknown preset: '{preset_name}'. Available: {list(PRESETS.keys())}") 

187 

188 mapping = { 

189 "model": "model", 

190 "max_iterations": "max_iterations", 

191 "temperature": "temperature", 

192 "enable_cache": "enable_cache", 

193 "enable_rate_limit": "enable_rate_limit", 

194 "enable_guardrails": "enable_guardrails", 

195 "enable_streaming": "enable_streaming", 

196 "enable_cost_tracking": "enable_cost_tracking", 

197 "memory_window_size": "memory_window_size", 

198 "max_retries": "max_retries", 

199 "log_level": "log_level", 

200 } 

201 

202 for preset_key, config_key in mapping.items(): 

203 config[config_key] = getattr(preset, preset_key) 

204 

205 return config