mirror of
https://github.com/eigent-ai/eigent.git
synced 2026-05-22 11:15:47 +00:00
Merge branch 'main' into feat/settings-privacy-optimization-235
This commit is contained in:
commit
f61ae46c8f
8 changed files with 57 additions and 45 deletions
33
.github/workflows/build.yml
vendored
33
.github/workflows/build.yml
vendored
|
|
@ -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 }}
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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}`
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue