from openai import OpenAI
import os


def get_response():
    client = OpenAI(
        api_key="sk-f01744b2801344b1a72f89ec7e290cad",
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 填写DashScope服务的base_url
    )
    completion = client.chat.completions.create(
        model="qwen-turbo",
        messages=[
            {'role': 'system',
             'content':
                 '你是一名擅长调试和控制智慧住宅能源系统的专家，需要根据当前环境状态给出最优的动作决策。'
                 '能源系统结构包括太阳能发电站、风能发电站、发电机、电池模块和住宅电网连接。'},
            {'role': 'user',
             'content':
                 '一、当前状态包含9个值：'
                 'Sc(电池荷电状态)初始为0.4，范围0.2到0.8；Sg1(发电机1功率状态)、Sg2(发电机2功率状态)和Sg3(发电机3功率状态)初始功率都为0；'
                 'Sp(电价状态)、Sl(住宅负载状态)、St(温度状态)、Si(太阳辐射度状态)和Sw(风速状态)都由数据提供。'
                 '其中Sc、Sg1、Sg2和Sg3的值都是在上一时刻基础上进行变化的，始终不小于0，Sg1、Sg2和Sg3为0代表各发动机关闭。'
                 '二、当前动作包含5个值：'
                 'x表示当前时间的取值, 其范围从-1到1，电池总容量为500，初始电池容量为500*0.4=200，Ag1、Ag2和Ag3分别表示相对于各自最大瞬时功率的变化值。'
                 'Ac(电池充放电动作)：电池容量变化100*x；Ag1(发电机1功率动作)：功率变化100*x；Ag2(发电机2功率动作)：功率变化100*x；Ag3(发电机3功率动作)：功率变化200*x；Av(太阳能电压动作)：太阳能电压变为(1+x)倍。'
                 '三、功率计算公式'
                 '1.Pc(电池充放电功率)= max(0.2,min(0.8,Sc+0.18*Ac))；2.Pg1(发电机1功率)= max(0,min(150,100*Ag1+Sg1))；'
                 '3.Pg2(发电机2功率)= max(0,min(375,100*Ag2+Sg2))；4.Pg3(发电机3功率)= max(0,min(500,200*Ag3+Sg3))；'
                 '5.Pso(太阳能功率)= max(0,(0.45*Si+0.015*St–60.3)*(1+Av))；'
                 '6.Pw(风能功率) if 3<=Sw<8, Pw=Sw^3*172.2625/1000 elif 8<=Sw<12, Pw=64*172.2625/125 else Pw=0'
                 '四、成本和能源惩罚计算公式'
                 'P(总功率)=Pc+Pg1+Pg2+Pg3+Pso+Pw'
                 'if P>=Sl, Ee(过剩能源)= P–Sl, else Es(短缺能源)=Sl-P'
                 'Cb(电池成本)=0.01*Ac+0.1*Sc;Cg1(发电机1成本)=0.0034*Pg1^2+3*Pg1+30'
                 'Cg2(发电机2成本)=0.001*Pg2^2+10*Pg2+40;Cg3(发电机3成本)=0.001*Pg3^2+15*Pg3+70'
                 'Cs(太阳能成本)=0.01*Pso;Cw(风能成本)=0.01*Pw'
                 'Rs(销售收入)=0.5*Sp*Ee;Cp(购买成本)=Sp*Es'
                 'Pe(过剩惩罚)=(Ee-100)*50;Ps(短缺惩罚)=(Es-100)*50'
                 'Rs、Pe和Cp、Ps对应能源过剩和能源短缺情况，不能同时存在。'
                 '五、目标函数 Goal=- (Cb+Cg1+Cg2+Cg3+Cs+Cw+Pe+Ps-Rs+Cp)/1000'
                 '六、控制方案和目标：'
                 '1.优先使用太阳能和风能发电，当无法满足负荷时，使用发电机和电池供电；'
                 '2.供电时综合考虑各发电模块的成本，通常前一台发电机的最大功率不足以满足负荷时，才开启后续发电机；'
                 '3.减少超过公网交易限额的交易，避免公共电网波动影响住宅用电稳定性；'
                 '4.满足下一时刻住宅用电负载，最大化奖励函数且使供需差异最小化(Ee、Es尽可能小)，提升训练效果和策略质量。'
                 '请你读取每小时的Sp、Sl、St、Si和Sw数据并计算每个时刻的状态，然后使用最合适的优化方法给出每小时的动作决策，'
                 '其长度为5，分别表示Ac、Ag1、Ag2、Ag3和Av，每小时计算一次。'
                 '结果应为Json格式：[{{x1, x2, x3, x4, x5}}, {{x1, x2, x3, x4, x5}}, ...]，如果计算量太大，可以分批回答。'}],
        temperature=0.8,
        top_p=0.8
    )
    print(completion.model_dump_json())


if __name__ == '__main__':
    get_response()
