""" __main__.py - CLI入口模块 命令行用法: python -m bid_proposal <招标文件.pdf> [-o 输出文件.docx] [--api-key KEY] [--model MODEL] [--verbose] 通过 run_pipeline() 运行完整的招标→投标生成流程。 """ import argparse import logging import sys import traceback from .config import set_config, Config from .pipeline import run_pipeline from .utils import setup_logging logger = logging.getLogger(__name__) def build_parser() -> argparse.ArgumentParser: """构建命令行参数解析器。""" parser = argparse.ArgumentParser( description="AI驱动的投标书生成系统 - 从招标PDF生成投标文件", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=( "示例:\n" " python -m bid_proposal 招标文件.pdf\n" " python -m bid_proposal 招标文件.pdf -o 投标文件.docx\n" " python -m bid_proposal 招标文件.pdf --api-key sk-xxx --model gpt-4o -v\n" "\n" "环境变量:\n" " OPENAI_API_KEY OpenAI API密钥(推荐通过环境变量设置)\n" " VERBOSE 设置为1/true启用详细日志\n" ), ) parser.add_argument( "pdf_path", type=str, help="招标文件PDF路径", ) parser.add_argument( "-o", "--output", type=str, default=None, help="输出DOCX文件路径(默认:招标文件所在目录/{文件名}_投标文件.docx)", ) parser.add_argument( "--api-key", type=str, default=None, help="OpenAI API密钥(默认从 OPENAI_API_KEY 环境变量读取)", ) parser.add_argument( "--model", type=str, default=None, help="OpenAI模型名(默认:gpt-4o)", ) parser.add_argument( "-v", "--verbose", action="store_true", help="详细日志输出", ) return parser def main(): """CLI入口函数。""" parser = build_parser() args = parser.parse_args() # 配置日志 setup_logging(verbose=args.verbose or args.pdf_path == "debug") # 如果指定了 api-key,更新配置 if args.api_key: config = Config(openai_api_key=args.api_key) set_config(config) logger.info("=" * 50) logger.info("投标书生成系统 v0.1.0") logger.info("=" * 50) logger.info("招标文件: %s", args.pdf_path) try: output_path = run_pipeline( pdf_path=args.pdf_path, output_path=args.output, api_key=args.api_key, model=args.model, ) logger.info("") logger.info("=" * 50) logger.info("生成完成!") logger.info("输出文件: %s", output_path) logger.info("=" * 50) except FileNotFoundError as e: logger.error("文件未找到: %s", e) sys.exit(1) except ValueError as e: logger.error("参数错误: %s", e) sys.exit(2) except ImportError as e: logger.error("缺少依赖模块: %s", e) logger.error("请确保已安装所有依赖:pip install -r requirements.txt") sys.exit(3) except Exception as e: logger.error("运行失败: %s", e) if args.verbose: traceback.print_exc() sys.exit(4) if __name__ == "__main__": main()