Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions docker/run/docker-compose.build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
version: '3.8'

services:
agent-zero:
build:
context: ..
dockerfile: DockerfileLocal
ports:
- "${A0_DOCKER_HTTP_PORT:-55080}:80" # Web UI
- "${A0_DOCKER_SSH_PORT:-55022}:22" # SSH access
volumes:
- a0:/a0
- root:/root
container_name: ${A0_DOCKER_CONTAINER_NAME:-agent-zero}
environment:
# Core Model Configuration
- A0_SET_CHAT_MODEL_PROVIDER=${A0_SET_CHAT_MODEL_PROVIDER:-openrouter}
- A0_SET_CHAT_MODEL_NAME=${A0_SET_CHAT_MODEL_NAME:-openai/gpt-4.1}
- A0_SET_CHAT_MODEL_API_BASE=${A0_SET_CHAT_MODEL_API_BASE:-}
- A0_SET_CHAT_MODEL_CTX_LENGTH=${A0_SET_CHAT_MODEL_CTX_LENGTH:-100000}
- A0_SET_CHAT_MODEL_CTX_HISTORY=${A0_SET_CHAT_MODEL_CTX_HISTORY:-0.7}
- A0_SET_CHAT_MODEL_VISION=${A0_SET_CHAT_MODEL_VISION:-true}
- A0_SET_CHAT_MODEL_RL_REQUESTS=${A0_SET_CHAT_MODEL_RL_REQUESTS:-0}
- A0_SET_CHAT_MODEL_RL_INPUT=${A0_SET_CHAT_MODEL_RL_INPUT:-0}
- A0_SET_CHAT_MODEL_RL_OUTPUT=${A0_SET_CHAT_MODEL_RL_OUTPUT:-0}
- A0_SET_CHAT_MODEL_KWARGS_TEMPERATURE=${A0_SET_CHAT_MODEL_KWARGS_TEMPERATURE:-0}

# Utility Model Configuration
- A0_SET_UTIL_MODEL_PROVIDER=${A0_SET_UTIL_MODEL_PROVIDER:-openrouter}
- A0_SET_UTIL_MODEL_NAME=${A0_SET_UTIL_MODEL_NAME:-openai/gpt-4.1-mini}
- A0_SET_UTIL_MODEL_API_BASE=${A0_SET_UTIL_MODEL_API_BASE:-}
- A0_SET_UTIL_MODEL_CTX_LENGTH=${A0_SET_UTIL_MODEL_CTX_LENGTH:-100000}
- A0_SET_UTIL_MODEL_CTX_INPUT=${A0_SET_UTIL_MODEL_CTX_INPUT:-0.7}
- A0_SET_UTIL_MODEL_RL_REQUESTS=${A0_SET_UTIL_MODEL_RL_REQUESTS:-0}
- A0_SET_UTIL_MODEL_RL_INPUT=${A0_SET_UTIL_MODEL_RL_INPUT:-0}
- A0_SET_UTIL_MODEL_RL_OUTPUT=${A0_SET_UTIL_MODEL_RL_OUTPUT:-0}
- A0_SET_UTIL_MODEL_KWARGS_TEMPERATURE=${A0_SET_UTIL_MODEL_KWARGS_TEMPERATURE:-0}

# Embedding Model Configuration
- A0_SET_EMBED_MODEL_PROVIDER=${A0_SET_EMBED_MODEL_PROVIDER:-huggingface}
- A0_SET_EMBED_MODEL_NAME=${A0_SET_EMBED_MODEL_NAME:-sentence-transformers/all-MiniLM-L6-v2}
- A0_SET_EMBED_MODEL_API_BASE=${A0_SET_EMBED_MODEL_API_BASE:-}
- A0_SET_EMBED_MODEL_RL_REQUESTS=${A0_SET_EMBED_MODEL_RL_REQUESTS:-0}
- A0_SET_EMBED_MODEL_RL_INPUT=${A0_SET_EMBED_MODEL_RL_INPUT:-0}

# Browser Model Configuration
- A0_SET_BROWSER_MODEL_PROVIDER=${A0_SET_BROWSER_MODEL_PROVIDER:-openrouter}
- A0_SET_BROWSER_MODEL_NAME=${A0_SET_BROWSER_MODEL_NAME:-openai/gpt-4.1}
- A0_SET_BROWSER_MODEL_API_BASE=${A0_SET_BROWSER_MODEL_API_BASE:-}
- A0_SET_BROWSER_MODEL_VISION=${A0_SET_BROWSER_MODEL_VISION:-true}
- A0_SET_BROWSER_MODEL_RL_REQUESTS=${A0_SET_BROWSER_MODEL_RL_REQUESTS:-0}
- A0_SET_BROWSER_MODEL_RL_INPUT=${A0_SET_BROWSER_MODEL_RL_INPUT:-0}
- A0_SET_BROWSER_MODEL_RL_OUTPUT=${A0_SET_BROWSER_MODEL_RL_OUTPUT:-0}
- A0_SET_BROWSER_MODEL_KWARGS_TEMPERATURE=${A0_SET_BROWSER_MODEL_KWARGS_TEMPERATURE:-0}

# Memory System Configuration
- A0_SET_MEMORY_RECALL_ENABLED=${A0_SET_MEMORY_RECALL_ENABLED:-true}
- A0_SET_MEMORY_RECALL_DELAYED=${A0_SET_MEMORY_RECALL_DELAYED:-false}
- A0_SET_MEMORY_RECALL_INTERVAL=${A0_SET_MEMORY_RECALL_INTERVAL:-3}
- A0_SET_MEMORY_RECALL_HISTORY_LEN=${A0_SET_MEMORY_RECALL_HISTORY_LEN:-10000}
- A0_SET_MEMORY_RECALL_MEMORIES_MAX_SEARCH=${A0_SET_MEMORY_RECALL_MEMORIES_MAX_SEARCH:-12}
- A0_SET_MEMORY_RECALL_SOLUTIONS_MAX_SEARCH=${A0_SET_MEMORY_RECALL_SOLUTIONS_MAX_SEARCH:-8}
- A0_SET_MEMORY_RECALL_MEMORIES_MAX_RESULT=${A0_SET_MEMORY_RECALL_MEMORIES_MAX_RESULT:-5}
- A0_SET_MEMORY_RECALL_SOLUTIONS_MAX_RESULT=${A0_SET_MEMORY_RECALL_SOLUTIONS_MAX_RESULT:-3}
- A0_SET_MEMORY_RECALL_SIMILARITY_THRESHOLD=${A0_SET_MEMORY_RECALL_SIMILARITY_THRESHOLD:-0.7}
- A0_SET_MEMORY_RECALL_QUERY_PREP=${A0_SET_MEMORY_RECALL_QUERY_PREP:-true}
- A0_SET_MEMORY_RECALL_POST_FILTER=${A0_SET_MEMORY_RECALL_POST_FILTER:-true}
- A0_SET_MEMORY_MEMORIZE_ENABLED=${A0_SET_MEMORY_MEMORIZE_ENABLED:-true}
- A0_SET_MEMORY_MEMORIZE_CONSOLIDATION=${A0_SET_MEMORY_MEMORIZE_CONSOLIDATION:-true}
- A0_SET_MEMORY_MEMORIZE_REPLACE_THRESHOLD=${A0_SET_MEMORY_MEMORIZE_REPLACE_THRESHOLD:-0.9}

# Authentication & Security
- A0_SET_AUTH_LOGIN=${A0_SET_AUTH_LOGIN:-}
- A0_SET_AUTH_PASSWORD=${A0_SET_AUTH_PASSWORD:-}
- A0_ROOT_PASSWORD=${A0_ROOT_PASSWORD:-}
- A0_RFC_PASSWORD=${A0_RFC_PASSWORD:-}

# Agent Configuration
- A0_SET_AGENT_PROFILE=${A0_SET_AGENT_PROFILE:-agent0}
- A0_SET_AGENT_MEMORY_SUBDIR=${A0_SET_AGENT_MEMORY_SUBDIR:-default}
- A0_SET_AGENT_KNOWLEDGE_SUBDIR=${A0_SET_AGENT_KNOWLEDGE_SUBDIR:-custom}

# Remote Function Calls
- A0_SET_RFC_AUTO_DOCKER=${A0_SET_RFC_AUTO_DOCKER:-true}
- A0_SET_RFC_URL=${A0_SET_RFC_URL:-localhost}
- A0_SET_RFC_PORT_HTTP=${A0_SET_RFC_PORT_HTTP:-55080}
- A0_SET_RFC_PORT_SSH=${A0_SET_RFC_PORT_SSH:-55022}

# Speech Configuration
- A0_SET_STT_MODEL_SIZE=${A0_SET_STT_MODEL_SIZE:-base}
- A0_SET_STT_LANGUAGE=${A0_SET_STT_LANGUAGE:-en}
- A0_SET_STT_SILENCE_THRESHOLD=${A0_SET_STT_SILENCE_THRESHOLD:-0.3}
- A0_SET_STT_SILENCE_DURATION=${A0_SET_STT_SILENCE_DURATION:-1000}
- A0_SET_STT_WAITING_TIMEOUT=${A0_SET_STT_WAITING_TIMEOUT:-2000}
- A0_SET_TTS_KOKORO=${A0_SET_TTS_KOKORO:-true}

# MCP Configuration
- A0_SET_MCP_CLIENT_INIT_TIMEOUT=${A0_SET_MCP_CLIENT_INIT_TIMEOUT:-10}
- A0_SET_MCP_CLIENT_TOOL_TIMEOUT=${A0_SET_MCP_CLIENT_TOOL_TIMEOUT:-120}
- A0_SET_MCP_SERVER_ENABLED=${A0_SET_MCP_SERVER_ENABLED:-false}
- A0_SET_A2A_SERVER_ENABLED=${A0_SET_A2A_SERVER_ENABLED:-false}

# API Keys (set your keys here)
- A0_SET_API_KEY_ANTHROPIC=${A0_SET_API_KEY_ANTHROPIC:-}
- A0_SET_API_KEY_DEEPSEEK=${A0_SET_API_KEY_DEEPSEEK:-}
- A0_SET_API_KEY_GOOGLE=${A0_SET_API_KEY_GOOGLE:-}
- A0_SET_API_KEY_GROQ=${A0_SET_API_KEY_GROQ:-}
- A0_SET_API_KEY_HUGGINGFACE=${A0_SET_API_KEY_HUGGINGFACE:-}
- A0_SET_API_KEY_LM_STUDIO=${A0_SET_API_KEY_LM_STUDIO:-}
- A0_SET_API_KEY_MISTRAL=${A0_SET_API_KEY_MISTRAL:-}
- A0_SET_API_KEY_OLLAMA=${A0_SET_API_KEY_OLLAMA:-}
- A0_SET_API_KEY_OPENAI=${A0_SET_API_KEY_OPENAI:-}
- A0_SET_API_KEY_AZURE=${A0_SET_API_KEY_AZURE:-}
- A0_SET_API_KEY_OPENROUTER=${A0_SET_API_KEY_OPENROUTER:-}
- A0_SET_API_KEY_SAMBANOVA=${A0_SET_API_KEY_SAMBANOVA:-}
- A0_SET_API_KEY_VENICE=${A0_SET_API_KEY_VENICE:-}
- A0_SET_API_KEY_OTHER=${A0_SET_API_KEY_OTHER:-}

healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 5s
restart: unless-stopped
# Additional configuration as needed

volumes:
root:
driver: local
a0:
driver: local
132 changes: 127 additions & 5 deletions docker/run/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,130 @@
version: '3.8'

services:
agent-zero:
container_name: agent-zero
image: agent0ai/agent-zero:latest
volumes:
- ./agent-zero:/a0
image: ${A0_DOCKER_IMAGE_USER:-agent0ai}/${A0_DOCKER_IMAGE_NAME:-agent-zero}
ports:
- "50080:80"
- "${A0_DOCKER_HTTP_PORT:-55080}:80" # Web UI
- "${A0_DOCKER_SSH_PORT:-55022}:22" # SSH access
volumes:
- a0:/a0
- root:/root
container_name: ${A0_DOCKER_CONTAINER_NAME:-agent-zero}
environment:
# Core Model Configuration
- A0_SET_CHAT_MODEL_PROVIDER=${A0_SET_CHAT_MODEL_PROVIDER:-openrouter}
- A0_SET_CHAT_MODEL_NAME=${A0_SET_CHAT_MODEL_NAME:-openai/gpt-4.1}
- A0_SET_CHAT_MODEL_API_BASE=${A0_SET_CHAT_MODEL_API_BASE:-}
- A0_SET_CHAT_MODEL_CTX_LENGTH=${A0_SET_CHAT_MODEL_CTX_LENGTH:-100000}
- A0_SET_CHAT_MODEL_CTX_HISTORY=${A0_SET_CHAT_MODEL_CTX_HISTORY:-0.7}
- A0_SET_CHAT_MODEL_VISION=${A0_SET_CHAT_MODEL_VISION:-true}
- A0_SET_CHAT_MODEL_RL_REQUESTS=${A0_SET_CHAT_MODEL_RL_REQUESTS:-0}
- A0_SET_CHAT_MODEL_RL_INPUT=${A0_SET_CHAT_MODEL_RL_INPUT:-0}
- A0_SET_CHAT_MODEL_RL_OUTPUT=${A0_SET_CHAT_MODEL_RL_OUTPUT:-0}
- A0_SET_CHAT_MODEL_KWARGS_TEMPERATURE=${A0_SET_CHAT_MODEL_KWARGS_TEMPERATURE:-0}

# Utility Model Configuration
- A0_SET_UTIL_MODEL_PROVIDER=${A0_SET_UTIL_MODEL_PROVIDER:-openrouter}
- A0_SET_UTIL_MODEL_NAME=${A0_SET_UTIL_MODEL_NAME:-openai/gpt-4.1-mini}
- A0_SET_UTIL_MODEL_API_BASE=${A0_SET_UTIL_MODEL_API_BASE:-}
- A0_SET_UTIL_MODEL_CTX_LENGTH=${A0_SET_UTIL_MODEL_CTX_LENGTH:-100000}
- A0_SET_UTIL_MODEL_CTX_INPUT=${A0_SET_UTIL_MODEL_CTX_INPUT:-0.7}
- A0_SET_UTIL_MODEL_RL_REQUESTS=${A0_SET_UTIL_MODEL_RL_REQUESTS:-0}
- A0_SET_UTIL_MODEL_RL_INPUT=${A0_SET_UTIL_MODEL_RL_INPUT:-0}
- A0_SET_UTIL_MODEL_RL_OUTPUT=${A0_SET_UTIL_MODEL_RL_OUTPUT:-0}
- A0_SET_UTIL_MODEL_KWARGS_TEMPERATURE=${A0_SET_UTIL_MODEL_KWARGS_TEMPERATURE:-0}

# Embedding Model Configuration
- A0_SET_EMBED_MODEL_PROVIDER=${A0_SET_EMBED_MODEL_PROVIDER:-huggingface}
- A0_SET_EMBED_MODEL_NAME=${A0_SET_EMBED_MODEL_NAME:-sentence-transformers/all-MiniLM-L6-v2}
- A0_SET_EMBED_MODEL_API_BASE=${A0_SET_EMBED_MODEL_API_BASE:-}
- A0_SET_EMBED_MODEL_RL_REQUESTS=${A0_SET_EMBED_MODEL_RL_REQUESTS:-0}
- A0_SET_EMBED_MODEL_RL_INPUT=${A0_SET_EMBED_MODEL_RL_INPUT:-0}

# Browser Model Configuration
- A0_SET_BROWSER_MODEL_PROVIDER=${A0_SET_BROWSER_MODEL_PROVIDER:-openrouter}
- A0_SET_BROWSER_MODEL_NAME=${A0_SET_BROWSER_MODEL_NAME:-openai/gpt-4.1}
- A0_SET_BROWSER_MODEL_API_BASE=${A0_SET_BROWSER_MODEL_API_BASE:-}
- A0_SET_BROWSER_MODEL_VISION=${A0_SET_BROWSER_MODEL_VISION:-true}
- A0_SET_BROWSER_MODEL_RL_REQUESTS=${A0_SET_BROWSER_MODEL_RL_REQUESTS:-0}
- A0_SET_BROWSER_MODEL_RL_INPUT=${A0_SET_BROWSER_MODEL_RL_INPUT:-0}
- A0_SET_BROWSER_MODEL_RL_OUTPUT=${A0_SET_BROWSER_MODEL_RL_OUTPUT:-0}
- A0_SET_BROWSER_MODEL_KWARGS_TEMPERATURE=${A0_SET_BROWSER_MODEL_KWARGS_TEMPERATURE:-0}

# Memory System Configuration
- A0_SET_MEMORY_RECALL_ENABLED=${A0_SET_MEMORY_RECALL_ENABLED:-true}
- A0_SET_MEMORY_RECALL_DELAYED=${A0_SET_MEMORY_RECALL_DELAYED:-false}
- A0_SET_MEMORY_RECALL_INTERVAL=${A0_SET_MEMORY_RECALL_INTERVAL:-3}
- A0_SET_MEMORY_RECALL_HISTORY_LEN=${A0_SET_MEMORY_RECALL_HISTORY_LEN:-10000}
- A0_SET_MEMORY_RECALL_MEMORIES_MAX_SEARCH=${A0_SET_MEMORY_RECALL_MEMORIES_MAX_SEARCH:-12}
- A0_SET_MEMORY_RECALL_SOLUTIONS_MAX_SEARCH=${A0_SET_MEMORY_RECALL_SOLUTIONS_MAX_SEARCH:-8}
- A0_SET_MEMORY_RECALL_MEMORIES_MAX_RESULT=${A0_SET_MEMORY_RECALL_MEMORIES_MAX_RESULT:-5}
- A0_SET_MEMORY_RECALL_SOLUTIONS_MAX_RESULT=${A0_SET_MEMORY_RECALL_SOLUTIONS_MAX_RESULT:-3}
- A0_SET_MEMORY_RECALL_SIMILARITY_THRESHOLD=${A0_SET_MEMORY_RECALL_SIMILARITY_THRESHOLD:-0.7}
- A0_SET_MEMORY_RECALL_QUERY_PREP=${A0_SET_MEMORY_RECALL_QUERY_PREP:-true}
- A0_SET_MEMORY_RECALL_POST_FILTER=${A0_SET_MEMORY_RECALL_POST_FILTER:-true}
- A0_SET_MEMORY_MEMORIZE_ENABLED=${A0_SET_MEMORY_MEMORIZE_ENABLED:-true}
- A0_SET_MEMORY_MEMORIZE_CONSOLIDATION=${A0_SET_MEMORY_MEMORIZE_CONSOLIDATION:-true}
- A0_SET_MEMORY_MEMORIZE_REPLACE_THRESHOLD=${A0_SET_MEMORY_MEMORIZE_REPLACE_THRESHOLD:-0.9}

# Authentication & Security
- A0_SET_AUTH_LOGIN=${A0_SET_AUTH_LOGIN:-}
- A0_SET_AUTH_PASSWORD=${A0_SET_AUTH_PASSWORD:-}
- A0_ROOT_PASSWORD=${A0_ROOT_PASSWORD:-}
- A0_RFC_PASSWORD=${A0_RFC_PASSWORD:-}

# Agent Configuration
- A0_SET_AGENT_PROFILE=${A0_SET_AGENT_PROFILE:-agent0}
- A0_SET_AGENT_MEMORY_SUBDIR=${A0_SET_AGENT_MEMORY_SUBDIR:-default}
- A0_SET_AGENT_KNOWLEDGE_SUBDIR=${A0_SET_AGENT_KNOWLEDGE_SUBDIR:-custom}

# Remote Function Calls
- A0_SET_RFC_AUTO_DOCKER=${A0_SET_RFC_AUTO_DOCKER:-true}
- A0_SET_RFC_URL=${A0_SET_RFC_URL:-localhost}
- A0_SET_RFC_PORT_HTTP=${A0_SET_RFC_PORT_HTTP:-55080}
- A0_SET_RFC_PORT_SSH=${A0_SET_RFC_PORT_SSH:-55022}

# Speech Configuration
- A0_SET_STT_MODEL_SIZE=${A0_SET_STT_MODEL_SIZE:-base}
- A0_SET_STT_LANGUAGE=${A0_SET_STT_LANGUAGE:-en}
- A0_SET_STT_SILENCE_THRESHOLD=${A0_SET_STT_SILENCE_THRESHOLD:-0.3}
- A0_SET_STT_SILENCE_DURATION=${A0_SET_STT_SILENCE_DURATION:-1000}
- A0_SET_STT_WAITING_TIMEOUT=${A0_SET_STT_WAITING_TIMEOUT:-2000}
- A0_SET_TTS_KOKORO=${A0_SET_TTS_KOKORO:-true}

# MCP Configuration
- A0_SET_MCP_CLIENT_INIT_TIMEOUT=${A0_SET_MCP_CLIENT_INIT_TIMEOUT:-10}
- A0_SET_MCP_CLIENT_TOOL_TIMEOUT=${A0_SET_MCP_CLIENT_TOOL_TIMEOUT:-120}
- A0_SET_MCP_SERVER_ENABLED=${A0_SET_MCP_SERVER_ENABLED:-false}
- A0_SET_A2A_SERVER_ENABLED=${A0_SET_A2A_SERVER_ENABLED:-false}

# API Keys (set your keys here)
- A0_SET_API_KEY_ANTHROPIC=${A0_SET_API_KEY_ANTHROPIC:-}
- A0_SET_API_KEY_DEEPSEEK=${A0_SET_API_KEY_DEEPSEEK:-}
- A0_SET_API_KEY_GOOGLE=${A0_SET_API_KEY_GOOGLE:-}
- A0_SET_API_KEY_GROQ=${A0_SET_API_KEY_GROQ:-}
- A0_SET_API_KEY_HUGGINGFACE=${A0_SET_API_KEY_HUGGINGFACE:-}
- A0_SET_API_KEY_LM_STUDIO=${A0_SET_API_KEY_LM_STUDIO:-}
- A0_SET_API_KEY_MISTRAL=${A0_SET_API_KEY_MISTRAL:-}
- A0_SET_API_KEY_OLLAMA=${A0_SET_API_KEY_OLLAMA:-}
- A0_SET_API_KEY_OPENAI=${A0_SET_API_KEY_OPENAI:-}
- A0_SET_API_KEY_AZURE=${A0_SET_API_KEY_AZURE:-}
- A0_SET_API_KEY_OPENROUTER=${A0_SET_API_KEY_OPENROUTER:-}
- A0_SET_API_KEY_SAMBANOVA=${A0_SET_API_KEY_SAMBANOVA:-}
- A0_SET_API_KEY_VENICE=${A0_SET_API_KEY_VENICE:-}
- A0_SET_API_KEY_OTHER=${A0_SET_API_KEY_OTHER:-}

healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 5s
restart: unless-stopped
# Additional configuration as needed

volumes:
root:
driver: local
a0:
driver: local
59 changes: 55 additions & 4 deletions python/helpers/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,7 @@ def convert_out(settings: Settings) -> SettingsOutput:
"title": "UI Login",
"description": "Set user name for web UI",
"type": "text",
"value": dotenv.get_dotenv_value(dotenv.KEY_AUTH_LOGIN) or "",
"value": dotenv.get_dotenv_value(dotenv.KEY_AUTH_LOGIN, os.getenv("A0_SET_AUTH_LOGIN", "")) or "",
}
)

Expand All @@ -532,7 +532,7 @@ def convert_out(settings: Settings) -> SettingsOutput:
"type": "password",
"value": (
PASSWORD_PLACEHOLDER
if dotenv.get_dotenv_value(dotenv.KEY_AUTH_PASSWORD)
if dotenv.get_dotenv_value(dotenv.KEY_AUTH_PASSWORD, os.getenv("A0_SET_AUTH_PASSWORD", ""))
else ""
),
}
Expand Down Expand Up @@ -1224,10 +1224,25 @@ def convert_in(settings: dict) -> Settings:

def get_settings() -> Settings:
global _settings

if not _settings:
print("attempting", "get_settings", "_read_file_settings")
_settings = _read_settings_file()
print("successfully", "get_settings", "_read_file_settings")

if not _settings:
print("attempting", "get_settings", "_get_envvar_settings")
_settings = _get_envvar_settings()
dotenv.load_dotenv()
print("successfully", "get_settings", "_get_envvar_settings")


if not _settings:
print("attempting", "get_settings", "get_default_settings")
_settings = get_default_settings()
print("successfully", "get_settings", "get_default_settings")


norm = normalize_settings(_settings)
return norm

Expand Down Expand Up @@ -1276,6 +1291,8 @@ def normalize_settings(settings: Settings) -> Settings:
# mcp server token is set automatically
copy["mcp_server_token"] = create_auth_token()
Copy link

@FringeNet FringeNet Aug 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like so:

# mcp server token is set automatically (use custom external API key if provided)
    custom_external_key = dotenv.get_dotenv_value("A0_EXTERNAL_API_KEY")
    if custom_external_key:
        copy["mcp_server_token"] = custom_external_key
    else:
        copy["mcp_server_token"] = create_auth_token()


print(copy)

return copy


Expand Down Expand Up @@ -1315,7 +1332,8 @@ def _remove_sensitive_settings(settings: Settings):

def _write_sensitive_settings(settings: Settings):
for key, val in settings["api_keys"].items():
dotenv.save_dotenv_value(key.upper(), val)
if val and val != "":
dotenv.save_dotenv_value(key.upper(), val)

dotenv.save_dotenv_value(dotenv.KEY_AUTH_LOGIN, settings["auth_login"])
if settings["auth_password"]:
Expand All @@ -1328,8 +1346,38 @@ def _write_sensitive_settings(settings: Settings):
if settings["root_password"]:
set_root_password(settings["root_password"])

def _get_envvar_settings() -> Settings:
env_settings = {}
env_settings['api_keys'] = {}

for key, value in os.environ.items():
if key.startswith("A0_SET_"):
setting_key = key[7:].lower()
#print(setting_key)

if setting_key.startswith("api_key"):
api_setting_key = "api_key_{}".format(setting_key[8:]) # remove 'api_keys_' prefix
#print(api_setting_key)
#print(setting_key[8:])

if dotenv.get_dotenv_value(api_setting_key.upper()) != value:
print(f"Saving API key {api_setting_key} to .env")
dotenv.save_dotenv_value(api_setting_key.upper(), value)

# Special handling for API keys, which are stored as a JSON string
env_settings["api_keys"][setting_key[8:]] = value
env_settings["api_keys"][api_setting_key] = value
#env_settings["api_keys"]['API_KEY_OPENROUTER'] = value
#env_settings['API_KEY_OPENROUTER'] = value

else:
env_settings[setting_key] = value

#print(env_settings)
return normalize_settings(env_settings) # type: ignore

def get_default_settings() -> Settings:

return Settings(
version=_get_version(),
chat_model_provider="openrouter",
Expand Down Expand Up @@ -1405,10 +1453,13 @@ def get_default_settings() -> Settings:
mcp_server_token=create_auth_token(),
a2a_server_enabled=False,
)


def _apply_settings(previous: Settings | None):
global _settings

print("_apply_settings", _settings)

if _settings:
from agent import AgentContext
from initialize import initialize_agent
Expand Down
4 changes: 2 additions & 2 deletions run_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ async def decorated(*args, **kwargs):
def requires_auth(f):
@wraps(f)
async def decorated(*args, **kwargs):
user = dotenv.get_dotenv_value("AUTH_LOGIN")
password = dotenv.get_dotenv_value("AUTH_PASSWORD")
user = dotenv.get_dotenv_value("AUTH_LOGIN", os.getenv("A0_SET_AUTH_LOGIN"))
password = dotenv.get_dotenv_value("AUTH_PASSWORD", os.getenv("A0_SET_AUTH_PASSWORD"))
if user and password:
auth = request.authorization
if not auth or not (auth.username == user and auth.password == password):
Expand Down