import os import time import uuid from typing import Optional import google.generativeai as genai import orjson import requests from google.generativeai.types import (HarmBlockThreshold, HarmCategory) from loguru import logger from utils.feishu_data import Material CACHE_DIR = '/app/cache/' prompt = ''' 请帮助我做以下分析: 我将提供给你视频,需要你模拟成中老年用户在视频消费平台观看这些视频。 需要你充分发挥想象力,推测出中老年用户在观看这些视频过程中,可能产生什么具体的需求。并推测出该点需求的原因。 -每项需求请根据观看者的需求强烈程度打分排序,越强烈分值越高,分值越高排序越前。分值范围:0-10分。 -每项需求请分类。需求类型:比如获取服务类、获取信息类、交流互动类、内容分享类等,类型字数请控制在10个字以内。 -针对这些需求,平台有两部分功能:钩子及落地方案,钩子指在视频需求产生时,平台会有相关提示,提示用户进入落地方案;落地方案指针对用户需求,平台提供的相关信息、服务能力,解决用户的需求 -针对这些需求,平台有几类解决方案,1. AI对话机器人;可提供信息与基础生活服务,回答用户问题;2. 内容推荐;推荐平台内相关短视频;3.外部跳转;跳转至H5或小程序页面,如商品页、应用页等各类页面;4. 二维码;可加入社群、关注公众号、小助手等;5.引导分享;视频如引起用户强烈分享欲,引导用户分享;不限于此5种,可提出更多解决方案及落地页方式 -需求是用户在观看过程中有欲望产生除观看外的动作,需求不要泛泛而谈,而是针对这个视频的强烈需求欲望。第一要与视频紧密相关,第二要包含用户真正的好奇心、交流欲等。第三需求范围不要大而空,要具体详细真实,如“了解适合老年人的旅游景点和路线”是不好的需求提取与描述,要根据视频说明具体的景点及具体出行行为 -需求描述清晰简洁,30字以内 -由于用户观看行为与注意力,需求最好与视频初始部分或整体内容相关; -客观合理为需求打分,如判断需求不强烈,请打低分;一个视频可都为低分需求 -需求 -需求详细query是将用户需求及视频背景信息总结为一段给AI模型的需求问题或指令;AI模型没有视频上下文信息,仅根据你的描述进行回答,请总结,不要有指代;落地方案非AI对话机器人,可为空 -总结10字内钩子话术,引导用户产生兴趣点击落地方案;产品落地形态应与产品钩子合理承接。如,点击“搜索更多养老院视频”按键后,自动搜索“养老院”相关内容且页面跳转落地至搜索结果页,展示养老院视频列表供用户挑选; 输出内容单引号换成双引号,每一个字段都要有值 输出内容格式: output in JSON format with keys: 需求排序序号(str) 需求强烈程度分值(str) 用户具体的需求描述(str) 需求详细query(str) 需求分类(str) 推测出该点需求的原因(str) 需求钩子话术(str) 落地方案类型(str) 落地方案形态描述(str) ''' # CACHE_DIR = '/Users/z/Downloads/' # PROXY_ADDR = 'http://localhost:1081' # os.environ['http_proxy'] = PROXY_ADDR # os.environ['https_proxy'] = PROXY_ADDR class GoogleAI(object): @classmethod def download_video(cls, video_link: str) -> Optional[str]: file_path = os.path.join(CACHE_DIR, f'{str(uuid.uuid4())}.mp4') for _ in range(3): try: response = requests.get(url=video_link, timeout=60) if response.status_code == 200: with open(file_path, 'wb') as f: f.write(response.content) logger.info(f'[内容分析] 视频链接: {video_link}, 存储地址: {file_path}') return file_path except Exception: time.sleep(1) continue return @classmethod def run(cls, api_key, video_url): video_path = None try: genai.configure(api_key=api_key) video_path = cls.download_video(video_link=video_url) if not video_path: logger.error(f'[内容分析] 视频下载失败, 跳过任务') os.remove(video_path) logger.info(f"[内容分析] 文件已删除: {video_path}") return "[异常] 视频下载失败" video = genai.upload_file(path=video_path, mime_type='video/mp4') while video.state.name == 'PROCESSING': time.sleep(1) video = genai.get_file(name=video.name) if video.state.name != 'ACTIVE': genai.delete_file(name=video.name) os.remove(video_path) return "[异常] 上传视频失败" model = genai.GenerativeModel( model_name='gemini-1.5-flash', generation_config=genai.GenerationConfig(response_mime_type='application/json'), safety_settings={ HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE, }, ) # mark, prompt = Material.feishu_list() response = model.generate_content( contents=[ video, f'{prompt}', ], stream=False, request_options={ 'timeout': 600, }, ) text = orjson.loads(response.text.strip()) genai.delete_file(name=video.name) os.remove(video_path) return text except Exception as e: logger.error(f"[内容分析] 处理异常,异常信息{e}") os.remove(video_path) return f"[异常] {e}" if __name__ == '__main__': ai = GoogleAI() ai.run("AIzaSyA_dXKbcW8s0fFIoo89rtPRWU34pJry7mU", "http://rescdn.yishihui.com/jq_oss/video/2025012215472528213")