💻 源码
"""
DashScope API 调用封装(本项目唯一联网层)。

所有演示模式最终都通过 call_llm() 发起真实 HTTP 请求:
  dashscope.Generation.call() → 阿里云百炼 qwen-plus → 返回生成文本

没有本地假数据,没有 if-else 写死答案。
"""

from __future__ import annotations

import dashscope
from dashscope import Generation

from config import API_KEY, MODEL_NAME, SEED, TEMPERATURE

# 统计 API 调用次数,便于学生确认「确实在真实请求」
_call_count = 0


def get_call_count() -> int:
    return _call_count


def call_llm(messages: list[dict[str, str]]) -> str:
    """
    调用百炼文本生成接口,返回模型回复文本。

    参数 messages 格式示例:
        [
            {"role": "system", "content": "你是数学助手..."},
            {"role": "user", "content": "9.9 和 9.10 谁大?"},
        ]
    """
    global _call_count
    _call_count += 1
    if not API_KEY:
        raise RuntimeError(
            "未读取到系统环境变量 DASHSCOPE_API_KEY,"
            "请先在 Windows 系统环境变量中配置后重新打开终端。"
        )

    response = Generation.call(
        api_key=API_KEY,  # 显式传入;密钥来源为 os.getenv("DASHSCOPE_API_KEY")
        model=MODEL_NAME,
        messages=messages,
        temperature=TEMPERATURE,
        seed=SEED,
        result_format="message",
    )

    if response.status_code != 200:
        raise RuntimeError(
            f"模型调用失败:code={response.status_code}, "
            f"message={response.message}"
        )

    return response.output.choices[0].message.content.strip()