File size: 3,878 Bytes
d04a18c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   ali_llm.py
@Time    :   2023/12/01 18:00:00
@Author  :   YourName
@Desc    :   阿里通义千问大模型封装
'''

from langchain.llms.base import LLM
from typing import Any, List, Mapping, Optional, Dict, Union
from pydantic import Field
from llm.self_llm import Self_LLM
from langchain.callbacks.manager import CallbackManagerForLLMRun
import json
import requests

class Ali_LLM(Self_LLM):
    """阿里通义千问大模型封装"""
    url: str = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
    model: str = "qwen-max"  # 添加model属性定义
    
    def __init__(self, model: str = "qwen-max", temperature: float = 0.0, api_key: str = None):
        super().__init__()
        self.model = model
        self.temperature = temperature
        self.api_key = api_key
    
    def _call(self, prompt: str, stop: Optional[List[str]] = None,
              run_manager: Optional[CallbackManagerForLLMRun] = None,
              **kwargs: Any):
        chat_history = kwargs.get('chat_history', [])

         # 添加系统提示词
        system_prompt = """你是一个三国大乱斗系统的AI助手。你能提供以下功能。
系统功能:
1. 角色抽取:随机抽取三国人物卡并展示完整信息,包括:
   - 角色名
   - 角色特点
   - 属性值
   - 技能说明
2.对战规程介绍:
   - 回合制对战规则:
     - 每回合速度快的方先出手
     - 行动选择:每回合只能选择其中一种行动类型
       a) 普通攻击:造成基础伤害
       b) 使用技能:消耗资源发动特殊效果(不与普通攻击叠加)
       c) 休息:回复3点体力和10点法力
     - 技能使用:需要支付相应消耗,无法支付则无法发动
     - 伤害计算的逻辑:
       - 普通攻击伤害 = (攻击方攻击-防御方防御)/防御方耐力*4  
       - 技能伤害/效果独立计算
     - 胜负判定:体力降为0或以下即判负
3. 对战系统:
   a) 角色抽取阶段:
      - 玩家抽取角色后立即固定为玩家角色
      - 自动匹配对手角色
      - 明确显示"玩家角色:[角色名]"和"对手角色:[角色名]"
      
   b) 对战准备:
      - 直接进入对战,不再重复确认角色
      - 显示双方完整属性面板
      - 自动开始第一回合
      
   c) 回合执行:
      - 玩家只需选择行动类型(1.普通攻击 2.技能(列出技能列表) 3.休息(效果:回复3点体力和10点法力)),每个回合只能执行一个动作(普攻或技能或休息三选一)
      - AI自动处理对手行动
      - 实时显示本回合双方行动的结果,然后询问玩家下个回合要执行什么动作
      
   c) 战报生成:
      - 只显示当前回合选择的行动结果
      - 不混合显示不同行动类型的效果
      - 对战如果结束生成简单汇报"""
        
        messages = [
            {"role": "system", "content": system_prompt},
            *[{"role": "user" if i%2==0 else "assistant", "content": msg[0] if i%2==0 else msg[1]} 
              for i, msg in enumerate(chat_history)],
            {"role": "user", "content": prompt}
        ]
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": self.model,
            "input": {"messages": messages},
            "parameters": {"temperature": self.temperature}
        }
        
        response = requests.post(self.url, headers=headers, json=payload)
        if response.status_code == 200:
            return response.json()["output"]["text"]
        return f"请求失败: {response.text}"
    
    @property
    def _llm_type(self) -> str:
        return "Ali"