| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- """
- __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()
|