299 lines
9.2 KiB
Python
299 lines
9.2 KiB
Python
|
|
"""
|
|||
|
|
任务相关的业务逻辑服务
|
|||
|
|
"""
|
|||
|
|
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
|