quillbench 1.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- quillbench-1.4.1/LICENSE +26 -0
- quillbench-1.4.1/PKG-INFO +205 -0
- quillbench-1.4.1/README.md +149 -0
- quillbench-1.4.1/pyproject.toml +44 -0
- quillbench-1.4.1/quillbench/__init__.py +11 -0
- quillbench-1.4.1/quillbench/__main__.py +3 -0
- quillbench-1.4.1/quillbench/accounts.py +344 -0
- quillbench-1.4.1/quillbench/backup.py +48 -0
- quillbench-1.4.1/quillbench/builder.py +190 -0
- quillbench-1.4.1/quillbench/cli.py +297 -0
- quillbench-1.4.1/quillbench/client.py +65 -0
- quillbench-1.4.1/quillbench/config.py +588 -0
- quillbench-1.4.1/quillbench/export.py +112 -0
- quillbench-1.4.1/quillbench/graphdb.py +182 -0
- quillbench-1.4.1/quillbench/ldap_auth.py +59 -0
- quillbench-1.4.1/quillbench/paths.py +47 -0
- quillbench-1.4.1/quillbench/quality.py +196 -0
- quillbench-1.4.1/quillbench/registry.py +114 -0
- quillbench-1.4.1/quillbench/settings.py +64 -0
- quillbench-1.4.1/quillbench/shard_gold_cache.py +165 -0
- quillbench-1.4.1/quillbench/storage.py +385 -0
- quillbench-1.4.1/quillbench/tasks.py +346 -0
- quillbench-1.4.1/quillbench/ui/__init__.py +0 -0
- quillbench-1.4.1/quillbench/ui/admin.py +167 -0
- quillbench-1.4.1/quillbench/ui/app.py +293 -0
- quillbench-1.4.1/quillbench/ui/assets/icon.png +0 -0
- quillbench-1.4.1/quillbench/ui/assets/logo.svg +7 -0
- quillbench-1.4.1/quillbench/ui/builder.py +162 -0
- quillbench-1.4.1/quillbench/ui/components.py +192 -0
- quillbench-1.4.1/quillbench/ui/console.py +121 -0
- quillbench-1.4.1/quillbench/ui/dashboard.py +91 -0
- quillbench-1.4.1/quillbench/ui/embed.py +15 -0
- quillbench-1.4.1/quillbench/ui/generic.py +301 -0
- quillbench-1.4.1/quillbench/ui/query_review.py +578 -0
- quillbench-1.4.1/quillbench/ui/session.py +58 -0
- quillbench-1.4.1/quillbench/ui/shortcuts.py +53 -0
- quillbench-1.4.1/quillbench/ui/theme.py +473 -0
- quillbench-1.4.1/quillbench/validate.py +147 -0
- quillbench-1.4.1/quillbench.egg-info/PKG-INFO +205 -0
- quillbench-1.4.1/quillbench.egg-info/SOURCES.txt +46 -0
- quillbench-1.4.1/quillbench.egg-info/dependency_links.txt +1 -0
- quillbench-1.4.1/quillbench.egg-info/entry_points.txt +2 -0
- quillbench-1.4.1/quillbench.egg-info/requires.txt +10 -0
- quillbench-1.4.1/quillbench.egg-info/top_level.txt +1 -0
- quillbench-1.4.1/setup.cfg +4 -0
- quillbench-1.4.1/tests/test_app.py +198 -0
- quillbench-1.4.1/tests/test_core.py +270 -0
- quillbench-1.4.1/tests/test_login.py +118 -0
quillbench-1.4.1/LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
QuillBench Academic Non-Commercial License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 A.C. Pogaku. All rights reserved.
|
|
4
|
+
|
|
5
|
+
The copyright in this software and its documentation (the "Software") belongs
|
|
6
|
+
solely to A.C. Pogaku. All rights not expressly granted here are reserved.
|
|
7
|
+
|
|
8
|
+
Permission is granted, free of charge, to students, teachers, researchers and
|
|
9
|
+
academic or other non-profit research institutions to use, copy and modify the
|
|
10
|
+
Software, and to share copies or modified versions with others, for academic
|
|
11
|
+
teaching, study and research only, on these conditions:
|
|
12
|
+
|
|
13
|
+
1. No commercial use. You may not sell the Software, offer it as a paid
|
|
14
|
+
service, or use it in or for any commercial product, service or activity,
|
|
15
|
+
or for the benefit of a commercial organisation. No commercial license is
|
|
16
|
+
offered under these terms.
|
|
17
|
+
2. Keep this notice. Every copy or modified version must include this license
|
|
18
|
+
and the copyright notice above, and must carry these same terms.
|
|
19
|
+
3. Mark your changes. Modified versions must state that they were changed.
|
|
20
|
+
|
|
21
|
+
Results and data you produce with the Software belong to you. Publishing
|
|
22
|
+
academic work that used the Software is permitted.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM,
|
|
26
|
+
DAMAGES OR OTHER LIABILITY ARISING FROM THE SOFTWARE OR ITS USE.
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: quillbench
|
|
3
|
+
Version: 1.4.1
|
|
4
|
+
Summary: Build benchmark datasets with human annotators: a config-driven annotation platform for research.
|
|
5
|
+
Author: A.C. Pogaku
|
|
6
|
+
License: QuillBench Academic Non-Commercial License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 A.C. Pogaku. All rights reserved.
|
|
9
|
+
|
|
10
|
+
The copyright in this software and its documentation (the "Software") belongs
|
|
11
|
+
solely to A.C. Pogaku. All rights not expressly granted here are reserved.
|
|
12
|
+
|
|
13
|
+
Permission is granted, free of charge, to students, teachers, researchers and
|
|
14
|
+
academic or other non-profit research institutions to use, copy and modify the
|
|
15
|
+
Software, and to share copies or modified versions with others, for academic
|
|
16
|
+
teaching, study and research only, on these conditions:
|
|
17
|
+
|
|
18
|
+
1. No commercial use. You may not sell the Software, offer it as a paid
|
|
19
|
+
service, or use it in or for any commercial product, service or activity,
|
|
20
|
+
or for the benefit of a commercial organisation. No commercial license is
|
|
21
|
+
offered under these terms.
|
|
22
|
+
2. Keep this notice. Every copy or modified version must include this license
|
|
23
|
+
and the copyright notice above, and must carry these same terms.
|
|
24
|
+
3. Mark your changes. Modified versions must state that they were changed.
|
|
25
|
+
|
|
26
|
+
Results and data you produce with the Software belong to you. Publishing
|
|
27
|
+
academic work that used the Software is permitted.
|
|
28
|
+
|
|
29
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
30
|
+
IMPLIED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM,
|
|
31
|
+
DAMAGES OR OTHER LIABILITY ARISING FROM THE SOFTWARE OR ITS USE.
|
|
32
|
+
|
|
33
|
+
Project-URL: Homepage, https://github.com/quillbench/quillbench
|
|
34
|
+
Project-URL: Source, https://github.com/quillbench/quillbench
|
|
35
|
+
Project-URL: Changelog, https://github.com/quillbench/quillbench/blob/main/CHANGELOG.md
|
|
36
|
+
Keywords: annotation,labeling,benchmark,dataset,human evaluation,streamlit,research
|
|
37
|
+
Classifier: Development Status :: 4 - Beta
|
|
38
|
+
Classifier: Intended Audience :: Education
|
|
39
|
+
Classifier: Intended Audience :: Science/Research
|
|
40
|
+
Classifier: License :: Other/Proprietary License
|
|
41
|
+
Classifier: Operating System :: OS Independent
|
|
42
|
+
Classifier: Programming Language :: Python :: 3
|
|
43
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
44
|
+
Requires-Python: >=3.10
|
|
45
|
+
Description-Content-Type: text/markdown
|
|
46
|
+
License-File: LICENSE
|
|
47
|
+
Requires-Dist: streamlit<2.0,>=1.50
|
|
48
|
+
Requires-Dist: pandas<3.0,>=2.0
|
|
49
|
+
Requires-Dist: PyYAML<7.0,>=6.0
|
|
50
|
+
Requires-Dist: neo4j<7.0,>=5.0
|
|
51
|
+
Provides-Extra: test
|
|
52
|
+
Requires-Dist: pytest>=7; extra == "test"
|
|
53
|
+
Provides-Extra: ldap
|
|
54
|
+
Requires-Dist: ldap3<3,>=2.9; extra == "ldap"
|
|
55
|
+
Dynamic: license-file
|
|
56
|
+
|
|
57
|
+
<p align="center"><img src="https://raw.githubusercontent.com/quillbench/quillbench/main/docs/logo.svg" width="120" alt="QuillBench logo"></p>
|
|
58
|
+
|
|
59
|
+
# QuillBench
|
|
60
|
+
|
|
61
|
+
Build benchmark datasets with human annotators. A config-driven annotation platform for research, by **A.C. Pogaku**.
|
|
62
|
+
|
|
63
|
+
Each paper keeps its own annotation data in its own
|
|
64
|
+
folder, a **workspace**, described by one `quillbench_workspace.yaml` file. The studio reads
|
|
65
|
+
that file and writes answers straight into the paper's folders, so there is nothing to
|
|
66
|
+
copy and the two are always in step.
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
~/.config/quillbench/ private studio state: registry, accounts (hashed), settings
|
|
70
|
+
<paper>/quillbench_workspace.yaml one paper's projects
|
|
71
|
+
<paper>/batches/*.csv|*.jsonl items to annotate, one file per batch
|
|
72
|
+
<paper>/progress/<user>__<batch>.csv answers, written by the studio
|
|
73
|
+
<paper>/quillbench_assignments.json who works on which batch (no secrets)
|
|
74
|
+
<paper>/quillbench_exports/<time>/ exports: answers.csv/.jsonl, agreement.csv, DATASHEET.md
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Install
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
pip install quillbench
|
|
81
|
+
quillbench serve # this computer only: http://localhost:8560/quillbench/
|
|
82
|
+
quillbench serve --address 0.0.0.0 # let others on the network reach it
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Python 3.10 or newer. Answers and settings stay on the machine that runs `quillbench serve`.
|
|
86
|
+
Free for academic, non-commercial use only; see [LICENSE](https://github.com/quillbench/quillbench/blob/main/LICENSE).
|
|
87
|
+
|
|
88
|
+
## Getting started in the browser
|
|
89
|
+
|
|
90
|
+
Run `quillbench serve` and open the page. The first person to sign up becomes the admin, so do
|
|
91
|
+
this yourself before sharing the address. Then, with no files to edit, the admin can use
|
|
92
|
+
**Admin → Projects** to create a project, upload CSVs at any time, set label buttons or a slider, split
|
|
93
|
+
the items into batches and assign them. Add people under **Admin → People**, and follow the
|
|
94
|
+
work in the **Progress** tab.
|
|
95
|
+
|
|
96
|
+
## Task types
|
|
97
|
+
|
|
98
|
+
| task | what the annotator does |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `rating` | moves a slider on a scale (e.g. 0–1 or 1–5), optional "can't judge" |
|
|
101
|
+
| `choice` | picks one of the labels the manifest lists |
|
|
102
|
+
| `text` | writes a short answer |
|
|
103
|
+
| `verdict`, `gate_review`, `gate_calibration`, `item_question`, `item_query`, `item_disposition` | reviews a question + reference query + precomputed results |
|
|
104
|
+
| `adjudication` | judges a predicted query against a reference (results withheld) |
|
|
105
|
+
| `pair_semantics` | blinded A/B comparison of two queries |
|
|
106
|
+
|
|
107
|
+
Per project the manifest can set `instructions`, `note_label`, `note_placeholder`,
|
|
108
|
+
`note_required_for`, `display` (which item columns to show and how), `checks`
|
|
109
|
+
(hidden attention-check items with expected answers) and `also_accept` (labels
|
|
110
|
+
from an earlier version of the task that still count as answers).
|
|
111
|
+
|
|
112
|
+
## Everyday commands
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
quillbench init-workspace ~/my_paper/annotation # start a new paper from a template
|
|
116
|
+
quillbench workspace add ~/my_paper/annotation # register it
|
|
117
|
+
quillbench validate # check every workspace
|
|
118
|
+
quillbench user add alice # asks for a password
|
|
119
|
+
quillbench assign alice my_paper rate_01 rate_02
|
|
120
|
+
quillbench status my_paper # progress per person and batch
|
|
121
|
+
quillbench quality my_paper # Krippendorff's alpha, Cohen's kappa, checks, time
|
|
122
|
+
quillbench export my_paper # anonymised answers + datasheet
|
|
123
|
+
quillbench backup # also runs nightly
|
|
124
|
+
quillbench serve # http://127.0.0.1:8560/quillbench/
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
(`python -m quillbench …` works the same without installing; `pip install -e .` adds the `quillbench` command.)
|
|
128
|
+
|
|
129
|
+
In the app: **1–9** answer, **S** skip, **J/→** next, **K/←** previous, **Enter** saves a rating.
|
|
130
|
+
|
|
131
|
+
Useful manifest options for rating studies:
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
scale: {min: 0, max: 1, step: 0.05, unsure_label: "Can't judge",
|
|
135
|
+
marks: {0: false, 0.5: half true, 1: true}} # words along the slider
|
|
136
|
+
display:
|
|
137
|
+
- {field: statement, label: Statement} # the first text field is shown large
|
|
138
|
+
- {field: hourly, as: chart, chart: {kind: bar, x_label: hour, lines: [15.5, 35.5]}}
|
|
139
|
+
practice: true # show each item's 'expected' and 'explanation' columns after answering
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## For annotators: connect to a server
|
|
143
|
+
|
|
144
|
+
If someone runs QuillBench for your group, you only need the address they give you:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
pip install quillbench
|
|
148
|
+
quillbench connect annotate.example.edu/quillbench
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
This checks the server, remembers it and opens the sign-in page. Next time, run
|
|
152
|
+
`quillbench open`. Sign in with the login you were given (or your university login, if the
|
|
153
|
+
server uses LDAP). Your answers are saved on the server, not on your computer.
|
|
154
|
+
|
|
155
|
+
## Signing in with university (LDAP) accounts
|
|
156
|
+
|
|
157
|
+
QuillBench has its own accounts. A server can also accept the logins people already have,
|
|
158
|
+
from LDAP or Active Directory. Install the extra package and add an `ldap` block to
|
|
159
|
+
`settings.yaml` in the studio home:
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
pip install "quillbench[ldap]"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```yaml
|
|
166
|
+
ldap:
|
|
167
|
+
url: ldaps://ldap.example.edu # or ldap:// with start_tls: true
|
|
168
|
+
user_dn: "uid={user},ou=people,dc=example,dc=edu" # Active Directory: "{user}@example.edu"
|
|
169
|
+
auto_create: true # first sign-in makes an annotator account; false = admins add people first
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Passwords are checked by the LDAP server and never stored by QuillBench. Accounts with their
|
|
173
|
+
own QuillBench password keep using it. Admins still assign batches and can disable anyone in
|
|
174
|
+
Admin → People. Use `ldaps://` or `start_tls`, so passwords are not sent in plain text.
|
|
175
|
+
|
|
176
|
+
## Running as a service
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
cp deploy/quillbench.service deploy/quillbench-backup.service deploy/quillbench-backup.timer ~/.config/systemd/user/
|
|
180
|
+
systemctl --user daemon-reload
|
|
181
|
+
systemctl --user enable --now quillbench quillbench-backup.timer
|
|
182
|
+
sudo loginctl enable-linger $USER # keep it running after logout
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
nginx: add `deploy/nginx-quillbench.conf` to the server block.
|
|
186
|
+
|
|
187
|
+
## Quality measures
|
|
188
|
+
|
|
189
|
+
* **Krippendorff's alpha** (nominal for labels; interval or ordinal for ratings) over all
|
|
190
|
+
items answered by two or more people; skips and "can't judge" left out. Verified against
|
|
191
|
+
the worked example in Krippendorff (2011): 0.743 / 0.815 / 0.849.
|
|
192
|
+
* **Cohen's kappa** per pair of annotators (labels), or mean absolute difference and
|
|
193
|
+
Pearson r (ratings).
|
|
194
|
+
* **Check items** passed per annotator, and **median seconds per item** (QuillBench records
|
|
195
|
+
`updated_at` and `seconds` for every answer).
|
|
196
|
+
|
|
197
|
+
## Security
|
|
198
|
+
|
|
199
|
+
Passwords are stored as salted PBKDF2-SHA256 hashes in the studio home (mode 600).
|
|
200
|
+
Sessions use an HMAC-signed cookie. Exports replace annotator ids with codes
|
|
201
|
+
(A01, …); the code book stays in the studio home.
|
|
202
|
+
|
|
203
|
+
## Origin
|
|
204
|
+
|
|
205
|
+
© 2026 A.C. Pogaku. Free for academic, non-commercial use; commercial use is not permitted. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<p align="center"><img src="https://raw.githubusercontent.com/quillbench/quillbench/main/docs/logo.svg" width="120" alt="QuillBench logo"></p>
|
|
2
|
+
|
|
3
|
+
# QuillBench
|
|
4
|
+
|
|
5
|
+
Build benchmark datasets with human annotators. A config-driven annotation platform for research, by **A.C. Pogaku**.
|
|
6
|
+
|
|
7
|
+
Each paper keeps its own annotation data in its own
|
|
8
|
+
folder, a **workspace**, described by one `quillbench_workspace.yaml` file. The studio reads
|
|
9
|
+
that file and writes answers straight into the paper's folders, so there is nothing to
|
|
10
|
+
copy and the two are always in step.
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
~/.config/quillbench/ private studio state: registry, accounts (hashed), settings
|
|
14
|
+
<paper>/quillbench_workspace.yaml one paper's projects
|
|
15
|
+
<paper>/batches/*.csv|*.jsonl items to annotate, one file per batch
|
|
16
|
+
<paper>/progress/<user>__<batch>.csv answers, written by the studio
|
|
17
|
+
<paper>/quillbench_assignments.json who works on which batch (no secrets)
|
|
18
|
+
<paper>/quillbench_exports/<time>/ exports: answers.csv/.jsonl, agreement.csv, DATASHEET.md
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Install
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
pip install quillbench
|
|
25
|
+
quillbench serve # this computer only: http://localhost:8560/quillbench/
|
|
26
|
+
quillbench serve --address 0.0.0.0 # let others on the network reach it
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Python 3.10 or newer. Answers and settings stay on the machine that runs `quillbench serve`.
|
|
30
|
+
Free for academic, non-commercial use only; see [LICENSE](https://github.com/quillbench/quillbench/blob/main/LICENSE).
|
|
31
|
+
|
|
32
|
+
## Getting started in the browser
|
|
33
|
+
|
|
34
|
+
Run `quillbench serve` and open the page. The first person to sign up becomes the admin, so do
|
|
35
|
+
this yourself before sharing the address. Then, with no files to edit, the admin can use
|
|
36
|
+
**Admin → Projects** to create a project, upload CSVs at any time, set label buttons or a slider, split
|
|
37
|
+
the items into batches and assign them. Add people under **Admin → People**, and follow the
|
|
38
|
+
work in the **Progress** tab.
|
|
39
|
+
|
|
40
|
+
## Task types
|
|
41
|
+
|
|
42
|
+
| task | what the annotator does |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `rating` | moves a slider on a scale (e.g. 0–1 or 1–5), optional "can't judge" |
|
|
45
|
+
| `choice` | picks one of the labels the manifest lists |
|
|
46
|
+
| `text` | writes a short answer |
|
|
47
|
+
| `verdict`, `gate_review`, `gate_calibration`, `item_question`, `item_query`, `item_disposition` | reviews a question + reference query + precomputed results |
|
|
48
|
+
| `adjudication` | judges a predicted query against a reference (results withheld) |
|
|
49
|
+
| `pair_semantics` | blinded A/B comparison of two queries |
|
|
50
|
+
|
|
51
|
+
Per project the manifest can set `instructions`, `note_label`, `note_placeholder`,
|
|
52
|
+
`note_required_for`, `display` (which item columns to show and how), `checks`
|
|
53
|
+
(hidden attention-check items with expected answers) and `also_accept` (labels
|
|
54
|
+
from an earlier version of the task that still count as answers).
|
|
55
|
+
|
|
56
|
+
## Everyday commands
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
quillbench init-workspace ~/my_paper/annotation # start a new paper from a template
|
|
60
|
+
quillbench workspace add ~/my_paper/annotation # register it
|
|
61
|
+
quillbench validate # check every workspace
|
|
62
|
+
quillbench user add alice # asks for a password
|
|
63
|
+
quillbench assign alice my_paper rate_01 rate_02
|
|
64
|
+
quillbench status my_paper # progress per person and batch
|
|
65
|
+
quillbench quality my_paper # Krippendorff's alpha, Cohen's kappa, checks, time
|
|
66
|
+
quillbench export my_paper # anonymised answers + datasheet
|
|
67
|
+
quillbench backup # also runs nightly
|
|
68
|
+
quillbench serve # http://127.0.0.1:8560/quillbench/
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
(`python -m quillbench …` works the same without installing; `pip install -e .` adds the `quillbench` command.)
|
|
72
|
+
|
|
73
|
+
In the app: **1–9** answer, **S** skip, **J/→** next, **K/←** previous, **Enter** saves a rating.
|
|
74
|
+
|
|
75
|
+
Useful manifest options for rating studies:
|
|
76
|
+
|
|
77
|
+
```yaml
|
|
78
|
+
scale: {min: 0, max: 1, step: 0.05, unsure_label: "Can't judge",
|
|
79
|
+
marks: {0: false, 0.5: half true, 1: true}} # words along the slider
|
|
80
|
+
display:
|
|
81
|
+
- {field: statement, label: Statement} # the first text field is shown large
|
|
82
|
+
- {field: hourly, as: chart, chart: {kind: bar, x_label: hour, lines: [15.5, 35.5]}}
|
|
83
|
+
practice: true # show each item's 'expected' and 'explanation' columns after answering
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## For annotators: connect to a server
|
|
87
|
+
|
|
88
|
+
If someone runs QuillBench for your group, you only need the address they give you:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
pip install quillbench
|
|
92
|
+
quillbench connect annotate.example.edu/quillbench
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
This checks the server, remembers it and opens the sign-in page. Next time, run
|
|
96
|
+
`quillbench open`. Sign in with the login you were given (or your university login, if the
|
|
97
|
+
server uses LDAP). Your answers are saved on the server, not on your computer.
|
|
98
|
+
|
|
99
|
+
## Signing in with university (LDAP) accounts
|
|
100
|
+
|
|
101
|
+
QuillBench has its own accounts. A server can also accept the logins people already have,
|
|
102
|
+
from LDAP or Active Directory. Install the extra package and add an `ldap` block to
|
|
103
|
+
`settings.yaml` in the studio home:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
pip install "quillbench[ldap]"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
ldap:
|
|
111
|
+
url: ldaps://ldap.example.edu # or ldap:// with start_tls: true
|
|
112
|
+
user_dn: "uid={user},ou=people,dc=example,dc=edu" # Active Directory: "{user}@example.edu"
|
|
113
|
+
auto_create: true # first sign-in makes an annotator account; false = admins add people first
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Passwords are checked by the LDAP server and never stored by QuillBench. Accounts with their
|
|
117
|
+
own QuillBench password keep using it. Admins still assign batches and can disable anyone in
|
|
118
|
+
Admin → People. Use `ldaps://` or `start_tls`, so passwords are not sent in plain text.
|
|
119
|
+
|
|
120
|
+
## Running as a service
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
cp deploy/quillbench.service deploy/quillbench-backup.service deploy/quillbench-backup.timer ~/.config/systemd/user/
|
|
124
|
+
systemctl --user daemon-reload
|
|
125
|
+
systemctl --user enable --now quillbench quillbench-backup.timer
|
|
126
|
+
sudo loginctl enable-linger $USER # keep it running after logout
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
nginx: add `deploy/nginx-quillbench.conf` to the server block.
|
|
130
|
+
|
|
131
|
+
## Quality measures
|
|
132
|
+
|
|
133
|
+
* **Krippendorff's alpha** (nominal for labels; interval or ordinal for ratings) over all
|
|
134
|
+
items answered by two or more people; skips and "can't judge" left out. Verified against
|
|
135
|
+
the worked example in Krippendorff (2011): 0.743 / 0.815 / 0.849.
|
|
136
|
+
* **Cohen's kappa** per pair of annotators (labels), or mean absolute difference and
|
|
137
|
+
Pearson r (ratings).
|
|
138
|
+
* **Check items** passed per annotator, and **median seconds per item** (QuillBench records
|
|
139
|
+
`updated_at` and `seconds` for every answer).
|
|
140
|
+
|
|
141
|
+
## Security
|
|
142
|
+
|
|
143
|
+
Passwords are stored as salted PBKDF2-SHA256 hashes in the studio home (mode 600).
|
|
144
|
+
Sessions use an HMAC-signed cookie. Exports replace annotator ids with codes
|
|
145
|
+
(A01, …); the code book stays in the studio home.
|
|
146
|
+
|
|
147
|
+
## Origin
|
|
148
|
+
|
|
149
|
+
© 2026 A.C. Pogaku. Free for academic, non-commercial use; commercial use is not permitted. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "quillbench"
|
|
7
|
+
version = "1.4.1"
|
|
8
|
+
description = "Build benchmark datasets with human annotators: a config-driven annotation platform for research."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
keywords = ["annotation", "labeling", "benchmark", "dataset", "human evaluation", "streamlit", "research"]
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Development Status :: 4 - Beta",
|
|
13
|
+
"Intended Audience :: Education",
|
|
14
|
+
"Intended Audience :: Science/Research",
|
|
15
|
+
"License :: Other/Proprietary License",
|
|
16
|
+
"Operating System :: OS Independent",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
19
|
+
]
|
|
20
|
+
authors = [{ name = "A.C. Pogaku" }]
|
|
21
|
+
license = { file = "LICENSE" }
|
|
22
|
+
requires-python = ">=3.10"
|
|
23
|
+
dependencies = ["streamlit>=1.50,<2.0", "pandas>=2.0,<3.0", "PyYAML>=6.0,<7.0", "neo4j>=5.0,<7.0"]
|
|
24
|
+
|
|
25
|
+
[project.urls]
|
|
26
|
+
Homepage = "https://github.com/quillbench/quillbench"
|
|
27
|
+
Source = "https://github.com/quillbench/quillbench"
|
|
28
|
+
Changelog = "https://github.com/quillbench/quillbench/blob/main/CHANGELOG.md"
|
|
29
|
+
|
|
30
|
+
[project.optional-dependencies]
|
|
31
|
+
test = ["pytest>=7"]
|
|
32
|
+
ldap = ["ldap3>=2.9,<3"]
|
|
33
|
+
|
|
34
|
+
[project.scripts]
|
|
35
|
+
quillbench = "quillbench.cli:main"
|
|
36
|
+
|
|
37
|
+
[tool.setuptools.packages.find]
|
|
38
|
+
include = ["quillbench*"]
|
|
39
|
+
|
|
40
|
+
[tool.setuptools.package-data]
|
|
41
|
+
"quillbench.ui" = ["assets/*"]
|
|
42
|
+
|
|
43
|
+
[tool.pytest.ini_options]
|
|
44
|
+
testpaths = ["tests"]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""QuillBench.
|
|
2
|
+
|
|
3
|
+
A config-driven human-annotation platform for research datasets. The software lives
|
|
4
|
+
in its own folder; every paper keeps its annotation data in its own folder (a
|
|
5
|
+
*workspace*), described by a ``quillbench_workspace.yaml`` manifest that the studio reads.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
__version__ = "1.4.1"
|
|
9
|
+
NAME = "QuillBench"
|
|
10
|
+
SHORT_NAME = "QuillBench"
|
|
11
|
+
AUTHOR = "A.C. Pogaku"
|