|
1 |
| -"""This is a wrapper around the main app entrypoint, to allow for CLI args to be parsed before running the app.""" |
| 1 | +import uvicorn |
2 | 2 |
|
| 3 | +from invokeai.app.services.config.config_default import get_config |
| 4 | +from invokeai.app.util.startup_utils import ( |
| 5 | + apply_monkeypatches, |
| 6 | + check_cudnn, |
| 7 | + enable_dev_reload, |
| 8 | + find_open_port, |
| 9 | + register_mime_types, |
| 10 | +) |
| 11 | +from invokeai.backend.util.logging import InvokeAILogger |
| 12 | +from invokeai.frontend.cli.arg_parser import InvokeAIArgs |
3 | 13 |
|
4 |
| -def run_app() -> None: |
5 |
| - # Before doing _anything_, parse CLI args! |
6 |
| - from invokeai.frontend.cli.arg_parser import InvokeAIArgs |
7 | 14 |
|
| 15 | +def get_app(): |
| 16 | + """Import the app and event loop. We wrap this in a function to more explicitly control when it happens, because |
| 17 | + importing from api_app does a bunch of stuff - it's more like calling a function than importing a module. |
| 18 | + """ |
| 19 | + from invokeai.app.api_app import app, loop |
| 20 | + |
| 21 | + return app, loop |
| 22 | + |
| 23 | + |
| 24 | +def run_app() -> None: |
| 25 | + """The main entrypoint for the app.""" |
| 26 | + # Parse the CLI arguments. |
8 | 27 | InvokeAIArgs.parse_args()
|
9 | 28 |
|
10 |
| - from invokeai.app.api_app import invoke_api |
| 29 | + # Load config. |
| 30 | + app_config = get_config() |
| 31 | + |
| 32 | + logger = InvokeAILogger.get_logger(config=app_config) |
| 33 | + |
| 34 | + # Find an open port, and modify the config accordingly. |
| 35 | + orig_config_port = app_config.port |
| 36 | + app_config.port = find_open_port(app_config.port) |
| 37 | + if orig_config_port != app_config.port: |
| 38 | + logger.warning(f"Port {orig_config_port} is already in use. Using port {app_config.port}.") |
| 39 | + |
| 40 | + # Miscellaneous startup tasks. |
| 41 | + apply_monkeypatches() |
| 42 | + register_mime_types() |
| 43 | + if app_config.dev_reload: |
| 44 | + enable_dev_reload() |
| 45 | + check_cudnn(logger) |
| 46 | + |
| 47 | + # Initialize the app and event loop. |
| 48 | + app, loop = get_app() |
| 49 | + |
| 50 | + # Start the server. |
| 51 | + config = uvicorn.Config( |
| 52 | + app=app, |
| 53 | + host=app_config.host, |
| 54 | + port=app_config.port, |
| 55 | + loop="asyncio", |
| 56 | + log_level=app_config.log_level_network, |
| 57 | + ssl_certfile=app_config.ssl_certfile, |
| 58 | + ssl_keyfile=app_config.ssl_keyfile, |
| 59 | + ) |
| 60 | + server = uvicorn.Server(config) |
| 61 | + |
| 62 | + # replace uvicorn's loggers with InvokeAI's for consistent appearance |
| 63 | + uvicorn_logger = InvokeAILogger.get_logger("uvicorn") |
| 64 | + uvicorn_logger.handlers.clear() |
| 65 | + for hdlr in logger.handlers: |
| 66 | + uvicorn_logger.addHandler(hdlr) |
11 | 67 |
|
12 |
| - invoke_api() |
| 68 | + loop.run_until_complete(server.serve()) |
0 commit comments