mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-16 01:35:36 -04:00
76c1f42ab0
#2753 made the agent loopback base port-configurable but only for _COOKBOOK_BASE in tool_implementations. Several other in-process loopback calls still hardcoded http://localhost:7000 and broke off port 7000: cookbook_serve_lifecycle (model-endpoints x2, shell/exec), builtin_actions (model/serve), task_routes (calendar x3), and the gallery/email calls in tool_implementations. Extract the resolution (ODYSSEUS_INTERNAL_BASE / APP_PORT / 7000 fallback, 127.0.0.1 to avoid IPv6 ambiguity) into core.constants.internal_api_base() and route every call site through it. Rename the now-misnamed _COOKBOOK_BASE to _INTERNAL_BASE since it serves gallery/email/calendar/serve too. Adds a test for the resolver plus a regression guard against reintroducing the literal. Part of #2752. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
# src/constants.py
|
|
"""Application-wide constants and configuration values."""
|
|
import os
|
|
|
|
APP_VERSION = "0.9.1"
|
|
|
|
# Base paths
|
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "/"
|
|
STATIC_DIR = os.path.join(BASE_DIR, "static")
|
|
DATA_DIR = os.path.join(BASE_DIR, "data")
|
|
|
|
# Data file paths
|
|
SESSIONS_FILE = os.path.join(DATA_DIR, "sessions.json")
|
|
MEMORY_FILE = os.path.join(DATA_DIR, "memory.json")
|
|
MEMORY_DOC = os.path.join(DATA_DIR, "memory_doc.md")
|
|
PERSONAL_DIR = os.path.join(DATA_DIR, "personal_docs")
|
|
RUNBOOK_DIR = os.path.join(PERSONAL_DIR, "runbook")
|
|
UPLOAD_DIR = os.path.join(DATA_DIR, "uploads")
|
|
FEATURES_FILE = os.path.join(DATA_DIR, "features.json")
|
|
SETTINGS_FILE = os.path.join(DATA_DIR, "settings.json")
|
|
|
|
# API Configuration
|
|
MAX_CONTEXT_MESSAGES = 90
|
|
REQUEST_TIMEOUT = 20
|
|
OPENAI_COMPAT_PATH = "/v1/chat/completions"
|
|
|
|
# Environment variables with defaults
|
|
DEFAULT_HOST = os.getenv("LLM_HOST", "localhost")
|
|
LLM_HOSTS = [h.strip() for h in os.getenv("LLM_HOSTS", "").split(",") if h.strip()]
|
|
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
|
|
SEARXNG_INSTANCE = os.getenv('SEARXNG_INSTANCE', 'http://localhost:8080')
|
|
|
|
|
|
# Cleanup configuration
|
|
CLEANUP_ENABLED = os.getenv("CLEANUP_ENABLED", "True").lower() == "true"
|
|
CLEANUP_INTERVAL_HOURS = int(os.getenv("CLEANUP_INTERVAL_HOURS", "24"))
|
|
|
|
# Default parameters
|
|
DEFAULT_TEMPERATURE = 1.0
|
|
DEFAULT_MAX_TOKENS = 0
|
|
|
|
|
|
def internal_api_base() -> str:
|
|
"""Base URL for in-process loopback calls to Odysseus's own API.
|
|
|
|
Agent tools and background jobs reach admin-gated routes by calling the
|
|
running server over HTTP. Resolution order:
|
|
1. ODYSSEUS_INTERNAL_BASE - explicit override (e.g. behind a TLS proxy).
|
|
2. APP_PORT - http://127.0.0.1:$APP_PORT (docker-compose).
|
|
3. Fallback http://127.0.0.1:7000 - legacy default.
|
|
|
|
127.0.0.1 (not "localhost") avoids IPv6/DNS ambiguity for a strictly-local
|
|
call. Without this, loopback tools fail with "All connection attempts
|
|
failed" whenever the server is not on port 7000.
|
|
"""
|
|
override = os.environ.get("ODYSSEUS_INTERNAL_BASE")
|
|
if override:
|
|
return override.rstrip("/")
|
|
return f"http://127.0.0.1:{os.environ.get('APP_PORT', '7000')}"
|