Merge branch 'main' into feat/settings-privacy-optimization-235

This commit is contained in:
Wendong-Fan 2025-08-29 19:40:24 +08:00 committed by GitHub
commit f61ae46c8f
8 changed files with 57 additions and 45 deletions

View file

@ -99,7 +99,7 @@ jobs:
run: |
mkdir -p release/mac-x64 release/mac-arm64 release/win-x64
# Download all artifacts with correct names
# Download all artifacts with correct names
- name: Download mac-x64 artifact
uses: actions/download-artifact@v4
with:
@ -120,38 +120,35 @@ jobs:
# Move files to final release directory, removing any nested release/ directory
- name: Move files to clean folders
shell: bash
run: |
# mac-x64
if [ -d "temp-mac-x64/release" ]; then
mv temp-mac-x64/release/* release/mac-x64/
elif [ -d "temp-mac-x64" ]; then
mv temp-mac-x64/* release/mac-x64/
mv temp-mac-x64/release/* release/mac-x64/ || true
else
mv temp-mac-x64/* release/mac-x64/ || true
fi
# mac-arm64
if [ -d "temp-mac-arm64/release" ]; then
mv temp-mac-arm64/release/* release/mac-arm64/
elif [ -d "temp-mac-arm64" ]; then
mv temp-mac-arm64/* release/mac-arm64/
mv temp-mac-arm64/release/* release/mac-arm64/ || true
else
mv temp-mac-arm64/* release/mac-arm64/ || true
fi
# win-x64
if [ -d "temp-win-x64/release" ]; then
mv temp-win-x64/release/* release/win-x64/
elif [ -d "temp-win-x64" ]; then
mv temp-win-x64/* release/win-x64/
mv temp-win-x64/release/* release/win-x64/ || true
else
mv temp-win-x64/* release/win-x64/ || true
fi
- name: Rename duplicate files
run: |
if [ -f "release/mac-x64/latest-mac.yml" ]; then
mv release/mac-x64/latest-mac.yml release/mac-x64/latest-x64-mac.yml
fi
if [ -f "release/mac-arm64/latest-mac.yml" ]; then
mv release/mac-arm64/latest-mac.yml release/mac-arm64/latest-arm64-mac.yml
fi
mv release/mac-x64/latest-mac.yml release/mac-x64/latest-x64-mac.yml || true
mv release/mac-arm64/latest-mac.yml release/mac-arm64/latest-arm64-mac.yml || true
# 最终创建 GitHub Release
# Create GitHub Release
- name: Create GitHub Release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v1
@ -161,4 +158,4 @@ jobs:
release/mac-arm64/*
release/win-x64/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -221,7 +221,7 @@ class ListenChatAgent(ChatAgent):
error_info = None
message = None
res = None
traceroot_logger.info(f"Agent {self.agent_name} starting async step with message: {input_message.content if isinstance(input_message, BaseMessage) else input_message}")
traceroot_logger.debug(f"Agent {self.agent_name} starting async step with message: {input_message.content if isinstance(input_message, BaseMessage) else input_message}")
try:
res = await super().astep(input_message, response_format)
@ -290,7 +290,7 @@ class ListenChatAgent(ChatAgent):
task_lock = get_task_lock(self.api_task_id)
toolkit_name = getattr(tool, "_toolkit_name") if hasattr(tool, "_toolkit_name") else "mcp_toolkit"
traceroot_logger.info(f"Agent {self.agent_name} executing tool: {func_name} from toolkit: {toolkit_name} with args: {json.dumps(args, ensure_ascii=False)}")
traceroot_logger.debug(f"Agent {self.agent_name} executing tool: {func_name} from toolkit: {toolkit_name} with args: {json.dumps(args, ensure_ascii=False)}")
asyncio.create_task(
task_lock.put_queue(
ActionActivateToolkitData(

View file

@ -129,7 +129,7 @@ def listen_toolkit(
error = None
res = None
try:
print(">>>>", func.__name__, "<<<<")
logger.debug(f"Executing toolkit method: {toolkit_name}.{method_name} for agent '{toolkit.agent_name}'")
res = func(*args, **kwargs)
# Safety check: if the result is a coroutine, we need to await it
if asyncio.iscoroutine(res):

View file

@ -5,24 +5,20 @@ import asyncio
import atexit
from app import api
from loguru import logger
from app.utils import traceroot_wrapper as traceroot
from app.component.environment import auto_include_routers, env
# Create traceroot logger for main application
traceroot_logger = traceroot.get_logger('main')
os.environ["PYTHONIOENCODING"] = "utf-8"
# Log application startup
traceroot_logger.info("Starting Eigent Multi-Agent System API")
traceroot_logger.info(f"Python encoding: {os.environ.get('PYTHONIOENCODING')}")
traceroot_logger.info(f"Environment: {os.environ.get('ENVIRONMENT', 'development')}")
logger.info("Starting Eigent Multi-Agent System API")
logger.info(f"Python encoding: {os.environ.get('PYTHONIOENCODING')}")
logger.info(f"Environment: {os.environ.get('ENVIRONMENT', 'development')}")
prefix = env("url_prefix", "")
traceroot_logger.info(f"Loading routers with prefix: '{prefix}'")
logger.info(f"Loading routers with prefix: '{prefix}'")
auto_include_routers(api, prefix, "app/controller")
traceroot_logger.info("All routers loaded successfully")
logger.info("All routers loaded successfully")
# Configure Loguru
@ -35,36 +31,34 @@ logger.add(
level="DEBUG", # Log level
encoding="utf-8",
)
traceroot_logger.info(f"Loguru configured with log file: {log_path}")
logger.info(f"Loguru configured with log file: {log_path}")
dir = pathlib.Path(__file__).parent / "runtime"
dir.mkdir(parents=True, exist_ok=True)
# Write PID file asynchronously
@traceroot.trace()
async def write_pid_file():
r"""Write PID file asynchronously"""
import aiofiles
async with aiofiles.open(dir / "run.pid", "w") as f:
await f.write(str(os.getpid()))
traceroot_logger.info(f"PID file written: {os.getpid()}")
logger.info(f"PID file written: {os.getpid()}")
# Create task to write PID
pid_task = asyncio.create_task(write_pid_file())
traceroot_logger.info("PID write task created")
logger.info("PID write task created")
# Graceful shutdown handler
shutdown_event = asyncio.Event()
@traceroot.trace()
async def cleanup_resources():
r"""Cleanup all resources on shutdown"""
logger.info("Starting graceful shutdown...")
traceroot_logger.info("Starting graceful shutdown process")
logger.info("Starting graceful shutdown process")
from app.service.task import task_locks, _cleanup_task
@ -89,14 +83,13 @@ async def cleanup_resources():
pid_file.unlink()
logger.info("Graceful shutdown completed")
traceroot_logger.info("All resources cleaned up successfully")
logger.info("All resources cleaned up successfully")
@traceroot.trace()
def signal_handler(signum, frame):
r"""Handle shutdown signals"""
logger.info(f"Received signal {signum}")
traceroot_logger.warning(f"Received shutdown signal: {signum}")
logger.warning(f"Received shutdown signal: {signum}")
asyncio.create_task(cleanup_resources())
shutdown_event.set()
@ -108,4 +101,4 @@ signal.signal(signal.SIGINT, signal_handler)
atexit.register(lambda: asyncio.run(cleanup_resources()))
# Log successful initialization
traceroot_logger.info("Application initialization completed successfully")
logger.info("Application initialization completed successfully")

View file

@ -123,6 +123,8 @@ nativeTheme.themeSource = 'light';
// Set log level
log.transports.console.level = 'info';
log.transports.file.level = 'info';
log.transports.console.format = '[{level}]{text}';
log.transports.file.format = '[{level}]{text}';
// Disable GPU Acceleration for Windows 7
if (os.release().startsWith('6.1')) app.disableHardwareAcceleration()
@ -362,7 +364,7 @@ function registerIpcHandlers() {
stderr += output;
if (output.includes('OAuth callback server running at')) {
const url = output.split('OAuth callback server running at')[1].trim();
log.info(' detect OAuth callback URL:', url);
log.info('detect OAuth callback URL:', url);
// Notify frontend to callback URL
if (win && !win.isDestroyed()) {

View file

@ -302,6 +302,23 @@ export async function startBackend(setPort?: (port: number) => void): Promise<an
SERVER_URL: "https://dev.eigent.ai/api",
PYTHONIOENCODING: 'utf-8'
}
//Redirect output
const displayFilteredLogs = (data:String) => {
if (!data) return;
const msg = data.toString().trimEnd();
if (msg.toLowerCase().includes("error") || msg.toLowerCase().includes("traceback")) {
log.error(`BACKEND: ${msg}`);
} else if (msg.toLowerCase().includes("warn")) {
//Skip Warnings
// log.warn(`BACKEND: ${msg}`);
} else if (msg.includes("DEBUG")) {
log.debug(`BACKEND: ${msg}`);
} else {
log.info(`BACKEND: ${msg}`); // treat uvicorn info logs as normal
}
}
return new Promise((resolve, reject) => {
const node_process = spawn(
uv_path,
@ -320,7 +337,7 @@ export async function startBackend(setPort?: (port: number) => void): Promise<an
node_process.stdout.on('data', (data) => {
log.info(`fastapi output: ${data}`);
displayFilteredLogs(data);
// check output content, judge if start success
if (!started && data.toString().includes("Uvicorn running on")) {
started = true;
@ -330,7 +347,8 @@ export async function startBackend(setPort?: (port: number) => void): Promise<an
});
node_process.stderr.on('data', (data) => {
log.error(`fastapi stderr output: ${data}`);
displayFilteredLogs(data);
if (!started && data.toString().includes("Uvicorn running on")) {
started = true;
clearTimeout(startTimeout);

View file

@ -170,7 +170,7 @@ async function proxyFetchRequest(
...customHeaders,
}
console.log('url', url, token)
console.debug('url', url, token)
if (!url.includes('http://') && !url.includes('https://') && token) {
headers['Authorization'] = `Bearer ${token}`
}

View file

@ -19,7 +19,7 @@ const HAS_STACK_KEYS = hasStackKeys();
let lock = false;
export default function Login() {
const app = HAS_STACK_KEYS ? useStackApp() : null;
const { setAuth } = useAuthStore();
const { setAuth,setModelType } = useAuthStore();
const navigate = useNavigate();
const location = useLocation();
const [hidePassword, setHidePassword] = useState(true);
@ -100,6 +100,7 @@ export default function Login() {
}
setAuth({ email: formData.email, ...data });
setModelType('cloud')
navigate("/");
} catch (error: any) {
console.error("Login failed:", error);
@ -120,6 +121,7 @@ export default function Login() {
return;
}
console.log("data", data);
setModelType('cloud')
setAuth({ email: formData.email, ...data });
navigate("/");
} catch (error: any) {