@euconform/core 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/inference/ollama-client.d.ts +1 -0
  7. package/dist/inference/ollama-client.d.ts.map +1 -1
  8. package/dist/inference/ollama-client.js +15 -5
  9. package/dist/legal-checks/annex-iv-report.d.ts +3 -0
  10. package/dist/legal-checks/annex-iv-report.d.ts.map +1 -1
  11. package/dist/legal-checks/annex-iv-report.js +1 -0
  12. package/dist/legal-checks/deadline-timeline.d.ts +57 -0
  13. package/dist/legal-checks/deadline-timeline.d.ts.map +1 -0
  14. package/dist/legal-checks/deadline-timeline.js +265 -0
  15. package/dist/legal-checks/gap-analysis.d.ts +48 -0
  16. package/dist/legal-checks/gap-analysis.d.ts.map +1 -0
  17. package/dist/legal-checks/gap-analysis.js +397 -0
  18. package/dist/legal-checks/gpai-classifier.d.ts +49 -0
  19. package/dist/legal-checks/gpai-classifier.d.ts.map +1 -0
  20. package/dist/legal-checks/gpai-classifier.js +197 -0
  21. package/dist/legal-checks/index.d.ts +6 -0
  22. package/dist/legal-checks/index.d.ts.map +1 -1
  23. package/dist/legal-checks/index.js +3 -0
  24. package/package.json +1 -1
  25. package/src/index.ts +25 -0
  26. package/src/inference/ollama-client.ts +21 -5
  27. package/src/legal-checks/annex-iv-report.ts +4 -0
  28. package/src/legal-checks/deadline-timeline.ts +313 -0
  29. package/src/legal-checks/gap-analysis.ts +454 -0
  30. package/src/legal-checks/gpai-classifier.ts +281 -0
  31. package/src/legal-checks/index.ts +33 -0
  32. package/tests/gpai-classifier.test.ts +125 -0
  33. package/tests/gpai-timeline.test.ts +55 -0
  34. package/.turbo/turbo-check-types.log +0 -4
  35. package/.turbo/turbo-test.log +0 -364
  36. package/coverage/base.css +0 -224
  37. package/coverage/block-navigation.js +0 -87
  38. package/coverage/clover.xml +0 -3282
  39. package/coverage/coverage-final.json +0 -20
  40. package/coverage/favicon.png +0 -0
  41. package/coverage/index.html +0 -161
  42. package/coverage/prettify.css +0 -1
  43. package/coverage/prettify.js +0 -2
  44. package/coverage/sort-arrow-sprite.png +0 -0
  45. package/coverage/sorter.js +0 -210
  46. package/coverage/src/fairness-metrics.ts.html +0 -1579
  47. package/coverage/src/index.html +0 -161
  48. package/coverage/src/index.ts.html +0 -535
  49. package/coverage/src/inference/browser-inference.ts.html +0 -859
  50. package/coverage/src/inference/capability-detection.ts.html +0 -2227
  51. package/coverage/src/inference/index.html +0 -176
  52. package/coverage/src/inference/index.ts.html +0 -553
  53. package/coverage/src/inference/inference-factory.ts.html +0 -751
  54. package/coverage/src/inference/ollama-client.ts.html +0 -1627
  55. package/coverage/src/legal-checks/annex-iv-report.ts.html +0 -556
  56. package/coverage/src/legal-checks/bias-metrics.ts.html +0 -1855
  57. package/coverage/src/legal-checks/data-governance.ts.html +0 -529
  58. package/coverage/src/legal-checks/human-oversight-logging.ts.html +0 -490
  59. package/coverage/src/legal-checks/index.html +0 -206
  60. package/coverage/src/legal-checks/index.ts.html +0 -250
  61. package/coverage/src/legal-checks/risk-classifier.ts.html +0 -940
  62. package/coverage/src/legal-checks/robustness-transparency.ts.html +0 -571
  63. package/coverage/src/metrics/crows-pairs-bias.ts.html +0 -820
  64. package/coverage/src/metrics/index.html +0 -146
  65. package/coverage/src/metrics/index.ts.html +0 -151
  66. package/coverage/src/metrics/stereotype-bias.ts.html +0 -886
  67. package/coverage/src/risk-engine.ts.html +0 -1660
  68. package/coverage/src/types.ts.html +0 -547
  69. package/dist/legal-checks/disclaimer.d.ts +0 -2
  70. package/dist/legal-checks/disclaimer.d.ts.map +0 -1
  71. package/dist/legal-checks/disclaimer.js +0 -1
@@ -1,751 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/inference/inference-factory.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/inference</a> inference-factory.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">10.94% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>15/137</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>0/0</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>0/13</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">10.94% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>15/137</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line low'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
289
- <span class="cline-any cline-neutral">&nbsp;</span>
290
- <span class="cline-any cline-neutral">&nbsp;</span>
291
- <span class="cline-any cline-neutral">&nbsp;</span>
292
- <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-neutral">&nbsp;</span>
294
- <span class="cline-any cline-neutral">&nbsp;</span>
295
- <span class="cline-any cline-neutral">&nbsp;</span>
296
- <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-neutral">&nbsp;</span>
298
- <span class="cline-any cline-neutral">&nbsp;</span>
299
- <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-neutral">&nbsp;</span>
301
- <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-neutral">&nbsp;</span>
303
- <span class="cline-any cline-neutral">&nbsp;</span>
304
- <span class="cline-any cline-neutral">&nbsp;</span>
305
- <span class="cline-any cline-neutral">&nbsp;</span>
306
- <span class="cline-any cline-neutral">&nbsp;</span>
307
- <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-neutral">&nbsp;</span>
309
- <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-neutral">&nbsp;</span>
311
- <span class="cline-any cline-neutral">&nbsp;</span>
312
- <span class="cline-any cline-neutral">&nbsp;</span>
313
- <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-yes">1x</span>
315
- <span class="cline-any cline-yes">1x</span>
316
- <span class="cline-any cline-no">&nbsp;</span>
317
- <span class="cline-any cline-no">&nbsp;</span>
318
- <span class="cline-any cline-no">&nbsp;</span>
319
- <span class="cline-any cline-neutral">&nbsp;</span>
320
- <span class="cline-any cline-yes">1x</span>
321
- <span class="cline-any cline-no">&nbsp;</span>
322
- <span class="cline-any cline-no">&nbsp;</span>
323
- <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-neutral">&nbsp;</span>
325
- <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-yes">1x</span>
328
- <span class="cline-any cline-no">&nbsp;</span>
329
- <span class="cline-any cline-no">&nbsp;</span>
330
- <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-neutral">&nbsp;</span>
334
- <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-yes">1x</span>
336
- <span class="cline-any cline-no">&nbsp;</span>
337
- <span class="cline-any cline-no">&nbsp;</span>
338
- <span class="cline-any cline-no">&nbsp;</span>
339
- <span class="cline-any cline-neutral">&nbsp;</span>
340
- <span class="cline-any cline-no">&nbsp;</span>
341
- <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-no">&nbsp;</span>
343
- <span class="cline-any cline-no">&nbsp;</span>
344
- <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-no">&nbsp;</span>
346
- <span class="cline-any cline-no">&nbsp;</span>
347
- <span class="cline-any cline-no">&nbsp;</span>
348
- <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-no">&nbsp;</span>
350
- <span class="cline-any cline-no">&nbsp;</span>
351
- <span class="cline-any cline-no">&nbsp;</span>
352
- <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-neutral">&nbsp;</span>
354
- <span class="cline-any cline-no">&nbsp;</span>
355
- <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-no">&nbsp;</span>
358
- <span class="cline-any cline-no">&nbsp;</span>
359
- <span class="cline-any cline-no">&nbsp;</span>
360
- <span class="cline-any cline-no">&nbsp;</span>
361
- <span class="cline-any cline-no">&nbsp;</span>
362
- <span class="cline-any cline-no">&nbsp;</span>
363
- <span class="cline-any cline-no">&nbsp;</span>
364
- <span class="cline-any cline-no">&nbsp;</span>
365
- <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-neutral">&nbsp;</span>
367
- <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-neutral">&nbsp;</span>
369
- <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-yes">1x</span>
371
- <span class="cline-any cline-no">&nbsp;</span>
372
- <span class="cline-any cline-no">&nbsp;</span>
373
- <span class="cline-any cline-no">&nbsp;</span>
374
- <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-no">&nbsp;</span>
376
- <span class="cline-any cline-no">&nbsp;</span>
377
- <span class="cline-any cline-no">&nbsp;</span>
378
- <span class="cline-any cline-neutral">&nbsp;</span>
379
- <span class="cline-any cline-no">&nbsp;</span>
380
- <span class="cline-any cline-no">&nbsp;</span>
381
- <span class="cline-any cline-no">&nbsp;</span>
382
- <span class="cline-any cline-no">&nbsp;</span>
383
- <span class="cline-any cline-no">&nbsp;</span>
384
- <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-neutral">&nbsp;</span>
388
- <span class="cline-any cline-yes">1x</span>
389
- <span class="cline-any cline-no">&nbsp;</span>
390
- <span class="cline-any cline-no">&nbsp;</span>
391
- <span class="cline-any cline-no">&nbsp;</span>
392
- <span class="cline-any cline-no">&nbsp;</span>
393
- <span class="cline-any cline-no">&nbsp;</span>
394
- <span class="cline-any cline-neutral">&nbsp;</span>
395
- <span class="cline-any cline-neutral">&nbsp;</span>
396
- <span class="cline-any cline-neutral">&nbsp;</span>
397
- <span class="cline-any cline-neutral">&nbsp;</span>
398
- <span class="cline-any cline-yes">1x</span>
399
- <span class="cline-any cline-no">&nbsp;</span>
400
- <span class="cline-any cline-no">&nbsp;</span>
401
- <span class="cline-any cline-no">&nbsp;</span>
402
- <span class="cline-any cline-no">&nbsp;</span>
403
- <span class="cline-any cline-no">&nbsp;</span>
404
- <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-yes">1x</span>
406
- <span class="cline-any cline-no">&nbsp;</span>
407
- <span class="cline-any cline-no">&nbsp;</span>
408
- <span class="cline-any cline-neutral">&nbsp;</span>
409
- <span class="cline-any cline-no">&nbsp;</span>
410
- <span class="cline-any cline-no">&nbsp;</span>
411
- <span class="cline-any cline-no">&nbsp;</span>
412
- <span class="cline-any cline-no">&nbsp;</span>
413
- <span class="cline-any cline-no">&nbsp;</span>
414
- <span class="cline-any cline-no">&nbsp;</span>
415
- <span class="cline-any cline-no">&nbsp;</span>
416
- <span class="cline-any cline-no">&nbsp;</span>
417
- <span class="cline-any cline-no">&nbsp;</span>
418
- <span class="cline-any cline-no">&nbsp;</span>
419
- <span class="cline-any cline-no">&nbsp;</span>
420
- <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-yes">1x</span>
422
- <span class="cline-any cline-no">&nbsp;</span>
423
- <span class="cline-any cline-no">&nbsp;</span>
424
- <span class="cline-any cline-no">&nbsp;</span>
425
- <span class="cline-any cline-no">&nbsp;</span>
426
- <span class="cline-any cline-no">&nbsp;</span>
427
- <span class="cline-any cline-no">&nbsp;</span>
428
- <span class="cline-any cline-no">&nbsp;</span>
429
- <span class="cline-any cline-no">&nbsp;</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-neutral">&nbsp;</span>
433
- <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-neutral">&nbsp;</span>
435
- <span class="cline-any cline-yes">1x</span>
436
- <span class="cline-any cline-no">&nbsp;</span>
437
- <span class="cline-any cline-no">&nbsp;</span>
438
- <span class="cline-any cline-no">&nbsp;</span>
439
- <span class="cline-any cline-no">&nbsp;</span>
440
- <span class="cline-any cline-no">&nbsp;</span>
441
- <span class="cline-any cline-no">&nbsp;</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-no">&nbsp;</span>
445
- <span class="cline-any cline-no">&nbsp;</span>
446
- <span class="cline-any cline-no">&nbsp;</span>
447
- <span class="cline-any cline-no">&nbsp;</span>
448
- <span class="cline-any cline-no">&nbsp;</span>
449
- <span class="cline-any cline-no">&nbsp;</span>
450
- <span class="cline-any cline-no">&nbsp;</span>
451
- <span class="cline-any cline-no">&nbsp;</span>
452
- <span class="cline-any cline-no">&nbsp;</span>
453
- <span class="cline-any cline-neutral">&nbsp;</span>
454
- <span class="cline-any cline-no">&nbsp;</span>
455
- <span class="cline-any cline-no">&nbsp;</span>
456
- <span class="cline-any cline-no">&nbsp;</span>
457
- <span class="cline-any cline-no">&nbsp;</span>
458
- <span class="cline-any cline-no">&nbsp;</span>
459
- <span class="cline-any cline-no">&nbsp;</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-no">&nbsp;</span>
462
- <span class="cline-any cline-no">&nbsp;</span>
463
- <span class="cline-any cline-no">&nbsp;</span>
464
- <span class="cline-any cline-no">&nbsp;</span>
465
- <span class="cline-any cline-no">&nbsp;</span>
466
- <span class="cline-any cline-no">&nbsp;</span>
467
- <span class="cline-any cline-no">&nbsp;</span>
468
- <span class="cline-any cline-no">&nbsp;</span>
469
- <span class="cline-any cline-neutral">&nbsp;</span>
470
- <span class="cline-any cline-neutral">&nbsp;</span>
471
- <span class="cline-any cline-neutral">&nbsp;</span>
472
- <span class="cline-any cline-neutral">&nbsp;</span>
473
- <span class="cline-any cline-yes">1x</span>
474
- <span class="cline-any cline-no">&nbsp;</span>
475
- <span class="cline-any cline-no">&nbsp;</span>
476
- <span class="cline-any cline-no">&nbsp;</span>
477
- <span class="cline-any cline-no">&nbsp;</span>
478
- <span class="cline-any cline-no">&nbsp;</span>
479
- <span class="cline-any cline-yes">1x</span>
480
- <span class="cline-any cline-neutral">&nbsp;</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-neutral">&nbsp;</span>
485
- <span class="cline-any cline-yes">1x</span>
486
- <span class="cline-any cline-no">&nbsp;</span>
487
- <span class="cline-any cline-no">&nbsp;</span>
488
- <span class="cline-any cline-no">&nbsp;</span>
489
- <span class="cline-any cline-no">&nbsp;</span>
490
- <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-neutral">&nbsp;</span>
492
- <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-neutral">&nbsp;</span>
495
- <span class="cline-any cline-no">&nbsp;</span>
496
- <span class="cline-any cline-no">&nbsp;</span>
497
- <span class="cline-any cline-no">&nbsp;</span>
498
- <span class="cline-any cline-no">&nbsp;</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-no">&nbsp;</span>
501
- <span class="cline-any cline-no">&nbsp;</span>
502
- <span class="cline-any cline-no">&nbsp;</span>
503
- <span class="cline-any cline-no">&nbsp;</span>
504
- <span class="cline-any cline-no">&nbsp;</span>
505
- <span class="cline-any cline-no">&nbsp;</span>
506
- <span class="cline-any cline-no">&nbsp;</span>
507
- <span class="cline-any cline-no">&nbsp;</span>
508
- <span class="cline-any cline-no">&nbsp;</span>
509
- <span class="cline-any cline-no">&nbsp;</span>
510
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
511
- * Inference Factory with Method Detection
512
- * Provides unified interface for bias calculations across engines with automatic method detection
513
- */
514
- &nbsp;
515
- import { calculateCrowsPairsBias } from "../metrics/crows-pairs-bias";
516
- import type { BiasCalculationMethod, BiasTestConfig, CrowsPairsBiasResult } from "../types";
517
- import { BrowserInference } from "./browser-inference";
518
- import type { ModelCapability } from "./capability-detection";
519
- import { OllamaClient } from "./ollama-client";
520
- &nbsp;
521
- /**
522
- * Result wrapper that includes method metadata for all inference operations
523
- */
524
- export interface InferenceResult&lt;T&gt; {
525
- data: T;
526
- method: BiasCalculationMethod;
527
- engine: "browser" | "ollama";
528
- model: string;
529
- capability?: ModelCapability;
530
- }
531
- &nbsp;
532
- /**
533
- * Inference Factory class that manages inference clients and provides unified interface
534
- * Automatically detects best available calculation method and returns metadata
535
- */
536
- export class InferenceFactory {
537
- private <span class="fstat-no" title="function not covered" >browserClient: BrowserInference | null = null;</span>
538
- <span class="cstat-no" title="statement not covered" > private ollamaClient: OllamaClient | null = null;</span>
539
- <span class="cstat-no" title="statement not covered" > private statusCallback: ((status: string) =&gt; void) | null = null;</span>
540
- <span class="cstat-no" title="statement not covered" > private selectedCapability: ModelCapability | null = null;</span>
541
- &nbsp;
542
- <span class="fstat-no" title="function not covered" > constructor(statusCallback?: (status: string) =&gt; void) {</span>
543
- <span class="cstat-no" title="statement not covered" > this.statusCallback = statusCallback || null;</span>
544
- <span class="cstat-no" title="statement not covered" > }</span>
545
- &nbsp;
546
- /**
547
- * Set the selected model capability for enhanced metadata tracking
548
- */
549
- <span class="fstat-no" title="function not covered" > setSelectedCapability(capability: ModelCapability): void {</span>
550
- <span class="cstat-no" title="statement not covered" > this.selectedCapability = capability;</span>
551
- <span class="cstat-no" title="statement not covered" > }</span>
552
- &nbsp;
553
- /**
554
- * Create a bias calculation with automatic method detection
555
- * Returns InferenceResult with both data and method metadata
556
- */
557
- <span class="fstat-no" title="function not covered" > async createBiasCalculation(</span>
558
- <span class="cstat-no" title="statement not covered" > config: BiasTestConfig</span>
559
- <span class="cstat-no" title="statement not covered" > ): Promise&lt;InferenceResult&lt;CrowsPairsBiasResult&gt;&gt; {</span>
560
- <span class="cstat-no" title="statement not covered" > const { engine, model } = config;</span>
561
- &nbsp;
562
- <span class="cstat-no" title="statement not covered" > this.validateConfiguration(config);</span>
563
- &nbsp;
564
- <span class="cstat-no" title="statement not covered" > const inferenceClient = await this.getInferenceClient(engine, model);</span>
565
- <span class="cstat-no" title="statement not covered" > let _detectedMethod: BiasCalculationMethod;</span>
566
- &nbsp;
567
- <span class="cstat-no" title="statement not covered" > if (engine === "browser") {</span>
568
- <span class="cstat-no" title="statement not covered" > _detectedMethod = "logprobs_exact";</span>
569
- <span class="cstat-no" title="statement not covered" > } else {</span>
570
- // Use capability method if available, otherwise detect
571
- <span class="cstat-no" title="statement not covered" > _detectedMethod =</span>
572
- <span class="cstat-no" title="statement not covered" > this.selectedCapability?.method ?? (await this.detectBestMethod(inferenceClient));</span>
573
- <span class="cstat-no" title="statement not covered" > }</span>
574
- &nbsp;
575
- // Perform bias calculation
576
- <span class="cstat-no" title="statement not covered" > const biasResult = await calculateCrowsPairsBias(config, inferenceClient);</span>
577
- &nbsp;
578
- // Return result with metadata including capability information
579
- <span class="cstat-no" title="statement not covered" > return {</span>
580
- <span class="cstat-no" title="statement not covered" > data: biasResult,</span>
581
- <span class="cstat-no" title="statement not covered" > method: biasResult.method, // Use the method determined during calculation</span>
582
- <span class="cstat-no" title="statement not covered" > engine,</span>
583
- <span class="cstat-no" title="statement not covered" > model,</span>
584
- <span class="cstat-no" title="statement not covered" > capability: this.selectedCapability || undefined,</span>
585
- <span class="cstat-no" title="statement not covered" > };</span>
586
- <span class="cstat-no" title="statement not covered" > }</span>
587
- &nbsp;
588
- /**
589
- * Detect the best available calculation method for the given client
590
- * Returns the method that should be used for bias calculations
591
- */
592
- <span class="fstat-no" title="function not covered" > private async detectBestMethod(</span>
593
- <span class="cstat-no" title="statement not covered" > client: BrowserInference | OllamaClient</span>
594
- <span class="cstat-no" title="statement not covered" > ): Promise&lt;BiasCalculationMethod&gt; {</span>
595
- <span class="cstat-no" title="statement not covered" > if (client instanceof BrowserInference) {</span>
596
- // Browser inference always supports exact log-probabilities
597
- <span class="cstat-no" title="statement not covered" > return "logprobs_exact";</span>
598
- <span class="cstat-no" title="statement not covered" > }</span>
599
- <span class="cstat-no" title="statement not covered" > if (client instanceof OllamaClient) {</span>
600
- // Check Ollama's log-probability support
601
- <span class="cstat-no" title="statement not covered" > const supportsLogProbs = await client.detectLogProbSupport();</span>
602
- <span class="cstat-no" title="statement not covered" > return supportsLogProbs ? "logprobs_exact" : "logprobs_fallback_latency";</span>
603
- <span class="cstat-no" title="statement not covered" > }</span>
604
- <span class="cstat-no" title="statement not covered" > throw new Error("Unknown inference client type");</span>
605
- <span class="cstat-no" title="statement not covered" > }</span>
606
- &nbsp;
607
- /**
608
- * Get browser inference client (creates if needed)
609
- */
610
- <span class="fstat-no" title="function not covered" > getBrowserClient(model: string): BrowserInference {</span>
611
- <span class="cstat-no" title="statement not covered" > if (!this.browserClient || this.browserClient.modelId !== model) {</span>
612
- <span class="cstat-no" title="statement not covered" > this.browserClient = new BrowserInference(model, this.statusCallback);</span>
613
- <span class="cstat-no" title="statement not covered" > }</span>
614
- <span class="cstat-no" title="statement not covered" > return this.browserClient;</span>
615
- <span class="cstat-no" title="statement not covered" > }</span>
616
- &nbsp;
617
- /**
618
- * Get Ollama client (creates if needed)
619
- */
620
- <span class="fstat-no" title="function not covered" > getOllamaClient(model: string): OllamaClient {</span>
621
- <span class="cstat-no" title="statement not covered" > if (!this.ollamaClient || this.ollamaClient.model !== model) {</span>
622
- <span class="cstat-no" title="statement not covered" > this.ollamaClient = new OllamaClient(model);</span>
623
- <span class="cstat-no" title="statement not covered" > }</span>
624
- <span class="cstat-no" title="statement not covered" > return this.ollamaClient;</span>
625
- <span class="cstat-no" title="statement not covered" > }</span>
626
- &nbsp;
627
- private <span class="fstat-no" title="function not covered" >validateConfiguration(config: BiasTestConfig): void {</span>
628
- <span class="cstat-no" title="statement not covered" > const { engine, model } = config;</span>
629
- <span class="cstat-no" title="statement not covered" > if (!this.selectedCapability) return;</span>
630
- &nbsp;
631
- <span class="cstat-no" title="statement not covered" > if (this.selectedCapability.status !== "available") {</span>
632
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
633
- <span class="cstat-no" title="statement not covered" > `Selected model ${model} is not available (status: ${this.selectedCapability.status})`</span>
634
- <span class="cstat-no" title="statement not covered" > );</span>
635
- <span class="cstat-no" title="statement not covered" > }</span>
636
- <span class="cstat-no" title="statement not covered" > if (this.selectedCapability.modelId !== model || this.selectedCapability.engine !== engine) {</span>
637
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
638
- <span class="cstat-no" title="statement not covered" > `Configuration mismatch: expected ${this.selectedCapability.modelId} (${this.selectedCapability.engine}), got ${model} (${engine})`</span>
639
- <span class="cstat-no" title="statement not covered" > );</span>
640
- <span class="cstat-no" title="statement not covered" > }</span>
641
- <span class="cstat-no" title="statement not covered" > }</span>
642
- &nbsp;
643
- <span class="fstat-no" title="function not covered" > private async getInferenceClient(engine: "browser" | "ollama", model: string) {</span>
644
- <span class="cstat-no" title="statement not covered" > if (engine === "browser") {</span>
645
- <span class="cstat-no" title="statement not covered" > return this.getBrowserClient(model);</span>
646
- <span class="cstat-no" title="statement not covered" > }</span>
647
- <span class="cstat-no" title="statement not covered" > if (engine === "ollama") {</span>
648
- <span class="cstat-no" title="statement not covered" > return this.getOllamaClient(model);</span>
649
- <span class="cstat-no" title="statement not covered" > }</span>
650
- <span class="cstat-no" title="statement not covered" > throw new Error(`Unsupported engine: ${engine}`);</span>
651
- <span class="cstat-no" title="statement not covered" > }</span>
652
- &nbsp;
653
- /**
654
- * Create inference result wrapper for any data with method detection
655
- * Useful for wrapping existing inference operations with metadata
656
- */
657
- <span class="fstat-no" title="function not covered" > async createInferenceResult&lt;T&gt;(</span>
658
- <span class="cstat-no" title="statement not covered" > data: T,</span>
659
- <span class="cstat-no" title="statement not covered" > engine: "browser" | "ollama",</span>
660
- <span class="cstat-no" title="statement not covered" > model: string,</span>
661
- <span class="cstat-no" title="statement not covered" > client?: BrowserInference | OllamaClient</span>
662
- <span class="cstat-no" title="statement not covered" > ): Promise&lt;InferenceResult&lt;T&gt;&gt; {</span>
663
- <span class="cstat-no" title="statement not covered" > let method: BiasCalculationMethod;</span>
664
- &nbsp;
665
- // Use capability method if available, otherwise detect
666
- <span class="cstat-no" title="statement not covered" > const selectedMethod = this.selectedCapability?.method;</span>
667
- <span class="cstat-no" title="statement not covered" > if (selectedMethod) {</span>
668
- <span class="cstat-no" title="statement not covered" > method = selectedMethod;</span>
669
- <span class="cstat-no" title="statement not covered" > } else if (engine === "browser") {</span>
670
- <span class="cstat-no" title="statement not covered" > method = "logprobs_exact";</span>
671
- <span class="cstat-no" title="statement not covered" > } else if (engine === "ollama") {</span>
672
- <span class="cstat-no" title="statement not covered" > if (client instanceof OllamaClient) {</span>
673
- <span class="cstat-no" title="statement not covered" > method = await this.detectBestMethod(client);</span>
674
- <span class="cstat-no" title="statement not covered" > } else {</span>
675
- // Create temporary client for method detection
676
- <span class="cstat-no" title="statement not covered" > const tempClient = new OllamaClient(model);</span>
677
- <span class="cstat-no" title="statement not covered" > method = await this.detectBestMethod(tempClient);</span>
678
- <span class="cstat-no" title="statement not covered" > }</span>
679
- <span class="cstat-no" title="statement not covered" > } else {</span>
680
- <span class="cstat-no" title="statement not covered" > throw new Error(`Unsupported engine: ${engine}`);</span>
681
- <span class="cstat-no" title="statement not covered" > }</span>
682
- &nbsp;
683
- <span class="cstat-no" title="statement not covered" > return {</span>
684
- <span class="cstat-no" title="statement not covered" > data,</span>
685
- <span class="cstat-no" title="statement not covered" > method,</span>
686
- <span class="cstat-no" title="statement not covered" > engine,</span>
687
- <span class="cstat-no" title="statement not covered" > model,</span>
688
- <span class="cstat-no" title="statement not covered" > capability: this.selectedCapability || undefined,</span>
689
- <span class="cstat-no" title="statement not covered" > };</span>
690
- <span class="cstat-no" title="statement not covered" > }</span>
691
- &nbsp;
692
- /**
693
- * Cleanup resources
694
- */
695
- <span class="fstat-no" title="function not covered" > dispose(): void {</span>
696
- <span class="cstat-no" title="statement not covered" > this.browserClient = null;</span>
697
- <span class="cstat-no" title="statement not covered" > this.ollamaClient = null;</span>
698
- <span class="cstat-no" title="statement not covered" > this.statusCallback = null;</span>
699
- <span class="cstat-no" title="statement not covered" > this.selectedCapability = null;</span>
700
- <span class="cstat-no" title="statement not covered" > }</span>
701
- }
702
- &nbsp;
703
- /**
704
- * Create a global inference factory instance
705
- * Provides convenient access to factory methods
706
- */
707
- export <span class="fstat-no" title="function not covered" >function createInferenceFactory(</span>
708
- <span class="cstat-no" title="statement not covered" > statusCallback?: (status: string) =&gt; void</span>
709
- <span class="cstat-no" title="statement not covered" >): InferenceFactory {</span>
710
- <span class="cstat-no" title="statement not covered" > return new InferenceFactory(statusCallback);</span>
711
- <span class="cstat-no" title="statement not covered" >}</span>
712
- &nbsp;
713
- /**
714
- * Utility function to detect best method for a given configuration
715
- * Useful for pre-flight checks without creating full factory
716
- */
717
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export async function detectBestMethodForConfig(</span></span>
718
- <span class="cstat-no" title="statement not covered" > config: BiasTestConfig</span>
719
- <span class="cstat-no" title="statement not covered" >): Promise&lt;BiasCalculationMethod&gt; {</span>
720
- <span class="cstat-no" title="statement not covered" > const { engine, model } = config;</span>
721
- &nbsp;
722
- <span class="cstat-no" title="statement not covered" > if (engine === "browser") {</span>
723
- <span class="cstat-no" title="statement not covered" > return "logprobs_exact";</span>
724
- <span class="cstat-no" title="statement not covered" > }</span>
725
- <span class="cstat-no" title="statement not covered" > if (engine === "ollama") {</span>
726
- <span class="cstat-no" title="statement not covered" > const client = new OllamaClient(model);</span>
727
- <span class="cstat-no" title="statement not covered" > const supportsLogProbs = await client.detectLogProbSupport();</span>
728
- <span class="cstat-no" title="statement not covered" > return supportsLogProbs ? "logprobs_exact" : "logprobs_fallback_latency";</span>
729
- <span class="cstat-no" title="statement not covered" > }</span>
730
- <span class="cstat-no" title="statement not covered" > throw new Error(`Unsupported engine: ${engine}`);</span>
731
- <span class="cstat-no" title="statement not covered" >}</span>
732
- &nbsp;</pre></td></tr></table></pre>
733
-
734
- <div class='push'></div><!-- for sticky footer -->
735
- </div><!-- /wrapper -->
736
- <div class='footer quiet pad2 space-top1 center small'>
737
- Code coverage generated by
738
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
739
- at 2026-01-07T00:09:13.255Z
740
- </div>
741
- <script src="../../prettify.js"></script>
742
- <script>
743
- window.onload = function () {
744
- prettyPrint();
745
- };
746
- </script>
747
- <script src="../../sorter.js"></script>
748
- <script src="../../block-navigation.js"></script>
749
- </body>
750
- </html>
751
-