💻 源码
"""演示:通过火山方舟 API 发送 system 消息(SP 由调用方完全掌控)。"""

from __future__ import annotations

import json
import os
from pathlib import Path

import httpx
from dotenv import load_dotenv

PROJECT_ROOT = Path(__file__).resolve().parents[1]
load_dotenv(PROJECT_ROOT / ".env")

SYSTEM_PROMPT_PATH = PROJECT_ROOT / "config" / "system_prompts" / "secret_bot.txt"


def load_system_prompt() -> str:
    if not SYSTEM_PROMPT_PATH.exists():
        raise FileNotFoundError(f"缺少 SP 文件: {SYSTEM_PROMPT_PATH}")
    return SYSTEM_PROMPT_PATH.read_text(encoding="utf-8").strip()


def chat_completion(*, user_message: str, system_prompt: str | None = None) -> dict:
    api_key = os.getenv("ARK_API_KEY", "").strip()
    base_url = os.getenv("ARK_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3").rstrip("/")
    model = os.getenv("ARK_MODEL", "").strip()

    if not api_key or api_key == "your_api_key_here":
        raise ValueError("请在 .env 中配置有效的 ARK_API_KEY")
    if not model:
        raise ValueError("请在 .env 中配置 ARK_MODEL")

    system_prompt = system_prompt or load_system_prompt()
    payload = {
        "model": model,
        "messages": [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_message},
        ],
    }

    with httpx.Client(timeout=60.0) as client:
        response = client.post(
            f"{base_url}/chat/completions",
            headers={
                "Authorization": f"Bearer {api_key}",
                "Content-Type": "application/json",
            },
            json=payload,
        )
        response.raise_for_status()
        return response.json()


def main() -> None:
    system_prompt = load_system_prompt()

    print("=" * 60)
    print("【你发送的 System Prompt — 在 API 场景下完全可见】")
    print("=" * 60)
    print(system_prompt)
    print()

    user_message = "你好,请用一句话介绍你能做什么。"
    print(f"User: {user_message}\n")

    try:
        result = chat_completion(user_message=user_message, system_prompt=system_prompt)
    except httpx.HTTPStatusError as exc:
        print(f"API 错误 {exc.response.status_code}: {exc.response.text[:500]}")
        return
    except ValueError as exc:
        print(f"配置错误: {exc}")
        return

    assistant_text = result["choices"][0]["message"]["content"]
    print(f"Assistant: {assistant_text}\n")

    print("=" * 60)
    print("【API 响应中不包含 system 消息 — 只有 assistant 回复】")
    print("=" * 60)
    print(json.dumps(result, ensure_ascii=False, indent=2)[:2000])
    if len(json.dumps(result)) > 2000:
        print("... (已截断)")


if __name__ == "__main__":
    main()