Spaces:
Sleeping
Sleeping
Duplicate from baixing/hackathon_test
Browse filesCo-authored-by: ElfeXu <Elfe@users.noreply.huggingface.co>
- .gitattributes +34 -0
- README.md +14 -0
- app.py +63 -0
- bot-api.md +79 -0
- qna.md +24 -0
.gitattributes
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Hackathon Test
|
3 |
+
emoji: 🌖
|
4 |
+
colorFrom: indigo
|
5 |
+
colorTo: red
|
6 |
+
sdk: gradio
|
7 |
+
sdk_version: 3.20.1
|
8 |
+
app_file: app.py
|
9 |
+
pinned: false
|
10 |
+
license: cc-by-4.0
|
11 |
+
duplicated_from: baixing/hackathon_test
|
12 |
+
---
|
13 |
+
|
14 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
app.py
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import random
|
2 |
+
import json
|
3 |
+
import gradio as gr
|
4 |
+
import requests
|
5 |
+
|
6 |
+
def getResponse(api, p, qid, uid):
|
7 |
+
if api.strip().endswith(".hf.space/run/predict"):
|
8 |
+
return getResponseFromHF(api, p, qid, uid)
|
9 |
+
else:
|
10 |
+
return getResponseFromDefault(api, p, qid, uid)
|
11 |
+
return reply
|
12 |
+
|
13 |
+
|
14 |
+
def getResponseFromHF(api, p, qid, uid):
|
15 |
+
response = requests.post(api, json={
|
16 |
+
"data": [
|
17 |
+
p,
|
18 |
+
qid,
|
19 |
+
uid,
|
20 |
+
]
|
21 |
+
}).json()
|
22 |
+
print(response)
|
23 |
+
data = response["data"]
|
24 |
+
if (len(data) == 2):
|
25 |
+
return data[1]
|
26 |
+
|
27 |
+
def getResponseFromDefault(api, p, qid, uid):
|
28 |
+
response = requests.post(api, json={
|
29 |
+
"p":p,
|
30 |
+
"qid":qid,
|
31 |
+
"uid":uid
|
32 |
+
}).json()
|
33 |
+
print(response)
|
34 |
+
data = response["data"]
|
35 |
+
return data["content"]
|
36 |
+
|
37 |
+
def chat(api, p, qid, uid, history):
|
38 |
+
history = history or []
|
39 |
+
reply = getResponse(api, p, qid, uid)
|
40 |
+
history.append((p, reply))
|
41 |
+
return history, history
|
42 |
+
|
43 |
+
gr.Interface(fn=chat,
|
44 |
+
theme="default",
|
45 |
+
css=".footer {display:none !important}",
|
46 |
+
inputs=["text", "text", "text", "text", "state"],
|
47 |
+
outputs=["chatbot", "state"],
|
48 |
+
title="ChatAPI Test",
|
49 |
+
description="""你可以通过本应用来模拟接入瀛海威广场后的效果。
|
50 |
+
#### 左侧:模拟来自瀛海威广场的调用
|
51 |
+
* api: 请填写你的机器人的 api 地址
|
52 |
+
当用户在广场找到你的机器人,和它说话,你的 api 将会收到如下参数的调用:
|
53 |
+
* p: 人们在广场里对你的机器人说话的内容
|
54 |
+
* qid: 当前消息的唯一标识。例如 `'bxqid-cManAtRMszw...'`。由平台生成并传递给机器人,以便机器人区分单个问题(写日志、追踪调试、异步回调等)。同步调用可忽略。
|
55 |
+
* uid: 用户的唯一标识。例如`'bxuid-Aj8Spso8Xsp...'`。由平台生成并传递给机器人,以便机器人区分用户。可被用于实现多轮对话的功能。
|
56 |
+
|
57 |
+
#### 右侧:对话界面
|
58 |
+
当你的机器人 api 返回给瀛海威广场后,瀛海威广场上的机器人和用户的对话,将会呈现如右侧的效果。
|
59 |
+
(瀛海威广场上的对话窗口将有 markdown 格式呈现的功能)
|
60 |
+
|
61 |
+
[参考文档](https://huggingface.co/spaces/baixing/hackathon_test/blob/main/bot-api.md) [极简 bot 示例](https://huggingface.co/spaces/baixing/hackathon_chatbot_simple) [Q & A](https://huggingface.co/spaces/baixing/hackathon_test/blob/main/qna.md)
|
62 |
+
"""
|
63 |
+
).launch()
|
bot-api.md
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!--广场机器人 API 规范(草案)-->
|
2 |
+
|
3 |
+
## 概述
|
4 |
+
|
5 |
+
机器人通过 HTTP 接口的形式来提供对话服务,比如:
|
6 |
+
|
7 |
+
```
|
8 |
+
https://www.my-bot.com/api/v1/chat
|
9 |
+
```
|
10 |
+
|
11 |
+
机器人只需要实现以下任意一种接口方案,即可申请入驻广场。
|
12 |
+
|
13 |
+
|
14 |
+
|
15 |
+
|
16 |
+
## [方案一] 标准接口
|
17 |
+
|
18 |
+
**POST** `~/chat` (接口地址必须以 `chat` 结尾)
|
19 |
+
|
20 |
+
请求体(JSON):
|
21 |
+
|
22 |
+
```json
|
23 |
+
{ "p": "天空为什么是蓝色的?" }
|
24 |
+
```
|
25 |
+
|
26 |
+
请求体可能包含如下字段:
|
27 |
+
|
28 |
+
字段名 | 类型 | 必填 | 含义 | 示例 | 备注
|
29 |
+
---|---|:---:|---|---|---
|
30 |
+
`p` | String | ✓ | 提问内容 |`'天空为什么是蓝色的?'`|`p` 表示 “prompt”
|
31 |
+
`qid` | String | | 平台为当前提问分配的唯一标识 |`'bxqid-cManAtRMszw...'`|由平台生成并传递给机器人,以便机器人区分单个问题(写日志、追踪调试、异步回调等)
|
32 |
+
`uid` | String | | 用户的唯一标识 | `'bxuid-Aj8Spso8Xsp...'` | 由平台生成并传递给机器人,以便机器人区分用户
|
33 |
+
|
34 |
+
响应体(JSON):
|
35 |
+
|
36 |
+
```js
|
37 |
+
-{
|
38 |
+
"data": {
|
39 |
+
"type": "text", // 也可以是 "markdown"
|
40 |
+
"content": "因为..."
|
41 |
+
}
|
42 |
+
}
|
43 |
+
```
|
44 |
+
|
45 |
+
|
46 |
+
|
47 |
+
## [方案二] Hugging Face 风格接口
|
48 |
+
|
49 |
+
**POST** `https://*.hf.space/run/predict`
|
50 |
+
|
51 |
+
> 为方便 Hugging Face 开发者快速接入,特提供本方案。
|
52 |
+
>
|
53 |
+
> 当机器人提供的接口符合上述模式,平台会自动识别它是一个 Hugging Face 应用。
|
54 |
+
|
55 |
+
请求体(JSON):
|
56 |
+
|
57 |
+
```js
|
58 |
+
-{
|
59 |
+
"data": [ // 注意:这里 `data` 是一个数组
|
60 |
+
"天空为什么是蓝色的?", // 相当于方案一的 `p` 字段
|
61 |
+
"bxqid-cManAtRMszw...", // 相当于方案一的 `qid` 字段
|
62 |
+
"bxuid-Aj8Spso8Xsp..." // 相当于方案一的 `uid` 字段
|
63 |
+
]
|
64 |
+
}
|
65 |
+
```
|
66 |
+
|
67 |
+
响应体(JSON):
|
68 |
+
|
69 |
+
```js
|
70 |
+
-{
|
71 |
+
"data": [ // 注意:这里 `data` 是一个数组
|
72 |
+
"text", // 相当于方案一的 `type` 字段
|
73 |
+
"因为..." // 相当于方案一的 `content` 字段
|
74 |
+
]
|
75 |
+
}
|
76 |
+
```
|
77 |
+
|
78 |
+
|
79 |
+
|
qna.md
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# 关于 Hackathon 的 Q&A
|
2 |
+
|
3 |
+
# Q: 怎样才算是完成了一个可以参加 hackathon 的机器人?
|
4 |
+
**A:** 只要实现了[接口文档](https://huggingface.co/spaces/baixing/hackathon_test/blob/main/bot-api.md)中的任一接口,即可将机器人接入到瀛海威广场。
|
5 |
+
这是一场几乎所有人都能参与的 hackathon。
|
6 |
+
- 不会写代码的同学:只需要 duplicate [demo 程序](https://huggingface.co/spaces/baixing/hackathon_chatbot_openai_api),修改其中的 prompt,就可以完成一个用 prompt 来定制的机器人。
|
7 |
+
- 喜欢写代码的同学: 可进一步修改demo程序中的 chat 方法添加自己的逻辑。
|
8 |
+
- 更高级别的同学:可以多多尝试 Hugging Face 上的各种模型,开发出更强大的机器人。
|
9 |
+
|
10 |
+
|
11 |
+
# Q: 是否一定要使用 Hugging Face 的 Space
|
12 |
+
**A:** 不需要。你完全可以在你自己的服务器上部署服务。如果在自己的服务器上部署,需要按[接口文档](https://huggingface.co/spaces/baixing/hackathon_test/blob/main/bot-api.md)中的标准接口来实现。如果是对 HF 上 demo 的 duplicate space,只需要提供默认的 api 地址即可。
|
13 |
+
|
14 |
+
|
15 |
+
# Q: 项目是否一定要开源
|
16 |
+
**A:** 不需要。如果是在 hugging face 上,你需要将 space 设置为 public。但你可以将代码托管在 github 上,将 github 的 token 存在 settings 中,然后 app 去 clone 该 repo。
|
17 |
+
|
18 |
+
|
19 |
+
# Q: 我的代码准备开源,但是 openai 或 baixingai 的 apikey 不能公开呀。怎么处理?
|
20 |
+
**A:** 你可以把 key 放在 space settings 里的 Repository secrets ,然后通过 os.getenv("key_name") 来读取。
|
21 |
+
|
22 |
+
# Q: 我需要多轮对话能力,如何实现?
|
23 |
+
**A:** 接口中的 uid 是用户的唯一标记,可以通过它查找历史对话数据。历史对话可以存在其它服务器上,也可以用本地 sqlite 的方式来读写。
|
24 |
+
|