@@ -0,0 +1,2 @@ | |||
*.pyc | |||
*.json |
@@ -0,0 +1,81 @@ | |||
# chatGPT_Web Private Deployment | |||
### Using the api of gpt-3.5-turbo model, supporting markdown and continuous conversation, using flask to implement SSE service to push streaming text, and achieve similar conversation effect as the official website. | |||
> The project is based on the implementation of two other open source projects, and I would like to thank the authors of these two projects. | |||
> Modified the interface of V3.py of [acheong08](https://github.com/acheong08/ChatGPT) to connect to the official api. | |||
> Refer to the web code of [slippersheepig](https://github.com/slippersheepig/chatgpt-web). | |||
# Deployment Method | |||
## Install Dependencies | |||
### Download this project by git | |||
```shell | |||
git clone "https://github.com/promisevergo/chatGPT_Web.git" | |||
cd chatGPT_Web | |||
``` | |||
### Use pip to read requirement.txt, it is recommended to use python 3.10 or higher. | |||
```shell | |||
pip install -r requirements.txt | |||
``` | |||
### Configure the required parameters. If it is deployed locally, the default IP can be used. If it is deployed on a server, the internal network IP of the service needs to be filled in. If there is no internal network IP, fill in the public IP. | |||
```python | |||
config = { | |||
"key": "your openai key", | |||
'proxy': 'you proxy or None', #like "http:127.0.0.1:7890" | |||
'ip': '127.0.0.1', # "127.0.0.1" or your server's internal network ip or your server's public ip | |||
'port': 5000, | |||
} | |||
``` | |||
### Run the project. Note that the command line needs to run under the root directory of the project. | |||
```shell | |||
python chatGPT_Web.py | |||
``` | |||
### Deploy using gunicorn. Note: gunicorn is not included in requirements.txt and you need to install the corresponding dependencies yourself. | |||
```shell | |||
gunicorn chatGPT_Web:app -c gunicorn_config.py | |||
``` | |||
#### Open the browser and enter the displayed IP and port, such as: "127.0.0.1:5000", and you can see the conversation webpage. | |||
 | |||
--- | |||
<br> | |||
<br> | |||
<br> | |||
# chatGPT_Web 私有化部署 | |||
### 使用gpt-3.5-turbo 模型的api,支持markdown和连续对话,使用flask实现SSE服务推送流式文本,实现与官网类似的对话效果。 | |||
> 项目基于其他两个项目开源项目的实现,在此感谢两个项目的作者 | |||
> 修改[acheong08](https://github.com/acheong08/ChatGPT)的V3.py对接官方api的接口 | |||
> 参考[slippersheepig](https://github.com/slippersheepig/chatgpt-web)的网页端代码 | |||
# 部署方法 | |||
## 安装依赖 | |||
### 下载本项目 | |||
```shell | |||
git clone "https://github.com/promisevergo/chatGPT_Web.git" | |||
cd chatGPT_Web | |||
``` | |||
### 使用pip 读取requirement.txt, 建议python3.10及以上的版本 | |||
```shell | |||
pip install -r requirements.txt | |||
``` | |||
### 配置需要的参数,如果是本地部署,则使用默认的ip即可,如果部署在服务器上时,需要填入服务内网ip,如果没有,则填公网ip看看 | |||
```python | |||
config = { | |||
"key": "your openai key", | |||
'proxy': 'you proxy or None', #like "http:127.0.0.1:7890" | |||
'ip': '127.0.0.1', # "127.0.0.1" or your server's internal network ip or your server's public ip | |||
'port': 5000, | |||
} | |||
``` | |||
### 运行项目, 注意,命令端要运行在项目的根目录下 | |||
#### 直接python部署 | |||
```shell | |||
python chatGPT_Web.py | |||
``` | |||
#### 使用gunicorn部署,注意:gunicorn不在requirements.txt中,需要自行安装对应的依赖 | |||
```shell | |||
gunicorn chatGPT_Web:app -c gunicorn_config.py | |||
``` | |||
#### 打开浏览器,输入显示的ip及端口,比如:“127.0.0.1:5000",就可以看到对话的网页 | |||
 |
@@ -0,0 +1,177 @@ | |||
import _thread as thread | |||
import base64 | |||
import datetime | |||
import hashlib | |||
import hmac | |||
import json | |||
from urllib.parse import urlparse | |||
import ssl | |||
from datetime import datetime | |||
from time import mktime | |||
from urllib.parse import urlencode | |||
from wsgiref.handlers import format_date_time | |||
import websocket | |||
import threading | |||
from threading import Condition | |||
class Ws_Param(object): | |||
# 初始化 | |||
def __init__(self, APPID, APIKey, APISecret, gpt_url, condition): | |||
self.APPID = APPID | |||
self.APIKey = APIKey | |||
self.APISecret = APISecret | |||
self.host = urlparse(gpt_url).netloc | |||
self.path = urlparse(gpt_url).path | |||
self.gpt_url = gpt_url | |||
self.resp = '' | |||
self.condition = condition | |||
# 生成url | |||
def create_url(self): | |||
# 生成RFC1123格式的时间戳 | |||
now = datetime.now() | |||
date = format_date_time(mktime(now.timetuple())) | |||
# 拼接字符串 | |||
signature_origin = "host: " + self.host + "\n" | |||
signature_origin += "date: " + date + "\n" | |||
signature_origin += "GET " + self.path + " HTTP/1.1" | |||
# 进行hmac-sha256进行加密 | |||
signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'), | |||
digestmod=hashlib.sha256).digest() | |||
signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8') | |||
authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"' | |||
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8') | |||
# 将请求的鉴权参数组合为字典 | |||
v = { | |||
"authorization": authorization, | |||
"date": date, | |||
"host": self.host | |||
} | |||
# 拼接鉴权参数,生成url | |||
url = self.gpt_url + '?' + urlencode(v) | |||
# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致 | |||
return url | |||
# 收到websocket消息的处理 | |||
def on_message(self, ws, message): | |||
# print(message) | |||
data = json.loads(message) | |||
code = data['header']['code'] | |||
if code != 0: | |||
print(f'请求错误: {code}, {data}') | |||
ws.close() | |||
else: | |||
choices = data["payload"]["choices"] | |||
status = choices["status"] | |||
content = choices["text"][0]["content"] | |||
print(content, end='') | |||
self.resp += content | |||
if status == 2: | |||
ws.close() | |||
def on_close(self, ws, *args): | |||
print("### closed ###") | |||
# self.condition.notify() | |||
# 收到websocket错误的处理 | |||
def on_error(ws, error): | |||
print("### error:", error) | |||
# 收到websocket关闭的处理 | |||
def on_close(ws, *args): | |||
print("### closed ###") | |||
# 收到websocket连接建立的处理 | |||
def on_open(ws): | |||
thread.start_new_thread(run, (ws,)) | |||
def run(ws, *args): | |||
data = json.dumps(gen_params(appid=ws.appid, question=ws.question)) | |||
ws.send(data) | |||
# 收到websocket消息的处理 | |||
def on_message(ws, message): | |||
# print(message) | |||
data = json.loads(message) | |||
code = data['header']['code'] | |||
if code != 0: | |||
print(f'请求错误: {code}, {data}') | |||
ws.close() | |||
else: | |||
choices = data["payload"]["choices"] | |||
status = choices["status"] | |||
content = choices["text"][0]["content"] | |||
print(content, end='') | |||
if status == 2: | |||
ws.close() | |||
def gen_params(appid, question): | |||
""" | |||
通过appid和用户的提问来生成请参数 | |||
""" | |||
data = { | |||
"header": { | |||
"app_id": appid, | |||
"uid": "1234" | |||
}, | |||
"parameter": { | |||
"chat": { | |||
"domain": "general", | |||
"temperature": 0.01, | |||
"max_tokens": 2048, | |||
"auditing": "default" | |||
} | |||
}, | |||
"payload": { | |||
"message": { | |||
"text": [ | |||
# {"role": "user", "content": question}, | |||
{"role": "user", "content": question} | |||
] | |||
} | |||
} | |||
} | |||
return data | |||
def main(appid, api_key, api_secret, gpt_url, question): | |||
condition = threading.Condition() | |||
condition.acquire() | |||
wsParam = Ws_Param(appid, api_key, api_secret, gpt_url, condition) | |||
websocket.enableTrace(False) | |||
wsUrl = wsParam.create_url() | |||
print(wsUrl) | |||
ws = websocket.WebSocketApp(wsUrl, on_message=wsParam.on_message, on_error=on_error, on_close=wsParam.on_close, on_open=on_open) | |||
ws.appid = appid | |||
ws.question = question | |||
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE}) | |||
# condition.wait() | |||
print("回答:" + wsParam.resp) | |||
return wsParam.resp | |||
if __name__ == "__main__": | |||
# 测试时候在此处正确填写相关信息即可运行 | |||
main(appid="3d9282da", | |||
api_secret="ZTRiNDQwMTRlOTlmZDQwMDUwYTdjMDM0", | |||
api_key="7c217b3a313f4b66fcc14a8e97f85103", | |||
gpt_url="ws://spark-api.xf-yun.com/v1.1/chat", | |||
# question='你是谁') | |||
# question='将给定语段转换为含义最相似的意图 。意图是如下列表中的一项。如果没有对应意图或者语段缺失则返回0.列表为{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、在不在。}。输出为JSON格式,键为number。不要输出任何说明和解释。语段为“[用户]:' \ | |||
question='假设你是公司前台,你在与面前的人对话,语段代表对方的问话,首先生成一个应对,然后从列表中选出一个选项作为回答的内容,如果没有对应意图或者语段缺失则返回0。列表为{1、喜欢的状态。2、公司高管名单。3、打印机使用指南。4、员工的福利待遇。5、公司的价值观。6、工作时间。7、公司的愿景。8、公司的使命。9、公司产品。10、员工守则。11、洗手间位置。12、开门。13、关门。14、取消静音。15、调小音量。16、调大音量。17、把声音关掉。18、自我介绍。19、对方介绍。20、预约访客。21、预约会议。22、王总的位置。23、介绍一下你们公司。24、怎么联系财务。}。输出为JSON格式,键只有number,代表应对的编号。不要输出任何说明和解释。语段为:产品介绍') |
@@ -0,0 +1,437 @@ | |||
import os | |||
import platform | |||
import json | |||
import threading | |||
from time import sleep | |||
import openai | |||
import websocket | |||
import ssl | |||
from SparkApi import Ws_Param, on_message, on_error, on_open, on_close, main | |||
from recvChatGPT_V3 import Chatbot_V3 | |||
from flask import Flask, request, render_template, Response, abort | |||
from flask_cors import CORS, cross_origin | |||
import redis | |||
from rpc_test import Zhouzhou | |||
app = Flask(__name__) | |||
# openai.api_key = os.getenv("OPENAI_API_KEY") | |||
openai.api_key = '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' | |||
skills = {} | |||
class ChatCompletionCustom: | |||
def __init__(self): | |||
self.role = {"role": "system", "content": "you are a useful assistant."} | |||
self.history = [] | |||
self.skill_list = {} | |||
self.embedding_strings = ['华大基因公司主营业务为通过基因检测、质谱检测、生物信息分析等多组学大数据技术手段,', | |||
'华大基因公司为科研机构、企事业单位、医疗机构、社会卫生组织等提供研究服务和精准医学检测综合解决方案。', | |||
'华大基因以推动生命科学研究进展、生命大数据应用和提高全球医疗健康水平为出发点,', | |||
'基于基因领域研究成果及精准检测技术在民生健康方面的应用,', | |||
'致力于加速科技创新,减少出生缺陷,加强肿瘤防控,抑制重大疾病对人类的危害,实现精准治愈感染,全面助力精准医学。', | |||
'以华大基因举例:作为中国基因行业的奠基者,秉承“基因科技造福人类”的愿景,通过20多年的人才积聚、科研积累和产业积淀,', | |||
'华大基因公司已建成覆盖全球百余个国家和全国所有省市自治区的营销服务网络,成为屈指可数的覆盖本行业全产业链、全应用领域的科技公司,立足技术先进、配置齐全和规模领先的多组学产出平台,已成为全球屈指可数的科学技术服务提供商和精准医疗服务运营商。', | |||
'2017年,华大基因于深圳证券交易所创业板上市', | |||
'在2016年的自然指数排名(Nature Index Annual Tables)中,华大名列亚太地区生命科学产业机构(life science - corporate)第一位,并连续七年蝉联该排名第一', | |||
'人类基因组计划:1999年9月1日,于英国茵格斯顿举行的第五次人类基因组测序战略会议上,华大基因创始人之一杨焕明提出,中国愿承担人类3号染色体短臂端粒一侧约30厘摩尔(相当于约3,000万个碱基对)区域的测序和分析任务,占整体人类基因组测序工作的1%,成为人类基因组计划成员当中唯一一个发展中国家', | |||
'水稻基因组计划:水稻(籼稻)基因组工作框架图:华大基因于2000年启动水稻基因组计划,希望通过测序找出水稻产量相关基因,并于2002年在《科学》期刊以封面文章发布首个水稻(籼稻))因组的工作框架序列图,文章先后被引用接近四千次。此次由中国科学家合作完成的水稻基因工作框架图,是继人类基因组之后完成测定的最大的基因组,也是当时测定的最大植物基因组。 水稻作为第一个完成基因组测序农作物,对解决全球粮食问题具有重要意义,建立了改善水稻品质、提高水稻产量的重要基础,并被当时《科学》杂志期刊编辑认为水稻基因组研究工作,对人类健康的重要性在接下来的二十年较人类基因组更大', | |||
'国际大熊猫基因组计划:从北京奥运会的吉祥物大熊猫“晶晶”抽取样本,利用短序列(short-reads)模式组装全球首个熊科动物、也是第二个肉食类动物的基因图谱,包含2.25千兆(Gb)个碱基对,并于2010年1月在《自然》科学期刊以封面文章发布。研究进一步支持大多数科学家所持的“大熊猫属于熊科动物”的观点,并为日后使用次世代基因测序技术,快速省时地组装大型真核生物(eukaryotic),如哺乳类动基因图谱奠定了基础。研究指出,相比于自然环境,人类活动对其造成的影响更为严重'] | |||
# self.df = get_embed_array(self.embedding_strings) | |||
chat = ChatCompletionCustom() | |||
zhouzhou = Zhouzhou() | |||
# config set | |||
config = { | |||
"key": "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", | |||
'proxy': None, | |||
'ip': '127.0.0.1', # "127.0.0.1" or your server's internal network ip or your server's public ip | |||
'port': 5001, | |||
} | |||
URL_API = "https://api.openai.com/v1/chat/completions" | |||
headers = { | |||
"Content-Type": "application/json", | |||
"Authorization": f"Bearer {config['key']}" | |||
} | |||
# init chat bot | |||
chatbot = Chatbot_V3(config['key'], "gpt-3.5-turbo", proxy=config['proxy']) | |||
# 给定一个Dictory,循环获取key,value,并将其组合成"1、{key}2、{key}3、{key}的格式" | |||
def format_skill_list(list={}, msg=''): | |||
prifix = '假设你是北京联通公司的客服,我会给你提出一个问题{q},你在我给定的以下列表{list}中出找一个与该问题{q}接近的问题,如果没有符合的答案,回复”””Null”””。列表{list}问题如下:' | |||
suffix = ',不要做多余回答,回复的内容只能是列表{list}中的内容或"""Null""",我接下来问的问题是:' | |||
result = prifix + '"""' | |||
for i, (key, value) in enumerate(list.items()): | |||
result += f"{i + 1}、{key}" | |||
result += '"""' + suffix + msg | |||
print(result) | |||
return result | |||
def format_skill_list_movie(list={}, msg=''): | |||
prifix = 'answer only in a mark down cell, find the closest sentence . The format is' + \ | |||
'"""' + \ | |||
'[{"msg": <sentence>}]' + \ | |||
'"""' + \ | |||
'Returns Null if there is no matching sentence.The format is' + \ | |||
'"""' + \ | |||
'[{"msg":"Null"}]' + \ | |||
'"""' + \ | |||
'我提供的句子如下:' | |||
suffix = '不附加说明和解释的文字。' + \ | |||
'my paragraph is:' | |||
result = prifix + '[' | |||
for i, (key, value) in enumerate(list.items()): | |||
result += "{" + f"{i + 1}、{key}" + "}," | |||
result = result[0: -1] + ']' + suffix + '"""' + msg + '"""' | |||
print(result) | |||
return result | |||
def format_skill_list_zhenhuan(list={}, msg='',q_arrs=[]): | |||
prifix = '假设你是公司前台,你在与面前的人对话,语段代表对方的问话,首先生成一个应对,然后从列表中选出一个选项作为回答的内容,如果没有对应意图或者语段缺失则返回0。列表为' | |||
# suffix = '。输出为JSON格式,键为number,代表应对的编号。示例输出为:{"number":_}。不要输出任何说明和解释。语段为:' | |||
suffix = '。输出为JSON格式,键为number,代表应对的编号。不要输出任何说明和解释。语段为:' | |||
result = prifix + '{' | |||
for i, (key, value) in enumerate(list.items()): | |||
q_arrs.append(key) | |||
result += f"{i + 1}、{key}" | |||
result += '}' + suffix + msg + '"' | |||
# result = prifix + msg + suffix | |||
print(result) | |||
return result,q_arrs | |||
# Routing, rendering chat interface | |||
@app.route('/') | |||
def index(): | |||
chatbot.reset() | |||
return render_template('chat.html') | |||
# Routing, normal chat,not SSE | |||
@app.route('/chat', methods=['POST']) | |||
def chat(): | |||
postData = request.get_json() # Get data from POST request | |||
print(postData) | |||
query = postData.get('query', 'Hello') | |||
max_token = postData.get('max_token', '3000') # nouse | |||
temperature = postData.get('temperature', 0.5) | |||
top_p = postData.get('top_p', 1.0) | |||
role = postData.get('role', 'user') | |||
convo_id = postData.get('convo_id', 'default') | |||
n = postData.get('n', 1) | |||
try: | |||
response = chatbot.ask(prompt=query, role=role, convo_id=convo_id, top_p=top_p, temperature=temperature, n=n) | |||
print(response) | |||
return response | |||
except Exception as e: | |||
return e | |||
# Routing, SSE chat | |||
@app.route('/chatstream', methods=['GET', 'POST']) | |||
def chat_stream(): | |||
query = request.args.get('query', 'Hello') | |||
max_token = float(request.args.get('max_token', '3000')) # nNouse | |||
temperature = float(request.args.get('temperature', '0.5')) | |||
top_p = float(request.args.get('top_p', '1.0')) | |||
role = request.args.get('role', 'user') | |||
convo_id = request.args.get('convo_id', 'default') | |||
n = int(request.args.get('n', '1')) | |||
# 将问题格式化 | |||
query = format_skill_list(chatbot.skills, query) | |||
return Response( | |||
chatbot.ask_stream_text(prompt=query, role=role, convo_id=convo_id, top_p=top_p, temperature=temperature, n=n), | |||
mimetype='text/event-stream') | |||
def chat_completion_for_multi_turn(msg): | |||
role = {"role": "system", "content": "你是一个幽默段子手."} | |||
print("当前角色: {}".format(chat.role['content'])) | |||
input_message = [ | |||
chat.role | |||
] | |||
for i in range(len(msg)): | |||
# 对i除以2取余数,如果是0,输入input_message.append({"role": "user", "content": msg[i]}),否则输入input_message.append({"role": "assistant", "content": msg[i]}) | |||
if i % 2 == 0: | |||
input_message.append({"role": "user", "content": msg[i]}) | |||
else: | |||
input_message.append({"role": "assistant", "content": msg[i]}) | |||
print("调用gpt的prompts:") | |||
print(input_message) | |||
completion = openai.ChatCompletion.create( | |||
model="gpt-3.5-turbo", | |||
# model="gpt-4",/ | |||
messages=input_message, | |||
temperature=0.8, | |||
frequency_penalty=0, | |||
max_tokens=1024, | |||
presence_penalty=0, | |||
top_p=1 | |||
) | |||
print(completion.choices[0].message['content']) | |||
temp_completion = {'question': {"role": "user", "content": msg}, | |||
'answer': {"role": "assistant", "content": completion.choices[0].message['content']}} | |||
return completion.choices[0].message['content'] | |||
@app.route(rule='/chat_data', methods=['post']) | |||
@cross_origin() | |||
def chat_data(): | |||
chat.role = {"role": "system", | |||
"content": '根据以下文章提出可能问到的10个问题,并给出对应的答案,回答的形式为"{序号}、{问题}|{答案}",不要回复其他内容。'} | |||
# chat.role = {"role": "system", "content": '我会给出一部电影的资料,将资料拆解成10个问题,要求每个问题的开头都是电影名,并给出对应的答案。回答的形式为"{序号}、{电影名}{问题}|{答案}",不要回复其他内容。'} | |||
try: | |||
req = request | |||
msg = [] | |||
m = request.json.get('corpus') | |||
# 如果m不为空,就加入到msg中 | |||
if m is not None: | |||
msg.append(m) | |||
data = {'msg': chat_completion_for_multi_turn(msg)} | |||
print("success") | |||
test = {} | |||
# 获得的结果字符串为"问题1|答案1\n问题2|答案2\n问题3|答案3\n问题4|答案4\n...",循环将其分割为问题和答案,将问题作为key,答案作为value,存储在chat.skill_list中 | |||
for i in data['msg'].split('\n'): | |||
print() | |||
# chat.skill_list[i.split('|')[0].index('、')] = i.split('|')[1] | |||
q = i.split('|')[0] | |||
a = i.split('|')[1] | |||
chatbot.skills[q[q.index('、') + 1:]] = a | |||
# 将chat.skill_list中的key和value用print()函数打印出来 | |||
for i, (key, value) in enumerate(chatbot.skills.items()): | |||
print(f"{i + 1}、{key}:{value}") | |||
# 获取当前路径并打印出来 | |||
print(os.getcwd()) | |||
# 将chatbot.skills中的key和value保存到skills.csv中,以便后续使用 | |||
with open('/Users/ruoxiyin/Documents/缔智元/代码/chatGPT_Web-main/skills.csv', 'a', encoding='utf-8') as f: | |||
for key, value in chatbot.skills.items(): | |||
f.write(f"{key}|{value}\n") | |||
return data | |||
except Exception as e: | |||
print("An exception occurred:", str(e)) | |||
return {'msg': '真抱歉,我连接Chatgpt的好像出现问题了呀'} | |||
@app.route(rule='/get_skill_list', methods=['get']) | |||
@cross_origin() | |||
def get_skill_list(): | |||
print("get_skill_list") | |||
# 将chat.skill_list中的key和value用print()函数打印出来 | |||
for i, (key, value) in enumerate(chatbot.skills.items()): | |||
print(f"{i + 1}、{key}:{value}") | |||
# 将chatbot.skills序列化成json格式后作为返回值返回 | |||
return json.dumps(chatbot.skills, ensure_ascii=False) | |||
@app.route(rule='/question_answer', methods=['post']) | |||
@cross_origin() | |||
def question_answer(): | |||
# 连接redis数据库,地址为39.107.77.235,端口为6379 | |||
r = redis.Redis(host='39.107.77.235', port=6381) | |||
# 获取redis数据库中的key为"session"的值,如果存在,返回0,否则新增一个key为"session"的值,值为1 | |||
session = r.get("chatgpt:session") | |||
if session is None: | |||
r.set("session", 1) | |||
else: | |||
# 断开redis数据库的连接 | |||
r.close() | |||
abort(500) | |||
chat.role = {"role": "system", "content": '你是一个有用的助理'} | |||
try: | |||
req = request | |||
msg = [] | |||
m = request.json.get('corpus') | |||
# 如果m不为空,就加入到msg中 | |||
if m is not None: | |||
# m = format_skill_list(chatbot.skills, m) | |||
m = format_skill_list_movie(chatbot.skills, m) | |||
msg.append(m) | |||
resp = chat_completion_for_multi_turn(msg) | |||
print(resp) | |||
if resp == 'Null': | |||
data = {'msg': "对不起,这个问题我不太清楚呀"} | |||
# resp = resp[resp.index('、') + 1:] | |||
else: | |||
# 判断chatbot.skills字典是否有resp的key | |||
if resp in chatbot.skills.keys(): | |||
data = {'msg': chatbot.skills[resp]} | |||
else: | |||
data = "对不起,这个问题我不太清楚呀" | |||
# 循环遍历chatbot.skills,resp如果包含key,则将对应value赋值给data | |||
for key, value in chatbot.skills.items(): | |||
if key in resp: | |||
data = {'msg': value} | |||
break | |||
# 清空redis数据库中的key为"session"的值,并断开连接 | |||
r.delete("chatgpt:session") | |||
r.close() | |||
# zhouzhou发送text消息 | |||
# zhouzhou.say_text(data['msg']) | |||
return data | |||
except Exception as e: | |||
print("An exception occurred:", str(e)) | |||
return {'msg': '真抱歉,我连接Chatgpt的好像出现问题了呀'} | |||
def do_stream_response(resp_words): | |||
for i in range(0, len(resp_words)): | |||
sleep(0.1) | |||
yield 'data: {}\n\n'.format(json.dumps({'content': resp_words[i]})) | |||
@app.route('/chatstream_qa', methods=['GET', 'POST']) | |||
@cross_origin() | |||
def chat_stream_qa(): | |||
chat.role = {"role": "system", "content": '你是一个有用的助理'} | |||
query = request.args.get('query', 'Hello') | |||
# 将问题格式化 | |||
msg = [] | |||
q_arrs = [] | |||
query, q_arrs = format_skill_list_zhenhuan(chatbot.skills, query,q_arrs) | |||
msg.append(query) | |||
resp = chat_completion_for_multi_turn(msg) | |||
# resp = 'Null' | |||
data = '' | |||
# 将resp用json格式化,获取当中的number字段 | |||
resp = json.loads(resp) | |||
resp = resp['number'] | |||
if resp == 0: | |||
data = "对不起,这个问题我不太清楚呀" | |||
else: | |||
# 根据resp的数字获取q_arrs中对应元素,并将该元素判断chatbot.skills字典是否有对应的key | |||
resp = q_arrs[resp - 1] | |||
if resp in chatbot.skills.keys(): | |||
data = '匹配到问题:' + resp + ',回答:' + chatbot.skills[resp] | |||
else: | |||
print('data:' + data) | |||
if data is None or data == '': | |||
data = "对不起,这个问题我不太清楚呀" | |||
# 循环遍历chatbot.skills,resp如果包含key,则将对应value赋值给data | |||
for key, value in chatbot.skills.items(): | |||
if key in resp: | |||
data = value | |||
break | |||
# zhouzhou发送text消息 | |||
# zhouzhou.say_text(data) | |||
return Response(do_stream_response(data), mimetype='text/event-stream') | |||
# return Response('data: {}\n\n'.format(json.dumps({'content':data}))) | |||
@app.route('/chat_qa', methods=['GET', 'POST']) | |||
@cross_origin() | |||
def chat_qa(): | |||
chat.role = {"role": "system", "content": '你是一个有用的助理'} | |||
print(request.args) | |||
query = request.args.get('query', 'Hello') | |||
# 将问题格式化 | |||
msg = [] | |||
q_arrs = [] | |||
query, q_arrs = format_skill_list_zhenhuan(chatbot.skills, query,q_arrs) | |||
msg.append(query) | |||
resp = chat_completion_for_multi_turn(msg) | |||
# resp = 'Null' | |||
data = '' | |||
# 将resp用json格式化,获取当中的number字段 | |||
resp = json.loads(resp) | |||
resp = resp['number'] | |||
if resp == 0: | |||
data = "对不起,这个问题我不太清楚呀" | |||
else: | |||
# 根据resp的数字获取q_arrs中对应元素,并将该元素判断chatbot.skills字典是否有对应的key | |||
resp = q_arrs[resp - 1] | |||
if resp in chatbot.skills.keys(): | |||
data = chatbot.skills[resp] | |||
else: | |||
print('data:' + data) | |||
if data is None or data == '': | |||
data = "对不起,这个问题我不太清楚呀" | |||
# 循环遍历chatbot.skills,resp如果包含key,则将对应value赋值给data | |||
for key, value in chatbot.skills.items(): | |||
if key in resp: | |||
data = value | |||
break | |||
# zhouzhou发送text消息 | |||
# zhouzhou.say_text(data) | |||
# 将data格式化成json格式,存入msg字段中 | |||
data = {'msg': data} | |||
return data | |||
@app.route('/chatstream_fire', methods=['GET', 'POST']) | |||
@cross_origin() | |||
def chat_stream_fire(): | |||
chat.role = {"role": "system", "content": '你是一个有用的助理'} | |||
query = request.args.get('query', 'Hello') | |||
# 将问题格式化 | |||
msg = [] | |||
q_arrs = [] | |||
query, q_arrs = format_skill_list_zhenhuan(chatbot.skills, query,q_arrs) | |||
msg.append(query) | |||
# 获取一个condition,并将condition存入Ws_Param中 | |||
condition = threading.Condition() | |||
# condition.acquire() | |||
print(query) | |||
resp = main(appid="3d9282da", | |||
api_secret="ZTRiNDQwMTRlOTlmZDQwMDUwYTdjMDM0", | |||
api_key="7c217b3a313f4b66fcc14a8e97f85103", | |||
gpt_url="ws://spark-api.xf-yun.com/v1.1/chat", | |||
# question='你是谁') | |||
# question='将给定语段转换为含义最相似的意图 。意图是如下列表中的一项。如果没有对应意图或者语段缺失则返回0.列表为{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、在不在。}。输出为JSON格式,键为number。不要输出任何说明和解释。语段为“[用户]:' | |||
question=query) | |||
# condition.wait() | |||
# condition.release() | |||
# resp = chat_completion_for_multi_turn(msg) | |||
# resp = 'Null' | |||
data = '' | |||
# 将resp用json格式化,获取当中的number字段 | |||
resp = json.loads(resp) | |||
resp = resp['number'] | |||
if resp == 'Null': | |||
data = "对不起,这个问题我不太清楚呀" | |||
else: | |||
# 根据resp的数字获取q_arrs中对应元素,并将该元素判断chatbot.skills字典是否有对应的key | |||
resp = q_arrs[resp - 1] | |||
if resp in chatbot.skills.keys(): | |||
data = chatbot.skills[resp] | |||
else: | |||
print('data:' + data) | |||
if data is None or data == '': | |||
data = "对不起,这个问题我不太清楚呀" | |||
# 循环遍历chatbot.skills,resp如果包含key,则将对应value赋值给data | |||
for key, value in chatbot.skills.items(): | |||
if key in resp: | |||
data = value | |||
break | |||
# return Response(do_stream_response(data), mimetype='text/event-stream') | |||
# return Response('data: {}\n\n'.format(json.dumps({'content':data}))) | |||
data = {'msg': data} | |||
return data | |||
if __name__ == '__main__': | |||
app.run(debug=True, host=config['ip'], port=config['port']) |
@@ -0,0 +1,31 @@ | |||
from chatGPT_Web import format_skill_list_movie | |||
def test_happy_path_list_not_empty(): | |||
list = {"key1": "value1", "key2": "value2"} | |||
msg = "This is a message" | |||
expected_result = 'answer only in a mark down cell, find the closest sentence . The format is\n' + \ | |||
'"""\n' + \ | |||
'[{"msg": <sentence>}]\n' + \ | |||
'"""\n' + \ | |||
'Returns Null if there is no matching sentence.The format is\n' + \ | |||
'"""\n' + \ | |||
'[{"msg":"Null"}]\n' + \ | |||
'"""\n' + \ | |||
'我提供的句子如下:\n' + \ | |||
'[{1、key1},{2、key2},]' + \ | |||
'不附加说明和解释的文字。\n' + \ | |||
'my paragraph is:\n"""This is a message"""' | |||
print(expected_result) | |||
print("=====================================") | |||
format_skill_list_movie(list, msg) | |||
print("=====================================") | |||
assert format_skill_list_movie(list, msg) == expected_result | |||
if __name__ == '__main__': | |||
test_happy_path_list_not_empty() |
@@ -0,0 +1,11 @@ | |||
@@ -0,0 +1,8 @@ | |||
#Deployment commands: gunicorn chatGPT_Web:app -c gunicorn_config.py | |||
bind = '0.0.0.0:5001' # your IP:PORT | |||
worker_class = 'gevent' | |||
worker_connections = 1000 | |||
workers = 1 # Number of worker processes | |||
timeout = 60 | |||
loglevel = 'debug' |
@@ -0,0 +1,208 @@ | |||
[2023-07-07 16:51:23 +0800] [71719] [DEBUG] Current configuration: | |||
config: gunicorn_config.py | |||
wsgi_app: None | |||
bind: ['0.0.0.0:5001'] | |||
backlog: 2048 | |||
workers: 1 | |||
worker_class: gevent | |||
threads: 1 | |||
worker_connections: 1000 | |||
max_requests: 0 | |||
max_requests_jitter: 0 | |||
timeout: 60 | |||
graceful_timeout: 30 | |||
keepalive: 2 | |||
limit_request_line: 4094 | |||
limit_request_fields: 100 | |||
limit_request_field_size: 8190 | |||
reload: False | |||
reload_engine: auto | |||
reload_extra_files: [] | |||
spew: False | |||
check_config: False | |||
print_config: False | |||
preload_app: False | |||
sendfile: None | |||
reuse_port: False | |||
chdir: /Users/ruoxiyin/Documents/缔智元/代码/chatGPT_Web-main | |||
daemon: False | |||
raw_env: [] | |||
pidfile: None | |||
worker_tmp_dir: None | |||
user: 501 | |||
group: 20 | |||
umask: 0 | |||
initgroups: False | |||
tmp_upload_dir: None | |||
secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'} | |||
forwarded_allow_ips: ['127.0.0.1'] | |||
accesslog: None | |||
disable_redirect_access_to_syslog: False | |||
access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" | |||
errorlog: - | |||
loglevel: debug | |||
capture_output: False | |||
logger_class: gunicorn.glogging.Logger | |||
logconfig: None | |||
logconfig_dict: {} | |||
syslog_addr: unix:///var/run/syslog | |||
syslog: False | |||
syslog_prefix: None | |||
syslog_facility: user | |||
enable_stdio_inheritance: False | |||
statsd_host: None | |||
dogstatsd_tags: | |||
statsd_prefix: | |||
proc_name: None | |||
default_proc_name: chatGPT_Web:app | |||
pythonpath: None | |||
paste: None | |||
on_starting: <function OnStarting.on_starting at 0x103db3670> | |||
on_reload: <function OnReload.on_reload at 0x103db3790> | |||
when_ready: <function WhenReady.when_ready at 0x103db38b0> | |||
pre_fork: <function Prefork.pre_fork at 0x103db39d0> | |||
post_fork: <function Postfork.post_fork at 0x103db3af0> | |||
post_worker_init: <function PostWorkerInit.post_worker_init at 0x103db3c10> | |||
worker_int: <function WorkerInt.worker_int at 0x103db3d30> | |||
worker_abort: <function WorkerAbort.worker_abort at 0x103db3e50> | |||
pre_exec: <function PreExec.pre_exec at 0x103db3f70> | |||
pre_request: <function PreRequest.pre_request at 0x103e730d0> | |||
post_request: <function PostRequest.post_request at 0x103e73160> | |||
child_exit: <function ChildExit.child_exit at 0x103e73280> | |||
worker_exit: <function WorkerExit.worker_exit at 0x103e733a0> | |||
nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x103e734c0> | |||
on_exit: <function OnExit.on_exit at 0x103e735e0> | |||
proxy_protocol: False | |||
proxy_allow_ips: ['127.0.0.1'] | |||
keyfile: None | |||
certfile: None | |||
ssl_version: 2 | |||
cert_reqs: 0 | |||
ca_certs: None | |||
suppress_ragged_eofs: True | |||
do_handshake_on_connect: False | |||
ciphers: None | |||
raw_paste_global_conf: [] | |||
strip_header_spaces: False | |||
[2023-07-07 16:51:23 +0800] [71719] [INFO] Starting gunicorn 20.1.0 | |||
[2023-07-07 16:51:23 +0800] [71719] [DEBUG] Arbiter booted | |||
[2023-07-07 16:51:23 +0800] [71719] [INFO] Listening at: http://0.0.0.0:5001 (71719) | |||
[2023-07-07 16:51:23 +0800] [71719] [INFO] Using worker: gevent | |||
[2023-07-07 16:51:23 +0800] [71721] [INFO] Booting worker with pid: 71721 | |||
[2023-07-07 16:51:23 +0800] [71719] [DEBUG] 1 workers | |||
[2023-07-07 16:51:56 +0800] [71721] [INFO] Parent changed, shutting down: <Worker 71721> | |||
[2023-07-07 16:51:56 +0800] [71721] [INFO] Worker exiting (pid: 71721) | |||
加载skills.csv文件 | |||
[2023-07-07 16:52:05 +0800] [71759] [DEBUG] Current configuration: | |||
config: gunicorn_config.py | |||
wsgi_app: None | |||
bind: ['0.0.0.0:5001'] | |||
backlog: 2048 | |||
workers: 1 | |||
worker_class: gevent | |||
threads: 1 | |||
worker_connections: 1000 | |||
max_requests: 0 | |||
max_requests_jitter: 0 | |||
timeout: 60 | |||
graceful_timeout: 30 | |||
keepalive: 2 | |||
limit_request_line: 4094 | |||
limit_request_fields: 100 | |||
limit_request_field_size: 8190 | |||
reload: False | |||
reload_engine: auto | |||
reload_extra_files: [] | |||
spew: False | |||
check_config: False | |||
print_config: False | |||
preload_app: False | |||
sendfile: None | |||
reuse_port: False | |||
chdir: /Users/ruoxiyin/Documents/缔智元/代码/chatGPT_Web-main | |||
daemon: False | |||
raw_env: [] | |||
pidfile: None | |||
worker_tmp_dir: None | |||
user: 501 | |||
group: 20 | |||
umask: 0 | |||
initgroups: False | |||
tmp_upload_dir: None | |||
secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'} | |||
forwarded_allow_ips: ['127.0.0.1'] | |||
accesslog: None | |||
disable_redirect_access_to_syslog: False | |||
access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" | |||
errorlog: - | |||
loglevel: debug | |||
capture_output: False | |||
logger_class: gunicorn.glogging.Logger | |||
logconfig: None | |||
logconfig_dict: {} | |||
syslog_addr: unix:///var/run/syslog | |||
syslog: False | |||
syslog_prefix: None | |||
syslog_facility: user | |||
enable_stdio_inheritance: False | |||
statsd_host: None | |||
dogstatsd_tags: | |||
statsd_prefix: | |||
proc_name: None | |||
default_proc_name: chatGPT_Web:app | |||
pythonpath: None | |||
paste: None | |||
on_starting: <function OnStarting.on_starting at 0x1054fa670> | |||
on_reload: <function OnReload.on_reload at 0x1054fa790> | |||
when_ready: <function WhenReady.when_ready at 0x1054fa8b0> | |||
pre_fork: <function Prefork.pre_fork at 0x1054fa9d0> | |||
post_fork: <function Postfork.post_fork at 0x1054faaf0> | |||
post_worker_init: <function PostWorkerInit.post_worker_init at 0x1054fac10> | |||
worker_int: <function WorkerInt.worker_int at 0x1054fad30> | |||
worker_abort: <function WorkerAbort.worker_abort at 0x1054fae50> | |||
pre_exec: <function PreExec.pre_exec at 0x1054faf70> | |||
pre_request: <function PreRequest.pre_request at 0x1055bb0d0> | |||
post_request: <function PostRequest.post_request at 0x1055bb160> | |||
child_exit: <function ChildExit.child_exit at 0x1055bb280> | |||
worker_exit: <function WorkerExit.worker_exit at 0x1055bb3a0> | |||
nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x1055bb4c0> | |||
on_exit: <function OnExit.on_exit at 0x1055bb5e0> | |||
proxy_protocol: False | |||
proxy_allow_ips: ['127.0.0.1'] | |||
keyfile: None | |||
certfile: None | |||
ssl_version: 2 | |||
cert_reqs: 0 | |||
ca_certs: None | |||
suppress_ragged_eofs: True | |||
do_handshake_on_connect: False | |||
ciphers: None | |||
raw_paste_global_conf: [] | |||
strip_header_spaces: False | |||
[2023-07-07 16:52:05 +0800] [71759] [INFO] Starting gunicorn 20.1.0 | |||
[2023-07-07 16:52:05 +0800] [71759] [DEBUG] Arbiter booted | |||
[2023-07-07 16:52:05 +0800] [71759] [INFO] Listening at: http://0.0.0.0:5001 (71759) | |||
[2023-07-07 16:52:05 +0800] [71759] [INFO] Using worker: gevent | |||
[2023-07-07 16:52:05 +0800] [71760] [INFO] Booting worker with pid: 71760 | |||
[2023-07-07 16:52:06 +0800] [71759] [DEBUG] 1 workers | |||
[2023-07-07 16:52:07 +0800] [71759] [INFO] Handling signal: int | |||
[2023-07-07 16:52:07 +0800] [71760] [INFO] Worker exiting (pid: 71760) | |||
加载skills.csv文件 | |||
Traceback (most recent call last): | |||
File "/Users/ruoxiyin/opt/anaconda3/envs/spider/lib/python3.9/site-packages/gevent/monkey.py", line 893, in _shutdown | |||
sleep() | |||
File "/Users/ruoxiyin/opt/anaconda3/envs/spider/lib/python3.9/site-packages/gevent/hub.py", line 159, in sleep | |||
waiter.get() | |||
File "src/gevent/_waiter.py", line 143, in gevent._gevent_c_waiter.Waiter.get | |||
File "src/gevent/_waiter.py", line 154, in gevent._gevent_c_waiter.Waiter.get | |||
File "src/gevent/_greenlet_primitives.py", line 61, in gevent._gevent_c_greenlet_primitives.SwitchOutGreenletWithLoop.switch | |||
File "src/gevent/_greenlet_primitives.py", line 61, in gevent._gevent_c_greenlet_primitives.SwitchOutGreenletWithLoop.switch | |||
File "src/gevent/_greenlet_primitives.py", line 65, in gevent._gevent_c_greenlet_primitives.SwitchOutGreenletWithLoop.switch | |||
File "src/gevent/_gevent_c_greenlet_primitives.pxd", line 35, in gevent._gevent_c_greenlet_primitives._greenlet_switch | |||
File "src/gevent/greenlet.py", line 908, in gevent._gevent_cgreenlet.Greenlet.run | |||
File "/Users/ruoxiyin/opt/anaconda3/envs/spider/lib/python3.9/site-packages/gunicorn/workers/base.py", line 198, in handle_quit | |||
sys.exit(0) | |||
SystemExit: 0 | |||
2023-07-07T08:52:07Z <greenlet.greenlet object at 0x105f9d180 (otid=0x105f768a0) current active started main> failed with SystemExit | |||
[2023-07-07 16:52:08 +0800] [71759] [INFO] Shutting down: Master |
@@ -0,0 +1,327 @@ | |||
""" | |||
A simple wrapper for the official ChatGPT API | |||
https://github.com/acheong08/ChatGPT.git v3.py | |||
""" | |||
import json | |||
import os | |||
import sys | |||
import platform | |||
from typing import NoReturn | |||
import requests | |||
import tiktoken #解析成token令牌 | |||
class Chatbot_V3: | |||
""" | |||
Official ChatGPT API | |||
""" | |||
def __init__( | |||
self, | |||
api_key: str, | |||
engine: str = os.environ.get("GPT_ENGINE") or "gpt-3.5-turbo", | |||
proxy: str = None, | |||
max_tokens: int = 3000, | |||
temperature: float = 0.5, | |||
top_p: float = 1.0, | |||
presence_penalty: float = 0.0, | |||
frequency_penalty: float = 0.0, | |||
reply_count: int = 1, | |||
system_prompt: str = "You are ChatGPT, a large language model trained by OpenAI. Respond conversationally", | |||
) -> None: | |||
""" | |||
Initialize Chatbot with API key (from https://platform.openai.com/account/api-keys) | |||
""" | |||
self.engine = engine | |||
self.session = requests.Session() | |||
self.api_key = api_key | |||
self.system_prompt = system_prompt | |||
self.max_tokens = max_tokens | |||
self.temperature = temperature | |||
self.top_p = top_p | |||
self.presence_penalty = presence_penalty | |||
self.frequency_penalty = frequency_penalty | |||
self.reply_count = reply_count | |||
if proxy: | |||
self.session.proxies = { | |||
"http": proxy, | |||
"https": proxy, | |||
} | |||
self.conversation: dict = { | |||
"default": [ | |||
{ | |||
"role": "system", | |||
"content": system_prompt, | |||
}, | |||
], | |||
} | |||
if max_tokens > 4000: | |||
raise Exception("Max tokens cannot be greater than 4000") | |||
if self.get_token_count("default") > self.max_tokens: | |||
raise Exception("System prompt is too long") | |||
self.skills = {} | |||
# 判断是否存在skills.csv文件,如果存在则读取key,value并加载进skills字典 | |||
print("加载skills.csv文件") | |||
if os.path.exists("/Users/ruoxiyin/Documents/缔智元/代码/chatGPT_Web-main/skills.csv"): | |||
with open("/Users/ruoxiyin/Documents/缔智元/代码/chatGPT_Web-main/skills.csv", "r", encoding="utf-8") as f: | |||
for line in f.readlines(): | |||
key, value = line.strip().split("|") | |||
self.skills[key] = value | |||
def add_to_conversation( | |||
self, | |||
message: str, | |||
role: str, | |||
convo_id: str = "default", | |||
) -> None: | |||
""" | |||
Add a message to the conversation | |||
""" | |||
self.conversation[convo_id].append({"role": role, "content": message}) | |||
def get_conversation( | |||
self, | |||
convo_id: str = "default", | |||
) -> list: | |||
""" | |||
Get the conversation | |||
""" | |||
return self.conversation[convo_id] | |||
def __truncate_conversation(self, convo_id: str = "default") -> None: | |||
""" | |||
Truncate the conversation | |||
""" | |||
while True: | |||
if ( | |||
self.get_token_count(convo_id) > self.max_tokens | |||
and len(self.conversation[convo_id]) > 1 | |||
): | |||
# Don't remove the first message | |||
self.conversation[convo_id].pop(1) | |||
else: | |||
break | |||
# https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb | |||
def get_token_count(self, convo_id: str = "default") -> int: | |||
""" | |||
Get token count | |||
""" | |||
if self.engine not in ["gpt-3.5-turbo", "gpt-3.5-turbo-0301"]: | |||
raise NotImplementedError("Unsupported engine {self.engine}") | |||
encoding = tiktoken.encoding_for_model(self.engine) | |||
num_tokens = 0 | |||
for message in self.conversation[convo_id]: | |||
# every message follows <im_start>{role/name}\n{content}<im_end>\n | |||
num_tokens += 4 | |||
for key, value in message.items(): | |||
num_tokens += len(encoding.encode(value)) | |||
if key == "name": # if there's a name, the role is omitted | |||
num_tokens += 1 # role is always required and always 1 token | |||
num_tokens += 2 # every reply is primed with <im_start>assistant | |||
return num_tokens | |||
def get_max_tokens(self, convo_id: str) -> int: | |||
""" | |||
Get max tokens | |||
""" | |||
return self.max_tokens - self.get_token_count(convo_id) | |||
def ask_stream( | |||
self, | |||
prompt: str, | |||
role: str = "user", | |||
convo_id: str = "default", | |||
**kwargs, | |||
) -> str: | |||
""" | |||
Ask a question | |||
""" | |||
# Make conversation if it doesn't exist | |||
if convo_id not in self.conversation: | |||
self.reset(convo_id=convo_id, system_prompt=self.system_prompt) | |||
self.add_to_conversation(prompt, "user", convo_id=convo_id) | |||
self.__truncate_conversation(convo_id=convo_id) | |||
print(convo_id) | |||
# Get response | |||
response = self.session.post( | |||
os.environ.get("API_URL") or "https://api.openai.com/v1/chat/completions", | |||
headers={"Authorization": f"Bearer {kwargs.get('api_key', self.api_key)}"}, | |||
json={ | |||
"model": self.engine, | |||
"messages": self.conversation[convo_id], | |||
"stream": True, | |||
# kwargs | |||
"temperature": kwargs.get("temperature", self.temperature), | |||
"top_p": kwargs.get("top_p", self.top_p), | |||
"presence_penalty": kwargs.get( | |||
"presence_penalty", | |||
self.presence_penalty, | |||
), | |||
"frequency_penalty": kwargs.get( | |||
"frequency_penalty", | |||
self.frequency_penalty, | |||
), | |||
"n": kwargs.get("n", self.reply_count), | |||
"user": role, | |||
"max_tokens": self.get_max_tokens(convo_id=convo_id), | |||
}, | |||
stream=True, | |||
) | |||
if response.status_code != 200: | |||
raise Exception( | |||
f"Error: {response.status_code} {response.reason} {response.text}", | |||
) | |||
response_role: str = None | |||
full_response: str = "" | |||
for line in response.iter_lines(): | |||
if not line: | |||
continue | |||
# Remove "data: " | |||
line = line.decode("utf-8")[6:] | |||
if line == "[DONE]": | |||
break | |||
resp: dict = json.loads(line) | |||
choices = resp.get("choices") | |||
if not choices: | |||
continue | |||
delta = choices[0].get("delta") | |||
if not delta: | |||
continue | |||
if "role" in delta: | |||
response_role = delta["role"] | |||
if "content" in delta: | |||
content = delta["content"] | |||
full_response += content | |||
yield content | |||
self.add_to_conversation(full_response, response_role, convo_id=convo_id) | |||
def ask_stream_text( | |||
self, | |||
prompt: str, | |||
role: str = "user", | |||
convo_id: str = "default", | |||
**kwargs, | |||
) -> str: | |||
""" | |||
Ask a question, push as Streaming text | |||
""" | |||
# Make conversation if it doesn't exist | |||
if convo_id not in self.conversation: | |||
self.reset(convo_id=convo_id, system_prompt=self.system_prompt) | |||
# 去除上下文接入 | |||
self.add_to_conversation(prompt, "user", convo_id=convo_id) | |||
self.__truncate_conversation(convo_id=convo_id) | |||
# Get response | |||
response = self.session.post( | |||
os.environ.get("API_URL") or "https://api.openai.com/v1/chat/completions", | |||
headers={"Authorization": f"Bearer {kwargs.get('api_key', self.api_key)}"}, | |||
json={ | |||
"model": self.engine, | |||
"messages": self.conversation[convo_id], | |||
"stream": True, | |||
# kwargs | |||
"temperature": kwargs.get("temperature", self.temperature), | |||
"top_p": kwargs.get("top_p", self.top_p), | |||
"presence_penalty": kwargs.get( | |||
"presence_penalty", | |||
self.presence_penalty, | |||
), | |||
"frequency_penalty": kwargs.get( | |||
"frequency_penalty", | |||
self.frequency_penalty, | |||
), | |||
"n": kwargs.get("n", self.reply_count), | |||
"user": role, | |||
"max_tokens": self.get_max_tokens(convo_id=convo_id), | |||
}, | |||
stream=True, | |||
) | |||
if response.status_code != 200: | |||
raise Exception( | |||
f"Error: {response.status_code} {response.reason} {response.text}", | |||
) | |||
response_role: str = None | |||
full_response: str = "" | |||
for line in response.iter_lines(): | |||
if not line: | |||
continue | |||
line = line.decode("utf-8")[6:] | |||
if line == "[DONE]": | |||
break; | |||
resp: dict = json.loads(line) | |||
choices = resp.get("choices") | |||
if not choices: | |||
continue | |||
delta = choices[0].get("delta") | |||
if not delta: | |||
continue | |||
if "role" in delta: | |||
response_role = delta["role"] | |||
if "content" in delta: | |||
content = delta['content'] | |||
full_response += content | |||
yield 'data: {}\n\n'.format(json.dumps({'content':content})) #Got the answer content to push | |||
yield 'data: {}\n\n'.format(json.dumps({'content':'[DONE]'})) #The answer is over, pushing [DONE] | |||
# 去除上下文接入 | |||
self.conversation[convo_id].clear() | |||
# self.add_to_conversation(full_response, response_role, convo_id=convo_id) #Add the answer to the conversation | |||
def ask( | |||
self, | |||
prompt: str, | |||
role: str = "user", | |||
convo_id: str = "default", | |||
**kwargs, | |||
) -> str: | |||
""" | |||
Non-streaming ask | |||
""" | |||
response = self.ask_stream( | |||
prompt=prompt, | |||
role=role, | |||
convo_id=convo_id, | |||
**kwargs, | |||
) | |||
full_response: str = "".join(response) | |||
return full_response | |||
def rollback(self, n: int = 1, convo_id: str = "default") -> None: | |||
""" | |||
Rollback the conversation | |||
""" | |||
for _ in range(n): | |||
self.conversation[convo_id].pop() | |||
def reset(self, convo_id: str = "default", system_prompt: str = None) -> None: | |||
""" | |||
Reset the conversation | |||
""" | |||
self.conversation[convo_id] = [ | |||
{"role": "system", "content": system_prompt or self.system_prompt}, | |||
] | |||
if __name__ == "__main__": | |||
#获取config.json中的数据 | |||
path = os.path.split(os.path.realpath(__file__))[0] | |||
with open(path + '/config.json', 'r') as f: | |||
config = json.load(f) | |||
if platform.system().lower() == 'linux': | |||
proxys = None | |||
else: | |||
proxys = config['proxy'] | |||
chat = Chatbot_V3(config['key'], "gpt-3.5-turbo", proxy=proxys) | |||
while True: | |||
promt = input("请输入:") | |||
if promt == 'exit': | |||
break; | |||
res = chat.ask(promt) | |||
print(res) |
@@ -0,0 +1,3 @@ | |||
Flask==2.0.3 | |||
requests==2.27.1 | |||
tiktoken==0.3.0 |
@@ -0,0 +1,26 @@ | |||
# -*- coding: utf-8 -*- | |||
import xmlrpc.client | |||
class Zhouzhou(object): | |||
def __init__(self): | |||
proxy = xmlrpc.client.ServerProxy("http://192.168.10.130:8999/RPC2") | |||
def say_text(self, text): | |||
proxy = xmlrpc.client.ServerProxy("http://192.168.10.130:8999/RPC2") | |||
result = proxy.say_text(text) | |||
print(text) | |||
return result | |||
if __name__ == '__main__': | |||
proxy = xmlrpc.client.ServerProxy("http://192.168.10.130:8999/RPC2") | |||
# text = '好的,我给您推荐《肖申克的救赎》这部电影,《肖申克的救赎》是一部关于信仰、希望与勇气的经典电影。它讲述了主人公安迪被错误定为谋杀罪犯,被送进监狱,接着在监狱中经历磨难、努力幸存、培养友情、逐渐获得自由和复仇的故事。影片通过细腻的描写人物的情感变化,以及精彩的情节推进手法,让观众体会到了在绝境中坚持信念所能带来的力量与启示。影片荣膺多个奖项,被誉为电影史上的经典之作。' | |||
# text = '当前中国电影行业的市场表现十分活跃,2023年全年票房突破250亿元,创下新的历史高点。国产影片在这个市场中占据着绝对的主导地位,国产电影总票房高达211.86亿,占据了全年票房总额的84.75%。其中《满江红》《流浪地球2》等国产电影在票房和口碑上表现出色,而外国电影的表现相对较弱。' | |||
# text = '从武侠电影和黄蓉的角度出发,我觉得我可以成为《射雕英雄传》中的李莫愁。尽管李莫愁是一个反派角色,但是其不断追求武学上的卓越表现出了女性在武侠世界中的强大实力和独立个性,让人们看到了女性与男性平等竞技的可能性,它为武侠电影中的女性形象设定树立起了一个新的标准。' | |||
# text = '好的,我给您推荐闪电侠,口碑非常好' | |||
# text = '导演是安德斯·穆斯切蒂' | |||
text = '他还导过小丑回魂,根据斯蒂芬·金的同名原著改编,非常精彩。' | |||
result = proxy.say_text(text) | |||
print(result) |
@@ -0,0 +1,24 @@ | |||
喜欢的状态。|九 九 六 哦 | |||
公司高管名单。|魏总 | |||
打印机使用指南。|{"skillCode":"15"} | |||
员工的福利待遇。|{"skillCode":"16"} | |||
公司的价值观。|{"skillCode":"17"} | |||
工作时间。|{"skillCode":"19"} | |||
公司的愿景。|{"skillCode":"18"} | |||
公司的使命。|{"skillCode":"20"} | |||
公司产品。|{"skillCode":"14"} | |||
员工守则。|{"skillCode":"21"} | |||
洗手间位置。|{"skillCode":"22"} | |||
开门。|{"action":"openDoor","animation":"showRightHandForward"} | |||
关门。|skillCode:关门 | |||
取消静音。|{"action":"mute","status":false} | |||
调小音量。|{"action":"volume","status":1} | |||
调大音量。|{"action":"volume","status":0} | |||
把声音关掉。|{"action":"mute","status":true} | |||
自我介绍。|{"action":"SelfIntroduction","skillCode":"12"} | |||
对方介绍。|{"action": "frontPerson"} | |||
预约访客。|{"action":"VisitorAppoint","skillCode":"2"} | |||
预约会议。|{"action":"Meeting","skillCode":"1"} | |||
王总的位置。|{"action":"VisitorRegister","skillCode":"3"} | |||
介绍一下你们公司。|{"action":"CompanyIntroduction","skillCode":"11"} | |||
怎么联系财务。|小迪,13910098255 |
@@ -0,0 +1,641 @@ | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
速度与激情10 Fast X电影类型是什么?|动作/悬疑/惊悚/犯罪/冒险 | |||
谁是Fast X的导演?|路易斯·莱特里尔 | |||
Fast X的编剧分别是谁?|丹·马泽/林诣彬/盖瑞·斯科特·汤普森 | |||
Fast X的主演有哪些人?|范·迪塞尔/米歇尔·罗德里格兹/杰森·莫玛/布丽·拉尔森/查理兹·塞隆/更多... | |||
Fast X的制片国家/地区是哪里?|美国 | |||
Fast X的上映时间是什么时候?|2023-05-17(中国大陆)/2023-05-19(美国) | |||
Fast X的片长是多少?|140分钟 | |||
Fast X的故事主要讲述什么?|唐老大和他的家族面对一名危险对手的故事 | |||
Fast X这部电影使用的主要语言是什么?|英语 | |||
Fast X的主题是什么?|速度、勇气和家族精神 | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
速度与激情10 Fast X电影类型是什么?|动作/悬疑/惊悚/犯罪/冒险 | |||
谁是Fast X的导演?|路易斯·莱特里尔 | |||
Fast X的编剧分别是谁?|丹·马泽/林诣彬/盖瑞·斯科特·汤普森 | |||
Fast X的主演有哪些人?|范·迪塞尔/米歇尔·罗德里格兹/杰森·莫玛/布丽·拉尔森/查理兹·塞隆/更多... | |||
Fast X的制片国家/地区是哪里?|美国 | |||
Fast X的上映时间是什么时候?|2023-05-17(中国大陆)/2023-05-19(美国) | |||
Fast X的片长是多少?|140分钟 | |||
Fast X的故事主要讲述什么?|唐老大和他的家族面对一名危险对手的故事 | |||
Fast X这部电影使用的主要语言是什么?|英语 | |||
Fast X的主题是什么?|速度、勇气和家族精神 | |||
速度与激情10(2023)是哪一年上映的电影?|2023年 | |||
速度与激情10(2023)的导演是谁?|路易斯·莱特里尔 | |||
速度与激情10(2023)的编剧有哪些人?|丹·马泽 / 林诣彬 / 盖瑞·斯科特·汤普森 | |||
速度与激情10(2023)的主演有哪些人?|范·迪塞尔 / 米歇尔·罗德里格兹 / 杰森·莫玛 / 布丽·拉尔森 / 查理兹·塞隆 / 更多... | |||
速度与激情10(2023)属于哪些类型的电影?|动作 / 悬疑 / 惊悚 / 犯罪 / 冒险 | |||
速度与激情10(2023)是哪个国家/地区的电影?|美国 | |||
速度与激情10(2023)的主要语言是什么?|英语 | |||
速度与激情10(2023)的上映日期是什么时候?|2023-05-17(中国大陆) / 2023-05-19(美国) | |||
速度与激情10(2023)的片长是多少?|140分钟 | |||
速度与激情10(2023)的剧情简介是什么?|唐老大和他的家族面对一名危险至极的对手,这个人决心破坏唐老大所热爱的一切及其至亲至爱之人。 | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
速度与激情10 Fast X电影类型是什么?|动作/悬疑/惊悚/犯罪/冒险 | |||
谁是Fast X的导演?|路易斯·莱特里尔 | |||
Fast X的编剧分别是谁?|丹·马泽/林诣彬/盖瑞·斯科特·汤普森 | |||
Fast X的主演有哪些人?|范·迪塞尔/米歇尔·罗德里格兹/杰森·莫玛/布丽·拉尔森/查理兹·塞隆/更多... | |||
Fast X的制片国家/地区是哪里?|美国 | |||
Fast X的上映时间是什么时候?|2023-05-17(中国大陆)/2023-05-19(美国) | |||
Fast X的片长是多少?|140分钟 | |||
Fast X的故事主要讲述什么?|唐老大和他的家族面对一名危险对手的故事 | |||
Fast X这部电影使用的主要语言是什么?|英语 | |||
Fast X的主题是什么?|速度、勇气和家族精神 | |||
速度与激情10(2023)是哪一年上映的电影?|2023年 | |||
速度与激情10(2023)的导演是谁?|路易斯·莱特里尔 | |||
速度与激情10(2023)的编剧有哪些人?|丹·马泽 / 林诣彬 / 盖瑞·斯科特·汤普森 | |||
速度与激情10(2023)的主演有哪些人?|范·迪塞尔 / 米歇尔·罗德里格兹 / 杰森·莫玛 / 布丽·拉尔森 / 查理兹·塞隆 / 更多... | |||
速度与激情10(2023)属于哪些类型的电影?|动作 / 悬疑 / 惊悚 / 犯罪 / 冒险 | |||
速度与激情10(2023)是哪个国家/地区的电影?|美国 | |||
速度与激情10(2023)的主要语言是什么?|英语 | |||
速度与激情10(2023)的上映日期是什么时候?|2023-05-17(中国大陆) / 2023-05-19(美国) | |||
速度与激情10(2023)的片长是多少?|140分钟 | |||
速度与激情10(2023)的剧情简介是什么?|唐老大和他的家族面对一名危险至极的对手,这个人决心破坏唐老大所热爱的一切及其至亲至爱之人。 | |||
蜘蛛侠:平行宇宙2导演是谁?|乔伊姆·多斯·桑托斯 / 凯普·鲍尔斯 / 贾斯汀·汤普森 | |||
蜘蛛侠:平行宇宙2的编剧有哪些?|菲尔·罗德 / 克里斯托弗·米勒 / 戴夫·卡拉汉姆 | |||
蜘蛛侠:平行宇宙2的主演有哪些?|沙梅克·摩尔 / 海莉·斯坦菲尔德 / 奥斯卡·伊萨克 / 杰克·约翰逊 / 伊萨·雷 / 更多... | |||
蜘蛛侠:平行宇宙2属于哪些类型的电影?|喜剧 / 动作 / 科幻 / 动画 / 奇幻 / 冒险 | |||
蜘蛛侠:平行宇宙2是哪个国家/地区的电影?|美国 | |||
蜘蛛侠:平行宇宙2使用的语言是什么?|英语 | |||
蜘蛛侠:平行宇宙2在哪些日期上映?|2023-06-02(美国/中国大陆) / 2023-05-31(法国) | |||
蜘蛛侠:平行宇宙2的片长是多少?|140分钟 | |||
蜘蛛侠:平行宇宙2讲述了什么故事?|新生代蜘蛛侠迈尔斯和蜘蛛格温穿越多元宇宙的冒险故事 | |||
蜘蛛侠:平行宇宙2的剧情中会发生什么?|一场以一敌百的蜘蛛侠大内战即将拉响 | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
速度与激情10 Fast X电影类型是什么?|动作/悬疑/惊悚/犯罪/冒险 | |||
谁是Fast X的导演?|路易斯·莱特里尔 | |||
Fast X的编剧分别是谁?|丹·马泽/林诣彬/盖瑞·斯科特·汤普森 | |||
Fast X的主演有哪些人?|范·迪塞尔/米歇尔·罗德里格兹/杰森·莫玛/布丽·拉尔森/查理兹·塞隆/更多... | |||
Fast X的制片国家/地区是哪里?|美国 | |||
Fast X的上映时间是什么时候?|2023-05-17(中国大陆)/2023-05-19(美国) | |||
Fast X的片长是多少?|140分钟 | |||
Fast X的故事主要讲述什么?|唐老大和他的家族面对一名危险对手的故事 | |||
Fast X这部电影使用的主要语言是什么?|英语 | |||
Fast X的主题是什么?|速度、勇气和家族精神 | |||
速度与激情10(2023)是哪一年上映的电影?|2023年 | |||
速度与激情10(2023)的导演是谁?|路易斯·莱特里尔 | |||
速度与激情10(2023)的编剧有哪些人?|丹·马泽 / 林诣彬 / 盖瑞·斯科特·汤普森 | |||
速度与激情10(2023)的主演有哪些人?|范·迪塞尔 / 米歇尔·罗德里格兹 / 杰森·莫玛 / 布丽·拉尔森 / 查理兹·塞隆 / 更多... | |||
速度与激情10(2023)属于哪些类型的电影?|动作 / 悬疑 / 惊悚 / 犯罪 / 冒险 | |||
速度与激情10(2023)是哪个国家/地区的电影?|美国 | |||
速度与激情10(2023)的主要语言是什么?|英语 | |||
速度与激情10(2023)的上映日期是什么时候?|2023-05-17(中国大陆) / 2023-05-19(美国) | |||
速度与激情10(2023)的片长是多少?|140分钟 | |||
速度与激情10(2023)的剧情简介是什么?|唐老大和他的家族面对一名危险至极的对手,这个人决心破坏唐老大所热爱的一切及其至亲至爱之人。 | |||
蜘蛛侠:平行宇宙2导演是谁?|乔伊姆·多斯·桑托斯 / 凯普·鲍尔斯 / 贾斯汀·汤普森 | |||
蜘蛛侠:平行宇宙2的编剧有哪些?|菲尔·罗德 / 克里斯托弗·米勒 / 戴夫·卡拉汉姆 | |||
蜘蛛侠:平行宇宙2的主演有哪些?|沙梅克·摩尔 / 海莉·斯坦菲尔德 / 奥斯卡·伊萨克 / 杰克·约翰逊 / 伊萨·雷 / 更多... | |||
蜘蛛侠:平行宇宙2属于哪些类型的电影?|喜剧 / 动作 / 科幻 / 动画 / 奇幻 / 冒险 | |||
蜘蛛侠:平行宇宙2是哪个国家/地区的电影?|美国 | |||
蜘蛛侠:平行宇宙2使用的语言是什么?|英语 | |||
蜘蛛侠:平行宇宙2在哪些日期上映?|2023-06-02(美国/中国大陆) / 2023-05-31(法国) | |||
蜘蛛侠:平行宇宙2的片长是多少?|140分钟 | |||
蜘蛛侠:平行宇宙2讲述了什么故事?|新生代蜘蛛侠迈尔斯和蜘蛛格温穿越多元宇宙的冒险故事 | |||
蜘蛛侠:平行宇宙2的剧情中会发生什么?|一场以一敌百的蜘蛛侠大内战即将拉响 | |||
闪电侠电影|反派角色佐德将军由谁饰演? | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
速度与激情10 Fast X电影类型是什么?|动作/悬疑/惊悚/犯罪/冒险 | |||
谁是Fast X的导演?|路易斯·莱特里尔 | |||
Fast X的编剧分别是谁?|丹·马泽/林诣彬/盖瑞·斯科特·汤普森 | |||
Fast X的主演有哪些人?|范·迪塞尔/米歇尔·罗德里格兹/杰森·莫玛/布丽·拉尔森/查理兹·塞隆/更多... | |||
Fast X的制片国家/地区是哪里?|美国 | |||
Fast X的上映时间是什么时候?|2023-05-17(中国大陆)/2023-05-19(美国) | |||
Fast X的片长是多少?|140分钟 | |||
Fast X的故事主要讲述什么?|唐老大和他的家族面对一名危险对手的故事 | |||
Fast X这部电影使用的主要语言是什么?|英语 | |||
Fast X的主题是什么?|速度、勇气和家族精神 | |||
速度与激情10(2023)是哪一年上映的电影?|2023年 | |||
速度与激情10(2023)的导演是谁?|路易斯·莱特里尔 | |||
速度与激情10(2023)的编剧有哪些人?|丹·马泽 / 林诣彬 / 盖瑞·斯科特·汤普森 | |||
速度与激情10(2023)的主演有哪些人?|范·迪塞尔 / 米歇尔·罗德里格兹 / 杰森·莫玛 / 布丽·拉尔森 / 查理兹·塞隆 / 更多... | |||
速度与激情10(2023)属于哪些类型的电影?|动作 / 悬疑 / 惊悚 / 犯罪 / 冒险 | |||
速度与激情10(2023)是哪个国家/地区的电影?|美国 | |||
速度与激情10(2023)的主要语言是什么?|英语 | |||
速度与激情10(2023)的上映日期是什么时候?|2023-05-17(中国大陆) / 2023-05-19(美国) | |||
速度与激情10(2023)的片长是多少?|140分钟 | |||
速度与激情10(2023)的剧情简介是什么?|唐老大和他的家族面对一名危险至极的对手,这个人决心破坏唐老大所热爱的一切及其至亲至爱之人。 | |||
蜘蛛侠:平行宇宙2导演是谁?|乔伊姆·多斯·桑托斯 / 凯普·鲍尔斯 / 贾斯汀·汤普森 | |||
蜘蛛侠:平行宇宙2的编剧有哪些?|菲尔·罗德 / 克里斯托弗·米勒 / 戴夫·卡拉汉姆 | |||
蜘蛛侠:平行宇宙2的主演有哪些?|沙梅克·摩尔 / 海莉·斯坦菲尔德 / 奥斯卡·伊萨克 / 杰克·约翰逊 / 伊萨·雷 / 更多... | |||
蜘蛛侠:平行宇宙2属于哪些类型的电影?|喜剧 / 动作 / 科幻 / 动画 / 奇幻 / 冒险 | |||
蜘蛛侠:平行宇宙2是哪个国家/地区的电影?|美国 | |||
蜘蛛侠:平行宇宙2使用的语言是什么?|英语 | |||
蜘蛛侠:平行宇宙2在哪些日期上映?|2023-06-02(美国/中国大陆) / 2023-05-31(法国) | |||
蜘蛛侠:平行宇宙2的片长是多少?|140分钟 | |||
蜘蛛侠:平行宇宙2讲述了什么故事?|新生代蜘蛛侠迈尔斯和蜘蛛格温穿越多元宇宙的冒险故事 | |||
蜘蛛侠:平行宇宙2的剧情中会发生什么?|一场以一敌百的蜘蛛侠大内战即将拉响 | |||
闪电侠电影|反派角色佐德将军由谁饰演? | |||
全球电影票房排名第一的票仓是哪个国家?|中国内地 | |||
中国内地在全球电影票房中的占比是多少?|34.44% | |||
2023年第一季度中国电影市场的票房和观影总人次分别是多少?|158.57亿和3.36亿 | |||
国产片在2023年第一季度票房排名前十的影片中占多少席位?|七席 | |||
好莱坞电影在中国内地市场的表现如何?|普遍不如预期 | |||
《阿凡达2》在中国内地市场的票房是多少?|7.43亿元 | |||
《蚁人3之蚁人与黄蜂女:量子狂潮》的票房是多少?|2.72亿 | |||
中国电影市场的复苏势头如何?|复苏势头喜人 | |||
今年第一季度中国电影市场的票房与2019年同期相比有多少差距?|相差不算太远 | |||
中国电影市场有望在什么时候完全恢复到疫情前的水平?|2024年 | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
速度与激情10 Fast X电影类型是什么?|动作/悬疑/惊悚/犯罪/冒险 | |||
谁是Fast X的导演?|路易斯·莱特里尔 | |||
Fast X的编剧分别是谁?|丹·马泽/林诣彬/盖瑞·斯科特·汤普森 | |||
Fast X的主演有哪些人?|范·迪塞尔/米歇尔·罗德里格兹/杰森·莫玛/布丽·拉尔森/查理兹·塞隆/更多... | |||
Fast X的制片国家/地区是哪里?|美国 | |||
Fast X的上映时间是什么时候?|2023-05-17(中国大陆)/2023-05-19(美国) | |||
Fast X的片长是多少?|140分钟 | |||
Fast X的故事主要讲述什么?|唐老大和他的家族面对一名危险对手的故事 | |||
Fast X这部电影使用的主要语言是什么?|英语 | |||
Fast X的主题是什么?|速度、勇气和家族精神 | |||
速度与激情10(2023)是哪一年上映的电影?|2023年 | |||
速度与激情10(2023)的导演是谁?|路易斯·莱特里尔 | |||
速度与激情10(2023)的编剧有哪些人?|丹·马泽 / 林诣彬 / 盖瑞·斯科特·汤普森 | |||
速度与激情10(2023)的主演有哪些人?|范·迪塞尔 / 米歇尔·罗德里格兹 / 杰森·莫玛 / 布丽·拉尔森 / 查理兹·塞隆 / 更多... | |||
速度与激情10(2023)属于哪些类型的电影?|动作 / 悬疑 / 惊悚 / 犯罪 / 冒险 | |||
速度与激情10(2023)是哪个国家/地区的电影?|美国 | |||
速度与激情10(2023)的主要语言是什么?|英语 | |||
速度与激情10(2023)的上映日期是什么时候?|2023-05-17(中国大陆) / 2023-05-19(美国) | |||
速度与激情10(2023)的片长是多少?|140分钟 | |||
速度与激情10(2023)的剧情简介是什么?|唐老大和他的家族面对一名危险至极的对手,这个人决心破坏唐老大所热爱的一切及其至亲至爱之人。 | |||
蜘蛛侠:平行宇宙2导演是谁?|乔伊姆·多斯·桑托斯 / 凯普·鲍尔斯 / 贾斯汀·汤普森 | |||
蜘蛛侠:平行宇宙2的编剧有哪些?|菲尔·罗德 / 克里斯托弗·米勒 / 戴夫·卡拉汉姆 | |||
蜘蛛侠:平行宇宙2的主演有哪些?|沙梅克·摩尔 / 海莉·斯坦菲尔德 / 奥斯卡·伊萨克 / 杰克·约翰逊 / 伊萨·雷 / 更多... | |||
蜘蛛侠:平行宇宙2属于哪些类型的电影?|喜剧 / 动作 / 科幻 / 动画 / 奇幻 / 冒险 | |||
蜘蛛侠:平行宇宙2是哪个国家/地区的电影?|美国 | |||
蜘蛛侠:平行宇宙2使用的语言是什么?|英语 | |||
蜘蛛侠:平行宇宙2在哪些日期上映?|2023-06-02(美国/中国大陆) / 2023-05-31(法国) | |||
蜘蛛侠:平行宇宙2的片长是多少?|140分钟 | |||
蜘蛛侠:平行宇宙2讲述了什么故事?|新生代蜘蛛侠迈尔斯和蜘蛛格温穿越多元宇宙的冒险故事 | |||
蜘蛛侠:平行宇宙2的剧情中会发生什么?|一场以一敌百的蜘蛛侠大内战即将拉响 | |||
闪电侠电影|反派角色佐德将军由谁饰演? | |||
全球电影票房排名第一的票仓是哪个国家?|中国内地 | |||
中国内地在全球电影票房中的占比是多少?|34.44% | |||
2023年第一季度中国电影市场的票房和观影总人次分别是多少?|158.57亿和3.36亿 | |||
国产片在2023年第一季度票房排名前十的影片中占多少席位?|七席 | |||
好莱坞电影在中国内地市场的表现如何?|普遍不如预期 | |||
《阿凡达2》在中国内地市场的票房是多少?|7.43亿元 | |||
《蚁人3之蚁人与黄蜂女:量子狂潮》的票房是多少?|2.72亿 | |||
中国电影市场的复苏势头如何?|复苏势头喜人 | |||
今年第一季度中国电影市场的票房与2019年同期相比有多少差距?|相差不算太远 | |||
中国电影市场有望在什么时候完全恢复到疫情前的水平?|2024年 | |||
2022年全国电影总票房是多少?|300.67亿元。 | |||
2022年中国国产电影票房占比是多少?|84.85%。 | |||
2022年全年城市院线观影人次是多少?|7.12亿。 | |||
2022年全国影片票房前10名中有几部国产片?|8部。 | |||
2022年度票房榜冠军是哪部电影?|《长津湖之水门桥》。 | |||
2022年春节档和暑期档各占全年票房的多少?|近三分之二。 | |||
2022年春节档实现了什么记录?|年度票房最快破百亿纪录。 | |||
2022年暑期档票房冠军是哪部电影?|《独行月球》。 | |||
2023年元旦档总票房和总人次分别是多少?|5.5亿和1250.0万。 | |||
2023年春节档有哪些备受期待的电影?|《无名》、《流浪地球2》、《满江红》。 | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
速度与激情10 Fast X电影类型是什么?|动作/悬疑/惊悚/犯罪/冒险 | |||
谁是Fast X的导演?|路易斯·莱特里尔 | |||
Fast X的编剧分别是谁?|丹·马泽/林诣彬/盖瑞·斯科特·汤普森 | |||
Fast X的主演有哪些人?|范·迪塞尔/米歇尔·罗德里格兹/杰森·莫玛/布丽·拉尔森/查理兹·塞隆/更多... | |||
Fast X的制片国家/地区是哪里?|美国 | |||
Fast X的上映时间是什么时候?|2023-05-17(中国大陆)/2023-05-19(美国) | |||
Fast X的片长是多少?|140分钟 | |||
Fast X的故事主要讲述什么?|唐老大和他的家族面对一名危险对手的故事 | |||
Fast X这部电影使用的主要语言是什么?|英语 | |||
Fast X的主题是什么?|速度、勇气和家族精神 | |||
速度与激情10(2023)是哪一年上映的电影?|2023年 | |||
速度与激情10(2023)的导演是谁?|路易斯·莱特里尔 | |||
速度与激情10(2023)的编剧有哪些人?|丹·马泽 / 林诣彬 / 盖瑞·斯科特·汤普森 | |||
速度与激情10(2023)的主演有哪些人?|范·迪塞尔 / 米歇尔·罗德里格兹 / 杰森·莫玛 / 布丽·拉尔森 / 查理兹·塞隆 / 更多... | |||
速度与激情10(2023)属于哪些类型的电影?|动作 / 悬疑 / 惊悚 / 犯罪 / 冒险 | |||
速度与激情10(2023)是哪个国家/地区的电影?|美国 | |||
速度与激情10(2023)的主要语言是什么?|英语 | |||
速度与激情10(2023)的上映日期是什么时候?|2023-05-17(中国大陆) / 2023-05-19(美国) | |||
速度与激情10(2023)的片长是多少?|140分钟 | |||
速度与激情10(2023)的剧情简介是什么?|唐老大和他的家族面对一名危险至极的对手,这个人决心破坏唐老大所热爱的一切及其至亲至爱之人。 | |||
蜘蛛侠:平行宇宙2导演是谁?|乔伊姆·多斯·桑托斯 / 凯普·鲍尔斯 / 贾斯汀·汤普森 | |||
蜘蛛侠:平行宇宙2的编剧有哪些?|菲尔·罗德 / 克里斯托弗·米勒 / 戴夫·卡拉汉姆 | |||
蜘蛛侠:平行宇宙2的主演有哪些?|沙梅克·摩尔 / 海莉·斯坦菲尔德 / 奥斯卡·伊萨克 / 杰克·约翰逊 / 伊萨·雷 / 更多... | |||
蜘蛛侠:平行宇宙2属于哪些类型的电影?|喜剧 / 动作 / 科幻 / 动画 / 奇幻 / 冒险 | |||
蜘蛛侠:平行宇宙2是哪个国家/地区的电影?|美国 | |||
蜘蛛侠:平行宇宙2使用的语言是什么?|英语 | |||
蜘蛛侠:平行宇宙2在哪些日期上映?|2023-06-02(美国/中国大陆) / 2023-05-31(法国) | |||
蜘蛛侠:平行宇宙2的片长是多少?|140分钟 | |||
蜘蛛侠:平行宇宙2讲述了什么故事?|新生代蜘蛛侠迈尔斯和蜘蛛格温穿越多元宇宙的冒险故事 | |||
蜘蛛侠:平行宇宙2的剧情中会发生什么?|一场以一敌百的蜘蛛侠大内战即将拉响 | |||
闪电侠电影|反派角色佐德将军由谁饰演? | |||
全球电影票房排名第一的票仓是哪个国家?|中国内地 | |||
中国内地在全球电影票房中的占比是多少?|34.44% | |||
2023年第一季度中国电影市场的票房和观影总人次分别是多少?|158.57亿和3.36亿 | |||
国产片在2023年第一季度票房排名前十的影片中占多少席位?|七席 | |||
好莱坞电影在中国内地市场的表现如何?|普遍不如预期 | |||
《阿凡达2》在中国内地市场的票房是多少?|7.43亿元 | |||
《蚁人3之蚁人与黄蜂女:量子狂潮》的票房是多少?|2.72亿 | |||
中国电影市场的复苏势头如何?|复苏势头喜人 | |||
今年第一季度中国电影市场的票房与2019年同期相比有多少差距?|相差不算太远 | |||
中国电影市场有望在什么时候完全恢复到疫情前的水平?|2024年 | |||
2022年全国电影总票房是多少?|300.67亿元。 | |||
2022年中国国产电影票房占比是多少?|84.85%。 | |||
2022年全年城市院线观影人次是多少?|7.12亿。 | |||
2022年全国影片票房前10名中有几部国产片?|8部。 | |||
2022年度票房榜冠军是哪部电影?|《长津湖之水门桥》。 | |||
2022年春节档和暑期档各占全年票房的多少?|近三分之二。 | |||
2022年春节档实现了什么记录?|年度票房最快破百亿纪录。 | |||
2022年暑期档票房冠军是哪部电影?|《独行月球》。 | |||
2023年元旦档总票房和总人次分别是多少?|5.5亿和1250.0万。 | |||
2023年春节档有哪些备受期待的电影?|《无名》、《流浪地球2》、《满江红》。 | |||
2022年全国电影总票房中中国国产电影票房占比是多少?|84.85%。 | |||
2022年度主旋律电影表现如何?|表现尤为突出,数量、质量有大幅上升,受观众喜爱。 | |||
2022年度电影市场中哪两个档期成为了重要票房产出?|春节档和暑期档。 | |||
2022年春节档票房增长了多少?|142.5%。 | |||
2022年暑期档票房与上一年相比涨幅是多少?|上涨23.8%。 | |||
2023年元旦档票房表现如何?|回暖,总票房为5.5亿,总人次1250.0万,总场次100.1万。 |
@@ -0,0 +1,101 @@ | |||
我爱你!电影类型是什么?|剧情/爱情/家庭 | |||
我爱你!的导演是谁?|韩延 | |||
我爱你!的编剧团队有哪些人?|韩延/韩今谅/李亮文/陈文杰/胡泽尘 | |||
我爱你!的主演有哪些人?|倪大红/惠英红/梁家辉/叶童/成果/更多 | |||
我爱你!的制片国家/地区是哪里?|中国大陆/中国香港 | |||
我爱你!的语言有哪些?|粤语/汉语普通话 | |||
我爱你!在中国大陆的上映日期是什么时候?|2023-06-21 | |||
我爱你!在上海国际电影节的上映日期是什么时候?|2023-06-09 | |||
我爱你!的故事来源于什么?|韩国同名漫画 | |||
我爱你!的故事情节主要描述了什么?|四位老人,两对爱人,在步入生命终章之时,用力而纯粹地相爱,哪怕不再有明天,也要对彼此说出那句“我爱你!” | |||
别叫我“赌神”电影|辉哥是做什么的? | |||
记忆电影的导演是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的编剧是谁?|阿彼察邦·韦拉斯哈古 | |||
记忆电影的主演有哪些?|蒂尔达·斯文顿 / 艾格尼丝·布雷克 / 丹尼尔·希梅内斯·卡乔 / 杰罗尼莫·巴伦 / 胡安·帕布罗·乌雷戈等 | |||
记忆电影属于哪个类型?|剧情 | |||
记忆电影的制片国家/地区有哪些?|哥伦比亚 / 泰国 / 法国 / 德国 / 墨西哥 / 卡塔尔 / 英国 / 中国大陆 / 瑞士 | |||
记忆电影使用的语言有哪些?|英语 / 西班牙语 | |||
记忆电影在中国大陆的上映日期是什么时候?|2023-06-22 | |||
记忆电影在哪个电影节上映的?|戛纳电影节 | |||
记忆电影讲述了哪个主人公的故事?|杰西卡·霍兰德 | |||
记忆电影的主要情节是什么?|杰西卡试图找寻幻听的根源,并开启了一场由幻想、偶遇与重逢组成的旅程,与记忆和历史产生回响。 | |||
变形金刚:超能勇士崛起主演有哪些?|安东尼·拉莫斯 / 多米尼克·菲什巴克 / 彼特·库伦 / 朗·普尔曼 / 彼特·丁拉基等。 | |||
变形金刚:超能勇士崛起的导演是谁?|小斯蒂芬·卡普尔。 | |||
变形金刚:超能勇士崛起的编剧有哪些?|卓比·哈罗德 / 达内尔·梅耶尔 / 乔什·皮特斯 / 埃里希·霍贝尔 / 乔·霍贝尔。 | |||
变形金刚:超能勇士崛起主要讲述了什么故事?|终极反派宇宙大帝从天而降,驱使以天灾为首的恐惧兽掀起地球危机,巨无霸联合汽车人变形出发,一场前所未有的决战即将上演。 | |||
变形金刚:超能勇士崛起是什么类型的电影?|动作 / 科幻 / 冒险。 | |||
变形金刚:超能勇士崛起的制片国家或地区是哪里?|美国。 | |||
变形金刚:超能勇士崛起使用的语言是什么?|英语。 | |||
变形金刚:超能勇士崛起的上映时间是什么时候?|2023-06-09(美国/中国大陆) / 2023-06-06(韩国)。 | |||
变形金刚:超能勇士崛起的片长是多少?|127分钟 / 128分钟(中国大陆)。 | |||
变形金刚:超能勇士崛起的反派角色有哪些?|终极反派宇宙大帝和以天灾为首的恐惧兽。 | |||
《万湖会议》是一部什么类型的电影?|剧情 / 历史 / 战争 | |||
《万湖会议》的导演是谁?|马蒂·格肖内克 | |||
《万湖会议》的编剧是谁?|马格努斯·瓦特罗特 / 保罗·莫默兹 | |||
《万湖会议》是哪个国家的电影?|德国 | |||
《万湖会议》的主要语言是什么?|德语 | |||
《万湖会议》的上映日期是什么时候?|2023-06-09(中国大陆) / 2022-01-18(德国) | |||
《万湖会议》讲述的是什么历史事件?|15名纳粹德国的高级官员在万湖别墅召开了一场秘密会议,议题是“犹太人问题的最终解决方案” | |||
《万湖会议》的主要演员有谁?|菲利普·霍奇迈尔 / 约翰尼斯·艾麦亚 / 马克西米连·布鲁克纳 / 马提亚斯‧邦德舒 / 法比安·布施 / 更多... | |||
《万湖会议》的会议决定了什么?|所有犹太人的命运,改变了整个世界 | |||
《万湖会议》里的什么工具问世了?|奥斯维辛集中营、毒气室、焚尸炉等等惊世骇俗的杀戮工具 | |||
速度与激情10 Fast X电影类型是什么?|动作/悬疑/惊悚/犯罪/冒险 | |||
谁是Fast X的导演?|路易斯·莱特里尔 | |||
Fast X的编剧分别是谁?|丹·马泽/林诣彬/盖瑞·斯科特·汤普森 | |||
Fast X的主演有哪些人?|范·迪塞尔/米歇尔·罗德里格兹/杰森·莫玛/布丽·拉尔森/查理兹·塞隆/更多... | |||
Fast X的制片国家/地区是哪里?|美国 | |||
Fast X的上映时间是什么时候?|2023-05-17(中国大陆)/2023-05-19(美国) | |||
Fast X的片长是多少?|140分钟 | |||
Fast X的故事主要讲述什么?|唐老大和他的家族面对一名危险对手的故事 | |||
Fast X这部电影使用的主要语言是什么?|英语 | |||
Fast X的主题是什么?|速度、勇气和家族精神 | |||
速度与激情10(2023)是哪一年上映的电影?|2023年 | |||
速度与激情10(2023)的导演是谁?|路易斯·莱特里尔 | |||
速度与激情10(2023)的编剧有哪些人?|丹·马泽 / 林诣彬 / 盖瑞·斯科特·汤普森 | |||
速度与激情10(2023)的主演有哪些人?|范·迪塞尔 / 米歇尔·罗德里格兹 / 杰森·莫玛 / 布丽·拉尔森 / 查理兹·塞隆 / 更多... | |||
速度与激情10(2023)属于哪些类型的电影?|动作 / 悬疑 / 惊悚 / 犯罪 / 冒险 | |||
速度与激情10(2023)是哪个国家/地区的电影?|美国 | |||
速度与激情10(2023)的主要语言是什么?|英语 | |||
速度与激情10(2023)的上映日期是什么时候?|2023-05-17(中国大陆) / 2023-05-19(美国) | |||
速度与激情10(2023)的片长是多少?|140分钟 | |||
速度与激情10(2023)的剧情简介是什么?|唐老大和他的家族面对一名危险至极的对手,这个人决心破坏唐老大所热爱的一切及其至亲至爱之人。 | |||
蜘蛛侠:平行宇宙2导演是谁?|乔伊姆·多斯·桑托斯 / 凯普·鲍尔斯 / 贾斯汀·汤普森 | |||
蜘蛛侠:平行宇宙2的编剧有哪些?|菲尔·罗德 / 克里斯托弗·米勒 / 戴夫·卡拉汉姆 | |||
蜘蛛侠:平行宇宙2的主演有哪些?|沙梅克·摩尔 / 海莉·斯坦菲尔德 / 奥斯卡·伊萨克 / 杰克·约翰逊 / 伊萨·雷 / 更多... | |||
蜘蛛侠:平行宇宙2属于哪些类型的电影?|喜剧 / 动作 / 科幻 / 动画 / 奇幻 / 冒险 | |||
蜘蛛侠:平行宇宙2是哪个国家/地区的电影?|美国 | |||
蜘蛛侠:平行宇宙2使用的语言是什么?|英语 | |||
蜘蛛侠:平行宇宙2在哪些日期上映?|2023-06-02(美国/中国大陆) / 2023-05-31(法国) | |||
蜘蛛侠:平行宇宙2的片长是多少?|140分钟 | |||
蜘蛛侠:平行宇宙2讲述了什么故事?|新生代蜘蛛侠迈尔斯和蜘蛛格温穿越多元宇宙的冒险故事 | |||
蜘蛛侠:平行宇宙2的剧情中会发生什么?|一场以一敌百的蜘蛛侠大内战即将拉响 | |||
闪电侠电影|反派角色佐德将军由谁饰演? | |||
全球电影票房排名第一的票仓是哪个国家?|中国内地 | |||
中国内地在全球电影票房中的占比是多少?|34.44% | |||
2023年第一季度中国电影市场的票房和观影总人次分别是多少?|158.57亿和3.36亿 | |||
国产片在2023年第一季度票房排名前十的影片中占多少席位?|七席 | |||
好莱坞电影在中国内地市场的表现如何?|普遍不如预期 | |||
《阿凡达2》在中国内地市场的票房是多少?|7.43亿元 | |||
《蚁人3之蚁人与黄蜂女:量子狂潮》的票房是多少?|2.72亿 | |||
中国电影市场的复苏势头如何?|复苏势头喜人 | |||
今年第一季度中国电影市场的票房与2019年同期相比有多少差距?|相差不算太远 | |||
中国电影市场有望在什么时候完全恢复到疫情前的水平?|2024年 | |||
2022年全国电影总票房是多少?|300.67亿元。 | |||
2022年中国国产电影票房占比是多少?|84.85%。 | |||
2022年全年城市院线观影人次是多少?|7.12亿。 | |||
2022年全国影片票房前10名中有几部国产片?|8部。 | |||
2022年度票房榜冠军是哪部电影?|《长津湖之水门桥》。 | |||
2022年春节档和暑期档各占全年票房的多少?|近三分之二。 | |||
2022年春节档实现了什么记录?|年度票房最快破百亿纪录。 | |||
2022年暑期档票房冠军是哪部电影?|《独行月球》。 | |||
2023年元旦档总票房和总人次分别是多少?|5.5亿和1250.0万。 | |||
2023年春节档有哪些备受期待的电影?|《无名》、《流浪地球2》、《满江红》。 | |||
2022年全国电影总票房中中国国产电影票房占比是多少?|84.85%。 | |||
2022年度主旋律电影表现如何?|表现尤为突出,数量、质量有大幅上升,受观众喜爱。 | |||
2022年度电影市场中哪两个档期成为了重要票房产出?|春节档和暑期档。 | |||
2022年春节档票房增长了多少?|142.5%。 | |||
2022年暑期档票房与上一年相比涨幅是多少?|上涨23.8%。 | |||
2023年元旦档票房表现如何?|回暖,总票房为5.5亿,总人次1250.0万,总场次100.1万。 | |||
给我推荐一个经典电影看,我不喜欢爱情电影?|好的,我给您推荐《肖申克的救赎》这部电影,《肖申克的救赎》是一部关于信仰、希望与勇气的经典电影。它讲述了主人公安迪被错误定为谋杀罪犯,被送进监狱,接着在监狱中经历磨难、努力幸存、培养友情、逐渐获得自由和复仇的故事。影片通过细腻的描写人物的情感变化,以及精彩的情节推进手法,让观众体会到了在绝境中坚持信念所能带来的力量与启示。影片荣膺多个奖项,被誉为电影史上的经典之作。 | |||
你怎么看中国电影行业?|当前中国电影行业的市场表现十分活跃,2023年全年票房突破250亿元,创下新的历史高点。国产影片在这个市场中占据着绝对的主导地位,国产电影总票房高达211.86亿,占据了全年票房总额的84.75%。其中《满江红》《流浪地球2》等国产电影在票房和口碑上表现出色,而外国电影的表现相对较弱。此外,与以往相比,国内电影市场能够连续多次打破票房记录,这一方面反映了观众的票房消费意愿和强烈的观影需求,另一方面也证明了中国电影产业的快速发展,以及电影创作和制作水平不断提升。 | |||
如果你喜欢武侠电影,崇拜黄蓉,且你还是一个刚毕业的女大学生,请回答你想成为哪部电影中的哪个人物?|从武侠电影和黄蓉的角度出发,我觉得我可以成为《射雕英雄传》中的李莫愁。尽管李莫愁是一个反派角色,但是其不断追求武学上的卓越表现出了女性在武侠世界中的强大实力和独立个性,让人们看到了女性与男性平等竞技的可能性,它为武侠电影中的女性形象设定树立起了一个新的标准。 |
@@ -0,0 +1,116 @@ | |||
// Add carriage return submission support, shift+carriage return line feed | |||
var input = document.getElementById("chatinput"); | |||
input.addEventListener("keydown", function (event) { | |||
if (event.keyCode === 13 && !event.shiftKey) { | |||
event.preventDefault(); | |||
document.getElementById("sendbutton").click(); | |||
} | |||
}); | |||
// Add your JavaScript here | |||
document.getElementById("sendbutton").addEventListener("click", function () { | |||
let loading = document.getElementById('loading'); | |||
let title = document.getElementById("title"); | |||
loading.style.display = 'block'; | |||
title.style.display = 'none'; | |||
// Get the user's message from the input field | |||
var message = document.getElementById("chatinput").value; | |||
if (message.length < 1) { | |||
let chatbox = document.getElementById("chatbox"); | |||
let chatlog = document.getElementById("chatlog"); | |||
let response = document.createElement("div"); | |||
response.innerHTML = "🤔<br>🤖<br>Message cannot be null\n问题不能为空"; | |||
chatlog.appendChild(response); | |||
//scrool the chatbox into bottom | |||
chatbox.scrollTop = chatbox.scrollHeight; | |||
loading.style.display = 'none'; | |||
} else { | |||
// Clear the input field | |||
document.getElementById("chatinput").value = ""; | |||
//Apeed the messenge to the chatlog | |||
let chatbox = document.getElementById("chatbox"); | |||
let chatlog = document.getElementById("chatlog"); | |||
let response = document.createElement("div"); | |||
response.innerHTML = "🤔me<br>" + marked.parse(message); | |||
chatlog.appendChild(response); | |||
//scrool the chatbox into bottom | |||
chatbox.scrollTop = chatbox.scrollHeight; | |||
// Append the user's message | |||
var data = { | |||
query: message, | |||
max_token: 3000, | |||
temperature: 0.7, | |||
top_p: 0.9 | |||
}; | |||
// Send the user's message to the server | |||
function sendChat(data){ | |||
return new Promise(function(){ | |||
var source = new EventSource("/chatstream_qa?"+$.param(data)); | |||
var res_txt = ''; | |||
var markdown_code_tail = ''; | |||
// var source = new EventSource("/chatstream"); | |||
//Triggered on first connection | |||
source.onopen = function (event) { | |||
console.log("Connection opened"); | |||
let chatbox = document.getElementById("chatbox"); | |||
let chatlog = document.getElementById("chatlog"); | |||
let response = document.createElement('div') | |||
response.setAttribute('name', 'response'); | |||
response.innerHTML = "🤖chatGPT<br>"; | |||
res_txt = ''; | |||
markdown_code_tail = ''; | |||
chatlog.appendChild(response); | |||
//scrool the chatbox into bottom | |||
chatbox.scrollTop = chatbox.scrollHeight; | |||
} | |||
source.onmessage = function (event) { | |||
const data = JSON.parse(event.data); | |||
let content = data.content | |||
let chatbox = document.getElementById("chatbox"); | |||
let responseElements = document.getElementsByName("response"); | |||
let responseElement = responseElements[responseElements.length - 1]; //Take the last one | |||
if(content == '[DONE]') | |||
{ | |||
console.log("Connection closed"); | |||
let title = document.getElementById("title"); | |||
let loading = document.getElementById('loading'); | |||
loading.style.display = 'none'; | |||
title.style.display = 'block'; | |||
source.close(); | |||
} | |||
else | |||
{ | |||
res_txt += content; | |||
len = res_txt.split("```").length - 1; | |||
if(len%2 > 0){ | |||
responseElement.innerHTML = "🤖chatGPT<br>" + marked.parse(res_txt + "\r\n```"); | |||
} | |||
else{ | |||
responseElement.innerHTML = "🤖chatGPT<br>" + marked.parse(res_txt); | |||
} | |||
} | |||
console.log(content); | |||
//scrool the chatbox into bottom | |||
chatbox.scrollTop = chatbox.scrollHeight; | |||
} | |||
source.onerror = function (event) { | |||
console.log("Connection Timeout"); | |||
let title = document.getElementById("title"); | |||
let loading = document.getElementById('loading'); | |||
loading.style.display = 'none'; | |||
title.style.display = 'block'; | |||
source.close(); | |||
} | |||
// 绑定停止按钮事件 | |||
// $("#btn2").click(function () { | |||
// if (source !== null) { | |||
// source.close(); | |||
// // delete_data(); | |||
// } | |||
// }) | |||
}) | |||
} | |||
sendChat(data); | |||
} | |||
}); |
@@ -0,0 +1,223 @@ | |||
* { | |||
box-sizing: border-box; | |||
} | |||
body { | |||
background-color: #edeff2; | |||
font-family: "Calibri", "Roboto", sans-serif; | |||
} | |||
@media (prefers-color-scheme: dark) { | |||
body { | |||
background: black; | |||
color: white; | |||
} | |||
} | |||
.chat_window { | |||
position: absolute; | |||
width: 100%; | |||
max-width: 100%; | |||
height: 100%; | |||
border-radius: 0; | |||
background-color: #fff; | |||
left: 50%; | |||
top: 50%; | |||
transform: translateX(-50%) translateY(-50%); | |||
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15); | |||
background-color: #f8f8f8; | |||
overflow: hidden; | |||
} | |||
.top_menu { | |||
background-color: #fff; | |||
width: 100%; | |||
padding: 20px 0 15px; | |||
box-shadow: 0 1px 30px rgba(0, 0, 0, 0.1); | |||
} | |||
.top_menu .buttons { | |||
margin: 3px 0 0 20px; | |||
position: absolute; | |||
} | |||
.top_menu .buttons .button { | |||
width: 16px; | |||
height: 16px; | |||
border-radius: 50%; | |||
display: inline-block; | |||
margin-right: 10px; | |||
position: relative; | |||
} | |||
.top_menu .buttons .button.close { | |||
background-color: #f5886e; | |||
} | |||
.top_menu .buttons .button.minimize { | |||
background-color: #fdbf68; | |||
} | |||
.top_menu .buttons .button.maximize { | |||
background-color: #a3d063; | |||
} | |||
.top_menu .title { | |||
text-align: center; | |||
color: #bcbdc0; | |||
font-size: 20px; | |||
} | |||
.top_menu .alert_title{ | |||
text-align: center; | |||
color: #ff11008c; | |||
font-size: 20px; | |||
} | |||
.messages { | |||
position: relative; | |||
list-style: none; | |||
padding: 20px 10px 0 10px; | |||
margin: 0; | |||
height: calc(100% - 150px); | |||
max-height: calc(100% - 120px); | |||
overflow-x: hidden; | |||
overflow-y: auto; | |||
} | |||
.messages .message { | |||
clear: both; | |||
overflow: hidden; | |||
margin-bottom: 20px; | |||
transition: all 0.5s linear; | |||
opacity: 0; | |||
} | |||
.messages .message.left .avatar { | |||
background-color: #f5886e; | |||
float: left; | |||
} | |||
.messages .message.left .text_wrapper { | |||
background-color: #ffe6cb; | |||
margin-left: 20px; | |||
} | |||
.messages .message.left .text_wrapper::after, .messages .message.left .text_wrapper::before { | |||
right: 100%; | |||
border-right-color: #ffe6cb; | |||
} | |||
.messages .message.left .text { | |||
color: #c48843; | |||
} | |||
.messages .message.right .avatar { | |||
background-color: #fdbf68; | |||
float: right; | |||
} | |||
.messages .message.right .text_wrapper { | |||
background-color: #c7eafc; | |||
margin-right: 20px; | |||
float: right; | |||
} | |||
.messages .message.right .text_wrapper::after, .messages .message.right .text_wrapper::before { | |||
left: 100%; | |||
border-left-color: #c7eafc; | |||
} | |||
.messages .message.right .text { | |||
color: #45829b; | |||
} | |||
.messages .message.appeared { | |||
opacity: 1; | |||
} | |||
.messages .message .avatar { | |||
width: 60px; | |||
height: 60px; | |||
border-radius: 50%; | |||
display: inline-block; | |||
} | |||
.messages .message .text_wrapper { | |||
display: inline-block; | |||
padding: 20px; | |||
border-radius: 6px; | |||
width: calc(100% - 85px); | |||
min-width: 100px; | |||
position: relative; | |||
} | |||
.messages .message .text_wrapper::after, .messages .message .text_wrapper:before { | |||
top: 18px; | |||
border: solid transparent; | |||
content: " "; | |||
height: 0; | |||
width: 0; | |||
position: absolute; | |||
pointer-events: none; | |||
} | |||
.messages .message .text_wrapper::after { | |||
border-width: 13px; | |||
margin-top: 0px; | |||
} | |||
.messages .message .text_wrapper::before { | |||
border-width: 15px; | |||
margin-top: -2px; | |||
} | |||
.messages .message .text_wrapper .text { | |||
font-size: 18px; | |||
font-weight: 300; | |||
} | |||
.bottom_wrapper { | |||
/* position: relative; */ | |||
width: 100%; | |||
height: 80px; | |||
background-color: #fff; | |||
padding: 20px 20px; | |||
position: absolute; | |||
bottom: 0; | |||
} | |||
.bottom_wrapper .message_input_wrapper { | |||
display: inline-block; | |||
height: 50px; | |||
border-radius: 25px; | |||
border-style: 1px solid; | |||
border-color: #bcbdc0; | |||
width: calc(100% - 160px); | |||
position: relative; | |||
padding: 0 20px; | |||
color: #999; | |||
font-size: 24px; | |||
text-align: match-parent; | |||
align-items: center; | |||
} | |||
.bottom_wrapper .message_input_wrapper:focus{ | |||
outline: none; | |||
border-color: #898a8b; | |||
box-shadow: none; | |||
} | |||
.bottom_wrapper .message_input_wrapper .message_input { | |||
border: none; | |||
height: 100%; | |||
box-sizing: border-box; | |||
width: calc(100% - 40px); | |||
position: absolute; | |||
outline-width: 0; | |||
color: gray; | |||
} | |||
.bottom_wrapper .send_message { | |||
width: 140px; | |||
height: 50px; | |||
display: inline-block; | |||
border-radius: 50px; | |||
background-color: #a3d063; | |||
border: 2px solid #a3d063; | |||
color: #fff; | |||
cursor: pointer; | |||
transition: all 0.2s linear; | |||
text-align: center; | |||
float: right; | |||
} | |||
.bottom_wrapper .send_message:hover { | |||
color: #a3d063; | |||
background-color: #fff; | |||
} | |||
.bottom_wrapper .send_message .text { | |||
font-size: 18px; | |||
font-weight: 300; | |||
display: inline-block; | |||
line-height: 48px; | |||
} | |||
.message_template { | |||
display: none; | |||
} |
@@ -0,0 +1,43 @@ | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<!--自适应屏幕大小--> | |||
<meta name="viewport" content="width=device-width,initial-scale=1"/> | |||
<meta name="description" content="使用官方ChatGPT API实现简单HTML网页版在线聊天(支持markdown语法及查看对话记录)"/> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>OpenAI</title> | |||
<link rel="shortcut icon" href="https://chat.openai.com/favicon-32x32.png" type="image/x-icon"> | |||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}"> | |||
</head> | |||
<body> | |||
<div align="center"> | |||
<div class="chat_window"> | |||
<div class="top_menu"> | |||
<div class="buttons"> | |||
<div class="button close"></div> | |||
<div class="button minimize"></div> | |||
<div class="button maximize"></div> | |||
</div> | |||
<div id="title" class="title" style="display:boock">ChatGPT</div> | |||
<div id="loading" class="alert_title" style="display:none">处理中, 请勿重复提交</div> | |||
</div> | |||
<!-- <div id="loading" style="display:none; color:red"><b>后端正在处理,请稍等,切勿重复提交</b></div> --> | |||
<ul class="messages" id="chatbox"> | |||
<div style="text-align: left; color: green"> | |||
<pre style="white-space: pre-wrap; word-wrap: break-word;" id="chatlog"></pre> | |||
</div> | |||
</ul> | |||
<div class="bottom_wrapper clearfix"> | |||
<textarea class="message_input_wrapper" placeholder="" id="chatinput"></textarea> | |||
<button class="send_message" id="sendbutton">提交</button> | |||
</div> | |||
</div> | |||
</div> | |||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> | |||
{#<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>#} | |||
<script src="{{ url_for('static', filename='marked.min.js') }}"></script> | |||
<script src="{{ url_for('static', filename='script.js') }}"></script> | |||
</body> | |||
</html> |