Main entrypoint.
()
| 161 | |
| 162 | |
| 163 | def main(): |
| 164 | """Main entrypoint.""" |
| 165 | import argparse |
| 166 | |
| 167 | parser = argparse.ArgumentParser(description="GlmOcr Server") |
| 168 | parser.add_argument("--config", type=str, default=None, help="Config file path") |
| 169 | parser.add_argument( |
| 170 | "--log-level", |
| 171 | type=str, |
| 172 | default=None, |
| 173 | choices=["DEBUG", "INFO", "WARNING", "ERROR"], |
| 174 | help="Log level", |
| 175 | ) |
| 176 | args = parser.parse_args() |
| 177 | |
| 178 | # Use spawn for multiprocessing |
| 179 | multiprocessing.set_start_method("spawn", force=True) |
| 180 | |
| 181 | app = None |
| 182 | |
| 183 | try: |
| 184 | config = load_config(args.config) |
| 185 | |
| 186 | # Configure logging |
| 187 | log_level = args.log_level or config.logging.level |
| 188 | configure_logging(level=log_level) |
| 189 | |
| 190 | # Create app with typed config |
| 191 | app = create_app(config) |
| 192 | |
| 193 | # Start pipeline |
| 194 | pipeline = app.config["pipeline"] |
| 195 | pipeline.start() |
| 196 | |
| 197 | # Start Flask service |
| 198 | server_config = config.server |
| 199 | logger.info("") |
| 200 | logger.info("=" * 60) |
| 201 | logger.info( |
| 202 | "GlmOcr Server starting on %s:%d...", server_config.host, server_config.port |
| 203 | ) |
| 204 | logger.info("API endpoint: /glmocr/parse") |
| 205 | logger.info("=" * 60) |
| 206 | logger.info("") |
| 207 | |
| 208 | app.run( |
| 209 | debug=server_config.debug, |
| 210 | host=server_config.host, |
| 211 | port=server_config.port, |
| 212 | ) |
| 213 | |
| 214 | except KeyboardInterrupt: |
| 215 | logger.info("Shutting down...") |
| 216 | except Exception as e: |
| 217 | logger.error("Error: %s", e) |
| 218 | logger.debug(traceback.format_exc()) |
| 219 | sys.exit(1) |
| 220 | finally: |
no test coverage detected