/
sveta_t
/
checklist_creation
Обзор
Документация
Войти
/
sveta_t
/
checklist_creation
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
cli_tool/main.py
593 строки
24 KB
sveta_t
fix tester
05 фев 2026, 09:26
05 фев 2026, 09:26
0d222b5
Код
Авторство
О чём код?
#!/usr/bin/env python3 """ CLI утилита для обработки документов о банковских продуктах Доступные команды: markdown - Конвертация в структурированный Markdown checklist - Генерация чеклиста suggests - Генерация саджестов (вопросы-ответы) prompt - Генерация промпта для извлечения фактов product-info - Генерация подробной суммаризации продукта best-practices - Генерация лучших практик продаж dialogs - Генерация тестовых диалогов all - Выполнить все задачи последовательно """ import argparse import sys from pathlib import Path # Добавляем корень проекта в путь project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root)) from cli_tool.tasks.markdown_converter import convert_to_markdown from cli_tool.tasks.checklist_generator import generate_checklist from cli_tool.tasks.suggest_generator import generate_suggests from cli_tool.tasks.prompt_generator import generate_product_prompt from cli_tool.tasks.product_info_generator import generate_product_info from cli_tool.dialog_continue.best_practices_generator import BestPracticesGenerator from cli_tool.tasks.sales_prompt_generator import generate_sales_prompt def cmd_markdown(args): """Команда: конвертация в Markdown""" print("📝 ЗАДАЧА 1: Конвертация в Markdown") print("=" * 60) output_file = args.output or Path(args.input).with_suffix('.md') markdown_example = None if args.example: with open(args.example, 'r', encoding='utf-8') as f: markdown_example = f.read() result = convert_to_markdown( input_file=args.input, output_file=output_file, markdown_example=markdown_example, model=args.model, temperature=args.temperature ) print(f"\n{'='*60}") print("✅ ГОТОВО!") print(f"{'='*60}") if not args.quiet: print(f"\nПревью результата (первые 500 символов):") print(result[:500] + "..." if len(result) > 500 else result) def cmd_checklist(args): """Команда: генерация чеклиста""" print("✅ ЗАДАЧА 2: Генерация чеклиста") print("=" * 60) output_file = args.output or Path(args.input).with_suffix('.checklist.json') result = generate_checklist( input_file=args.input, output_file=output_file, model=args.model, temperature=args.temperature, min_items=args.min_items ) print(f"\n{'='*60}") print("✅ ГОТОВО!") print(f"{'='*60}") if not args.quiet: print(f"\nПервые 3 пункта:") for item in result[:3]: print(f" {item['id']}. {item['question']}") print(f" → {item['answer']}\n") def cmd_suggests(args): """Команда: генерация саджестов""" print("💬 ЗАДАЧА 3: Генерация саджестов") print("=" * 60) output_file = args.output or Path(args.input).with_suffix('.suggests.json') product = args.product result = generate_suggests( input_file=args.input, output_file=output_file, model=args.model, min_paragraph_length=args.min_length, product=product ) print(f"\n{'='*60}") print("✅ ГОТОВО!") print(f"{'='*60}") if not args.quiet and result['suggests']: print(f"\nПример саджеста:") suggest = result['suggests'][0] print(f" Тема: {suggest['main_topic']}") print(f" Вопрос: {suggest['subtopic']}") print(f" Ответ: {suggest['answer']}") def cmd_prompt(args): """Команда: генерация промпта""" print("🎯 ЗАДАЧА 4: Генерация промпта для извлечения фактов") print("=" * 60) output_dir = args.output or Path(args.input).parent / 'output' result = generate_product_prompt( input_file=args.input, output_dir=output_dir ) print(f"\n{'='*60}") print("✅ ГОТОВО!") print(f"{'='*60}") if not args.quiet: print(f"\nИнформация о продукте:") info = result['product_info'] print(f" Название: {info['name']}") print(f" Алиасов: {len(info['aliases'])}") print(f" Примеров: {len(result['few_shots'])}") def cmd_product_info(args): """Команда: генерация подробной суммаризации продукта""" print("📋 ЗАДАЧА: Генерация подробной суммаризации продукта (product_info.md)") print("=" * 60) input_path = Path(args.input) # Определяем выходной файл if args.output: output_file = Path(args.output) else: # По умолчанию: product_info.md в той же папке output_file = input_path.parent / 'product_info.md' print(f"\n📄 Входной файл: {input_path}") print(f"💾 Выходной файл: {output_file}") if args.model: print(f"🤖 Модель: {args.model}") print(f"\n🚀 Начинаем генерацию подробной суммаризации...\n") # Генерируем product_info try: result = generate_product_info( input_file=str(input_path), output_file=str(output_file), model=args.model, temperature=args.temperature ) print(f"\n{'='*60}") print("✅ ГОТОВО!") print(f"{'='*60}") print(f"\n📊 Создано: {len(result)} символов") print(f"💾 Сохранено в: {output_file}") # Показываем статистику по секциям lines = result.split('\n') sections = [line for line in lines if line.startswith('##')] print(f"📑 Секций в документе: {len(sections)}") if not args.quiet: print(f"\nПервые 5 секций:") for section in sections[:5]: print(f" {section}") print(f"\nПревью результата (первые 1500 символов):") print(result[:1500] + "..." if len(result) > 1500 else result) except Exception as e: print(f"\n❌ ОШИБКА: {e}", file=sys.stderr) raise def cmd_best_practices(args): """Команда: генерация лучших практик продаж""" print("🎯 ЗАДАЧА: Генерация лучших практик продаж") print("=" * 60) input_path = Path(args.input) # Определяем выходной файл if args.output: output_file = Path(args.output) else: # По умолчанию: best_practices_{название_файла}.md stem = input_path.stem output_file = input_path.parent / f'best_practices_{stem}.md' print(f"\n📄 Входной файл: {input_path}") print(f"💾 Выходной файл: {output_file}") if args.product_name: print(f"📦 Название продукта: {args.product_name}") if args.product_type: print(f"🏷️ Тип продукта: {args.product_type}") if args.model: print(f"🤖 Модель: {args.model}") print(f"\n🚀 Начинаем генерацию...\n") # Создаем генератор generator = BestPracticesGenerator() # Генерируем best practices try: result = generator.generate_from_file( article_path=str(input_path), output_path=str(output_file), model_override=args.model, temperature=args.temperature, product_name_override=args.product_name, product_type_override=args.product_type ) print(f"\n{'='*60}") print("✅ ГОТОВО!") print(f"{'='*60}") print(f"\n📊 Создано: {len(result)} символов") print(f"💾 Сохранено в: {output_file}") if not args.quiet: print(f"\nПревью результата (первые 1000 символов):") print(result[:1000] + "..." if len(result) > 1000 else result) except Exception as e: print(f"\n❌ ОШИБКА: {e}", file=sys.stderr) raise def cmd_dialogs(args): """Команда: генерация тестовых диалогов""" print("💬 ЗАДАЧА: Генерация тестовых диалогов") print("=" * 60) print("\n⚠️ Генерация диалогов (factcheck/guided) в данной версии не используется.") print("Используйте только генерацию best practices через команду 'best-practices'.\n") print("Пример:") print(" python main.py best-practices article.md") return 1 def cmd_all(args): """Команда: выполнить все задачи""" print("🚀 ВЫПОЛНЕНИЕ ВСЕХ ЗАДАЧ") print("=" * 60) input_path = Path(args.input) base_name = input_path.stem # Создаем выходную директорию output_dir = Path(args.output) if args.output else input_path.parent / f'{base_name}_processed' output_dir.mkdir(parents=True, exist_ok=True) print(f"\n📂 Результаты будут сохранены в: {output_dir}") # 1. Markdown print(f"\n{'='*60}") print("ЭТАП 1/7: Конвертация в Markdown") print("=" * 60) markdown_file = output_dir / f'{base_name}.md' markdown_args = argparse.Namespace( input=args.input, output=markdown_file, example=None, model=args.model, temperature=0.2, quiet=True ) cmd_markdown(markdown_args) # 2. Checklist print(f"\n{'='*60}") print("ЭТАП 2/7: Генерация чеклиста") print("=" * 60) checklist_file = output_dir / f'{base_name}_checklist.json' checklist_args = argparse.Namespace( input=markdown_file, output=checklist_file, model=args.model, temperature=0.00001, min_items=20, quiet=True ) cmd_checklist(checklist_args) ''' # 3. Suggests print(f"\n{'='*60}") print("ЭТАП 3/7: Генерация саджестов") print("=" * 60) suggests_file = output_dir / f'{base_name}_suggests.json' suggests_args = argparse.Namespace( input=markdown_file, output=suggests_file, model=args.model, min_length=50, product=args.product, # ← ВАЖНО quiet=True ) cmd_suggests(suggests_args) ''' # 4. Prompt print(f"\n{'='*60}") print("ЭТАП 4/7: Генерация промпта") print("=" * 60) prompt_args = argparse.Namespace( input=markdown_file, output=output_dir, quiet=True ) cmd_prompt(prompt_args) # 5. Product Info print(f"\n{'='*60}") print("ЭТАП 5/7: Генерация подробной суммаризации продукта") print("=" * 60) product_info_file = output_dir / 'product_info.md' product_info_args = argparse.Namespace( input=markdown_file, output=product_info_file, model=args.model, temperature=0.2, quiet=True ) cmd_product_info(product_info_args) # 6. Best Practices print(f"\n{'='*60}") print("ЭТАП 6/7: Генерация лучших практик продаж") print("=" * 60) best_practices_file = output_dir / f'{base_name}_best_practices.md' bp_args = argparse.Namespace( input=markdown_file, output=best_practices_file, model=args.model, temperature=0.7, product_name=None, product_type=None, quiet=True ) cmd_best_practices(bp_args) print(f"\n{'='*60}") print("ЭТАП 6/8: Генерация промпта технологии продаж") print("=" * 60) sales_prompt_file = output_dir / 'sales_technology_prompt.txt' sales_prompt_args = argparse.Namespace( input=product_info_file, # Используем созданный product_info.md (из этапа 5) output=sales_prompt_file, model=args.model, temperature=0.3, quiet=True ) cmd_sales_prompt(sales_prompt_args) # 7. Best Practices (обновите номер этапа с 6/7 на 7/8) print(f"\n{'='*60}") print("ЭТАП 7/8: Генерация лучших практик продаж") print("=" * 60) print(f"\n{'='*60}") print("🎉 ВСЕ ЗАДАЧИ ВЫПОЛНЕНЫ!") print(f"{'='*60}") print(f"\n📂 Результаты в директории: {output_dir}") print(f"\nСгенерированные файлы:") for file in sorted(output_dir.rglob('*')): if file.is_file(): rel_path = file.relative_to(output_dir) print(f" - {rel_path}") def cmd_sales_prompt(args): """Команда: генерация промпта технологии продаж""" print("🎯 ЗАДАЧА: Генерация промпта технологии продаж") print("=" * 60) input_path = Path(args.input) # Определяем выходной файл if args.output: output_file = Path(args.output) else: # По умолчанию: sales_technology_prompt.txt в той же папке output_file = input_path.parent / 'sales_technology_prompt.txt' print(f"\n📄 Входной файл (product_info): {input_path}") print(f"💾 Выходной файл: {output_file}") if args.model: print(f"🤖 Модель: {args.model}") print(f"\n🚀 Генерирую структурированный промпт для технологии продаж...\n") # Генерируем промпт try: result = generate_sales_prompt( product_info_file=str(input_path), output_file=str(output_file), model=args.model, temperature=args.temperature ) print(f"\n{'='*60}") print("✅ ГОТОВО!") print(f"{'='*60}") print(f"\n📊 Создано: {len(result)} символов") print(f"💾 Сохранено в: {output_file}") # Показываем статистику lines = result.split('\n') tech_steps = len([line for line in lines if line.strip().startswith(('1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.'))]) sections = [line for line in lines if line.startswith('###') or line.startswith('##')] print(f"\n📑 Структура промпта:") print(f" - Разделов: {len(sections)}") print(f" - Шагов технологии: {tech_steps}") if not args.quiet: print(f"\nОсновные разделы:") for section in sections[:8]: print(f" {section}") print(f"\nПревью результата (первые 1000 символов):") print(result[:1000] + "..." if len(result) > 1000 else result) except Exception as e: print(f"\n❌ ОШИБКА: {e}", file=sys.stderr) raise # 3. Обновите cmd_all - добавьте генерацию sales_prompt после product_info (этап 6/8): # 6. Sales Prompt print(f"\n{'='*60}") print("ЭТАП 6/8: Генерация промпта технологии продаж") print("=" * 60) sales_prompt_file = output_file / 'sales_technology_prompt.txt' sales_prompt_args = argparse.Namespace( input=str(input_path), # Используем product_info.md output=sales_prompt_file, model=args.model, temperature=0.3, quiet=True ) cmd_sales_prompt(sales_prompt_args) # 7. Best Practices (обновите номер этапа с 6/7 на 7/8) print(f"\n{'='*60}") print("ЭТАП 7/8: Генерация лучших практик продаж") print("=" * 60) def main(): """Главная функция CLI""" parser = argparse.ArgumentParser( description='Утилита для обработки документов о банковских продуктах', formatter_class=argparse.RawDescriptionHelpFormatter ) subparsers = parser.add_subparsers(dest='command', help='Доступные команды') # Общие аргументы def add_common_args(subparser): subparser.add_argument('input', help='Путь к входному файлу') subparser.add_argument('-o', '--output', help='Путь к выходному файлу/директории') subparser.add_argument('-m', '--model', default=None, help='Модель GigaChat (default: GigaChat)') subparser.add_argument('-q', '--quiet', action='store_true', help='Не выводить превью результата') ##subparser.add_argument('-p', '--product', default=None, help='Продукт') # Команда: markdown parser_markdown = subparsers.add_parser('markdown', help='Конвертация в Markdown') add_common_args(parser_markdown) parser_markdown.add_argument('-e', '--example', help='Путь к примеру Markdown структуры') parser_markdown.add_argument('-t', '--temperature', type=float, default=0.2, help='Температура (default: 0.2)') parser_markdown.set_defaults(func=cmd_markdown) # Команда: checklist parser_checklist = subparsers.add_parser('checklist', help='Генерация чеклиста') add_common_args(parser_checklist) parser_checklist.add_argument('-t', '--temperature', type=float, default=0.00001, help='Температура (default: 0.00001)') parser_checklist.add_argument('--min-items', type=int, default=20, help='Минимум пунктов (default: 20)') parser_checklist.set_defaults(func=cmd_checklist) # Команда: suggests parser_suggests = subparsers.add_parser('suggests', help='Генерация саджестов') add_common_args(parser_suggests) parser_suggests.add_argument('--min-length', type=int, default=50, help='Минимальная длина параграфа (default: 50)') parser_suggests.add_argument('--product', default=None, help='Продукт') parser_suggests.set_defaults(func=cmd_suggests) # Команда: prompt parser_prompt = subparsers.add_parser('prompt', help='Генерация промпта') parser_prompt.add_argument('input', help='Путь к markdown файлу') parser_prompt.add_argument('-o', '--output', help='Директория для результатов') parser_prompt.add_argument('-q', '--quiet', action='store_true', help='Не выводить превью') parser_prompt.set_defaults(func=cmd_prompt) # Команда: product-info parser_product_info = subparsers.add_parser('product-info', help='Генерация подробной суммаризации продукта') parser_product_info.add_argument('input', help='Путь к markdown файлу со статьей') parser_product_info.add_argument('-o', '--output', help='Путь к выходному файлу (default: product_info.md)') parser_product_info.add_argument('-m', '--model', default=None, help='Модель (default: GigaChat)') parser_product_info.add_argument('-t', '--temperature', type=float, default=0.2, help='Температура (default: 0.2)') parser_product_info.add_argument('-q', '--quiet', action='store_true', help='Не выводить превью') parser_product_info.set_defaults(func=cmd_product_info) # Команда: best-practices parser_bp = subparsers.add_parser('best-practices', help='Генерация лучших практик продаж') parser_bp.add_argument('input', help='Путь к файлу статьи (.md или .json)') parser_bp.add_argument('-o', '--output', help='Путь к выходному файлу') parser_bp.add_argument('-m', '--model', default=None, help='Модель (default: GigaChat)') parser_bp.add_argument('-t', '--temperature', type=float, default=0.7, help='Температура (default: 0.7)') parser_bp.add_argument('--product-name', help='Переопределить название продукта') parser_bp.add_argument('--product-type', help='Переопределить тип продукта') parser_bp.add_argument('-q', '--quiet', action='store_true', help='Не выводить превью') parser_bp.set_defaults(func=cmd_best_practices) # Команда: dialogs parser_dialogs = subparsers.add_parser('dialogs', help='Генерация тестовых диалогов') parser_dialogs.add_argument('input', help='Путь к файлу чеклиста (.json)') parser_dialogs.add_argument('-o', '--output', help='Директория для результатов') parser_dialogs.add_argument('-m', '--model', default=None, help='Модель (default: GigaChat)') parser_dialogs.add_argument('-t', '--temperature', type=float, default=0.7, help='Температура (default: 0.7)') parser_dialogs.add_argument('-d', '--dialog-type', choices=['factcheck', 'guided', 'both'], default='factcheck', help='Тип диалогов (default: factcheck)') parser_dialogs.add_argument('-b', '--batch-size', type=int, default=5, help='Размер батча (default: 5)') parser_dialogs.add_argument('-q', '--quiet', action='store_true', help='Не выводить превью') parser_dialogs.set_defaults(func=cmd_dialogs) parser_sales_prompt = subparsers.add_parser('sales-prompt', help='Генерация промпта технологии продаж') parser_sales_prompt.add_argument('input', help='Путь к файлу product_info.md') parser_sales_prompt.add_argument('-o', '--output', help='Путь к выходному файлу (default: sales_technology_prompt.txt)') parser_sales_prompt.add_argument('-m', '--model', default=None, help='Модель (default: GigaChat)') parser_sales_prompt.add_argument('-t', '--temperature', type=float, default=0.3, help='Температура (default: 0.3)') parser_sales_prompt.add_argument('-q', '--quiet', action='store_true', help='Не выводить превью') parser_sales_prompt.set_defaults(func=cmd_sales_prompt) # Команда: all parser_all = subparsers.add_parser('all', help='Выполнить все задачи') parser_all.add_argument('input', help='Путь к входному файлу') parser_all.add_argument('-o', '--output', help='Директория для результатов') parser_all.add_argument('-m', '--model', default=None, help='Модель GigaChat (default: GigaChat)') parser_all.add_argument( '--product', default=None, help='Название продукта (передаётся в suggests)' ) parser_all.set_defaults(func=cmd_all) # Парсим аргументы args = parser.parse_args() if not args.command: parser.print_help() return 1 try: args.func(args) return 0 except Exception as e: print(f"\n❌ ОШИБКА: {e}", file=sys.stderr) import traceback traceback.print_exc() return 1 if __name__ == '__main__': sys.exit(main())