Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/cpp/include/lemon_tray/server_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ class ServerManager {
bool is_ephemeral,
const std::string& host,
int max_loaded_models,
const std::string& extra_models_dir
const std::string& extra_models_dir,
long global_timeout = 300
);

bool stop_server();
Expand Down Expand Up @@ -112,6 +113,7 @@ class ServerManager {
std::string api_key_;
int port_;
int max_loaded_models_;
long global_timeout_ = 300;
nlohmann::json recipe_options_;
bool show_console_;
bool is_ephemeral_; // Suppress output for ephemeral servers
Expand Down
8 changes: 4 additions & 4 deletions src/cpp/server/backends/sd_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,8 @@ json SDServer::image_generations(const json& request) {
LOG(DEBUG, "SDServer") << "Forwarding request to sd-server: "
<< sd_request.dump(2) << std::endl;

// Use base class forward_request with 10 minute timeout for image generation
return forward_request("/v1/images/generations", sd_request, 600);
// Image generation can take 20+ minutes for large models — use global timeout
return forward_request("/v1/images/generations", sd_request, utils::HttpClient::get_default_timeout());
}

json SDServer::image_edits(const json& request) {
Expand Down Expand Up @@ -307,7 +307,7 @@ json SDServer::image_edits(const json& request) {
<< " size=" << request.value("size", "")
<< std::endl;

return forward_multipart_request("/v1/images/edits", fields, 600);
return forward_multipart_request("/v1/images/edits", fields, utils::HttpClient::get_default_timeout());
}

json SDServer::image_variations(const json& request) {
Expand Down Expand Up @@ -335,7 +335,7 @@ json SDServer::image_variations(const json& request) {
<< " size=" << request.value("size", "")
<< std::endl;

return forward_multipart_request("/v1/images/edits", fields, 600);
return forward_multipart_request("/v1/images/edits", fields, utils::HttpClient::get_default_timeout());
}

} // namespace backends
Expand Down
18 changes: 16 additions & 2 deletions src/cpp/tray/server_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ bool ServerManager::start_server(
bool is_ephemeral,
const std::string& host,
int max_loaded_models,
const std::string& extra_models_dir)
const std::string& extra_models_dir,
long global_timeout)
{
if (is_server_running()) {
LOG(DEBUG, "ServerManager") << "Server is already running" << std::endl;
Expand All @@ -67,6 +68,7 @@ bool ServerManager::start_server(
port_ = port;
recipe_options_ = recipe_options;
max_loaded_models_ = max_loaded_models;
global_timeout_ = global_timeout;
log_file_ = log_file;
log_level_ = log_level;
show_console_ = show_console;
Expand Down Expand Up @@ -228,7 +230,7 @@ bool ServerManager::stop_server() {
bool ServerManager::restart_server() {
stop_server();
std::this_thread::sleep_for(std::chrono::seconds(1));
return start_server(server_binary_path_, port_, recipe_options_, log_file_, log_level_, show_console_, false, host_, max_loaded_models_, extra_models_dir_);
return start_server(server_binary_path_, port_, recipe_options_, log_file_, log_level_, show_console_, false, host_, max_loaded_models_, extra_models_dir_, global_timeout_);
}

bool ServerManager::is_server_running() const {
Expand Down Expand Up @@ -363,6 +365,10 @@ bool ServerManager::spawn_process() {
if (!extra_models_dir_.empty()) {
cmdline += " --extra-models-dir \"" + extra_models_dir_ + "\"";
}
// Global timeout (only if not default)
if (global_timeout_ != 300) {
cmdline += " --global-timeout " + std::to_string(global_timeout_);
}

LOG(DEBUG, "ServerManager") << "Starting server: " << cmdline << std::endl;

Expand Down Expand Up @@ -581,6 +587,14 @@ bool ServerManager::spawn_process() {
args.push_back(extra_models_dir_.c_str());
}

// Global timeout (only if not default)
std::string global_timeout_str;
if (global_timeout_ != 300) {
args.push_back("--global-timeout");
global_timeout_str = std::to_string(global_timeout_);
args.push_back(global_timeout_str.c_str());
}

args.push_back(nullptr);

execv(server_binary_path_.c_str(), const_cast<char**>(args.data()));
Expand Down
6 changes: 4 additions & 2 deletions src/cpp/tray/tray_app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1103,7 +1103,8 @@ bool TrayApp::start_ephemeral_server(int port) {
true, // is_ephemeral (suppress startup message)
server_config_.host, // Pass host to ServerManager
server_config_.max_loaded_models,
server_config_.extra_models_dir // Pass extra models directory
server_config_.extra_models_dir, // Pass extra models directory
server_config_.global_timeout
);

if (!success) {
Expand Down Expand Up @@ -2272,7 +2273,8 @@ bool TrayApp::start_server() {
is_service_active(), // is_ephemeral = true if systemd (suppress startup message)
server_config_.host, // Pass host to ServerManager
server_config_.max_loaded_models,
server_config_.extra_models_dir // Pass extra models directory
server_config_.extra_models_dir, // Pass extra models directory
server_config_.global_timeout
);

// Start log tail thread to show logs in console
Expand Down
Loading