mrs83 commited on
Commit
12fb91f
Β·
verified Β·
1 Parent(s): dc57d80

Upload folder using huggingface_hub

Browse files
Files changed (12) hide show
  1. 404.html +12 -12
  2. architecture.html +759 -0
  3. deployment.html +890 -0
  4. index.html +14 -14
  5. inference.html +783 -0
  6. license.html +746 -0
  7. llm-as-judge.html +1028 -0
  8. mcp.html +889 -0
  9. oauth.html +796 -0
  10. quickstart.html +827 -0
  11. search/search_index.json +1 -1
  12. story.html +982 -0
404.html CHANGED
@@ -81,7 +81,7 @@
81
 
82
  <header class="md-header md-header--shadow" data-md-component="header">
83
  <nav class="md-header__inner md-grid" aria-label="Header">
84
- <a href="/." title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
85
 
86
 
87
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
@@ -191,7 +191,7 @@
191
 
192
  <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
193
  <label class="md-nav__title" for="__drawer">
194
- <a href="/." title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
195
 
196
 
197
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
@@ -221,7 +221,7 @@
221
 
222
 
223
  <li class="md-nav__item">
224
- <a href="/." class="md-nav__link">
225
 
226
 
227
 
@@ -248,7 +248,7 @@
248
 
249
 
250
  <li class="md-nav__item">
251
- <a href="/quickstart/" class="md-nav__link">
252
 
253
 
254
 
@@ -275,7 +275,7 @@
275
 
276
 
277
  <li class="md-nav__item">
278
- <a href="/architecture/" class="md-nav__link">
279
 
280
 
281
 
@@ -302,7 +302,7 @@
302
 
303
 
304
  <li class="md-nav__item">
305
- <a href="/llm-as-judge/" class="md-nav__link">
306
 
307
 
308
 
@@ -329,7 +329,7 @@
329
 
330
 
331
  <li class="md-nav__item">
332
- <a href="/mcp/" class="md-nav__link">
333
 
334
 
335
 
@@ -356,7 +356,7 @@
356
 
357
 
358
  <li class="md-nav__item">
359
- <a href="/oauth/" class="md-nav__link">
360
 
361
 
362
 
@@ -383,7 +383,7 @@
383
 
384
 
385
  <li class="md-nav__item">
386
- <a href="/inference/" class="md-nav__link">
387
 
388
 
389
 
@@ -410,7 +410,7 @@
410
 
411
 
412
  <li class="md-nav__item">
413
- <a href="/story/" class="md-nav__link">
414
 
415
 
416
 
@@ -437,7 +437,7 @@
437
 
438
 
439
  <li class="md-nav__item">
440
- <a href="/deployment/" class="md-nav__link">
441
 
442
 
443
 
@@ -464,7 +464,7 @@
464
 
465
 
466
  <li class="md-nav__item">
467
- <a href="/license/" class="md-nav__link">
468
 
469
 
470
 
 
81
 
82
  <header class="md-header md-header--shadow" data-md-component="header">
83
  <nav class="md-header__inner md-grid" aria-label="Header">
84
+ <a href="/index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
85
 
86
 
87
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
 
191
 
192
  <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
193
  <label class="md-nav__title" for="__drawer">
194
+ <a href="/index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
195
 
196
 
197
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
 
221
 
222
 
223
  <li class="md-nav__item">
224
+ <a href="/index.html" class="md-nav__link">
225
 
226
 
227
 
 
248
 
249
 
250
  <li class="md-nav__item">
251
+ <a href="/quickstart.html" class="md-nav__link">
252
 
253
 
254
 
 
275
 
276
 
277
  <li class="md-nav__item">
278
+ <a href="/architecture.html" class="md-nav__link">
279
 
280
 
281
 
 
302
 
303
 
304
  <li class="md-nav__item">
305
+ <a href="/llm-as-judge.html" class="md-nav__link">
306
 
307
 
308
 
 
329
 
330
 
331
  <li class="md-nav__item">
332
+ <a href="/mcp.html" class="md-nav__link">
333
 
334
 
335
 
 
356
 
357
 
358
  <li class="md-nav__item">
359
+ <a href="/oauth.html" class="md-nav__link">
360
 
361
 
362
 
 
383
 
384
 
385
  <li class="md-nav__item">
386
+ <a href="/inference.html" class="md-nav__link">
387
 
388
 
389
 
 
410
 
411
 
412
  <li class="md-nav__item">
413
+ <a href="/story.html" class="md-nav__link">
414
 
415
 
416
 
 
437
 
438
 
439
  <li class="md-nav__item">
440
+ <a href="/deployment.html" class="md-nav__link">
441
 
442
 
443
 
 
464
 
465
 
466
  <li class="md-nav__item">
467
+ <a href="/license.html" class="md-nav__link">
468
 
469
 
470
 
architecture.html ADDED
@@ -0,0 +1,759 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="quickstart.html">
15
+
16
+
17
+ <link rel="next" href="llm-as-judge.html">
18
+
19
+
20
+
21
+
22
+
23
+ <link rel="icon" href="assets/images/favicon.png">
24
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
25
+
26
+
27
+
28
+ <title>Architecture - OpenAIRE-AI-Research-Evaluator</title>
29
+
30
+
31
+
32
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
33
+
34
+
35
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
49
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
50
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
51
+
52
+
53
+
54
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#architecture" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ OpenAIRE-AI-Research-Evaluator
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ Architecture
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ <label class="md-header__button md-icon" for="__search">
128
+
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
130
+ </label>
131
+ <div class="md-search" data-md-component="search" role="dialog">
132
+ <label class="md-search__overlay" for="__search"></label>
133
+ <div class="md-search__inner" role="search">
134
+ <form class="md-search__form" name="search">
135
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
136
+ <label class="md-search__icon md-icon" for="__search">
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
139
+
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
141
+ </label>
142
+ <nav class="md-search__options" aria-label="Search">
143
+
144
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
145
+
146
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
147
+ </button>
148
+ </nav>
149
+
150
+ </form>
151
+ <div class="md-search__output">
152
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
153
+ <div class="md-search-result" data-md-component="search-result">
154
+ <div class="md-search-result__meta">
155
+ Initializing search
156
+ </div>
157
+ <ol class="md-search-result__list" role="presentation"></ol>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+
165
+
166
+ <div class="md-header__source">
167
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
168
+ <div class="md-source__icon md-icon">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
171
+ </div>
172
+ <div class="md-source__repository">
173
+ GitHub
174
+ </div>
175
+ </a>
176
+ </div>
177
+
178
+ </nav>
179
+
180
+ </header>
181
+
182
+ <div class="md-container" data-md-component="container">
183
+
184
+
185
+
186
+
187
+
188
+
189
+ <main class="md-main" data-md-component="main">
190
+ <div class="md-main__inner md-grid">
191
+
192
+
193
+
194
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
195
+ <div class="md-sidebar__scrollwrap">
196
+ <div class="md-sidebar__inner">
197
+
198
+
199
+
200
+
201
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
202
+ <label class="md-nav__title" for="__drawer">
203
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
204
+
205
+
206
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
207
+
208
+ </a>
209
+ OpenAIRE-AI-Research-Evaluator
210
+ </label>
211
+
212
+ <div class="md-nav__source">
213
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
214
+ <div class="md-source__icon md-icon">
215
+
216
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
217
+ </div>
218
+ <div class="md-source__repository">
219
+ GitHub
220
+ </div>
221
+ </a>
222
+ </div>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="index.html" class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ Home
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ <li class="md-nav__item">
260
+ <a href="quickstart.html" class="md-nav__link">
261
+
262
+
263
+
264
+ <span class="md-ellipsis">
265
+
266
+
267
+ Quick Start
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ </a>
276
+ </li>
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+ <li class="md-nav__item md-nav__item--active">
289
+
290
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
291
+
292
+
293
+
294
+
295
+
296
+ <label class="md-nav__link md-nav__link--active" for="__toc">
297
+
298
+
299
+
300
+ <span class="md-ellipsis">
301
+
302
+
303
+ Architecture
304
+
305
+
306
+
307
+ </span>
308
+
309
+
310
+
311
+ <span class="md-nav__icon md-icon"></span>
312
+ </label>
313
+
314
+ <a href="architecture.html" class="md-nav__link md-nav__link--active">
315
+
316
+
317
+
318
+ <span class="md-ellipsis">
319
+
320
+
321
+ Architecture
322
+
323
+
324
+
325
+ </span>
326
+
327
+
328
+
329
+ </a>
330
+
331
+
332
+
333
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
334
+
335
+
336
+
337
+
338
+
339
+
340
+ <label class="md-nav__title" for="__toc">
341
+ <span class="md-nav__icon md-icon"></span>
342
+ Table of contents
343
+ </label>
344
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
345
+
346
+ <li class="md-nav__item">
347
+ <a href="#intent-labels" class="md-nav__link">
348
+ <span class="md-ellipsis">
349
+
350
+ Intent Labels
351
+
352
+ </span>
353
+ </a>
354
+
355
+ </li>
356
+
357
+ <li class="md-nav__item">
358
+ <a href="#data-flow" class="md-nav__link">
359
+ <span class="md-ellipsis">
360
+
361
+ Data Flow
362
+
363
+ </span>
364
+ </a>
365
+
366
+ </li>
367
+
368
+ </ul>
369
+
370
+ </nav>
371
+
372
+ </li>
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+ <li class="md-nav__item">
383
+ <a href="llm-as-judge.html" class="md-nav__link">
384
+
385
+
386
+
387
+ <span class="md-ellipsis">
388
+
389
+
390
+ LLM-as-Judge
391
+
392
+
393
+
394
+ </span>
395
+
396
+
397
+
398
+ </a>
399
+ </li>
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+ <li class="md-nav__item">
410
+ <a href="mcp.html" class="md-nav__link">
411
+
412
+
413
+
414
+ <span class="md-ellipsis">
415
+
416
+
417
+ MCP
418
+
419
+
420
+
421
+ </span>
422
+
423
+
424
+
425
+ </a>
426
+ </li>
427
+
428
+
429
+
430
+
431
+
432
+
433
+
434
+
435
+
436
+ <li class="md-nav__item">
437
+ <a href="oauth.html" class="md-nav__link">
438
+
439
+
440
+
441
+ <span class="md-ellipsis">
442
+
443
+
444
+ OAuth
445
+
446
+
447
+
448
+ </span>
449
+
450
+
451
+
452
+ </a>
453
+ </li>
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+ <li class="md-nav__item">
464
+ <a href="inference.html" class="md-nav__link">
465
+
466
+
467
+
468
+ <span class="md-ellipsis">
469
+
470
+
471
+ Inference
472
+
473
+
474
+
475
+ </span>
476
+
477
+
478
+
479
+ </a>
480
+ </li>
481
+
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+
490
+ <li class="md-nav__item">
491
+ <a href="story.html" class="md-nav__link">
492
+
493
+
494
+
495
+ <span class="md-ellipsis">
496
+
497
+
498
+ Hackathon Story
499
+
500
+
501
+
502
+ </span>
503
+
504
+
505
+
506
+ </a>
507
+ </li>
508
+
509
+
510
+
511
+
512
+
513
+
514
+
515
+
516
+
517
+ <li class="md-nav__item">
518
+ <a href="deployment.html" class="md-nav__link">
519
+
520
+
521
+
522
+ <span class="md-ellipsis">
523
+
524
+
525
+ Deployment
526
+
527
+
528
+
529
+ </span>
530
+
531
+
532
+
533
+ </a>
534
+ </li>
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+ <li class="md-nav__item">
545
+ <a href="license.html" class="md-nav__link">
546
+
547
+
548
+
549
+ <span class="md-ellipsis">
550
+
551
+
552
+ License
553
+
554
+
555
+
556
+ </span>
557
+
558
+
559
+
560
+ </a>
561
+ </li>
562
+
563
+
564
+
565
+ </ul>
566
+ </nav>
567
+ </div>
568
+ </div>
569
+ </div>
570
+
571
+
572
+
573
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
574
+ <div class="md-sidebar__scrollwrap">
575
+ <div class="md-sidebar__inner">
576
+
577
+
578
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
579
+
580
+
581
+
582
+
583
+
584
+
585
+ <label class="md-nav__title" for="__toc">
586
+ <span class="md-nav__icon md-icon"></span>
587
+ Table of contents
588
+ </label>
589
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
590
+
591
+ <li class="md-nav__item">
592
+ <a href="#intent-labels" class="md-nav__link">
593
+ <span class="md-ellipsis">
594
+
595
+ Intent Labels
596
+
597
+ </span>
598
+ </a>
599
+
600
+ </li>
601
+
602
+ <li class="md-nav__item">
603
+ <a href="#data-flow" class="md-nav__link">
604
+ <span class="md-ellipsis">
605
+
606
+ Data Flow
607
+
608
+ </span>
609
+ </a>
610
+
611
+ </li>
612
+
613
+ </ul>
614
+
615
+ </nav>
616
+ </div>
617
+ </div>
618
+ </div>
619
+
620
+
621
+
622
+ <div class="md-content" data-md-component="content">
623
+
624
+ <article class="md-content__inner md-typeset">
625
+
626
+
627
+
628
+
629
+
630
+
631
+
632
+
633
+ <h1 id="architecture">Architecture</h1>
634
+ <table>
635
+ <thead>
636
+ <tr>
637
+ <th>Component</th>
638
+ <th>Description</th>
639
+ </tr>
640
+ </thead>
641
+ <tbody>
642
+ <tr>
643
+ <td><strong>Frontend</strong></td>
644
+ <td>Vue 3 / Vite dashboard β€” tabs: Model Card, Collab Hub, OpenAIRE Stream, Free Text, Saved History</td>
645
+ </tr>
646
+ <tr>
647
+ <td><strong>Backend</strong></td>
648
+ <td>FastAPI β€” inference, arXiv/OpenAIRE proxy, LLM judge orchestration, OAuth</td>
649
+ </tr>
650
+ <tr>
651
+ <td><strong>Classifier</strong></td>
652
+ <td>Echo-DSRN-98M (<code>EchoForSequenceClassification</code>) β€” fast CPU inference</td>
653
+ </tr>
654
+ <tr>
655
+ <td><strong>Annotation DB</strong></td>
656
+ <td>SQLite (<code>data/collaborative.db</code>) β€” user classifications and LLM judge labels</td>
657
+ </tr>
658
+ <tr>
659
+ <td><strong>Worker</strong></td>
660
+ <td>Celery + Redis β€” async classification and LLM-as-Judge queue</td>
661
+ </tr>
662
+ </tbody>
663
+ </table>
664
+ <h2 id="intent-labels">Intent Labels</h2>
665
+ <table>
666
+ <thead>
667
+ <tr>
668
+ <th>Label</th>
669
+ <th>Meaning</th>
670
+ </tr>
671
+ </thead>
672
+ <tbody>
673
+ <tr>
674
+ <td><code>Methodology</code></td>
675
+ <td>Introduces a new method, model, or algorithm</td>
676
+ </tr>
677
+ <tr>
678
+ <td><code>Dataset</code></td>
679
+ <td>Introduces or documents a dataset or benchmark</td>
680
+ </tr>
681
+ <tr>
682
+ <td><code>Review</code></td>
683
+ <td>Surveys or synthesises existing work</td>
684
+ </tr>
685
+ <tr>
686
+ <td><code>Applied</code></td>
687
+ <td>Applies existing methods to a domain problem</td>
688
+ </tr>
689
+ <tr>
690
+ <td><code>Theoretical</code></td>
691
+ <td>Mathematical or formal analysis without empirical evaluation</td>
692
+ </tr>
693
+ </tbody>
694
+ </table>
695
+ <h2 id="data-flow">Data Flow</h2>
696
+ <ol>
697
+ <li><strong>OpenAIRE Graph API</strong> streams paper metadata (title, abstract, DOI, language)</li>
698
+ <li><strong>Echo-DSRN-98M</strong> classifies research intent in &lt;1ms on CPU</li>
699
+ <li>Results displayed in the Vue 3 dashboard with probability bars</li>
700
+ <li>Optional: <strong>LLM-as-Judge</strong> enlists multiple LLMs to validate Echo's predictions</li>
701
+ <li>Annotations stored in SQLite, forming a golden consensus dataset</li>
702
+ </ol>
703
+
704
+
705
+
706
+
707
+
708
+
709
+
710
+
711
+
712
+
713
+
714
+
715
+
716
+ </article>
717
+ </div>
718
+
719
+
720
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
721
+ </div>
722
+
723
+ </main>
724
+
725
+ <footer class="md-footer">
726
+
727
+ <div class="md-footer-meta md-typeset">
728
+ <div class="md-footer-meta__inner md-grid">
729
+ <div class="md-copyright">
730
+
731
+
732
+ Made with
733
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
734
+ Material for MkDocs
735
+ </a>
736
+
737
+ </div>
738
+
739
+ </div>
740
+ </div>
741
+ </footer>
742
+
743
+ </div>
744
+ <div class="md-dialog" data-md-component="dialog">
745
+ <div class="md-dialog__inner md-typeset"></div>
746
+ </div>
747
+
748
+
749
+
750
+
751
+
752
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
753
+
754
+
755
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
756
+
757
+
758
+ </body>
759
+ </html>
deployment.html ADDED
@@ -0,0 +1,890 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="story.html">
15
+
16
+
17
+ <link rel="next" href="license.html">
18
+
19
+
20
+
21
+
22
+
23
+ <link rel="icon" href="assets/images/favicon.png">
24
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
25
+
26
+
27
+
28
+ <title>Deployment - OpenAIRE-AI-Research-Evaluator</title>
29
+
30
+
31
+
32
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
33
+
34
+
35
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
49
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
50
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
51
+
52
+
53
+
54
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#kubernetes-deployment-k3s" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ OpenAIRE-AI-Research-Evaluator
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ Deployment
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ <label class="md-header__button md-icon" for="__search">
128
+
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
130
+ </label>
131
+ <div class="md-search" data-md-component="search" role="dialog">
132
+ <label class="md-search__overlay" for="__search"></label>
133
+ <div class="md-search__inner" role="search">
134
+ <form class="md-search__form" name="search">
135
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
136
+ <label class="md-search__icon md-icon" for="__search">
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
139
+
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
141
+ </label>
142
+ <nav class="md-search__options" aria-label="Search">
143
+
144
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
145
+
146
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
147
+ </button>
148
+ </nav>
149
+
150
+ </form>
151
+ <div class="md-search__output">
152
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
153
+ <div class="md-search-result" data-md-component="search-result">
154
+ <div class="md-search-result__meta">
155
+ Initializing search
156
+ </div>
157
+ <ol class="md-search-result__list" role="presentation"></ol>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+
165
+
166
+ <div class="md-header__source">
167
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
168
+ <div class="md-source__icon md-icon">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
171
+ </div>
172
+ <div class="md-source__repository">
173
+ GitHub
174
+ </div>
175
+ </a>
176
+ </div>
177
+
178
+ </nav>
179
+
180
+ </header>
181
+
182
+ <div class="md-container" data-md-component="container">
183
+
184
+
185
+
186
+
187
+
188
+
189
+ <main class="md-main" data-md-component="main">
190
+ <div class="md-main__inner md-grid">
191
+
192
+
193
+
194
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
195
+ <div class="md-sidebar__scrollwrap">
196
+ <div class="md-sidebar__inner">
197
+
198
+
199
+
200
+
201
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
202
+ <label class="md-nav__title" for="__drawer">
203
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
204
+
205
+
206
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
207
+
208
+ </a>
209
+ OpenAIRE-AI-Research-Evaluator
210
+ </label>
211
+
212
+ <div class="md-nav__source">
213
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
214
+ <div class="md-source__icon md-icon">
215
+
216
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
217
+ </div>
218
+ <div class="md-source__repository">
219
+ GitHub
220
+ </div>
221
+ </a>
222
+ </div>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="index.html" class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ Home
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ <li class="md-nav__item">
260
+ <a href="quickstart.html" class="md-nav__link">
261
+
262
+
263
+
264
+ <span class="md-ellipsis">
265
+
266
+
267
+ Quick Start
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ </a>
276
+ </li>
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+ <li class="md-nav__item">
287
+ <a href="architecture.html" class="md-nav__link">
288
+
289
+
290
+
291
+ <span class="md-ellipsis">
292
+
293
+
294
+ Architecture
295
+
296
+
297
+
298
+ </span>
299
+
300
+
301
+
302
+ </a>
303
+ </li>
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <li class="md-nav__item">
314
+ <a href="llm-as-judge.html" class="md-nav__link">
315
+
316
+
317
+
318
+ <span class="md-ellipsis">
319
+
320
+
321
+ LLM-as-Judge
322
+
323
+
324
+
325
+ </span>
326
+
327
+
328
+
329
+ </a>
330
+ </li>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+ <li class="md-nav__item">
341
+ <a href="mcp.html" class="md-nav__link">
342
+
343
+
344
+
345
+ <span class="md-ellipsis">
346
+
347
+
348
+ MCP
349
+
350
+
351
+
352
+ </span>
353
+
354
+
355
+
356
+ </a>
357
+ </li>
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+ <li class="md-nav__item">
368
+ <a href="oauth.html" class="md-nav__link">
369
+
370
+
371
+
372
+ <span class="md-ellipsis">
373
+
374
+
375
+ OAuth
376
+
377
+
378
+
379
+ </span>
380
+
381
+
382
+
383
+ </a>
384
+ </li>
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+ <li class="md-nav__item">
395
+ <a href="inference.html" class="md-nav__link">
396
+
397
+
398
+
399
+ <span class="md-ellipsis">
400
+
401
+
402
+ Inference
403
+
404
+
405
+
406
+ </span>
407
+
408
+
409
+
410
+ </a>
411
+ </li>
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+ <li class="md-nav__item">
422
+ <a href="story.html" class="md-nav__link">
423
+
424
+
425
+
426
+ <span class="md-ellipsis">
427
+
428
+
429
+ Hackathon Story
430
+
431
+
432
+
433
+ </span>
434
+
435
+
436
+
437
+ </a>
438
+ </li>
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+ <li class="md-nav__item md-nav__item--active">
451
+
452
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
453
+
454
+
455
+
456
+
457
+
458
+ <label class="md-nav__link md-nav__link--active" for="__toc">
459
+
460
+
461
+
462
+ <span class="md-ellipsis">
463
+
464
+
465
+ Deployment
466
+
467
+
468
+
469
+ </span>
470
+
471
+
472
+
473
+ <span class="md-nav__icon md-icon"></span>
474
+ </label>
475
+
476
+ <a href="deployment.html" class="md-nav__link md-nav__link--active">
477
+
478
+
479
+
480
+ <span class="md-ellipsis">
481
+
482
+
483
+ Deployment
484
+
485
+
486
+
487
+ </span>
488
+
489
+
490
+
491
+ </a>
492
+
493
+
494
+
495
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
496
+
497
+
498
+
499
+
500
+
501
+
502
+ <label class="md-nav__title" for="__toc">
503
+ <span class="md-nav__icon md-icon"></span>
504
+ Table of contents
505
+ </label>
506
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
507
+
508
+ <li class="md-nav__item">
509
+ <a href="#prerequisites" class="md-nav__link">
510
+ <span class="md-ellipsis">
511
+
512
+ Prerequisites
513
+
514
+ </span>
515
+ </a>
516
+
517
+ </li>
518
+
519
+ <li class="md-nav__item">
520
+ <a href="#1-generate-postgresql-dump" class="md-nav__link">
521
+ <span class="md-ellipsis">
522
+
523
+ 1. Generate PostgreSQL dump
524
+
525
+ </span>
526
+ </a>
527
+
528
+ </li>
529
+
530
+ <li class="md-nav__item">
531
+ <a href="#2-install" class="md-nav__link">
532
+ <span class="md-ellipsis">
533
+
534
+ 2. Install
535
+
536
+ </span>
537
+ </a>
538
+
539
+ </li>
540
+
541
+ <li class="md-nav__item">
542
+ <a href="#3-load-golden-data" class="md-nav__link">
543
+ <span class="md-ellipsis">
544
+
545
+ 3. Load golden data
546
+
547
+ </span>
548
+ </a>
549
+
550
+ </li>
551
+
552
+ <li class="md-nav__item">
553
+ <a href="#4-access" class="md-nav__link">
554
+ <span class="md-ellipsis">
555
+
556
+ 4. Access
557
+
558
+ </span>
559
+ </a>
560
+
561
+ </li>
562
+
563
+ <li class="md-nav__item">
564
+ <a href="#components" class="md-nav__link">
565
+ <span class="md-ellipsis">
566
+
567
+ Components
568
+
569
+ </span>
570
+ </a>
571
+
572
+ </li>
573
+
574
+ <li class="md-nav__item">
575
+ <a href="#troubleshooting" class="md-nav__link">
576
+ <span class="md-ellipsis">
577
+
578
+ Troubleshooting
579
+
580
+ </span>
581
+ </a>
582
+
583
+ </li>
584
+
585
+ </ul>
586
+
587
+ </nav>
588
+
589
+ </li>
590
+
591
+
592
+
593
+
594
+
595
+
596
+
597
+
598
+
599
+ <li class="md-nav__item">
600
+ <a href="license.html" class="md-nav__link">
601
+
602
+
603
+
604
+ <span class="md-ellipsis">
605
+
606
+
607
+ License
608
+
609
+
610
+
611
+ </span>
612
+
613
+
614
+
615
+ </a>
616
+ </li>
617
+
618
+
619
+
620
+ </ul>
621
+ </nav>
622
+ </div>
623
+ </div>
624
+ </div>
625
+
626
+
627
+
628
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
629
+ <div class="md-sidebar__scrollwrap">
630
+ <div class="md-sidebar__inner">
631
+
632
+
633
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
634
+
635
+
636
+
637
+
638
+
639
+
640
+ <label class="md-nav__title" for="__toc">
641
+ <span class="md-nav__icon md-icon"></span>
642
+ Table of contents
643
+ </label>
644
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
645
+
646
+ <li class="md-nav__item">
647
+ <a href="#prerequisites" class="md-nav__link">
648
+ <span class="md-ellipsis">
649
+
650
+ Prerequisites
651
+
652
+ </span>
653
+ </a>
654
+
655
+ </li>
656
+
657
+ <li class="md-nav__item">
658
+ <a href="#1-generate-postgresql-dump" class="md-nav__link">
659
+ <span class="md-ellipsis">
660
+
661
+ 1. Generate PostgreSQL dump
662
+
663
+ </span>
664
+ </a>
665
+
666
+ </li>
667
+
668
+ <li class="md-nav__item">
669
+ <a href="#2-install" class="md-nav__link">
670
+ <span class="md-ellipsis">
671
+
672
+ 2. Install
673
+
674
+ </span>
675
+ </a>
676
+
677
+ </li>
678
+
679
+ <li class="md-nav__item">
680
+ <a href="#3-load-golden-data" class="md-nav__link">
681
+ <span class="md-ellipsis">
682
+
683
+ 3. Load golden data
684
+
685
+ </span>
686
+ </a>
687
+
688
+ </li>
689
+
690
+ <li class="md-nav__item">
691
+ <a href="#4-access" class="md-nav__link">
692
+ <span class="md-ellipsis">
693
+
694
+ 4. Access
695
+
696
+ </span>
697
+ </a>
698
+
699
+ </li>
700
+
701
+ <li class="md-nav__item">
702
+ <a href="#components" class="md-nav__link">
703
+ <span class="md-ellipsis">
704
+
705
+ Components
706
+
707
+ </span>
708
+ </a>
709
+
710
+ </li>
711
+
712
+ <li class="md-nav__item">
713
+ <a href="#troubleshooting" class="md-nav__link">
714
+ <span class="md-ellipsis">
715
+
716
+ Troubleshooting
717
+
718
+ </span>
719
+ </a>
720
+
721
+ </li>
722
+
723
+ </ul>
724
+
725
+ </nav>
726
+ </div>
727
+ </div>
728
+ </div>
729
+
730
+
731
+
732
+ <div class="md-content" data-md-component="content">
733
+
734
+ <article class="md-content__inner md-typeset">
735
+
736
+
737
+
738
+
739
+
740
+
741
+
742
+
743
+ <h1 id="kubernetes-deployment-k3s">Kubernetes Deployment (k3s)</h1>
744
+ <p>Deploy the OpenAIRE-AI-Research-Evaluator with Helm on k3s.</p>
745
+ <h2 id="prerequisites">Prerequisites</h2>
746
+ <ul>
747
+ <li>k3s cluster running</li>
748
+ <li><code>helm</code> installed</li>
749
+ <li>Access to the Docker image <code>ethicalabs/openaire-research-evaluator:latest</code></li>
750
+ <li><a href="https://huggingface.co/ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF">Request access</a> to the gated Echo-DSRN model</li>
751
+ </ul>
752
+ <h2 id="1-generate-postgresql-dump">1. Generate PostgreSQL dump</h2>
753
+ <p>The SQLite golden database must be migrated to PostgreSQL:</p>
754
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>./scripts/sqlite_to_postgres.sh
755
+ </code></pre></div>
756
+ <p>Generates <code>data/collaborative_pg.sql</code> β€” ready for PostgreSQL import.</p>
757
+ <h2 id="2-install">2. Install</h2>
758
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>helm<span class="w"> </span>install<span class="w"> </span>evaluator<span class="w"> </span>./helm/openaire-research-evaluator<span class="w"> </span><span class="se">\</span>
759
+ <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span>--set<span class="w"> </span>secrets.hfToken<span class="o">=</span>hf_...<span class="w"> </span><span class="se">\</span>
760
+ <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span>--set<span class="w"> </span>secrets.secretKey<span class="o">=</span><span class="k">$(</span>openssl<span class="w"> </span>rand<span class="w"> </span>-hex<span class="w"> </span><span class="m">32</span><span class="k">)</span><span class="w"> </span><span class="se">\</span>
761
+ <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span>--set<span class="w"> </span>ingress.host<span class="o">=</span>openaire-eval.local<span class="w"> </span><span class="se">\</span>
762
+ <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span>--set<span class="w"> </span>config.llmBaseUrl<span class="o">=</span>http://192.168.1.66:13305/v1
763
+ </code></pre></div>
764
+ <p>Or create a <code>values.local.yaml</code>:</p>
765
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="nt">secrets</span><span class="p">:</span>
766
+ <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="nt">hfToken</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">hf_...</span>
767
+ <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="nt">secretKey</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">abc123...</span>
768
+ <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="w"> </span><span class="nt">hfClientId</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
769
+ <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="nt">hfClientSecret</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span>
770
+ <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="nt">ingress</span><span class="p">:</span>
771
+ <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">openaire-eval.local</span>
772
+ <a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="nt">config</span><span class="p">:</span>
773
+ <a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="w"> </span><span class="nt">llmBaseUrl</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://192.168.1.66:13305/v1</span>
774
+ </code></pre></div>
775
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>helm<span class="w"> </span>install<span class="w"> </span>evaluator<span class="w"> </span>./helm/openaire-research-evaluator<span class="w"> </span>-f<span class="w"> </span>values.local.yaml
776
+ </code></pre></div>
777
+ <h2 id="3-load-golden-data">3. Load golden data</h2>
778
+ <p>Wait for PostgreSQL to be ready, then import:</p>
779
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>kubectl<span class="w"> </span>cp<span class="w"> </span>data/collaborative_pg.sql<span class="w"> </span><span class="se">\</span>
780
+ <a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="w"> </span><span class="k">$(</span>kubectl<span class="w"> </span>get<span class="w"> </span>pod<span class="w"> </span>-l<span class="w"> </span><span class="nv">component</span><span class="o">=</span>postgres<span class="w"> </span>-o<span class="w"> </span><span class="nv">jsonpath</span><span class="o">=</span><span class="s1">&#39;{.items[0].metadata.name}&#39;</span><span class="k">)</span>:/tmp/collaborative_pg.sql
781
+ <a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>
782
+ <a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a>kubectl<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>-it<span class="w"> </span>deployment/evaluator-openaire-research-evaluator-postgres<span class="w"> </span>--<span class="w"> </span><span class="se">\</span>
783
+ <a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>postgres<span class="w"> </span>-d<span class="w"> </span>echo_dsrn<span class="w"> </span>-f<span class="w"> </span>/tmp/collaborative_pg.sql
784
+ <a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>
785
+ <a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="c1"># Reset auto-increment sequences after import (IDs were explicit in the dump)</span>
786
+ <a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a>kubectl<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>deployment/evaluator-openaire-research-evaluator-postgres<span class="w"> </span>--<span class="w"> </span><span class="se">\</span>
787
+ <a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>postgres<span class="w"> </span>-d<span class="w"> </span>echo_dsrn<span class="w"> </span>-c<span class="w"> </span><span class="se">\</span>
788
+ <a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="w"> </span><span class="s2">&quot;SELECT setval(&#39;annotations_id_seq&#39;, COALESCE((SELECT MAX(id) FROM annotations), 1))&quot;</span>
789
+ </code></pre></div>
790
+ <h2 id="4-access">4. Access</h2>
791
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>kubectl<span class="w"> </span>port-forward<span class="w"> </span>svc/evaluator-openaire-research-evaluator-web<span class="w"> </span><span class="m">7860</span>:7860
792
+ </code></pre></div>
793
+ <p>App at <code>http://localhost:7860</code>. With Ingress configured, at <code>http://openaire-eval.local</code>.</p>
794
+ <p><strong>Local DNS setup:</strong> add to <code>/etc/hosts</code>:</p>
795
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;127.0.0.1 openaire-eval.local&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>sudo<span class="w"> </span>tee<span class="w"> </span>-a<span class="w"> </span>/etc/hosts
796
+ </code></pre></div>
797
+ <p>Then access at <code>http://openaire-eval.local</code> (k3s Traefik listens on port 80).</p>
798
+ <h2 id="components">Components</h2>
799
+ <table>
800
+ <thead>
801
+ <tr>
802
+ <th>Component</th>
803
+ <th>Service</th>
804
+ <th>Port</th>
805
+ </tr>
806
+ </thead>
807
+ <tbody>
808
+ <tr>
809
+ <td>Web (FastAPI + Vue)</td>
810
+ <td><code>&lt;release&gt;-web</code></td>
811
+ <td>7860</td>
812
+ </tr>
813
+ <tr>
814
+ <td>PostgreSQL</td>
815
+ <td><code>&lt;release&gt;-postgres</code></td>
816
+ <td>5432</td>
817
+ </tr>
818
+ <tr>
819
+ <td>Redis</td>
820
+ <td><code>&lt;release&gt;-redis</code></td>
821
+ <td>6379</td>
822
+ </tr>
823
+ <tr>
824
+ <td>Worker (Celery)</td>
825
+ <td>β€” (internal)</td>
826
+ <td>β€”</td>
827
+ </tr>
828
+ </tbody>
829
+ </table>
830
+ <h2 id="troubleshooting">Troubleshooting</h2>
831
+ <p>Check web pod logs for alembic migration status:</p>
832
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>kubectl<span class="w"> </span>logs<span class="w"> </span>deployment/evaluator-openaire-research-evaluator-web
833
+ </code></pre></div>
834
+
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+
847
+ </article>
848
+ </div>
849
+
850
+
851
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
852
+ </div>
853
+
854
+ </main>
855
+
856
+ <footer class="md-footer">
857
+
858
+ <div class="md-footer-meta md-typeset">
859
+ <div class="md-footer-meta__inner md-grid">
860
+ <div class="md-copyright">
861
+
862
+
863
+ Made with
864
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
865
+ Material for MkDocs
866
+ </a>
867
+
868
+ </div>
869
+
870
+ </div>
871
+ </div>
872
+ </footer>
873
+
874
+ </div>
875
+ <div class="md-dialog" data-md-component="dialog">
876
+ <div class="md-dialog__inner md-typeset"></div>
877
+ </div>
878
+
879
+
880
+
881
+
882
+
883
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
884
+
885
+
886
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
887
+
888
+
889
+ </body>
890
+ </html>
index.html CHANGED
@@ -12,7 +12,7 @@
12
 
13
 
14
 
15
- <link rel="next" href="quickstart/">
16
 
17
 
18
 
@@ -88,7 +88,7 @@
88
 
89
  <header class="md-header md-header--shadow" data-md-component="header">
90
  <nav class="md-header__inner md-grid" aria-label="Header">
91
- <a href="." title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
92
 
93
 
94
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
@@ -198,7 +198,7 @@
198
 
199
  <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
200
  <label class="md-nav__title" for="__drawer">
201
- <a href="." title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
202
 
203
 
204
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
@@ -255,7 +255,7 @@
255
  <span class="md-nav__icon md-icon"></span>
256
  </label>
257
 
258
- <a href="." class="md-nav__link md-nav__link--active">
259
 
260
 
261
 
@@ -324,7 +324,7 @@
324
 
325
 
326
  <li class="md-nav__item">
327
- <a href="quickstart/" class="md-nav__link">
328
 
329
 
330
 
@@ -351,7 +351,7 @@
351
 
352
 
353
  <li class="md-nav__item">
354
- <a href="architecture/" class="md-nav__link">
355
 
356
 
357
 
@@ -378,7 +378,7 @@
378
 
379
 
380
  <li class="md-nav__item">
381
- <a href="llm-as-judge/" class="md-nav__link">
382
 
383
 
384
 
@@ -405,7 +405,7 @@
405
 
406
 
407
  <li class="md-nav__item">
408
- <a href="mcp/" class="md-nav__link">
409
 
410
 
411
 
@@ -432,7 +432,7 @@
432
 
433
 
434
  <li class="md-nav__item">
435
- <a href="oauth/" class="md-nav__link">
436
 
437
 
438
 
@@ -459,7 +459,7 @@
459
 
460
 
461
  <li class="md-nav__item">
462
- <a href="inference/" class="md-nav__link">
463
 
464
 
465
 
@@ -486,7 +486,7 @@
486
 
487
 
488
  <li class="md-nav__item">
489
- <a href="story/" class="md-nav__link">
490
 
491
 
492
 
@@ -513,7 +513,7 @@
513
 
514
 
515
  <li class="md-nav__item">
516
- <a href="deployment/" class="md-nav__link">
517
 
518
 
519
 
@@ -540,7 +540,7 @@
540
 
541
 
542
  <li class="md-nav__item">
543
- <a href="license/" class="md-nav__link">
544
 
545
 
546
 
@@ -641,7 +641,7 @@
641
  </ul>
642
  <h2 id="hackathon-deliverable">Hackathon Deliverable</h2>
643
  <p>This project is the artifact submission for the OpenAIRE AI Hackathon 2026.</p>
644
- <p>The accompanying <a href="story/">story</a> explains the question, journey, insight, and what others can reuse.</p>
645
  <p><a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator">Source</a> Β· <a href="https://graph.openaire.eu">OpenAIRE Graph</a> Β· <a href="https://huggingface.co/ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF">Echo-DSRN Model</a></p>
646
 
647
 
 
12
 
13
 
14
 
15
+ <link rel="next" href="quickstart.html">
16
 
17
 
18
 
 
88
 
89
  <header class="md-header md-header--shadow" data-md-component="header">
90
  <nav class="md-header__inner md-grid" aria-label="Header">
91
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
92
 
93
 
94
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
 
198
 
199
  <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
200
  <label class="md-nav__title" for="__drawer">
201
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
202
 
203
 
204
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
 
255
  <span class="md-nav__icon md-icon"></span>
256
  </label>
257
 
258
+ <a href="index.html" class="md-nav__link md-nav__link--active">
259
 
260
 
261
 
 
324
 
325
 
326
  <li class="md-nav__item">
327
+ <a href="quickstart.html" class="md-nav__link">
328
 
329
 
330
 
 
351
 
352
 
353
  <li class="md-nav__item">
354
+ <a href="architecture.html" class="md-nav__link">
355
 
356
 
357
 
 
378
 
379
 
380
  <li class="md-nav__item">
381
+ <a href="llm-as-judge.html" class="md-nav__link">
382
 
383
 
384
 
 
405
 
406
 
407
  <li class="md-nav__item">
408
+ <a href="mcp.html" class="md-nav__link">
409
 
410
 
411
 
 
432
 
433
 
434
  <li class="md-nav__item">
435
+ <a href="oauth.html" class="md-nav__link">
436
 
437
 
438
 
 
459
 
460
 
461
  <li class="md-nav__item">
462
+ <a href="inference.html" class="md-nav__link">
463
 
464
 
465
 
 
486
 
487
 
488
  <li class="md-nav__item">
489
+ <a href="story.html" class="md-nav__link">
490
 
491
 
492
 
 
513
 
514
 
515
  <li class="md-nav__item">
516
+ <a href="deployment.html" class="md-nav__link">
517
 
518
 
519
 
 
540
 
541
 
542
  <li class="md-nav__item">
543
+ <a href="license.html" class="md-nav__link">
544
 
545
 
546
 
 
641
  </ul>
642
  <h2 id="hackathon-deliverable">Hackathon Deliverable</h2>
643
  <p>This project is the artifact submission for the OpenAIRE AI Hackathon 2026.</p>
644
+ <p>The accompanying <a href="story.html">story</a> explains the question, journey, insight, and what others can reuse.</p>
645
  <p><a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator">Source</a> Β· <a href="https://graph.openaire.eu">OpenAIRE Graph</a> Β· <a href="https://huggingface.co/ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF">Echo-DSRN Model</a></p>
646
 
647
 
inference.html ADDED
@@ -0,0 +1,783 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="oauth.html">
15
+
16
+
17
+ <link rel="next" href="story.html">
18
+
19
+
20
+
21
+
22
+
23
+ <link rel="icon" href="assets/images/favicon.png">
24
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
25
+
26
+
27
+
28
+ <title>Inference - OpenAIRE-AI-Research-Evaluator</title>
29
+
30
+
31
+
32
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
33
+
34
+
35
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
49
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
50
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
51
+
52
+
53
+
54
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#inference" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ OpenAIRE-AI-Research-Evaluator
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ Inference
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ <label class="md-header__button md-icon" for="__search">
128
+
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
130
+ </label>
131
+ <div class="md-search" data-md-component="search" role="dialog">
132
+ <label class="md-search__overlay" for="__search"></label>
133
+ <div class="md-search__inner" role="search">
134
+ <form class="md-search__form" name="search">
135
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
136
+ <label class="md-search__icon md-icon" for="__search">
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
139
+
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
141
+ </label>
142
+ <nav class="md-search__options" aria-label="Search">
143
+
144
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
145
+
146
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
147
+ </button>
148
+ </nav>
149
+
150
+ </form>
151
+ <div class="md-search__output">
152
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
153
+ <div class="md-search-result" data-md-component="search-result">
154
+ <div class="md-search-result__meta">
155
+ Initializing search
156
+ </div>
157
+ <ol class="md-search-result__list" role="presentation"></ol>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+
165
+
166
+ <div class="md-header__source">
167
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
168
+ <div class="md-source__icon md-icon">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
171
+ </div>
172
+ <div class="md-source__repository">
173
+ GitHub
174
+ </div>
175
+ </a>
176
+ </div>
177
+
178
+ </nav>
179
+
180
+ </header>
181
+
182
+ <div class="md-container" data-md-component="container">
183
+
184
+
185
+
186
+
187
+
188
+
189
+ <main class="md-main" data-md-component="main">
190
+ <div class="md-main__inner md-grid">
191
+
192
+
193
+
194
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
195
+ <div class="md-sidebar__scrollwrap">
196
+ <div class="md-sidebar__inner">
197
+
198
+
199
+
200
+
201
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
202
+ <label class="md-nav__title" for="__drawer">
203
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
204
+
205
+
206
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
207
+
208
+ </a>
209
+ OpenAIRE-AI-Research-Evaluator
210
+ </label>
211
+
212
+ <div class="md-nav__source">
213
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
214
+ <div class="md-source__icon md-icon">
215
+
216
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
217
+ </div>
218
+ <div class="md-source__repository">
219
+ GitHub
220
+ </div>
221
+ </a>
222
+ </div>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="index.html" class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ Home
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ <li class="md-nav__item">
260
+ <a href="quickstart.html" class="md-nav__link">
261
+
262
+
263
+
264
+ <span class="md-ellipsis">
265
+
266
+
267
+ Quick Start
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ </a>
276
+ </li>
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+ <li class="md-nav__item">
287
+ <a href="architecture.html" class="md-nav__link">
288
+
289
+
290
+
291
+ <span class="md-ellipsis">
292
+
293
+
294
+ Architecture
295
+
296
+
297
+
298
+ </span>
299
+
300
+
301
+
302
+ </a>
303
+ </li>
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <li class="md-nav__item">
314
+ <a href="llm-as-judge.html" class="md-nav__link">
315
+
316
+
317
+
318
+ <span class="md-ellipsis">
319
+
320
+
321
+ LLM-as-Judge
322
+
323
+
324
+
325
+ </span>
326
+
327
+
328
+
329
+ </a>
330
+ </li>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+ <li class="md-nav__item">
341
+ <a href="mcp.html" class="md-nav__link">
342
+
343
+
344
+
345
+ <span class="md-ellipsis">
346
+
347
+
348
+ MCP
349
+
350
+
351
+
352
+ </span>
353
+
354
+
355
+
356
+ </a>
357
+ </li>
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+ <li class="md-nav__item">
368
+ <a href="oauth.html" class="md-nav__link">
369
+
370
+
371
+
372
+ <span class="md-ellipsis">
373
+
374
+
375
+ OAuth
376
+
377
+
378
+
379
+ </span>
380
+
381
+
382
+
383
+ </a>
384
+ </li>
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+ <li class="md-nav__item md-nav__item--active">
397
+
398
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
399
+
400
+
401
+
402
+
403
+
404
+ <label class="md-nav__link md-nav__link--active" for="__toc">
405
+
406
+
407
+
408
+ <span class="md-ellipsis">
409
+
410
+
411
+ Inference
412
+
413
+
414
+
415
+ </span>
416
+
417
+
418
+
419
+ <span class="md-nav__icon md-icon"></span>
420
+ </label>
421
+
422
+ <a href="inference.html" class="md-nav__link md-nav__link--active">
423
+
424
+
425
+
426
+ <span class="md-ellipsis">
427
+
428
+
429
+ Inference
430
+
431
+
432
+
433
+ </span>
434
+
435
+
436
+
437
+ </a>
438
+
439
+
440
+
441
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
442
+
443
+
444
+
445
+
446
+
447
+
448
+ <label class="md-nav__title" for="__toc">
449
+ <span class="md-nav__icon md-icon"></span>
450
+ Table of contents
451
+ </label>
452
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
453
+
454
+ <li class="md-nav__item">
455
+ <a href="#install" class="md-nav__link">
456
+ <span class="md-ellipsis">
457
+
458
+ Install
459
+
460
+ </span>
461
+ </a>
462
+
463
+ </li>
464
+
465
+ <li class="md-nav__item">
466
+ <a href="#classify" class="md-nav__link">
467
+ <span class="md-ellipsis">
468
+
469
+ Classify
470
+
471
+ </span>
472
+ </a>
473
+
474
+ </li>
475
+
476
+ <li class="md-nav__item">
477
+ <a href="#model-specs" class="md-nav__link">
478
+ <span class="md-ellipsis">
479
+
480
+ Model Specs
481
+
482
+ </span>
483
+ </a>
484
+
485
+ </li>
486
+
487
+ </ul>
488
+
489
+ </nav>
490
+
491
+ </li>
492
+
493
+
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+ <li class="md-nav__item">
502
+ <a href="story.html" class="md-nav__link">
503
+
504
+
505
+
506
+ <span class="md-ellipsis">
507
+
508
+
509
+ Hackathon Story
510
+
511
+
512
+
513
+ </span>
514
+
515
+
516
+
517
+ </a>
518
+ </li>
519
+
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+ <li class="md-nav__item">
529
+ <a href="deployment.html" class="md-nav__link">
530
+
531
+
532
+
533
+ <span class="md-ellipsis">
534
+
535
+
536
+ Deployment
537
+
538
+
539
+
540
+ </span>
541
+
542
+
543
+
544
+ </a>
545
+ </li>
546
+
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+
555
+ <li class="md-nav__item">
556
+ <a href="license.html" class="md-nav__link">
557
+
558
+
559
+
560
+ <span class="md-ellipsis">
561
+
562
+
563
+ License
564
+
565
+
566
+
567
+ </span>
568
+
569
+
570
+
571
+ </a>
572
+ </li>
573
+
574
+
575
+
576
+ </ul>
577
+ </nav>
578
+ </div>
579
+ </div>
580
+ </div>
581
+
582
+
583
+
584
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
585
+ <div class="md-sidebar__scrollwrap">
586
+ <div class="md-sidebar__inner">
587
+
588
+
589
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
590
+
591
+
592
+
593
+
594
+
595
+
596
+ <label class="md-nav__title" for="__toc">
597
+ <span class="md-nav__icon md-icon"></span>
598
+ Table of contents
599
+ </label>
600
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
601
+
602
+ <li class="md-nav__item">
603
+ <a href="#install" class="md-nav__link">
604
+ <span class="md-ellipsis">
605
+
606
+ Install
607
+
608
+ </span>
609
+ </a>
610
+
611
+ </li>
612
+
613
+ <li class="md-nav__item">
614
+ <a href="#classify" class="md-nav__link">
615
+ <span class="md-ellipsis">
616
+
617
+ Classify
618
+
619
+ </span>
620
+ </a>
621
+
622
+ </li>
623
+
624
+ <li class="md-nav__item">
625
+ <a href="#model-specs" class="md-nav__link">
626
+ <span class="md-ellipsis">
627
+
628
+ Model Specs
629
+
630
+ </span>
631
+ </a>
632
+
633
+ </li>
634
+
635
+ </ul>
636
+
637
+ </nav>
638
+ </div>
639
+ </div>
640
+ </div>
641
+
642
+
643
+
644
+ <div class="md-content" data-md-component="content">
645
+
646
+ <article class="md-content__inner md-typeset">
647
+
648
+
649
+
650
+
651
+
652
+
653
+
654
+
655
+ <h1 id="inference">Inference</h1>
656
+ <blockquote>
657
+ <p><strong>Model:</strong> <a href="https://huggingface.co/ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF"><code>ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF</code></a> β€” gated repo, <a href="https://huggingface.co/ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF">request access</a> before use.</p>
658
+ </blockquote>
659
+ <h2 id="install">Install</h2>
660
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>pip<span class="w"> </span>install<span class="w"> </span>git+https://github.com/ethicalabs-ai/Echo-DSRN.git
661
+ </code></pre></div>
662
+ <h2 id="classify">Classify</h2>
663
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">echo_dsrn</span><span class="w"> </span><span class="kn">import</span> <span class="n">EchoForSequenceClassification</span>
664
+ <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">transformers</span><span class="w"> </span><span class="kn">import</span> <span class="n">AutoTokenizer</span>
665
+ <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
666
+ <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="n">model</span> <span class="o">=</span> <span class="n">EchoForSequenceClassification</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span>
667
+ <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> <span class="s2">&quot;ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF&quot;</span><span class="p">,</span> <span class="n">trust_remote_code</span><span class="o">=</span><span class="kc">True</span>
668
+ <a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="p">)</span>
669
+ <a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="n">tokenizer</span> <span class="o">=</span> <span class="n">AutoTokenizer</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span>
670
+ <a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a> <span class="s2">&quot;ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF&quot;</span><span class="p">,</span> <span class="n">trust_remote_code</span><span class="o">=</span><span class="kc">True</span>
671
+ <a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="p">)</span>
672
+ <a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a>
673
+ <a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="n">label</span><span class="p">,</span> <span class="n">probs</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">classify</span><span class="p">(</span>
674
+ <a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a> <span class="s2">&quot;Title: Attention Is All You Need</span><span class="se">\n</span><span class="s2">&quot;</span>
675
+ <a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a> <span class="s2">&quot;Abstract: We propose a new simple network architecture, the Transformer...&quot;</span><span class="p">,</span>
676
+ <a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a> <span class="n">tokenizer</span><span class="o">=</span><span class="n">tokenizer</span><span class="p">,</span>
677
+ <a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="p">)</span>
678
+ <a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="nb">print</span><span class="p">(</span><span class="n">label</span><span class="p">,</span> <span class="n">probs</span><span class="p">)</span>
679
+ <a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="c1"># β†’ Methodology tensor([0.87, 0.03, 0.02, 0.06, 0.02])</span>
680
+ </code></pre></div>
681
+ <h2 id="model-specs">Model Specs</h2>
682
+ <table>
683
+ <thead>
684
+ <tr>
685
+ <th>Property</th>
686
+ <th>Value</th>
687
+ </tr>
688
+ </thead>
689
+ <tbody>
690
+ <tr>
691
+ <td>Architecture</td>
692
+ <td>Echo-DSRN (Recurrent Neural Network)</td>
693
+ </tr>
694
+ <tr>
695
+ <td>Parameters</td>
696
+ <td>98,266,629 (~98M)</td>
697
+ </tr>
698
+ <tr>
699
+ <td>Layers</td>
700
+ <td>8 DSRN blocks</td>
701
+ </tr>
702
+ <tr>
703
+ <td>Hidden dim</td>
704
+ <td>512</td>
705
+ </tr>
706
+ <tr>
707
+ <td>Attention heads</td>
708
+ <td>4</td>
709
+ </tr>
710
+ <tr>
711
+ <td>Vocab size</td>
712
+ <td>32,017 tokens</td>
713
+ </tr>
714
+ <tr>
715
+ <td>Precision</td>
716
+ <td>bfloat16</td>
717
+ </tr>
718
+ <tr>
719
+ <td>Inference</td>
720
+ <td>Fast on CPU</td>
721
+ </tr>
722
+ </tbody>
723
+ </table>
724
+ <blockquote>
725
+ <p>Run <code>curl /api/model/card</code> for live specs from the loaded model.</p>
726
+ </blockquote>
727
+
728
+
729
+
730
+
731
+
732
+
733
+
734
+
735
+
736
+
737
+
738
+
739
+
740
+ </article>
741
+ </div>
742
+
743
+
744
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
745
+ </div>
746
+
747
+ </main>
748
+
749
+ <footer class="md-footer">
750
+
751
+ <div class="md-footer-meta md-typeset">
752
+ <div class="md-footer-meta__inner md-grid">
753
+ <div class="md-copyright">
754
+
755
+
756
+ Made with
757
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
758
+ Material for MkDocs
759
+ </a>
760
+
761
+ </div>
762
+
763
+ </div>
764
+ </div>
765
+ </footer>
766
+
767
+ </div>
768
+ <div class="md-dialog" data-md-component="dialog">
769
+ <div class="md-dialog__inner md-typeset"></div>
770
+ </div>
771
+
772
+
773
+
774
+
775
+
776
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
777
+
778
+
779
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
780
+
781
+
782
+ </body>
783
+ </html>
license.html ADDED
@@ -0,0 +1,746 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="deployment.html">
15
+
16
+
17
+
18
+
19
+
20
+
21
+ <link rel="icon" href="assets/images/favicon.png">
22
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
23
+
24
+
25
+
26
+ <title>License - OpenAIRE-AI-Research-Evaluator</title>
27
+
28
+
29
+
30
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
31
+
32
+
33
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
47
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
48
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
49
+
50
+
51
+
52
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
53
+
54
+
55
+
56
+
57
+
58
+ </head>
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
67
+
68
+
69
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
70
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
71
+ <label class="md-overlay" for="__drawer"></label>
72
+ <div data-md-component="skip">
73
+
74
+
75
+ <a href="#license" class="md-skip">
76
+ Skip to content
77
+ </a>
78
+
79
+ </div>
80
+ <div data-md-component="announce">
81
+
82
+ </div>
83
+
84
+
85
+
86
+
87
+
88
+
89
+ <header class="md-header md-header--shadow" data-md-component="header">
90
+ <nav class="md-header__inner md-grid" aria-label="Header">
91
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
92
+
93
+
94
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
95
+
96
+ </a>
97
+ <label class="md-header__button md-icon" for="__drawer">
98
+
99
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
100
+ </label>
101
+ <div class="md-header__title" data-md-component="header-title">
102
+ <div class="md-header__ellipsis">
103
+ <div class="md-header__topic">
104
+ <span class="md-ellipsis">
105
+ OpenAIRE-AI-Research-Evaluator
106
+ </span>
107
+ </div>
108
+ <div class="md-header__topic" data-md-component="header-topic">
109
+ <span class="md-ellipsis">
110
+
111
+ License
112
+
113
+ </span>
114
+ </div>
115
+ </div>
116
+ </div>
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+ <label class="md-header__button md-icon" for="__search">
126
+
127
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
128
+ </label>
129
+ <div class="md-search" data-md-component="search" role="dialog">
130
+ <label class="md-search__overlay" for="__search"></label>
131
+ <div class="md-search__inner" role="search">
132
+ <form class="md-search__form" name="search">
133
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
134
+ <label class="md-search__icon md-icon" for="__search">
135
+
136
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
139
+ </label>
140
+ <nav class="md-search__options" aria-label="Search">
141
+
142
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
143
+
144
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
145
+ </button>
146
+ </nav>
147
+
148
+ </form>
149
+ <div class="md-search__output">
150
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
151
+ <div class="md-search-result" data-md-component="search-result">
152
+ <div class="md-search-result__meta">
153
+ Initializing search
154
+ </div>
155
+ <ol class="md-search-result__list" role="presentation"></ol>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ </div>
161
+
162
+
163
+
164
+ <div class="md-header__source">
165
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
166
+ <div class="md-source__icon md-icon">
167
+
168
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
169
+ </div>
170
+ <div class="md-source__repository">
171
+ GitHub
172
+ </div>
173
+ </a>
174
+ </div>
175
+
176
+ </nav>
177
+
178
+ </header>
179
+
180
+ <div class="md-container" data-md-component="container">
181
+
182
+
183
+
184
+
185
+
186
+
187
+ <main class="md-main" data-md-component="main">
188
+ <div class="md-main__inner md-grid">
189
+
190
+
191
+
192
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
193
+ <div class="md-sidebar__scrollwrap">
194
+ <div class="md-sidebar__inner">
195
+
196
+
197
+
198
+
199
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
200
+ <label class="md-nav__title" for="__drawer">
201
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
202
+
203
+
204
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
205
+
206
+ </a>
207
+ OpenAIRE-AI-Research-Evaluator
208
+ </label>
209
+
210
+ <div class="md-nav__source">
211
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
212
+ <div class="md-source__icon md-icon">
213
+
214
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
215
+ </div>
216
+ <div class="md-source__repository">
217
+ GitHub
218
+ </div>
219
+ </a>
220
+ </div>
221
+
222
+ <ul class="md-nav__list" data-md-scrollfix>
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+ <li class="md-nav__item">
231
+ <a href="index.html" class="md-nav__link">
232
+
233
+
234
+
235
+ <span class="md-ellipsis">
236
+
237
+
238
+ Home
239
+
240
+
241
+
242
+ </span>
243
+
244
+
245
+
246
+ </a>
247
+ </li>
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+ <li class="md-nav__item">
258
+ <a href="quickstart.html" class="md-nav__link">
259
+
260
+
261
+
262
+ <span class="md-ellipsis">
263
+
264
+
265
+ Quick Start
266
+
267
+
268
+
269
+ </span>
270
+
271
+
272
+
273
+ </a>
274
+ </li>
275
+
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+ <li class="md-nav__item">
285
+ <a href="architecture.html" class="md-nav__link">
286
+
287
+
288
+
289
+ <span class="md-ellipsis">
290
+
291
+
292
+ Architecture
293
+
294
+
295
+
296
+ </span>
297
+
298
+
299
+
300
+ </a>
301
+ </li>
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+ <li class="md-nav__item">
312
+ <a href="llm-as-judge.html" class="md-nav__link">
313
+
314
+
315
+
316
+ <span class="md-ellipsis">
317
+
318
+
319
+ LLM-as-Judge
320
+
321
+
322
+
323
+ </span>
324
+
325
+
326
+
327
+ </a>
328
+ </li>
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+ <li class="md-nav__item">
339
+ <a href="mcp.html" class="md-nav__link">
340
+
341
+
342
+
343
+ <span class="md-ellipsis">
344
+
345
+
346
+ MCP
347
+
348
+
349
+
350
+ </span>
351
+
352
+
353
+
354
+ </a>
355
+ </li>
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+ <li class="md-nav__item">
366
+ <a href="oauth.html" class="md-nav__link">
367
+
368
+
369
+
370
+ <span class="md-ellipsis">
371
+
372
+
373
+ OAuth
374
+
375
+
376
+
377
+ </span>
378
+
379
+
380
+
381
+ </a>
382
+ </li>
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+ <li class="md-nav__item">
393
+ <a href="inference.html" class="md-nav__link">
394
+
395
+
396
+
397
+ <span class="md-ellipsis">
398
+
399
+
400
+ Inference
401
+
402
+
403
+
404
+ </span>
405
+
406
+
407
+
408
+ </a>
409
+ </li>
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+ <li class="md-nav__item">
420
+ <a href="story.html" class="md-nav__link">
421
+
422
+
423
+
424
+ <span class="md-ellipsis">
425
+
426
+
427
+ Hackathon Story
428
+
429
+
430
+
431
+ </span>
432
+
433
+
434
+
435
+ </a>
436
+ </li>
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+ <li class="md-nav__item">
447
+ <a href="deployment.html" class="md-nav__link">
448
+
449
+
450
+
451
+ <span class="md-ellipsis">
452
+
453
+
454
+ Deployment
455
+
456
+
457
+
458
+ </span>
459
+
460
+
461
+
462
+ </a>
463
+ </li>
464
+
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+ <li class="md-nav__item md-nav__item--active">
476
+
477
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
478
+
479
+
480
+
481
+
482
+
483
+ <label class="md-nav__link md-nav__link--active" for="__toc">
484
+
485
+
486
+
487
+ <span class="md-ellipsis">
488
+
489
+
490
+ License
491
+
492
+
493
+
494
+ </span>
495
+
496
+
497
+
498
+ <span class="md-nav__icon md-icon"></span>
499
+ </label>
500
+
501
+ <a href="license.html" class="md-nav__link md-nav__link--active">
502
+
503
+
504
+
505
+ <span class="md-ellipsis">
506
+
507
+
508
+ License
509
+
510
+
511
+
512
+ </span>
513
+
514
+
515
+
516
+ </a>
517
+
518
+
519
+
520
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
521
+
522
+
523
+
524
+
525
+
526
+
527
+ <label class="md-nav__title" for="__toc">
528
+ <span class="md-nav__icon md-icon"></span>
529
+ Table of contents
530
+ </label>
531
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
532
+
533
+ <li class="md-nav__item">
534
+ <a href="#code" class="md-nav__link">
535
+ <span class="md-ellipsis">
536
+
537
+ Code
538
+
539
+ </span>
540
+ </a>
541
+
542
+ </li>
543
+
544
+ <li class="md-nav__item">
545
+ <a href="#openaire-graph" class="md-nav__link">
546
+ <span class="md-ellipsis">
547
+
548
+ OpenAIRE Graph
549
+
550
+ </span>
551
+ </a>
552
+
553
+ </li>
554
+
555
+ <li class="md-nav__item">
556
+ <a href="#hackathon-deliverable" class="md-nav__link">
557
+ <span class="md-ellipsis">
558
+
559
+ Hackathon Deliverable
560
+
561
+ </span>
562
+ </a>
563
+
564
+ </li>
565
+
566
+ <li class="md-nav__item">
567
+ <a href="#attribution" class="md-nav__link">
568
+ <span class="md-ellipsis">
569
+
570
+ Attribution
571
+
572
+ </span>
573
+ </a>
574
+
575
+ </li>
576
+
577
+ </ul>
578
+
579
+ </nav>
580
+
581
+ </li>
582
+
583
+
584
+
585
+ </ul>
586
+ </nav>
587
+ </div>
588
+ </div>
589
+ </div>
590
+
591
+
592
+
593
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
594
+ <div class="md-sidebar__scrollwrap">
595
+ <div class="md-sidebar__inner">
596
+
597
+
598
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
599
+
600
+
601
+
602
+
603
+
604
+
605
+ <label class="md-nav__title" for="__toc">
606
+ <span class="md-nav__icon md-icon"></span>
607
+ Table of contents
608
+ </label>
609
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
610
+
611
+ <li class="md-nav__item">
612
+ <a href="#code" class="md-nav__link">
613
+ <span class="md-ellipsis">
614
+
615
+ Code
616
+
617
+ </span>
618
+ </a>
619
+
620
+ </li>
621
+
622
+ <li class="md-nav__item">
623
+ <a href="#openaire-graph" class="md-nav__link">
624
+ <span class="md-ellipsis">
625
+
626
+ OpenAIRE Graph
627
+
628
+ </span>
629
+ </a>
630
+
631
+ </li>
632
+
633
+ <li class="md-nav__item">
634
+ <a href="#hackathon-deliverable" class="md-nav__link">
635
+ <span class="md-ellipsis">
636
+
637
+ Hackathon Deliverable
638
+
639
+ </span>
640
+ </a>
641
+
642
+ </li>
643
+
644
+ <li class="md-nav__item">
645
+ <a href="#attribution" class="md-nav__link">
646
+ <span class="md-ellipsis">
647
+
648
+ Attribution
649
+
650
+ </span>
651
+ </a>
652
+
653
+ </li>
654
+
655
+ </ul>
656
+
657
+ </nav>
658
+ </div>
659
+ </div>
660
+ </div>
661
+
662
+
663
+
664
+ <div class="md-content" data-md-component="content">
665
+
666
+ <article class="md-content__inner md-typeset">
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+ <h1 id="license">License</h1>
676
+ <h2 id="code">Code</h2>
677
+ <p>Apache License 2.0 β€” see <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator/blob/main/LICENSE">LICENSE</a>.</p>
678
+ <p>Copyright Β© 2026 ethicalabs.ai</p>
679
+ <h2 id="openaire-graph">OpenAIRE Graph</h2>
680
+ <p>This project uses the <a href="https://graph.openaire.eu">OpenAIRE Graph API</a>. All materials created by OpenAIRE are licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.</p>
681
+ <h2 id="hackathon-deliverable">Hackathon Deliverable</h2>
682
+ <p>This project is submitted to the <a href="https://innovation.openaire.eu/component/content/article/openaire-ai-hackathon.html">OpenAIRE AI Hackathon 2026</a>. Per hackathon requirements, all submitted materials are available under a CC-BY license.</p>
683
+ <h2 id="attribution">Attribution</h2>
684
+ <p>If you reuse this work, please cite:</p>
685
+ <blockquote>
686
+ <p><em>OpenAIRE-AI-Research-Evaluator β€” Multi-model LLM-as-Judge pipeline for research intent classification.</em>
687
+ ethicalabs.ai, 2026. Apache-2.0 / CC-BY 4.0.
688
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator">github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator</a></p>
689
+ </blockquote>
690
+
691
+
692
+
693
+
694
+
695
+
696
+
697
+
698
+
699
+
700
+
701
+
702
+
703
+ </article>
704
+ </div>
705
+
706
+
707
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
708
+ </div>
709
+
710
+ </main>
711
+
712
+ <footer class="md-footer">
713
+
714
+ <div class="md-footer-meta md-typeset">
715
+ <div class="md-footer-meta__inner md-grid">
716
+ <div class="md-copyright">
717
+
718
+
719
+ Made with
720
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
721
+ Material for MkDocs
722
+ </a>
723
+
724
+ </div>
725
+
726
+ </div>
727
+ </div>
728
+ </footer>
729
+
730
+ </div>
731
+ <div class="md-dialog" data-md-component="dialog">
732
+ <div class="md-dialog__inner md-typeset"></div>
733
+ </div>
734
+
735
+
736
+
737
+
738
+
739
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
740
+
741
+
742
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
743
+
744
+
745
+ </body>
746
+ </html>
llm-as-judge.html ADDED
@@ -0,0 +1,1028 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="architecture.html">
15
+
16
+
17
+ <link rel="next" href="mcp.html">
18
+
19
+
20
+
21
+
22
+
23
+ <link rel="icon" href="assets/images/favicon.png">
24
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
25
+
26
+
27
+
28
+ <title>LLM-as-Judge - OpenAIRE-AI-Research-Evaluator</title>
29
+
30
+
31
+
32
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
33
+
34
+
35
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
49
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
50
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
51
+
52
+
53
+
54
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#llm-as-judge" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ OpenAIRE-AI-Research-Evaluator
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ LLM-as-Judge
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ <label class="md-header__button md-icon" for="__search">
128
+
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
130
+ </label>
131
+ <div class="md-search" data-md-component="search" role="dialog">
132
+ <label class="md-search__overlay" for="__search"></label>
133
+ <div class="md-search__inner" role="search">
134
+ <form class="md-search__form" name="search">
135
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
136
+ <label class="md-search__icon md-icon" for="__search">
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
139
+
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
141
+ </label>
142
+ <nav class="md-search__options" aria-label="Search">
143
+
144
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
145
+
146
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
147
+ </button>
148
+ </nav>
149
+
150
+ </form>
151
+ <div class="md-search__output">
152
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
153
+ <div class="md-search-result" data-md-component="search-result">
154
+ <div class="md-search-result__meta">
155
+ Initializing search
156
+ </div>
157
+ <ol class="md-search-result__list" role="presentation"></ol>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+
165
+
166
+ <div class="md-header__source">
167
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
168
+ <div class="md-source__icon md-icon">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
171
+ </div>
172
+ <div class="md-source__repository">
173
+ GitHub
174
+ </div>
175
+ </a>
176
+ </div>
177
+
178
+ </nav>
179
+
180
+ </header>
181
+
182
+ <div class="md-container" data-md-component="container">
183
+
184
+
185
+
186
+
187
+
188
+
189
+ <main class="md-main" data-md-component="main">
190
+ <div class="md-main__inner md-grid">
191
+
192
+
193
+
194
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
195
+ <div class="md-sidebar__scrollwrap">
196
+ <div class="md-sidebar__inner">
197
+
198
+
199
+
200
+
201
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
202
+ <label class="md-nav__title" for="__drawer">
203
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
204
+
205
+
206
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
207
+
208
+ </a>
209
+ OpenAIRE-AI-Research-Evaluator
210
+ </label>
211
+
212
+ <div class="md-nav__source">
213
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
214
+ <div class="md-source__icon md-icon">
215
+
216
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
217
+ </div>
218
+ <div class="md-source__repository">
219
+ GitHub
220
+ </div>
221
+ </a>
222
+ </div>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="index.html" class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ Home
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ <li class="md-nav__item">
260
+ <a href="quickstart.html" class="md-nav__link">
261
+
262
+
263
+
264
+ <span class="md-ellipsis">
265
+
266
+
267
+ Quick Start
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ </a>
276
+ </li>
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+ <li class="md-nav__item">
287
+ <a href="architecture.html" class="md-nav__link">
288
+
289
+
290
+
291
+ <span class="md-ellipsis">
292
+
293
+
294
+ Architecture
295
+
296
+
297
+
298
+ </span>
299
+
300
+
301
+
302
+ </a>
303
+ </li>
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+ <li class="md-nav__item md-nav__item--active">
316
+
317
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
318
+
319
+
320
+
321
+
322
+
323
+ <label class="md-nav__link md-nav__link--active" for="__toc">
324
+
325
+
326
+
327
+ <span class="md-ellipsis">
328
+
329
+
330
+ LLM-as-Judge
331
+
332
+
333
+
334
+ </span>
335
+
336
+
337
+
338
+ <span class="md-nav__icon md-icon"></span>
339
+ </label>
340
+
341
+ <a href="llm-as-judge.html" class="md-nav__link md-nav__link--active">
342
+
343
+
344
+
345
+ <span class="md-ellipsis">
346
+
347
+
348
+ LLM-as-Judge
349
+
350
+
351
+
352
+ </span>
353
+
354
+
355
+
356
+ </a>
357
+
358
+
359
+
360
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
361
+
362
+
363
+
364
+
365
+
366
+
367
+ <label class="md-nav__title" for="__toc">
368
+ <span class="md-nav__icon md-icon"></span>
369
+ Table of contents
370
+ </label>
371
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
372
+
373
+ <li class="md-nav__item">
374
+ <a href="#search-queries" class="md-nav__link">
375
+ <span class="md-ellipsis">
376
+
377
+ Search Queries
378
+
379
+ </span>
380
+ </a>
381
+
382
+ </li>
383
+
384
+ <li class="md-nav__item">
385
+ <a href="#setup" class="md-nav__link">
386
+ <span class="md-ellipsis">
387
+
388
+ Setup
389
+
390
+ </span>
391
+ </a>
392
+
393
+ </li>
394
+
395
+ <li class="md-nav__item">
396
+ <a href="#llm-server-setup" class="md-nav__link">
397
+ <span class="md-ellipsis">
398
+
399
+ LLM Server Setup
400
+
401
+ </span>
402
+ </a>
403
+
404
+ <nav class="md-nav" aria-label="LLM Server Setup">
405
+ <ul class="md-nav__list">
406
+
407
+ <li class="md-nav__item">
408
+ <a href="#ollama" class="md-nav__link">
409
+ <span class="md-ellipsis">
410
+
411
+ Ollama
412
+
413
+ </span>
414
+ </a>
415
+
416
+ </li>
417
+
418
+ <li class="md-nav__item">
419
+ <a href="#lm-studio" class="md-nav__link">
420
+ <span class="md-ellipsis">
421
+
422
+ LM Studio
423
+
424
+ </span>
425
+ </a>
426
+
427
+ </li>
428
+
429
+ <li class="md-nav__item">
430
+ <a href="#lemonade-llamacpp" class="md-nav__link">
431
+ <span class="md-ellipsis">
432
+
433
+ Lemonade / llama.cpp
434
+
435
+ </span>
436
+ </a>
437
+
438
+ </li>
439
+
440
+ <li class="md-nav__item">
441
+ <a href="#docker-llm-on-host" class="md-nav__link">
442
+ <span class="md-ellipsis">
443
+
444
+ Docker β€” LLM on host
445
+
446
+ </span>
447
+ </a>
448
+
449
+ </li>
450
+
451
+ </ul>
452
+ </nav>
453
+
454
+ </li>
455
+
456
+ <li class="md-nav__item">
457
+ <a href="#batch-runner-sync" class="md-nav__link">
458
+ <span class="md-ellipsis">
459
+
460
+ Batch Runner β€” Sync
461
+
462
+ </span>
463
+ </a>
464
+
465
+ </li>
466
+
467
+ <li class="md-nav__item">
468
+ <a href="#batch-runner-async" class="md-nav__link">
469
+ <span class="md-ellipsis">
470
+
471
+ Batch Runner β€” Async
472
+
473
+ </span>
474
+ </a>
475
+
476
+ </li>
477
+
478
+ <li class="md-nav__item">
479
+ <a href="#kubernetes-k3s" class="md-nav__link">
480
+ <span class="md-ellipsis">
481
+
482
+ Kubernetes (k3s)
483
+
484
+ </span>
485
+ </a>
486
+
487
+ </li>
488
+
489
+ <li class="md-nav__item">
490
+ <a href="#single-run" class="md-nav__link">
491
+ <span class="md-ellipsis">
492
+
493
+ Single Run
494
+
495
+ </span>
496
+ </a>
497
+
498
+ </li>
499
+
500
+ <li class="md-nav__item">
501
+ <a href="#pre-labeled-datasets" class="md-nav__link">
502
+ <span class="md-ellipsis">
503
+
504
+ Pre-labeled Datasets
505
+
506
+ </span>
507
+ </a>
508
+
509
+ </li>
510
+
511
+ <li class="md-nav__item">
512
+ <a href="#evaluation" class="md-nav__link">
513
+ <span class="md-ellipsis">
514
+
515
+ Evaluation
516
+
517
+ </span>
518
+ </a>
519
+
520
+ </li>
521
+
522
+ </ul>
523
+
524
+ </nav>
525
+
526
+ </li>
527
+
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+ <li class="md-nav__item">
537
+ <a href="mcp.html" class="md-nav__link">
538
+
539
+
540
+
541
+ <span class="md-ellipsis">
542
+
543
+
544
+ MCP
545
+
546
+
547
+
548
+ </span>
549
+
550
+
551
+
552
+ </a>
553
+ </li>
554
+
555
+
556
+
557
+
558
+
559
+
560
+
561
+
562
+
563
+ <li class="md-nav__item">
564
+ <a href="oauth.html" class="md-nav__link">
565
+
566
+
567
+
568
+ <span class="md-ellipsis">
569
+
570
+
571
+ OAuth
572
+
573
+
574
+
575
+ </span>
576
+
577
+
578
+
579
+ </a>
580
+ </li>
581
+
582
+
583
+
584
+
585
+
586
+
587
+
588
+
589
+
590
+ <li class="md-nav__item">
591
+ <a href="inference.html" class="md-nav__link">
592
+
593
+
594
+
595
+ <span class="md-ellipsis">
596
+
597
+
598
+ Inference
599
+
600
+
601
+
602
+ </span>
603
+
604
+
605
+
606
+ </a>
607
+ </li>
608
+
609
+
610
+
611
+
612
+
613
+
614
+
615
+
616
+
617
+ <li class="md-nav__item">
618
+ <a href="story.html" class="md-nav__link">
619
+
620
+
621
+
622
+ <span class="md-ellipsis">
623
+
624
+
625
+ Hackathon Story
626
+
627
+
628
+
629
+ </span>
630
+
631
+
632
+
633
+ </a>
634
+ </li>
635
+
636
+
637
+
638
+
639
+
640
+
641
+
642
+
643
+
644
+ <li class="md-nav__item">
645
+ <a href="deployment.html" class="md-nav__link">
646
+
647
+
648
+
649
+ <span class="md-ellipsis">
650
+
651
+
652
+ Deployment
653
+
654
+
655
+
656
+ </span>
657
+
658
+
659
+
660
+ </a>
661
+ </li>
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+ <li class="md-nav__item">
672
+ <a href="license.html" class="md-nav__link">
673
+
674
+
675
+
676
+ <span class="md-ellipsis">
677
+
678
+
679
+ License
680
+
681
+
682
+
683
+ </span>
684
+
685
+
686
+
687
+ </a>
688
+ </li>
689
+
690
+
691
+
692
+ </ul>
693
+ </nav>
694
+ </div>
695
+ </div>
696
+ </div>
697
+
698
+
699
+
700
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
701
+ <div class="md-sidebar__scrollwrap">
702
+ <div class="md-sidebar__inner">
703
+
704
+
705
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
706
+
707
+
708
+
709
+
710
+
711
+
712
+ <label class="md-nav__title" for="__toc">
713
+ <span class="md-nav__icon md-icon"></span>
714
+ Table of contents
715
+ </label>
716
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
717
+
718
+ <li class="md-nav__item">
719
+ <a href="#search-queries" class="md-nav__link">
720
+ <span class="md-ellipsis">
721
+
722
+ Search Queries
723
+
724
+ </span>
725
+ </a>
726
+
727
+ </li>
728
+
729
+ <li class="md-nav__item">
730
+ <a href="#setup" class="md-nav__link">
731
+ <span class="md-ellipsis">
732
+
733
+ Setup
734
+
735
+ </span>
736
+ </a>
737
+
738
+ </li>
739
+
740
+ <li class="md-nav__item">
741
+ <a href="#llm-server-setup" class="md-nav__link">
742
+ <span class="md-ellipsis">
743
+
744
+ LLM Server Setup
745
+
746
+ </span>
747
+ </a>
748
+
749
+ <nav class="md-nav" aria-label="LLM Server Setup">
750
+ <ul class="md-nav__list">
751
+
752
+ <li class="md-nav__item">
753
+ <a href="#ollama" class="md-nav__link">
754
+ <span class="md-ellipsis">
755
+
756
+ Ollama
757
+
758
+ </span>
759
+ </a>
760
+
761
+ </li>
762
+
763
+ <li class="md-nav__item">
764
+ <a href="#lm-studio" class="md-nav__link">
765
+ <span class="md-ellipsis">
766
+
767
+ LM Studio
768
+
769
+ </span>
770
+ </a>
771
+
772
+ </li>
773
+
774
+ <li class="md-nav__item">
775
+ <a href="#lemonade-llamacpp" class="md-nav__link">
776
+ <span class="md-ellipsis">
777
+
778
+ Lemonade / llama.cpp
779
+
780
+ </span>
781
+ </a>
782
+
783
+ </li>
784
+
785
+ <li class="md-nav__item">
786
+ <a href="#docker-llm-on-host" class="md-nav__link">
787
+ <span class="md-ellipsis">
788
+
789
+ Docker β€” LLM on host
790
+
791
+ </span>
792
+ </a>
793
+
794
+ </li>
795
+
796
+ </ul>
797
+ </nav>
798
+
799
+ </li>
800
+
801
+ <li class="md-nav__item">
802
+ <a href="#batch-runner-sync" class="md-nav__link">
803
+ <span class="md-ellipsis">
804
+
805
+ Batch Runner β€” Sync
806
+
807
+ </span>
808
+ </a>
809
+
810
+ </li>
811
+
812
+ <li class="md-nav__item">
813
+ <a href="#batch-runner-async" class="md-nav__link">
814
+ <span class="md-ellipsis">
815
+
816
+ Batch Runner β€” Async
817
+
818
+ </span>
819
+ </a>
820
+
821
+ </li>
822
+
823
+ <li class="md-nav__item">
824
+ <a href="#kubernetes-k3s" class="md-nav__link">
825
+ <span class="md-ellipsis">
826
+
827
+ Kubernetes (k3s)
828
+
829
+ </span>
830
+ </a>
831
+
832
+ </li>
833
+
834
+ <li class="md-nav__item">
835
+ <a href="#single-run" class="md-nav__link">
836
+ <span class="md-ellipsis">
837
+
838
+ Single Run
839
+
840
+ </span>
841
+ </a>
842
+
843
+ </li>
844
+
845
+ <li class="md-nav__item">
846
+ <a href="#pre-labeled-datasets" class="md-nav__link">
847
+ <span class="md-ellipsis">
848
+
849
+ Pre-labeled Datasets
850
+
851
+ </span>
852
+ </a>
853
+
854
+ </li>
855
+
856
+ <li class="md-nav__item">
857
+ <a href="#evaluation" class="md-nav__link">
858
+ <span class="md-ellipsis">
859
+
860
+ Evaluation
861
+
862
+ </span>
863
+ </a>
864
+
865
+ </li>
866
+
867
+ </ul>
868
+
869
+ </nav>
870
+ </div>
871
+ </div>
872
+ </div>
873
+
874
+
875
+
876
+ <div class="md-content" data-md-component="content">
877
+
878
+ <article class="md-content__inner md-typeset">
879
+
880
+
881
+
882
+
883
+
884
+
885
+
886
+
887
+ <h1 id="llm-as-judge">LLM-as-Judge</h1>
888
+ <p>The LLM-as-Judge pipeline evaluates Echo-DSRN predictions against high-capability LLMs and produces a golden consensus dataset in <code>data/collaborative.db</code>.</p>
889
+ <h2 id="search-queries">Search Queries</h2>
890
+ <p>arXiv and OpenAIRE sources use keyword queries from <code>assets/topics.txt</code> β€” one query per line, blank lines and <code>#</code> comments ignored. Edit this file to target specific research domains.</p>
891
+ <p>Container path: <code>/app/assets/topics.txt</code></p>
892
+ <h2 id="setup">Setup</h2>
893
+ <p>Point at a lemonade or llama.cpp server via <code>.env</code>:</p>
894
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>LLM_BASE_URL=http://192.168.1.40:13305/v1
895
+ </code></pre></div>
896
+ <p>Migrate the database:</p>
897
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>uv<span class="w"> </span>run<span class="w"> </span>alembic<span class="w"> </span>-c<span class="w"> </span>backend/alembic.ini<span class="w"> </span>upgrade<span class="w"> </span>head
898
+ </code></pre></div>
899
+ <h2 id="llm-server-setup">LLM Server Setup</h2>
900
+ <p>Any OpenAI-compatible server works. Configuration via <code>.env</code>:</p>
901
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>LLM_BASE_URL=&lt;server-url&gt;
902
+ <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>LLM_API_KEY=not-needed # for local servers that skip auth
903
+ </code></pre></div>
904
+ <h3 id="ollama">Ollama</h3>
905
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>ollama<span class="w"> </span>pull<span class="w"> </span>qwen3:4b
906
+ <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>ollama<span class="w"> </span>serve
907
+ </code></pre></div>
908
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>LLM_BASE_URL=http://localhost:11434/v1
909
+ </code></pre></div>
910
+ <h3 id="lm-studio">LM Studio</h3>
911
+ <p>Start the local server in the UI (Developer β†’ Local Server). Default port:</p>
912
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>LLM_BASE_URL=http://localhost:1234/v1
913
+ </code></pre></div>
914
+ <h3 id="lemonade-llamacpp">Lemonade / llama.cpp</h3>
915
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>lemonade<span class="w"> </span>--host<span class="w"> </span><span class="m">0</span>.0.0.0<span class="w"> </span>load<span class="w"> </span>--pinned<span class="w"> </span>Qwen3.6-35B-A3B-GGUF
916
+ </code></pre></div>
917
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>LLM_BASE_URL=http://192.168.1.40:13305/v1
918
+ </code></pre></div>
919
+ <h3 id="docker-llm-on-host">Docker β€” LLM on host</h3>
920
+ <p>When running the app in Docker and the LLM server on the host, use <code>host.docker.internal</code>:</p>
921
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>LLM_BASE_URL=http://host.docker.internal:11434/v1
922
+ </code></pre></div>
923
+ <p>The <code>docker-compose.yaml</code> already includes <code>extra_hosts: host.docker.internal:host-gateway</code>.</p>
924
+ <h2 id="batch-runner-sync">Batch Runner β€” Sync</h2>
925
+ <p>Loads models on lemonade, judges papers inline:</p>
926
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>./scripts/run_judges.sh<span class="w"> </span><span class="m">100</span>
927
+ </code></pre></div>
928
+ <p>Cycles through 11 GGUF models (Qwen3.6, Nemotron, Gemma, GPT-OSS, DeepSeek, GLM) against the catalog source.</p>
929
+ <h2 id="batch-runner-async">Batch Runner β€” Async</h2>
930
+ <p>Dispatches Celery tasks to the worker, no model loading:</p>
931
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>./scripts/run_judges.sh<span class="w"> </span><span class="m">100</span><span class="w"> </span>--async
932
+ </code></pre></div>
933
+ <h2 id="kubernetes-k3s">Kubernetes (k3s)</h2>
934
+ <p>Run the judge CLI directly in the deployed web pod:</p>
935
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a>kubectl<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>-it<span class="w"> </span>deployment/evaluator-openaire-research-evaluator-web<span class="w"> </span>--<span class="w"> </span><span class="se">\</span>
936
+ <a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="w"> </span>env<span class="w"> </span><span class="nv">LLM_BASE_URL</span><span class="o">=</span>http://192.168.1.66:13305/v1<span class="w"> </span><span class="se">\</span>
937
+ <a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a><span class="w"> </span>python<span class="w"> </span>backend/judge_cli.py<span class="w"> </span><span class="se">\</span>
938
+ <a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="w"> </span>--source<span class="w"> </span>catalog<span class="w"> </span>--n<span class="w"> </span><span class="m">100</span><span class="w"> </span><span class="se">\</span>
939
+ <a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a><span class="w"> </span>--model<span class="w"> </span>gpt-oss-20b-mxfp4-GGUF<span class="w"> </span><span class="se">\</span>
940
+ <a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a><span class="w"> </span>--async
941
+ </code></pre></div>
942
+ <p>Tasks dispatch to the cluster's Celery worker, using the same Redis and PostgreSQL.</p>
943
+ <h2 id="single-run">Single Run</h2>
944
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="c1"># Local GGUF via llama.cpp / lemonade</span>
945
+ <a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a>uv<span class="w"> </span>run<span class="w"> </span>python<span class="w"> </span>backend/judge_cli.py<span class="w"> </span><span class="se">\</span>
946
+ <a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a><span class="w"> </span>--source<span class="w"> </span>catalog<span class="w"> </span>--n<span class="w"> </span><span class="m">100</span><span class="w"> </span><span class="se">\</span>
947
+ <a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a><span class="w"> </span>--model<span class="w"> </span>Qwen3.6-35B-A3B-GGUF
948
+ <a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a>
949
+ <a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a><span class="c1"># Google Gemini (OpenAI-compatible endpoint)</span>
950
+ <a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a>uv<span class="w"> </span>run<span class="w"> </span>python<span class="w"> </span>backend/judge_cli.py<span class="w"> </span><span class="se">\</span>
951
+ <a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></a><span class="w"> </span>--source<span class="w"> </span>catalog<span class="w"> </span>--n<span class="w"> </span><span class="m">100</span><span class="w"> </span><span class="se">\</span>
952
+ <a id="__codelineno-12-9" name="__codelineno-12-9" href="#__codelineno-12-9"></a><span class="w"> </span>--model<span class="w"> </span>gemini-2.5-flash<span class="w"> </span><span class="se">\</span>
953
+ <a id="__codelineno-12-10" name="__codelineno-12-10" href="#__codelineno-12-10"></a><span class="w"> </span>--llm-url<span class="w"> </span>https://generativelanguage.googleapis.com/v1beta/openai/<span class="w"> </span><span class="se">\</span>
954
+ <a id="__codelineno-12-11" name="__codelineno-12-11" href="#__codelineno-12-11"></a><span class="w"> </span>--llm-key<span class="w"> </span><span class="si">${</span><span class="nv">GEMINI_API_KEY</span><span class="si">}</span>
955
+ </code></pre></div>
956
+ <h2 id="pre-labeled-datasets">Pre-labeled Datasets</h2>
957
+ <p>Convert chat-format JSONL to flat records, then judge:</p>
958
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a>uv<span class="w"> </span>run<span class="w"> </span>python<span class="w"> </span>scripts/reformat_for_judge.py<span class="w"> </span><span class="se">\</span>
959
+ <a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="w"> </span>~/.ethicalabs/datasets/research-intent/train.jsonl<span class="w"> </span><span class="se">\</span>
960
+ <a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a><span class="w"> </span>~/.ethicalabs/datasets/research-intent/train_flat.jsonl
961
+ <a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a>
962
+ <a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a>uv<span class="w"> </span>run<span class="w"> </span>python<span class="w"> </span>backend/judge_cli.py<span class="w"> </span><span class="se">\</span>
963
+ <a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a><span class="w"> </span>--source<span class="w"> </span>dataset<span class="w"> </span><span class="se">\</span>
964
+ <a id="__codelineno-13-7" name="__codelineno-13-7" href="#__codelineno-13-7"></a><span class="w"> </span>--dataset-path<span class="w"> </span>~/.ethicalabs/datasets/research-intent/train_flat.jsonl<span class="w"> </span><span class="se">\</span>
965
+ <a id="__codelineno-13-8" name="__codelineno-13-8" href="#__codelineno-13-8"></a><span class="w"> </span>--n<span class="w"> </span><span class="m">100</span><span class="w"> </span>--model<span class="w"> </span>Qwen3.6-35B-A3B-GGUF
966
+ </code></pre></div>
967
+ <h2 id="evaluation">Evaluation</h2>
968
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a>uv<span class="w"> </span>run<span class="w"> </span>python<span class="w"> </span>backend/judge_eval.py<span class="w"> </span><span class="c1"># all papers</span>
969
+ <a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a>uv<span class="w"> </span>run<span class="w"> </span>python<span class="w"> </span>backend/judge_eval.py<span class="w"> </span>--paper-source<span class="w"> </span>dataset<span class="w"> </span><span class="c1"># golden set only</span>
970
+ </code></pre></div>
971
+ <p>Computes agreement rates, class-level accuracy, and per-model alignment stats.</p>
972
+
973
+
974
+
975
+
976
+
977
+
978
+
979
+
980
+
981
+
982
+
983
+
984
+
985
+ </article>
986
+ </div>
987
+
988
+
989
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
990
+ </div>
991
+
992
+ </main>
993
+
994
+ <footer class="md-footer">
995
+
996
+ <div class="md-footer-meta md-typeset">
997
+ <div class="md-footer-meta__inner md-grid">
998
+ <div class="md-copyright">
999
+
1000
+
1001
+ Made with
1002
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1003
+ Material for MkDocs
1004
+ </a>
1005
+
1006
+ </div>
1007
+
1008
+ </div>
1009
+ </div>
1010
+ </footer>
1011
+
1012
+ </div>
1013
+ <div class="md-dialog" data-md-component="dialog">
1014
+ <div class="md-dialog__inner md-typeset"></div>
1015
+ </div>
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
1022
+
1023
+
1024
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
1025
+
1026
+
1027
+ </body>
1028
+ </html>
mcp.html ADDED
@@ -0,0 +1,889 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="llm-as-judge.html">
15
+
16
+
17
+ <link rel="next" href="oauth.html">
18
+
19
+
20
+
21
+
22
+
23
+ <link rel="icon" href="assets/images/favicon.png">
24
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
25
+
26
+
27
+
28
+ <title>MCP - OpenAIRE-AI-Research-Evaluator</title>
29
+
30
+
31
+
32
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
33
+
34
+
35
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
49
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
50
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
51
+
52
+
53
+
54
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#mcp-agent-classification-endpoint" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ OpenAIRE-AI-Research-Evaluator
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ MCP
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ <label class="md-header__button md-icon" for="__search">
128
+
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
130
+ </label>
131
+ <div class="md-search" data-md-component="search" role="dialog">
132
+ <label class="md-search__overlay" for="__search"></label>
133
+ <div class="md-search__inner" role="search">
134
+ <form class="md-search__form" name="search">
135
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
136
+ <label class="md-search__icon md-icon" for="__search">
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
139
+
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
141
+ </label>
142
+ <nav class="md-search__options" aria-label="Search">
143
+
144
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
145
+
146
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
147
+ </button>
148
+ </nav>
149
+
150
+ </form>
151
+ <div class="md-search__output">
152
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
153
+ <div class="md-search-result" data-md-component="search-result">
154
+ <div class="md-search-result__meta">
155
+ Initializing search
156
+ </div>
157
+ <ol class="md-search-result__list" role="presentation"></ol>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+
165
+
166
+ <div class="md-header__source">
167
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
168
+ <div class="md-source__icon md-icon">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
171
+ </div>
172
+ <div class="md-source__repository">
173
+ GitHub
174
+ </div>
175
+ </a>
176
+ </div>
177
+
178
+ </nav>
179
+
180
+ </header>
181
+
182
+ <div class="md-container" data-md-component="container">
183
+
184
+
185
+
186
+
187
+
188
+
189
+ <main class="md-main" data-md-component="main">
190
+ <div class="md-main__inner md-grid">
191
+
192
+
193
+
194
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
195
+ <div class="md-sidebar__scrollwrap">
196
+ <div class="md-sidebar__inner">
197
+
198
+
199
+
200
+
201
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
202
+ <label class="md-nav__title" for="__drawer">
203
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
204
+
205
+
206
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
207
+
208
+ </a>
209
+ OpenAIRE-AI-Research-Evaluator
210
+ </label>
211
+
212
+ <div class="md-nav__source">
213
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
214
+ <div class="md-source__icon md-icon">
215
+
216
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
217
+ </div>
218
+ <div class="md-source__repository">
219
+ GitHub
220
+ </div>
221
+ </a>
222
+ </div>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="index.html" class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ Home
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ <li class="md-nav__item">
260
+ <a href="quickstart.html" class="md-nav__link">
261
+
262
+
263
+
264
+ <span class="md-ellipsis">
265
+
266
+
267
+ Quick Start
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ </a>
276
+ </li>
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+ <li class="md-nav__item">
287
+ <a href="architecture.html" class="md-nav__link">
288
+
289
+
290
+
291
+ <span class="md-ellipsis">
292
+
293
+
294
+ Architecture
295
+
296
+
297
+
298
+ </span>
299
+
300
+
301
+
302
+ </a>
303
+ </li>
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <li class="md-nav__item">
314
+ <a href="llm-as-judge.html" class="md-nav__link">
315
+
316
+
317
+
318
+ <span class="md-ellipsis">
319
+
320
+
321
+ LLM-as-Judge
322
+
323
+
324
+
325
+ </span>
326
+
327
+
328
+
329
+ </a>
330
+ </li>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+
342
+ <li class="md-nav__item md-nav__item--active">
343
+
344
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
345
+
346
+
347
+
348
+
349
+
350
+ <label class="md-nav__link md-nav__link--active" for="__toc">
351
+
352
+
353
+
354
+ <span class="md-ellipsis">
355
+
356
+
357
+ MCP
358
+
359
+
360
+
361
+ </span>
362
+
363
+
364
+
365
+ <span class="md-nav__icon md-icon"></span>
366
+ </label>
367
+
368
+ <a href="mcp.html" class="md-nav__link md-nav__link--active">
369
+
370
+
371
+
372
+ <span class="md-ellipsis">
373
+
374
+
375
+ MCP
376
+
377
+
378
+
379
+ </span>
380
+
381
+
382
+
383
+ </a>
384
+
385
+
386
+
387
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
388
+
389
+
390
+
391
+
392
+
393
+
394
+ <label class="md-nav__title" for="__toc">
395
+ <span class="md-nav__icon md-icon"></span>
396
+ Table of contents
397
+ </label>
398
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
399
+
400
+ <li class="md-nav__item">
401
+ <a href="#server-configuration" class="md-nav__link">
402
+ <span class="md-ellipsis">
403
+
404
+ Server Configuration
405
+
406
+ </span>
407
+ </a>
408
+
409
+ </li>
410
+
411
+ <li class="md-nav__item">
412
+ <a href="#authentication" class="md-nav__link">
413
+ <span class="md-ellipsis">
414
+
415
+ Authentication
416
+
417
+ </span>
418
+ </a>
419
+
420
+ </li>
421
+
422
+ <li class="md-nav__item">
423
+ <a href="#tools-exposed" class="md-nav__link">
424
+ <span class="md-ellipsis">
425
+
426
+ Tools exposed
427
+
428
+ </span>
429
+ </a>
430
+
431
+ <nav class="md-nav" aria-label="Tools exposed">
432
+ <ul class="md-nav__list">
433
+
434
+ <li class="md-nav__item">
435
+ <a href="#input" class="md-nav__link">
436
+ <span class="md-ellipsis">
437
+
438
+ Input
439
+
440
+ </span>
441
+ </a>
442
+
443
+ </li>
444
+
445
+ <li class="md-nav__item">
446
+ <a href="#output" class="md-nav__link">
447
+ <span class="md-ellipsis">
448
+
449
+ Output
450
+
451
+ </span>
452
+ </a>
453
+
454
+ </li>
455
+
456
+ </ul>
457
+ </nav>
458
+
459
+ </li>
460
+
461
+ <li class="md-nav__item">
462
+ <a href="#raw-sse-usage" class="md-nav__link">
463
+ <span class="md-ellipsis">
464
+
465
+ Raw SSE usage
466
+
467
+ </span>
468
+ </a>
469
+
470
+ </li>
471
+
472
+ <li class="md-nav__item">
473
+ <a href="#architecture" class="md-nav__link">
474
+ <span class="md-ellipsis">
475
+
476
+ Architecture
477
+
478
+ </span>
479
+ </a>
480
+
481
+ </li>
482
+
483
+ </ul>
484
+
485
+ </nav>
486
+
487
+ </li>
488
+
489
+
490
+
491
+
492
+
493
+
494
+
495
+
496
+
497
+ <li class="md-nav__item">
498
+ <a href="oauth.html" class="md-nav__link">
499
+
500
+
501
+
502
+ <span class="md-ellipsis">
503
+
504
+
505
+ OAuth
506
+
507
+
508
+
509
+ </span>
510
+
511
+
512
+
513
+ </a>
514
+ </li>
515
+
516
+
517
+
518
+
519
+
520
+
521
+
522
+
523
+
524
+ <li class="md-nav__item">
525
+ <a href="inference.html" class="md-nav__link">
526
+
527
+
528
+
529
+ <span class="md-ellipsis">
530
+
531
+
532
+ Inference
533
+
534
+
535
+
536
+ </span>
537
+
538
+
539
+
540
+ </a>
541
+ </li>
542
+
543
+
544
+
545
+
546
+
547
+
548
+
549
+
550
+
551
+ <li class="md-nav__item">
552
+ <a href="story.html" class="md-nav__link">
553
+
554
+
555
+
556
+ <span class="md-ellipsis">
557
+
558
+
559
+ Hackathon Story
560
+
561
+
562
+
563
+ </span>
564
+
565
+
566
+
567
+ </a>
568
+ </li>
569
+
570
+
571
+
572
+
573
+
574
+
575
+
576
+
577
+
578
+ <li class="md-nav__item">
579
+ <a href="deployment.html" class="md-nav__link">
580
+
581
+
582
+
583
+ <span class="md-ellipsis">
584
+
585
+
586
+ Deployment
587
+
588
+
589
+
590
+ </span>
591
+
592
+
593
+
594
+ </a>
595
+ </li>
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+ <li class="md-nav__item">
606
+ <a href="license.html" class="md-nav__link">
607
+
608
+
609
+
610
+ <span class="md-ellipsis">
611
+
612
+
613
+ License
614
+
615
+
616
+
617
+ </span>
618
+
619
+
620
+
621
+ </a>
622
+ </li>
623
+
624
+
625
+
626
+ </ul>
627
+ </nav>
628
+ </div>
629
+ </div>
630
+ </div>
631
+
632
+
633
+
634
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
635
+ <div class="md-sidebar__scrollwrap">
636
+ <div class="md-sidebar__inner">
637
+
638
+
639
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
640
+
641
+
642
+
643
+
644
+
645
+
646
+ <label class="md-nav__title" for="__toc">
647
+ <span class="md-nav__icon md-icon"></span>
648
+ Table of contents
649
+ </label>
650
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
651
+
652
+ <li class="md-nav__item">
653
+ <a href="#server-configuration" class="md-nav__link">
654
+ <span class="md-ellipsis">
655
+
656
+ Server Configuration
657
+
658
+ </span>
659
+ </a>
660
+
661
+ </li>
662
+
663
+ <li class="md-nav__item">
664
+ <a href="#authentication" class="md-nav__link">
665
+ <span class="md-ellipsis">
666
+
667
+ Authentication
668
+
669
+ </span>
670
+ </a>
671
+
672
+ </li>
673
+
674
+ <li class="md-nav__item">
675
+ <a href="#tools-exposed" class="md-nav__link">
676
+ <span class="md-ellipsis">
677
+
678
+ Tools exposed
679
+
680
+ </span>
681
+ </a>
682
+
683
+ <nav class="md-nav" aria-label="Tools exposed">
684
+ <ul class="md-nav__list">
685
+
686
+ <li class="md-nav__item">
687
+ <a href="#input" class="md-nav__link">
688
+ <span class="md-ellipsis">
689
+
690
+ Input
691
+
692
+ </span>
693
+ </a>
694
+
695
+ </li>
696
+
697
+ <li class="md-nav__item">
698
+ <a href="#output" class="md-nav__link">
699
+ <span class="md-ellipsis">
700
+
701
+ Output
702
+
703
+ </span>
704
+ </a>
705
+
706
+ </li>
707
+
708
+ </ul>
709
+ </nav>
710
+
711
+ </li>
712
+
713
+ <li class="md-nav__item">
714
+ <a href="#raw-sse-usage" class="md-nav__link">
715
+ <span class="md-ellipsis">
716
+
717
+ Raw SSE usage
718
+
719
+ </span>
720
+ </a>
721
+
722
+ </li>
723
+
724
+ <li class="md-nav__item">
725
+ <a href="#architecture" class="md-nav__link">
726
+ <span class="md-ellipsis">
727
+
728
+ Architecture
729
+
730
+ </span>
731
+ </a>
732
+
733
+ </li>
734
+
735
+ </ul>
736
+
737
+ </nav>
738
+ </div>
739
+ </div>
740
+ </div>
741
+
742
+
743
+
744
+ <div class="md-content" data-md-component="content">
745
+
746
+ <article class="md-content__inner md-typeset">
747
+
748
+
749
+
750
+
751
+
752
+
753
+
754
+
755
+ <h1 id="mcp-agent-classification-endpoint">MCP β€” Agent Classification Endpoint</h1>
756
+ <p>Expose Echo-DSRN-98M research intent classification to AI agents via the Model Context Protocol (SSE transport).</p>
757
+ <h2 id="server-configuration">Server Configuration</h2>
758
+ <p>Add to your MCP client config (Claude Desktop, Cursor, Continue, etc.):</p>
759
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="p">{</span>
760
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="w"> </span><span class="nt">&quot;mcpServers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
761
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="w"> </span><span class="nt">&quot;echo-dsrn&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
762
+ <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="w"> </span><span class="nt">&quot;url&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;http://localhost:7860/api/mcp/classify&quot;</span><span class="p">,</span>
763
+ <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="w"> </span><span class="nt">&quot;transport&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;sse&quot;</span><span class="p">,</span>
764
+ <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="w"> </span><span class="nt">&quot;headers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
765
+ <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="w"> </span><span class="nt">&quot;Authorization&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Bearer echo-dsrn-mcp-change-me-in-production&quot;</span>
766
+ <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="p">}</span>
767
+ <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="w"> </span><span class="p">}</span>
768
+ <a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="w"> </span><span class="p">}</span>
769
+ <a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="p">}</span>
770
+ </code></pre></div>
771
+ <p>Set <code>MCP_API_KEY</code> in <code>.env</code> to match:</p>
772
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>MCP_API_KEY=echo-dsrn-mcp-change-me-in-production
773
+ </code></pre></div>
774
+ <h2 id="authentication">Authentication</h2>
775
+ <p>Bearer token via <code>Authorization</code> header. No query-string keys.</p>
776
+ <h2 id="tools-exposed">Tools exposed</h2>
777
+ <table>
778
+ <thead>
779
+ <tr>
780
+ <th>Tool</th>
781
+ <th>Description</th>
782
+ </tr>
783
+ </thead>
784
+ <tbody>
785
+ <tr>
786
+ <td><code>classify_intent</code></td>
787
+ <td>Classify a research paper by title + abstract into one of 5 intents</td>
788
+ </tr>
789
+ </tbody>
790
+ </table>
791
+ <h3 id="input">Input</h3>
792
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="p">{</span>
793
+ <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Attention Is All You Need&quot;</span><span class="p">,</span>
794
+ <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="nt">&quot;abstract&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;We propose a new simple network architecture, the Transformer...&quot;</span>
795
+ <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="p">}</span>
796
+ </code></pre></div>
797
+ <h3 id="output">Output</h3>
798
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="p">{</span>
799
+ <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span><span class="nt">&quot;label&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Methodology&quot;</span><span class="p">,</span>
800
+ <a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </span><span class="nt">&quot;probabilities&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
801
+ <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span><span class="nt">&quot;Methodology&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">0.87</span><span class="p">,</span>
802
+ <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="w"> </span><span class="nt">&quot;Dataset&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">0.03</span><span class="p">,</span>
803
+ <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="w"> </span><span class="nt">&quot;Review&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">0.02</span><span class="p">,</span>
804
+ <a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="nt">&quot;Applied&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">0.06</span><span class="p">,</span>
805
+ <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="w"> </span><span class="nt">&quot;Theoretical&quot;</span><span class="p">:</span><span class="w"> </span><span class="mf">0.02</span>
806
+ <a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="w"> </span><span class="p">}</span>
807
+ <a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="p">}</span>
808
+ </code></pre></div>
809
+ <h2 id="raw-sse-usage">Raw SSE usage</h2>
810
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>curl<span class="w"> </span>-N<span class="w"> </span>-H<span class="w"> </span><span class="s2">&quot;Authorization: Bearer echo-dsrn-mcp-change-me-in-production&quot;</span><span class="w"> </span><span class="se">\</span>
811
+ <a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="w"> </span><span class="s2">&quot;http://localhost:7860/api/mcp/classify?title=Attention+Is+All+You+Need&amp;abstract=We+propose+the+Transformer&quot;</span>
812
+ </code></pre></div>
813
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="kn">import</span><span class="w"> </span><span class="nn">requests</span>
814
+ <a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>
815
+ <a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="n">resp</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
816
+ <a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a> <span class="s2">&quot;http://localhost:7860/api/mcp/classify&quot;</span><span class="p">,</span>
817
+ <a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a> <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;Attention Is All You Need&quot;</span><span class="p">,</span> <span class="s2">&quot;abstract&quot;</span><span class="p">:</span> <span class="s2">&quot;We propose...&quot;</span><span class="p">},</span>
818
+ <a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;Authorization&quot;</span><span class="p">:</span> <span class="s2">&quot;Bearer echo-dsrn-mcp-change-me-in-production&quot;</span><span class="p">},</span>
819
+ <a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a> <span class="n">stream</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
820
+ <a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="p">)</span>
821
+ <a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">resp</span><span class="o">.</span><span class="n">iter_lines</span><span class="p">():</span>
822
+ <a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a> <span class="k">if</span> <span class="n">line</span><span class="p">:</span>
823
+ <a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a> <span class="nb">print</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
824
+ </code></pre></div>
825
+ <h2 id="architecture">Architecture</h2>
826
+ <ol>
827
+ <li>Request hits SSE endpoint β†’ Bearer token validated</li>
828
+ <li>Celery task <code>classify_mcp</code> enqueued to Redis</li>
829
+ <li>Worker loads Echo-DSRN-98M (baked into Docker image, no HF download)</li>
830
+ <li>Fast CPU inference β†’ result streamed via SSE</li>
831
+ </ol>
832
+ <p>No papers saved. No database writes. Stateless.</p>
833
+
834
+
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+ </article>
847
+ </div>
848
+
849
+
850
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
851
+ </div>
852
+
853
+ </main>
854
+
855
+ <footer class="md-footer">
856
+
857
+ <div class="md-footer-meta md-typeset">
858
+ <div class="md-footer-meta__inner md-grid">
859
+ <div class="md-copyright">
860
+
861
+
862
+ Made with
863
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
864
+ Material for MkDocs
865
+ </a>
866
+
867
+ </div>
868
+
869
+ </div>
870
+ </div>
871
+ </footer>
872
+
873
+ </div>
874
+ <div class="md-dialog" data-md-component="dialog">
875
+ <div class="md-dialog__inner md-typeset"></div>
876
+ </div>
877
+
878
+
879
+
880
+
881
+
882
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
883
+
884
+
885
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
886
+
887
+
888
+ </body>
889
+ </html>
oauth.html ADDED
@@ -0,0 +1,796 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="mcp.html">
15
+
16
+
17
+ <link rel="next" href="inference.html">
18
+
19
+
20
+
21
+
22
+
23
+ <link rel="icon" href="assets/images/favicon.png">
24
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
25
+
26
+
27
+
28
+ <title>OAuth - OpenAIRE-AI-Research-Evaluator</title>
29
+
30
+
31
+
32
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
33
+
34
+
35
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
49
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
50
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
51
+
52
+
53
+
54
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#oauth-hugging-face-login" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ OpenAIRE-AI-Research-Evaluator
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ OAuth
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ <label class="md-header__button md-icon" for="__search">
128
+
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
130
+ </label>
131
+ <div class="md-search" data-md-component="search" role="dialog">
132
+ <label class="md-search__overlay" for="__search"></label>
133
+ <div class="md-search__inner" role="search">
134
+ <form class="md-search__form" name="search">
135
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
136
+ <label class="md-search__icon md-icon" for="__search">
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
139
+
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
141
+ </label>
142
+ <nav class="md-search__options" aria-label="Search">
143
+
144
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
145
+
146
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
147
+ </button>
148
+ </nav>
149
+
150
+ </form>
151
+ <div class="md-search__output">
152
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
153
+ <div class="md-search-result" data-md-component="search-result">
154
+ <div class="md-search-result__meta">
155
+ Initializing search
156
+ </div>
157
+ <ol class="md-search-result__list" role="presentation"></ol>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+
165
+
166
+ <div class="md-header__source">
167
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
168
+ <div class="md-source__icon md-icon">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
171
+ </div>
172
+ <div class="md-source__repository">
173
+ GitHub
174
+ </div>
175
+ </a>
176
+ </div>
177
+
178
+ </nav>
179
+
180
+ </header>
181
+
182
+ <div class="md-container" data-md-component="container">
183
+
184
+
185
+
186
+
187
+
188
+
189
+ <main class="md-main" data-md-component="main">
190
+ <div class="md-main__inner md-grid">
191
+
192
+
193
+
194
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
195
+ <div class="md-sidebar__scrollwrap">
196
+ <div class="md-sidebar__inner">
197
+
198
+
199
+
200
+
201
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
202
+ <label class="md-nav__title" for="__drawer">
203
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
204
+
205
+
206
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
207
+
208
+ </a>
209
+ OpenAIRE-AI-Research-Evaluator
210
+ </label>
211
+
212
+ <div class="md-nav__source">
213
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
214
+ <div class="md-source__icon md-icon">
215
+
216
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
217
+ </div>
218
+ <div class="md-source__repository">
219
+ GitHub
220
+ </div>
221
+ </a>
222
+ </div>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="index.html" class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ Home
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ <li class="md-nav__item">
260
+ <a href="quickstart.html" class="md-nav__link">
261
+
262
+
263
+
264
+ <span class="md-ellipsis">
265
+
266
+
267
+ Quick Start
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ </a>
276
+ </li>
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+ <li class="md-nav__item">
287
+ <a href="architecture.html" class="md-nav__link">
288
+
289
+
290
+
291
+ <span class="md-ellipsis">
292
+
293
+
294
+ Architecture
295
+
296
+
297
+
298
+ </span>
299
+
300
+
301
+
302
+ </a>
303
+ </li>
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <li class="md-nav__item">
314
+ <a href="llm-as-judge.html" class="md-nav__link">
315
+
316
+
317
+
318
+ <span class="md-ellipsis">
319
+
320
+
321
+ LLM-as-Judge
322
+
323
+
324
+
325
+ </span>
326
+
327
+
328
+
329
+ </a>
330
+ </li>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+ <li class="md-nav__item">
341
+ <a href="mcp.html" class="md-nav__link">
342
+
343
+
344
+
345
+ <span class="md-ellipsis">
346
+
347
+
348
+ MCP
349
+
350
+
351
+
352
+ </span>
353
+
354
+
355
+
356
+ </a>
357
+ </li>
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+ <li class="md-nav__item md-nav__item--active">
370
+
371
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
372
+
373
+
374
+
375
+
376
+
377
+ <label class="md-nav__link md-nav__link--active" for="__toc">
378
+
379
+
380
+
381
+ <span class="md-ellipsis">
382
+
383
+
384
+ OAuth
385
+
386
+
387
+
388
+ </span>
389
+
390
+
391
+
392
+ <span class="md-nav__icon md-icon"></span>
393
+ </label>
394
+
395
+ <a href="oauth.html" class="md-nav__link md-nav__link--active">
396
+
397
+
398
+
399
+ <span class="md-ellipsis">
400
+
401
+
402
+ OAuth
403
+
404
+
405
+
406
+ </span>
407
+
408
+
409
+
410
+ </a>
411
+
412
+
413
+
414
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
415
+
416
+
417
+
418
+
419
+
420
+
421
+ <label class="md-nav__title" for="__toc">
422
+ <span class="md-nav__icon md-icon"></span>
423
+ Table of contents
424
+ </label>
425
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
426
+
427
+ <li class="md-nav__item">
428
+ <a href="#setup" class="md-nav__link">
429
+ <span class="md-ellipsis">
430
+
431
+ Setup
432
+
433
+ </span>
434
+ </a>
435
+
436
+ <nav class="md-nav" aria-label="Setup">
437
+ <ul class="md-nav__list">
438
+
439
+ <li class="md-nav__item">
440
+ <a href="#1-create-an-oauth-app" class="md-nav__link">
441
+ <span class="md-ellipsis">
442
+
443
+ 1. Create an OAuth App
444
+
445
+ </span>
446
+ </a>
447
+
448
+ </li>
449
+
450
+ <li class="md-nav__item">
451
+ <a href="#2-configure-env" class="md-nav__link">
452
+ <span class="md-ellipsis">
453
+
454
+ 2. Configure .env
455
+
456
+ </span>
457
+ </a>
458
+
459
+ </li>
460
+
461
+ <li class="md-nav__item">
462
+ <a href="#3-production" class="md-nav__link">
463
+ <span class="md-ellipsis">
464
+
465
+ 3. Production
466
+
467
+ </span>
468
+ </a>
469
+
470
+ </li>
471
+
472
+ </ul>
473
+ </nav>
474
+
475
+ </li>
476
+
477
+ <li class="md-nav__item">
478
+ <a href="#how-it-works" class="md-nav__link">
479
+ <span class="md-ellipsis">
480
+
481
+ How it works
482
+
483
+ </span>
484
+ </a>
485
+
486
+ </li>
487
+
488
+ </ul>
489
+
490
+ </nav>
491
+
492
+ </li>
493
+
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+
502
+ <li class="md-nav__item">
503
+ <a href="inference.html" class="md-nav__link">
504
+
505
+
506
+
507
+ <span class="md-ellipsis">
508
+
509
+
510
+ Inference
511
+
512
+
513
+
514
+ </span>
515
+
516
+
517
+
518
+ </a>
519
+ </li>
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+
529
+ <li class="md-nav__item">
530
+ <a href="story.html" class="md-nav__link">
531
+
532
+
533
+
534
+ <span class="md-ellipsis">
535
+
536
+
537
+ Hackathon Story
538
+
539
+
540
+
541
+ </span>
542
+
543
+
544
+
545
+ </a>
546
+ </li>
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+
555
+
556
+ <li class="md-nav__item">
557
+ <a href="deployment.html" class="md-nav__link">
558
+
559
+
560
+
561
+ <span class="md-ellipsis">
562
+
563
+
564
+ Deployment
565
+
566
+
567
+
568
+ </span>
569
+
570
+
571
+
572
+ </a>
573
+ </li>
574
+
575
+
576
+
577
+
578
+
579
+
580
+
581
+
582
+
583
+ <li class="md-nav__item">
584
+ <a href="license.html" class="md-nav__link">
585
+
586
+
587
+
588
+ <span class="md-ellipsis">
589
+
590
+
591
+ License
592
+
593
+
594
+
595
+ </span>
596
+
597
+
598
+
599
+ </a>
600
+ </li>
601
+
602
+
603
+
604
+ </ul>
605
+ </nav>
606
+ </div>
607
+ </div>
608
+ </div>
609
+
610
+
611
+
612
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
613
+ <div class="md-sidebar__scrollwrap">
614
+ <div class="md-sidebar__inner">
615
+
616
+
617
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
618
+
619
+
620
+
621
+
622
+
623
+
624
+ <label class="md-nav__title" for="__toc">
625
+ <span class="md-nav__icon md-icon"></span>
626
+ Table of contents
627
+ </label>
628
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
629
+
630
+ <li class="md-nav__item">
631
+ <a href="#setup" class="md-nav__link">
632
+ <span class="md-ellipsis">
633
+
634
+ Setup
635
+
636
+ </span>
637
+ </a>
638
+
639
+ <nav class="md-nav" aria-label="Setup">
640
+ <ul class="md-nav__list">
641
+
642
+ <li class="md-nav__item">
643
+ <a href="#1-create-an-oauth-app" class="md-nav__link">
644
+ <span class="md-ellipsis">
645
+
646
+ 1. Create an OAuth App
647
+
648
+ </span>
649
+ </a>
650
+
651
+ </li>
652
+
653
+ <li class="md-nav__item">
654
+ <a href="#2-configure-env" class="md-nav__link">
655
+ <span class="md-ellipsis">
656
+
657
+ 2. Configure .env
658
+
659
+ </span>
660
+ </a>
661
+
662
+ </li>
663
+
664
+ <li class="md-nav__item">
665
+ <a href="#3-production" class="md-nav__link">
666
+ <span class="md-ellipsis">
667
+
668
+ 3. Production
669
+
670
+ </span>
671
+ </a>
672
+
673
+ </li>
674
+
675
+ </ul>
676
+ </nav>
677
+
678
+ </li>
679
+
680
+ <li class="md-nav__item">
681
+ <a href="#how-it-works" class="md-nav__link">
682
+ <span class="md-ellipsis">
683
+
684
+ How it works
685
+
686
+ </span>
687
+ </a>
688
+
689
+ </li>
690
+
691
+ </ul>
692
+
693
+ </nav>
694
+ </div>
695
+ </div>
696
+ </div>
697
+
698
+
699
+
700
+ <div class="md-content" data-md-component="content">
701
+
702
+ <article class="md-content__inner md-typeset">
703
+
704
+
705
+
706
+
707
+
708
+
709
+
710
+
711
+ <h1 id="oauth-hugging-face-login">OAuth β€” Hugging Face Login</h1>
712
+ <p>The Collab Hub uses Hugging Face OAuth for authentication. Users log in with their HF account to vote on annotations and save papers.</p>
713
+ <h2 id="setup">Setup</h2>
714
+ <h3 id="1-create-an-oauth-app">1. Create an OAuth App</h3>
715
+ <p>Go to <a href="https://huggingface.co/settings/applications/new">Hugging Face OAuth Apps</a> and create a new app:</p>
716
+ <ul>
717
+ <li><strong>Name</strong>: <code>Echo-DSRN Collab Hub</code></li>
718
+ <li><strong>Homepage URL</strong>: <code>http://localhost:7860</code> (or your production URL)</li>
719
+ <li><strong>Redirect URL</strong>: <code>http://localhost:7860/api/auth/callback/hf</code></li>
720
+ </ul>
721
+ <h3 id="2-configure-env">2. Configure .env</h3>
722
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>APP_BASE_URL=http://localhost:7860
723
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>HF_CLIENT_ID=&lt;your-client-id&gt;
724
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>HF_CLIENT_SECRET=&lt;your-client-secret&gt;
725
+ </code></pre></div>
726
+ <h3 id="3-production">3. Production</h3>
727
+ <p>Replace <code>localhost:7860</code> with your production domain. Both the Homepage URL and Redirect URL must match.</p>
728
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>APP_BASE_URL=https://echo-dsrn.example.com
729
+ </code></pre></div>
730
+ <p>Redirect URL: <code>https://echo-dsrn.example.com/api/auth/callback/hf</code></p>
731
+ <h2 id="how-it-works">How it works</h2>
732
+ <ol>
733
+ <li>User clicks "Login with Hugging Face" in the Collab Hub</li>
734
+ <li>Redirected to HF authorization page</li>
735
+ <li>After consent, redirected back to <code>/api/auth/callback/hf</code></li>
736
+ <li>Backend exchanges code for token, fetches user profile</li>
737
+ <li>JWT session cookie set β€” user is authenticated</li>
738
+ </ol>
739
+ <p>User data stored: HF username, name, email, avatar URL, and optionally institution (from profile).</p>
740
+
741
+
742
+
743
+
744
+
745
+
746
+
747
+
748
+
749
+
750
+
751
+
752
+
753
+ </article>
754
+ </div>
755
+
756
+
757
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
758
+ </div>
759
+
760
+ </main>
761
+
762
+ <footer class="md-footer">
763
+
764
+ <div class="md-footer-meta md-typeset">
765
+ <div class="md-footer-meta__inner md-grid">
766
+ <div class="md-copyright">
767
+
768
+
769
+ Made with
770
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
771
+ Material for MkDocs
772
+ </a>
773
+
774
+ </div>
775
+
776
+ </div>
777
+ </div>
778
+ </footer>
779
+
780
+ </div>
781
+ <div class="md-dialog" data-md-component="dialog">
782
+ <div class="md-dialog__inner md-typeset"></div>
783
+ </div>
784
+
785
+
786
+
787
+
788
+
789
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
790
+
791
+
792
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
793
+
794
+
795
+ </body>
796
+ </html>
quickstart.html ADDED
@@ -0,0 +1,827 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="index.html">
15
+
16
+
17
+ <link rel="next" href="architecture.html">
18
+
19
+
20
+
21
+
22
+
23
+ <link rel="icon" href="assets/images/favicon.png">
24
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
25
+
26
+
27
+
28
+ <title>Quick Start - OpenAIRE-AI-Research-Evaluator</title>
29
+
30
+
31
+
32
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
33
+
34
+
35
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
49
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
50
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
51
+
52
+
53
+
54
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#quick-start" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ OpenAIRE-AI-Research-Evaluator
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ Quick Start
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ <label class="md-header__button md-icon" for="__search">
128
+
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
130
+ </label>
131
+ <div class="md-search" data-md-component="search" role="dialog">
132
+ <label class="md-search__overlay" for="__search"></label>
133
+ <div class="md-search__inner" role="search">
134
+ <form class="md-search__form" name="search">
135
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
136
+ <label class="md-search__icon md-icon" for="__search">
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
139
+
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
141
+ </label>
142
+ <nav class="md-search__options" aria-label="Search">
143
+
144
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
145
+
146
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
147
+ </button>
148
+ </nav>
149
+
150
+ </form>
151
+ <div class="md-search__output">
152
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
153
+ <div class="md-search-result" data-md-component="search-result">
154
+ <div class="md-search-result__meta">
155
+ Initializing search
156
+ </div>
157
+ <ol class="md-search-result__list" role="presentation"></ol>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+
165
+
166
+ <div class="md-header__source">
167
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
168
+ <div class="md-source__icon md-icon">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
171
+ </div>
172
+ <div class="md-source__repository">
173
+ GitHub
174
+ </div>
175
+ </a>
176
+ </div>
177
+
178
+ </nav>
179
+
180
+ </header>
181
+
182
+ <div class="md-container" data-md-component="container">
183
+
184
+
185
+
186
+
187
+
188
+
189
+ <main class="md-main" data-md-component="main">
190
+ <div class="md-main__inner md-grid">
191
+
192
+
193
+
194
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
195
+ <div class="md-sidebar__scrollwrap">
196
+ <div class="md-sidebar__inner">
197
+
198
+
199
+
200
+
201
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
202
+ <label class="md-nav__title" for="__drawer">
203
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
204
+
205
+
206
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
207
+
208
+ </a>
209
+ OpenAIRE-AI-Research-Evaluator
210
+ </label>
211
+
212
+ <div class="md-nav__source">
213
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
214
+ <div class="md-source__icon md-icon">
215
+
216
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
217
+ </div>
218
+ <div class="md-source__repository">
219
+ GitHub
220
+ </div>
221
+ </a>
222
+ </div>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="index.html" class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ Home
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+ <li class="md-nav__item md-nav__item--active">
262
+
263
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
264
+
265
+
266
+
267
+
268
+
269
+ <label class="md-nav__link md-nav__link--active" for="__toc">
270
+
271
+
272
+
273
+ <span class="md-ellipsis">
274
+
275
+
276
+ Quick Start
277
+
278
+
279
+
280
+ </span>
281
+
282
+
283
+
284
+ <span class="md-nav__icon md-icon"></span>
285
+ </label>
286
+
287
+ <a href="quickstart.html" class="md-nav__link md-nav__link--active">
288
+
289
+
290
+
291
+ <span class="md-ellipsis">
292
+
293
+
294
+ Quick Start
295
+
296
+
297
+
298
+ </span>
299
+
300
+
301
+
302
+ </a>
303
+
304
+
305
+
306
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <label class="md-nav__title" for="__toc">
314
+ <span class="md-nav__icon md-icon"></span>
315
+ Table of contents
316
+ </label>
317
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
318
+
319
+ <li class="md-nav__item">
320
+ <a href="#prerequisites" class="md-nav__link">
321
+ <span class="md-ellipsis">
322
+
323
+ Prerequisites
324
+
325
+ </span>
326
+ </a>
327
+
328
+ </li>
329
+
330
+ <li class="md-nav__item">
331
+ <a href="#docker-compose" class="md-nav__link">
332
+ <span class="md-ellipsis">
333
+
334
+ Docker Compose
335
+
336
+ </span>
337
+ </a>
338
+
339
+ </li>
340
+
341
+ <li class="md-nav__item">
342
+ <a href="#python" class="md-nav__link">
343
+ <span class="md-ellipsis">
344
+
345
+ Python
346
+
347
+ </span>
348
+ </a>
349
+
350
+ <nav class="md-nav" aria-label="Python">
351
+ <ul class="md-nav__list">
352
+
353
+ <li class="md-nav__item">
354
+ <a href="#uv" class="md-nav__link">
355
+ <span class="md-ellipsis">
356
+
357
+ uv
358
+
359
+ </span>
360
+ </a>
361
+
362
+ </li>
363
+
364
+ <li class="md-nav__item">
365
+ <a href="#pip" class="md-nav__link">
366
+ <span class="md-ellipsis">
367
+
368
+ pip
369
+
370
+ </span>
371
+ </a>
372
+
373
+ </li>
374
+
375
+ </ul>
376
+ </nav>
377
+
378
+ </li>
379
+
380
+ <li class="md-nav__item">
381
+ <a href="#makefile" class="md-nav__link">
382
+ <span class="md-ellipsis">
383
+
384
+ Makefile
385
+
386
+ </span>
387
+ </a>
388
+
389
+ </li>
390
+
391
+ </ul>
392
+
393
+ </nav>
394
+
395
+ </li>
396
+
397
+
398
+
399
+
400
+
401
+
402
+
403
+
404
+
405
+ <li class="md-nav__item">
406
+ <a href="architecture.html" class="md-nav__link">
407
+
408
+
409
+
410
+ <span class="md-ellipsis">
411
+
412
+
413
+ Architecture
414
+
415
+
416
+
417
+ </span>
418
+
419
+
420
+
421
+ </a>
422
+ </li>
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+ <li class="md-nav__item">
433
+ <a href="llm-as-judge.html" class="md-nav__link">
434
+
435
+
436
+
437
+ <span class="md-ellipsis">
438
+
439
+
440
+ LLM-as-Judge
441
+
442
+
443
+
444
+ </span>
445
+
446
+
447
+
448
+ </a>
449
+ </li>
450
+
451
+
452
+
453
+
454
+
455
+
456
+
457
+
458
+
459
+ <li class="md-nav__item">
460
+ <a href="mcp.html" class="md-nav__link">
461
+
462
+
463
+
464
+ <span class="md-ellipsis">
465
+
466
+
467
+ MCP
468
+
469
+
470
+
471
+ </span>
472
+
473
+
474
+
475
+ </a>
476
+ </li>
477
+
478
+
479
+
480
+
481
+
482
+
483
+
484
+
485
+
486
+ <li class="md-nav__item">
487
+ <a href="oauth.html" class="md-nav__link">
488
+
489
+
490
+
491
+ <span class="md-ellipsis">
492
+
493
+
494
+ OAuth
495
+
496
+
497
+
498
+ </span>
499
+
500
+
501
+
502
+ </a>
503
+ </li>
504
+
505
+
506
+
507
+
508
+
509
+
510
+
511
+
512
+
513
+ <li class="md-nav__item">
514
+ <a href="inference.html" class="md-nav__link">
515
+
516
+
517
+
518
+ <span class="md-ellipsis">
519
+
520
+
521
+ Inference
522
+
523
+
524
+
525
+ </span>
526
+
527
+
528
+
529
+ </a>
530
+ </li>
531
+
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+
540
+ <li class="md-nav__item">
541
+ <a href="story.html" class="md-nav__link">
542
+
543
+
544
+
545
+ <span class="md-ellipsis">
546
+
547
+
548
+ Hackathon Story
549
+
550
+
551
+
552
+ </span>
553
+
554
+
555
+
556
+ </a>
557
+ </li>
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
567
+ <li class="md-nav__item">
568
+ <a href="deployment.html" class="md-nav__link">
569
+
570
+
571
+
572
+ <span class="md-ellipsis">
573
+
574
+
575
+ Deployment
576
+
577
+
578
+
579
+ </span>
580
+
581
+
582
+
583
+ </a>
584
+ </li>
585
+
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+
594
+ <li class="md-nav__item">
595
+ <a href="license.html" class="md-nav__link">
596
+
597
+
598
+
599
+ <span class="md-ellipsis">
600
+
601
+
602
+ License
603
+
604
+
605
+
606
+ </span>
607
+
608
+
609
+
610
+ </a>
611
+ </li>
612
+
613
+
614
+
615
+ </ul>
616
+ </nav>
617
+ </div>
618
+ </div>
619
+ </div>
620
+
621
+
622
+
623
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
624
+ <div class="md-sidebar__scrollwrap">
625
+ <div class="md-sidebar__inner">
626
+
627
+
628
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
629
+
630
+
631
+
632
+
633
+
634
+
635
+ <label class="md-nav__title" for="__toc">
636
+ <span class="md-nav__icon md-icon"></span>
637
+ Table of contents
638
+ </label>
639
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
640
+
641
+ <li class="md-nav__item">
642
+ <a href="#prerequisites" class="md-nav__link">
643
+ <span class="md-ellipsis">
644
+
645
+ Prerequisites
646
+
647
+ </span>
648
+ </a>
649
+
650
+ </li>
651
+
652
+ <li class="md-nav__item">
653
+ <a href="#docker-compose" class="md-nav__link">
654
+ <span class="md-ellipsis">
655
+
656
+ Docker Compose
657
+
658
+ </span>
659
+ </a>
660
+
661
+ </li>
662
+
663
+ <li class="md-nav__item">
664
+ <a href="#python" class="md-nav__link">
665
+ <span class="md-ellipsis">
666
+
667
+ Python
668
+
669
+ </span>
670
+ </a>
671
+
672
+ <nav class="md-nav" aria-label="Python">
673
+ <ul class="md-nav__list">
674
+
675
+ <li class="md-nav__item">
676
+ <a href="#uv" class="md-nav__link">
677
+ <span class="md-ellipsis">
678
+
679
+ uv
680
+
681
+ </span>
682
+ </a>
683
+
684
+ </li>
685
+
686
+ <li class="md-nav__item">
687
+ <a href="#pip" class="md-nav__link">
688
+ <span class="md-ellipsis">
689
+
690
+ pip
691
+
692
+ </span>
693
+ </a>
694
+
695
+ </li>
696
+
697
+ </ul>
698
+ </nav>
699
+
700
+ </li>
701
+
702
+ <li class="md-nav__item">
703
+ <a href="#makefile" class="md-nav__link">
704
+ <span class="md-ellipsis">
705
+
706
+ Makefile
707
+
708
+ </span>
709
+ </a>
710
+
711
+ </li>
712
+
713
+ </ul>
714
+
715
+ </nav>
716
+ </div>
717
+ </div>
718
+ </div>
719
+
720
+
721
+
722
+ <div class="md-content" data-md-component="content">
723
+
724
+ <article class="md-content__inner md-typeset">
725
+
726
+
727
+
728
+
729
+
730
+
731
+
732
+
733
+ <h1 id="quick-start">Quick Start</h1>
734
+ <h2 id="prerequisites">Prerequisites</h2>
735
+ <ul>
736
+ <li><strong>Python</strong> β‰₯ 3.12 (tested with 3.12.3)</li>
737
+ <li><strong>Node.js</strong> β‰₯ 22 (tested with 22.22.3)</li>
738
+ <li><strong>npm</strong> β‰₯ 10 (tested with 10.9.8)</li>
739
+ <li><strong>Docker</strong> (optional, for containerised deployment)</li>
740
+ </ul>
741
+ <h2 id="docker-compose">Docker Compose</h2>
742
+ <p>The Echo-DSRN classifier is a gated HF model. Before building:</p>
743
+ <ol>
744
+ <li><a href="https://huggingface.co/ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF">Request access</a> to the model repo</li>
745
+ <li>Create an <a href="https://huggingface.co/settings/tokens">HF access token</a> with read permissions</li>
746
+ <li>Add it to <code>.env</code>: <code>HF_TOKEN=hf_...</code></li>
747
+ </ol>
748
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>make<span class="w"> </span>rebuild<span class="w"> </span><span class="c1"># builds Docker image with the gated model</span>
749
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d
750
+ </code></pre></div>
751
+ <p>App serves on <code>http://localhost:7860</code>. Redis, the web server, and a Celery worker start automatically.</p>
752
+ <h2 id="python">Python</h2>
753
+ <h3 id="uv">uv</h3>
754
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>uv<span class="w"> </span>run<span class="w"> </span>python<span class="w"> </span>backend/server.py
755
+ </code></pre></div>
756
+ <h3 id="pip">pip</h3>
757
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>pip<span class="w"> </span>install<span class="w"> </span>-r<span class="w"> </span>requirements.txt
758
+ <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>python<span class="w"> </span>backend/server.py
759
+ </code></pre></div>
760
+ <p>Build the frontend first: <code>cd frontend &amp;&amp; npm ci &amp;&amp; npm run build</code>. App serves on <code>http://localhost:7860</code>.</p>
761
+ <h2 id="makefile">Makefile</h2>
762
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>make<span class="w"> </span><span class="nb">help</span><span class="w"> </span><span class="c1"># list all targets</span>
763
+ <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>make<span class="w"> </span>up<span class="w"> </span><span class="c1"># docker compose up -d</span>
764
+ <a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>make<span class="w"> </span>build-docker<span class="w"> </span><span class="c1"># build the Docker image</span>
765
+ <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a>make<span class="w"> </span><span class="nb">test</span><span class="w"> </span><span class="c1"># run pytest</span>
766
+ <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>make<span class="w"> </span>lint<span class="w"> </span><span class="c1"># pre-commit hooks</span>
767
+ <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a>make<span class="w"> </span>migrate<span class="w"> </span><span class="c1"># alembic upgrade head</span>
768
+ <a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a>make<span class="w"> </span>judge<span class="w"> </span><span class="nv">N</span><span class="o">=</span><span class="m">100</span><span class="w"> </span><span class="c1"># run LLM-as-Judge (sync)</span>
769
+ <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a>make<span class="w"> </span>judge-async<span class="w"> </span><span class="nv">N</span><span class="o">=</span><span class="m">100</span><span class="w"> </span><span class="c1"># dispatch to Celery worker</span>
770
+ </code></pre></div>
771
+
772
+
773
+
774
+
775
+
776
+
777
+
778
+
779
+
780
+
781
+
782
+
783
+
784
+ </article>
785
+ </div>
786
+
787
+
788
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
789
+ </div>
790
+
791
+ </main>
792
+
793
+ <footer class="md-footer">
794
+
795
+ <div class="md-footer-meta md-typeset">
796
+ <div class="md-footer-meta__inner md-grid">
797
+ <div class="md-copyright">
798
+
799
+
800
+ Made with
801
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
802
+ Material for MkDocs
803
+ </a>
804
+
805
+ </div>
806
+
807
+ </div>
808
+ </div>
809
+ </footer>
810
+
811
+ </div>
812
+ <div class="md-dialog" data-md-component="dialog">
813
+ <div class="md-dialog__inner md-typeset"></div>
814
+ </div>
815
+
816
+
817
+
818
+
819
+
820
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
821
+
822
+
823
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
824
+
825
+
826
+ </body>
827
+ </html>
search/search_index.json CHANGED
@@ -1 +1 @@
1
- {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"OpenAIRE-AI-Research-Evaluator","text":"<p>A multi-model LLM-as-Judge pipeline that builds annotation datasets to train Echo-DSRN intent classifiers \u2014 entry for the OpenAIRE AI Hackathon 2026, co-organised by OpenAIRE and Alien Intelligence.</p> <p>The app streams scientific paper metadata from the OpenAIRE Graph API, classifies research intent with a 98M-parameter Echo-DSRN model (fast CPU inference), and enlists multiple LLMs as judges to build a golden consensus dataset.</p>"},{"location":"#features","title":"Features","text":"<ul> <li>OpenAIRE Stream \u2014 live publication metadata via the OpenAIRE Graph API</li> <li>Collab Hub \u2014 community annotations with LLM judge consensus</li> <li>Free Text \u2014 ad-hoc classification of custom titles and abstracts</li> <li>Saved History \u2014 local browser storage with optional server-side sync</li> <li>Model Card \u2014 architecture specs, parameter census, and consumption code</li> </ul>"},{"location":"#hackathon-deliverable","title":"Hackathon Deliverable","text":"<p>This project is the artifact submission for the OpenAIRE AI Hackathon 2026.</p> <p>The accompanying story explains the question, journey, insight, and what others can reuse.</p> <p>Source \u00b7 OpenAIRE Graph \u00b7 Echo-DSRN Model</p>"},{"location":"architecture/","title":"Architecture","text":"Component Description Frontend Vue 3 / Vite dashboard \u2014 tabs: Model Card, Collab Hub, OpenAIRE Stream, Free Text, Saved History Backend FastAPI \u2014 inference, arXiv/OpenAIRE proxy, LLM judge orchestration, OAuth Classifier Echo-DSRN-98M (<code>EchoForSequenceClassification</code>) \u2014 fast CPU inference Annotation DB SQLite (<code>data/collaborative.db</code>) \u2014 user classifications and LLM judge labels Worker Celery + Redis \u2014 async classification and LLM-as-Judge queue"},{"location":"architecture/#intent-labels","title":"Intent Labels","text":"Label Meaning <code>Methodology</code> Introduces a new method, model, or algorithm <code>Dataset</code> Introduces or documents a dataset or benchmark <code>Review</code> Surveys or synthesises existing work <code>Applied</code> Applies existing methods to a domain problem <code>Theoretical</code> Mathematical or formal analysis without empirical evaluation"},{"location":"architecture/#data-flow","title":"Data Flow","text":"<ol> <li>OpenAIRE Graph API streams paper metadata (title, abstract, DOI, language)</li> <li>Echo-DSRN-98M classifies research intent in &lt;1ms on CPU</li> <li>Results displayed in the Vue 3 dashboard with probability bars</li> <li>Optional: LLM-as-Judge enlists multiple LLMs to validate Echo's predictions</li> <li>Annotations stored in SQLite, forming a golden consensus dataset</li> </ol>"},{"location":"deployment/","title":"Kubernetes Deployment (k3s)","text":"<p>Deploy the OpenAIRE-AI-Research-Evaluator with Helm on k3s.</p>"},{"location":"deployment/#prerequisites","title":"Prerequisites","text":"<ul> <li>k3s cluster running</li> <li><code>helm</code> installed</li> <li>Access to the Docker image <code>ethicalabs/openaire-research-evaluator:latest</code></li> <li>Request access to the gated Echo-DSRN model</li> </ul>"},{"location":"deployment/#1-generate-postgresql-dump","title":"1. Generate PostgreSQL dump","text":"<p>The SQLite golden database must be migrated to PostgreSQL:</p> <pre><code>./scripts/sqlite_to_postgres.sh\n</code></pre> <p>Generates <code>data/collaborative_pg.sql</code> \u2014 ready for PostgreSQL import.</p>"},{"location":"deployment/#2-install","title":"2. Install","text":"<pre><code>helm install evaluator ./helm/openaire-research-evaluator \\\n --set secrets.hfToken=hf_... \\\n --set secrets.secretKey=$(openssl rand -hex 32) \\\n --set ingress.host=openaire-eval.local \\\n --set config.llmBaseUrl=http://192.168.1.66:13305/v1\n</code></pre> <p>Or create a <code>values.local.yaml</code>:</p> <pre><code>secrets:\n hfToken: hf_...\n secretKey: abc123...\n hfClientId: ...\n hfClientSecret: ...\ningress:\n host: openaire-eval.local\nconfig:\n llmBaseUrl: http://192.168.1.66:13305/v1\n</code></pre> <pre><code>helm install evaluator ./helm/openaire-research-evaluator -f values.local.yaml\n</code></pre>"},{"location":"deployment/#3-load-golden-data","title":"3. Load golden data","text":"<p>Wait for PostgreSQL to be ready, then import:</p> <pre><code>kubectl cp data/collaborative_pg.sql \\\n $(kubectl get pod -l component=postgres -o jsonpath='{.items[0].metadata.name}'):/tmp/collaborative_pg.sql\n\nkubectl exec -it deployment/evaluator-openaire-research-evaluator-postgres -- \\\n psql -U postgres -d echo_dsrn -f /tmp/collaborative_pg.sql\n\n# Reset auto-increment sequences after import (IDs were explicit in the dump)\nkubectl exec deployment/evaluator-openaire-research-evaluator-postgres -- \\\n psql -U postgres -d echo_dsrn -c \\\n \"SELECT setval('annotations_id_seq', COALESCE((SELECT MAX(id) FROM annotations), 1))\"\n</code></pre>"},{"location":"deployment/#4-access","title":"4. Access","text":"<pre><code>kubectl port-forward svc/evaluator-openaire-research-evaluator-web 7860:7860\n</code></pre> <p>App at <code>http://localhost:7860</code>. With Ingress configured, at <code>http://openaire-eval.local</code>.</p> <p>Local DNS setup: add to <code>/etc/hosts</code>:</p> <pre><code>echo \"127.0.0.1 openaire-eval.local\" | sudo tee -a /etc/hosts\n</code></pre> <p>Then access at <code>http://openaire-eval.local</code> (k3s Traefik listens on port 80).</p>"},{"location":"deployment/#components","title":"Components","text":"Component Service Port Web (FastAPI + Vue) <code>&lt;release&gt;-web</code> 7860 PostgreSQL <code>&lt;release&gt;-postgres</code> 5432 Redis <code>&lt;release&gt;-redis</code> 6379 Worker (Celery) \u2014 (internal) \u2014"},{"location":"deployment/#troubleshooting","title":"Troubleshooting","text":"<p>Check web pod logs for alembic migration status:</p> <pre><code>kubectl logs deployment/evaluator-openaire-research-evaluator-web\n</code></pre>"},{"location":"inference/","title":"Inference","text":"<p>Model: <code>ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF</code> \u2014 gated repo, request access before use.</p>"},{"location":"inference/#install","title":"Install","text":"<pre><code>pip install git+https://github.com/ethicalabs-ai/Echo-DSRN.git\n</code></pre>"},{"location":"inference/#classify","title":"Classify","text":"<pre><code>from echo_dsrn import EchoForSequenceClassification\nfrom transformers import AutoTokenizer\n\nmodel = EchoForSequenceClassification.from_pretrained(\n \"ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF\", trust_remote_code=True\n)\ntokenizer = AutoTokenizer.from_pretrained(\n \"ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF\", trust_remote_code=True\n)\n\nlabel, probs = model.classify(\n \"Title: Attention Is All You Need\\n\"\n \"Abstract: We propose a new simple network architecture, the Transformer...\",\n tokenizer=tokenizer,\n)\nprint(label, probs)\n# \u2192 Methodology tensor([0.87, 0.03, 0.02, 0.06, 0.02])\n</code></pre>"},{"location":"inference/#model-specs","title":"Model Specs","text":"Property Value Architecture Echo-DSRN (Recurrent Neural Network) Parameters 98,266,629 (~98M) Layers 8 DSRN blocks Hidden dim 512 Attention heads 4 Vocab size 32,017 tokens Precision bfloat16 Inference Fast on CPU <p>Run <code>curl /api/model/card</code> for live specs from the loaded model.</p>"},{"location":"license/","title":"License","text":""},{"location":"license/#code","title":"Code","text":"<p>Apache License 2.0 \u2014 see LICENSE.</p> <p>Copyright \u00a9 2026 ethicalabs.ai</p>"},{"location":"license/#openaire-graph","title":"OpenAIRE Graph","text":"<p>This project uses the OpenAIRE Graph API. All materials created by OpenAIRE are licensed under CC BY 4.0.</p>"},{"location":"license/#hackathon-deliverable","title":"Hackathon Deliverable","text":"<p>This project is submitted to the OpenAIRE AI Hackathon 2026. Per hackathon requirements, all submitted materials are available under a CC-BY license.</p>"},{"location":"license/#attribution","title":"Attribution","text":"<p>If you reuse this work, please cite:</p> <p>OpenAIRE-AI-Research-Evaluator \u2014 Multi-model LLM-as-Judge pipeline for research intent classification. ethicalabs.ai, 2026. Apache-2.0 / CC-BY 4.0. github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator</p>"},{"location":"llm-as-judge/","title":"LLM-as-Judge","text":"<p>The LLM-as-Judge pipeline evaluates Echo-DSRN predictions against high-capability LLMs and produces a golden consensus dataset in <code>data/collaborative.db</code>.</p>"},{"location":"llm-as-judge/#search-queries","title":"Search Queries","text":"<p>arXiv and OpenAIRE sources use keyword queries from <code>assets/topics.txt</code> \u2014 one query per line, blank lines and <code>#</code> comments ignored. Edit this file to target specific research domains.</p> <p>Container path: <code>/app/assets/topics.txt</code></p>"},{"location":"llm-as-judge/#setup","title":"Setup","text":"<p>Point at a lemonade or llama.cpp server via <code>.env</code>:</p> <pre><code>LLM_BASE_URL=http://192.168.1.40:13305/v1\n</code></pre> <p>Migrate the database:</p> <pre><code>uv run alembic -c backend/alembic.ini upgrade head\n</code></pre>"},{"location":"llm-as-judge/#llm-server-setup","title":"LLM Server Setup","text":"<p>Any OpenAI-compatible server works. Configuration via <code>.env</code>:</p> <pre><code>LLM_BASE_URL=&lt;server-url&gt;\nLLM_API_KEY=not-needed # for local servers that skip auth\n</code></pre>"},{"location":"llm-as-judge/#ollama","title":"Ollama","text":"<pre><code>ollama pull qwen3:4b\nollama serve\n</code></pre> <pre><code>LLM_BASE_URL=http://localhost:11434/v1\n</code></pre>"},{"location":"llm-as-judge/#lm-studio","title":"LM Studio","text":"<p>Start the local server in the UI (Developer \u2192 Local Server). Default port:</p> <pre><code>LLM_BASE_URL=http://localhost:1234/v1\n</code></pre>"},{"location":"llm-as-judge/#lemonade-llamacpp","title":"Lemonade / llama.cpp","text":"<pre><code>lemonade --host 0.0.0.0 load --pinned Qwen3.6-35B-A3B-GGUF\n</code></pre> <pre><code>LLM_BASE_URL=http://192.168.1.40:13305/v1\n</code></pre>"},{"location":"llm-as-judge/#docker-llm-on-host","title":"Docker \u2014 LLM on host","text":"<p>When running the app in Docker and the LLM server on the host, use <code>host.docker.internal</code>:</p> <pre><code>LLM_BASE_URL=http://host.docker.internal:11434/v1\n</code></pre> <p>The <code>docker-compose.yaml</code> already includes <code>extra_hosts: host.docker.internal:host-gateway</code>.</p>"},{"location":"llm-as-judge/#batch-runner-sync","title":"Batch Runner \u2014 Sync","text":"<p>Loads models on lemonade, judges papers inline:</p> <pre><code>./scripts/run_judges.sh 100\n</code></pre> <p>Cycles through 11 GGUF models (Qwen3.6, Nemotron, Gemma, GPT-OSS, DeepSeek, GLM) against the catalog source.</p>"},{"location":"llm-as-judge/#batch-runner-async","title":"Batch Runner \u2014 Async","text":"<p>Dispatches Celery tasks to the worker, no model loading:</p> <pre><code>./scripts/run_judges.sh 100 --async\n</code></pre>"},{"location":"llm-as-judge/#kubernetes-k3s","title":"Kubernetes (k3s)","text":"<p>Run the judge CLI directly in the deployed web pod:</p> <pre><code>kubectl exec -it deployment/evaluator-openaire-research-evaluator-web -- \\\n env LLM_BASE_URL=http://192.168.1.66:13305/v1 \\\n python backend/judge_cli.py \\\n --source catalog --n 100 \\\n --model gpt-oss-20b-mxfp4-GGUF \\\n --async\n</code></pre> <p>Tasks dispatch to the cluster's Celery worker, using the same Redis and PostgreSQL.</p>"},{"location":"llm-as-judge/#single-run","title":"Single Run","text":"<pre><code># Local GGUF via llama.cpp / lemonade\nuv run python backend/judge_cli.py \\\n --source catalog --n 100 \\\n --model Qwen3.6-35B-A3B-GGUF\n\n# Google Gemini (OpenAI-compatible endpoint)\nuv run python backend/judge_cli.py \\\n --source catalog --n 100 \\\n --model gemini-2.5-flash \\\n --llm-url https://generativelanguage.googleapis.com/v1beta/openai/ \\\n --llm-key ${GEMINI_API_KEY}\n</code></pre>"},{"location":"llm-as-judge/#pre-labeled-datasets","title":"Pre-labeled Datasets","text":"<p>Convert chat-format JSONL to flat records, then judge:</p> <pre><code>uv run python scripts/reformat_for_judge.py \\\n ~/.ethicalabs/datasets/research-intent/train.jsonl \\\n ~/.ethicalabs/datasets/research-intent/train_flat.jsonl\n\nuv run python backend/judge_cli.py \\\n --source dataset \\\n --dataset-path ~/.ethicalabs/datasets/research-intent/train_flat.jsonl \\\n --n 100 --model Qwen3.6-35B-A3B-GGUF\n</code></pre>"},{"location":"llm-as-judge/#evaluation","title":"Evaluation","text":"<pre><code>uv run python backend/judge_eval.py # all papers\nuv run python backend/judge_eval.py --paper-source dataset # golden set only\n</code></pre> <p>Computes agreement rates, class-level accuracy, and per-model alignment stats.</p>"},{"location":"mcp/","title":"MCP \u2014 Agent Classification Endpoint","text":"<p>Expose Echo-DSRN-98M research intent classification to AI agents via the Model Context Protocol (SSE transport).</p>"},{"location":"mcp/#server-configuration","title":"Server Configuration","text":"<p>Add to your MCP client config (Claude Desktop, Cursor, Continue, etc.):</p> <pre><code>{\n \"mcpServers\": {\n \"echo-dsrn\": {\n \"url\": \"http://localhost:7860/api/mcp/classify\",\n \"transport\": \"sse\",\n \"headers\": {\n \"Authorization\": \"Bearer echo-dsrn-mcp-change-me-in-production\"\n }\n }\n }\n}\n</code></pre> <p>Set <code>MCP_API_KEY</code> in <code>.env</code> to match:</p> <pre><code>MCP_API_KEY=echo-dsrn-mcp-change-me-in-production\n</code></pre>"},{"location":"mcp/#authentication","title":"Authentication","text":"<p>Bearer token via <code>Authorization</code> header. No query-string keys.</p>"},{"location":"mcp/#tools-exposed","title":"Tools exposed","text":"Tool Description <code>classify_intent</code> Classify a research paper by title + abstract into one of 5 intents"},{"location":"mcp/#input","title":"Input","text":"<pre><code>{\n \"title\": \"Attention Is All You Need\",\n \"abstract\": \"We propose a new simple network architecture, the Transformer...\"\n}\n</code></pre>"},{"location":"mcp/#output","title":"Output","text":"<pre><code>{\n \"label\": \"Methodology\",\n \"probabilities\": {\n \"Methodology\": 0.87,\n \"Dataset\": 0.03,\n \"Review\": 0.02,\n \"Applied\": 0.06,\n \"Theoretical\": 0.02\n }\n}\n</code></pre>"},{"location":"mcp/#raw-sse-usage","title":"Raw SSE usage","text":"<pre><code>curl -N -H \"Authorization: Bearer echo-dsrn-mcp-change-me-in-production\" \\\n \"http://localhost:7860/api/mcp/classify?title=Attention+Is+All+You+Need&amp;abstract=We+propose+the+Transformer\"\n</code></pre> <pre><code>import requests\n\nresp = requests.get(\n \"http://localhost:7860/api/mcp/classify\",\n params={\"title\": \"Attention Is All You Need\", \"abstract\": \"We propose...\"},\n headers={\"Authorization\": \"Bearer echo-dsrn-mcp-change-me-in-production\"},\n stream=True,\n)\nfor line in resp.iter_lines():\n if line:\n print(line.decode())\n</code></pre>"},{"location":"mcp/#architecture","title":"Architecture","text":"<ol> <li>Request hits SSE endpoint \u2192 Bearer token validated</li> <li>Celery task <code>classify_mcp</code> enqueued to Redis</li> <li>Worker loads Echo-DSRN-98M (baked into Docker image, no HF download)</li> <li>Fast CPU inference \u2192 result streamed via SSE</li> </ol> <p>No papers saved. No database writes. Stateless.</p>"},{"location":"oauth/","title":"OAuth \u2014 Hugging Face Login","text":"<p>The Collab Hub uses Hugging Face OAuth for authentication. Users log in with their HF account to vote on annotations and save papers.</p>"},{"location":"oauth/#setup","title":"Setup","text":""},{"location":"oauth/#1-create-an-oauth-app","title":"1. Create an OAuth App","text":"<p>Go to Hugging Face OAuth Apps and create a new app:</p> <ul> <li>Name: <code>Echo-DSRN Collab Hub</code></li> <li>Homepage URL: <code>http://localhost:7860</code> (or your production URL)</li> <li>Redirect URL: <code>http://localhost:7860/api/auth/callback/hf</code></li> </ul>"},{"location":"oauth/#2-configure-env","title":"2. Configure .env","text":"<pre><code>APP_BASE_URL=http://localhost:7860\nHF_CLIENT_ID=&lt;your-client-id&gt;\nHF_CLIENT_SECRET=&lt;your-client-secret&gt;\n</code></pre>"},{"location":"oauth/#3-production","title":"3. Production","text":"<p>Replace <code>localhost:7860</code> with your production domain. Both the Homepage URL and Redirect URL must match.</p> <pre><code>APP_BASE_URL=https://echo-dsrn.example.com\n</code></pre> <p>Redirect URL: <code>https://echo-dsrn.example.com/api/auth/callback/hf</code></p>"},{"location":"oauth/#how-it-works","title":"How it works","text":"<ol> <li>User clicks \"Login with Hugging Face\" in the Collab Hub</li> <li>Redirected to HF authorization page</li> <li>After consent, redirected back to <code>/api/auth/callback/hf</code></li> <li>Backend exchanges code for token, fetches user profile</li> <li>JWT session cookie set \u2014 user is authenticated</li> </ol> <p>User data stored: HF username, name, email, avatar URL, and optionally institution (from profile).</p>"},{"location":"quickstart/","title":"Quick Start","text":""},{"location":"quickstart/#prerequisites","title":"Prerequisites","text":"<ul> <li>Python \u2265 3.12 (tested with 3.12.3)</li> <li>Node.js \u2265 22 (tested with 22.22.3)</li> <li>npm \u2265 10 (tested with 10.9.8)</li> <li>Docker (optional, for containerised deployment)</li> </ul>"},{"location":"quickstart/#docker-compose","title":"Docker Compose","text":"<p>The Echo-DSRN classifier is a gated HF model. Before building:</p> <ol> <li>Request access to the model repo</li> <li>Create an HF access token with read permissions</li> <li>Add it to <code>.env</code>: <code>HF_TOKEN=hf_...</code></li> </ol> <pre><code>make rebuild # builds Docker image with the gated model\ndocker compose up -d\n</code></pre> <p>App serves on <code>http://localhost:7860</code>. Redis, the web server, and a Celery worker start automatically.</p>"},{"location":"quickstart/#python","title":"Python","text":""},{"location":"quickstart/#uv","title":"uv","text":"<pre><code>uv run python backend/server.py\n</code></pre>"},{"location":"quickstart/#pip","title":"pip","text":"<pre><code>pip install -r requirements.txt\npython backend/server.py\n</code></pre> <p>Build the frontend first: <code>cd frontend &amp;&amp; npm ci &amp;&amp; npm run build</code>. App serves on <code>http://localhost:7860</code>.</p>"},{"location":"quickstart/#makefile","title":"Makefile","text":"<pre><code>make help # list all targets\nmake up # docker compose up -d\nmake build-docker # build the Docker image\nmake test # run pytest\nmake lint # pre-commit hooks\nmake migrate # alembic upgrade head\nmake judge N=100 # run LLM-as-Judge (sync)\nmake judge-async N=100 # dispatch to Celery worker\n</code></pre>"},{"location":"story/","title":"Hackathon Story","text":""},{"location":"story/#the-question","title":"The Question","text":"<p>How can we turn the OpenAIRE Graph \u2014 a living index of millions of research outputs \u2014 into validated, high-quality training data for AI classifiers, at scale and with minimal human effort?</p> <p>The OpenAIRE Graph aggregates publication metadata across disciplines, languages, and repositories.</p> <p>It is an extraordinary resource for building AI tools that understand research, But raw metadata is noisy: titles are truncated, abstracts vary in quality, and classification labels are absent.</p> <p>To train a classifier that can reliably distinguish a methodology paper from a dataset paper, a review from an applied case study, you need labeled data \u2014 and labeling thousands of papers by hand is slow, expensive, and fragile.</p> <p>Our question was: can we automate this with a feedback loop that combines a fast, lightweight classifier with a panel of LLM judges, using the OpenAIRE Graph as both the data source and the proving ground?</p>"},{"location":"story/#the-journey","title":"The Journey","text":""},{"location":"story/#phase-1-the-classifier","title":"Phase 1 \u2014 The Classifier","text":"<p>We started with Echo-DSRN, a recurrent neural network developed built from scratch by us.</p> <p>Echo-DSRN is small (98M-114M parameters) and runs efficiently on CPU, making it suitable for real-time streaming applications where a GPU is unavailable or impractical.</p> <p>We fine-tuned it on a 5-class research intent taxonomy:</p> <ul> <li>Methodology \u2014 introduces a new method, model, or algorithm</li> <li>Dataset \u2014 introduces or documents a dataset or benchmark</li> <li>Review \u2014 surveys or synthesises existing work</li> <li>Applied \u2014 applies existing methods to a domain problem</li> <li>Theoretical \u2014 mathematical or formal analysis without empirical evaluation</li> </ul> <p>The initial training set was ~6,000 records curated from PubMed, Semantic Scholar, Papers With Code, arXiv, and the OpenAIRE Graph itself \u2014 silver-labeled with keyword heuristics and arXiv category priors.</p> <p>The classifier worked well, but we had no systematic way to measure how well, or to improve it.</p>"},{"location":"story/#phase-2-the-app","title":"Phase 2 \u2014 The App","text":"<p>We built a Vue 3 + FastAPI web application that streams paper metadata from the OpenAIRE Graph API in real time.</p> <p>Users see papers appear with Echo-DSRN's predicted intent and a probability distribution across all five classes.</p> <p>They can classify custom text, save results to local history, and browse a Model Card showing the exact architecture, parameter census, and consumption code.</p> <p>But passive classification is only half the story.</p> <p>To improve the model, we needed ground truth \u2014 and that meant building a pipeline for annotation at scale.</p>"},{"location":"story/#phase-3-llm-as-judge","title":"Phase 3 \u2014 LLM-as-Judge","text":"<p>We designed an LLM-as-Judge pipeline where multiple high-capability language models evaluate Echo-DSRN's predictions and produce structured verdicts:</p> <ul> <li>Is the predicted label correct?</li> <li>If not, what should it be?</li> <li>Should the paper be flagged (garbled text, non-English, math-only)?</li> <li>What is the judge's confidence?</li> </ul> <p>Each judge receives the paper title, abstract, and Echo's prediction, then returns a JSON verdict following a strict Pydantic schema enforced via OpenAI's <code>response_format</code>.</p> <p>We support any OpenAI-compatible inference server: llama.cpp, vLLM, LM Studio, Google Gemini, and lemonade for local GGUF model orchestration.</p> <p>We assembled a panel of 11 models spanning architectures and parameter counts: <code>Qwen3.6-35B</code>, <code>Qwen3.6-27B</code>, <code>Qwen3.5-35B</code>, <code>Nemotron-3-Nano-30B</code>, <code>Gemma-4-26B</code>, <code>GPT-OSS-20B</code>, <code>GPT-OSS-120B</code>, <code>DeepSeek-Qwen3-8B</code>, <code>GLM-4.7-Flash</code>, <code>Qwen3.6-35B-A3B</code>, and <code>Qwen3.5-4B</code>.</p>"},{"location":"story/#phase-4-scale-with-celery","title":"Phase 4 \u2014 Scale with Celery","text":"<p>Running 11 models across thousands of papers synchronously is slow \u2014 each paper needs an LLM API call with its own latency.</p> <p>We added a Celery + Redis worker queue: the CLI dispatches fine-grained per-paper tasks, and workers pull from the queue and process them asynchronously. The same pipeline can run with a single command:</p> <pre><code>./scripts/run_judges.sh 100 --async\n</code></pre> <p>This dispatches 100 papers per model (1,100 total tasks) to the worker pool. The worker handles classification, LLM judging, and database persistence in one atomic unit, with idempotency guarantees \u2014 no paper is judged twice by the same model.</p>"},{"location":"story/#phase-5-the-golden-dataset","title":"Phase 5 \u2014 The Golden Dataset","text":"<p>All annotations are stored in a SQLite database (<code>data/collaborative.db</code>). The <code>judge_eval.py</code> script computes:</p> <ul> <li>Agreement rates between judges</li> <li>Per-class accuracy against ground truth (when available)</li> <li>Per-model alignment stats against Echo-DSRN</li> </ul> <p>The result is a golden consensus dataset where each paper has labels from multiple LLMs alongside Echo-DSRN's original prediction. This dataset becomes the training data for the next iteration of the classifier \u2014 closing the feedback loop.</p>"},{"location":"story/#the-insight","title":"The Insight","text":"<p>A multi-model LLM-as-Judge pipeline, fed by the OpenAIRE Graph, produces higher-quality training data than any single annotator \u2014 human or machine \u2014 at a fraction of the cost.</p> <p>Three findings stand out:</p> <ol> <li> <p>Diversity matters. Different models disagree on edge cases (applied vs. methodology, dataset vs. methodology), and consensus across architectures produces more robust labels than the strongest single model alone.</p> </li> <li> <p>The OpenAIRE Graph is a live data flywheel. New papers appear daily. A streaming classifier backed by LLM judges can continuously expand the training set without manual curation.</p> </li> <li> <p>CPU-first is viable. Echo-DSRN-98M runs fast enough on CPU to be deployable anywhere \u2014 from a cloud VM to a Raspberry Pi. The heavy lifting (LLM judging) is offloaded to a remote GPU server, but the classification itself is free.</p> </li> </ol>"},{"location":"story/#what-others-can-reuse","title":"What Others Can Reuse","text":"<p>This project is designed to be remixed. Here is what you can take and adapt:</p> Component Reuse scenario LLM-as-Judge pipeline Swap the 5-class taxonomy for your own labels. Point at any OpenAI-compatible server. The judge schema, prompt, and evaluation scripts are label-agnostic. OpenAIRE Graph integration The keyword streaming + multilingual query approach works for any research domain. The fetcher handles both arXiv and OpenAIRE APIs. Async Celery worker pattern Fine-grained per-paper tasks with lazy database imports and idempotency \u2014 copy the pattern for any batch annotation workflow. Dataset preparation scripts <code>prepare_research_intent.py</code> and <code>expand_multilingual_openaire.py</code> build balanced, multilingual training sets from public APIs. Adapt the keyword banks and label taxonomy. Echo-DSRN classifier The model is on Hugging Face (gated \u2014 request access). <code>model.classify(title + abstract, tokenizer)</code> is the entire API. Swap the classification head for your own labels."},{"location":"story/#license","title":"License","text":"<p>Code: Apache 2.0. OpenAIRE Graph: CC BY 4.0. All hackathon materials: CC-BY.</p>"}]}
 
1
+ {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"index.html","title":"OpenAIRE-AI-Research-Evaluator","text":"<p>A multi-model LLM-as-Judge pipeline that builds annotation datasets to train Echo-DSRN intent classifiers \u2014 entry for the OpenAIRE AI Hackathon 2026, co-organised by OpenAIRE and Alien Intelligence.</p> <p>The app streams scientific paper metadata from the OpenAIRE Graph API, classifies research intent with a 98M-parameter Echo-DSRN model (fast CPU inference), and enlists multiple LLMs as judges to build a golden consensus dataset.</p>"},{"location":"index.html#features","title":"Features","text":"<ul> <li>OpenAIRE Stream \u2014 live publication metadata via the OpenAIRE Graph API</li> <li>Collab Hub \u2014 community annotations with LLM judge consensus</li> <li>Free Text \u2014 ad-hoc classification of custom titles and abstracts</li> <li>Saved History \u2014 local browser storage with optional server-side sync</li> <li>Model Card \u2014 architecture specs, parameter census, and consumption code</li> </ul>"},{"location":"index.html#hackathon-deliverable","title":"Hackathon Deliverable","text":"<p>This project is the artifact submission for the OpenAIRE AI Hackathon 2026.</p> <p>The accompanying story explains the question, journey, insight, and what others can reuse.</p> <p>Source \u00b7 OpenAIRE Graph \u00b7 Echo-DSRN Model</p>"},{"location":"architecture.html","title":"Architecture","text":"Component Description Frontend Vue 3 / Vite dashboard \u2014 tabs: Model Card, Collab Hub, OpenAIRE Stream, Free Text, Saved History Backend FastAPI \u2014 inference, arXiv/OpenAIRE proxy, LLM judge orchestration, OAuth Classifier Echo-DSRN-98M (<code>EchoForSequenceClassification</code>) \u2014 fast CPU inference Annotation DB SQLite (<code>data/collaborative.db</code>) \u2014 user classifications and LLM judge labels Worker Celery + Redis \u2014 async classification and LLM-as-Judge queue"},{"location":"architecture.html#intent-labels","title":"Intent Labels","text":"Label Meaning <code>Methodology</code> Introduces a new method, model, or algorithm <code>Dataset</code> Introduces or documents a dataset or benchmark <code>Review</code> Surveys or synthesises existing work <code>Applied</code> Applies existing methods to a domain problem <code>Theoretical</code> Mathematical or formal analysis without empirical evaluation"},{"location":"architecture.html#data-flow","title":"Data Flow","text":"<ol> <li>OpenAIRE Graph API streams paper metadata (title, abstract, DOI, language)</li> <li>Echo-DSRN-98M classifies research intent in &lt;1ms on CPU</li> <li>Results displayed in the Vue 3 dashboard with probability bars</li> <li>Optional: LLM-as-Judge enlists multiple LLMs to validate Echo's predictions</li> <li>Annotations stored in SQLite, forming a golden consensus dataset</li> </ol>"},{"location":"deployment.html","title":"Kubernetes Deployment (k3s)","text":"<p>Deploy the OpenAIRE-AI-Research-Evaluator with Helm on k3s.</p>"},{"location":"deployment.html#prerequisites","title":"Prerequisites","text":"<ul> <li>k3s cluster running</li> <li><code>helm</code> installed</li> <li>Access to the Docker image <code>ethicalabs/openaire-research-evaluator:latest</code></li> <li>Request access to the gated Echo-DSRN model</li> </ul>"},{"location":"deployment.html#1-generate-postgresql-dump","title":"1. Generate PostgreSQL dump","text":"<p>The SQLite golden database must be migrated to PostgreSQL:</p> <pre><code>./scripts/sqlite_to_postgres.sh\n</code></pre> <p>Generates <code>data/collaborative_pg.sql</code> \u2014 ready for PostgreSQL import.</p>"},{"location":"deployment.html#2-install","title":"2. Install","text":"<pre><code>helm install evaluator ./helm/openaire-research-evaluator \\\n --set secrets.hfToken=hf_... \\\n --set secrets.secretKey=$(openssl rand -hex 32) \\\n --set ingress.host=openaire-eval.local \\\n --set config.llmBaseUrl=http://192.168.1.66:13305/v1\n</code></pre> <p>Or create a <code>values.local.yaml</code>:</p> <pre><code>secrets:\n hfToken: hf_...\n secretKey: abc123...\n hfClientId: ...\n hfClientSecret: ...\ningress:\n host: openaire-eval.local\nconfig:\n llmBaseUrl: http://192.168.1.66:13305/v1\n</code></pre> <pre><code>helm install evaluator ./helm/openaire-research-evaluator -f values.local.yaml\n</code></pre>"},{"location":"deployment.html#3-load-golden-data","title":"3. Load golden data","text":"<p>Wait for PostgreSQL to be ready, then import:</p> <pre><code>kubectl cp data/collaborative_pg.sql \\\n $(kubectl get pod -l component=postgres -o jsonpath='{.items[0].metadata.name}'):/tmp/collaborative_pg.sql\n\nkubectl exec -it deployment/evaluator-openaire-research-evaluator-postgres -- \\\n psql -U postgres -d echo_dsrn -f /tmp/collaborative_pg.sql\n\n# Reset auto-increment sequences after import (IDs were explicit in the dump)\nkubectl exec deployment/evaluator-openaire-research-evaluator-postgres -- \\\n psql -U postgres -d echo_dsrn -c \\\n \"SELECT setval('annotations_id_seq', COALESCE((SELECT MAX(id) FROM annotations), 1))\"\n</code></pre>"},{"location":"deployment.html#4-access","title":"4. Access","text":"<pre><code>kubectl port-forward svc/evaluator-openaire-research-evaluator-web 7860:7860\n</code></pre> <p>App at <code>http://localhost:7860</code>. With Ingress configured, at <code>http://openaire-eval.local</code>.</p> <p>Local DNS setup: add to <code>/etc/hosts</code>:</p> <pre><code>echo \"127.0.0.1 openaire-eval.local\" | sudo tee -a /etc/hosts\n</code></pre> <p>Then access at <code>http://openaire-eval.local</code> (k3s Traefik listens on port 80).</p>"},{"location":"deployment.html#components","title":"Components","text":"Component Service Port Web (FastAPI + Vue) <code>&lt;release&gt;-web</code> 7860 PostgreSQL <code>&lt;release&gt;-postgres</code> 5432 Redis <code>&lt;release&gt;-redis</code> 6379 Worker (Celery) \u2014 (internal) \u2014"},{"location":"deployment.html#troubleshooting","title":"Troubleshooting","text":"<p>Check web pod logs for alembic migration status:</p> <pre><code>kubectl logs deployment/evaluator-openaire-research-evaluator-web\n</code></pre>"},{"location":"inference.html","title":"Inference","text":"<p>Model: <code>ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF</code> \u2014 gated repo, request access before use.</p>"},{"location":"inference.html#install","title":"Install","text":"<pre><code>pip install git+https://github.com/ethicalabs-ai/Echo-DSRN.git\n</code></pre>"},{"location":"inference.html#classify","title":"Classify","text":"<pre><code>from echo_dsrn import EchoForSequenceClassification\nfrom transformers import AutoTokenizer\n\nmodel = EchoForSequenceClassification.from_pretrained(\n \"ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF\", trust_remote_code=True\n)\ntokenizer = AutoTokenizer.from_pretrained(\n \"ethicalabs/Echo-DSRN-v0.1.3-Research-Intent-CLF\", trust_remote_code=True\n)\n\nlabel, probs = model.classify(\n \"Title: Attention Is All You Need\\n\"\n \"Abstract: We propose a new simple network architecture, the Transformer...\",\n tokenizer=tokenizer,\n)\nprint(label, probs)\n# \u2192 Methodology tensor([0.87, 0.03, 0.02, 0.06, 0.02])\n</code></pre>"},{"location":"inference.html#model-specs","title":"Model Specs","text":"Property Value Architecture Echo-DSRN (Recurrent Neural Network) Parameters 98,266,629 (~98M) Layers 8 DSRN blocks Hidden dim 512 Attention heads 4 Vocab size 32,017 tokens Precision bfloat16 Inference Fast on CPU <p>Run <code>curl /api/model/card</code> for live specs from the loaded model.</p>"},{"location":"license.html","title":"License","text":""},{"location":"license.html#code","title":"Code","text":"<p>Apache License 2.0 \u2014 see LICENSE.</p> <p>Copyright \u00a9 2026 ethicalabs.ai</p>"},{"location":"license.html#openaire-graph","title":"OpenAIRE Graph","text":"<p>This project uses the OpenAIRE Graph API. All materials created by OpenAIRE are licensed under CC BY 4.0.</p>"},{"location":"license.html#hackathon-deliverable","title":"Hackathon Deliverable","text":"<p>This project is submitted to the OpenAIRE AI Hackathon 2026. Per hackathon requirements, all submitted materials are available under a CC-BY license.</p>"},{"location":"license.html#attribution","title":"Attribution","text":"<p>If you reuse this work, please cite:</p> <p>OpenAIRE-AI-Research-Evaluator \u2014 Multi-model LLM-as-Judge pipeline for research intent classification. ethicalabs.ai, 2026. Apache-2.0 / CC-BY 4.0. github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator</p>"},{"location":"llm-as-judge.html","title":"LLM-as-Judge","text":"<p>The LLM-as-Judge pipeline evaluates Echo-DSRN predictions against high-capability LLMs and produces a golden consensus dataset in <code>data/collaborative.db</code>.</p>"},{"location":"llm-as-judge.html#search-queries","title":"Search Queries","text":"<p>arXiv and OpenAIRE sources use keyword queries from <code>assets/topics.txt</code> \u2014 one query per line, blank lines and <code>#</code> comments ignored. Edit this file to target specific research domains.</p> <p>Container path: <code>/app/assets/topics.txt</code></p>"},{"location":"llm-as-judge.html#setup","title":"Setup","text":"<p>Point at a lemonade or llama.cpp server via <code>.env</code>:</p> <pre><code>LLM_BASE_URL=http://192.168.1.40:13305/v1\n</code></pre> <p>Migrate the database:</p> <pre><code>uv run alembic -c backend/alembic.ini upgrade head\n</code></pre>"},{"location":"llm-as-judge.html#llm-server-setup","title":"LLM Server Setup","text":"<p>Any OpenAI-compatible server works. Configuration via <code>.env</code>:</p> <pre><code>LLM_BASE_URL=&lt;server-url&gt;\nLLM_API_KEY=not-needed # for local servers that skip auth\n</code></pre>"},{"location":"llm-as-judge.html#ollama","title":"Ollama","text":"<pre><code>ollama pull qwen3:4b\nollama serve\n</code></pre> <pre><code>LLM_BASE_URL=http://localhost:11434/v1\n</code></pre>"},{"location":"llm-as-judge.html#lm-studio","title":"LM Studio","text":"<p>Start the local server in the UI (Developer \u2192 Local Server). Default port:</p> <pre><code>LLM_BASE_URL=http://localhost:1234/v1\n</code></pre>"},{"location":"llm-as-judge.html#lemonade-llamacpp","title":"Lemonade / llama.cpp","text":"<pre><code>lemonade --host 0.0.0.0 load --pinned Qwen3.6-35B-A3B-GGUF\n</code></pre> <pre><code>LLM_BASE_URL=http://192.168.1.40:13305/v1\n</code></pre>"},{"location":"llm-as-judge.html#docker-llm-on-host","title":"Docker \u2014 LLM on host","text":"<p>When running the app in Docker and the LLM server on the host, use <code>host.docker.internal</code>:</p> <pre><code>LLM_BASE_URL=http://host.docker.internal:11434/v1\n</code></pre> <p>The <code>docker-compose.yaml</code> already includes <code>extra_hosts: host.docker.internal:host-gateway</code>.</p>"},{"location":"llm-as-judge.html#batch-runner-sync","title":"Batch Runner \u2014 Sync","text":"<p>Loads models on lemonade, judges papers inline:</p> <pre><code>./scripts/run_judges.sh 100\n</code></pre> <p>Cycles through 11 GGUF models (Qwen3.6, Nemotron, Gemma, GPT-OSS, DeepSeek, GLM) against the catalog source.</p>"},{"location":"llm-as-judge.html#batch-runner-async","title":"Batch Runner \u2014 Async","text":"<p>Dispatches Celery tasks to the worker, no model loading:</p> <pre><code>./scripts/run_judges.sh 100 --async\n</code></pre>"},{"location":"llm-as-judge.html#kubernetes-k3s","title":"Kubernetes (k3s)","text":"<p>Run the judge CLI directly in the deployed web pod:</p> <pre><code>kubectl exec -it deployment/evaluator-openaire-research-evaluator-web -- \\\n env LLM_BASE_URL=http://192.168.1.66:13305/v1 \\\n python backend/judge_cli.py \\\n --source catalog --n 100 \\\n --model gpt-oss-20b-mxfp4-GGUF \\\n --async\n</code></pre> <p>Tasks dispatch to the cluster's Celery worker, using the same Redis and PostgreSQL.</p>"},{"location":"llm-as-judge.html#single-run","title":"Single Run","text":"<pre><code># Local GGUF via llama.cpp / lemonade\nuv run python backend/judge_cli.py \\\n --source catalog --n 100 \\\n --model Qwen3.6-35B-A3B-GGUF\n\n# Google Gemini (OpenAI-compatible endpoint)\nuv run python backend/judge_cli.py \\\n --source catalog --n 100 \\\n --model gemini-2.5-flash \\\n --llm-url https://generativelanguage.googleapis.com/v1beta/openai/ \\\n --llm-key ${GEMINI_API_KEY}\n</code></pre>"},{"location":"llm-as-judge.html#pre-labeled-datasets","title":"Pre-labeled Datasets","text":"<p>Convert chat-format JSONL to flat records, then judge:</p> <pre><code>uv run python scripts/reformat_for_judge.py \\\n ~/.ethicalabs/datasets/research-intent/train.jsonl \\\n ~/.ethicalabs/datasets/research-intent/train_flat.jsonl\n\nuv run python backend/judge_cli.py \\\n --source dataset \\\n --dataset-path ~/.ethicalabs/datasets/research-intent/train_flat.jsonl \\\n --n 100 --model Qwen3.6-35B-A3B-GGUF\n</code></pre>"},{"location":"llm-as-judge.html#evaluation","title":"Evaluation","text":"<pre><code>uv run python backend/judge_eval.py # all papers\nuv run python backend/judge_eval.py --paper-source dataset # golden set only\n</code></pre> <p>Computes agreement rates, class-level accuracy, and per-model alignment stats.</p>"},{"location":"mcp.html","title":"MCP \u2014 Agent Classification Endpoint","text":"<p>Expose Echo-DSRN-98M research intent classification to AI agents via the Model Context Protocol (SSE transport).</p>"},{"location":"mcp.html#server-configuration","title":"Server Configuration","text":"<p>Add to your MCP client config (Claude Desktop, Cursor, Continue, etc.):</p> <pre><code>{\n \"mcpServers\": {\n \"echo-dsrn\": {\n \"url\": \"http://localhost:7860/api/mcp/classify\",\n \"transport\": \"sse\",\n \"headers\": {\n \"Authorization\": \"Bearer echo-dsrn-mcp-change-me-in-production\"\n }\n }\n }\n}\n</code></pre> <p>Set <code>MCP_API_KEY</code> in <code>.env</code> to match:</p> <pre><code>MCP_API_KEY=echo-dsrn-mcp-change-me-in-production\n</code></pre>"},{"location":"mcp.html#authentication","title":"Authentication","text":"<p>Bearer token via <code>Authorization</code> header. No query-string keys.</p>"},{"location":"mcp.html#tools-exposed","title":"Tools exposed","text":"Tool Description <code>classify_intent</code> Classify a research paper by title + abstract into one of 5 intents"},{"location":"mcp.html#input","title":"Input","text":"<pre><code>{\n \"title\": \"Attention Is All You Need\",\n \"abstract\": \"We propose a new simple network architecture, the Transformer...\"\n}\n</code></pre>"},{"location":"mcp.html#output","title":"Output","text":"<pre><code>{\n \"label\": \"Methodology\",\n \"probabilities\": {\n \"Methodology\": 0.87,\n \"Dataset\": 0.03,\n \"Review\": 0.02,\n \"Applied\": 0.06,\n \"Theoretical\": 0.02\n }\n}\n</code></pre>"},{"location":"mcp.html#raw-sse-usage","title":"Raw SSE usage","text":"<pre><code>curl -N -H \"Authorization: Bearer echo-dsrn-mcp-change-me-in-production\" \\\n \"http://localhost:7860/api/mcp/classify?title=Attention+Is+All+You+Need&amp;abstract=We+propose+the+Transformer\"\n</code></pre> <pre><code>import requests\n\nresp = requests.get(\n \"http://localhost:7860/api/mcp/classify\",\n params={\"title\": \"Attention Is All You Need\", \"abstract\": \"We propose...\"},\n headers={\"Authorization\": \"Bearer echo-dsrn-mcp-change-me-in-production\"},\n stream=True,\n)\nfor line in resp.iter_lines():\n if line:\n print(line.decode())\n</code></pre>"},{"location":"mcp.html#architecture","title":"Architecture","text":"<ol> <li>Request hits SSE endpoint \u2192 Bearer token validated</li> <li>Celery task <code>classify_mcp</code> enqueued to Redis</li> <li>Worker loads Echo-DSRN-98M (baked into Docker image, no HF download)</li> <li>Fast CPU inference \u2192 result streamed via SSE</li> </ol> <p>No papers saved. No database writes. Stateless.</p>"},{"location":"oauth.html","title":"OAuth \u2014 Hugging Face Login","text":"<p>The Collab Hub uses Hugging Face OAuth for authentication. Users log in with their HF account to vote on annotations and save papers.</p>"},{"location":"oauth.html#setup","title":"Setup","text":""},{"location":"oauth.html#1-create-an-oauth-app","title":"1. Create an OAuth App","text":"<p>Go to Hugging Face OAuth Apps and create a new app:</p> <ul> <li>Name: <code>Echo-DSRN Collab Hub</code></li> <li>Homepage URL: <code>http://localhost:7860</code> (or your production URL)</li> <li>Redirect URL: <code>http://localhost:7860/api/auth/callback/hf</code></li> </ul>"},{"location":"oauth.html#2-configure-env","title":"2. Configure .env","text":"<pre><code>APP_BASE_URL=http://localhost:7860\nHF_CLIENT_ID=&lt;your-client-id&gt;\nHF_CLIENT_SECRET=&lt;your-client-secret&gt;\n</code></pre>"},{"location":"oauth.html#3-production","title":"3. Production","text":"<p>Replace <code>localhost:7860</code> with your production domain. Both the Homepage URL and Redirect URL must match.</p> <pre><code>APP_BASE_URL=https://echo-dsrn.example.com\n</code></pre> <p>Redirect URL: <code>https://echo-dsrn.example.com/api/auth/callback/hf</code></p>"},{"location":"oauth.html#how-it-works","title":"How it works","text":"<ol> <li>User clicks \"Login with Hugging Face\" in the Collab Hub</li> <li>Redirected to HF authorization page</li> <li>After consent, redirected back to <code>/api/auth/callback/hf</code></li> <li>Backend exchanges code for token, fetches user profile</li> <li>JWT session cookie set \u2014 user is authenticated</li> </ol> <p>User data stored: HF username, name, email, avatar URL, and optionally institution (from profile).</p>"},{"location":"quickstart.html","title":"Quick Start","text":""},{"location":"quickstart.html#prerequisites","title":"Prerequisites","text":"<ul> <li>Python \u2265 3.12 (tested with 3.12.3)</li> <li>Node.js \u2265 22 (tested with 22.22.3)</li> <li>npm \u2265 10 (tested with 10.9.8)</li> <li>Docker (optional, for containerised deployment)</li> </ul>"},{"location":"quickstart.html#docker-compose","title":"Docker Compose","text":"<p>The Echo-DSRN classifier is a gated HF model. Before building:</p> <ol> <li>Request access to the model repo</li> <li>Create an HF access token with read permissions</li> <li>Add it to <code>.env</code>: <code>HF_TOKEN=hf_...</code></li> </ol> <pre><code>make rebuild # builds Docker image with the gated model\ndocker compose up -d\n</code></pre> <p>App serves on <code>http://localhost:7860</code>. Redis, the web server, and a Celery worker start automatically.</p>"},{"location":"quickstart.html#python","title":"Python","text":""},{"location":"quickstart.html#uv","title":"uv","text":"<pre><code>uv run python backend/server.py\n</code></pre>"},{"location":"quickstart.html#pip","title":"pip","text":"<pre><code>pip install -r requirements.txt\npython backend/server.py\n</code></pre> <p>Build the frontend first: <code>cd frontend &amp;&amp; npm ci &amp;&amp; npm run build</code>. App serves on <code>http://localhost:7860</code>.</p>"},{"location":"quickstart.html#makefile","title":"Makefile","text":"<pre><code>make help # list all targets\nmake up # docker compose up -d\nmake build-docker # build the Docker image\nmake test # run pytest\nmake lint # pre-commit hooks\nmake migrate # alembic upgrade head\nmake judge N=100 # run LLM-as-Judge (sync)\nmake judge-async N=100 # dispatch to Celery worker\n</code></pre>"},{"location":"story.html","title":"Hackathon Story","text":""},{"location":"story.html#the-question","title":"The Question","text":"<p>How can we turn the OpenAIRE Graph \u2014 a living index of millions of research outputs \u2014 into validated, high-quality training data for AI classifiers, at scale and with minimal human effort?</p> <p>The OpenAIRE Graph aggregates publication metadata across disciplines, languages, and repositories.</p> <p>It is an extraordinary resource for building AI tools that understand research, But raw metadata is noisy: titles are truncated, abstracts vary in quality, and classification labels are absent.</p> <p>To train a classifier that can reliably distinguish a methodology paper from a dataset paper, a review from an applied case study, you need labeled data \u2014 and labeling thousands of papers by hand is slow, expensive, and fragile.</p> <p>Our question was: can we automate this with a feedback loop that combines a fast, lightweight classifier with a panel of LLM judges, using the OpenAIRE Graph as both the data source and the proving ground?</p>"},{"location":"story.html#the-journey","title":"The Journey","text":""},{"location":"story.html#phase-1-the-classifier","title":"Phase 1 \u2014 The Classifier","text":"<p>We started with Echo-DSRN, a recurrent neural network developed built from scratch by us.</p> <p>Echo-DSRN is small (98M-114M parameters) and runs efficiently on CPU, making it suitable for real-time streaming applications where a GPU is unavailable or impractical.</p> <p>We fine-tuned it on a 5-class research intent taxonomy:</p> <ul> <li>Methodology \u2014 introduces a new method, model, or algorithm</li> <li>Dataset \u2014 introduces or documents a dataset or benchmark</li> <li>Review \u2014 surveys or synthesises existing work</li> <li>Applied \u2014 applies existing methods to a domain problem</li> <li>Theoretical \u2014 mathematical or formal analysis without empirical evaluation</li> </ul> <p>The initial training set was ~6,000 records curated from PubMed, Semantic Scholar, Papers With Code, arXiv, and the OpenAIRE Graph itself \u2014 silver-labeled with keyword heuristics and arXiv category priors.</p> <p>The classifier worked well, but we had no systematic way to measure how well, or to improve it.</p>"},{"location":"story.html#phase-2-the-app","title":"Phase 2 \u2014 The App","text":"<p>We built a Vue 3 + FastAPI web application that streams paper metadata from the OpenAIRE Graph API in real time.</p> <p>Users see papers appear with Echo-DSRN's predicted intent and a probability distribution across all five classes.</p> <p>They can classify custom text, save results to local history, and browse a Model Card showing the exact architecture, parameter census, and consumption code.</p> <p>But passive classification is only half the story.</p> <p>To improve the model, we needed ground truth \u2014 and that meant building a pipeline for annotation at scale.</p>"},{"location":"story.html#phase-3-llm-as-judge","title":"Phase 3 \u2014 LLM-as-Judge","text":"<p>We designed an LLM-as-Judge pipeline where multiple high-capability language models evaluate Echo-DSRN's predictions and produce structured verdicts:</p> <ul> <li>Is the predicted label correct?</li> <li>If not, what should it be?</li> <li>Should the paper be flagged (garbled text, non-English, math-only)?</li> <li>What is the judge's confidence?</li> </ul> <p>Each judge receives the paper title, abstract, and Echo's prediction, then returns a JSON verdict following a strict Pydantic schema enforced via OpenAI's <code>response_format</code>.</p> <p>We support any OpenAI-compatible inference server: llama.cpp, vLLM, LM Studio, Google Gemini, and lemonade for local GGUF model orchestration.</p> <p>We assembled a panel of 11 models spanning architectures and parameter counts: <code>Qwen3.6-35B</code>, <code>Qwen3.6-27B</code>, <code>Qwen3.5-35B</code>, <code>Nemotron-3-Nano-30B</code>, <code>Gemma-4-26B</code>, <code>GPT-OSS-20B</code>, <code>GPT-OSS-120B</code>, <code>DeepSeek-Qwen3-8B</code>, <code>GLM-4.7-Flash</code>, <code>Qwen3.6-35B-A3B</code>, and <code>Qwen3.5-4B</code>.</p>"},{"location":"story.html#phase-4-scale-with-celery","title":"Phase 4 \u2014 Scale with Celery","text":"<p>Running 11 models across thousands of papers synchronously is slow \u2014 each paper needs an LLM API call with its own latency.</p> <p>We added a Celery + Redis worker queue: the CLI dispatches fine-grained per-paper tasks, and workers pull from the queue and process them asynchronously. The same pipeline can run with a single command:</p> <pre><code>./scripts/run_judges.sh 100 --async\n</code></pre> <p>This dispatches 100 papers per model (1,100 total tasks) to the worker pool. The worker handles classification, LLM judging, and database persistence in one atomic unit, with idempotency guarantees \u2014 no paper is judged twice by the same model.</p>"},{"location":"story.html#phase-5-the-golden-dataset","title":"Phase 5 \u2014 The Golden Dataset","text":"<p>All annotations are stored in a SQLite database (<code>data/collaborative.db</code>). The <code>judge_eval.py</code> script computes:</p> <ul> <li>Agreement rates between judges</li> <li>Per-class accuracy against ground truth (when available)</li> <li>Per-model alignment stats against Echo-DSRN</li> </ul> <p>The result is a golden consensus dataset where each paper has labels from multiple LLMs alongside Echo-DSRN's original prediction. This dataset becomes the training data for the next iteration of the classifier \u2014 closing the feedback loop.</p>"},{"location":"story.html#the-insight","title":"The Insight","text":"<p>A multi-model LLM-as-Judge pipeline, fed by the OpenAIRE Graph, produces higher-quality training data than any single annotator \u2014 human or machine \u2014 at a fraction of the cost.</p> <p>Three findings stand out:</p> <ol> <li> <p>Diversity matters. Different models disagree on edge cases (applied vs. methodology, dataset vs. methodology), and consensus across architectures produces more robust labels than the strongest single model alone.</p> </li> <li> <p>The OpenAIRE Graph is a live data flywheel. New papers appear daily. A streaming classifier backed by LLM judges can continuously expand the training set without manual curation.</p> </li> <li> <p>CPU-first is viable. Echo-DSRN-98M runs fast enough on CPU to be deployable anywhere \u2014 from a cloud VM to a Raspberry Pi. The heavy lifting (LLM judging) is offloaded to a remote GPU server, but the classification itself is free.</p> </li> </ol>"},{"location":"story.html#what-others-can-reuse","title":"What Others Can Reuse","text":"<p>This project is designed to be remixed. Here is what you can take and adapt:</p> Component Reuse scenario LLM-as-Judge pipeline Swap the 5-class taxonomy for your own labels. Point at any OpenAI-compatible server. The judge schema, prompt, and evaluation scripts are label-agnostic. OpenAIRE Graph integration The keyword streaming + multilingual query approach works for any research domain. The fetcher handles both arXiv and OpenAIRE APIs. Async Celery worker pattern Fine-grained per-paper tasks with lazy database imports and idempotency \u2014 copy the pattern for any batch annotation workflow. Dataset preparation scripts <code>prepare_research_intent.py</code> and <code>expand_multilingual_openaire.py</code> build balanced, multilingual training sets from public APIs. Adapt the keyword banks and label taxonomy. Echo-DSRN classifier The model is on Hugging Face (gated \u2014 request access). <code>model.classify(title + abstract, tokenizer)</code> is the entire API. Swap the classification head for your own labels."},{"location":"story.html#license","title":"License","text":"<p>Code: Apache 2.0. OpenAIRE Graph: CC BY 4.0. All hackathon materials: CC-BY.</p>"}]}
story.html ADDED
@@ -0,0 +1,982 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Multi-model LLM-as-Judge pipeline for the OpenAIRE AI Hackathon 2026">
10
+
11
+
12
+
13
+
14
+ <link rel="prev" href="inference.html">
15
+
16
+
17
+ <link rel="next" href="deployment.html">
18
+
19
+
20
+
21
+
22
+
23
+ <link rel="icon" href="assets/images/favicon.png">
24
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
25
+
26
+
27
+
28
+ <title>Hackathon Story - OpenAIRE-AI-Research-Evaluator</title>
29
+
30
+
31
+
32
+ <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css">
33
+
34
+
35
+ <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css">
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
49
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
50
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
51
+
52
+
53
+
54
+ <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
55
+
56
+
57
+
58
+
59
+
60
+ </head>
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#hackathon-story" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-header__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ OpenAIRE-AI-Research-Evaluator
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ Hackathon Story
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+ <label class="md-header__button md-icon" for="__search">
128
+
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
130
+ </label>
131
+ <div class="md-search" data-md-component="search" role="dialog">
132
+ <label class="md-search__overlay" for="__search"></label>
133
+ <div class="md-search__inner" role="search">
134
+ <form class="md-search__form" name="search">
135
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
136
+ <label class="md-search__icon md-icon" for="__search">
137
+
138
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
139
+
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
141
+ </label>
142
+ <nav class="md-search__options" aria-label="Search">
143
+
144
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
145
+
146
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
147
+ </button>
148
+ </nav>
149
+
150
+ </form>
151
+ <div class="md-search__output">
152
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
153
+ <div class="md-search-result" data-md-component="search-result">
154
+ <div class="md-search-result__meta">
155
+ Initializing search
156
+ </div>
157
+ <ol class="md-search-result__list" role="presentation"></ol>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ </div>
163
+
164
+
165
+
166
+ <div class="md-header__source">
167
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
168
+ <div class="md-source__icon md-icon">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
171
+ </div>
172
+ <div class="md-source__repository">
173
+ GitHub
174
+ </div>
175
+ </a>
176
+ </div>
177
+
178
+ </nav>
179
+
180
+ </header>
181
+
182
+ <div class="md-container" data-md-component="container">
183
+
184
+
185
+
186
+
187
+
188
+
189
+ <main class="md-main" data-md-component="main">
190
+ <div class="md-main__inner md-grid">
191
+
192
+
193
+
194
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
195
+ <div class="md-sidebar__scrollwrap">
196
+ <div class="md-sidebar__inner">
197
+
198
+
199
+
200
+
201
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
202
+ <label class="md-nav__title" for="__drawer">
203
+ <a href="index.html" title="OpenAIRE-AI-Research-Evaluator" class="md-nav__button md-logo" aria-label="OpenAIRE-AI-Research-Evaluator" data-md-component="logo">
204
+
205
+
206
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
207
+
208
+ </a>
209
+ OpenAIRE-AI-Research-Evaluator
210
+ </label>
211
+
212
+ <div class="md-nav__source">
213
+ <a href="https://github.com/ethicalabs-ai/OpenAIRE-AI-Research-Evaluator" title="Go to repository" class="md-source" data-md-component="source">
214
+ <div class="md-source__icon md-icon">
215
+
216
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
217
+ </div>
218
+ <div class="md-source__repository">
219
+ GitHub
220
+ </div>
221
+ </a>
222
+ </div>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="index.html" class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ Home
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ <li class="md-nav__item">
260
+ <a href="quickstart.html" class="md-nav__link">
261
+
262
+
263
+
264
+ <span class="md-ellipsis">
265
+
266
+
267
+ Quick Start
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ </a>
276
+ </li>
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+ <li class="md-nav__item">
287
+ <a href="architecture.html" class="md-nav__link">
288
+
289
+
290
+
291
+ <span class="md-ellipsis">
292
+
293
+
294
+ Architecture
295
+
296
+
297
+
298
+ </span>
299
+
300
+
301
+
302
+ </a>
303
+ </li>
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <li class="md-nav__item">
314
+ <a href="llm-as-judge.html" class="md-nav__link">
315
+
316
+
317
+
318
+ <span class="md-ellipsis">
319
+
320
+
321
+ LLM-as-Judge
322
+
323
+
324
+
325
+ </span>
326
+
327
+
328
+
329
+ </a>
330
+ </li>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+ <li class="md-nav__item">
341
+ <a href="mcp.html" class="md-nav__link">
342
+
343
+
344
+
345
+ <span class="md-ellipsis">
346
+
347
+
348
+ MCP
349
+
350
+
351
+
352
+ </span>
353
+
354
+
355
+
356
+ </a>
357
+ </li>
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+ <li class="md-nav__item">
368
+ <a href="oauth.html" class="md-nav__link">
369
+
370
+
371
+
372
+ <span class="md-ellipsis">
373
+
374
+
375
+ OAuth
376
+
377
+
378
+
379
+ </span>
380
+
381
+
382
+
383
+ </a>
384
+ </li>
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+ <li class="md-nav__item">
395
+ <a href="inference.html" class="md-nav__link">
396
+
397
+
398
+
399
+ <span class="md-ellipsis">
400
+
401
+
402
+ Inference
403
+
404
+
405
+
406
+ </span>
407
+
408
+
409
+
410
+ </a>
411
+ </li>
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+ <li class="md-nav__item md-nav__item--active">
424
+
425
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
426
+
427
+
428
+
429
+
430
+
431
+ <label class="md-nav__link md-nav__link--active" for="__toc">
432
+
433
+
434
+
435
+ <span class="md-ellipsis">
436
+
437
+
438
+ Hackathon Story
439
+
440
+
441
+
442
+ </span>
443
+
444
+
445
+
446
+ <span class="md-nav__icon md-icon"></span>
447
+ </label>
448
+
449
+ <a href="story.html" class="md-nav__link md-nav__link--active">
450
+
451
+
452
+
453
+ <span class="md-ellipsis">
454
+
455
+
456
+ Hackathon Story
457
+
458
+
459
+
460
+ </span>
461
+
462
+
463
+
464
+ </a>
465
+
466
+
467
+
468
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
469
+
470
+
471
+
472
+
473
+
474
+
475
+ <label class="md-nav__title" for="__toc">
476
+ <span class="md-nav__icon md-icon"></span>
477
+ Table of contents
478
+ </label>
479
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
480
+
481
+ <li class="md-nav__item">
482
+ <a href="#the-question" class="md-nav__link">
483
+ <span class="md-ellipsis">
484
+
485
+ The Question
486
+
487
+ </span>
488
+ </a>
489
+
490
+ </li>
491
+
492
+ <li class="md-nav__item">
493
+ <a href="#the-journey" class="md-nav__link">
494
+ <span class="md-ellipsis">
495
+
496
+ The Journey
497
+
498
+ </span>
499
+ </a>
500
+
501
+ <nav class="md-nav" aria-label="The Journey">
502
+ <ul class="md-nav__list">
503
+
504
+ <li class="md-nav__item">
505
+ <a href="#phase-1-the-classifier" class="md-nav__link">
506
+ <span class="md-ellipsis">
507
+
508
+ Phase 1 β€” The Classifier
509
+
510
+ </span>
511
+ </a>
512
+
513
+ </li>
514
+
515
+ <li class="md-nav__item">
516
+ <a href="#phase-2-the-app" class="md-nav__link">
517
+ <span class="md-ellipsis">
518
+
519
+ Phase 2 β€” The App
520
+
521
+ </span>
522
+ </a>
523
+
524
+ </li>
525
+
526
+ <li class="md-nav__item">
527
+ <a href="#phase-3-llm-as-judge" class="md-nav__link">
528
+ <span class="md-ellipsis">
529
+
530
+ Phase 3 β€” LLM-as-Judge
531
+
532
+ </span>
533
+ </a>
534
+
535
+ </li>
536
+
537
+ <li class="md-nav__item">
538
+ <a href="#phase-4-scale-with-celery" class="md-nav__link">
539
+ <span class="md-ellipsis">
540
+
541
+ Phase 4 β€” Scale with Celery
542
+
543
+ </span>
544
+ </a>
545
+
546
+ </li>
547
+
548
+ <li class="md-nav__item">
549
+ <a href="#phase-5-the-golden-dataset" class="md-nav__link">
550
+ <span class="md-ellipsis">
551
+
552
+ Phase 5 β€” The Golden Dataset
553
+
554
+ </span>
555
+ </a>
556
+
557
+ </li>
558
+
559
+ </ul>
560
+ </nav>
561
+
562
+ </li>
563
+
564
+ <li class="md-nav__item">
565
+ <a href="#the-insight" class="md-nav__link">
566
+ <span class="md-ellipsis">
567
+
568
+ The Insight
569
+
570
+ </span>
571
+ </a>
572
+
573
+ </li>
574
+
575
+ <li class="md-nav__item">
576
+ <a href="#what-others-can-reuse" class="md-nav__link">
577
+ <span class="md-ellipsis">
578
+
579
+ What Others Can Reuse
580
+
581
+ </span>
582
+ </a>
583
+
584
+ </li>
585
+
586
+ <li class="md-nav__item">
587
+ <a href="#license" class="md-nav__link">
588
+ <span class="md-ellipsis">
589
+
590
+ License
591
+
592
+ </span>
593
+ </a>
594
+
595
+ </li>
596
+
597
+ </ul>
598
+
599
+ </nav>
600
+
601
+ </li>
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+
610
+
611
+ <li class="md-nav__item">
612
+ <a href="deployment.html" class="md-nav__link">
613
+
614
+
615
+
616
+ <span class="md-ellipsis">
617
+
618
+
619
+ Deployment
620
+
621
+
622
+
623
+ </span>
624
+
625
+
626
+
627
+ </a>
628
+ </li>
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+
637
+
638
+ <li class="md-nav__item">
639
+ <a href="license.html" class="md-nav__link">
640
+
641
+
642
+
643
+ <span class="md-ellipsis">
644
+
645
+
646
+ License
647
+
648
+
649
+
650
+ </span>
651
+
652
+
653
+
654
+ </a>
655
+ </li>
656
+
657
+
658
+
659
+ </ul>
660
+ </nav>
661
+ </div>
662
+ </div>
663
+ </div>
664
+
665
+
666
+
667
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
668
+ <div class="md-sidebar__scrollwrap">
669
+ <div class="md-sidebar__inner">
670
+
671
+
672
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
673
+
674
+
675
+
676
+
677
+
678
+
679
+ <label class="md-nav__title" for="__toc">
680
+ <span class="md-nav__icon md-icon"></span>
681
+ Table of contents
682
+ </label>
683
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
684
+
685
+ <li class="md-nav__item">
686
+ <a href="#the-question" class="md-nav__link">
687
+ <span class="md-ellipsis">
688
+
689
+ The Question
690
+
691
+ </span>
692
+ </a>
693
+
694
+ </li>
695
+
696
+ <li class="md-nav__item">
697
+ <a href="#the-journey" class="md-nav__link">
698
+ <span class="md-ellipsis">
699
+
700
+ The Journey
701
+
702
+ </span>
703
+ </a>
704
+
705
+ <nav class="md-nav" aria-label="The Journey">
706
+ <ul class="md-nav__list">
707
+
708
+ <li class="md-nav__item">
709
+ <a href="#phase-1-the-classifier" class="md-nav__link">
710
+ <span class="md-ellipsis">
711
+
712
+ Phase 1 β€” The Classifier
713
+
714
+ </span>
715
+ </a>
716
+
717
+ </li>
718
+
719
+ <li class="md-nav__item">
720
+ <a href="#phase-2-the-app" class="md-nav__link">
721
+ <span class="md-ellipsis">
722
+
723
+ Phase 2 β€” The App
724
+
725
+ </span>
726
+ </a>
727
+
728
+ </li>
729
+
730
+ <li class="md-nav__item">
731
+ <a href="#phase-3-llm-as-judge" class="md-nav__link">
732
+ <span class="md-ellipsis">
733
+
734
+ Phase 3 β€” LLM-as-Judge
735
+
736
+ </span>
737
+ </a>
738
+
739
+ </li>
740
+
741
+ <li class="md-nav__item">
742
+ <a href="#phase-4-scale-with-celery" class="md-nav__link">
743
+ <span class="md-ellipsis">
744
+
745
+ Phase 4 β€” Scale with Celery
746
+
747
+ </span>
748
+ </a>
749
+
750
+ </li>
751
+
752
+ <li class="md-nav__item">
753
+ <a href="#phase-5-the-golden-dataset" class="md-nav__link">
754
+ <span class="md-ellipsis">
755
+
756
+ Phase 5 β€” The Golden Dataset
757
+
758
+ </span>
759
+ </a>
760
+
761
+ </li>
762
+
763
+ </ul>
764
+ </nav>
765
+
766
+ </li>
767
+
768
+ <li class="md-nav__item">
769
+ <a href="#the-insight" class="md-nav__link">
770
+ <span class="md-ellipsis">
771
+
772
+ The Insight
773
+
774
+ </span>
775
+ </a>
776
+
777
+ </li>
778
+
779
+ <li class="md-nav__item">
780
+ <a href="#what-others-can-reuse" class="md-nav__link">
781
+ <span class="md-ellipsis">
782
+
783
+ What Others Can Reuse
784
+
785
+ </span>
786
+ </a>
787
+
788
+ </li>
789
+
790
+ <li class="md-nav__item">
791
+ <a href="#license" class="md-nav__link">
792
+ <span class="md-ellipsis">
793
+
794
+ License
795
+
796
+ </span>
797
+ </a>
798
+
799
+ </li>
800
+
801
+ </ul>
802
+
803
+ </nav>
804
+ </div>
805
+ </div>
806
+ </div>
807
+
808
+
809
+
810
+ <div class="md-content" data-md-component="content">
811
+
812
+ <article class="md-content__inner md-typeset">
813
+
814
+
815
+
816
+
817
+
818
+
819
+
820
+
821
+ <h1 id="hackathon-story">Hackathon Story</h1>
822
+ <h2 id="the-question">The Question</h2>
823
+ <blockquote>
824
+ <p>How can we turn the OpenAIRE Graph β€” a living index of millions of research outputs β€” into validated, high-quality training data for AI classifiers, at scale and with minimal human effort?</p>
825
+ </blockquote>
826
+ <p>The OpenAIRE Graph aggregates publication metadata across disciplines, languages, and repositories.</p>
827
+ <p>It is an extraordinary resource for building AI tools that understand research, But raw metadata is noisy: titles are truncated, abstracts vary in quality, and classification labels are absent.</p>
828
+ <p>To train a classifier that can reliably distinguish a methodology paper from a dataset paper, a review from an applied case study, you need <strong>labeled data</strong> β€” and labeling thousands of papers by hand is slow, expensive, and fragile.</p>
829
+ <p>Our question was: can we automate this with a feedback loop that combines a fast, lightweight classifier with a panel of LLM judges, using the OpenAIRE Graph as both the data source and the proving ground?</p>
830
+ <hr />
831
+ <h2 id="the-journey">The Journey</h2>
832
+ <h3 id="phase-1-the-classifier">Phase 1 β€” The Classifier</h3>
833
+ <p>We started with <a href="https://www.ethicalabs.ai/research/echo-dsrn/"><strong>Echo-DSRN</strong></a>, a recurrent neural network developed built from scratch by us.</p>
834
+ <p>Echo-DSRN is small (98M-114M parameters) and runs efficiently on CPU, making it suitable for real-time streaming applications where a GPU is unavailable or impractical.</p>
835
+ <p>We fine-tuned it on a 5-class research intent taxonomy:</p>
836
+ <ul>
837
+ <li><strong>Methodology</strong> β€” introduces a new method, model, or algorithm</li>
838
+ <li><strong>Dataset</strong> β€” introduces or documents a dataset or benchmark</li>
839
+ <li><strong>Review</strong> β€” surveys or synthesises existing work</li>
840
+ <li><strong>Applied</strong> β€” applies existing methods to a domain problem</li>
841
+ <li><strong>Theoretical</strong> β€” mathematical or formal analysis without empirical evaluation</li>
842
+ </ul>
843
+ <p>The initial training set was ~6,000 records curated from PubMed, Semantic Scholar, Papers With Code, arXiv, and the OpenAIRE Graph itself β€” silver-labeled with keyword heuristics and arXiv category priors.</p>
844
+ <p>The classifier worked well, but we had no systematic way to measure how well, or to improve it.</p>
845
+ <h3 id="phase-2-the-app">Phase 2 β€” The App</h3>
846
+ <p>We built a Vue 3 + FastAPI web application that streams paper metadata from the OpenAIRE Graph API in real time.</p>
847
+ <p>Users see papers appear with Echo-DSRN's predicted intent and a probability distribution across all five classes.</p>
848
+ <p>They can classify custom text, save results to local history, and browse a Model Card showing the exact architecture, parameter census, and consumption code.</p>
849
+ <p>But passive classification is only half the story.</p>
850
+ <p>To improve the model, we needed ground truth β€” and that meant building a pipeline for annotation at scale.</p>
851
+ <h3 id="phase-3-llm-as-judge">Phase 3 β€” LLM-as-Judge</h3>
852
+ <p>We designed an LLM-as-Judge pipeline where multiple high-capability language models evaluate Echo-DSRN's predictions and produce structured verdicts:</p>
853
+ <ul>
854
+ <li>Is the predicted label correct?</li>
855
+ <li>If not, what should it be?</li>
856
+ <li>Should the paper be flagged (garbled text, non-English, math-only)?</li>
857
+ <li>What is the judge's confidence?</li>
858
+ </ul>
859
+ <p>Each judge receives the paper title, abstract, and Echo's prediction, then returns a JSON verdict following a strict Pydantic schema enforced via OpenAI's <code>response_format</code>.</p>
860
+ <p>We support any OpenAI-compatible inference server: llama.cpp, vLLM, LM Studio, Google Gemini, and lemonade for local GGUF model orchestration.</p>
861
+ <p>We assembled a panel of 11 models spanning architectures and parameter counts: <code>Qwen3.6-35B</code>, <code>Qwen3.6-27B</code>, <code>Qwen3.5-35B</code>, <code>Nemotron-3-Nano-30B</code>, <code>Gemma-4-26B</code>, <code>GPT-OSS-20B</code>, <code>GPT-OSS-120B</code>, <code>DeepSeek-Qwen3-8B</code>, <code>GLM-4.7-Flash</code>, <code>Qwen3.6-35B-A3B</code>, and <code>Qwen3.5-4B</code>.</p>
862
+ <h3 id="phase-4-scale-with-celery">Phase 4 β€” Scale with Celery</h3>
863
+ <p>Running 11 models across thousands of papers synchronously is slow β€” each paper needs an LLM API call with its own latency.</p>
864
+ <p>We added a Celery + Redis worker queue: the CLI dispatches fine-grained per-paper tasks, and workers pull from the queue and process them asynchronously. The same pipeline can run with a single command:</p>
865
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>./scripts/run_judges.sh<span class="w"> </span><span class="m">100</span><span class="w"> </span>--async
866
+ </code></pre></div>
867
+ <p>This dispatches 100 papers per model (1,100 total tasks) to the worker pool. The worker handles classification, LLM judging, and database persistence in one atomic unit, with idempotency guarantees β€” no paper is judged twice by the same model.</p>
868
+ <h3 id="phase-5-the-golden-dataset">Phase 5 β€” The Golden Dataset</h3>
869
+ <p>All annotations are stored in a SQLite database (<code>data/collaborative.db</code>). The <code>judge_eval.py</code> script computes:</p>
870
+ <ul>
871
+ <li>Agreement rates between judges</li>
872
+ <li>Per-class accuracy against ground truth (when available)</li>
873
+ <li>Per-model alignment stats against Echo-DSRN</li>
874
+ </ul>
875
+ <p>The result is a <strong>golden consensus dataset</strong> where each paper has labels from multiple LLMs alongside Echo-DSRN's original prediction. This dataset becomes the training data for the next iteration of the classifier β€” closing the feedback loop.</p>
876
+ <hr />
877
+ <h2 id="the-insight">The Insight</h2>
878
+ <p><strong>A multi-model LLM-as-Judge pipeline, fed by the OpenAIRE Graph, produces higher-quality training data than any single annotator β€” human or machine β€” at a fraction of the cost.</strong></p>
879
+ <p>Three findings stand out:</p>
880
+ <ol>
881
+ <li>
882
+ <p><strong>Diversity matters.</strong> Different models disagree on edge cases (applied vs. methodology, dataset vs. methodology), and consensus across architectures produces more robust labels than the strongest single model alone.</p>
883
+ </li>
884
+ <li>
885
+ <p><strong>The OpenAIRE Graph is a live data flywheel.</strong> New papers appear daily. A streaming classifier backed by LLM judges can continuously expand the training set without manual curation.</p>
886
+ </li>
887
+ <li>
888
+ <p><strong>CPU-first is viable.</strong> Echo-DSRN-98M runs fast enough on CPU to be deployable anywhere β€” from a cloud VM to a Raspberry Pi. The heavy lifting (LLM judging) is offloaded to a remote GPU server, but the classification itself is free.</p>
889
+ </li>
890
+ </ol>
891
+ <hr />
892
+ <h2 id="what-others-can-reuse">What Others Can Reuse</h2>
893
+ <p>This project is designed to be remixed. Here is what you can take and adapt:</p>
894
+ <table>
895
+ <thead>
896
+ <tr>
897
+ <th>Component</th>
898
+ <th>Reuse scenario</th>
899
+ </tr>
900
+ </thead>
901
+ <tbody>
902
+ <tr>
903
+ <td><strong>LLM-as-Judge pipeline</strong></td>
904
+ <td>Swap the 5-class taxonomy for your own labels. Point at any OpenAI-compatible server. The judge schema, prompt, and evaluation scripts are label-agnostic.</td>
905
+ </tr>
906
+ <tr>
907
+ <td><strong>OpenAIRE Graph integration</strong></td>
908
+ <td>The keyword streaming + multilingual query approach works for any research domain. The fetcher handles both arXiv and OpenAIRE APIs.</td>
909
+ </tr>
910
+ <tr>
911
+ <td><strong>Async Celery worker pattern</strong></td>
912
+ <td>Fine-grained per-paper tasks with lazy database imports and idempotency β€” copy the pattern for any batch annotation workflow.</td>
913
+ </tr>
914
+ <tr>
915
+ <td><strong>Dataset preparation scripts</strong></td>
916
+ <td><code>prepare_research_intent.py</code> and <code>expand_multilingual_openaire.py</code> build balanced, multilingual training sets from public APIs. Adapt the keyword banks and label taxonomy.</td>
917
+ </tr>
918
+ <tr>
919
+ <td><strong>Echo-DSRN classifier</strong></td>
920
+ <td>The model is on Hugging Face (gated β€” request access). <code>model.classify(title + abstract, tokenizer)</code> is the entire API. Swap the classification head for your own labels.</td>
921
+ </tr>
922
+ </tbody>
923
+ </table>
924
+ <h2 id="license">License</h2>
925
+ <p>Code: Apache 2.0. OpenAIRE Graph: CC BY 4.0. All hackathon materials: CC-BY.</p>
926
+
927
+
928
+
929
+
930
+
931
+
932
+
933
+
934
+
935
+
936
+
937
+
938
+
939
+ </article>
940
+ </div>
941
+
942
+
943
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
944
+ </div>
945
+
946
+ </main>
947
+
948
+ <footer class="md-footer">
949
+
950
+ <div class="md-footer-meta md-typeset">
951
+ <div class="md-footer-meta__inner md-grid">
952
+ <div class="md-copyright">
953
+
954
+
955
+ Made with
956
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
957
+ Material for MkDocs
958
+ </a>
959
+
960
+ </div>
961
+
962
+ </div>
963
+ </div>
964
+ </footer>
965
+
966
+ </div>
967
+ <div class="md-dialog" data-md-component="dialog">
968
+ <div class="md-dialog__inner md-typeset"></div>
969
+ </div>
970
+
971
+
972
+
973
+
974
+
975
+ <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": [], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
976
+
977
+
978
+ <script src="assets/javascripts/bundle.79ae519e.min.js"></script>
979
+
980
+
981
+ </body>
982
+ </html>