XinXiKuaiBaoYuan/django-backend/tasks/services.py

299 lines
9.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
任务相关的业务逻辑服务
"""
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