42 lines
1.8 KiB
Python
42 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""千问(Qwen)模型调用:读取配置文件中的 API Key,使用 OpenAI 兼容接口。"""
|
||
import logging
|
||
import os
|
||
from typing import List, Optional
|
||
|
||
logger = logging.getLogger("wechat-backend.qwen")
|
||
|
||
# 优先 QWEN_API_KEY,其次 DASHSCOPE_API_KEY,最后 APIKEY(.env 中可配置千问 key)
|
||
QWEN_API_KEY = os.getenv("QWEN_API_KEY") or os.getenv("DASHSCOPE_API_KEY") or os.getenv("APIKEY")
|
||
QWEN_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
|
||
QWEN_MODEL = os.getenv("QWEN_MODEL", "qwen-turbo")
|
||
|
||
|
||
async def qwen_chat(messages: List[dict], api_key: Optional[str] = None) -> Optional[str]:
|
||
"""调用千问对话,返回 assistant 回复文本。messages 格式 [{"role":"user","content":"..."}] 或含 system。"""
|
||
key = api_key or QWEN_API_KEY
|
||
if not key:
|
||
logger.warning("No QWEN_API_KEY / APIKEY in env, skip qwen call")
|
||
return None
|
||
try:
|
||
from openai import AsyncOpenAI
|
||
client = AsyncOpenAI(api_key=key, base_url=QWEN_BASE_URL)
|
||
r = await client.chat.completions.create(model=QWEN_MODEL, messages=messages)
|
||
text = r.choices[0].message.content if r.choices else None
|
||
return text
|
||
except Exception as e:
|
||
logger.exception("qwen_chat error: %s", e)
|
||
return None
|
||
|
||
|
||
async def generate_greeting(remark_name: str, region: str = "", tags: List[str] = None) -> Optional[str]:
|
||
"""根据客户备注、地区、标签生成一句简短个性化问候语。"""
|
||
tags = tags or []
|
||
user = f"请生成一句简短的微信问候语(1-2句话),客户备注名:{remark_name}"
|
||
if region:
|
||
user += f",地区:{region}"
|
||
if tags:
|
||
user += f",标签:{','.join(tags)}"
|
||
user += "。不要解释,只输出问候语本身。"
|
||
return await qwen_chat([{"role": "user", "content": user}])
|