Files
remoteconn-gitea/skills/ai-ppt-generator-1.1.4/scripts/generate_ppt.py
2026-03-21 18:57:10 +08:00

148 lines
5.0 KiB
Python

import os
import random
import sys
import time
import requests
import json
import argparse
URL_PREFIX = "https://qianfan.baidubce.com/v2/tools/ai_ppt/"
class Style:
def __init__(self, style_id, tpl_id):
self.style_id = style_id
self.tpl_id = tpl_id
class Outline:
def __init__(self, chat_id, query_id, title, outline):
self.chat_id = chat_id
self.query_id = query_id
self.title = title
self.outline = outline
def get_ppt_theme(api_key: str):
"""Get a random PPT theme"""
headers = {
"Authorization": "Bearer %s" % api_key,
}
response = requests.post(URL_PREFIX + "get_ppt_theme", headers=headers)
result = response.json()
if "errno" in result and result["errno"] != 0:
raise RuntimeError(result["errmsg"])
style_index = random.randint(0, len(result["data"]["ppt_themes"]) - 1)
theme = result["data"]["ppt_themes"][style_index]
return Style(style_id=theme["style_id"], tpl_id=theme["tpl_id"])
def ppt_outline_generate(api_key: str, query: str):
"""Generate PPT outline"""
headers = {
"Authorization": "Bearer %s" % api_key,
"X-Appbuilder-From": "openclaw",
"Content-Type": "application/json"
}
headers.setdefault('Accept', 'text/event-stream')
headers.setdefault('Cache-Control', 'no-cache')
headers.setdefault('Connection', 'keep-alive')
params = {
"query": query,
}
title = ""
outline = ""
chat_id = ""
query_id = ""
with requests.post(URL_PREFIX + "generate_outline", headers=headers, json=params, stream=True) as response:
for line in response.iter_lines():
line = line.decode('utf-8')
if line and line.startswith("data:"):
data_str = line[5:].strip()
delta = json.loads(data_str)
if not title:
title = delta["title"]
chat_id = delta["chat_id"]
query_id = delta["query_id"]
outline += delta["outline"]
return Outline(chat_id=chat_id, query_id=query_id, title=title, outline=outline)
def ppt_generate(api_key: str, query: str, style_id: int = 0, tpl_id: int = None, web_content: str = None):
"""Generate PPT - simple version"""
headers = {
"Authorization": "Bearer %s" % api_key,
"Content-Type": "application/json",
"X-Appbuilder-From": "openclaw",
}
# Get theme
if tpl_id is None:
# Random theme
style = get_ppt_theme(api_key)
style_id = style.style_id
tpl_id = style.tpl_id
print(f"Using random template (tpl_id: {tpl_id})", file=sys.stderr)
else:
# Specific theme - use provided style_id (default 0)
print(f"Using template tpl_id: {tpl_id}, style_id: {style_id}", file=sys.stderr)
# Generate outline
outline = ppt_outline_generate(api_key, query)
# Generate PPT
headers.setdefault('Accept', 'text/event-stream')
headers.setdefault('Cache-Control', 'no-cache')
headers.setdefault('Connection', 'keep-alive')
params = {
"query_id": int(outline.query_id),
"chat_id": int(outline.chat_id),
"query": query,
"outline": outline.outline,
"title": outline.title,
"style_id": style_id,
"tpl_id": tpl_id,
"web_content": web_content,
"enable_save_bos": True,
}
with requests.post(URL_PREFIX + "generate_ppt_by_outline", headers=headers, json=params, stream=True) as response:
if response.status_code != 200:
print(f"request failed, status code is {response.status_code}, error message is {response.text}")
return []
for line in response.iter_lines():
line = line.decode('utf-8')
if line and line.startswith("data:"):
data_str = line[5:].strip()
yield json.loads(data_str)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Generate PPT")
parser.add_argument("--query", "-q", type=str, required=True, help="PPT topic")
parser.add_argument("--style_id", "-si", type=int, default=0, help="Style ID (default: 0)")
parser.add_argument("--tpl_id", "-tp", type=int, help="Template ID (optional)")
parser.add_argument("--web_content", "-wc", type=str, default=None, help="Web content")
args = parser.parse_args()
api_key = os.getenv("BAIDU_API_KEY")
if not api_key:
print("Error: BAIDU_API_KEY must be set in environment.")
sys.exit(1)
try:
start_time = int(time.time())
results = ppt_generate(api_key, args.query, args.style_id, args.tpl_id, args.web_content)
for result in results:
if "is_end" in result and result["is_end"]:
print(json.dumps(result, ensure_ascii=False, indent=2))
else:
end_time = int(time.time())
print(json.dumps({"status": result["status"], "run_time": end_time - start_time}))
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)