__main__.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. """
  2. __main__.py - CLI入口模块
  3. 命令行用法:
  4. python -m bid_proposal <招标文件.pdf> [-o 输出文件.docx] [--api-key KEY] [--model MODEL] [--verbose]
  5. 通过 run_pipeline() 运行完整的招标→投标生成流程。
  6. """
  7. import argparse
  8. import logging
  9. import sys
  10. import traceback
  11. from .config import set_config, Config
  12. from .pipeline import run_pipeline
  13. from .utils import setup_logging
  14. logger = logging.getLogger(__name__)
  15. def build_parser() -> argparse.ArgumentParser:
  16. """构建命令行参数解析器。"""
  17. parser = argparse.ArgumentParser(
  18. description="AI驱动的投标书生成系统 - 从招标PDF生成投标文件",
  19. formatter_class=argparse.RawDescriptionHelpFormatter,
  20. epilog=(
  21. "示例:\n"
  22. " python -m bid_proposal 招标文件.pdf\n"
  23. " python -m bid_proposal 招标文件.pdf -o 投标文件.docx\n"
  24. " python -m bid_proposal 招标文件.pdf --api-key sk-xxx --model gpt-4o -v\n"
  25. "\n"
  26. "环境变量:\n"
  27. " OPENAI_API_KEY OpenAI API密钥(推荐通过环境变量设置)\n"
  28. " VERBOSE 设置为1/true启用详细日志\n"
  29. ),
  30. )
  31. parser.add_argument(
  32. "pdf_path",
  33. type=str,
  34. help="招标文件PDF路径",
  35. )
  36. parser.add_argument(
  37. "-o",
  38. "--output",
  39. type=str,
  40. default=None,
  41. help="输出DOCX文件路径(默认:招标文件所在目录/{文件名}_投标文件.docx)",
  42. )
  43. parser.add_argument(
  44. "--api-key",
  45. type=str,
  46. default=None,
  47. help="OpenAI API密钥(默认从 OPENAI_API_KEY 环境变量读取)",
  48. )
  49. parser.add_argument(
  50. "--model",
  51. type=str,
  52. default=None,
  53. help="OpenAI模型名(默认:gpt-4o)",
  54. )
  55. parser.add_argument(
  56. "-v",
  57. "--verbose",
  58. action="store_true",
  59. help="详细日志输出",
  60. )
  61. return parser
  62. def main():
  63. """CLI入口函数。"""
  64. parser = build_parser()
  65. args = parser.parse_args()
  66. # 配置日志
  67. setup_logging(verbose=args.verbose or args.pdf_path == "debug")
  68. # 如果指定了 api-key,更新配置
  69. if args.api_key:
  70. config = Config(openai_api_key=args.api_key)
  71. set_config(config)
  72. logger.info("=" * 50)
  73. logger.info("投标书生成系统 v0.1.0")
  74. logger.info("=" * 50)
  75. logger.info("招标文件: %s", args.pdf_path)
  76. try:
  77. output_path = run_pipeline(
  78. pdf_path=args.pdf_path,
  79. output_path=args.output,
  80. api_key=args.api_key,
  81. model=args.model,
  82. )
  83. logger.info("")
  84. logger.info("=" * 50)
  85. logger.info("生成完成!")
  86. logger.info("输出文件: %s", output_path)
  87. logger.info("=" * 50)
  88. except FileNotFoundError as e:
  89. logger.error("文件未找到: %s", e)
  90. sys.exit(1)
  91. except ValueError as e:
  92. logger.error("参数错误: %s", e)
  93. sys.exit(2)
  94. except ImportError as e:
  95. logger.error("缺少依赖模块: %s", e)
  96. logger.error("请确保已安装所有依赖:pip install -r requirements.txt")
  97. sys.exit(3)
  98. except Exception as e:
  99. logger.error("运行失败: %s", e)
  100. if args.verbose:
  101. traceback.print_exc()
  102. sys.exit(4)
  103. if __name__ == "__main__":
  104. main()