Files
ViGent2/backend/app/services/glm_service.py
Kevin Wong 6e58f4bbe7 更新
2026-02-02 17:16:07 +08:00

147 lines
4.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.
"""
GLM AI 服务
使用智谱 GLM 生成标题和标签
"""
import json
import re
from loguru import logger
from zai import ZhipuAiClient
from app.core.config import settings
class GLMService:
"""GLM AI 服务"""
def __init__(self):
self.client = None
def _get_client(self):
"""获取或创建 ZhipuAI 客户端"""
if self.client is None:
if not settings.GLM_API_KEY:
raise Exception("GLM_API_KEY 未配置")
self.client = ZhipuAiClient(api_key=settings.GLM_API_KEY)
return self.client
async def generate_title_tags(self, text: str) -> dict:
"""
根据口播文案生成标题和标签
Args:
text: 口播文案
Returns:
{"title": "标题", "tags": ["标签1", "标签2", ...]}
"""
prompt = f"""根据以下口播文案生成一个吸引人的短视频标题和3个相关标签。
口播文案:
{text}
要求:
1. 标题要简洁有力能吸引观众点击不超过10个字
2. 标签要与内容相关便于搜索和推荐只要3个
请严格按以下JSON格式返回不要包含其他内容
{{"title": "标题", "tags": ["标签1", "标签2", "标签3"]}}"""
try:
client = self._get_client()
logger.info(f"Calling GLM API with model: {settings.GLM_MODEL}")
response = client.chat.completions.create(
model=settings.GLM_MODEL,
messages=[{"role": "user", "content": prompt}],
thinking={"type": "disabled"}, # 禁用思考模式,加快响应
max_tokens=500,
temperature=0.7
)
# 提取生成的内容
content = response.choices[0].message.content
logger.info(f"GLM response (model: {settings.GLM_MODEL}): {content}")
# 解析 JSON
result = self._parse_json_response(content)
return result
except Exception as e:
logger.error(f"GLM service error: {e}")
raise Exception(f"AI 生成失败: {str(e)}")
async def rewrite_script(self, text: str) -> str:
"""
AI 洗稿(文案改写)
Args:
text: 原始文案
Returns:
改写后的文案
"""
prompt = f"""请将以下视频文案进行改写。
原始文案:
{text}
要求:
1. 保持原意,但语气更加自然流畅
2. 适合口播,读起来朗朗上口
3. 字数与原文相当或略微精简
4. 不要返回多余的解释,只返回改写后的正文"""
try:
client = self._get_client()
logger.info(f"Using GLM to rewrite script")
response = client.chat.completions.create(
model=settings.GLM_MODEL,
messages=[{"role": "user", "content": prompt}],
thinking={"type": "disabled"},
max_tokens=2000,
temperature=0.8
)
content = response.choices[0].message.content
logger.info("GLM rewrite completed")
return content.strip()
except Exception as e:
logger.error(f"GLM rewrite error: {e}")
raise Exception(f"AI 改写失败: {str(e)}")
def _parse_json_response(self, content: str) -> dict:
"""解析 GLM 返回的 JSON 内容"""
# 尝试直接解析
try:
return json.loads(content)
except json.JSONDecodeError:
pass
# 尝试提取 JSON 块
json_match = re.search(r'\{[^{}]*"title"[^{}]*"tags"[^{}]*\}', content, re.DOTALL)
if json_match:
try:
return json.loads(json_match.group())
except json.JSONDecodeError:
pass
# 尝试提取 ```json 代码块
code_match = re.search(r'```(?:json)?\s*(\{.*?\})\s*```', content, re.DOTALL)
if code_match:
try:
return json.loads(code_match.group(1))
except json.JSONDecodeError:
pass
logger.error(f"Failed to parse GLM response: {content}")
raise Exception("AI 返回格式解析失败")
# 全局服务实例
glm_service = GLMService()