diff --git a/.env.development b/.env.development index c333da04b..4387475c8 100644 --- a/.env.development +++ b/.env.development @@ -5,4 +5,26 @@ VITE_PROXY_URL=https://dev.eigent.ai VITE_USE_LOCAL_PROXY=false # VITE_PROXY_URL=http://localhost:3001 -# VITE_USE_LOCAL_PROXY=true \ No newline at end of file +# VITE_USE_LOCAL_PROXY=true + +TRACEROOT_TOKEN=your_traceroot_token_here + +TRACEROOT_SERVICE_NAME=eigent + +TRACEROOT_GITHUB_OWNER=eigent + +TRACEROOT_GITHUB_REPO_NAME=eigent + +TRACEROOT_GITHUB_COMMIT_HASH=main + +TRACEROOT_ENABLE_SPAN_CLOUD_EXPORT=true + +TRACEROOT_ENABLE_LOG_CLOUD_EXPORT=true + +TRACEROOT_ENABLE_SPAN_CONSOLE_EXPORT=false + +TRACEROOT_ENABLE_LOG_CONSOLE_EXPORT=true + +TRACEROOT_TRACER_VERBOSE=false + +TRACEROOT_LOGGER_VERBOSE=false \ No newline at end of file diff --git a/backend/app/component/environment.py b/backend/app/component/environment.py index 3c43be8c6..159e660cf 100644 --- a/backend/app/component/environment.py +++ b/backend/app/component/environment.py @@ -1,4 +1,4 @@ -from utils import traceroot_wrapper as traceroot +import traceroot import importlib.util import os from pathlib import Path diff --git a/backend/app/controller/chat_controller.py b/backend/app/controller/chat_controller.py index c9d55ceeb..8db93068e 100644 --- a/backend/app/controller/chat_controller.py +++ b/backend/app/controller/chat_controller.py @@ -5,7 +5,7 @@ from pathlib import Path from dotenv import load_dotenv from fastapi import APIRouter, Request, Response from fastapi.responses import StreamingResponse -from utils import traceroot_wrapper as traceroot +import traceroot from app.component import code from app.exception.exception import UserException from app.model.chat import Chat, HumanReply, McpServers, Status, SupplementChat diff --git a/backend/app/controller/model_controller.py b/backend/app/controller/model_controller.py index 44846da0f..396f0d045 100644 --- a/backend/app/controller/model_controller.py +++ b/backend/app/controller/model_controller.py @@ -3,7 +3,7 @@ from pydantic import BaseModel, Field from app.component.model_validation import create_agent from camel.types import ModelType from app.component.error_format import normalize_error_to_openai_format -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("model_controller") diff --git a/backend/app/controller/task_controller.py b/backend/app/controller/task_controller.py index 00d3eee89..29c432727 100644 --- a/backend/app/controller/task_controller.py +++ b/backend/app/controller/task_controller.py @@ -15,9 +15,8 @@ from app.service.task import ( ) import asyncio from app.component.environment import set_user_env_path -from utils import traceroot_wrapper as traceroot +import traceroot -# traceroot logger for task controller logger = traceroot.get_logger("task_controller") diff --git a/backend/app/controller/tool_controller.py b/backend/app/controller/tool_controller.py index 40d92ce22..fe4ae58aa 100644 --- a/backend/app/controller/tool_controller.py +++ b/backend/app/controller/tool_controller.py @@ -1,12 +1,9 @@ from fastapi import APIRouter, HTTPException from app.utils.toolkit.notion_mcp_toolkit import NotionMCPToolkit from app.utils.toolkit.google_calendar_toolkit import GoogleCalendarToolkit -from utils import traceroot_wrapper as traceroot +import traceroot -# traceroot logger for tool controller logger = traceroot.get_logger("tool_controller") - - router = APIRouter(tags=["task"]) diff --git a/backend/app/exception/handler.py b/backend/app/exception/handler.py index 2f868e0d2..4db50f02d 100644 --- a/backend/app/exception/handler.py +++ b/backend/app/exception/handler.py @@ -8,7 +8,7 @@ from app.component import code from app.exception.exception import NoPermissionException, ProgramException, TokenException from app.component.pydantic.i18n import trans, get_language from app.exception.exception import UserException -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("exception_handler") diff --git a/backend/app/model/chat.py b/backend/app/model/chat.py index ff8e984c2..2d8541e60 100644 --- a/backend/app/model/chat.py +++ b/backend/app/model/chat.py @@ -5,7 +5,7 @@ import re from typing import Literal from pydantic import BaseModel, field_validator from camel.types import ModelType, RoleType -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("chat_model") diff --git a/backend/app/service/chat_service.py b/backend/app/service/chat_service.py index 62f026f26..8f54d3364 100644 --- a/backend/app/service/chat_service.py +++ b/backend/app/service/chat_service.py @@ -39,7 +39,7 @@ from app.service.task import Action, Agents from app.utils.server.sync_step import sync_step from camel.types import ModelPlatformType from camel.models import ModelProcessingError -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("chat_service") diff --git a/backend/app/service/task.py b/backend/app/service/task.py index 108df70d8..88eaa9e1c 100644 --- a/backend/app/service/task.py +++ b/backend/app/service/task.py @@ -9,7 +9,7 @@ from contextlib import contextmanager from contextvars import ContextVar from datetime import datetime, timedelta import weakref -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("task_service") diff --git a/backend/app/utils/agent.py b/backend/app/utils/agent.py index f27c9ee88..c304f9747 100644 --- a/backend/app/utils/agent.py +++ b/backend/app/utils/agent.py @@ -6,7 +6,7 @@ from threading import Event import traceback from typing import Any, Callable, Dict, List, Tuple import uuid -from utils import traceroot_wrapper as traceroot +import traceroot from camel.agents import ChatAgent from camel.agents.chat_agent import StreamingChatAgentResponse, AsyncStreamingChatAgentResponse from camel.agents._types import ToolCallRequest diff --git a/backend/app/utils/listen/toolkit_listen.py b/backend/app/utils/listen/toolkit_listen.py index 4361a9f5a..fa6ce44b5 100644 --- a/backend/app/utils/listen/toolkit_listen.py +++ b/backend/app/utils/listen/toolkit_listen.py @@ -10,7 +10,7 @@ from app.service.task import ( ) from app.utils.toolkit.abstract_toolkit import AbstractToolkit from app.service.task import process_task -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("toolkit_listen") diff --git a/backend/app/utils/server/sync_step.py b/backend/app/utils/server/sync_step.py index 9630b51f7..4d84fdd6b 100644 --- a/backend/app/utils/server/sync_step.py +++ b/backend/app/utils/server/sync_step.py @@ -5,7 +5,7 @@ import os import json from app.service.chat_service import Chat from app.component.environment import env -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("sync_step") diff --git a/backend/app/utils/toolkit/human_toolkit.py b/backend/app/utils/toolkit/human_toolkit.py index 461369749..dc0eac064 100644 --- a/backend/app/utils/toolkit/human_toolkit.py +++ b/backend/app/utils/toolkit/human_toolkit.py @@ -5,7 +5,7 @@ from app.service.task import Action, ActionAskData, ActionNoticeData, get_task_l from app.utils.listen.toolkit_listen import listen_toolkit from app.utils.toolkit.abstract_toolkit import AbstractToolkit from app.service.task import process_task -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("human_toolkit") diff --git a/backend/app/utils/toolkit/hybrid_browser_python_toolkit.py b/backend/app/utils/toolkit/hybrid_browser_python_toolkit.py index a14370e2b..a5918ace5 100644 --- a/backend/app/utils/toolkit/hybrid_browser_python_toolkit.py +++ b/backend/app/utils/toolkit/hybrid_browser_python_toolkit.py @@ -17,7 +17,7 @@ from app.exception.exception import ProgramException from app.service.task import Agents from app.utils.listen.toolkit_listen import listen_toolkit from app.utils.toolkit.abstract_toolkit import AbstractToolkit -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("hybrid_browser_python_toolkit") diff --git a/backend/app/utils/toolkit/hybrid_browser_toolkit.py b/backend/app/utils/toolkit/hybrid_browser_toolkit.py index f99c334b7..d983cb83c 100644 --- a/backend/app/utils/toolkit/hybrid_browser_toolkit.py +++ b/backend/app/utils/toolkit/hybrid_browser_toolkit.py @@ -17,7 +17,7 @@ from app.component.environment import env from app.service.task import Agents from app.utils.listen.toolkit_listen import listen_toolkit from app.utils.toolkit.abstract_toolkit import AbstractToolkit -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("hybrid_browser_toolkit") diff --git a/backend/app/utils/toolkit/notion_mcp_toolkit.py b/backend/app/utils/toolkit/notion_mcp_toolkit.py index f50bfe21b..54f55d95a 100644 --- a/backend/app/utils/toolkit/notion_mcp_toolkit.py +++ b/backend/app/utils/toolkit/notion_mcp_toolkit.py @@ -4,7 +4,7 @@ from camel.toolkits import FunctionTool from app.component.environment import env from app.utils.toolkit.abstract_toolkit import AbstractToolkit from camel.toolkits.mcp_toolkit import MCPToolkit -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("notion_mcp_toolkit") diff --git a/backend/app/utils/toolkit/search_toolkit.py b/backend/app/utils/toolkit/search_toolkit.py index 86c275768..de272f9c0 100644 --- a/backend/app/utils/toolkit/search_toolkit.py +++ b/backend/app/utils/toolkit/search_toolkit.py @@ -6,7 +6,7 @@ from app.component.environment import env, env_not_empty from app.service.task import Agents from app.utils.listen.toolkit_listen import listen_toolkit from app.utils.toolkit.abstract_toolkit import AbstractToolkit -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("search_toolkit") diff --git a/backend/app/utils/toolkit/slack_toolkit.py b/backend/app/utils/toolkit/slack_toolkit.py index 7949def79..3e0f02ed9 100644 --- a/backend/app/utils/toolkit/slack_toolkit.py +++ b/backend/app/utils/toolkit/slack_toolkit.py @@ -4,7 +4,7 @@ from app.component.environment import env from app.service.task import Agents from app.utils.listen.toolkit_listen import listen_toolkit from app.utils.toolkit.abstract_toolkit import AbstractToolkit -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("slack_toolkit") diff --git a/backend/app/utils/workforce.py b/backend/app/utils/workforce.py index 3b948131a..e32c7221d 100644 --- a/backend/app/utils/workforce.py +++ b/backend/app/utils/workforce.py @@ -22,7 +22,7 @@ from app.service.task import ( get_task_lock, ) from app.utils.single_agent_worker import SingleAgentWorker -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("workforce") diff --git a/backend/main.py b/backend/main.py index e97cb9bd8..5b9d4c7a7 100644 --- a/backend/main.py +++ b/backend/main.py @@ -3,25 +3,19 @@ import pathlib import signal import asyncio import atexit -import sys + from dotenv import load_dotenv -# Add project root to path for shared utils -sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) -# Initialize TraceRoot before other imports -from utils import traceroot_wrapper as traceroot - -if traceroot.is_enabled(): - import traceroot as tr - tr.init() - from traceroot.integrations.fastapi import connect_fastapi - +# 1) Load env and init traceroot BEFORE importing modules that get a logger +load_dotenv() +import traceroot +from traceroot.integrations.fastapi import connect_fastapi from app import api -from app.component.environment import auto_include_routers, env +traceroot.init() +connect_fastapi(api) -# Connect FastAPI to TraceRoot if enabled -if traceroot.is_enabled(): - connect_fastapi(api) +# 2) Now safe to import modules that use traceroot.get_logger() at import-time +from app.component.environment import auto_include_routers, env os.environ["PYTHONIOENCODING"] = "utf-8" diff --git a/server/app/controller/chat/history_controller.py b/server/app/controller/chat/history_controller.py index b89575704..65961cda3 100644 --- a/server/app/controller/chat/history_controller.py +++ b/server/app/controller/chat/history_controller.py @@ -6,7 +6,7 @@ from fastapi_babel import _ from sqlmodel import Session, select, desc from app.component.auth import Auth, auth_must from app.component.database import session -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("server_chat_history") diff --git a/server/app/controller/mcp/mcp_controller.py b/server/app/controller/mcp/mcp_controller.py index 8fd6325e2..6613e236b 100644 --- a/server/app/controller/mcp/mcp_controller.py +++ b/server/app/controller/mcp/mcp_controller.py @@ -13,7 +13,7 @@ from app.model.mcp.mcp_env import McpEnv, Status as McpEnvStatus from app.model.mcp.mcp_user import McpImportType, McpUser, Status from camel.toolkits.mcp_toolkit import MCPToolkit from app.component.environment import env -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("server_mcp_controller") diff --git a/server/app/controller/mcp/proxy_controller.py b/server/app/controller/mcp/proxy_controller.py index dd36dd98b..e10e5142d 100644 --- a/server/app/controller/mcp/proxy_controller.py +++ b/server/app/controller/mcp/proxy_controller.py @@ -5,7 +5,7 @@ from app.component.environment import env_not_empty from app.model.mcp.proxy import ExaSearch from typing import Any, cast import requests -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("server_proxy_controller") diff --git a/server/app/controller/mcp/user_controller.py b/server/app/controller/mcp/user_controller.py index e6aad7b08..a360b8733 100644 --- a/server/app/controller/mcp/user_controller.py +++ b/server/app/controller/mcp/user_controller.py @@ -9,7 +9,7 @@ from app.model.mcp.mcp_user import McpUser, McpUserIn, McpUserOut, McpUserUpdate from app.model.mcp.mcp import Mcp from camel.toolkits.mcp_toolkit import MCPToolkit from app.component.environment import env -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("server_mcp_user_controller") diff --git a/server/app/controller/user/login_controller.py b/server/app/controller/user/login_controller.py index 1c10a6a0f..d0ec281a2 100644 --- a/server/app/controller/user/login_controller.py +++ b/server/app/controller/user/login_controller.py @@ -9,7 +9,7 @@ from app.component.stack_auth import StackAuth from app.exception.exception import UserException from app.model.user.user import LoginByPasswordIn, LoginResponse, Status, User, RegisterIn from app.component.environment import env -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("server_login_controller") @@ -26,9 +26,7 @@ async def by_password(data: LoginByPasswordIn, session: Session = Depends(sessio logger.info(f"Login attempt for email: {data.email}") user = User.by(User.email == data.email, s=session).one_or_none() if not user or not password_verify(data.password, user.password): - logger.warning(f"Failed login attempt for email: {data.email}") raise UserException(code.password, _("Account or password error")) - logger.info(f"Successful login for user: {user.id}") return LoginResponse(token=Auth.create_access_token(user.id), email=user.email) diff --git a/server/app/model/user/user_credits_record.py b/server/app/model/user/user_credits_record.py index 4fa2b262c..d217250dc 100644 --- a/server/app/model/user/user_credits_record.py +++ b/server/app/model/user/user_credits_record.py @@ -8,7 +8,7 @@ from app.model.abstract.model import AbstractModel, DefaultTimes from datetime import date, datetime, timedelta from app.model.user.key import ModelType from app.component.database import session_make -from utils import traceroot_wrapper as traceroot +import traceroot logger = traceroot.get_logger("user_credits_record") diff --git a/server/main.py b/server/main.py index 453574ef7..2373ba579 100644 --- a/server/main.py +++ b/server/main.py @@ -1,34 +1,20 @@ import os -import sys -from pathlib import Path from dotenv import load_dotenv - -# Add project root to path for shared utils -sys.path.insert(0, str(Path(__file__).parent.parent)) - - -# Initialize TraceRoot before other imports -from utils import traceroot_wrapper as traceroot - -if traceroot.is_enabled(): - import traceroot as tr - tr.init() - from traceroot.integrations.fastapi import connect_fastapi - +import traceroot from app import api from app.component.environment import auto_include_routers, env from fastapi.staticfiles import StaticFiles -# Connect FastAPI to TraceRoot if enabled -if traceroot.is_enabled(): - connect_fastapi(api) +load_dotenv() +traceroot.init() +from traceroot.integrations.fastapi import connect_fastapi +connect_fastapi(api) logger = traceroot.get_logger("server_main") prefix = env("url_prefix", "") auto_include_routers(api, prefix, "app/controller") public_dir = os.environ.get("PUBLIC_DIR") or os.path.join(os.path.dirname(__file__), "app", "public") -# Ensure static directory exists or gracefully skip mounting if not os.path.isdir(public_dir): try: os.makedirs(public_dir, exist_ok=True) diff --git a/utils/traceroot_wrapper.py b/utils/traceroot_wrapper.py deleted file mode 100644 index fbc5e4dba..000000000 --- a/utils/traceroot_wrapper.py +++ /dev/null @@ -1,51 +0,0 @@ -from pathlib import Path -from typing import Callable -import logging - - -def _find_config() -> bool: - """Check if .traceroot-config.yaml exists in current or parent directories.""" - path = Path.cwd() - for _ in range(10): # Search up to 10 levels - if (path / ".traceroot-config.yaml").exists(): - return True - if path == path.parent: - break - path = path.parent - return False - - -# Load traceroot only if config exists -_TRACEROOT_ENABLED = _find_config() - -if _TRACEROOT_ENABLED: - import traceroot - from traceroot.logger import get_logger as _get_traceroot_logger - - trace = traceroot.trace - - def get_logger(name: str = __name__): - """Get TraceRoot logger instance.""" - return _get_traceroot_logger(name) - - def is_enabled() -> bool: - """Check if TraceRoot is enabled.""" - return True -else: - # No-op implementations when TraceRoot is not configured - def trace(): - """No-op trace decorator.""" - def decorator(func: Callable) -> Callable: - return func - return decorator - - def get_logger(name: str = __name__): - """Get standard Python logger when TraceRoot is disabled.""" - return logging.getLogger(name) - - def is_enabled() -> bool: - """Check if TraceRoot is enabled.""" - return False - - -__all__ = ['trace', 'get_logger', 'is_enabled']