models temp removed, deepseek reasoner support

frdel committed Jan 20, 2025 at 19:00 UTC 7a7d2eebc996af8d8ca03337db4c4d6c8364d526
6 files changed +39 -159
README.md
+2
@@ -14,6 +14,8 @@
14
15 </div>
16
17 +[![Browser Agent](/docs/res/081_vid.png)](https://youtu.be/quv145buW74)
18 +
19 > [!NOTE]
20 > **🎉 v0.8.1 Release**: Now featuring a browser agent capable of using Chromium for web interactions! This enables Agent Zero to browse the web, gather information, and interact with web content autonomously.
21
docs/res/081_vid.png
Binary files /dev/null and b/docs/res/081_vid.png differ
initialize.py
+4 -15
@@ -16,10 +16,7 @@ def initialize():
16 limit_requests=current_settings["chat_model_rl_requests"],
17 limit_input=current_settings["chat_model_rl_input"],
18 limit_output=current_settings["chat_model_rl_output"],
19 - kwargs={
20 - "temperature": current_settings["chat_model_temperature"],
21 - **current_settings["chat_model_kwargs"],
22 - },
19 + kwargs=current_settings["chat_model_kwargs"],
20 )
21
22 # utility model from user settings
@@ -30,29 +27,21 @@ def initialize():
27 limit_requests=current_settings["util_model_rl_requests"],
28 limit_input=current_settings["util_model_rl_input"],
29 limit_output=current_settings["util_model_rl_output"],
33 - kwargs={
34 - "temperature": current_settings["util_model_temperature"],
35 - **current_settings["util_model_kwargs"],
36 - },
30 + kwargs=current_settings["util_model_kwargs"],
31 )
32 # embedding model from user settings
33 embedding_llm = ModelConfig(
34 provider=models.ModelProvider[current_settings["embed_model_provider"]],
35 name=current_settings["embed_model_name"],
36 limit_requests=current_settings["embed_model_rl_requests"],
43 - kwargs={
44 - **current_settings["embed_model_kwargs"],
45 - },
37 + kwargs=current_settings["embed_model_kwargs"],
38 )
39 # browser model from user settings
40 browser_llm = ModelConfig(
41 provider=models.ModelProvider[current_settings["browser_model_provider"]],
42 name=current_settings["browser_model_name"],
43 vision=current_settings["browser_model_vision"],
52 - kwargs={
53 - "temperature": current_settings["browser_model_temperature"],
54 - **current_settings["browser_model_kwargs"],
55 - },
44 + kwargs=current_settings["browser_model_kwargs"],
45 )
46 # agent configuration
47 config = AgentConfig(
models.py
+25 -34
@@ -26,6 +26,7 @@ from langchain_google_genai import (
26 embeddings as google_embeddings,
27 )
28 from langchain_mistralai import ChatMistralAI
29 +
30 # from pydantic.v1.types import SecretStr
31 from python.helpers import dotenv, runtime
32 from python.helpers.dotenv import load_dotenv
@@ -34,9 +35,6 @@ from python.helpers.rate_limiter import RateLimiter
35 # environment variables
36 load_dotenv()
37
37 -# Configuration
38 -DEFAULT_TEMPERATURE = 0.0
39 -
38
39 class ModelType(Enum):
40 CHAT = "Chat"
@@ -110,7 +108,6 @@ def get_ollama_base_url():
108
109 def get_ollama_chat(
110 model_name: str,
113 - temperature=DEFAULT_TEMPERATURE,
111 base_url=None,
112 num_ctx=8192,
113 **kwargs,
@@ -119,7 +116,6 @@ def get_ollama_chat(
116 base_url = get_ollama_base_url()
117 return ChatOllama(
118 model=model_name,
122 - temperature=temperature,
119 base_url=base_url,
120 num_ctx=num_ctx,
121 **kwargs,
@@ -128,14 +124,14 @@ def get_ollama_chat(
124
125 def get_ollama_embedding(
126 model_name: str,
131 - temperature=DEFAULT_TEMPERATURE,
127 base_url=None,
128 + num_ctx=8192,
129 **kwargs,
130 ):
131 if not base_url:
132 base_url = get_ollama_base_url()
133 return OllamaEmbeddings(
138 - model=model_name, temperature=temperature, base_url=base_url, **kwargs
134 + model=model_name, base_url=base_url, num_ctx=num_ctx, **kwargs
135 )
136
137
@@ -143,7 +139,6 @@ def get_ollama_embedding(
139 def get_huggingface_chat(
140 model_name: str,
141 api_key=None,
146 - temperature=DEFAULT_TEMPERATURE,
142 **kwargs,
143 ):
144 # different naming convention here
@@ -155,7 +150,6 @@ def get_huggingface_chat(
150 repo_id=model_name,
151 task="text-generation",
152 do_sample=True,
158 - temperature=temperature,
153 **kwargs,
154 )
155
@@ -177,13 +171,12 @@ def get_lmstudio_base_url():
171
172 def get_lmstudio_chat(
173 model_name: str,
180 - temperature=DEFAULT_TEMPERATURE,
174 base_url=None,
175 **kwargs,
176 ):
177 if not base_url:
178 base_url = get_lmstudio_base_url()
186 - return ChatOpenAI(model_name=model_name, base_url=base_url, temperature=temperature, api_key="none", **kwargs) # type: ignore
179 + return ChatOpenAI(model_name=model_name, base_url=base_url, api_key="none", **kwargs) # type: ignore
180
181
182 def get_lmstudio_embedding(
@@ -200,12 +193,16 @@ def get_lmstudio_embedding(
193 def get_anthropic_chat(
194 model_name: str,
195 api_key=None,
203 - temperature=DEFAULT_TEMPERATURE,
196 + base_url=None,
197 **kwargs,
198 ):
199 if not api_key:
200 api_key = get_api_key("anthropic")
208 - return ChatAnthropic(model_name=model_name, temperature=temperature, api_key=api_key, **kwargs) # type: ignore
201 + if not base_url:
202 + base_url = (
203 + dotenv.get_dotenv_value("ANTHROPIC_BASE_URL") or "https://api.anthropic.com"
204 + )
205 + return ChatAnthropic(model_name=model_name, api_key=api_key, base_url=base_url, **kwargs) # type: ignore
206
207
208 # right now anthropic does not have embedding models, but that might change
@@ -223,12 +220,11 @@ def get_anthropic_embedding(
220 def get_openai_chat(
221 model_name: str,
222 api_key=None,
226 - temperature=DEFAULT_TEMPERATURE,
223 **kwargs,
224 ):
225 if not api_key:
226 api_key = get_api_key("openai")
231 - return ChatOpenAI(model_name=model_name, temperature=temperature, api_key=api_key, **kwargs) # type: ignore
227 + return ChatOpenAI(model_name=model_name, api_key=api_key, **kwargs) # type: ignore
228
229
230 def get_openai_embedding(model_name: str, api_key=None, **kwargs):
@@ -240,7 +236,6 @@ def get_openai_embedding(model_name: str, api_key=None, **kwargs):
236 def get_openai_azure_chat(
237 deployment_name: str,
238 api_key=None,
243 - temperature=DEFAULT_TEMPERATURE,
239 azure_endpoint=None,
240 **kwargs,
241 ):
@@ -248,7 +243,7 @@ def get_openai_azure_chat(
243 api_key = get_api_key("openai_azure")
244 if not azure_endpoint:
245 azure_endpoint = dotenv.get_dotenv_value("OPENAI_AZURE_ENDPOINT")
251 - return AzureChatOpenAI(deployment_name=deployment_name, temperature=temperature, api_key=api_key, azure_endpoint=azure_endpoint, **kwargs) # type: ignore
246 + return AzureChatOpenAI(deployment_name=deployment_name, api_key=api_key, azure_endpoint=azure_endpoint, **kwargs) # type: ignore
247
248
249 def get_openai_azure_embedding(
@@ -268,12 +263,11 @@ def get_openai_azure_embedding(
263 def get_google_chat(
264 model_name: str,
265 api_key=None,
271 - temperature=DEFAULT_TEMPERATURE,
266 **kwargs,
267 ):
268 if not api_key:
269 api_key = get_api_key("google")
276 - return GoogleGenerativeAI(model=model_name, temperature=temperature, google_api_key=api_key, safety_settings={HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE}, **kwargs) # type: ignore
270 + return GoogleGenerativeAI(model=model_name, google_api_key=api_key, safety_settings={HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE}, **kwargs) # type: ignore
271
272
273 def get_google_embedding(
@@ -290,31 +284,28 @@ def get_google_embedding(
284 def get_mistralai_chat(
285 model_name: str,
286 api_key=None,
293 - temperature=DEFAULT_TEMPERATURE,
287 **kwargs,
288 ):
289 if not api_key:
290 api_key = get_api_key("mistral")
298 - return ChatMistralAI(model=model_name, temperature=temperature, api_key=api_key, **kwargs) # type: ignore
291 + return ChatMistralAI(model=model_name, api_key=api_key, **kwargs) # type: ignore
292
293
294 # Groq models
295 def get_groq_chat(
296 model_name: str,
297 api_key=None,
305 - temperature=DEFAULT_TEMPERATURE,
298 **kwargs,
299 ):
300 if not api_key:
301 api_key = get_api_key("groq")
310 - return ChatGroq(model_name=model_name, temperature=temperature, api_key=api_key, **kwargs) # type: ignore
302 + return ChatGroq(model_name=model_name, api_key=api_key, **kwargs) # type: ignore
303
304
305 # DeepSeek models
306 def get_deepseek_chat(
307 model_name: str,
308 api_key=None,
317 - temperature=DEFAULT_TEMPERATURE,
309 base_url=None,
310 **kwargs,
311 ):
@@ -322,17 +313,19 @@ def get_deepseek_chat(
313 api_key = get_api_key("deepseek")
314 if not base_url:
315 base_url = (
325 - dotenv.get_dotenv_value("DEEPSEEK_BASE_URL")
326 - or "https://api.deepseek.com"
316 + dotenv.get_dotenv_value("DEEPSEEK_BASE_URL") or "https://api.deepseek.com"
317 )
328 - return ChatOpenAI(api_key=api_key, model=model_name, temperature=temperature, base_url=base_url, **kwargs) # type: ignore
329 -
318 +
319 + model = ChatOpenAI(api_key=api_key, model=model_name, base_url=base_url, **kwargs) # type: ignore
320 + # little hack for reasoning model's problem with temperature
321 + if not "temperature" in kwargs:
322 + model.temperature = None # type: ignore
323 + return model
324
325 # OpenRouter models
326 def get_openrouter_chat(
327 model_name: str,
328 api_key=None,
335 - temperature=DEFAULT_TEMPERATURE,
329 base_url=None,
330 **kwargs,
331 ):
@@ -343,7 +336,7 @@ def get_openrouter_chat(
336 dotenv.get_dotenv_value("OPEN_ROUTER_BASE_URL")
337 or "https://openrouter.ai/api/v1"
338 )
346 - return ChatOpenAI(api_key=api_key, model=model_name, temperature=temperature, base_url=base_url, **kwargs) # type: ignore
339 + return ChatOpenAI(api_key=api_key, model=model_name, base_url=base_url, **kwargs) # type: ignore
340
341
342 def get_openrouter_embedding(
@@ -366,7 +359,6 @@ def get_openrouter_embedding(
359 def get_sambanova_chat(
360 model_name: str,
361 api_key=None,
369 - temperature=DEFAULT_TEMPERATURE,
362 base_url=None,
363 max_tokens=1024,
364 **kwargs,
@@ -378,7 +370,7 @@ def get_sambanova_chat(
370 dotenv.get_dotenv_value("SAMBANOVA_BASE_URL")
371 or "https://fast-api.snova.ai/v1"
372 )
381 - return ChatOpenAI(api_key=api_key, model=model_name, temperature=temperature, base_url=base_url, max_tokens=max_tokens, **kwargs) # type: ignore
373 + return ChatOpenAI(api_key=api_key, model=model_name, base_url=base_url, max_tokens=max_tokens, **kwargs) # type: ignore
374
375
376 # right now sambanova does not have embedding models, but that might change
@@ -402,11 +394,10 @@ def get_sambanova_embedding(
394 def get_other_chat(
395 model_name: str,
396 api_key=None,
405 - temperature=DEFAULT_TEMPERATURE,
397 base_url=None,
398 **kwargs,
399 ):
409 - return ChatOpenAI(api_key=api_key, model=model_name, temperature=temperature, base_url=base_url, **kwargs) # type: ignore
400 + return ChatOpenAI(api_key=api_key, model=model_name, base_url=base_url, **kwargs) # type: ignore
401
402
403 def get_other_embedding(model_name: str, api_key=None, base_url=None, **kwargs):
prompts/default/agent.system.main.role.md
+1 -1
@@ -1,5 +1,5 @@
1 ## Your role
2 -{{agent_name}} autonomous json ai agent
2 +agent zero autonomous json ai agent
3 solve superior tasks using tools and subordinates
4 follow behavioral rules instructions
5 execute code actions yourself not instruct superior
python/helpers/settings.py
+7 -109
@@ -13,7 +13,6 @@ from . import files, dotenv
13 class Settings(TypedDict):
14 chat_model_provider: str
15 chat_model_name: str
16 - chat_model_temperature: float
16 chat_model_kwargs: dict[str, str]
17 chat_model_ctx_length: int
18 chat_model_ctx_history: float
@@ -23,7 +22,6 @@ class Settings(TypedDict):
22
23 util_model_provider: str
24 util_model_name: str
26 - util_model_temperature: float
25 util_model_kwargs: dict[str, str]
26 util_model_ctx_length: int
27 util_model_ctx_input: float
@@ -40,7 +38,6 @@ class Settings(TypedDict):
38 browser_model_provider: str
39 browser_model_name: str
40 browser_model_vision: bool
43 - browser_model_temperature: float
41 browser_model_kwargs: dict[str, str]
42
43 agent_prompts_subdir: str
@@ -129,19 +126,6 @@ def convert_out(settings: Settings) -> SettingsOutput:
126 }
127 )
128
132 - chat_model_fields.append(
133 - {
134 - "id": "chat_model_temperature",
135 - "title": "Chat model temperature",
136 - "description": "Determines the randomness of generated responses. 0 is deterministic, 1 is random",
137 - "type": "range",
138 - "min": 0,
139 - "max": 1,
140 - "step": 0.01,
141 - "value": settings["chat_model_temperature"],
142 - }
143 - )
144 -
129 chat_model_fields.append(
130 {
131 "id": "chat_model_ctx_length",
@@ -234,41 +218,6 @@ def convert_out(settings: Settings) -> SettingsOutput:
218 }
219 )
220
237 - util_model_fields.append(
238 - {
239 - "id": "util_model_temperature",
240 - "title": "Utility model temperature",
241 - "description": "Determines the randomness of generated responses. 0 is deterministic, 1 is random",
242 - "type": "range",
243 - "min": 0,
244 - "max": 1,
245 - "step": 0.01,
246 - "value": settings["util_model_temperature"],
247 - }
248 - )
249 -
250 - # util_model_fields.append(
251 - # {
252 - # "id": "util_model_ctx_length",
253 - # "title": "Utility model context length",
254 - # "description": "Maximum number of tokens in the context window for LLM. System prompt, message and response all count towards this limit.",
255 - # "type": "number",
256 - # "value": settings["util_model_ctx_length"],
257 - # }
258 - # )
259 - # util_model_fields.append(
260 - # {
261 - # "id": "util_model_ctx_input",
262 - # "title": "Context window space for input tokens",
263 - # "description": "Portion of context window dedicated to input tokens. The remaining space can be filled with response.",
264 - # "type": "range",
265 - # "min": 0.01,
266 - # "max": 1,
267 - # "step": 0.01,
268 - # "value": settings["util_model_ctx_input"],
269 - # }
270 - # )
271 -
221 util_model_fields.append(
222 {
223 "id": "util_model_rl_requests",
@@ -407,19 +356,6 @@ def convert_out(settings: Settings) -> SettingsOutput:
356 }
357 )
358
410 - browser_model_fields.append(
411 - {
412 - "id": "browser_model_temperature",
413 - "title": "Web Browser model temperature",
414 - "description": "Determines the randomness of generated responses. 0 is deterministic, 1 is random",
415 - "type": "range",
416 - "min": 0,
417 - "max": 1,
418 - "step": 0.01,
419 - "value": settings["browser_model_temperature"],
420 - }
421 - )
422 -
359 browser_model_fields.append(
360 {
361 "id": "browser_model_kwargs",
@@ -509,9 +445,7 @@ def convert_out(settings: Settings) -> SettingsOutput:
445 )
446 api_keys_fields.append(_get_api_key_field(settings, "groq", "Groq API Key"))
447 api_keys_fields.append(_get_api_key_field(settings, "google", "Google API Key"))
512 - api_keys_fields.append(
513 - _get_api_key_field(settings, "deepseek", "DeepSeek API Key")
514 - )
448 + api_keys_fields.append(_get_api_key_field(settings, "deepseek", "DeepSeek API Key"))
449 api_keys_fields.append(
450 _get_api_key_field(settings, "openrouter", "OpenRouter API Key")
451 )
@@ -794,41 +728,6 @@ def normalize_settings(settings: Settings) -> Settings:
728 return copy
729
730
797 -# def get_chat_model(settings: Settings | None = None) -> BaseChatModel:
798 -# if not settings:
799 -# settings = get_settings()
800 -# return get_model(
801 -# type=ModelType.CHAT,
802 -# provider=ModelProvider[settings["chat_model_provider"]],
803 -# name=settings["chat_model_name"],
804 -# temperature=settings["chat_model_temperature"],
805 -# **settings["chat_model_kwargs"],
806 -# )
807 -
808 -
809 -# def get_utility_model(settings: Settings | None = None) -> BaseChatModel:
810 -# if not settings:
811 -# settings = get_settings()
812 -# return get_model(
813 -# type=ModelType.CHAT,
814 -# provider=ModelProvider[settings["util_model_provider"]],
815 -# name=settings["util_model_name"],
816 -# temperature=settings["util_model_temperature"],
817 -# **settings["util_model_kwargs"],
818 -# )
819 -
820 -
821 -# def get_embedding_model(settings: Settings | None = None) -> Embeddings:
822 -# if not settings:
823 -# settings = get_settings()
824 -# return get_model(
825 -# type=ModelType.EMBEDDING,
826 -# provider=ModelProvider[settings["embed_model_provider"]],
827 -# name=settings["embed_model_name"],
828 -# **settings["embed_model_kwargs"],
829 -# )
830 -
831 -
731 def _read_settings_file() -> Settings | None:
732 if os.path.exists(SETTINGS_FILE):
733 content = files.read_file(SETTINGS_FILE)
@@ -875,8 +774,7 @@ def get_default_settings() -> Settings:
774 return Settings(
775 chat_model_provider=ModelProvider.OPENAI.name,
776 chat_model_name="gpt-4o",
878 - chat_model_temperature=0.0,
879 - chat_model_kwargs={},
777 + chat_model_kwargs={ "temperature": "0" },
778 chat_model_ctx_length=120000,
779 chat_model_ctx_history=0.7,
780 chat_model_rl_requests=0,
@@ -884,10 +782,9 @@ def get_default_settings() -> Settings:
782 chat_model_rl_output=0,
783 util_model_provider=ModelProvider.OPENAI.name,
784 util_model_name="gpt-4o-mini",
887 - util_model_temperature=0.0,
785 util_model_ctx_length=120000,
786 util_model_ctx_input=0.7,
890 - util_model_kwargs={},
787 + util_model_kwargs={ "temperature": "0" },
788 util_model_rl_requests=60,
789 util_model_rl_input=0,
790 util_model_rl_output=0,
@@ -899,8 +796,7 @@ def get_default_settings() -> Settings:
796 browser_model_provider=ModelProvider.OPENAI.name,
797 browser_model_name="gpt-4o",
798 browser_model_vision=False,
902 - browser_model_temperature=0.0,
903 - browser_model_kwargs={},
799 + browser_model_kwargs={ "temperature": "0" },
800 api_keys={},
801 auth_login="",
802 auth_password="",
@@ -936,7 +832,9 @@ def _apply_settings():
832 agent = agent.get_data(agent.DATA_NAME_SUBORDINATE)
833
834 # reload whisper model if necessary
939 - task = defer.DeferredTask().start_task(whisper.preload, _settings["stt_model_size"]) #TODO overkill, replace with background task
835 + task = defer.DeferredTask().start_task(
836 + whisper.preload, _settings["stt_model_size"]
837 + ) # TODO overkill, replace with background task
838
839
840 def _env_to_dict(data: str):