waynorth Elfe commited on
Commit
610c5e5
0 Parent(s):

Duplicate from baixing/hackathon_test

Browse files

Co-authored-by: ElfeXu <Elfe@users.noreply.huggingface.co>

Files changed (5) hide show
  1. .gitattributes +34 -0
  2. README.md +14 -0
  3. app.py +63 -0
  4. bot-api.md +79 -0
  5. 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
+