369 lines
14 KiB
Python
Raw Permalink Normal View History

2025-07-31 15:35:23 +08:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Default Configuration Provider
默认配置提供器 - 提供算法包的默认配置支持动态提示词加载
"""
from typing import Dict, Any
import os
from pathlib import Path
class DefaultConfigProvider:
"""默认配置提供器"""
@staticmethod
def get_ai_model_config() -> Dict[str, Any]:
"""获取AI模型默认配置 - 支持任务级别参数"""
return {
"model": "qwq-plus",
"api_url": os.getenv("AI_API_URL", ""),
"api_key": os.getenv("AI_API_KEY", ""),
"temperature": 0.7,
"top_p": 0.5,
"presence_penalty": 1.2,
"frequency_penalty": 0.0,
"max_tokens": None,
"timeout": 60,
"max_retries": 3,
"enable_stream": True,
"stream_chunk_size": 1024,
# 任务级别的模型参数配置
"task_configs": {
"topic_generation": {
"temperature": 0.8, # 主题生成需要更高创造性
"top_p": 0.9,
"presence_penalty": 1.0
},
"content_generation": {
"temperature": 0.7, # 内容生成平衡创造性和准确性
"top_p": 0.8,
"presence_penalty": 1.2
},
"content_judging": {
"temperature": 0.3, # 内容审核需要更严格和一致
"top_p": 0.5,
"presence_penalty": 0.5
},
"poster_generation": {
"temperature": 0.6, # 海报文案生成
"top_p": 0.7,
"presence_penalty": 1.0
}
}
}
@staticmethod
def get_prompt_config() -> Dict[str, Any]:
"""获取提示词默认配置 - 支持动态加载"""
return {
# 提示词模板目录配置
"template_directory": "templates/prompts",
"enable_template_loading": True,
# 提示词文件映射
"template_files": {
"topic_generation": {
"system": "generateTopics/system.txt",
"user": "generateTopics/user.txt"
},
"content_generation": {
"system": "generateContent/system.txt",
"user": "generateContent/user.txt"
},
"content_judging": {
"system": "judgeContent/system.txt",
"user": "judgeContent/user.txt"
},
"poster_generation": {
"system": "generatePoster/system.txt",
"user": "generatePoster/user.txt"
}
},
# 回退的默认提示词(当文件加载失败时使用)
"fallback_prompts": {
"topic_generation": {
"system": "你是一个专业的旅游选题策划师。",
"user": "请生成{numTopics}个旅游主题。日期:{month}"
},
"content_generation": {
"system": "你是一个专业的旅游文案写手。",
"user": "请根据以下主题生成旅游内容:{topic_info}"
},
"content_judging": {
"system": "你是一个专业的内容审核专家。",
"user": "请审核以下内容:{content}"
}
}
}
@staticmethod
def get_content_generation_config() -> Dict[str, Any]:
"""获取内容生成默认配置"""
return {
"topic_count": 5,
"topic_date_range": None,
"topic_style": "default",
"content_length": "medium",
"content_style": "default",
"enable_auto_judge": True,
"judge_enabled": True,
"judge_threshold": 0.7,
"refer_sampling_rate": 0.5,
"enable_refer_content": True,
# JSON修复配置
"enable_json_repair": True,
"json_repair_attempts": 3,
# 结果字段映射配置
"result_field_mapping": {
"topic_generation": {
"expected_fields": ["index", "date", "logic", "object", "product", "productLogic", "style", "styleLogic", "targetAudience", "targetAudienceLogic"],
"required_fields": ["index", "date", "logic", "object"]
},
"content_generation": {
"expected_fields": ["title", "content", "tag"],
"required_fields": ["title", "content"]
},
"content_judging": {
"expected_fields": ["analysis", "title", "content"],
"required_fields": ["title", "content"]
}
}
}
@staticmethod
def get_poster_generation_config() -> Dict[str, Any]:
"""获取海报生成默认配置 - 从硬编码中提取"""
return {
"default_size": [900, 1200],
"supported_sizes": [
[900, 1200], # 竖屏海报
[1080, 1080], # 方形海报
[750, 1334] # 手机屏幕
],
"default_template": "vibrant",
"available_templates": ["vibrant", "business", "collage"],
"template_selection_mode": "manual",
# 字体配置
"font_configs": {
"chinese_bold": {
"family": "兰亭粗黑简",
"fallback": ["SimHei", "Arial"]
},
"default": {
"family": "Arial",
"fallback": ["Times New Roman"]
}
},
"default_font_family": "chinese_bold",
# 颜色主题 - 从VibrantTemplate中提取
"color_themes": {
"ocean_deep": {
"primary": [[0, 30, 80], [20, 120, 220]],
"secondary": [[10, 50, 150], [40, 140, 240]]
},
"sunset_warm": {
"primary": [[255, 94, 77], [255, 154, 0]],
"secondary": [[240, 80, 60], [240, 140, 20]]
},
"cool_mint": {
"primary": [[64, 224, 208], [127, 255, 212]],
"secondary": [[80, 200, 190], [100, 230, 200]]
},
"royal_purple": {
"primary": [[75, 0, 130], [138, 43, 226]],
"secondary": [[90, 20, 150], [120, 60, 200]]
},
"forest_green": {
"primary": [[34, 139, 34], [144, 238, 144]],
"secondary": [[50, 120, 50], [120, 220, 120]]
},
"fire_red": {
"primary": [[220, 20, 60], [255, 69, 0]],
"secondary": [[200, 40, 80], [230, 90, 30]]
}
},
"default_color_theme": "ocean_deep",
# 毛玻璃效果配置 - 从VibrantTemplate中提取
"glass_effect": {
"max_opacity": 240,
"blur_radius": 22,
"transition_height": 80,
"intensity_multiplier": 1.5
},
# 文本效果配置
"text_effects": {
"shadow": True,
"shadow_offset": [2, 2],
"shadow_color": [0, 0, 0, 128],
"outline": False,
"outline_width": 1,
"outline_color": [255, 255, 255]
},
# 输出配置
"output_format": "PNG",
"output_quality": 95,
"generate_thumbnail": True,
"thumbnail_size": [300, 400]
}
@staticmethod
def get_document_processing_config() -> Dict[str, Any]:
"""获取文档处理默认配置"""
return {
"supported_extensions": [".txt", ".md", ".pdf", ".docx", ".doc", ".xlsx", ".xls"],
"max_file_size": 50 * 1024 * 1024, # 50MB
"encoding": "utf-8",
"extract_images": True,
"extract_tables": True,
"enable_content_cleaning": True,
"remove_extra_whitespace": True,
"normalize_text": True,
"enable_web_scraping": True,
"scraping_config": {
"max_notes": 20,
"sort_type": 0,
"note_type": 0,
"download_media": True,
"timeout": 30
}
}
@staticmethod
def get_output_config() -> Dict[str, Any]:
"""获取输出配置 - 解决硬编码的文件名问题"""
return {
"base_output_directory": "result",
"enable_timestamped_folders": True,
"folder_name_pattern": "run_{timestamp}",
# 文件命名模式 - 替代硬编码的文件名
"file_naming": {
"topics": "topics.json",
"content": "article.json",
"poster": "poster.png",
"raw_response": "{stage}_raw_response.txt",
"system_prompt": "{stage}_system_prompt.txt",
"user_prompt": "{stage}_user_prompt.txt",
"judged_content": "article_judged.json",
"metadata": "metadata.json"
},
"save_raw_responses": True,
"save_prompts": True,
"save_metadata": True,
"enable_compression": False,
"backup_count": 5
}
@staticmethod
def get_resource_config() -> Dict[str, Any]:
"""获取资源配置 - 包括static文件管理"""
return {
"resource_base_directory": None, # 由调用方设置
"font_directory": "assets/fonts",
# 字体文件映射 - 解决硬编码字体路径
"font_files": {
"chinese_bold": "兰亭粗黑简.TTF",
"default": "Arial.ttf"
},
"prompt_template_directory": "templates/prompts",
"image_assets_directory": "assets/images",
"default_background_images": [],
# 静态文件配置 - 解决爬虫模块依赖
"static_files_directory": "static",
"required_js_files": {
"xhs_xs_xsc_56": "xhs_xs_xsc_56.js",
"xhs_xray": "xhs_xray.js",
"xhs_creator_xs": "xhs_creator_xs.js",
"xhs_xray_pack1": "xhs_xray_pack1.js",
"xhs_xray_pack2": "xhs_xray_pack2.js"
}
}
@staticmethod
def get_web_crawling_config() -> Dict[str, Any]:
"""获取网页爬虫默认配置"""
return {
"request_interval": 1.0,
"max_requests": 100,
"request_timeout": 30.0,
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"enable_proxy": False,
"proxy_config": None,
"max_retries": 3,
"retry_delay": 2.0,
"min_content_length": 50,
"max_content_length": 10000,
"xhs_search_config": {
"default_sort_type": 0,
"default_note_type": 0,
"enable_image_download": True,
"enable_video_download": False,
"search_result_limit": 50
}
}
@staticmethod
def get_keyword_analysis_config() -> Dict[str, Any]:
"""获取关键词分析默认配置"""
return {
"max_keywords": 20,
"min_keyword_length": 2,
"max_keyword_length": 10,
"enable_ai_analysis": True,
"ai_analysis_threshold": 100,
"frequency_weight": 0.4,
"position_weight": 0.3,
"type_weight": 0.3,
"enable_categorization": True,
"category_threshold": 2,
"max_suggestions": 20,
"enable_combination_suggestions": True
}
@staticmethod
def get_content_analysis_config() -> Dict[str, Any]:
"""获取内容分析默认配置"""
return {
"content_length_weight": 0.25,
"title_quality_weight": 0.20,
"media_richness_weight": 0.20,
"structure_weight": 0.20,
"tag_completeness_weight": 0.15,
"likes_weight": 0.40,
"comments_weight": 0.35,
"shares_weight": 0.25,
"enable_sentiment_analysis": True,
"enable_theme_extraction": True,
"enable_readability_analysis": True,
"max_themes": 10,
"theme_frequency_threshold": 2
}
@classmethod
def get_complete_default_config(cls) -> Dict[str, Any]:
"""获取完整的默认配置"""
return {
"ai_model": cls.get_ai_model_config(),
"prompts": cls.get_prompt_config(),
"content_generation": cls.get_content_generation_config(),
"poster_generation": cls.get_poster_generation_config(),
"document_processing": cls.get_document_processing_config(),
"output": cls.get_output_config(),
"resources": cls.get_resource_config()
}