from langchain.prompts import PromptTemplate

from turing_planet.langchain.llm.sparkai import SparkAI

PLAN_PROMPT_TEMPL = """
## 任务描述

假设你是一个智能交互助手，基于给定技能信息和用户交互历史，能够准确判断用户意图，并将复杂意图拆解成简单意图的列表，并判断解决用户每个意图所需要技能，最终以 JSON 形式输出。

## 要求

1. 判断用户问题中包含几个意图；
2. 如果用户问题中只包含单个意图，那么不需要进行意图拆解，直接以列表形式输出；
3. 如果用户问题中包含多个意图，那么请拆解成单个意图，并以列表形式输出，列表中每一项都是单个意图；
4. 拆解成单个意图时，请注意：

- 需要逐个判断需要依赖哪些前置意图的结果；
- 需要判断意图间的执行顺序，需要先执行的排在前面，依赖其他意图执行结果的排在后面；
- 需要判断意图间是否存在矛盾，如果有矛盾请只输出最终的意图；

5. 输出单个意图时，注意请尽量保留原意图内容，去除与意图无关的文字，修正意图描述中的语病；有必要时，补全单个意图不完整的描述，形成一个完整的句子；
6. 每个意图所需要技能，如果意图列表中没有适合的技能，填写空，不要使用列表中没有的任何功能；
7. 直接生成 JSON 结果，严格按照样例的结构输出。

## 输出要求

请以 JSON 格式输出意图列表，每个单意图为一个字典结构，包含以下字段："index" 表示当前序号，"intent" 表示单意图描述，"dependency" 为依赖的意图序号列表，表示当前意图需要依赖列表中的各项意图的执行结果，"plugin" 表示解决单意图所需使用的技能。

## 技能信息

[
    {"name": "天气查询", "desc": "对指定时间、地点的天气进行查询，提供出行、旅行建议"},
    {"name": "股票查询", "desc": "此插件用于查询某个公司的股票信息"},
    {"name": "车票查询", "desc": "此插件用于查询指定时间、出发地、目的地查询高铁或者飞机票"},
    {"name": "数学计算", "desc": "包括算式计算和解方程等能力"},
    {"name": "搜索插件", "desc": "调用搜索引擎接口"}
    {"name": "酒店查询", "desc": "根据行程目的地，查询当地合适酒店"}
]

## 样例

用户：合肥今天的天气怎么样？
系统：

```
[{"index": 0, "intent": "合肥今天的天气怎么样？", "dependency": [], "plugin": "天气查询"}]
```

用户：今天合肥有什么头条新闻？
系统：

```
[{"index": 0, "intent": "今天合肥有什么头条新闻？", "dependency": [], "plugin": "搜索插件"}]
```

用户：你好
系统：

```
[{"index": 0, "intent": "你好", "dependency": [], "plugin": ""}]
```

## 交互历史

{{history}}

## 当前问题

{{question}}

## 任务重述

请参照样例，将用户的当前问题拆解成意图列表，并判断解决用户每个意图所需要技能，并以 JSON 形式输出：
"""

if __name__ == '__main__':
    prompt = PLAN_PROMPT_TEMPL.replace("{{question}}", "海南这周日比北京气温高多少度")

    print("===prompt===\n", prompt)
    spark = SparkAI(endpoint="172.31.164.103:9980")
    spark.temperature = 0

    print("===answer===")
    print(spark.invoke(prompt))
