fix: 优化架构
This commit is contained in:
@@ -10,6 +10,38 @@ from .config import AppConfig
|
||||
from .types import Scene
|
||||
|
||||
|
||||
def _looks_like_api_key(v: str) -> bool:
|
||||
vv = (v or "").strip()
|
||||
# Common prefixes: DashScope uses "sk-..."; we keep it minimal and permissive.
|
||||
return bool(vv) and vv.startswith("sk-")
|
||||
|
||||
|
||||
def _looks_like_url(v: str) -> bool:
|
||||
vv = (v or "").strip()
|
||||
return vv.startswith("http://") or vv.startswith("https://")
|
||||
|
||||
|
||||
def _resolve_openai_credentials(cfg: AppConfig) -> tuple[str, str | None]:
|
||||
api_key_env = str(cfg.get("openai.api_key_env", "OPENAI_API_KEY") or "").strip()
|
||||
base_url_env = str(cfg.get("openai.base_url_env", "OPENAI_BASE_URL") or "").strip()
|
||||
|
||||
# 1) Resolve api_key: allow both "env var name" and "literal key" for safety.
|
||||
api_key = os.environ.get(api_key_env) if api_key_env else None
|
||||
if not api_key and api_key_env and _looks_like_api_key(api_key_env):
|
||||
api_key = api_key_env
|
||||
|
||||
if not api_key:
|
||||
raise RuntimeError(f"Missing OpenAI compatible API key (env={api_key_env})")
|
||||
|
||||
# 2) Resolve base_url: allow both "env var name" and "literal URL".
|
||||
base_url = os.environ.get(base_url_env) if base_url_env else None
|
||||
if not base_url and base_url_env and _looks_like_url(base_url_env):
|
||||
base_url = base_url_env
|
||||
if base_url:
|
||||
base_url = str(base_url).strip() or None
|
||||
return str(api_key), base_url
|
||||
|
||||
|
||||
def _system_prompt(scene_count: int, min_chars: int, max_chars: int) -> str:
|
||||
return f"""你是一个专业短视频编剧与分镜师。
|
||||
请把用户的创意扩展为 {scene_count} 个分镜(Scene) 的 JSON。
|
||||
@@ -56,17 +88,13 @@ def generate_scenes(user_prompt: str, cfg: AppConfig) -> list[Scene]:
|
||||
min_chars = int(cfg.get("script_gen.narration_min_chars", 15))
|
||||
max_chars = int(cfg.get("script_gen.narration_max_chars", 20))
|
||||
|
||||
api_key_env = str(cfg.get("openai.api_key_env", "OPENAI_API_KEY"))
|
||||
base_url_env = str(cfg.get("openai.base_url_env", "OPENAI_BASE_URL"))
|
||||
model = str(cfg.get("openai.model", "gpt-4o-mini"))
|
||||
|
||||
api_key = os.environ.get(api_key_env)
|
||||
if not api_key:
|
||||
raise RuntimeError(f"Missing env var {api_key_env} for OpenAI API key")
|
||||
api_key, base_url = _resolve_openai_credentials(cfg)
|
||||
|
||||
client = OpenAI(
|
||||
api_key=api_key,
|
||||
base_url=os.environ.get(base_url_env) or None,
|
||||
base_url=base_url,
|
||||
)
|
||||
|
||||
resp = client.chat.completions.create(
|
||||
@@ -105,17 +133,13 @@ def refine_scene(*, prompt: str, scenes: list[Scene], target_index: int, cfg: Ap
|
||||
min_chars = int(cfg.get("script_gen.narration_min_chars", 15))
|
||||
max_chars = int(cfg.get("script_gen.narration_max_chars", 20))
|
||||
|
||||
api_key_env = str(cfg.get("openai.api_key_env", "OPENAI_API_KEY"))
|
||||
base_url_env = str(cfg.get("openai.base_url_env", "OPENAI_BASE_URL"))
|
||||
model = str(cfg.get("openai.model", "gpt-4o-mini"))
|
||||
|
||||
api_key = os.environ.get(api_key_env)
|
||||
if not api_key:
|
||||
raise RuntimeError(f"Missing env var {api_key_env} for OpenAI API key")
|
||||
api_key, base_url = _resolve_openai_credentials(cfg)
|
||||
|
||||
client = OpenAI(
|
||||
api_key=api_key,
|
||||
base_url=os.environ.get(base_url_env) or None,
|
||||
base_url=base_url,
|
||||
)
|
||||
|
||||
scenes_payload = [
|
||||
|
||||
Reference in New Issue
Block a user