diff --git a/backend/packages/harness/deerflow/agents/middlewares/loop_detection_middleware.py b/backend/packages/harness/deerflow/agents/middlewares/loop_detection_middleware.py index 0ae892a..0c2dd88 100644 --- a/backend/packages/harness/deerflow/agents/middlewares/loop_detection_middleware.py +++ b/backend/packages/harness/deerflow/agents/middlewares/loop_detection_middleware.py @@ -106,7 +106,7 @@ class LoopDetectionMiddleware(AgentMiddleware[AgentState]): def _get_thread_id(self, runtime: Runtime) -> str: """Extract thread_id from runtime context for per-thread tracking.""" - thread_id = runtime.context.get("thread_id") + thread_id = runtime.context.get("thread_id") if runtime.context else None if thread_id: return thread_id return "default" diff --git a/backend/packages/harness/deerflow/agents/middlewares/memory_middleware.py b/backend/packages/harness/deerflow/agents/middlewares/memory_middleware.py index 5076b0d..7dc01d1 100644 --- a/backend/packages/harness/deerflow/agents/middlewares/memory_middleware.py +++ b/backend/packages/harness/deerflow/agents/middlewares/memory_middleware.py @@ -120,7 +120,7 @@ class MemoryMiddleware(AgentMiddleware[MemoryMiddlewareState]): return None # Get thread ID from runtime context - thread_id = runtime.context.get("thread_id") + thread_id = runtime.context.get("thread_id") if runtime.context else None if not thread_id: print("MemoryMiddleware: No thread_id in context, skipping memory update") return None diff --git a/backend/packages/harness/deerflow/agents/middlewares/uploads_middleware.py b/backend/packages/harness/deerflow/agents/middlewares/uploads_middleware.py index 22a5448..dbd4727 100644 --- a/backend/packages/harness/deerflow/agents/middlewares/uploads_middleware.py +++ b/backend/packages/harness/deerflow/agents/middlewares/uploads_middleware.py @@ -146,7 +146,7 @@ class UploadsMiddleware(AgentMiddleware[UploadsMiddlewareState]): return None # Resolve uploads directory for existence checks - thread_id = runtime.context.get("thread_id") + thread_id = runtime.context.get("thread_id") if runtime.context else None uploads_dir = self._paths.sandbox_uploads_dir(thread_id) if thread_id else None # Get newly uploaded files from the current message's additional_kwargs.files diff --git a/backend/packages/harness/deerflow/sandbox/middleware.py b/backend/packages/harness/deerflow/sandbox/middleware.py index 61cfece..caf6e46 100644 --- a/backend/packages/harness/deerflow/sandbox/middleware.py +++ b/backend/packages/harness/deerflow/sandbox/middleware.py @@ -71,7 +71,7 @@ class SandboxMiddleware(AgentMiddleware[SandboxMiddlewareState]): get_sandbox_provider().release(sandbox_id) return None - if runtime.context.get("sandbox_id") is not None: + if runtime.context and runtime.context.get("sandbox_id") is not None: sandbox_id = runtime.context.get("sandbox_id") logger.info(f"Releasing sandbox {sandbox_id} from context") get_sandbox_provider().release(sandbox_id) diff --git a/backend/packages/harness/deerflow/sandbox/tools.py b/backend/packages/harness/deerflow/sandbox/tools.py index 639bd05..2a468dc 100644 --- a/backend/packages/harness/deerflow/sandbox/tools.py +++ b/backend/packages/harness/deerflow/sandbox/tools.py @@ -483,7 +483,7 @@ def ensure_sandbox_initialized(runtime: ToolRuntime[ContextT, ThreadState] | Non # Sandbox was released, fall through to acquire new one # Lazy acquisition: get thread_id and acquire sandbox - thread_id = runtime.context.get("thread_id") + thread_id = runtime.context.get("thread_id") if runtime.context else None if thread_id is None: raise SandboxRuntimeError("Thread ID not available in runtime context") diff --git a/backend/packages/harness/deerflow/tools/builtins/present_file_tool.py b/backend/packages/harness/deerflow/tools/builtins/present_file_tool.py index 47a7648..1e0c761 100644 --- a/backend/packages/harness/deerflow/tools/builtins/present_file_tool.py +++ b/backend/packages/harness/deerflow/tools/builtins/present_file_tool.py @@ -33,7 +33,7 @@ def _normalize_presented_filepath( if runtime.state is None: raise ValueError("Thread runtime state is not available") - thread_id = runtime.context.get("thread_id") + thread_id = runtime.context.get("thread_id") if runtime.context else None if not thread_id: raise ValueError("Thread ID is not available in runtime context") diff --git a/backend/packages/harness/deerflow/tools/builtins/setup_agent_tool.py b/backend/packages/harness/deerflow/tools/builtins/setup_agent_tool.py index 26937fe..940e23e 100644 --- a/backend/packages/harness/deerflow/tools/builtins/setup_agent_tool.py +++ b/backend/packages/harness/deerflow/tools/builtins/setup_agent_tool.py @@ -24,7 +24,7 @@ def setup_agent( description: One-line description of what the agent does. """ - agent_name: str | None = runtime.context.get("agent_name") + agent_name: str | None = runtime.context.get("agent_name") if runtime.context else None try: paths = get_paths() diff --git a/backend/packages/harness/deerflow/tools/builtins/task_tool.py b/backend/packages/harness/deerflow/tools/builtins/task_tool.py index 902e1d7..71b348c 100644 --- a/backend/packages/harness/deerflow/tools/builtins/task_tool.py +++ b/backend/packages/harness/deerflow/tools/builtins/task_tool.py @@ -85,7 +85,7 @@ def task_tool( if runtime is not None: sandbox_state = runtime.state.get("sandbox") thread_data = runtime.state.get("thread_data") - thread_id = runtime.context.get("thread_id") + thread_id = runtime.context.get("thread_id") if runtime.context else None # Try to get parent model from configurable metadata = runtime.config.get("metadata", {}) diff --git a/scripts/serve.sh b/scripts/serve.sh index 3acef6a..c96e794 100755 --- a/scripts/serve.sh +++ b/scripts/serve.sh @@ -9,6 +9,13 @@ set -e REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$REPO_ROOT" +# ── Load environment variables from .env ────────────────────────────────────── +if [ -f "$REPO_ROOT/.env" ]; then + set -a + source "$REPO_ROOT/.env" + set +a +fi + # ── Argument parsing ───────────────────────────────────────────────────────── DEV_MODE=true