init repo
Browse files- .gitignore +1225 -0
- LICENSE +201 -0
- README_zh.md +95 -0
- app.py +266 -0
- cloc.sh +65 -0
- llmriddles/__init__.py +0 -0
- llmriddles/assets/avatar.png +0 -0
- llmriddles/assets/wechat.jpeg +0 -0
- llmriddles/llms/__init__.py +4 -0
- llmriddles/llms/base.py +11 -0
- llmriddles/llms/chatglm.py +26 -0
- llmriddles/llms/chatgpt.py +25 -0
- llmriddles/llms/llm_client.py +54 -0
- llmriddles/llms/llm_server.py +72 -0
- llmriddles/llms/mistral.py +22 -0
- llmriddles/questions/__init__.py +13 -0
- llmriddles/questions/executor.py +35 -0
- llmriddles/questions/level1.py +204 -0
- llmriddles/questions/level2.py +329 -0
- llmriddles/questions/level3.py +165 -0
- llmriddles/questions/level4.py +104 -0
- llmriddles/questions/level5.py +64 -0
- llmriddles/questions/question.py +52 -0
- requirements-dev.txt +11 -0
- requirements.txt +7 -0
.gitignore
ADDED
@@ -0,0 +1,1225 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Created by .ignore support plugin (hsz.mobi)
|
2 |
+
### Example user template template
|
3 |
+
### Example user template
|
4 |
+
|
5 |
+
# IntelliJ project files
|
6 |
+
.idea
|
7 |
+
*.iml
|
8 |
+
out
|
9 |
+
gen
|
10 |
+
### CVS template
|
11 |
+
/CVS/*
|
12 |
+
**/CVS/*
|
13 |
+
.cvsignore
|
14 |
+
*/.cvsignore
|
15 |
+
|
16 |
+
### C++ template
|
17 |
+
# Prerequisites
|
18 |
+
*.d
|
19 |
+
|
20 |
+
# Compiled Object files
|
21 |
+
*.slo
|
22 |
+
*.lo
|
23 |
+
*.o
|
24 |
+
*.obj
|
25 |
+
|
26 |
+
# Precompiled Headers
|
27 |
+
*.gch
|
28 |
+
*.pch
|
29 |
+
|
30 |
+
# Compiled Dynamic libraries
|
31 |
+
*.so
|
32 |
+
*.dylib
|
33 |
+
*.dll
|
34 |
+
|
35 |
+
# Fortran module files
|
36 |
+
*.mod
|
37 |
+
*.smod
|
38 |
+
|
39 |
+
# Compiled Static libraries
|
40 |
+
*.lai
|
41 |
+
*.la
|
42 |
+
*.a
|
43 |
+
*.lib
|
44 |
+
|
45 |
+
# Executables
|
46 |
+
*.exe
|
47 |
+
*.out
|
48 |
+
*.app
|
49 |
+
|
50 |
+
### CUDA template
|
51 |
+
*.i
|
52 |
+
*.ii
|
53 |
+
*.gpu
|
54 |
+
*.ptx
|
55 |
+
*.cubin
|
56 |
+
*.fatbin
|
57 |
+
|
58 |
+
### SVN template
|
59 |
+
.svn/
|
60 |
+
|
61 |
+
### Images template
|
62 |
+
# JPEG
|
63 |
+
*.jpe
|
64 |
+
*.jif
|
65 |
+
*.jfif
|
66 |
+
*.jfi
|
67 |
+
|
68 |
+
# JPEG 2000
|
69 |
+
*.jp2
|
70 |
+
*.j2k
|
71 |
+
*.jpf
|
72 |
+
*.jpx
|
73 |
+
*.jpm
|
74 |
+
*.mj2
|
75 |
+
|
76 |
+
# JPEG XR
|
77 |
+
*.jxr
|
78 |
+
*.hdp
|
79 |
+
*.wdp
|
80 |
+
|
81 |
+
# Graphics Interchange Format
|
82 |
+
*.gif
|
83 |
+
|
84 |
+
# RAW
|
85 |
+
*.raw
|
86 |
+
|
87 |
+
# Web P
|
88 |
+
*.webp
|
89 |
+
|
90 |
+
# Portable Network Graphics
|
91 |
+
#*.png
|
92 |
+
|
93 |
+
# Animated Portable Network Graphics
|
94 |
+
*.apng
|
95 |
+
|
96 |
+
# Multiple-image Network Graphics
|
97 |
+
*.mng
|
98 |
+
|
99 |
+
# Tagged Image File Format
|
100 |
+
*.tiff
|
101 |
+
*.tif
|
102 |
+
|
103 |
+
# Scalable Vector Graphics
|
104 |
+
*.svg
|
105 |
+
*.svgz
|
106 |
+
|
107 |
+
# Portable Document Format
|
108 |
+
*.pdf
|
109 |
+
|
110 |
+
# X BitMap
|
111 |
+
*.xbm
|
112 |
+
|
113 |
+
# BMP
|
114 |
+
*.bmp
|
115 |
+
*.dib
|
116 |
+
|
117 |
+
# ICO
|
118 |
+
*.ico
|
119 |
+
|
120 |
+
# 3D Images
|
121 |
+
*.3dm
|
122 |
+
*.max
|
123 |
+
|
124 |
+
### Eclipse template
|
125 |
+
.metadata
|
126 |
+
bin/
|
127 |
+
tmp/
|
128 |
+
*.tmp
|
129 |
+
*.bak
|
130 |
+
*.swp
|
131 |
+
*~.nib
|
132 |
+
local.properties
|
133 |
+
.settings/
|
134 |
+
.loadpath
|
135 |
+
.recommenders
|
136 |
+
|
137 |
+
# External tool builders
|
138 |
+
.externalToolBuilders/
|
139 |
+
|
140 |
+
# Locally stored "Eclipse launch configurations"
|
141 |
+
*.launch
|
142 |
+
|
143 |
+
# PyDev specific (Python IDE for Eclipse)
|
144 |
+
*.pydevproject
|
145 |
+
|
146 |
+
# CDT-specific (C/C++ Development Tooling)
|
147 |
+
.cproject
|
148 |
+
|
149 |
+
# CDT- autotools
|
150 |
+
.autotools
|
151 |
+
|
152 |
+
# Java annotation processor (APT)
|
153 |
+
.factorypath
|
154 |
+
|
155 |
+
# PDT-specific (PHP Development Tools)
|
156 |
+
.buildpath
|
157 |
+
|
158 |
+
# sbteclipse plugin
|
159 |
+
.target
|
160 |
+
|
161 |
+
# Tern plugin
|
162 |
+
.tern-project
|
163 |
+
|
164 |
+
# TeXlipse plugin
|
165 |
+
.texlipse
|
166 |
+
|
167 |
+
# STS (Spring Tool Suite)
|
168 |
+
.springBeans
|
169 |
+
|
170 |
+
# Code Recommenders
|
171 |
+
.recommenders/
|
172 |
+
|
173 |
+
# Annotation Processing
|
174 |
+
.apt_generated/
|
175 |
+
.apt_generated_test/
|
176 |
+
|
177 |
+
# Scala IDE specific (Scala & Java development for Eclipse)
|
178 |
+
.cache-main
|
179 |
+
.scala_dependencies
|
180 |
+
.worksheet
|
181 |
+
|
182 |
+
# Uncomment this line if you wish to ignore the project description file.
|
183 |
+
# Typically, this file would be tracked if it contains build/dependency configurations:
|
184 |
+
#.project
|
185 |
+
|
186 |
+
### Diff template
|
187 |
+
*.patch
|
188 |
+
*.diff
|
189 |
+
|
190 |
+
### macOS template
|
191 |
+
# General
|
192 |
+
.DS_Store
|
193 |
+
.AppleDouble
|
194 |
+
.LSOverride
|
195 |
+
|
196 |
+
# Icon must end with two \r
|
197 |
+
Icon
|
198 |
+
|
199 |
+
# Thumbnails
|
200 |
+
._*
|
201 |
+
|
202 |
+
# Files that might appear in the root of a volume
|
203 |
+
.DocumentRevisions-V100
|
204 |
+
.fseventsd
|
205 |
+
.Spotlight-V100
|
206 |
+
.TemporaryItems
|
207 |
+
.Trashes
|
208 |
+
.VolumeIcon.icns
|
209 |
+
.com.apple.timemachine.donotpresent
|
210 |
+
|
211 |
+
# Directories potentially created on remote AFP share
|
212 |
+
.AppleDB
|
213 |
+
.AppleDesktop
|
214 |
+
Network Trash Folder
|
215 |
+
Temporary Items
|
216 |
+
.apdisk
|
217 |
+
|
218 |
+
### CMake template
|
219 |
+
CMakeLists.txt.user
|
220 |
+
CMakeCache.txt
|
221 |
+
CMakeFiles
|
222 |
+
CMakeScripts
|
223 |
+
Testing
|
224 |
+
cmake_install.cmake
|
225 |
+
install_manifest.txt
|
226 |
+
compile_commands.json
|
227 |
+
CTestTestfile.cmake
|
228 |
+
_deps
|
229 |
+
|
230 |
+
### Linux template
|
231 |
+
*~
|
232 |
+
|
233 |
+
# temporary files which can be created if a process still has a handle open of a deleted file
|
234 |
+
.fuse_hidden*
|
235 |
+
|
236 |
+
# KDE directory preferences
|
237 |
+
.directory
|
238 |
+
|
239 |
+
# Linux trash folder which might appear on any partition or disk
|
240 |
+
.Trash-*
|
241 |
+
|
242 |
+
# .nfs files are created when an open file is removed but is still being accessed
|
243 |
+
.nfs*
|
244 |
+
|
245 |
+
### MicrosoftOffice template
|
246 |
+
*.tmp
|
247 |
+
|
248 |
+
# Word temporary
|
249 |
+
~$*.doc*
|
250 |
+
|
251 |
+
# Word Auto Backup File
|
252 |
+
Backup of *.doc*
|
253 |
+
|
254 |
+
# Excel temporary
|
255 |
+
~$*.xls*
|
256 |
+
|
257 |
+
# Excel Backup File
|
258 |
+
*.xlk
|
259 |
+
|
260 |
+
# PowerPoint temporary
|
261 |
+
~$*.ppt*
|
262 |
+
|
263 |
+
# Visio autosave temporary files
|
264 |
+
*.~vsd*
|
265 |
+
|
266 |
+
### VisualStudio template
|
267 |
+
## Ignore Visual Studio temporary files, build results, and
|
268 |
+
## files generated by popular Visual Studio add-ons.
|
269 |
+
##
|
270 |
+
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
271 |
+
|
272 |
+
# User-specific files
|
273 |
+
*.rsuser
|
274 |
+
*.suo
|
275 |
+
*.user
|
276 |
+
*.userosscache
|
277 |
+
*.sln.docstates
|
278 |
+
|
279 |
+
# User-specific files (MonoDevelop/Xamarin Studio)
|
280 |
+
*.userprefs
|
281 |
+
|
282 |
+
# Mono auto generated files
|
283 |
+
mono_crash.*
|
284 |
+
|
285 |
+
# Build results
|
286 |
+
[Dd]ebug/
|
287 |
+
[Dd]ebugPublic/
|
288 |
+
[Rr]elease/
|
289 |
+
[Rr]eleases/
|
290 |
+
x64/
|
291 |
+
x86/
|
292 |
+
[Ww][Ii][Nn]32/
|
293 |
+
[Aa][Rr][Mm]/
|
294 |
+
[Aa][Rr][Mm]64/
|
295 |
+
bld/
|
296 |
+
[Bb]in/
|
297 |
+
[Oo]bj/
|
298 |
+
[Ll]og/
|
299 |
+
[Ll]ogs/
|
300 |
+
|
301 |
+
# Visual Studio 2015/2017 cache/options directory
|
302 |
+
.vs/
|
303 |
+
# Uncomment if you have tasks that create the project's static files in wwwroot
|
304 |
+
#wwwroot/
|
305 |
+
|
306 |
+
# Visual Studio 2017 auto generated files
|
307 |
+
Generated\ Files/
|
308 |
+
|
309 |
+
# MSTest test Results
|
310 |
+
[Tt]est[Rr]esult*/
|
311 |
+
[Bb]uild[Ll]og.*
|
312 |
+
|
313 |
+
# NUnit
|
314 |
+
*.VisualState.xml
|
315 |
+
TestResult.xml
|
316 |
+
nunit-*.xml
|
317 |
+
|
318 |
+
# Build Results of an ATL Project
|
319 |
+
[Dd]ebugPS/
|
320 |
+
[Rr]eleasePS/
|
321 |
+
dlldata.c
|
322 |
+
|
323 |
+
# Benchmark Results
|
324 |
+
BenchmarkDotNet.Artifacts/
|
325 |
+
|
326 |
+
# .NET Core
|
327 |
+
project.lock.json
|
328 |
+
project.fragment.lock.json
|
329 |
+
artifacts/
|
330 |
+
|
331 |
+
# ASP.NET Scaffolding
|
332 |
+
ScaffoldingReadMe.txt
|
333 |
+
|
334 |
+
# StyleCop
|
335 |
+
StyleCopReport.xml
|
336 |
+
|
337 |
+
# Files built by Visual Studio
|
338 |
+
*_i.c
|
339 |
+
*_p.c
|
340 |
+
*_h.h
|
341 |
+
*.ilk
|
342 |
+
*.meta
|
343 |
+
*.obj
|
344 |
+
*.iobj
|
345 |
+
*.pch
|
346 |
+
*.pdb
|
347 |
+
*.ipdb
|
348 |
+
*.pgc
|
349 |
+
*.pgd
|
350 |
+
*.rsp
|
351 |
+
*.sbr
|
352 |
+
*.tlb
|
353 |
+
*.tli
|
354 |
+
*.tlh
|
355 |
+
*.tmp
|
356 |
+
*.tmp_proj
|
357 |
+
*_wpftmp.csproj
|
358 |
+
*.log
|
359 |
+
*.vspscc
|
360 |
+
*.vssscc
|
361 |
+
.builds
|
362 |
+
*.pidb
|
363 |
+
*.svclog
|
364 |
+
*.scc
|
365 |
+
|
366 |
+
# Chutzpah Test files
|
367 |
+
_Chutzpah*
|
368 |
+
|
369 |
+
# Visual C++ cache files
|
370 |
+
ipch/
|
371 |
+
*.aps
|
372 |
+
*.ncb
|
373 |
+
*.opendb
|
374 |
+
*.opensdf
|
375 |
+
*.sdf
|
376 |
+
*.cachefile
|
377 |
+
*.VC.db
|
378 |
+
*.VC.VC.opendb
|
379 |
+
|
380 |
+
# Visual Studio profiler
|
381 |
+
*.psess
|
382 |
+
*.vsp
|
383 |
+
*.vspx
|
384 |
+
*.sap
|
385 |
+
|
386 |
+
# Visual Studio Trace Files
|
387 |
+
*.e2e
|
388 |
+
|
389 |
+
# TFS 2012 Local Workspace
|
390 |
+
$tf/
|
391 |
+
|
392 |
+
# Guidance Automation Toolkit
|
393 |
+
*.gpState
|
394 |
+
|
395 |
+
# ReSharper is a .NET coding add-in
|
396 |
+
_ReSharper*/
|
397 |
+
*.[Rr]e[Ss]harper
|
398 |
+
*.DotSettings.user
|
399 |
+
|
400 |
+
# TeamCity is a build add-in
|
401 |
+
_TeamCity*
|
402 |
+
|
403 |
+
# DotCover is a Code Coverage Tool
|
404 |
+
*.dotCover
|
405 |
+
|
406 |
+
# AxoCover is a Code Coverage Tool
|
407 |
+
.axoCover/*
|
408 |
+
!.axoCover/settings.json
|
409 |
+
|
410 |
+
# Coverlet is a free, cross platform Code Coverage Tool
|
411 |
+
coverage*.json
|
412 |
+
coverage*.xml
|
413 |
+
coverage*.info
|
414 |
+
|
415 |
+
# Visual Studio code coverage results
|
416 |
+
*.coverage
|
417 |
+
*.coveragexml
|
418 |
+
|
419 |
+
# NCrunch
|
420 |
+
_NCrunch_*
|
421 |
+
.*crunch*.local.xml
|
422 |
+
nCrunchTemp_*
|
423 |
+
|
424 |
+
# MightyMoose
|
425 |
+
*.mm.*
|
426 |
+
AutoTest.Net/
|
427 |
+
|
428 |
+
# Web workbench (sass)
|
429 |
+
.sass-cache/
|
430 |
+
|
431 |
+
# Installshield output folder
|
432 |
+
[Ee]xpress/
|
433 |
+
|
434 |
+
# DocProject is a documentation generator add-in
|
435 |
+
DocProject/buildhelp/
|
436 |
+
DocProject/Help/*.HxT
|
437 |
+
DocProject/Help/*.HxC
|
438 |
+
DocProject/Help/*.hhc
|
439 |
+
DocProject/Help/*.hhk
|
440 |
+
DocProject/Help/*.hhp
|
441 |
+
DocProject/Help/Html2
|
442 |
+
DocProject/Help/html
|
443 |
+
|
444 |
+
# Click-Once directory
|
445 |
+
publish/
|
446 |
+
|
447 |
+
# Publish Web Output
|
448 |
+
*.[Pp]ublish.xml
|
449 |
+
*.azurePubxml
|
450 |
+
# Note: Comment the next line if you want to checkin your web deploy settings,
|
451 |
+
# but database connection strings (with potential passwords) will be unencrypted
|
452 |
+
*.pubxml
|
453 |
+
*.publishproj
|
454 |
+
|
455 |
+
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
456 |
+
# checkin your Azure Web App publish settings, but sensitive information contained
|
457 |
+
# in these scripts will be unencrypted
|
458 |
+
PublishScripts/
|
459 |
+
|
460 |
+
# NuGet Packages
|
461 |
+
*.nupkg
|
462 |
+
# NuGet Symbol Packages
|
463 |
+
*.snupkg
|
464 |
+
# The packages folder can be ignored because of Package Restore
|
465 |
+
**/[Pp]ackages/*
|
466 |
+
# except build/, which is used as an MSBuild target.
|
467 |
+
!**/[Pp]ackages/build/
|
468 |
+
# Uncomment if necessary however generally it will be regenerated when needed
|
469 |
+
#!**/[Pp]ackages/repositories.config
|
470 |
+
# NuGet v3's project.json files produces more ignorable files
|
471 |
+
*.nuget.props
|
472 |
+
*.nuget.targets
|
473 |
+
|
474 |
+
# Microsoft Azure Build Output
|
475 |
+
csx/
|
476 |
+
*.build.csdef
|
477 |
+
|
478 |
+
# Microsoft Azure Emulator
|
479 |
+
ecf/
|
480 |
+
rcf/
|
481 |
+
|
482 |
+
# Windows Store app package directories and files
|
483 |
+
AppPackages/
|
484 |
+
BundleArtifacts/
|
485 |
+
Package.StoreAssociation.xml
|
486 |
+
_pkginfo.txt
|
487 |
+
*.appx
|
488 |
+
*.appxbundle
|
489 |
+
*.appxupload
|
490 |
+
|
491 |
+
# Visual Studio cache files
|
492 |
+
# files ending in .cache can be ignored
|
493 |
+
*.[Cc]ache
|
494 |
+
# but keep track of directories ending in .cache
|
495 |
+
!?*.[Cc]ache/
|
496 |
+
|
497 |
+
# Others
|
498 |
+
ClientBin/
|
499 |
+
~$*
|
500 |
+
*~
|
501 |
+
*.dbmdl
|
502 |
+
*.dbproj.schemaview
|
503 |
+
*.jfm
|
504 |
+
*.pfx
|
505 |
+
*.publishsettings
|
506 |
+
orleans.codegen.cs
|
507 |
+
|
508 |
+
# Including strong name files can present a security risk
|
509 |
+
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
510 |
+
#*.snk
|
511 |
+
|
512 |
+
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
513 |
+
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
514 |
+
#bower_components/
|
515 |
+
|
516 |
+
# RIA/Silverlight projects
|
517 |
+
Generated_Code/
|
518 |
+
|
519 |
+
# Backup & report files from converting an old project file
|
520 |
+
# to a newer Visual Studio version. Backup files are not needed,
|
521 |
+
# because we have git ;-)
|
522 |
+
_UpgradeReport_Files/
|
523 |
+
Backup*/
|
524 |
+
UpgradeLog*.XML
|
525 |
+
UpgradeLog*.htm
|
526 |
+
ServiceFabricBackup/
|
527 |
+
*.rptproj.bak
|
528 |
+
|
529 |
+
# SQL Server files
|
530 |
+
*.mdf
|
531 |
+
*.ldf
|
532 |
+
*.ndf
|
533 |
+
|
534 |
+
# Business Intelligence projects
|
535 |
+
*.rdl.data
|
536 |
+
*.bim.layout
|
537 |
+
*.bim_*.settings
|
538 |
+
*.rptproj.rsuser
|
539 |
+
*- [Bb]ackup.rdl
|
540 |
+
*- [Bb]ackup ([0-9]).rdl
|
541 |
+
*- [Bb]ackup ([0-9][0-9]).rdl
|
542 |
+
|
543 |
+
# Microsoft Fakes
|
544 |
+
FakesAssemblies/
|
545 |
+
|
546 |
+
# GhostDoc plugin setting file
|
547 |
+
*.GhostDoc.xml
|
548 |
+
|
549 |
+
# Node.js Tools for Visual Studio
|
550 |
+
.ntvs_analysis.dat
|
551 |
+
node_modules/
|
552 |
+
|
553 |
+
# Visual Studio 6 build log
|
554 |
+
*.plg
|
555 |
+
|
556 |
+
# Visual Studio 6 workspace options file
|
557 |
+
*.opt
|
558 |
+
|
559 |
+
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
560 |
+
*.vbw
|
561 |
+
|
562 |
+
# Visual Studio LightSwitch build output
|
563 |
+
**/*.HTMLClient/GeneratedArtifacts
|
564 |
+
**/*.DesktopClient/GeneratedArtifacts
|
565 |
+
**/*.DesktopClient/ModelManifest.xml
|
566 |
+
**/*.Server/GeneratedArtifacts
|
567 |
+
**/*.Server/ModelManifest.xml
|
568 |
+
_Pvt_Extensions
|
569 |
+
|
570 |
+
# Paket dependency manager
|
571 |
+
.paket/paket.exe
|
572 |
+
paket-files/
|
573 |
+
|
574 |
+
# FAKE - F# Make
|
575 |
+
.fake/
|
576 |
+
|
577 |
+
# CodeRush personal settings
|
578 |
+
.cr/personal
|
579 |
+
|
580 |
+
# Python Tools for Visual Studio (PTVS)
|
581 |
+
__pycache__/
|
582 |
+
*.pyc
|
583 |
+
|
584 |
+
# Cake - Uncomment if you are using it
|
585 |
+
# tools/**
|
586 |
+
# !tools/packages.config
|
587 |
+
|
588 |
+
# Tabs Studio
|
589 |
+
*.tss
|
590 |
+
|
591 |
+
# Telerik's JustMock configuration file
|
592 |
+
*.jmconfig
|
593 |
+
|
594 |
+
# BizTalk build output
|
595 |
+
*.btp.cs
|
596 |
+
*.btm.cs
|
597 |
+
*.odx.cs
|
598 |
+
*.xsd.cs
|
599 |
+
|
600 |
+
# OpenCover UI analysis results
|
601 |
+
OpenCover/
|
602 |
+
|
603 |
+
# Azure Stream Analytics local run output
|
604 |
+
ASALocalRun/
|
605 |
+
|
606 |
+
# MSBuild Binary and Structured Log
|
607 |
+
*.binlog
|
608 |
+
|
609 |
+
# NVidia Nsight GPU debugger configuration file
|
610 |
+
*.nvuser
|
611 |
+
|
612 |
+
# MFractors (Xamarin productivity tool) working folder
|
613 |
+
.mfractor/
|
614 |
+
|
615 |
+
# Local History for Visual Studio
|
616 |
+
.localhistory/
|
617 |
+
|
618 |
+
# BeatPulse healthcheck temp database
|
619 |
+
healthchecksdb
|
620 |
+
|
621 |
+
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
622 |
+
MigrationBackup/
|
623 |
+
|
624 |
+
# Ionide (cross platform F# VS Code tools) working folder
|
625 |
+
.ionide/
|
626 |
+
|
627 |
+
# Fody - auto-generated XML schema
|
628 |
+
FodyWeavers.xsd
|
629 |
+
|
630 |
+
### Vim template
|
631 |
+
# Swap
|
632 |
+
[._]*.s[a-v][a-z]
|
633 |
+
!*.svg # comment out if you don't need vector files
|
634 |
+
[._]*.sw[a-p]
|
635 |
+
[._]s[a-rt-v][a-z]
|
636 |
+
[._]ss[a-gi-z]
|
637 |
+
[._]sw[a-p]
|
638 |
+
|
639 |
+
# Session
|
640 |
+
Session.vim
|
641 |
+
Sessionx.vim
|
642 |
+
|
643 |
+
# Temporary
|
644 |
+
.netrwhist
|
645 |
+
*~
|
646 |
+
# Auto-generated tag files
|
647 |
+
tags
|
648 |
+
# Persistent undo
|
649 |
+
[._]*.un~
|
650 |
+
|
651 |
+
### Backup template
|
652 |
+
*.bak
|
653 |
+
*.gho
|
654 |
+
*.ori
|
655 |
+
*.orig
|
656 |
+
*.tmp
|
657 |
+
|
658 |
+
### SublimeText template
|
659 |
+
# Cache files for Sublime Text
|
660 |
+
*.tmlanguage.cache
|
661 |
+
*.tmPreferences.cache
|
662 |
+
*.stTheme.cache
|
663 |
+
|
664 |
+
# Workspace files are user-specific
|
665 |
+
*.sublime-workspace
|
666 |
+
|
667 |
+
# Project files should be checked into the repository, unless a significant
|
668 |
+
# proportion of contributors will probably not be using Sublime Text
|
669 |
+
# *.sublime-project
|
670 |
+
|
671 |
+
# SFTP configuration file
|
672 |
+
sftp-config.json
|
673 |
+
sftp-config-alt*.json
|
674 |
+
|
675 |
+
# Package control specific files
|
676 |
+
Package Control.last-run
|
677 |
+
Package Control.ca-list
|
678 |
+
Package Control.ca-bundle
|
679 |
+
Package Control.system-ca-bundle
|
680 |
+
Package Control.cache/
|
681 |
+
Package Control.ca-certs/
|
682 |
+
Package Control.merged-ca-bundle
|
683 |
+
Package Control.user-ca-bundle
|
684 |
+
oscrypto-ca-bundle.crt
|
685 |
+
bh_unicode_properties.cache
|
686 |
+
|
687 |
+
# Sublime-github package stores a github token in this file
|
688 |
+
# https://packagecontrol.io/packages/sublime-github
|
689 |
+
GitHub.sublime-settings
|
690 |
+
|
691 |
+
### C template
|
692 |
+
# Prerequisites
|
693 |
+
*.d
|
694 |
+
|
695 |
+
# Object files
|
696 |
+
*.o
|
697 |
+
*.ko
|
698 |
+
*.obj
|
699 |
+
*.elf
|
700 |
+
|
701 |
+
# Linker output
|
702 |
+
*.ilk
|
703 |
+
*.map
|
704 |
+
*.exp
|
705 |
+
|
706 |
+
# Precompiled Headers
|
707 |
+
*.gch
|
708 |
+
*.pch
|
709 |
+
|
710 |
+
# Libraries
|
711 |
+
*.lib
|
712 |
+
*.a
|
713 |
+
*.la
|
714 |
+
*.lo
|
715 |
+
|
716 |
+
# Shared objects (inc. Windows DLLs)
|
717 |
+
*.dll
|
718 |
+
*.so
|
719 |
+
*.so.*
|
720 |
+
*.dylib
|
721 |
+
|
722 |
+
# Executables
|
723 |
+
*.exe
|
724 |
+
*.out
|
725 |
+
*.app
|
726 |
+
*.i*86
|
727 |
+
*.x86_64
|
728 |
+
*.hex
|
729 |
+
|
730 |
+
# Debug files
|
731 |
+
*.dSYM/
|
732 |
+
*.su
|
733 |
+
*.idb
|
734 |
+
*.pdb
|
735 |
+
|
736 |
+
# Kernel Module Compile Results
|
737 |
+
*.mod*
|
738 |
+
*.cmd
|
739 |
+
.tmp_versions/
|
740 |
+
modules.order
|
741 |
+
Module.symvers
|
742 |
+
Mkfile.old
|
743 |
+
dkms.conf
|
744 |
+
|
745 |
+
### VirtualEnv template
|
746 |
+
# Virtualenv
|
747 |
+
# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
|
748 |
+
.Python
|
749 |
+
[Bb]in
|
750 |
+
[Ii]nclude
|
751 |
+
[Ll]ib
|
752 |
+
[Ll]ib64
|
753 |
+
[Ll]ocal
|
754 |
+
[Ss]cripts
|
755 |
+
pyvenv.cfg
|
756 |
+
.venv
|
757 |
+
pip-selfcheck.json
|
758 |
+
|
759 |
+
### LibreOffice template
|
760 |
+
# LibreOffice locks
|
761 |
+
.~lock.*#
|
762 |
+
|
763 |
+
### Xilinx template
|
764 |
+
# gitignore template for Xilinx Vivado Design Suite
|
765 |
+
# website: https://www.xilinx.com/support/download.html
|
766 |
+
|
767 |
+
# [home]
|
768 |
+
*.jou
|
769 |
+
*.log
|
770 |
+
*.debug
|
771 |
+
*.str
|
772 |
+
*.tmp
|
773 |
+
*.os
|
774 |
+
*.js
|
775 |
+
*.pb
|
776 |
+
*.dcp
|
777 |
+
*.hwdef
|
778 |
+
*.vds
|
779 |
+
*.veo
|
780 |
+
*.wdf
|
781 |
+
*.vdi
|
782 |
+
*.dmp
|
783 |
+
*.rpx
|
784 |
+
*.rpt
|
785 |
+
*_stub.v
|
786 |
+
*_stub.vhdl
|
787 |
+
*_funcsim.v
|
788 |
+
*_funcsim.vhdl
|
789 |
+
.project
|
790 |
+
|
791 |
+
# [dir]
|
792 |
+
*.cache
|
793 |
+
.metadata
|
794 |
+
*.data
|
795 |
+
*.ipdefs
|
796 |
+
.Xil
|
797 |
+
*.sdk
|
798 |
+
*.hw
|
799 |
+
*.ip_user_files
|
800 |
+
|
801 |
+
### IP synth
|
802 |
+
*_synth_*
|
803 |
+
|
804 |
+
.jobs
|
805 |
+
|
806 |
+
### project synth
|
807 |
+
*/*.runs/synth*/*.xml
|
808 |
+
*/*.runs/synth*/*.txt
|
809 |
+
*/*.runs/synth*/*.sh
|
810 |
+
*/*.runs/synth*/*.tcl
|
811 |
+
*/*.runs/synth*/*.bat
|
812 |
+
*/*.runs/synth*/*.xdc
|
813 |
+
!*/*.runs/synth*/*utilization*.rpt
|
814 |
+
|
815 |
+
*.runs/synth*/*.xml
|
816 |
+
*.runs/synth*/*.txt
|
817 |
+
*.runs/synth*/*.sh
|
818 |
+
*.runs/synth*/*.tcl
|
819 |
+
*.runs/synth*/*.bat
|
820 |
+
*.runs/synth*/*.xdc
|
821 |
+
!*.runs/synth*/*utilization*.rpt
|
822 |
+
|
823 |
+
### project impl
|
824 |
+
*/*.runs/impl*/*.xml
|
825 |
+
*/*.runs/impl*/*.html
|
826 |
+
*/*.runs/impl*/*.txt
|
827 |
+
*/*.runs/impl*/*.sh
|
828 |
+
*/*.runs/impl*/*.tcl
|
829 |
+
*/*.runs/impl*/*.bat
|
830 |
+
!*/*.runs/impl*/*utilization*.rpt
|
831 |
+
|
832 |
+
*.runs/impl*/*.xml
|
833 |
+
*.runs/impl*/*.html
|
834 |
+
*.runs/impl*/*.txt
|
835 |
+
*.runs/impl*/*.sh
|
836 |
+
*.runs/impl*/*.tcl
|
837 |
+
*.runs/impl*/*.bat
|
838 |
+
!*.runs/impl*/*utilization*.rpt
|
839 |
+
|
840 |
+
### block design
|
841 |
+
*/*/bd/*/hdl
|
842 |
+
*/*/*/bd/*/hdl
|
843 |
+
|
844 |
+
*/*/bd/*/*.xdc
|
845 |
+
*/*/*/bd/*/*.xdc
|
846 |
+
|
847 |
+
*/*/bd/*/ip/*/*.xdc
|
848 |
+
*/*/*/bd/*/ip/*/*.xdc
|
849 |
+
|
850 |
+
*/*/bd/*/ip/*/*/
|
851 |
+
*/*/*/bd/*/ip/*/*/
|
852 |
+
|
853 |
+
*/*/bd/*/ip/*/*.vhd
|
854 |
+
*/*/*/bd/*/ip/*/*.vhd
|
855 |
+
|
856 |
+
*/*/bd/*/ip/*/*.xml
|
857 |
+
*/*/*/bd/*/ip/*/*.xml
|
858 |
+
|
859 |
+
*.c
|
860 |
+
*.cpp
|
861 |
+
*.h
|
862 |
+
*.vho
|
863 |
+
*/*/bd/*/ip/*/*.tcl
|
864 |
+
*/*/*/bd/*/ip/*/*.tcl
|
865 |
+
hw_handoff
|
866 |
+
ipshared
|
867 |
+
|
868 |
+
### Lua template
|
869 |
+
# Compiled Lua sources
|
870 |
+
luac.out
|
871 |
+
|
872 |
+
# luarocks build files
|
873 |
+
*.src.rock
|
874 |
+
*.zip
|
875 |
+
|
876 |
+
# Object files
|
877 |
+
*.o
|
878 |
+
*.os
|
879 |
+
*.ko
|
880 |
+
*.obj
|
881 |
+
*.elf
|
882 |
+
|
883 |
+
# Precompiled Headers
|
884 |
+
*.gch
|
885 |
+
*.pch
|
886 |
+
|
887 |
+
# Libraries
|
888 |
+
*.lib
|
889 |
+
*.a
|
890 |
+
*.la
|
891 |
+
*.lo
|
892 |
+
*.def
|
893 |
+
*.exp
|
894 |
+
|
895 |
+
# Shared objects (inc. Windows DLLs)
|
896 |
+
*.dll
|
897 |
+
*.so
|
898 |
+
*.so.*
|
899 |
+
*.dylib
|
900 |
+
|
901 |
+
# Executables
|
902 |
+
*.exe
|
903 |
+
*.out
|
904 |
+
*.app
|
905 |
+
*.i*86
|
906 |
+
*.x86_64
|
907 |
+
*.hex
|
908 |
+
|
909 |
+
|
910 |
+
### Vagrant template
|
911 |
+
# General
|
912 |
+
.vagrant/
|
913 |
+
|
914 |
+
# Log files (if you are creating logs in debug mode, uncomment this)
|
915 |
+
# *.log
|
916 |
+
|
917 |
+
### PuTTY template
|
918 |
+
# Private key
|
919 |
+
*.ppk
|
920 |
+
|
921 |
+
### Patch template
|
922 |
+
*.orig
|
923 |
+
*.rej
|
924 |
+
|
925 |
+
### Python template
|
926 |
+
# Byte-compiled / optimized / DLL files
|
927 |
+
__pycache__/
|
928 |
+
*.py[cod]
|
929 |
+
*$py.class
|
930 |
+
|
931 |
+
# C extensions
|
932 |
+
*.so
|
933 |
+
|
934 |
+
# Distribution / packaging
|
935 |
+
.Python
|
936 |
+
build/
|
937 |
+
develop-eggs/
|
938 |
+
/dist
|
939 |
+
wheelhouse/
|
940 |
+
downloads/
|
941 |
+
eggs/
|
942 |
+
.eggs/
|
943 |
+
lib/
|
944 |
+
lib64/
|
945 |
+
parts/
|
946 |
+
sdist/
|
947 |
+
var/
|
948 |
+
wheels/
|
949 |
+
share/python-wheels/
|
950 |
+
*.egg-info/
|
951 |
+
.installed.cfg
|
952 |
+
*.egg
|
953 |
+
MANIFEST
|
954 |
+
|
955 |
+
# PyInstaller
|
956 |
+
# Usually these files are written by a python script from a template
|
957 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
958 |
+
*.manifest
|
959 |
+
*.spec
|
960 |
+
|
961 |
+
# Installer logs
|
962 |
+
pip-log.txt
|
963 |
+
pip-delete-this-directory.txt
|
964 |
+
|
965 |
+
# Unit test / coverage reports
|
966 |
+
htmlcov/
|
967 |
+
.tox/
|
968 |
+
.nox/
|
969 |
+
.coverage
|
970 |
+
.coverage.*
|
971 |
+
.cache
|
972 |
+
nosetests.xml
|
973 |
+
coverage.xml
|
974 |
+
*.cover
|
975 |
+
*.py,cover
|
976 |
+
.hypothesis/
|
977 |
+
.pytest_cache/
|
978 |
+
cover/
|
979 |
+
|
980 |
+
# Translations
|
981 |
+
*.mo
|
982 |
+
*.pot
|
983 |
+
|
984 |
+
# Django stuff:
|
985 |
+
*.log
|
986 |
+
local_settings.py
|
987 |
+
db.sqlite3
|
988 |
+
db.sqlite3-journal
|
989 |
+
|
990 |
+
# Flask stuff:
|
991 |
+
instance/
|
992 |
+
.webassets-cache
|
993 |
+
|
994 |
+
# Scrapy stuff:
|
995 |
+
.scrapy
|
996 |
+
|
997 |
+
# Sphinx documentation
|
998 |
+
docs/_build/
|
999 |
+
|
1000 |
+
# PyBuilder
|
1001 |
+
.pybuilder/
|
1002 |
+
target/
|
1003 |
+
|
1004 |
+
# Jupyter Notebook
|
1005 |
+
.ipynb_checkpoints
|
1006 |
+
|
1007 |
+
# IPython
|
1008 |
+
profile_default/
|
1009 |
+
ipython_config.py
|
1010 |
+
|
1011 |
+
# pyenv
|
1012 |
+
# For a library or package, you might want to ignore these files since the code is
|
1013 |
+
# intended to run in multiple environments; otherwise, check them in:
|
1014 |
+
# .python-version
|
1015 |
+
|
1016 |
+
# pipenv
|
1017 |
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
1018 |
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
1019 |
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
1020 |
+
# install all needed dependencies.
|
1021 |
+
#Pipfile.lock
|
1022 |
+
|
1023 |
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
1024 |
+
__pypackages__/
|
1025 |
+
|
1026 |
+
# Celery stuff
|
1027 |
+
celerybeat-schedule
|
1028 |
+
celerybeat.pid
|
1029 |
+
|
1030 |
+
# SageMath parsed files
|
1031 |
+
*.sage.py
|
1032 |
+
|
1033 |
+
# Environments
|
1034 |
+
.env
|
1035 |
+
.venv
|
1036 |
+
/env/
|
1037 |
+
venv/
|
1038 |
+
ENV/
|
1039 |
+
env.bak/
|
1040 |
+
venv.bak/
|
1041 |
+
|
1042 |
+
# Spyder project settings
|
1043 |
+
.spyderproject
|
1044 |
+
.spyproject
|
1045 |
+
|
1046 |
+
# Rope project settings
|
1047 |
+
.ropeproject
|
1048 |
+
|
1049 |
+
# mkdocs documentation
|
1050 |
+
/site
|
1051 |
+
|
1052 |
+
# mypy
|
1053 |
+
.mypy_cache/
|
1054 |
+
.dmypy.json
|
1055 |
+
dmypy.json
|
1056 |
+
|
1057 |
+
# Pyre type checker
|
1058 |
+
.pyre/
|
1059 |
+
|
1060 |
+
# pytype static type analyzer
|
1061 |
+
.pytype/
|
1062 |
+
|
1063 |
+
# Cython debug symbols
|
1064 |
+
cython_debug/
|
1065 |
+
|
1066 |
+
### Windows template
|
1067 |
+
# Windows thumbnail cache files
|
1068 |
+
Thumbs.db
|
1069 |
+
Thumbs.db:encryptable
|
1070 |
+
ehthumbs.db
|
1071 |
+
ehthumbs_vista.db
|
1072 |
+
|
1073 |
+
# Dump file
|
1074 |
+
*.stackdump
|
1075 |
+
|
1076 |
+
# Folder config file
|
1077 |
+
[Dd]esktop.ini
|
1078 |
+
|
1079 |
+
# Recycle Bin used on file shares
|
1080 |
+
$RECYCLE.BIN/
|
1081 |
+
|
1082 |
+
# Windows Installer files
|
1083 |
+
*.cab
|
1084 |
+
*.msi
|
1085 |
+
*.msix
|
1086 |
+
*.msm
|
1087 |
+
*.msp
|
1088 |
+
|
1089 |
+
# Windows shortcuts
|
1090 |
+
*.lnk
|
1091 |
+
|
1092 |
+
### Xcode template
|
1093 |
+
# Xcode
|
1094 |
+
#
|
1095 |
+
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
1096 |
+
|
1097 |
+
## User settings
|
1098 |
+
xcuserdata/
|
1099 |
+
|
1100 |
+
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
|
1101 |
+
*.xcscmblueprint
|
1102 |
+
*.xccheckout
|
1103 |
+
|
1104 |
+
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
|
1105 |
+
build/
|
1106 |
+
DerivedData/
|
1107 |
+
*.moved-aside
|
1108 |
+
*.pbxuser
|
1109 |
+
!default.pbxuser
|
1110 |
+
*.mode1v3
|
1111 |
+
!default.mode1v3
|
1112 |
+
*.mode2v3
|
1113 |
+
!default.mode2v3
|
1114 |
+
*.perspectivev3
|
1115 |
+
!default.perspectivev3
|
1116 |
+
|
1117 |
+
## Gcc Patch
|
1118 |
+
/*.gcno
|
1119 |
+
|
1120 |
+
### JetBrains template
|
1121 |
+
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
1122 |
+
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
1123 |
+
|
1124 |
+
# User-specific stuff
|
1125 |
+
.idea/**/workspace.xml
|
1126 |
+
.idea/**/tasks.xml
|
1127 |
+
.idea/**/usage.statistics.xml
|
1128 |
+
.idea/**/dictionaries
|
1129 |
+
.idea/**/shelf
|
1130 |
+
|
1131 |
+
# Generated files
|
1132 |
+
.idea/**/contentModel.xml
|
1133 |
+
|
1134 |
+
# Sensitive or high-churn files
|
1135 |
+
.idea/**/dataSources/
|
1136 |
+
.idea/**/dataSources.ids
|
1137 |
+
.idea/**/dataSources.local.xml
|
1138 |
+
.idea/**/sqlDataSources.xml
|
1139 |
+
.idea/**/dynamic.xml
|
1140 |
+
.idea/**/uiDesigner.xml
|
1141 |
+
.idea/**/dbnavigator.xml
|
1142 |
+
|
1143 |
+
# Gradle
|
1144 |
+
.idea/**/gradle.xml
|
1145 |
+
.idea/**/libraries
|
1146 |
+
|
1147 |
+
# Gradle and Maven with auto-import
|
1148 |
+
# When using Gradle or Maven with auto-import, you should exclude module files,
|
1149 |
+
# since they will be recreated, and may cause churn. Uncomment if using
|
1150 |
+
# auto-import.
|
1151 |
+
# .idea/artifacts
|
1152 |
+
# .idea/compiler.xml
|
1153 |
+
# .idea/jarRepositories.xml
|
1154 |
+
# .idea/modules.xml
|
1155 |
+
# .idea/*.iml
|
1156 |
+
# .idea/modules
|
1157 |
+
# *.iml
|
1158 |
+
# *.ipr
|
1159 |
+
|
1160 |
+
# CMake
|
1161 |
+
cmake-build-*/
|
1162 |
+
|
1163 |
+
# Mongo Explorer plugin
|
1164 |
+
.idea/**/mongoSettings.xml
|
1165 |
+
|
1166 |
+
# File-based project format
|
1167 |
+
*.iws
|
1168 |
+
|
1169 |
+
# IntelliJ
|
1170 |
+
out/
|
1171 |
+
|
1172 |
+
# mpeltonen/sbt-idea plugin
|
1173 |
+
.idea_modules/
|
1174 |
+
|
1175 |
+
# JIRA plugin
|
1176 |
+
atlassian-ide-plugin.xml
|
1177 |
+
|
1178 |
+
# Cursive Clojure plugin
|
1179 |
+
.idea/replstate.xml
|
1180 |
+
|
1181 |
+
# Crashlytics plugin (for Android Studio and IntelliJ)
|
1182 |
+
com_crashlytics_export_strings.xml
|
1183 |
+
crashlytics.properties
|
1184 |
+
crashlytics-build.properties
|
1185 |
+
fabric.properties
|
1186 |
+
|
1187 |
+
# Editor-based Rest Client
|
1188 |
+
.idea/httpRequests
|
1189 |
+
|
1190 |
+
# Android studio 3.1+ serialized cache file
|
1191 |
+
.idea/caches/build_file_checksums.ser
|
1192 |
+
|
1193 |
+
/test_*
|
1194 |
+
.python-version
|
1195 |
+
/docs/build
|
1196 |
+
/public
|
1197 |
+
/docs/source/**/*.puml.svg
|
1198 |
+
/docs/source/**/*.puml.png
|
1199 |
+
/docs/source/**/*.gv.svg
|
1200 |
+
/docs/source/**/*.gv.png
|
1201 |
+
/docs/source/**/*.py.txt
|
1202 |
+
/docs/source/**/*.py.err
|
1203 |
+
/docs/source/**/*.py.exitcode
|
1204 |
+
/docs/source/**/*.sh.txt
|
1205 |
+
/docs/source/**/*.sh.err
|
1206 |
+
/docs/source/**/*.sh.exitcode
|
1207 |
+
/docs/source/**/*.dat.*
|
1208 |
+
!/docs/source/**/*.plot.py.svg
|
1209 |
+
!/docs/source/_static/**/*
|
1210 |
+
/docs/source/**/*.result.ipynb
|
1211 |
+
/cartpole_dqn_*
|
1212 |
+
/llmriddles/**/*.json
|
1213 |
+
/llmriddles/**/*.yaml
|
1214 |
+
/llmriddles/**/*.yml
|
1215 |
+
/extra
|
1216 |
+
/resource/yolort/*
|
1217 |
+
!/resource/yolort/Makefile
|
1218 |
+
!/test/testfile/**/*
|
1219 |
+
!/zoo/testfile/**/*
|
1220 |
+
/test/testfile/dataset
|
1221 |
+
/zoo/testfile/dataset
|
1222 |
+
/.train
|
1223 |
+
*.pt
|
1224 |
+
/runs
|
1225 |
+
/YOLOv8
|
LICENSE
ADDED
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Apache License
|
2 |
+
Version 2.0, January 2004
|
3 |
+
http://www.apache.org/licenses/
|
4 |
+
|
5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
6 |
+
|
7 |
+
1. Definitions.
|
8 |
+
|
9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
11 |
+
|
12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
13 |
+
the copyright owner that is granting the License.
|
14 |
+
|
15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
16 |
+
other entities that control, are controlled by, or are under common
|
17 |
+
control with that entity. For the purposes of this definition,
|
18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
19 |
+
direction or management of such entity, whether by contract or
|
20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
22 |
+
|
23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
24 |
+
exercising permissions granted by this License.
|
25 |
+
|
26 |
+
"Source" form shall mean the preferred form for making modifications,
|
27 |
+
including but not limited to software source code, documentation
|
28 |
+
source, and configuration files.
|
29 |
+
|
30 |
+
"Object" form shall mean any form resulting from mechanical
|
31 |
+
transformation or translation of a Source form, including but
|
32 |
+
not limited to compiled object code, generated documentation,
|
33 |
+
and conversions to other media types.
|
34 |
+
|
35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
36 |
+
Object form, made available under the License, as indicated by a
|
37 |
+
copyright notice that is included in or attached to the work
|
38 |
+
(an example is provided in the Appendix below).
|
39 |
+
|
40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
41 |
+
form, that is based on (or derived from) the Work and for which the
|
42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
44 |
+
of this License, Derivative Works shall not include works that remain
|
45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
46 |
+
the Work and Derivative Works thereof.
|
47 |
+
|
48 |
+
"Contribution" shall mean any work of authorship, including
|
49 |
+
the original version of the Work and any modifications or additions
|
50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
54 |
+
means any form of electronic, verbal, or written communication sent
|
55 |
+
to the Licensor or its representatives, including but not limited to
|
56 |
+
communication on electronic mailing lists, source code control systems,
|
57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
59 |
+
excluding communication that is conspicuously marked or otherwise
|
60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
61 |
+
|
62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
64 |
+
subsequently incorporated within the Work.
|
65 |
+
|
66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
71 |
+
Work and such Derivative Works in Source or Object form.
|
72 |
+
|
73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
76 |
+
(except as stated in this section) patent license to make, have made,
|
77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
78 |
+
where such license applies only to those patent claims licensable
|
79 |
+
by such Contributor that are necessarily infringed by their
|
80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
82 |
+
institute patent litigation against any entity (including a
|
83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
84 |
+
or a Contribution incorporated within the Work constitutes direct
|
85 |
+
or contributory patent infringement, then any patent licenses
|
86 |
+
granted to You under this License for that Work shall terminate
|
87 |
+
as of the date such litigation is filed.
|
88 |
+
|
89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
90 |
+
Work or Derivative Works thereof in any medium, with or without
|
91 |
+
modifications, and in Source or Object form, provided that You
|
92 |
+
meet the following conditions:
|
93 |
+
|
94 |
+
(a) You must give any other recipients of the Work or
|
95 |
+
Derivative Works a copy of this License; and
|
96 |
+
|
97 |
+
(b) You must cause any modified files to carry prominent notices
|
98 |
+
stating that You changed the files; and
|
99 |
+
|
100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
101 |
+
that You distribute, all copyright, patent, trademark, and
|
102 |
+
attribution notices from the Source form of the Work,
|
103 |
+
excluding those notices that do not pertain to any part of
|
104 |
+
the Derivative Works; and
|
105 |
+
|
106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
107 |
+
distribution, then any Derivative Works that You distribute must
|
108 |
+
include a readable copy of the attribution notices contained
|
109 |
+
within such NOTICE file, excluding those notices that do not
|
110 |
+
pertain to any part of the Derivative Works, in at least one
|
111 |
+
of the following places: within a NOTICE text file distributed
|
112 |
+
as part of the Derivative Works; within the Source form or
|
113 |
+
documentation, if provided along with the Derivative Works; or,
|
114 |
+
within a display generated by the Derivative Works, if and
|
115 |
+
wherever such third-party notices normally appear. The contents
|
116 |
+
of the NOTICE file are for informational purposes only and
|
117 |
+
do not modify the License. You may add Your own attribution
|
118 |
+
notices within Derivative Works that You distribute, alongside
|
119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
120 |
+
that such additional attribution notices cannot be construed
|
121 |
+
as modifying the License.
|
122 |
+
|
123 |
+
You may add Your own copyright statement to Your modifications and
|
124 |
+
may provide additional or different license terms and conditions
|
125 |
+
for use, reproduction, or distribution of Your modifications, or
|
126 |
+
for any such Derivative Works as a whole, provided Your use,
|
127 |
+
reproduction, and distribution of the Work otherwise complies with
|
128 |
+
the conditions stated in this License.
|
129 |
+
|
130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
132 |
+
by You to the Licensor shall be under the terms and conditions of
|
133 |
+
this License, without any additional terms or conditions.
|
134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
135 |
+
the terms of any separate license agreement you may have executed
|
136 |
+
with Licensor regarding such Contributions.
|
137 |
+
|
138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
140 |
+
except as required for reasonable and customary use in describing the
|
141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
142 |
+
|
143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
144 |
+
agreed to in writing, Licensor provides the Work (and each
|
145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
147 |
+
implied, including, without limitation, any warranties or conditions
|
148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
150 |
+
appropriateness of using or redistributing the Work and assume any
|
151 |
+
risks associated with Your exercise of permissions under this License.
|
152 |
+
|
153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
154 |
+
whether in tort (including negligence), contract, or otherwise,
|
155 |
+
unless required by applicable law (such as deliberate and grossly
|
156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
157 |
+
liable to You for damages, including any direct, indirect, special,
|
158 |
+
incidental, or consequential damages of any character arising as a
|
159 |
+
result of this License or out of the use or inability to use the
|
160 |
+
Work (including but not limited to damages for loss of goodwill,
|
161 |
+
work stoppage, computer failure or malfunction, or any and all
|
162 |
+
other commercial damages or losses), even if such Contributor
|
163 |
+
has been advised of the possibility of such damages.
|
164 |
+
|
165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
168 |
+
or other liability obligations and/or rights consistent with this
|
169 |
+
License. However, in accepting such obligations, You may act only
|
170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
171 |
+
of any other Contributor, and only if You agree to indemnify,
|
172 |
+
defend, and hold each Contributor harmless for any liability
|
173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
174 |
+
of your accepting any such warranty or additional liability.
|
175 |
+
|
176 |
+
END OF TERMS AND CONDITIONS
|
177 |
+
|
178 |
+
APPENDIX: How to apply the Apache License to your work.
|
179 |
+
|
180 |
+
To apply the Apache License to your work, attach the following
|
181 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
182 |
+
replaced with your own identifying information. (Don't include
|
183 |
+
the brackets!) The text should be enclosed in the appropriate
|
184 |
+
comment syntax for the file format. We also recommend that a
|
185 |
+
file or class name and description of purpose be included on the
|
186 |
+
same "printed page" as the copyright notice for easier
|
187 |
+
identification within third-party archives.
|
188 |
+
|
189 |
+
Copyright [yyyy] [name of copyright owner]
|
190 |
+
|
191 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
192 |
+
you may not use this file except in compliance with the License.
|
193 |
+
You may obtain a copy of the License at
|
194 |
+
|
195 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
196 |
+
|
197 |
+
Unless required by applicable law or agreed to in writing, software
|
198 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
199 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
200 |
+
See the License for the specific language governing permissions and
|
201 |
+
limitations under the License.
|
README_zh.md
ADDED
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# LLM Riddles
|
2 |
+
|
3 |
+
<div align="center">
|
4 |
+
<br>
|
5 |
+
<a href="https://github.com/opendilab/LLMRiddles/blob/main/llmriddles/assets/banner.svg">
|
6 |
+
<img src="https://github.com/opendilab/LLMRiddles/blob/main/llmriddles/assets/banner.svg" width="1000" height="200" alt="Click to see the source">
|
7 |
+
</a>
|
8 |
+
<br>
|
9 |
+
</div>
|
10 |
+
|
11 |
+
[English](https://github.com/opendilab/LLMRiddles/blob/main/README.md) | 简体中文
|
12 |
+
|
13 |
+
## :thinking: 什么是LLM Riddles
|
14 |
+
欢迎来到 LLM Riddles!这是一个与语言模型斗智斗勇的游戏。在游戏中,你需要构造与语言模型交互的问题,来得到符合要求的答案。在这个过程中,你可以开动脑筋,用你想到的所有方式,让模型输出答案要求的结果。
|
15 |
+
|
16 |
+
## :space_invader: 如何试玩
|
17 |
+
我们提供了在线版本以供玩家直接访问试玩:
|
18 |
+
- [ChatGPT + 英文(需配置api key)](https://huggingface.co/spaces/OpenDILabCommunity/LLMRiddlesChatGPTEN)
|
19 |
+
- [ChatGPT + 中文(需配置api key)](https://huggingface.co/spaces/OpenDILabCommunity/LLMRiddlesChatGPTCN)
|
20 |
+
- [Mistral + 英文(已预设api key)](https://d9b451a97791dd8ef3.gradio.live)
|
21 |
+
- [ChatGPT + 中文(已预设api key)](http://llmriddles.opendilab.net/)
|
22 |
+
|
23 |
+
本地部署可以通过以下方式:
|
24 |
+
## 安装
|
25 |
+
### ChatGPT 或 ChatGLM API
|
26 |
+
```shell
|
27 |
+
pip3 install -r requirements.txt
|
28 |
+
```
|
29 |
+
### Mistral-7B-Instruct-v0.1 本地推理
|
30 |
+
```shell
|
31 |
+
pip3 install -r requirements-dev.txt
|
32 |
+
```
|
33 |
+
## 启动
|
34 |
+
### ChatGPT + 中文
|
35 |
+
```shell
|
36 |
+
QUESTION_LANG=cn QUESTION_LLM='chatgpt' QUESTION_LLM_KEY=<your API key> python3 -u app.py
|
37 |
+
```
|
38 |
+
### ChatGPT + 英文
|
39 |
+
```shell
|
40 |
+
QUESTION_LANG=en QUESTION_LLM='chatgpt' QUESTION_LLM_KEY=<your API key> python3 -u app.py
|
41 |
+
```
|
42 |
+
### ChatGLM + 中文
|
43 |
+
```shell
|
44 |
+
QUESTION_LANG=cn QUESTION_LLM='chatglm' QUESTION_LLM_KEY=<your API key> python3 -u app.py
|
45 |
+
```
|
46 |
+
### ChatGLM + 英文
|
47 |
+
```shell
|
48 |
+
QUESTION_LANG=en QUESTION_LLM='chatglm' QUESTION_LLM_KEY=<your API key> python3 -u app.py
|
49 |
+
```
|
50 |
+
### Mistral-7B-Instruct-v0.1 + 英文
|
51 |
+
```shell
|
52 |
+
QUESTION_LANG=en QUESTION_LLM='mistral-7b' python3 -u app.py
|
53 |
+
```
|
54 |
+
## :technologist: 为什么制作这个游戏
|
55 |
+
|
56 |
+
我们的目标是通过这一游戏,让参与者深入领略到提示工程(prompt engineering)和自然语言处理的令人着迷之处。这个过程将向玩家们展示,如何巧妙地构建提示词(prompts),以及如何运用它们来引发人工智能系统的惊人反应,同时也帮助他们更好地理解深度学习和自然语言处理技术的不可思议之处。
|
57 |
+
|
58 |
+
## :raising_hand: 如何提交设计好的关卡
|
59 |
+
如果有好玩的问题或想法,欢迎玩家提交自己的创意,可以
|
60 |
+
[发起 Pull Request](https://github.com/opendilab/LLMRiddles/compare) 向我们提交, 我们会在审核通过后收录至关卡中。
|
61 |
+
问题的设计格式应包含以下几点:
|
62 |
+
- Pull Request标题,示例:feature(username): 章节X-关卡设计
|
63 |
+
- 希望被提及的ID
|
64 |
+
- 对应章节问题文件的修改
|
65 |
+
- \__init__.py的修改
|
66 |
+
|
67 |
+
完整示例请参考:[提交属于自己的关卡设计](https://github.com/opendilab/LLMRiddles/pull/6)
|
68 |
+
|
69 |
+
## :writing_hand: 未来计划
|
70 |
+
|
71 |
+
- [x] 支持自定义关卡
|
72 |
+
- [x] 在线试玩链接
|
73 |
+
- [x] Hugging Face Space 链接
|
74 |
+
- [x] 支持Mistral-7B(英文)
|
75 |
+
- [x] 支持ChatGLM(中文和英文)
|
76 |
+
- [ ] 支持Baichuan2-7B(中文)
|
77 |
+
- [ ] 支持LLaMA2-7B(英文)
|
78 |
+
- [ ] LLM 推理速度优化
|
79 |
+
|
80 |
+
## :speech_balloon: 反馈问题 & 提出建议
|
81 |
+
- 在 GitHub 上[发起 Issue](https://github.com/opendilab/CodeMorpheus/issues/new/choose)
|
82 |
+
- 通过邮件与我们联系 ([email protected])
|
83 |
+
- 在OpenDILab的群组中加入讨论(通过 WeChat: ding314assist 添加小助手微信)
|
84 |
+
<img src=https://github.com/opendilab/LLMRiddles/blob/main/llmriddles/assets/wechat.jpeg width=35% />
|
85 |
+
|
86 |
+
## :star2: Special Thanks
|
87 |
+
- 感谢 [Haoqiang Fan](https://www.zhihu.com/people/haoqiang-fan) 的原始创意和题目,为本项目的开发和扩展提供了灵感与动力。
|
88 |
+
- 感谢 [HuggingFace](https://huggingface.co) 对游戏的支持与协助。
|
89 |
+
- 感谢 [ChatGLM](https://chatglm.cn/) 对游戏的支持与协助,特别是供在线预览版使用的足量 tokens。
|
90 |
+
- 感谢 [LLM Riddles contributors](https://github.com/opendilab/LLMRiddles/graphs/contributors) 的实现与支持。
|
91 |
+
|
92 |
+
## :label: License
|
93 |
+
All code within this repository is under [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0).
|
94 |
+
|
95 |
+
<p align="right">(<a href="#top">back to top</a>)</p>
|
app.py
ADDED
@@ -0,0 +1,266 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import logging
|
2 |
+
import os
|
3 |
+
import uuid
|
4 |
+
|
5 |
+
import gradio as gr
|
6 |
+
|
7 |
+
from llmriddles.questions import QuestionExecutor
|
8 |
+
from llmriddles.questions import list_ordered_questions
|
9 |
+
|
10 |
+
_QUESTION_SESSIONS = {}
|
11 |
+
count = 0
|
12 |
+
_QUESTIONS = list_ordered_questions()
|
13 |
+
_LANG = os.environ.get('QUESTION_LANG', 'cn')
|
14 |
+
assert _LANG in ['cn', 'en'], _LANG
|
15 |
+
_LLM = os.environ.get('QUESTION_LLM', 'chatgpt')
|
16 |
+
assert _LLM in ['chatgpt', 'chatglm', 'mistral-7b'], _LLM
|
17 |
+
_LLM_KEY = os.environ.get('QUESTION_LLM_KEY', None)
|
18 |
+
_DEBUG = os.environ.get('DEBUG', 'false').lower() == 'true'
|
19 |
+
|
20 |
+
if _DEBUG:
|
21 |
+
logging.getLogger().setLevel(logging.INFO)
|
22 |
+
else:
|
23 |
+
logging.getLogger().setLevel(logging.WARNING)
|
24 |
+
if _LANG == "cn":
|
25 |
+
title = "完蛋!我被 LLM 拿捏了"
|
26 |
+
requirement_ph = """
|
27 |
+
<h2 style="color: #6d28d9;"> 欢迎来到 LLM Riddles! </h2>
|
28 |
+
<h4> 你将通过本游戏对大语言模型产生更深刻的理解。在本游戏中,你需要构造一个提给语言大模型的问题,使得它回复的答案符合题目要求。点击<i>\"下一题\"</i> 即可开始游戏。</h4>
|
29 |
+
"""
|
30 |
+
requirement_label = "游戏须知/说明"
|
31 |
+
question_ph = "你对大语言模型的提问(例如:请你输出1+1=3)"
|
32 |
+
question_label = "玩家提问栏"
|
33 |
+
answer_ph = "大语言模型的回答"
|
34 |
+
answer_label = "大语言模型回答栏"
|
35 |
+
submit_label = "提交"
|
36 |
+
next_label = "下一题"
|
37 |
+
api_ph = "你个人的大语言模型 API Key (例如:ChatGPT)"
|
38 |
+
api_label = "API key"
|
39 |
+
predict_label = "结果正确性"
|
40 |
+
explanation_label = "结果详细解释"
|
41 |
+
game_cleared_label = "<h2 style='color: #6d28d9;'>祝贺!你已成功通关!</h2>"
|
42 |
+
correct_label = "正确"
|
43 |
+
wrong_label = "错误"
|
44 |
+
api_error_info = "请在提交问题之前先输入你的 API Key"
|
45 |
+
try_again_label = "再玩一次"
|
46 |
+
select_label = "选择关卡(投机取巧需谨慎)"
|
47 |
+
title_markdown = """
|
48 |
+
<div align="center">
|
49 |
+
<img src="https://raw.githubusercontent.com/opendilab/LLMRiddles/main/llmriddles/assets/banner.svg" width="80%" height="20%" alt="Banner Image">
|
50 |
+
</div>
|
51 |
+
<h2 style="text-align: center; color: black;"><a href="https://github.com/OpenDILab/LLMRiddles"> 🎭LLM Riddles:完蛋!我被 LLM 拿捏了</a></h2>
|
52 |
+
<strong><h5 align="center"> 更多不同语言模型的在线试玩 demo 可以访问 GitHub<a href="https://github.com/OpenDILab/LLMRiddles">源代码仓库</a>获取<h5></strong>
|
53 |
+
<h5 align="center"> 如果你喜欢这个项目,请给我们在 GitHub 点个 star ✨ <a href="https://github.com/OpenDILab/LLMRiddles"> 代码仓库传送门 </a> 。我们将会持续保持更新。再次感谢游戏<a href="https://www.zhihu.com/people/haoqiang-fan"> 原作者 </a>的奇思妙想! </h5>
|
54 |
+
<strong><h5 align="center">注意:算法模型的输出可能包含一定的随机性。相关结果不代表任何开发者和相关 AI 服务的态度和意见。本项目开发者不对生成结果作任何保证,仅供娱乐。<h5></strong>
|
55 |
+
"""
|
56 |
+
tos_markdown = """
|
57 |
+
### 使用条款
|
58 |
+
玩家使用本服务须同意以下条款:
|
59 |
+
该服务是一项探索性研究预览版,仅供非商业用途。它仅提供有限的安全措施,并可能生成令人反感的内容。不得将其用于任何非法、有害、暴力、种族主义等目的。该服务可能会收集玩家对话数据以供未来研究之用。
|
60 |
+
如果您的游玩体验有不佳之处,请发送邮件至 [email protected] ! 我们将删除相关信息,并不断改进这个项目。
|
61 |
+
为了获得最佳体验,请使用台式电脑进行此预览版游戏,因为移动设备可能会影响可视化效果。
|
62 |
+
**版权所有 2023 OpenDILab。**
|
63 |
+
"""
|
64 |
+
elif _LANG == "en":
|
65 |
+
title = "LLM Riddles: Oops! Rolling in LLM."
|
66 |
+
requirement_ph = """
|
67 |
+
<h2 style="color: #6d28d9;">Welcome to LLM Riddles! </h2>
|
68 |
+
<h4> In this game, you'll gain a deeper understanding of language models. Your challenge is to create a question to ask a language model in a way that the answer it provides meets specific criteria. Click <i>\'Next\'</i> to Start</h4>
|
69 |
+
"""
|
70 |
+
requirement_label = "Game Requirements"
|
71 |
+
question_ph = "Your Question for LLM (e.g. Please print 1+1=3)"
|
72 |
+
question_label = "Question"
|
73 |
+
answer_ph = "Answer From LLM"
|
74 |
+
answer_label = "Answer"
|
75 |
+
submit_label = "Submit"
|
76 |
+
next_label = "Next"
|
77 |
+
api_ph = "Your API Key (e.g. ChatGPT)"
|
78 |
+
api_label = "API key"
|
79 |
+
predict_label = "Correctness"
|
80 |
+
explanation_label = "Explanation"
|
81 |
+
game_cleared_label = "<h2 style='color: #6d28d9;'>Congratulations!</h2>"
|
82 |
+
correct_label = "Correct"
|
83 |
+
wrong_label = "Wrong"
|
84 |
+
api_error_info = "Please Enter API Key Before Submitting Question."
|
85 |
+
try_again_label = "Try Again"
|
86 |
+
select_label = "Select level"
|
87 |
+
title_markdown = """
|
88 |
+
<div align="center">
|
89 |
+
<img src="https://raw.githubusercontent.com/opendilab/LLMRiddles/main/llmriddles/assets/banner.svg" width="80%" height="20%" alt="Banner Image">
|
90 |
+
</div>
|
91 |
+
<h2 style="text-align: center; color: black;"><a href="https://github.com/OpenDILab/LLMRiddles"> 🎭LLM Riddles: Oops! Rolling in LLM.</a></h2>
|
92 |
+
<h5 align="center"> If you like our project, please give us a star ✨ on GitHub for latest update <a href="https://github.com/OpenDILab/LLMRiddles"> (Code Link) </a>. Thanks for the interesting idea of the original game <a href="https://www.zhihu.com/people/haoqiang-fan"> author </a>. </h5>
|
93 |
+
<strong><h5 align="center">Notice: The output is generated by algorithm scheme and may involve some randomness. It does not represent the attitudes and opinions of any developers and AI services in this project. We do not make any guarantees about the generated content.<h5></strong>
|
94 |
+
"""
|
95 |
+
tos_markdown = """
|
96 |
+
### Terms of use
|
97 |
+
By using this service, players are required to agree to the following terms:
|
98 |
+
The service is a research preview intended for non-commercial use only. It only provides limited safety measures and may generate offensive content. It must not be used for any illegal, harmful, violent, racist, or sexual purposes. The service may collect user dialogue data for future research.
|
99 |
+
Please send email to [email protected] if you get any inappropriate answer! We will delete those and keep improving our moderator.
|
100 |
+
For an optimal experience, please use desktop computers for this demo, as mobile devices may compromise its quality.
|
101 |
+
**Copyright 2023 OpenDILab.**
|
102 |
+
"""
|
103 |
+
else:
|
104 |
+
raise KeyError("invalid _LANG: {}".format(_LANG))
|
105 |
+
|
106 |
+
|
107 |
+
def _need_api_key():
|
108 |
+
return (_LLM == 'chatgpt' or _LLM == 'chatglm') and _LLM_KEY is None
|
109 |
+
|
110 |
+
|
111 |
+
def _get_api_key_cfgs(api_key):
|
112 |
+
if _LLM == 'chatgpt':
|
113 |
+
return {'api_key': api_key}
|
114 |
+
elif _LLM == 'chatglm':
|
115 |
+
return {'api_key': api_key}
|
116 |
+
else:
|
117 |
+
return {}
|
118 |
+
|
119 |
+
|
120 |
+
if __name__ == '__main__':
|
121 |
+
with gr.Blocks(title=title, theme='ParityError/Interstellar') as demo:
|
122 |
+
gr.Markdown(title_markdown)
|
123 |
+
|
124 |
+
with gr.Row():
|
125 |
+
gr_requirement = gr.HTML(value=requirement_ph, label=requirement_label)
|
126 |
+
with gr.Row():
|
127 |
+
with gr.Column():
|
128 |
+
gr_question = gr.TextArea(placeholder=question_ph, label=question_label)
|
129 |
+
gr_api_key = gr.Text(placeholder=api_ph, label=api_label, type='password', visible=_need_api_key())
|
130 |
+
with gr.Row():
|
131 |
+
gr_submit = gr.Button(submit_label, interactive=False)
|
132 |
+
gr_next = gr.Button(next_label)
|
133 |
+
with gr.Row():
|
134 |
+
gr_select = gr.Radio(
|
135 |
+
choices=[(QuestionExecutor(q, _LANG).question_name, i) for i, q in enumerate(_QUESTIONS)],
|
136 |
+
label=select_label
|
137 |
+
)
|
138 |
+
|
139 |
+
with gr.Column():
|
140 |
+
gr_uuid = gr.Text(value='', visible=False)
|
141 |
+
gr_predict = gr.Label(label=predict_label)
|
142 |
+
gr_answer = gr.TextArea(label=answer_label, lines=3)
|
143 |
+
gr_explanation = gr.TextArea(label=explanation_label, lines=1)
|
144 |
+
gr.Markdown(tos_markdown)
|
145 |
+
|
146 |
+
def _postprocess_question_text(question_text):
|
147 |
+
if _LANG == 'cn':
|
148 |
+
idx = question_text.find(',')
|
149 |
+
question_title = question_text[:idx]
|
150 |
+
former, latter = question_title.split('(')
|
151 |
+
question_title = former + ':' + latter[:-1]
|
152 |
+
question_text = f"<h2 style='color: #6d28d9;'>{question_title}</h2><h4>{question_text[idx+1:]}</h4>"
|
153 |
+
elif _LANG == 'en':
|
154 |
+
idx = question_text.find(',')
|
155 |
+
question_text = f"<h2 style='color: #6d28d9;'>{question_text[:idx]}</h2><h4>{question_text[idx+1:]}</h4>"
|
156 |
+
return question_text
|
157 |
+
|
158 |
+
|
159 |
+
def _radio_select(uuid_, select_qid):
|
160 |
+
global count
|
161 |
+
if not uuid_:
|
162 |
+
uuid_ = str(uuid.uuid4())
|
163 |
+
count += 1
|
164 |
+
logging.info(f'Player {count} starts the game now')
|
165 |
+
global _QUESTION_SESSIONS
|
166 |
+
if uuid_ not in _QUESTION_SESSIONS:
|
167 |
+
_QUESTION_SESSIONS[uuid_] = set(), select_qid
|
168 |
+
else:
|
169 |
+
_exists, _ = _QUESTION_SESSIONS[uuid_]
|
170 |
+
_QUESTION_SESSIONS[uuid_] = _exists, select_qid
|
171 |
+
|
172 |
+
executor = QuestionExecutor(_QUESTIONS[select_qid], _LANG)
|
173 |
+
question_text = _postprocess_question_text(executor.question_text)
|
174 |
+
return question_text, '', '', {}, '', \
|
175 |
+
gr.Button(submit_label, interactive=True), \
|
176 |
+
gr.Button(next_label, interactive=False), \
|
177 |
+
uuid_
|
178 |
+
|
179 |
+
gr_select.select(
|
180 |
+
_radio_select,
|
181 |
+
inputs=[gr_uuid, gr_select],
|
182 |
+
outputs=[
|
183 |
+
gr_requirement, gr_question, gr_answer,
|
184 |
+
gr_predict, gr_explanation, gr_submit, gr_next, gr_uuid,
|
185 |
+
],
|
186 |
+
)
|
187 |
+
|
188 |
+
|
189 |
+
def _next_question(uuid_):
|
190 |
+
global count
|
191 |
+
if not uuid_:
|
192 |
+
uuid_ = str(uuid.uuid4())
|
193 |
+
count += 1
|
194 |
+
logging.info(f'Player {count} starts the game now')
|
195 |
+
global _QUESTION_SESSIONS
|
196 |
+
if uuid_ in _QUESTION_SESSIONS:
|
197 |
+
_exists, _qid = _QUESTION_SESSIONS[uuid_]
|
198 |
+
else:
|
199 |
+
_exists, _qid = set(), -1
|
200 |
+
_qid += 1
|
201 |
+
_QUESTION_SESSIONS[uuid_] = _exists, _qid
|
202 |
+
|
203 |
+
if _qid >= len(_QUESTIONS):
|
204 |
+
del _QUESTION_SESSIONS[uuid_]
|
205 |
+
logging.info(f'Player {count} has passed the game now')
|
206 |
+
return game_cleared_label, '', '', {}, '', \
|
207 |
+
gr.Button(submit_label, interactive=False), \
|
208 |
+
gr.Button(try_again_label, interactive=True), \
|
209 |
+
'', \
|
210 |
+
gr.Radio(
|
211 |
+
choices=[(QuestionExecutor(q, _LANG).question_name, i) for i, q in enumerate(_QUESTIONS)],
|
212 |
+
label=select_label
|
213 |
+
)
|
214 |
+
else:
|
215 |
+
executor = QuestionExecutor(_QUESTIONS[_qid], _LANG)
|
216 |
+
question_text = _postprocess_question_text(executor.question_text)
|
217 |
+
return question_text, '', '', {}, '', \
|
218 |
+
gr.Button(submit_label, interactive=True), \
|
219 |
+
gr.Button(next_label, interactive=False), \
|
220 |
+
uuid_, \
|
221 |
+
gr.Radio(
|
222 |
+
choices=[(QuestionExecutor(q, _LANG).question_name, i) for i, q in enumerate(_QUESTIONS)],
|
223 |
+
value=_qid,
|
224 |
+
label=select_label,
|
225 |
+
)
|
226 |
+
|
227 |
+
|
228 |
+
gr_next.click(
|
229 |
+
fn=_next_question,
|
230 |
+
inputs=[gr_uuid],
|
231 |
+
outputs=[
|
232 |
+
gr_requirement, gr_question, gr_answer,
|
233 |
+
gr_predict, gr_explanation, gr_submit, gr_next,
|
234 |
+
gr_uuid, gr_select,
|
235 |
+
],
|
236 |
+
)
|
237 |
+
|
238 |
+
|
239 |
+
def _submit_answer(qs_text: str, api_key: str, uuid_: str):
|
240 |
+
global _QUESTION_SESSIONS
|
241 |
+
if _need_api_key() and not api_key:
|
242 |
+
raise gr.Error(api_error_info)
|
243 |
+
|
244 |
+
_exists, _qid = _QUESTION_SESSIONS[uuid_]
|
245 |
+
executor = QuestionExecutor(
|
246 |
+
_QUESTIONS[_qid], _LANG,
|
247 |
+
llm=_LLM, llm_cfgs=_get_api_key_cfgs(api_key) if _need_api_key() else {'api_key': _LLM_KEY}
|
248 |
+
)
|
249 |
+
answer_text, correctness, explanation = executor.check(qs_text)
|
250 |
+
labels = {correct_label: 1.0} if correctness else {wrong_label: 1.0}
|
251 |
+
if correctness:
|
252 |
+
_QUESTION_SESSIONS[uuid_] = (_exists | {_qid}), _qid
|
253 |
+
return answer_text, labels, explanation, gr.Button(next_label, interactive=True), uuid_
|
254 |
+
else:
|
255 |
+
return answer_text, labels, explanation, gr.Button(next_label, interactive=False), uuid_
|
256 |
+
|
257 |
+
|
258 |
+
gr_submit.click(
|
259 |
+
_submit_answer,
|
260 |
+
inputs=[gr_question, gr_api_key, gr_uuid],
|
261 |
+
outputs=[gr_answer, gr_predict, gr_explanation, gr_next, gr_uuid],
|
262 |
+
)
|
263 |
+
|
264 |
+
concurrency = int(os.environ.get('CONCURRENCY', os.cpu_count()))
|
265 |
+
favicon_path = os.path.join(os.path.dirname(__file__), 'llmriddles', 'assets', 'avatar.png')
|
266 |
+
demo.queue().launch(max_threads=concurrency, favicon_path=favicon_path, share=True)
|
cloc.sh
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
# This scripts counts the lines of code and comments in all source files
|
4 |
+
# and prints the results to the command line. It uses the commandline tool
|
5 |
+
# "cloc". You can either pass --loc, --comments or --percentage to show the
|
6 |
+
# respective values only.
|
7 |
+
# Some parts below need to be adapted to your project!
|
8 |
+
|
9 |
+
# Get the location of this script.
|
10 |
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
11 |
+
|
12 |
+
# Run cloc - this counts code lines, blank lines and comment lines
|
13 |
+
# for the specified languages. You will need to change this accordingly.
|
14 |
+
# For C++, you could use "C++,C/C++ Header" for example.
|
15 |
+
# We are only interested in the summary, therefore the tail -1
|
16 |
+
SUMMARY="$(cloc "${SCRIPT_DIR}" --include-lang="Python" --md | tail -1)"
|
17 |
+
|
18 |
+
# The $SUMMARY is one line of a markdown table and looks like this:
|
19 |
+
# SUM:|101|3123|2238|10783
|
20 |
+
# We use the following command to split it into an array.
|
21 |
+
IFS='|' read -r -a TOKENS <<<"$SUMMARY"
|
22 |
+
|
23 |
+
# Store the individual tokens for better readability.
|
24 |
+
NUMBER_OF_FILES=${TOKENS[1]}
|
25 |
+
COMMENT_LINES=${TOKENS[3]}
|
26 |
+
LINES_OF_CODE=${TOKENS[4]}
|
27 |
+
|
28 |
+
# To make the estimate of commented lines more accurate, we have to
|
29 |
+
# subtract any copyright header which is included in each file.
|
30 |
+
# For Fly-Pie, this header has the length of five lines.
|
31 |
+
# All dumb comments like those /////////// or those // ------------
|
32 |
+
# are also subtracted. As cloc does not count inline comments,
|
33 |
+
# the overall estimate should be rather conservative.
|
34 |
+
# Change the lines below according to your project.
|
35 |
+
# DUMB_COMMENTS="$(grep -r -E '//////|// -----' "${SCRIPT_DIR}" | wc -l)"
|
36 |
+
# COMMENT_LINES=$(($COMMENT_LINES - 5 * $NUMBER_OF_FILES - $DUMB_COMMENTS))
|
37 |
+
|
38 |
+
# Print all results if no arguments are given.
|
39 |
+
if [[ $# -eq 0 ]]; then
|
40 |
+
awk -v a=$LINES_OF_CODE \
|
41 |
+
'BEGIN {printf "Lines of source code: %6.1fk\n", a/1000}'
|
42 |
+
awk -v a=$COMMENT_LINES \
|
43 |
+
'BEGIN {printf "Lines of comments: %6.1fk\n", a/1000}'
|
44 |
+
awk -v a=$COMMENT_LINES -v b=$LINES_OF_CODE \
|
45 |
+
'BEGIN {printf "Comment Percentage: %6.1f%\n", 100*a/b}'
|
46 |
+
exit 0
|
47 |
+
fi
|
48 |
+
|
49 |
+
# Show lines of code if --loc is given.
|
50 |
+
if [[ $* == *--loc* ]]; then
|
51 |
+
awk -v a=$LINES_OF_CODE \
|
52 |
+
'BEGIN {printf "%.1fk\n", a/1000}'
|
53 |
+
fi
|
54 |
+
|
55 |
+
# Show lines of comments if --comments is given.
|
56 |
+
if [[ $* == *--comments* ]]; then
|
57 |
+
awk -v a=$COMMENT_LINES \
|
58 |
+
'BEGIN {printf "%.1fk\n", a/1000}'
|
59 |
+
fi
|
60 |
+
|
61 |
+
# Show precentage of comments if --percentage is given.
|
62 |
+
if [[ $* == *--percentage* ]]; then
|
63 |
+
awk -v a=$COMMENT_LINES -v b=$LINES_OF_CODE \
|
64 |
+
'BEGIN {printf "%.1f\n", 100*a/b}'
|
65 |
+
fi
|
llmriddles/__init__.py
ADDED
File without changes
|
llmriddles/assets/avatar.png
ADDED
llmriddles/assets/wechat.jpeg
ADDED
llmriddles/llms/__init__.py
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .base import register_llm, get_llm_fn
|
2 |
+
from .chatgpt import ask_chatgpt
|
3 |
+
from .chatglm import ask_chatglm
|
4 |
+
from .mistral import ask_mistral_7b_instruct
|
llmriddles/llms/base.py
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from typing import Callable, Dict
|
2 |
+
|
3 |
+
_LLMS: Dict[str, Callable] = {}
|
4 |
+
|
5 |
+
|
6 |
+
def register_llm(name: str, llm_ask_fn: Callable):
|
7 |
+
_LLMS[name] = llm_ask_fn
|
8 |
+
|
9 |
+
|
10 |
+
def get_llm_fn(name: str) -> Callable:
|
11 |
+
return _LLMS[name]
|
llmriddles/llms/chatglm.py
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import zhipuai
|
2 |
+
from .base import register_llm
|
3 |
+
|
4 |
+
|
5 |
+
def ask_chatglm(message: str, api_key: str):
|
6 |
+
zhipuai.api_key = api_key
|
7 |
+
|
8 |
+
response = zhipuai.model_api.invoke(
|
9 |
+
model="chatglm_turbo",
|
10 |
+
prompt=[{
|
11 |
+
"role": "user",
|
12 |
+
"content": message
|
13 |
+
}],
|
14 |
+
top_p=0.7,
|
15 |
+
temperature=0.9,
|
16 |
+
)
|
17 |
+
|
18 |
+
response_msg = response['data']['choices'][0]['content']
|
19 |
+
# strip the front and end '"'
|
20 |
+
if len(response_msg) >= 2:
|
21 |
+
response_msg = response_msg[1:-1]
|
22 |
+
|
23 |
+
return response_msg
|
24 |
+
|
25 |
+
|
26 |
+
register_llm('chatglm', ask_chatglm)
|
llmriddles/llms/chatgpt.py
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from functools import lru_cache
|
2 |
+
|
3 |
+
from openai import OpenAI
|
4 |
+
|
5 |
+
from .base import register_llm
|
6 |
+
|
7 |
+
|
8 |
+
@lru_cache()
|
9 |
+
def _get_openai_client(api_key):
|
10 |
+
return OpenAI(api_key=api_key)
|
11 |
+
|
12 |
+
|
13 |
+
def ask_chatgpt(message: str, api_key: str):
|
14 |
+
client = _get_openai_client(api_key)
|
15 |
+
|
16 |
+
response = client.chat.completions.create(
|
17 |
+
model="gpt-3.5-turbo",
|
18 |
+
messages=[
|
19 |
+
{"role": "user", "content": message}
|
20 |
+
],
|
21 |
+
)
|
22 |
+
return response.choices[0].message.content.strip()
|
23 |
+
|
24 |
+
|
25 |
+
register_llm('chatgpt', ask_chatgpt)
|
llmriddles/llms/llm_client.py
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import time
|
2 |
+
import requests
|
3 |
+
import logging
|
4 |
+
import argparse
|
5 |
+
|
6 |
+
|
7 |
+
class LLMFlaskClient:
|
8 |
+
def __init__(self, ip: str, port: int, max_retry: int = 3):
|
9 |
+
self.ip = ip
|
10 |
+
self.port = port
|
11 |
+
|
12 |
+
self.url_prefix_format = 'http://{}:{}/'
|
13 |
+
self.url = self.url_prefix_format.format(self.ip, self.port)
|
14 |
+
self.max_retry = max_retry
|
15 |
+
|
16 |
+
self.logger = logging.getLogger()
|
17 |
+
self.logger.addHandler(logging.StreamHandler())
|
18 |
+
self.logger.handlers[0].setFormatter(logging.Formatter("%(message)s"))
|
19 |
+
|
20 |
+
def _request(self, name: str, data: dict):
|
21 |
+
for _ in range(self.max_retry):
|
22 |
+
try:
|
23 |
+
self.logger.info(f'{name}\ndata: {data}')
|
24 |
+
response = requests.post(self.url + name, json=data).json()
|
25 |
+
except Exception as e:
|
26 |
+
self.logger.warning('error: ', repr(e))
|
27 |
+
time.sleep(1)
|
28 |
+
continue
|
29 |
+
if response['code'] == 0:
|
30 |
+
return response['output']
|
31 |
+
else:
|
32 |
+
raise Exception(response['error_msg'])
|
33 |
+
raise Exception("Web service failed. Please retry or contact with manager")
|
34 |
+
|
35 |
+
def run(self, message: str) -> str:
|
36 |
+
try:
|
37 |
+
return self._request('ask_llm_for_answer', {'user_text': message})
|
38 |
+
except Exception as e:
|
39 |
+
return f"Error: {repr(e)}"
|
40 |
+
|
41 |
+
|
42 |
+
if __name__ == "__main__":
|
43 |
+
parser = argparse.ArgumentParser()
|
44 |
+
parser.add_argument('--ip', required=True)
|
45 |
+
parser.add_argument('-p', '--port', required=True)
|
46 |
+
parser.add_argument('--debug', action='store_true')
|
47 |
+
args = parser.parse_args()
|
48 |
+
if args.debug:
|
49 |
+
logging.getLogger().setLevel(logging.INFO)
|
50 |
+
else:
|
51 |
+
logging.getLogger().setLevel(logging.WARNING)
|
52 |
+
|
53 |
+
client = LLMFlaskClient(args.ip, args.port)
|
54 |
+
print(client.run('Please concatenate string "1+" and "1=3". Only give me the result without "".'))
|
llmriddles/llms/llm_server.py
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
2 |
+
from flask import Flask, request
|
3 |
+
import argparse
|
4 |
+
import logging
|
5 |
+
|
6 |
+
|
7 |
+
class LLMInstance:
|
8 |
+
|
9 |
+
def __init__(self, model_path: str, device: str = "cuda"):
|
10 |
+
|
11 |
+
self.model = AutoModelForCausalLM.from_pretrained(model_path)
|
12 |
+
self.tokenizer = AutoTokenizer.from_pretrained(model_path)
|
13 |
+
self.model.to(device)
|
14 |
+
self.device = device
|
15 |
+
|
16 |
+
def query(self, message):
|
17 |
+
try:
|
18 |
+
messages = [
|
19 |
+
{"role": "user", "content": message},
|
20 |
+
]
|
21 |
+
encodeds = self.tokenizer.apply_chat_template(messages, return_tensors="pt")
|
22 |
+
model_inputs = encodeds.to(self.device)
|
23 |
+
|
24 |
+
generated_ids = self.model.generate(model_inputs, max_new_tokens=1000, do_sample=True)
|
25 |
+
decoded = self.tokenizer.batch_decode(generated_ids)
|
26 |
+
|
27 |
+
# output is the string decoded[0] after "[/INST]". There may exist "</s>", delete it.
|
28 |
+
output = decoded[0].split("[/INST]")[1].split("</s>")[0]
|
29 |
+
return {
|
30 |
+
'code': 0,
|
31 |
+
'ret': True,
|
32 |
+
'error_msg': None,
|
33 |
+
'output': output
|
34 |
+
}
|
35 |
+
except Exception as e:
|
36 |
+
return {
|
37 |
+
'code': 1,
|
38 |
+
'ret': False,
|
39 |
+
'error_msg': str(e),
|
40 |
+
'output': None
|
41 |
+
}
|
42 |
+
|
43 |
+
|
44 |
+
def create_app(core):
|
45 |
+
app = Flask(__name__)
|
46 |
+
|
47 |
+
@app.route('/ask_llm_for_answer', methods=['POST'])
|
48 |
+
def ask_llm_for_answer():
|
49 |
+
user_text = request.json['user_text']
|
50 |
+
return core.query(user_text)
|
51 |
+
|
52 |
+
return app
|
53 |
+
|
54 |
+
|
55 |
+
if __name__ == "__main__":
|
56 |
+
parser = argparse.ArgumentParser()
|
57 |
+
parser.add_argument('-m', '--model_path', required=True, default='Mistral-7B-Instruct-v0.1', help='the model path of reward model')
|
58 |
+
parser.add_argument('--ip', default='0.0.0.0')
|
59 |
+
parser.add_argument('-p', '--port', default=8001)
|
60 |
+
parser.add_argument('--debug', action='store_true')
|
61 |
+
args = parser.parse_args()
|
62 |
+
|
63 |
+
if args.debug:
|
64 |
+
logging.getLogger().setLevel(logging.DEBUG)
|
65 |
+
else:
|
66 |
+
logging.getLogger().setLevel(logging.INFO)
|
67 |
+
logging.getLogger().addHandler(logging.StreamHandler())
|
68 |
+
logging.getLogger().handlers[0].setFormatter(logging.Formatter("%(message)s"))
|
69 |
+
|
70 |
+
core = LLMInstance(args.model_path)
|
71 |
+
app = create_app(core)
|
72 |
+
app.run(host=args.ip, port=args.port)
|
llmriddles/llms/mistral.py
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from functools import lru_cache
|
2 |
+
|
3 |
+
from .base import register_llm
|
4 |
+
from .llm_client import LLMFlaskClient
|
5 |
+
|
6 |
+
|
7 |
+
@lru_cache()
|
8 |
+
def _get_mistral_7b_instruct_server(host: str, port: int):
|
9 |
+
from .llm_server import LLMInstance, create_app
|
10 |
+
core = LLMInstance('Mistral-7B-Instruct-v0.1')
|
11 |
+
app = create_app(core)
|
12 |
+
app.run(host=host, port=port)
|
13 |
+
|
14 |
+
|
15 |
+
def ask_mistral_7b_instruct(message: str, **kwargs):
|
16 |
+
host, port = '0.0.0.0', 8001
|
17 |
+
_get_mistral_7b_instruct_server(host, port)
|
18 |
+
client = LLMFlaskClient(host, port)
|
19 |
+
return client.run(message).strip()
|
20 |
+
|
21 |
+
|
22 |
+
register_llm('mistral-7b', ask_mistral_7b_instruct)
|
llmriddles/questions/__init__.py
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .executor import QuestionExecutor
|
2 |
+
from .level1 import __file__ as _level1_file_
|
3 |
+
from .level2 import __file__ as _level2_file_
|
4 |
+
from .level3 import __file__ as _level3_file_
|
5 |
+
from .level4 import __file__ as _level4_file_
|
6 |
+
from .level5 import __file__ as _level5_file_
|
7 |
+
from .question import Question, register_question, list_ordered_questions
|
8 |
+
|
9 |
+
_ = _level1_file_
|
10 |
+
_ = _level2_file_
|
11 |
+
_ = _level3_file_
|
12 |
+
_ = _level4_file_
|
13 |
+
_ = _level5_file_
|
llmriddles/questions/executor.py
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from typing import Tuple
|
2 |
+
|
3 |
+
from .question import Question
|
4 |
+
from ..llms import get_llm_fn
|
5 |
+
|
6 |
+
|
7 |
+
class QuestionExecutor:
|
8 |
+
def __init__(self, question: Question, lang: str = 'cn', llm: str = 'chatgpt', llm_cfgs=None):
|
9 |
+
self.question = question
|
10 |
+
self.lang = lang
|
11 |
+
self.llm = llm
|
12 |
+
self.llm_cfgs = dict(llm_cfgs or {})
|
13 |
+
|
14 |
+
@property
|
15 |
+
def question_text(self):
|
16 |
+
return self.question.texts[self.lang]
|
17 |
+
|
18 |
+
@property
|
19 |
+
def question_name(self):
|
20 |
+
return self.question.names[self.lang]
|
21 |
+
|
22 |
+
def check(self, qs_text: str) -> Tuple[str, bool, str]:
|
23 |
+
answer_text = get_llm_fn(self.llm)(qs_text, **self.llm_cfgs)
|
24 |
+
correct, explanation = self.check_answer(qs_text, answer_text)
|
25 |
+
return answer_text, correct, explanation
|
26 |
+
|
27 |
+
def check_answer(self, user_text: str, answer_text: str) -> Tuple[bool, str]:
|
28 |
+
correct, explanation = self.question.checker(self.question_text, user_text, answer_text, self.lang)
|
29 |
+
if explanation is None:
|
30 |
+
if correct:
|
31 |
+
explanation = 'LLM的回答满足要求' if self.lang == 'cn' else 'Correct Answer From LLM'
|
32 |
+
else:
|
33 |
+
explanation = 'LLM的回答不满足要求' if self.lang == 'cn' else 'Wrong Answer From LLM'
|
34 |
+
|
35 |
+
return correct, explanation
|
llmriddles/questions/level1.py
ADDED
@@ -0,0 +1,204 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .question import register_question
|
2 |
+
|
3 |
+
|
4 |
+
def count_english_words(text: str):
|
5 |
+
return len(text.split(' '))
|
6 |
+
|
7 |
+
|
8 |
+
def count_chinese_words(text: str):
|
9 |
+
return len(text)
|
10 |
+
|
11 |
+
|
12 |
+
def check_if_chinese(text: str):
|
13 |
+
return all('\u4e00' <= char <= '\u9fff' for char in text)
|
14 |
+
|
15 |
+
|
16 |
+
def count_words(text: str, contain_punctuation: bool = False):
|
17 |
+
chinese_words = []
|
18 |
+
english_words = []
|
19 |
+
other_words = []
|
20 |
+
temp_english_words = []
|
21 |
+
for char in text:
|
22 |
+
if '\u4e00' <= char <= '\u9fff':
|
23 |
+
chinese_words.append(char)
|
24 |
+
if len(temp_english_words) > 0:
|
25 |
+
english_words.append(''.join(temp_english_words))
|
26 |
+
temp_english_words = []
|
27 |
+
else:
|
28 |
+
if char.isalpha():
|
29 |
+
temp_english_words.append(char)
|
30 |
+
else:
|
31 |
+
if len(temp_english_words) > 0:
|
32 |
+
english_words.append(''.join(temp_english_words))
|
33 |
+
temp_english_words = []
|
34 |
+
other_words.append(char)
|
35 |
+
if contain_punctuation:
|
36 |
+
return len(chinese_words) + len(english_words) + len(other_words)
|
37 |
+
else:
|
38 |
+
return len(chinese_words) + len(english_words)
|
39 |
+
|
40 |
+
|
41 |
+
CN_TEXT_1 = """
|
42 |
+
第一章第一题(初来乍到),请你构造一个问题使模型的回答是一字不差的“1+1=3”(不需要引号)。
|
43 |
+
|
44 |
+
请在下面的输入框内填写你的构造并点击按钮提交。
|
45 |
+
"""
|
46 |
+
|
47 |
+
EN_TEXT_1 = """
|
48 |
+
For the first question in chapter 1, please construct a query for the model that will result in the exact answer "1+1=3" (no quotes needed).
|
49 |
+
|
50 |
+
Please enter your query below and click the submit button
|
51 |
+
"""
|
52 |
+
|
53 |
+
|
54 |
+
def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
55 |
+
_ = question_text, lang
|
56 |
+
answer_text = answer_text.strip()
|
57 |
+
user_text = user_text.strip()
|
58 |
+
if answer_text == '1+1=3':
|
59 |
+
return True, None
|
60 |
+
else:
|
61 |
+
return False, None
|
62 |
+
|
63 |
+
|
64 |
+
register_question(
|
65 |
+
{
|
66 |
+
'cn': CN_TEXT_1,
|
67 |
+
'en': EN_TEXT_1,
|
68 |
+
},
|
69 |
+
checkers=_checker_1,
|
70 |
+
name={'cn': '1-1 初来乍到', 'en': '1-1'},
|
71 |
+
)
|
72 |
+
|
73 |
+
CN_TEXT_2 = """
|
74 |
+
第一章第二题(小试牛刀),请你输入三个字(及)以内的问题,使模型的回答在30个字以上。
|
75 |
+
|
76 |
+
请在下面的输入框内填写你的问题并点击按钮提交。
|
77 |
+
"""
|
78 |
+
|
79 |
+
EN_TEXT_2 = """
|
80 |
+
For the second question in chapter 1, please enter a question within three words so that the model’s answer is more than 30 words.
|
81 |
+
|
82 |
+
Please enter your query below and click the submit button
|
83 |
+
"""
|
84 |
+
|
85 |
+
|
86 |
+
def _checker_2(question_text: str, user_text: str, answer_text: str, lang: str):
|
87 |
+
_ = question_text, lang
|
88 |
+
answer_text = answer_text.strip()
|
89 |
+
user_text = user_text.strip()
|
90 |
+
|
91 |
+
if count_words(user_text) > 3:
|
92 |
+
return False, "用户的问题长度应该在三个字及以内" if lang == 'cn' else 'Question should be within three words.'
|
93 |
+
elif count_words(answer_text) <= 30:
|
94 |
+
return False, "大语言模型的答案应该超过30个字" if lang == 'cn' else 'cAnswer should be more than 30 words.'
|
95 |
+
else:
|
96 |
+
return True, None
|
97 |
+
|
98 |
+
|
99 |
+
register_question(
|
100 |
+
{
|
101 |
+
'cn': CN_TEXT_2,
|
102 |
+
'en': EN_TEXT_2,
|
103 |
+
},
|
104 |
+
checkers=_checker_2,
|
105 |
+
name={'cn': '1-2 小试牛刀', 'en': '1-2'},
|
106 |
+
)
|
107 |
+
|
108 |
+
CN_TEXT_3 = """
|
109 |
+
第一章第三题(短说长话),请你输入一个字的问题,使模型的回答在100个字以上。
|
110 |
+
|
111 |
+
请在下面的输入框内填写你的问题并点击按钮提交。
|
112 |
+
"""
|
113 |
+
|
114 |
+
EN_TEXT_3 = """
|
115 |
+
For the third question in chapter 1, please enter a one-word question so that the model’s answer is more than 100 words.
|
116 |
+
|
117 |
+
Please enter your query below and click the submit button
|
118 |
+
"""
|
119 |
+
|
120 |
+
|
121 |
+
def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
122 |
+
_ = question_text, lang
|
123 |
+
answer_text = answer_text.strip()
|
124 |
+
user_text = user_text.strip()
|
125 |
+
|
126 |
+
if count_words(user_text) > 1:
|
127 |
+
return False, "用户的问题长度应该在一个字及以内" if lang == 'cn' else 'Question should be one word.'
|
128 |
+
elif count_words(answer_text) <= 100:
|
129 |
+
return False, "大语言模型的答案应该超过100个字" if lang == 'cn' else 'Answer should be more than 100 words.'
|
130 |
+
else:
|
131 |
+
return True, None
|
132 |
+
|
133 |
+
|
134 |
+
register_question(
|
135 |
+
{
|
136 |
+
'cn': CN_TEXT_3,
|
137 |
+
'en': EN_TEXT_3,
|
138 |
+
},
|
139 |
+
checkers=_checker_3,
|
140 |
+
name={'cn': '1-3 短说长话', 'en': '1-3'}
|
141 |
+
)
|
142 |
+
|
143 |
+
CN_TEXT_4 = """
|
144 |
+
第一章第四题(短说短话),请输入一个字的问题,使模型的回答字数小于20个字。
|
145 |
+
|
146 |
+
请在下面的输入框内填写你的问题并点击按钮提交。
|
147 |
+
"""
|
148 |
+
|
149 |
+
EN_TEXT_4 = """
|
150 |
+
For the fourth question in chapter 1, please enter a one-word question so that the model’s answer is less than 20 words.
|
151 |
+
|
152 |
+
Please enter your query below and click the submit button
|
153 |
+
"""
|
154 |
+
|
155 |
+
|
156 |
+
def _checker_4(question_text: str, user_text: str, answer_text: str, lang: str):
|
157 |
+
_ = question_text, lang
|
158 |
+
answer_text = answer_text.strip()
|
159 |
+
user_text = user_text.strip()
|
160 |
+
|
161 |
+
if count_words(user_text) > 1:
|
162 |
+
return False, "用户的问题长度应该在一个字及以内" if lang == 'cn' else 'Question should be one word.'
|
163 |
+
elif count_words(answer_text) >= 20:
|
164 |
+
return False, "大语言模型的答案应该小于20个字" if lang == 'cn' else 'Answer should be less than 20 words.'
|
165 |
+
else:
|
166 |
+
return True, None
|
167 |
+
|
168 |
+
|
169 |
+
register_question(
|
170 |
+
{
|
171 |
+
'cn': CN_TEXT_4,
|
172 |
+
'en': EN_TEXT_4,
|
173 |
+
},
|
174 |
+
checkers=_checker_4,
|
175 |
+
name={'cn': '1-4 短说短话', 'en': '1-4'},
|
176 |
+
)
|
177 |
+
|
178 |
+
# CN_TEXT_5 = """
|
179 |
+
# 第一章第五题(回文不变),请输入一个本身不是回文串的问题,使无论正着问还是倒着问,模型的回答是一样的。
|
180 |
+
|
181 |
+
# 请在下面的输入框内填写你的问题并点击按钮提交。
|
182 |
+
# """
|
183 |
+
|
184 |
+
# EN_TEXT_5 = """
|
185 |
+
# For the fourth question in chapter 1, please enter a question that is not a palindrome string so that the model's answer is the same whether it is asked forward or backward.
|
186 |
+
|
187 |
+
# Please enter your query below and click the submit button
|
188 |
+
# """
|
189 |
+
|
190 |
+
# def _checker_5(question_text: str, answer_text: str, lang: str):
|
191 |
+
# _ = question_text, lang
|
192 |
+
# answer_text = answer_text.strip()
|
193 |
+
|
194 |
+
# if count_words(question_text) > 0:
|
195 |
+
# return False, 'Question should be one word.'
|
196 |
+
# elif count_words(answer_text) >= 20:
|
197 |
+
# return False, 'Answer should be less than 20 words.'
|
198 |
+
# else:
|
199 |
+
# return True, None
|
200 |
+
|
201 |
+
# register_question({
|
202 |
+
# 'cn': CN_TEXT_5,
|
203 |
+
# 'en': EN_TEXT_5,
|
204 |
+
# }, _checker_5)
|
llmriddles/questions/level2.py
ADDED
@@ -0,0 +1,329 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import re
|
2 |
+
from typing import Optional, Tuple
|
3 |
+
|
4 |
+
import sympy
|
5 |
+
|
6 |
+
from .question import register_question
|
7 |
+
|
8 |
+
CN_TEXT_1 = """
|
9 |
+
第二章第一题(质数长度),你需要提出一个字数是质数的问题,使回答的长度刚好是它的下一个质数。
|
10 |
+
"""
|
11 |
+
EN_TEXT_1 = """
|
12 |
+
For the first question in chapter 2, You need to come up with a question that has a prime number of words, so the answer's length is exactly the next prime number.
|
13 |
+
"""
|
14 |
+
|
15 |
+
|
16 |
+
def _is_prime(v):
|
17 |
+
return sympy.isprime(v)
|
18 |
+
|
19 |
+
|
20 |
+
def _next_prime(v):
|
21 |
+
while v:
|
22 |
+
v += 1
|
23 |
+
if _is_prime(v):
|
24 |
+
return v
|
25 |
+
|
26 |
+
|
27 |
+
def _cn_checker_1(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
28 |
+
qs_length = len(user_text.strip())
|
29 |
+
if not _is_prime(qs_length):
|
30 |
+
return False, f'问题长度为{qs_length},非质数'
|
31 |
+
|
32 |
+
answer_value = len(answer_text)
|
33 |
+
next_prime = _next_prime(qs_length)
|
34 |
+
if answer_value != next_prime:
|
35 |
+
return False, f'下一个质数为{next_prime},但回答长度为{answer_value}'
|
36 |
+
|
37 |
+
return True, None
|
38 |
+
|
39 |
+
|
40 |
+
def _en_words(text: str):
|
41 |
+
return len(re.findall(r'\w+', text))
|
42 |
+
|
43 |
+
|
44 |
+
def _en_checker_1(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
45 |
+
qs_length = _en_words(user_text.strip())
|
46 |
+
if not _is_prime(qs_length):
|
47 |
+
return False, f'The question has a length of {qs_length}, which is not a prime number'
|
48 |
+
|
49 |
+
answer_value = _en_words(answer_text)
|
50 |
+
next_prime = _next_prime(qs_length)
|
51 |
+
if answer_value != next_prime:
|
52 |
+
return False, f'The next prime number is {next_prime}, but the answer\'s length is {answer_value}'
|
53 |
+
|
54 |
+
return True, None
|
55 |
+
|
56 |
+
|
57 |
+
register_question(
|
58 |
+
{
|
59 |
+
'cn': CN_TEXT_1,
|
60 |
+
'en': EN_TEXT_1,
|
61 |
+
},
|
62 |
+
checkers={
|
63 |
+
'cn': _cn_checker_1,
|
64 |
+
'en': _en_checker_1,
|
65 |
+
},
|
66 |
+
name={'cn': '2-1 质数长度', 'en': '2-1'},
|
67 |
+
level=2
|
68 |
+
)
|
69 |
+
|
70 |
+
CN_TEXT_2 = """
|
71 |
+
第二章第二题(越说越大),请输入一个大于一的正整数作为问题,使回答里包含至少比它大一千的数。
|
72 |
+
"""
|
73 |
+
EN_TEXT_2 = """
|
74 |
+
For the second question in chapter 2, Please enter a positive integer greater than one as a question, so that the answer contains a number that is at least one thousand more than it.
|
75 |
+
"""
|
76 |
+
|
77 |
+
|
78 |
+
def _cn_checker_2(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
79 |
+
try:
|
80 |
+
value = int(user_text.strip())
|
81 |
+
if value <= 1:
|
82 |
+
raise ValueError
|
83 |
+
except (TypeError, ValueError):
|
84 |
+
return False, f'输入内容{user_text!r},并非一个大于1的正整数'
|
85 |
+
|
86 |
+
for value_item in re.findall('[-+]?\d+', answer_text):
|
87 |
+
value_item = int(value_item)
|
88 |
+
if value_item >= value + 1000:
|
89 |
+
return True, f'检测到输出中数字{value_item},满足要求'
|
90 |
+
|
91 |
+
return False, f'未在输出中检测到不少于{value + 1000}的数字'
|
92 |
+
|
93 |
+
|
94 |
+
def _en_checker_2(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
95 |
+
try:
|
96 |
+
value = int(user_text.strip())
|
97 |
+
if value <= 1:
|
98 |
+
raise ValueError
|
99 |
+
except (TypeError, ValueError):
|
100 |
+
return False, f'You entered {user_text!r}, which is not a positive integer greater than 1'
|
101 |
+
|
102 |
+
for value_item in re.findall('[-+]?\d+', answer_text):
|
103 |
+
value_item = int(value_item)
|
104 |
+
if value_item >= value + 1000:
|
105 |
+
return True, f'Detected the number {value_item} in the output, which meets the requirement'
|
106 |
+
|
107 |
+
return False, f'Did not detect a number of at least {value + 1000} in the output'
|
108 |
+
|
109 |
+
|
110 |
+
register_question(
|
111 |
+
{
|
112 |
+
'cn': CN_TEXT_2,
|
113 |
+
'en': EN_TEXT_2,
|
114 |
+
},
|
115 |
+
checkers={
|
116 |
+
'cn': _cn_checker_2,
|
117 |
+
'en': _en_checker_2,
|
118 |
+
},
|
119 |
+
name={'cn': '2-2 越说越大', 'en': '2-2'},
|
120 |
+
level=2
|
121 |
+
)
|
122 |
+
|
123 |
+
CN_TEXT_3 = """
|
124 |
+
第二章第三题(越说越小),请输入一个大于一的正整数作为问题,使回答里包含至少10个不同的至少比它小一千的自然数。
|
125 |
+
"""
|
126 |
+
EN_TEXT_3 = """
|
127 |
+
For the third question in chapter 2, Please enter a positive integer greater than one as a question, so that the answer contains at least 10 different natural numbers, each of them at least 1000 less than the question.
|
128 |
+
"""
|
129 |
+
|
130 |
+
|
131 |
+
def _cn_checker_3(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
132 |
+
try:
|
133 |
+
value = int(user_text.strip())
|
134 |
+
if value <= 1:
|
135 |
+
raise ValueError
|
136 |
+
except (TypeError, ValueError):
|
137 |
+
return False, f'输入内容{user_text!r},并非一个大于1的正整数'
|
138 |
+
|
139 |
+
collected_values = []
|
140 |
+
for value_item in re.findall('[-+]?\d+', answer_text):
|
141 |
+
value_item = int(value_item)
|
142 |
+
if value_item <= value - 1000:
|
143 |
+
collected_values.append(value_item)
|
144 |
+
|
145 |
+
collected_values = sorted(set(collected_values))
|
146 |
+
if len(collected_values) >= 10:
|
147 |
+
return True, f'检测到{len(collected_values)}个不大于{value - 1000}的数字:{collected_values!r}'
|
148 |
+
else:
|
149 |
+
return False, f'检测到{len(collected_values)}个不大于{value - 1000}的数字,未达到10个:{collected_values!r}'
|
150 |
+
|
151 |
+
|
152 |
+
def _en_checker_3(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
153 |
+
try:
|
154 |
+
value = int(user_text.strip())
|
155 |
+
if value <= 1:
|
156 |
+
raise ValueError
|
157 |
+
except (TypeError, ValueError):
|
158 |
+
return False, f'You entered {user_text!r}, which is not a positive integer greater than 1'
|
159 |
+
|
160 |
+
collected_values = []
|
161 |
+
for value_item in re.findall('[-+]?\d+', answer_text):
|
162 |
+
value_item = int(value_item)
|
163 |
+
if value_item <= value - 1000:
|
164 |
+
collected_values.append(value_item)
|
165 |
+
|
166 |
+
collected_values = sorted(set(collected_values))
|
167 |
+
if len(collected_values) >= 10:
|
168 |
+
return True, f'Detected {len(collected_values)} numbers not greater than {value - 1000}: {collected_values!r}'
|
169 |
+
else:
|
170 |
+
return False, f'Detected {len(collected_values)} numbers not greater than {value - 1000}, ' \
|
171 |
+
f'but it doesn\'t reach 10: {collected_values!r}'
|
172 |
+
|
173 |
+
|
174 |
+
register_question(
|
175 |
+
{
|
176 |
+
'cn': CN_TEXT_3,
|
177 |
+
'en': EN_TEXT_3,
|
178 |
+
},
|
179 |
+
checkers={
|
180 |
+
'cn': _cn_checker_3,
|
181 |
+
'en': _en_checker_3,
|
182 |
+
},
|
183 |
+
name={'cn': '2-3 越说越小', 'en': '2-3'},
|
184 |
+
level=2,
|
185 |
+
)
|
186 |
+
|
187 |
+
CN_TEXT_4 = """
|
188 |
+
第二章第四题(警世名言),请在不提及1,4,5这三个字符的情况下让模型回答114514,不要有多余的字符。
|
189 |
+
"""
|
190 |
+
EN_TEXT_4 = """
|
191 |
+
For the fourth question in chapter 2, Please make the model answer "114514" without mentioning the characters 1, 4, and 5, and without any extra characters.
|
192 |
+
"""
|
193 |
+
|
194 |
+
|
195 |
+
def _cn_checker_4(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
196 |
+
if "1" in user_text or "4" in user_text or "5" in user_text:
|
197 |
+
return False, '请不要在提问中出现1、4、5三个数字'
|
198 |
+
|
199 |
+
return answer_text.strip() == '114514', None
|
200 |
+
|
201 |
+
|
202 |
+
def _en_checker_4(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
203 |
+
if "1" in user_text or "4" in user_text or "5" in user_text:
|
204 |
+
return False, 'Please don\'t include the numbers 1, 4, and 5 in the question'
|
205 |
+
|
206 |
+
return answer_text.strip() == '114514', None
|
207 |
+
|
208 |
+
|
209 |
+
register_question(
|
210 |
+
{
|
211 |
+
'cn': CN_TEXT_4,
|
212 |
+
'en': EN_TEXT_4,
|
213 |
+
},
|
214 |
+
checkers={
|
215 |
+
'cn': _cn_checker_4,
|
216 |
+
'en': _en_checker_4,
|
217 |
+
},
|
218 |
+
name={'cn': '2-4 警世名言', 'en': '2-4'},
|
219 |
+
level=2,
|
220 |
+
)
|
221 |
+
|
222 |
+
CN_TEXT_5 = """
|
223 |
+
第二章第五题(开平方数),请输入一个大于一的平方数作为问题,使回答里包含它的平方根对应的数。
|
224 |
+
"""
|
225 |
+
EN_TEXT_5 = """
|
226 |
+
For the fifth question in chapter 2, Please provide a square number greater than one as the question, and the answer should include the number corresponding to its square root.
|
227 |
+
"""
|
228 |
+
|
229 |
+
|
230 |
+
def _cn_checker_5(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
231 |
+
try:
|
232 |
+
value = int(user_text.strip())
|
233 |
+
if value <= 1:
|
234 |
+
raise ValueError
|
235 |
+
if int(value ** 0.5) ** 2 != value:
|
236 |
+
raise ValueError
|
237 |
+
except (TypeError, ValueError):
|
238 |
+
return False, f'输入内容{user_text!r},并非一个大于1的平方数'
|
239 |
+
|
240 |
+
sq = int(value ** 0.5)
|
241 |
+
for value_item in re.findall('[-+]?\d+', answer_text):
|
242 |
+
value_item = int(value_item)
|
243 |
+
if value_item == sq:
|
244 |
+
return True, f'检测到平方根数{sq}'
|
245 |
+
else:
|
246 |
+
return False, f'未检测到平方根数{sq}'
|
247 |
+
|
248 |
+
|
249 |
+
def _en_checker_5(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
250 |
+
try:
|
251 |
+
value = int(user_text.strip())
|
252 |
+
if value <= 1:
|
253 |
+
raise ValueError
|
254 |
+
if int(value ** 0.5) ** 2 != value:
|
255 |
+
raise ValueError
|
256 |
+
except (TypeError, ValueError):
|
257 |
+
return False, f'The input, {user_text!r}, is not a square number greater than 1'
|
258 |
+
|
259 |
+
sq = int(value ** 0.5)
|
260 |
+
for value_item in re.findall('[-+]?\d+', answer_text):
|
261 |
+
value_item = int(value_item)
|
262 |
+
if value_item == sq:
|
263 |
+
return True, f'Detected square root: {sq}'
|
264 |
+
else:
|
265 |
+
return False, f'Square root {sq} not detected'
|
266 |
+
|
267 |
+
|
268 |
+
register_question(
|
269 |
+
{
|
270 |
+
'cn': CN_TEXT_5,
|
271 |
+
'en': EN_TEXT_5,
|
272 |
+
},
|
273 |
+
checkers={
|
274 |
+
'cn': _cn_checker_5,
|
275 |
+
'en': _en_checker_5,
|
276 |
+
},
|
277 |
+
name={'cn': '2-5 开平方数', 'en': '2-5'},
|
278 |
+
level=2,
|
279 |
+
)
|
280 |
+
|
281 |
+
CN_TEXT_6 = """
|
282 |
+
第二章第六题(得寸进狗),请提一个不包含“狗”这个字的10个字以内的问题,使回答中“狗”这个字出现的次数至少是问题字数的2倍。
|
283 |
+
"""
|
284 |
+
EN_TEXT_6 = """
|
285 |
+
For the sixth question in chapter 2, Please ask a question in under 10 words without the word "dog" and ensure that the word "dog" appears at least twice in the answer for each word in the question.
|
286 |
+
"""
|
287 |
+
|
288 |
+
|
289 |
+
def _cn_checker_6(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
290 |
+
if len(user_text) > 10:
|
291 |
+
return False, '问题不得超过10个字'
|
292 |
+
if '狗' in user_text:
|
293 |
+
return False, '问题不得包含“狗”字'
|
294 |
+
|
295 |
+
dog_count = len(re.findall('狗', answer_text))
|
296 |
+
if dog_count >= len(user_text) * 2:
|
297 |
+
return True, f'“狗”字的出现次数为{dog_count}次'
|
298 |
+
else:
|
299 |
+
return False, f'“狗”字的出现次数为{dog_count}次,未达到{len(user_text) * 2}次'
|
300 |
+
|
301 |
+
|
302 |
+
def _en_checker_6(question_text: str, user_text: str, answer_text: str) -> Tuple[bool, Optional[str]]:
|
303 |
+
q_words = re.findall(r'\w+', user_text.lower())
|
304 |
+
if len(q_words) > 10:
|
305 |
+
return False, 'The question must not exceed 10 words'
|
306 |
+
if any(word in {'dog', 'dogs'} for word in q_words):
|
307 |
+
return False, 'The question must not contain the word "dog" or "dogs"'
|
308 |
+
|
309 |
+
a_words = re.findall(r'\w+', answer_text.lower())
|
310 |
+
a_dog_count = sum(1 if word in {'dog', 'dogs'} else 0 for word in a_words)
|
311 |
+
if a_dog_count >= len(q_words) * 2:
|
312 |
+
return True, f'The word "dog" (or "dogs") appears {a_dog_count} times.'
|
313 |
+
else:
|
314 |
+
return False, f'The word "dog" (or "dogs") appears {a_dog_count} times, ' \
|
315 |
+
f'which is less than {len(q_words) * 2} times.'
|
316 |
+
|
317 |
+
|
318 |
+
register_question(
|
319 |
+
{
|
320 |
+
'cn': CN_TEXT_6,
|
321 |
+
'en': EN_TEXT_6,
|
322 |
+
},
|
323 |
+
checkers={
|
324 |
+
'cn': _cn_checker_6,
|
325 |
+
'en': _en_checker_6,
|
326 |
+
},
|
327 |
+
name={'cn': '2-6 得寸进狗', 'en': '2-6'},
|
328 |
+
level=2
|
329 |
+
)
|
llmriddles/questions/level3.py
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .question import register_question
|
2 |
+
|
3 |
+
|
4 |
+
def count_words(text: str, contain_punctuation: bool = False):
|
5 |
+
chinese_words = []
|
6 |
+
english_words = []
|
7 |
+
other_words = []
|
8 |
+
temp_english_words = []
|
9 |
+
for char in text:
|
10 |
+
if '\u4e00' <= char <= '\u9fff':
|
11 |
+
chinese_words.append(char)
|
12 |
+
if len(temp_english_words) > 0:
|
13 |
+
english_words.append(''.join(temp_english_words))
|
14 |
+
temp_english_words = []
|
15 |
+
else:
|
16 |
+
if char.isalpha():
|
17 |
+
temp_english_words.append(char)
|
18 |
+
else:
|
19 |
+
if len(temp_english_words) > 0:
|
20 |
+
english_words.append(''.join(temp_english_words))
|
21 |
+
temp_english_words = []
|
22 |
+
other_words.append(char)
|
23 |
+
if contain_punctuation:
|
24 |
+
return len(chinese_words) + len(english_words) + len(other_words)
|
25 |
+
else:
|
26 |
+
return len(chinese_words) + len(english_words)
|
27 |
+
|
28 |
+
|
29 |
+
CN_TEXT_1 = """
|
30 |
+
第三章第一题(自说自话),请你输入一个至少10个字的提问,使模型的回答和提问完全一样。
|
31 |
+
|
32 |
+
请在下面的输入框内填写你的提问并点击按钮提交。
|
33 |
+
"""
|
34 |
+
|
35 |
+
EN_TEXT_1 = """
|
36 |
+
For the first question in chapter 3, please enter a question of at least ten words so that the model's answer is exatly the same with the question.
|
37 |
+
|
38 |
+
Please enter your query below and click the submit button
|
39 |
+
"""
|
40 |
+
|
41 |
+
|
42 |
+
def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
43 |
+
_ = question_text, lang
|
44 |
+
answer_text = answer_text.strip()
|
45 |
+
user_text = user_text.strip()
|
46 |
+
|
47 |
+
if count_words(user_text) < 10:
|
48 |
+
return False, "用户的问题长度应该至少10个字" if lang == 'cn' else 'Question should be no less than 10 words.'
|
49 |
+
|
50 |
+
if answer_text == user_text:
|
51 |
+
return True, None
|
52 |
+
else:
|
53 |
+
return False, None
|
54 |
+
|
55 |
+
|
56 |
+
register_question(
|
57 |
+
{
|
58 |
+
'cn': CN_TEXT_1,
|
59 |
+
'en': EN_TEXT_1,
|
60 |
+
},
|
61 |
+
checkers=_checker_1,
|
62 |
+
name={'cn': '3-1 自说自话', 'en': '3-1'},
|
63 |
+
level=3,
|
64 |
+
)
|
65 |
+
|
66 |
+
CN_TEXT_2 = """
|
67 |
+
第三章第二题(话自说自),请你输入一个至少10个字的提问,使模型的回答是问题的反序。
|
68 |
+
|
69 |
+
请在下面的输入框内填写你的提问并点击按钮提交。
|
70 |
+
"""
|
71 |
+
|
72 |
+
EN_TEXT_2 = """
|
73 |
+
For the second question in chapter 3, please enter a question of at least ten words so that the model's answer is the reverse order of the question.
|
74 |
+
|
75 |
+
Please enter your query below and click the submit button
|
76 |
+
"""
|
77 |
+
|
78 |
+
|
79 |
+
def _checker_2(question_text: str, user_text: str, answer_text: str, lang: str):
|
80 |
+
_ = question_text, lang
|
81 |
+
answer_text = answer_text.strip()
|
82 |
+
user_text = user_text.strip()
|
83 |
+
|
84 |
+
if count_words(user_text) < 10:
|
85 |
+
return False, "用户的问题长度应该至少10个字" if lang == 'cn' else 'Question should be no less than 10 words.'
|
86 |
+
|
87 |
+
if lang == 'cn':
|
88 |
+
user_text = user_text[::-1]
|
89 |
+
else:
|
90 |
+
words = user_text.split()
|
91 |
+
words.reverse()
|
92 |
+
user_text = ' '.join(words)
|
93 |
+
|
94 |
+
if user_text == answer_text:
|
95 |
+
return True, None
|
96 |
+
else:
|
97 |
+
return False, None
|
98 |
+
|
99 |
+
|
100 |
+
register_question(
|
101 |
+
{
|
102 |
+
'cn': CN_TEXT_2,
|
103 |
+
'en': EN_TEXT_2,
|
104 |
+
},
|
105 |
+
checkers=_checker_2,
|
106 |
+
name={'cn': '3-2 话自说自', 'en': '3-2'},
|
107 |
+
level=3,
|
108 |
+
)
|
109 |
+
|
110 |
+
CN_TEXT_3 = """
|
111 |
+
第三章第三题(就是敢说),请你输入一个不包含“1”和“3”的提问,使模型的回答是一字不差的“1+1=3”(不需要引号)。
|
112 |
+
|
113 |
+
请在下面的输入框内填写你的提问并点击按钮提交。
|
114 |
+
"""
|
115 |
+
|
116 |
+
EN_TEXT_3 = """
|
117 |
+
For the third question in chapter 3, please enter a question not contain "1" or "3" that will result in the exact answer "1+1=3" (no quotes needed).
|
118 |
+
|
119 |
+
Please enter your query below and click the submit button
|
120 |
+
"""
|
121 |
+
|
122 |
+
|
123 |
+
def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
124 |
+
_ = question_text, lang
|
125 |
+
answer_text = answer_text.strip()
|
126 |
+
user_text = user_text.strip()
|
127 |
+
|
128 |
+
if '1' in user_text or '3' in user_text:
|
129 |
+
return False, "用户的问题不能包含“1”或“3”" if lang == 'cn' else 'Question should not contain \"1\" or \"3\".'
|
130 |
+
|
131 |
+
if answer_text == '1+1=3':
|
132 |
+
return True, None
|
133 |
+
else:
|
134 |
+
return False, None
|
135 |
+
|
136 |
+
|
137 |
+
register_question(
|
138 |
+
{
|
139 |
+
'cn': CN_TEXT_3,
|
140 |
+
'en': EN_TEXT_3,
|
141 |
+
},
|
142 |
+
checkers=_checker_3,
|
143 |
+
name={'cn': '3-3 就是敢说', 'en': '3-3'},
|
144 |
+
level=3,
|
145 |
+
)
|
146 |
+
|
147 |
+
# CN_TEXT_4 = """
|
148 |
+
# 第三章第四题(回文协变),请你输入一个本身不是回文串的问题,使得正着问和倒着问时,模型的回答本身不是回文且也是逆序。
|
149 |
+
|
150 |
+
# 请在下面的输入框内填写你的提问并点击按钮提交。
|
151 |
+
# """
|
152 |
+
|
153 |
+
# EN_TEXT_4 = """
|
154 |
+
# For the fourth question in chapter 3, please enter a question that is not a palindrome string, so that the model's answer is also not a palindrome and is in reverse order when asked forward or backward.
|
155 |
+
|
156 |
+
# Please enter your query below and click the submit button
|
157 |
+
# """
|
158 |
+
|
159 |
+
# def _checker_4(question_text: str, user_text: str, answer_text: str, lang: str):
|
160 |
+
# pass
|
161 |
+
|
162 |
+
# register_question({
|
163 |
+
# 'cn': CN_TEXT_4,
|
164 |
+
# 'en': EN_TEXT_4,
|
165 |
+
# }, _checker_4, level=3)
|
llmriddles/questions/level4.py
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import re
|
2 |
+
|
3 |
+
from .question import register_question
|
4 |
+
|
5 |
+
|
6 |
+
def check_if_is_number(text: str):
|
7 |
+
try:
|
8 |
+
int(text)
|
9 |
+
return True
|
10 |
+
except ValueError:
|
11 |
+
return False
|
12 |
+
|
13 |
+
|
14 |
+
def get_all_numbers_in_a_sentence(text: str):
|
15 |
+
return [int(i) for i in re.findall(r'\d+', text)]
|
16 |
+
|
17 |
+
|
18 |
+
# CN_TEXT_1 = """
|
19 |
+
# 第四章第一题,请构造一个问题A,它的回复是不同于A的B,然后以B提问能再次得到A。
|
20 |
+
|
21 |
+
# 请在下面的输入框内填写你构造并点击按钮提交。
|
22 |
+
# """
|
23 |
+
|
24 |
+
# EN_TEXT_1 = """
|
25 |
+
# For the first question in chapter 4, please make a question A whose answer is B that is different from A, and then ask B to get A again.
|
26 |
+
|
27 |
+
# Please enter your query below and click the submit button
|
28 |
+
# """
|
29 |
+
|
30 |
+
|
31 |
+
# def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
32 |
+
# _ = question_text, lang
|
33 |
+
# answer_text = answer_text.strip()
|
34 |
+
# user_text = user_text.strip()
|
35 |
+
# pass
|
36 |
+
|
37 |
+
# register_question({
|
38 |
+
# 'cn': CN_TEXT_1,
|
39 |
+
# 'en': EN_TEXT_1,
|
40 |
+
# }, _checker_1, level=4)
|
41 |
+
|
42 |
+
|
43 |
+
# CN_TEXT_2 = """
|
44 |
+
# 第四章第二题,
|
45 |
+
|
46 |
+
# 请在下面的输入框内填写你构造并点击按钮提交。
|
47 |
+
# """
|
48 |
+
|
49 |
+
# EN_TEXT_2 = """
|
50 |
+
# For the second question in chapter 4,
|
51 |
+
|
52 |
+
# Please enter your query below and click the submit button
|
53 |
+
# """
|
54 |
+
|
55 |
+
|
56 |
+
# def _checker_2(question_text: str, user_text: str, answer_text: str, lang: str):
|
57 |
+
# _ = question_text, lang
|
58 |
+
# answer_text = answer_text.strip()
|
59 |
+
# user_text = user_text.strip()
|
60 |
+
# pass
|
61 |
+
|
62 |
+
# register_question({
|
63 |
+
# 'cn': CN_TEXT_2,
|
64 |
+
# 'en': EN_TEXT_2,
|
65 |
+
# }, _checker_2, level=4)
|
66 |
+
|
67 |
+
|
68 |
+
CN_TEXT_3 = """
|
69 |
+
第四章第一题(自然之密),请输入一个大于一的正整数作为问题,使回答里包含和它刚好相差1的数。
|
70 |
+
|
71 |
+
请在下面的输入框内填写你构造并点击按钮提交。
|
72 |
+
"""
|
73 |
+
|
74 |
+
EN_TEXT_3 = """
|
75 |
+
For the first question in chapter 4, please enter a positive integer greater than one as the question so that the answer contains a number that is exactly 1 different from it.
|
76 |
+
|
77 |
+
Please enter your query below and click the submit button
|
78 |
+
"""
|
79 |
+
|
80 |
+
|
81 |
+
def _checker_3(question_text: str, user_text: str, answer_text: str, lang: str):
|
82 |
+
_ = question_text, lang
|
83 |
+
answer_text = answer_text.strip()
|
84 |
+
user_text = user_text.strip()
|
85 |
+
if not check_if_is_number(user_text):
|
86 |
+
return False, "问题应该是一个正整数" if lang == 'cn' else 'Question should be a positive integer.'
|
87 |
+
elif int(user_text) == 1:
|
88 |
+
return False, "问题应该是一个大于1的正整数" if lang == 'cn' else 'Question should be a positive integer greater than 1.'
|
89 |
+
elif int(user_text) - 1 not in get_all_numbers_in_a_sentence(answer_text) or int(
|
90 |
+
user_text) + 1 not in get_all_numbers_in_a_sentence(answer_text):
|
91 |
+
return False, "回答中应该包含一个与问题相差1的数字" if lang == 'cn' else 'Answer should contain a number that is exactly 1 different from the question.'
|
92 |
+
else:
|
93 |
+
return True, None
|
94 |
+
|
95 |
+
|
96 |
+
register_question(
|
97 |
+
{
|
98 |
+
'cn': CN_TEXT_3,
|
99 |
+
'en': EN_TEXT_3,
|
100 |
+
},
|
101 |
+
checkers=_checker_3,
|
102 |
+
name={'cn': '4-3 自然之密', 'en': '4-3'},
|
103 |
+
level=4,
|
104 |
+
)
|
llmriddles/questions/level5.py
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from .question import register_question
|
2 |
+
|
3 |
+
|
4 |
+
def count_words(text: str, contain_punctuation: bool = False):
|
5 |
+
chinese_words = []
|
6 |
+
english_words = []
|
7 |
+
other_words = []
|
8 |
+
temp_english_words = []
|
9 |
+
for char in text:
|
10 |
+
if '\u4e00' <= char <= '\u9fff':
|
11 |
+
chinese_words.append(char)
|
12 |
+
if len(temp_english_words) > 0:
|
13 |
+
english_words.append(''.join(temp_english_words))
|
14 |
+
temp_english_words = []
|
15 |
+
else:
|
16 |
+
if char.isalpha():
|
17 |
+
temp_english_words.append(char)
|
18 |
+
else:
|
19 |
+
if len(temp_english_words) > 0:
|
20 |
+
english_words.append(''.join(temp_english_words))
|
21 |
+
temp_english_words = []
|
22 |
+
other_words.append(char)
|
23 |
+
if contain_punctuation:
|
24 |
+
return len(chinese_words) + len(english_words) + len(other_words)
|
25 |
+
else:
|
26 |
+
return len(chinese_words) + len(english_words)
|
27 |
+
|
28 |
+
|
29 |
+
CN_TEXT_1 = """
|
30 |
+
第五章第一题(口是心非),请构造一个不少于十个字的问题,使得回答中不包含问题中的任意字符。
|
31 |
+
|
32 |
+
请在下面的输入框内填写你的提问并点击按钮提交。
|
33 |
+
"""
|
34 |
+
|
35 |
+
EN_TEXT_1 = """
|
36 |
+
For the first question in chapter 5, Please construct a question of no less than ten words so that the answer does not contain any of the characters in the question.
|
37 |
+
|
38 |
+
Please enter your query below and click the submit button
|
39 |
+
"""
|
40 |
+
|
41 |
+
|
42 |
+
def _checker_1(question_text: str, user_text: str, answer_text: str, lang: str):
|
43 |
+
_ = question_text, lang
|
44 |
+
answer_text = answer_text.strip()
|
45 |
+
user_text = user_text.strip()
|
46 |
+
|
47 |
+
if count_words(user_text) < 10:
|
48 |
+
return False, "用户的问题长度应该至少10个字" if lang == 'cn' else 'Question should be no less than 10 words.'
|
49 |
+
|
50 |
+
if answer_text == user_text:
|
51 |
+
return True, None
|
52 |
+
else:
|
53 |
+
return False, None
|
54 |
+
|
55 |
+
|
56 |
+
register_question(
|
57 |
+
{
|
58 |
+
'cn': CN_TEXT_1,
|
59 |
+
'en': EN_TEXT_1,
|
60 |
+
},
|
61 |
+
checkers=_checker_1,
|
62 |
+
name={'cn': '5-1 口是心非', 'en': '5-1'},
|
63 |
+
level=5,
|
64 |
+
)
|
llmriddles/questions/question.py
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import collections.abc
|
2 |
+
from dataclasses import dataclass
|
3 |
+
from typing import Union, Mapping, Literal, Callable, Tuple, List, Optional
|
4 |
+
|
5 |
+
LangTyping = Literal['en', 'cn']
|
6 |
+
MultiLangCheckerTyping = Callable[[str, str, str, str], Tuple[bool, Optional[str]]]
|
7 |
+
SingleLangCheckerTyping = Callable[[str, str, str], Tuple[bool, Optional[str]]]
|
8 |
+
|
9 |
+
|
10 |
+
@dataclass
|
11 |
+
class Question:
|
12 |
+
texts: Mapping[str, str]
|
13 |
+
checker: MultiLangCheckerTyping
|
14 |
+
names: Mapping[str, str]
|
15 |
+
level: int
|
16 |
+
|
17 |
+
|
18 |
+
_KNOWN_PROBLEMS = []
|
19 |
+
|
20 |
+
|
21 |
+
def register_question(text: Union[Mapping[str, str], str],
|
22 |
+
checkers: Union[Mapping[str, SingleLangCheckerTyping], MultiLangCheckerTyping],
|
23 |
+
name=Union[Mapping[str, str], str],
|
24 |
+
level: int = 1, default_lang='cn'):
|
25 |
+
if isinstance(checkers, collections.abc.Mapping):
|
26 |
+
_origin_checkers = checkers
|
27 |
+
|
28 |
+
def _integrated_checker(question_text: str, user_text: str, answer_text: str, lang: str):
|
29 |
+
return _origin_checkers[lang](question_text, user_text, answer_text)
|
30 |
+
|
31 |
+
checker: MultiLangCheckerTyping = _integrated_checker
|
32 |
+
else:
|
33 |
+
checker: MultiLangCheckerTyping = checkers
|
34 |
+
|
35 |
+
if isinstance(text, str):
|
36 |
+
texts = {default_lang: text}
|
37 |
+
else:
|
38 |
+
texts = text
|
39 |
+
|
40 |
+
if isinstance(name, str):
|
41 |
+
names = {default_lang: name}
|
42 |
+
else:
|
43 |
+
names = name
|
44 |
+
|
45 |
+
_KNOWN_PROBLEMS.append(Question(texts, checker, names, level))
|
46 |
+
|
47 |
+
|
48 |
+
def list_ordered_questions() -> List[Question]:
|
49 |
+
return [
|
50 |
+
problem for _, problem in
|
51 |
+
sorted(enumerate(_KNOWN_PROBLEMS), key=lambda x: (x[1].level, x[0]))
|
52 |
+
]
|
requirements-dev.txt
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
hbutils>=0.9.1
|
2 |
+
tqdm
|
3 |
+
requests>=2.20
|
4 |
+
gradio==4.1.1
|
5 |
+
openai>=1
|
6 |
+
zhipuai
|
7 |
+
sympy
|
8 |
+
flask
|
9 |
+
transformers
|
10 |
+
torch
|
11 |
+
huggingface-hub
|
requirements.txt
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
hbutils>=0.9.1
|
2 |
+
tqdm
|
3 |
+
requests>=2.20
|
4 |
+
gradio==4.1.1
|
5 |
+
openai>=1
|
6 |
+
zhipuai
|
7 |
+
sympy
|