- 项目详情页三阶段里程碑管理(前期/制作/后期) - 制作卡片改用180px ECharts圆环进度图+右侧数据列表 - 修复损耗率双重计算bug(测试秒数不再重复计入超产) - 新增飞书推送服务、豆包AI风险分析、APScheduler定时报告 - 项目列表页增强(筛选/排序/批量操作/废弃功能) - 成员详情页产出时间轴+效率对比 - 成本页固定开支管理 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
97 lines
3.2 KiB
Python
97 lines
3.2 KiB
Python
"""豆包大模型服务 —— 通过火山引擎 ARK 平台调用"""
|
||
import logging
|
||
from config import ARK_API_KEY, ARK_MODEL, ARK_BASE_URL
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# 延迟初始化,避免无 Key 时报错
|
||
_client = None
|
||
|
||
|
||
def _get_client():
|
||
global _client
|
||
if _client is None and ARK_API_KEY:
|
||
from openai import OpenAI
|
||
_client = OpenAI(api_key=ARK_API_KEY, base_url=ARK_BASE_URL)
|
||
return _client
|
||
|
||
|
||
def generate_report_summary(data_context: str, report_type: str) -> str:
|
||
"""
|
||
调用豆包生成报告摘要
|
||
:param data_context: 数据库汇总数据(纯文本)
|
||
:param report_type: daily / weekly / monthly
|
||
:return: AI 生成的 markdown 摘要,失败时返回空字符串
|
||
"""
|
||
client = _get_client()
|
||
if not client:
|
||
logger.warning("豆包 AI 未配置 API Key,跳过摘要生成")
|
||
return ""
|
||
|
||
type_labels = {"daily": "日报", "weekly": "周报", "monthly": "月报"}
|
||
label = type_labels.get(report_type, "报告")
|
||
|
||
system_prompt = (
|
||
"你是 AirLabs 动画团队的项目管理助手。"
|
||
"请根据提供的数据,用简洁的中文生成一段项目管理{label}总结。"
|
||
"要求:\n"
|
||
"1. 语言简练专业,适合管理层阅读\n"
|
||
"2. 先总结关键数据,再给出分析和建议\n"
|
||
"3. 如果有风险项目,重点提醒\n"
|
||
"4. 使用 markdown 格式\n"
|
||
"5. 总字数控制在 300 字以内"
|
||
).format(label=label)
|
||
|
||
try:
|
||
response = client.chat.completions.create(
|
||
model=ARK_MODEL,
|
||
messages=[
|
||
{"role": "system", "content": system_prompt},
|
||
{"role": "user", "content": f"以下是{label}数据,请生成总结:\n\n{data_context}"},
|
||
],
|
||
temperature=0.7,
|
||
max_tokens=1024,
|
||
timeout=30,
|
||
)
|
||
return response.choices[0].message.content.strip()
|
||
except Exception as e:
|
||
logger.error(f"豆包 AI 调用失败: {e}")
|
||
return ""
|
||
|
||
|
||
def generate_risk_analysis(project_data: str) -> str:
|
||
"""
|
||
调用豆包分析项目风险
|
||
:param project_data: 项目数据文本
|
||
:return: AI 生成的风险分析,失败时返回空字符串
|
||
"""
|
||
client = _get_client()
|
||
if not client:
|
||
return ""
|
||
|
||
system_prompt = (
|
||
"你是 AirLabs 动画团队的项目风险分析专家。"
|
||
"请根据项目数据,分析风险原因并给出改进建议。"
|
||
"要求:\n"
|
||
"1. 分析要具体,基于数据说话\n"
|
||
"2. 建议要可执行\n"
|
||
"3. 使用中文,简练专业\n"
|
||
"4. 总字数控制在 150 字以内"
|
||
)
|
||
|
||
try:
|
||
response = client.chat.completions.create(
|
||
model=ARK_MODEL,
|
||
messages=[
|
||
{"role": "system", "content": system_prompt},
|
||
{"role": "user", "content": f"项目数据:\n\n{project_data}"},
|
||
],
|
||
temperature=0.7,
|
||
max_tokens=512,
|
||
timeout=30,
|
||
)
|
||
return response.choices[0].message.content.strip()
|
||
except Exception as e:
|
||
logger.error(f"豆包 AI 风险分析失败: {e}")
|
||
return ""
|