"""演示:通过火山方舟 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()