XinXiKuaiBaoYuan/django-backend/tasks/services.py

299 lines
9.2 KiB
Python
Raw Normal View History

"""
任务相关的业务逻辑服务
"""
import re
from typing import Dict, Tuple
from django.conf import settings
class AITitleGenerator:
"""AI标题生成服务"""
@staticmethod
def generate_title_and_description(requirement: str) -> Tuple[str, str]:
"""
根据用户需求生成任务标题和描述
Args:
requirement: 用户需求描述
Returns:
tuple: (标题, 描述)
"""
# 简化版本的关键词匹配实际应该调用OpenAI API
keywords = requirement.lower()
# 默认值
title = '信息监控任务'
description = '智能监控和分析任务'
# 关键词匹配规则
if any(keyword in keywords for keyword in ['openai', 'ai', '人工智能', '机器学习']):
title = 'AI技术动态监控'
description = '实时监控AI技术发展动态和产品更新'
elif any(keyword in keywords for keyword in ['产品', '功能', '发布', '更新']):
title = '产品功能监控'
description = '跟踪产品功能更新和发布动态'
elif any(keyword in keywords for keyword in ['新闻', '资讯', '动态', '消息']):
title = '新闻资讯监控'
description = '收集和分析相关新闻资讯'
elif any(keyword in keywords for keyword in ['市场', '行业', '竞争', '分析']):
title = '市场行业分析'
description = '监控市场动态和行业发展趋势'
elif any(keyword in keywords for keyword in ['股票', '金融', '投资', '财经']):
title = '金融投资监控'
description = '跟踪金融市场和投资机会'
elif any(keyword in keywords for keyword in ['政策', '法规', '监管', '政府']):
title = '政策法规监控'
description = '监控政策变化和法规更新'
# 从需求中提取关注对象,添加到标题中
object_match = re.search(r'关注对象[:]\s*([^\n\r,。.]+)', requirement)
if object_match:
focus_object = object_match.group(1).strip()
if focus_object and len(focus_object) < 20:
title = f'{focus_object} - {title}'
return title, description
@staticmethod
def generate_with_openai(requirement: str) -> Tuple[str, str]:
"""
使用OpenAI API生成标题和描述备用方案
Args:
requirement: 用户需求描述
Returns:
tuple: (标题, 描述)
"""
try:
import openai
if not settings.OPENAI_API_KEY:
return AITitleGenerator.generate_title_and_description(requirement)
openai.api_key = settings.OPENAI_API_KEY
prompt = f"""
根据以下用户需求生成一个简洁的任务标题和一句话描述
用户需求
{requirement}
请返回JSON格式
{{
"title": "任务标题不超过20字",
"description": "任务描述不超过50字"
}}
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一个专业的任务管理助手,擅长根据用户需求生成简洁明确的任务标题和描述。"},
{"role": "user", "content": prompt}
],
max_tokens=200,
temperature=0.7
)
result = response.choices[0].message.content
# 解析JSON响应
import json
parsed = json.loads(result)
return parsed.get('title', '信息监控任务'), parsed.get('description', '智能监控和分析任务')
except Exception as e:
print(f"OpenAI API调用失败: {e}")
# 降级到本地生成
return AITitleGenerator.generate_title_and_description(requirement)
class TaskService:
"""任务业务逻辑服务"""
@staticmethod
def create_task(user, task_data: Dict):
"""
创建新任务
Args:
user: 用户对象
task_data: 任务数据
Returns:
Task: 创建的任务对象
"""
# 生成AI标题和描述
title, description = AITitleGenerator.generate_title_and_description(
task_data['requirement']
)
# 构建信息源配置
sources_config = {
'presetSources': task_data.get('presetSources', []),
'customSources': task_data.get('customSources', []),
'webSearchEnabled': task_data.get('webSearchEnabled', True)
}
# 导入模型
from .models import Task, TaskLog
# 创建任务
task = Task.objects.create(
title=title,
description=description,
requirement=task_data['requirement'],
type=task_data['type'],
schedule_config=task_data.get('schedule'),
sources_config=sources_config,
web_search_enabled=task_data.get('webSearchEnabled', True),
user=user
)
# 记录创建日志
TaskLog.objects.create(
task=task,
action_type='created',
message=f'任务创建成功: {title}'
)
# 如果是单次任务,立即开始执行
if task.type == 'single':
TaskService.start_task_execution(task)
return task
@staticmethod
def start_task_execution(task):
"""
开始执行任务
Args:
task: 任务对象
"""
# 更新任务状态
task.status = 'running'
task.save(update_fields=['status'])
# 导入模型
from .models import TaskLog
# 记录开始执行日志
TaskLog.objects.create(
task=task,
action_type='started',
message='任务开始执行'
)
# 这里可以添加Celery异步任务调用
# from .tasks import execute_task
# execute_task.delay(task.id)
@staticmethod
def pause_task(task):
"""暂停任务"""
# 导入模型
from .models import TaskLog
task.status = 'paused'
task.save(update_fields=['status'])
TaskLog.objects.create(
task=task,
action_type='paused',
message='任务已暂停'
)
@staticmethod
def resume_task(task):
"""恢复任务"""
# 导入模型
from .models import TaskLog
task.status = 'running'
task.save(update_fields=['status'])
TaskLog.objects.create(
task=task,
action_type='resumed',
message='任务已恢复'
)
class ReportService:
"""报告业务逻辑服务"""
@staticmethod
def create_mock_report(task):
"""
创建模拟报告用于演示
Args:
task: 任务对象
Returns:
Report: 创建的报告对象
"""
# 根据任务需求生成模拟报告内容
requirement = task.requirement.lower()
if 'openai' in requirement or 'ai' in requirement:
title = 'OpenAI GPT-4 Turbo重大更新'
summary = 'OpenAI发布GPT-4 Turbo新版本支持更长上下文性能显著提升...'
content = """# OpenAI GPT-4 Turbo重大更新
## 主要更新内容
1. **上下文长度提升**: 支持128K tokens的上下文长度
2. **性能优化**: 推理速度提升2倍
3. **成本降低**: API调用成本降低50%
## 详细分析
这次更新标志着AI技术的重要进展...
"""
source_tag = 'OpenAI官网'
else:
title = f'{task.title} - 最新动态报告'
summary = f'基于您的需求「{task.requirement[:50]}...」生成的分析报告'
content = f"""# {task.title}
## 监控概要
根据您的需求进行信息收集和分析
## 关键发现
1. 相关信息已收集完成
2. 数据分析正在进行中
3. 将持续监控相关动态
## 详细内容
{task.requirement}
## 下一步计划
继续监控相关信息源及时更新分析结果
"""
source_tag = '联网搜索'
# 导入模型
from .models import Report, ReportSource
report = Report.objects.create(
task=task,
title=title,
summary=summary,
content=content,
source_tag=source_tag,
status='completed'
)
# 创建报告来源记录
ReportSource.objects.create(
report=report,
source_type='web-search',
source_name='联网搜索',
extracted_content=summary
)
return report