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
+[](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):