Text Generation
Transformers
Safetensors
mistral3
image-text-to-text
decision-model
typed-decisions
jev
jevbench
calibration
decode-free
multilingual
vision-language
conversational
Instructions to use StandardThinking/StandardOne-3B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use StandardThinking/StandardOne-3B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="StandardThinking/StandardOne-3B") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("StandardThinking/StandardOne-3B") model = AutoModelForMultimodalLM.from_pretrained("StandardThinking/StandardOne-3B", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use StandardThinking/StandardOne-3B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "StandardThinking/StandardOne-3B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "StandardThinking/StandardOne-3B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/StandardThinking/StandardOne-3B
- SGLang
How to use StandardThinking/StandardOne-3B with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "StandardThinking/StandardOne-3B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "StandardThinking/StandardOne-3B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "StandardThinking/StandardOne-3B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "StandardThinking/StandardOne-3B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use StandardThinking/StandardOne-3B with Docker Model Runner:
docker model run hf.co/StandardThinking/StandardOne-3B
Add files using upload-large-folder tool
Browse files- LICENSE +201 -0
- MERGE_REPORT.json +59 -0
- NOTICE +28 -0
- QUICKSTART.md +121 -0
- README.md +175 -0
- SHA256SUMS +88 -0
- SYSTEM_PROMPT.txt +29 -0
- chat_template.jinja +216 -0
- config.json +67 -0
- docs/BENCHMARKS.md +356 -0
- docs/assets/00-benchmark-card.svg +1489 -0
- docs/assets/02-latency-vs-qwen.svg +273 -0
- docs/assets/04-throughput.png +0 -0
- docs/assets/04-throughput.svg +195 -0
- docs/assets/05-gain-over-base.svg +412 -0
- docs/assets/06-vs-jev.svg +564 -0
- docs/public-classification-suites.md +61 -0
- evidence/calibration-leaderboard-ablate-nosys.json +318 -0
- evidence/calibration-leaderboard-merged-native.json +202 -0
- evidence/served-nosys-easy-report.json +223 -0
- evidence/served-nosys-hard-report.json +421 -0
- evidence/served-nosys-latency-idle-gpu.json +1728 -0
- evidence/served-nosys-original-report.json +287 -0
- generation_config.json +7 -0
- model.safetensors.index.json +466 -0
- params.json +47 -0
- processor_config.json +42 -0
- release-manifest.json +24 -0
- server/.gitignore +11 -0
- server/LICENSE +201 -0
- server/NOTICE +19 -0
- server/README.md +196 -0
- server/jev_adapter/__init__.py +3 -0
- server/jev_adapter/__main__.py +145 -0
- server/jev_adapter/backend.py +35 -0
- server/jev_adapter/native_tokenizer.py +169 -0
- server/jev_adapter/protocol.py +386 -0
- server/jev_adapter/server.py +140 -0
- server/jev_adapter/service.py +122 -0
- server/jev_adapter/sglang.py +510 -0
- server/pyproject.toml +34 -0
- server/tests/test_benchmark_matrix.py +101 -0
- server/tests/test_benchmark_run.py +290 -0
- server/tests/test_disconnect_cleanup.py +150 -0
- server/tests/test_http_integration.py +49 -0
- server/tests/test_jevbench.py +270 -0
- server/tests/test_native_tokenizer.py +391 -0
- server/tests/test_protocol.py +433 -0
- special_tokens_map.json +0 -0
- tokenizer_config.json +0 -0
LICENSE
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Apache License
|
| 2 |
+
Version 2.0, January 2004
|
| 3 |
+
http://www.apache.org/licenses/
|
| 4 |
+
|
| 5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
| 6 |
+
|
| 7 |
+
1. Definitions.
|
| 8 |
+
|
| 9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
| 10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
| 11 |
+
|
| 12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
| 13 |
+
the copyright owner that is granting the License.
|
| 14 |
+
|
| 15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
| 16 |
+
other entities that control, are controlled by, or are under common
|
| 17 |
+
control with that entity. For the purposes of this definition,
|
| 18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
| 19 |
+
direction or management of such entity, whether by contract or
|
| 20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
| 21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
| 22 |
+
|
| 23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
| 24 |
+
exercising permissions granted by this License.
|
| 25 |
+
|
| 26 |
+
"Source" form shall mean the preferred form for making modifications,
|
| 27 |
+
including but not limited to software source code, documentation
|
| 28 |
+
source, and configuration files.
|
| 29 |
+
|
| 30 |
+
"Object" form shall mean any form resulting from mechanical
|
| 31 |
+
transformation or translation of a Source form, including but
|
| 32 |
+
not limited to compiled object code, generated documentation,
|
| 33 |
+
and conversions to other media types.
|
| 34 |
+
|
| 35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
| 36 |
+
Object form, made available under the License, as indicated by a
|
| 37 |
+
copyright notice that is included in or attached to the work
|
| 38 |
+
(an example is provided in the Appendix below).
|
| 39 |
+
|
| 40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
| 41 |
+
form, that is based on (or derived from) the Work and for which the
|
| 42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
| 43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
| 44 |
+
of this License, Derivative Works shall not include works that remain
|
| 45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
| 46 |
+
the Work and Derivative Works thereof.
|
| 47 |
+
|
| 48 |
+
"Contribution" shall mean any work of authorship, including
|
| 49 |
+
the original version of the Work and any modifications or additions
|
| 50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
| 51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
| 52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
| 53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
| 54 |
+
means any form of electronic, verbal, or written communication sent
|
| 55 |
+
to the Licensor or its representatives, including but not limited to
|
| 56 |
+
communication on electronic mailing lists, source code control systems,
|
| 57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
| 58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
| 59 |
+
excluding communication that is conspicuously marked or otherwise
|
| 60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
| 61 |
+
|
| 62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
| 63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
| 64 |
+
subsequently incorporated within the Work.
|
| 65 |
+
|
| 66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
| 67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
| 70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
| 71 |
+
Work and such Derivative Works in Source or Object form.
|
| 72 |
+
|
| 73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
| 74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 76 |
+
(except as stated in this section) patent license to make, have made,
|
| 77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
| 78 |
+
where such license applies only to those patent claims licensable
|
| 79 |
+
by such Contributor that are necessarily infringed by their
|
| 80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
| 81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
| 82 |
+
institute patent litigation against any entity (including a
|
| 83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
| 84 |
+
or a Contribution incorporated within the Work constitutes direct
|
| 85 |
+
or contributory patent infringement, then any patent licenses
|
| 86 |
+
granted to You under this License for that Work shall terminate
|
| 87 |
+
as of the date such litigation is filed.
|
| 88 |
+
|
| 89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
| 90 |
+
Work or Derivative Works thereof in any medium, with or without
|
| 91 |
+
modifications, and in Source or Object form, provided that You
|
| 92 |
+
meet the following conditions:
|
| 93 |
+
|
| 94 |
+
(a) You must give any other recipients of the Work or
|
| 95 |
+
Derivative Works a copy of this License; and
|
| 96 |
+
|
| 97 |
+
(b) You must cause any modified files to carry prominent notices
|
| 98 |
+
stating that You changed the files; and
|
| 99 |
+
|
| 100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
| 101 |
+
that You distribute, all copyright, patent, trademark, and
|
| 102 |
+
attribution notices from the Source form of the Work,
|
| 103 |
+
excluding those notices that do not pertain to any part of
|
| 104 |
+
the Derivative Works; and
|
| 105 |
+
|
| 106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
| 107 |
+
distribution, then any Derivative Works that You distribute must
|
| 108 |
+
include a readable copy of the attribution notices contained
|
| 109 |
+
within such NOTICE file, excluding those notices that do not
|
| 110 |
+
pertain to any part of the Derivative Works, in at least one
|
| 111 |
+
of the following places: within a NOTICE text file distributed
|
| 112 |
+
as part of the Derivative Works; within the Source form or
|
| 113 |
+
documentation, if provided along with the Derivative Works; or,
|
| 114 |
+
within a display generated by the Derivative Works, if and
|
| 115 |
+
wherever such third-party notices normally appear. The contents
|
| 116 |
+
of the NOTICE file are for informational purposes only and
|
| 117 |
+
do not modify the License. You may add Your own attribution
|
| 118 |
+
notices within Derivative Works that You distribute, alongside
|
| 119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
| 120 |
+
that such additional attribution notices cannot be construed
|
| 121 |
+
as modifying the License.
|
| 122 |
+
|
| 123 |
+
You may add Your own copyright statement to Your modifications and
|
| 124 |
+
may provide additional or different license terms and conditions
|
| 125 |
+
for use, reproduction, or distribution of Your modifications, or
|
| 126 |
+
for any such Derivative Works as a whole, provided Your use,
|
| 127 |
+
reproduction, and distribution of the Work otherwise complies with
|
| 128 |
+
the conditions stated in this License.
|
| 129 |
+
|
| 130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
| 131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
| 132 |
+
by You to the Licensor shall be under the terms and conditions of
|
| 133 |
+
this License, without any additional terms or conditions.
|
| 134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
| 135 |
+
the terms of any separate license agreement you may have executed
|
| 136 |
+
with Licensor regarding such Contributions.
|
| 137 |
+
|
| 138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
| 139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
| 140 |
+
except as required for reasonable and customary use in describing the
|
| 141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
| 142 |
+
|
| 143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
| 144 |
+
agreed to in writing, Licensor provides the Work (and each
|
| 145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
| 146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
| 147 |
+
implied, including, without limitation, any warranties or conditions
|
| 148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
| 149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
| 150 |
+
appropriateness of using or redistributing the Work and assume any
|
| 151 |
+
risks associated with Your exercise of permissions under this License.
|
| 152 |
+
|
| 153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
| 154 |
+
whether in tort (including negligence), contract, or otherwise,
|
| 155 |
+
unless required by applicable law (such as deliberate and grossly
|
| 156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
| 157 |
+
liable to You for damages, including any direct, indirect, special,
|
| 158 |
+
incidental, or consequential damages of any character arising as a
|
| 159 |
+
result of this License or out of the use or inability to use the
|
| 160 |
+
Work (including but not limited to damages for loss of goodwill,
|
| 161 |
+
work stoppage, computer failure or malfunction, or any and all
|
| 162 |
+
other commercial damages or losses), even if such Contributor
|
| 163 |
+
has been advised of the possibility of such damages.
|
| 164 |
+
|
| 165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
| 166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
| 167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
| 168 |
+
or other liability obligations and/or rights consistent with this
|
| 169 |
+
License. However, in accepting such obligations, You may act only
|
| 170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
| 171 |
+
of any other Contributor, and only if You agree to indemnify,
|
| 172 |
+
defend, and hold each Contributor harmless for any liability
|
| 173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
| 174 |
+
of your accepting any such warranty or additional liability.
|
| 175 |
+
|
| 176 |
+
END OF TERMS AND CONDITIONS
|
| 177 |
+
|
| 178 |
+
APPENDIX: How to apply the Apache License to your work.
|
| 179 |
+
|
| 180 |
+
To apply the Apache License to your work, attach the following
|
| 181 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
| 182 |
+
replaced with your own identifying information. (Don't include
|
| 183 |
+
the brackets!) The text should be enclosed in the appropriate
|
| 184 |
+
comment syntax for the file format. We also recommend that a
|
| 185 |
+
file or class name and description of purpose be included on the
|
| 186 |
+
same "printed page" as the copyright notice for easier
|
| 187 |
+
identification within third-party archives.
|
| 188 |
+
|
| 189 |
+
Copyright 2023-2024 SGLang Team
|
| 190 |
+
|
| 191 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
| 192 |
+
you may not use this file except in compliance with the License.
|
| 193 |
+
You may obtain a copy of the License at
|
| 194 |
+
|
| 195 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 196 |
+
|
| 197 |
+
Unless required by applicable law or agreed to in writing, software
|
| 198 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
| 199 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 200 |
+
See the License for the specific language governing permissions and
|
| 201 |
+
limitations under the License.
|
MERGE_REPORT.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"snapshot": "mistralai/Ministral-3-3B-Instruct-2512-BF16@b6d637bef2393152b3da2b2fde72eecdee30557e",
|
| 3 |
+
"adapter": "StandardOne-3B-LoRA (training run final2-3b-long)",
|
| 4 |
+
"adapter_sha256": "ae5fe8e3be2e9186e6504e48ad2fe7eea5537e7e8382a0cca2ca49d95605f7bf",
|
| 5 |
+
"changed_params": 182,
|
| 6 |
+
"unchanged_params": 276,
|
| 7 |
+
"changed_outside_lm_projections": [],
|
| 8 |
+
"max_abs_delta": 0.002506256103515625,
|
| 9 |
+
"changed_sample": [
|
| 10 |
+
[
|
| 11 |
+
"model.language_model.layers.0.self_attn.q_proj.weight",
|
| 12 |
+
0.001220703125
|
| 13 |
+
],
|
| 14 |
+
[
|
| 15 |
+
"model.language_model.layers.0.self_attn.k_proj.weight",
|
| 16 |
+
0.0010986328125
|
| 17 |
+
],
|
| 18 |
+
[
|
| 19 |
+
"model.language_model.layers.0.self_attn.v_proj.weight",
|
| 20 |
+
0.001373291015625
|
| 21 |
+
],
|
| 22 |
+
[
|
| 23 |
+
"model.language_model.layers.0.self_attn.o_proj.weight",
|
| 24 |
+
0.000946044921875
|
| 25 |
+
],
|
| 26 |
+
[
|
| 27 |
+
"model.language_model.layers.0.mlp.gate_proj.weight",
|
| 28 |
+
0.00200653076171875
|
| 29 |
+
],
|
| 30 |
+
[
|
| 31 |
+
"model.language_model.layers.0.mlp.up_proj.weight",
|
| 32 |
+
0.0017948150634765625
|
| 33 |
+
],
|
| 34 |
+
[
|
| 35 |
+
"model.language_model.layers.0.mlp.down_proj.weight",
|
| 36 |
+
0.0006103515625
|
| 37 |
+
],
|
| 38 |
+
[
|
| 39 |
+
"model.language_model.layers.1.self_attn.q_proj.weight",
|
| 40 |
+
0.00146484375
|
| 41 |
+
]
|
| 42 |
+
],
|
| 43 |
+
"file_sha256": {
|
| 44 |
+
"SYSTEM_PROMPT.txt": "331b249682cd52226c50e533f59825184997f3b31f9a62b2c3fea940db6999c5",
|
| 45 |
+
"chat_template.jinja": "0701cfbdc2b7d44fdbad104dff604faee4b0543e8247624568777fe465746f9b",
|
| 46 |
+
"config.json": "c4446cf970fefd8b65f2e3119c30d406ea7026dca362dfb319c9aa08643131c3",
|
| 47 |
+
"generation_config.json": "e0923390059f84a9180b00e5501778acc45ea9856cd7f2fd68208b360927c677",
|
| 48 |
+
"model-00001-of-00002.safetensors": "6f675d7bb2615275072980b36a0d94356c4b866d829b1cfeb472294a0caabc57",
|
| 49 |
+
"model-00002-of-00002.safetensors": "edcb0fd56e0a5da4e6c057166ac812587636e8cda20fa23776d465d448f3dfdd",
|
| 50 |
+
"model.safetensors.index.json": "55641440eb385d8bc83a319b0a92f60fe45e6aef4b6992245eee91142237786e",
|
| 51 |
+
"params.json": "d15587c57574d2a92c66ff2552c6db5173d4c440ad47f7454dc51bad0ecaeb59",
|
| 52 |
+
"processor_config.json": "84be30b124b50749c56d25fdbec5ccedf564446f6b3b035e88e1e07b986d2491",
|
| 53 |
+
"special_tokens_map.json": "0a5c981e8c5c6f8886ee007a6d4543a0be6b221cb9ca32a8709384a4c6fc8cbb",
|
| 54 |
+
"tekken.json": "600bb27946565481ecf51ba8aee252e49b9a68507866080ac9c30185bb312843",
|
| 55 |
+
"tokenizer.json": "d5f6046775b112f0e2d456ee9dba450684ab964fe5c4e231599bdc6773028135",
|
| 56 |
+
"tokenizer_config.json": "de368f6e0f14b41c380b29278159f8897f01ec6b3208a91096d2deaf2bcd19f9"
|
| 57 |
+
},
|
| 58 |
+
"seconds": 64.6
|
| 59 |
+
}
|
NOTICE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Jev adapter
|
| 2 |
+
|
| 3 |
+
The initial protocol helpers and their unit tests were extracted from the
|
| 4 |
+
System One extension in the local sglang-jev experiment, commit
|
| 5 |
+
633f05e (Add prefill-only System One decisions and visual game evaluation).
|
| 6 |
+
That repository was based on SGLang upstream commit
|
| 7 |
+
0024efa0de38794ee309ba10ab00ebb891a3d050.
|
| 8 |
+
|
| 9 |
+
The accompanying Apache License 2.0 is retained from that source tree.
|
| 10 |
+
SGLang project: https://github.com/sgl-project/sglang
|
| 11 |
+
|
| 12 |
+
This repository is an independent API adapter. It does not include the
|
| 13 |
+
proprietary Jev model and does not bundle the SGLang inference engine.
|
| 14 |
+
|
| 15 |
+
Benchmark metric definitions and dataset schema mapping follow Jared Palmer's
|
| 16 |
+
Apache-2.0 KEV project, pinned at 4f8110a3f8620cc3a182ae9a708e4398492c4b1a:
|
| 17 |
+
https://github.com/jaredpalmer/kev
|
| 18 |
+
The benchmark runner is an independent implementation. Downloaded benchmark
|
| 19 |
+
data retains upstream provenance and any underlying dataset license terms.
|
| 20 |
+
|
| 21 |
+
--
|
| 22 |
+
|
| 23 |
+
This release (StandardOne-3B) merges a LoRA adapter into the following base model's
|
| 24 |
+
weights, licensed under Apache License 2.0:
|
| 25 |
+
|
| 26 |
+
mistralai/Ministral-3-3B-Instruct-2512-BF16
|
| 27 |
+
revision b6d637bef2393152b3da2b2fde72eecdee30557e
|
| 28 |
+
https://huggingface.co/mistralai/Ministral-3-3B-Instruct-2512-BF16
|
QUICKSTART.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Quickstart
|
| 2 |
+
|
| 3 |
+
## Standard One 8B
|
| 4 |
+
|
| 5 |
+
1. Clone the repository.
|
| 6 |
+
|
| 7 |
+
```bash
|
| 8 |
+
git clone https://huggingface.co/StandardThinking/StandardOne-8B
|
| 9 |
+
```
|
| 10 |
+
|
| 11 |
+
2. Create a venv and install SGLang.
|
| 12 |
+
|
| 13 |
+
```bash
|
| 14 |
+
uv venv --python 3.12 .venv-sglang
|
| 15 |
+
uv pip install --python .venv-sglang/bin/python 'sglang==0.5.20'
|
| 16 |
+
```
|
| 17 |
+
|
| 18 |
+
3. Start the engine.
|
| 19 |
+
|
| 20 |
+
```bash
|
| 21 |
+
CUDA_VISIBLE_DEVICES=0 SGLANG_VLM_CACHE_SIZE_MB=0 .venv-sglang/bin/python -m sglang.launch_server \
|
| 22 |
+
--model-path ./StandardOne-8B --served-model-name standard-one-8b \
|
| 23 |
+
--host 127.0.0.1 --port 30000 --tp-size 1 --model-impl sglang --dtype bfloat16 \
|
| 24 |
+
--context-length 8192 --max-running-requests 32 --mem-fraction-static 0.8 \
|
| 25 |
+
--chunked-prefill-size -1 --disable-radix-cache --mm-preprocess-cache-size-mb 0 \
|
| 26 |
+
--model-config-parser hf --load-format safetensors
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
4. Create a venv and install the adapter.
|
| 30 |
+
|
| 31 |
+
```bash
|
| 32 |
+
uv venv --python 3.12 .venv-native
|
| 33 |
+
pip install -e ./StandardOne-8B/server[native-tokenizer]
|
| 34 |
+
```
|
| 35 |
+
|
| 36 |
+
5. Start the adapter.
|
| 37 |
+
|
| 38 |
+
```bash
|
| 39 |
+
jev-adapter --engine-url http://127.0.0.1:30000 --model standard-one-8b --alias jev-latest \
|
| 40 |
+
--host 0.0.0.0 --port 30120 --max-concurrency 1 \
|
| 41 |
+
--tokenizer-model mistralai/Ministral-3-8B-Instruct-2512-BF16 \
|
| 42 |
+
--tokenizer-revision f6fae9795746f63c9be8344932f01275f3c63734 \
|
| 43 |
+
--prompt-wording native --native-system-prompt none --default-temperature 1.35
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
6. Check health and models.
|
| 47 |
+
|
| 48 |
+
```bash
|
| 49 |
+
curl -s http://127.0.0.1:30120/health
|
| 50 |
+
curl -s http://127.0.0.1:30120/v1/models
|
| 51 |
+
```
|
| 52 |
+
|
| 53 |
+
7. Send a request.
|
| 54 |
+
|
| 55 |
+
```bash
|
| 56 |
+
curl -s http://127.0.0.1:30120/v1/systemone -X POST -H 'content-type: application/json' -d '{
|
| 57 |
+
"model": "jev-latest",
|
| 58 |
+
"state": "Policy: refunds require a receipt and purchase within 30 days. A customer bought 12 days ago but has no receipt. Issue a refund.",
|
| 59 |
+
"questions": {
|
| 60 |
+
"decision": {
|
| 61 |
+
"type": "noul",
|
| 62 |
+
"instructions": "Under the stated policy, is the requested action permitted? Treat unproved required conditions as not satisfied.",
|
| 63 |
+
"criteria": {"true": "Every required condition is established and no prohibition applies.", "false": "A condition is missing or a prohibition applies."}
|
| 64 |
+
}
|
| 65 |
+
}
|
| 66 |
+
}'
|
| 67 |
+
```
|
| 68 |
+
|
| 69 |
+
8. Or run the packaged smoke script.
|
| 70 |
+
|
| 71 |
+
```bash
|
| 72 |
+
.venv-native/bin/python StandardOne-8B/server/examples/smoke.py --base-url http://127.0.0.1:30120 --request sample-request.json
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
9. Run JevBench against the endpoint.
|
| 76 |
+
|
| 77 |
+
```bash
|
| 78 |
+
python -m jevbench.cli run --tasks jevbench-easy,jevbench-original,jevbench-hard \
|
| 79 |
+
--adapter typesafe --endpoint http://127.0.0.1:30120 --model jev-latest
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
## Standard One 3B
|
| 83 |
+
|
| 84 |
+
1. Clone the repository.
|
| 85 |
+
|
| 86 |
+
```bash
|
| 87 |
+
git clone https://huggingface.co/StandardThinking/StandardOne-3B
|
| 88 |
+
```
|
| 89 |
+
|
| 90 |
+
2. Start the engine (reuses the `.venv-sglang` venv from the 8B section).
|
| 91 |
+
|
| 92 |
+
```bash
|
| 93 |
+
.venv-sglang/bin/python -m sglang.launch_server \
|
| 94 |
+
--model-path ./StandardOne-3B --served-model-name standard-one-3b \
|
| 95 |
+
--host 127.0.0.1 --port 30000 --tp-size 1 --model-impl sglang --dtype bfloat16 \
|
| 96 |
+
--context-length 8192 --max-running-requests 32 --mem-fraction-static 0.8 \
|
| 97 |
+
--chunked-prefill-size -1 --disable-radix-cache --mm-preprocess-cache-size-mb 0 \
|
| 98 |
+
--model-config-parser hf --load-format safetensors
|
| 99 |
+
```
|
| 100 |
+
|
| 101 |
+
3. Start the adapter (reuses `.venv-native` and the `StandardOne-8B/server` install from the 8B section).
|
| 102 |
+
|
| 103 |
+
```bash
|
| 104 |
+
jev-adapter --engine-url http://127.0.0.1:30000 --model standard-one-3b --alias jev-latest \
|
| 105 |
+
--host 0.0.0.0 --port 30120 --max-concurrency 1 \
|
| 106 |
+
--tokenizer-model mistralai/Ministral-3-3B-Instruct-2512-BF16 \
|
| 107 |
+
--tokenizer-revision b6d637bef2393152b3da2b2fde72eecdee30557e \
|
| 108 |
+
--prompt-wording native --native-system-prompt none --default-temperature 1.45
|
| 109 |
+
```
|
| 110 |
+
|
| 111 |
+
4. Check health, then send a request or run JevBench exactly as in steps 6-9 above, with
|
| 112 |
+
`"model": "jev-latest"` unchanged (the adapter's alias, not the served checkpoint name).
|
| 113 |
+
|
| 114 |
+
## Request format
|
| 115 |
+
|
| 116 |
+
`POST /v1/systemone` takes a `state` (the scenario, as text, and for supported task families an image
|
| 117 |
+
as a data URL) and a `questions` map. Each question has a `type` of `noul` (yes/no), `choice` (one of
|
| 118 |
+
several labeled options) or `score` (an ordinal scale), plus `instructions` and `criteria` describing
|
| 119 |
+
the labels. An optional `options.temperature` overrides the server's default softmax temperature for
|
| 120 |
+
that request. The response carries one native probability distribution per question; `usage.output_tokens`
|
| 121 |
+
is always `0`, and every probability vector sums to 1 over exactly the caller's label set.
|
README.md
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
base_model: mistralai/Ministral-3-3B-Instruct-2512-BF16
|
| 3 |
+
library_name: transformers
|
| 4 |
+
license: apache-2.0
|
| 5 |
+
pipeline_tag: text-generation
|
| 6 |
+
language:
|
| 7 |
+
- en
|
| 8 |
+
- ko
|
| 9 |
+
tags:
|
| 10 |
+
- mistral3
|
| 11 |
+
- decision-model
|
| 12 |
+
- typed-decisions
|
| 13 |
+
- jev
|
| 14 |
+
- jevbench
|
| 15 |
+
- calibration
|
| 16 |
+
- decode-free
|
| 17 |
+
---
|
| 18 |
+
|
| 19 |
+
# Standard One 3B
|
| 20 |
+
|
| 21 |
+
Decode-free typed decisions on Ministral 3 3B — one forward pass, native probabilities, ~23 ms per
|
| 22 |
+
decision on one H200. The small sibling of `StandardThinking/StandardOne-8B`, same recipe and serving stack,
|
| 23 |
+
roughly a third of the trainable parameters.
|
| 24 |
+
|
| 25 |
+

|
| 26 |
+
|
| 27 |
+
*Same items, same option order, raw probabilities unless noted; measured 24 September 2026.*
|
| 28 |
+
|
| 29 |
+
## At a glance
|
| 30 |
+
|
| 31 |
+
- Turns `mistralai/Ministral-3-3B-Instruct-2512` into a typed-decision endpoint: send a piece of state
|
| 32 |
+
and a bounded rubric (`choice`, `noul`, or `score`), get back a native probability distribution over
|
| 33 |
+
every option — no decoding, one forward pass, ≈23 ms per decision on one H200.
|
| 34 |
+
- Clear accuracy gains over the untuned base on every suite measured, including the public hard tier
|
| 35 |
+
(a smaller margin than the other suites — see Limitations).
|
| 36 |
+
- Probabilities are temperature-scaled and calibration-checked (hard-tier ECE, distribution
|
| 37 |
+
total-variation) — see Benchmarks below.
|
| 38 |
+
- Languages: English and Korean. Image input is supported (the Pixtral vision tower is retained; images
|
| 39 |
+
are passed as data URLs).
|
| 40 |
+
- Apache-2.0 throughout: base model, adapter and merged weights.
|
| 41 |
+
|
| 42 |
+
## Quick start
|
| 43 |
+
|
| 44 |
+
Engine and adapter are the same stack as `StandardThinking/StandardOne-8B` — the server code (`jev-adapter`)
|
| 45 |
+
is not duplicated in this repository; it ships in `StandardThinking/StandardOne-8B/server/`.
|
| 46 |
+
|
| 47 |
+
Engine (stock SGLang 0.5.20):
|
| 48 |
+
|
| 49 |
+
```bash
|
| 50 |
+
.venv-sglang/bin/python -m sglang.launch_server \
|
| 51 |
+
--model-path ./StandardOne-3B --served-model-name standard-one-3b \
|
| 52 |
+
--host 127.0.0.1 --port 30000 --tp-size 1 --model-impl sglang --dtype bfloat16 \
|
| 53 |
+
--context-length 8192 --max-running-requests 32 --mem-fraction-static 0.8 \
|
| 54 |
+
--chunked-prefill-size -1 --disable-radix-cache --mm-preprocess-cache-size-mb 0 \
|
| 55 |
+
--model-config-parser hf --load-format safetensors
|
| 56 |
+
```
|
| 57 |
+
|
| 58 |
+
Adapter:
|
| 59 |
+
|
| 60 |
+
```bash
|
| 61 |
+
jev-adapter --engine-url http://127.0.0.1:30000 --model standard-one-3b --alias jev-latest \
|
| 62 |
+
--host 0.0.0.0 --port 30120 --max-concurrency 1 \
|
| 63 |
+
--tokenizer-model mistralai/Ministral-3-3B-Instruct-2512-BF16 \
|
| 64 |
+
--tokenizer-revision b6d637bef2393152b3da2b2fde72eecdee30557e \
|
| 65 |
+
--prompt-wording native --native-system-prompt none --default-temperature 1.45
|
| 66 |
+
```
|
| 67 |
+
|
| 68 |
+
Try it:
|
| 69 |
+
|
| 70 |
+
```bash
|
| 71 |
+
curl -s http://127.0.0.1:30120/v1/systemone -X POST -H 'content-type: application/json' -d '{
|
| 72 |
+
"model": "jev-latest",
|
| 73 |
+
"state": "Policy: refunds require a receipt and purchase within 30 days. A customer bought 12 days ago but has no receipt. Issue a refund.",
|
| 74 |
+
"questions": {
|
| 75 |
+
"decision": {
|
| 76 |
+
"type": "noul",
|
| 77 |
+
"instructions": "Under the stated policy, is the requested action permitted? Treat unproved required conditions as not satisfied.",
|
| 78 |
+
"criteria": {"true": "Every required condition is established and no prohibition applies.", "false": "A condition is missing or a prohibition applies."}
|
| 79 |
+
}
|
| 80 |
+
}
|
| 81 |
+
}'
|
| 82 |
+
```
|
| 83 |
+
|
| 84 |
+
Response shape (illustrative values, default temperature applied):
|
| 85 |
+
|
| 86 |
+
```json
|
| 87 |
+
{
|
| 88 |
+
"model": "standard-one-3b",
|
| 89 |
+
"answers": {"decision": {"type": "noul", "noul": 0.09}},
|
| 90 |
+
"usage": {"input_tokens": 96, "output_tokens": 0},
|
| 91 |
+
"metadata": {
|
| 92 |
+
"confidence_method": "1 - normalized_entropy",
|
| 93 |
+
"temperature": 1.45,
|
| 94 |
+
"evaluations": 1,
|
| 95 |
+
"adapter_elapsed_ms": 22.4
|
| 96 |
+
}
|
| 97 |
+
}
|
| 98 |
+
```
|
| 99 |
+
|
| 100 |
+
More (client command, 8B variant, request format): see QUICKSTART.md.
|
| 101 |
+
|
| 102 |
+
## Benchmarks
|
| 103 |
+
|
| 104 |
+
**(a) Accuracy by suite** — untuned base, offline no-system-prompt runner, native wording, single option order, T=1; Jev 1.13 measured on the same items through its own endpoint, raw probabilities, no temperature applied.
|
| 105 |
+
|
| 106 |
+
| Suite | Untuned base | **Standard One 3B** | Jev 1.13 |
|
| 107 |
+
|---|---|---|---|
|
| 108 |
+
| JevBench public easy (48) | 97.92 % | **100.00 %** | 100.00 % |
|
| 109 |
+
| JevBench public standard (72) | 70.83 % | **91.67 %** | 98.61 % |
|
| 110 |
+
| JevBench public hard (111) | 47.75 % | **49.55 %** | 72.07 % |
|
| 111 |
+
| judge proxy (600: routing + answer adequacy) | 63.17 % | **85.67 %** | 90.50 % |
|
| 112 |
+
| realistic transfer set (600) | 62.50 % | **88.67 %** | 86.67 % |
|
| 113 |
+
| stated-distribution probability (1,036) | 31.56 % | **79.73 %** | 72.97 % |
|
| 114 |
+
|
| 115 |
+
Standard One 3B gains over the untuned base on every suite; the margin is smallest on the public hard tier. Hard-tier ECE at served T is 0.158 (T=1.45) against Jev 1.13's 0.099 raw, and mean TV to the stated distributions is 0.135 at served T against Jev's 0.192 raw; full calibration table: [`docs/BENCHMARKS.md`](docs/BENCHMARKS.md#calibration).
|
| 116 |
+
|
| 117 |
+
**(b) Speed** — serial, one H200, SGLang 0.5.20, 242-decision profile. Qwen checkpoints are untuned and shown for speed only; no accuracy comparison is implied.
|
| 118 |
+
|
| 119 |
+
| Model | p50 | p95 | Input tokens/decision |
|
| 120 |
+
|---|---|---|---|
|
| 121 |
+
| **Standard One 3B** | **22.6 ms** | **33.2 ms** | ≈280 |
|
| 122 |
+
| Standard One 8B | 25.8 ms | 41.9 ms | ≈280 |
|
| 123 |
+
| Qwen3-8B (untuned) | 28.5 ms | 57.2 ms | 278 |
|
| 124 |
+
| Qwen3.5-4B (untuned) | 48.8 ms | 72.7 ms | 283 |
|
| 125 |
+
|
| 126 |
+
Throughput has been measured for the 8B only (see `docs/BENCHMARKS.md`); no equivalent sweep has been run for the 3B.
|
| 127 |
+
|
| 128 |
+
On the public classification and decision suites (400 cases/suite, seed 13, served endpoints): AG News 83.8 %, typed decisions 69.3 %, MASSIVE intent mean 84.0 %, email spam 91.8 %, phishing 89.5 %. Full table, per-language and per-workflow breakdown: [`docs/BENCHMARKS.md`](docs/BENCHMARKS.md#public-classification-and-decision-suites) and [`docs/public-classification-suites.md`](docs/public-classification-suites.md).
|
| 129 |
+
|
| 130 |
+
A JevBench v1.4.1 run has been requested; the sealed-set result is not yet available. Full report: [`docs/BENCHMARKS.md`](docs/BENCHMARKS.md).
|
| 131 |
+
|
| 132 |
+
## Model details
|
| 133 |
+
|
| 134 |
+
- **Base model:** `mistralai/Ministral-3-3B-Instruct-2512-BF16`, revision `b6d637bef2393152b3da2b2fde72eecdee30557e` (Apache-2.0).
|
| 135 |
+
- **Adapter:** LoRA r=16, α=32, dropout 0, on `q_proj k_proj v_proj o_proj gate_proj up_proj down_proj` of the language-model projections only (vision tower and multimodal projector excluded), **24,707,072** trainable parameters, PEFT 0.21.0. Adapter file `adapter_model.safetensors`, 135,113,048 bytes, sha256 `ae5fe8e3be2e9186e6504e48ad2fe7eea5537e7e8382a0cca2ca49d95605f7bf`.
|
| 136 |
+
- **Merged BF16 checkpoint:** merging the adapter into the base changed **182 tensors**, none of them outside the language-model projections, maximum absolute weight change **0.0025**.
|
| 137 |
+
- **Serving details:** native chat-template wording, served without a system prompt, at a fixed temperature (T = 1.45, fitted on held-out calibration data); served model name `standard-one-3b` behind stock SGLang 0.5.20 via `jev-adapter` (`POST /v1/systemone`); single, caller-supplied option order, no rotation ensemble; 8,192-token context.
|
| 138 |
+
|
| 139 |
+
| Path | Contents |
|
| 140 |
+
|---|---|
|
| 141 |
+
| `*.safetensors` | Merged BF16 checkpoint (base + LoRA) |
|
| 142 |
+
| `config.json`, `tokenizer*`, `chat_template*`, `preprocessor*` | Base model's non-weight files |
|
| 143 |
+
| `docs/`, `docs/public-classification-suites.md` | Benchmark report and figures (shared with `StandardOne-8B`); per-language/per-workflow numbers |
|
| 144 |
+
| `SHA256SUMS`, `release-manifest.json`, `MERGE_REPORT.json`, `evidence/`, `LICENSE`, `README.md` | File hashes, training manifest, merge report, supporting artifacts, licence, this card |
|
| 145 |
+
|
| 146 |
+
The server code and full quick-start guide live in `StandardThinking/StandardOne-8B`'s `server/` directory and `QUICKSTART.md`, and are reused for this checkpoint — see *Quick start* above for the 3B launch command.
|
| 147 |
+
|
| 148 |
+
## Training data
|
| 149 |
+
|
| 150 |
+
Trains on the identical mixture as `StandardThinking/StandardOne-8B` — same cohorts, same row counts, same overlap-audit result, not a reduced subset. Training data spans document and field normalisation, judge/routing and answer-adequacy, stated-distribution probability, verification/scoring, adequacy-rubric style, and game- and Tetris board-state cohorts — every row is synthetic and solver-generated (deterministic generators with visible checkers; a subset was teacher-reviewed), licensed Apache-2.0 (ours); the JevBench public tiers used only for evaluation carry MIT. Full per-cohort breakdown: [`docs/BENCHMARKS.md`](docs/BENCHMARKS.md#training-data-provenance).
|
| 151 |
+
|
| 152 |
+
An exact-text overlap audit against the public JevBench tiers found 0 exact scenario matches and 181 exact instruction matches — rows in two adequacy-rubric cohorts whose entire instruction field, a generic 58-character adequacy question, is byte-identical to one public hard-tier instruction (0.05 % of the 359,497-row training mixture). These rows are kept and disclosed here rather than regenerated, since the overlap is limited to one rubric question's wording and never touches a scenario or an answer.
|
| 153 |
+
|
| 154 |
+
## Limitations
|
| 155 |
+
|
| 156 |
+
- **Public hard tier: 49 %** for Standard One 3B, against **48 %** for the untuned base and **72 %** for Jev
|
| 157 |
+
1.13 — Standard One's margin over the base here is much smaller than on the other suites.
|
| 158 |
+
- Served probabilities are temperature-scaled by a single global value; if you apply this model to a
|
| 159 |
+
materially different question distribution, re-fitting that temperature is advisable rather than
|
| 160 |
+
assuming 1.45 transfers.
|
| 161 |
+
- At most 26 options per question (one uppercase letter per option, `A`–`Z`).
|
| 162 |
+
- The sealed JevBench set has not been measured for this model.
|
| 163 |
+
- Served and offline probabilities can differ on identical prompts (mean total-variation ≈0.07 on the
|
| 164 |
+
hard tier); served numbers are treated as authoritative.
|
| 165 |
+
- Korean is a small share of multilingual training alongside English.
|
| 166 |
+
- Ten-way support triage (34–40 %) and RAG passage relevance (58–61 %) are weak zero-shot; fine-tune
|
| 167 |
+
for those.
|
| 168 |
+
|
| 169 |
+
## Licence
|
| 170 |
+
|
| 171 |
+
Adapter weights, merged weights and this card: Apache-2.0. Base model `mistralai/Ministral-3-3B-Instruct-2512` (and `-BF16`): Apache-2.0 per its Hugging Face model card, which adds that the model must not be used in a way that infringes, misappropriates, or otherwise violates any third party's rights. `jev-adapter` and SGLang: Apache-2.0. The JevBench harness and public tiers used for evaluation: MIT; other benchmark items keep their own upstream terms.
|
| 172 |
+
|
| 173 |
+
## Citation
|
| 174 |
+
|
| 175 |
+
`StandardThinking/StandardOne-3B` (merged weights) · `StandardThinking/StandardOne-3B-LoRA` (adapter + merge recipe).
|
SHA256SUMS
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
1495e1e757ef4d0925a2350563cf5754bb23c51701a8ec4fb3c5cdcbedae6747 LICENSE
|
| 2 |
+
db003518d8d78b50128bd0166322cd0c230c199b047a01ff646ea6529538f05a MERGE_REPORT.json
|
| 3 |
+
f10343f951ecb3a72670e12720de6e04d59e9cb872e84b2ceddd7d54853bb7e7 NOTICE
|
| 4 |
+
cccd4aeea4b5ca9c98b6ea5f638e113175847526bfd748c488e417040ecb5930 QUICKSTART.md
|
| 5 |
+
b93c7d30f112209abb6f2188084661dffb73179e1718c4de692610f57ddc7b67 README.md
|
| 6 |
+
331b249682cd52226c50e533f59825184997f3b31f9a62b2c3fea940db6999c5 SYSTEM_PROMPT.txt
|
| 7 |
+
0701cfbdc2b7d44fdbad104dff604faee4b0543e8247624568777fe465746f9b chat_template.jinja
|
| 8 |
+
c4446cf970fefd8b65f2e3119c30d406ea7026dca362dfb319c9aa08643131c3 config.json
|
| 9 |
+
41f6da260cb61e59780081fa5b5e97c63413721889faf34f7ae4dc65fca7291b docs/BENCHMARKS.md
|
| 10 |
+
2300b40c53e596eacf93f152375c68bd78a9d77c03fb15ec17e5a76ca9f632bd docs/assets/00-benchmark-card.png
|
| 11 |
+
4d36cb45e5445a672de2dcbe0cfb273226354af8c842ca8d0925698033efe1a3 docs/assets/00-benchmark-card.svg
|
| 12 |
+
7313f2b0645ee401d082572986dcee0c08d3daed1ae79fa650cfa685570ad7e2 docs/assets/02-latency-vs-qwen.png
|
| 13 |
+
0b48a0dd4b4c9ac7c1842836940348edc2e1ba697184943f0c84c3e3d3c7f2d0 docs/assets/02-latency-vs-qwen.svg
|
| 14 |
+
5f430f8841e393548f080833524840adb93deef1c6f75dca93d0571262a2ac68 docs/assets/04-throughput.png
|
| 15 |
+
dd888be78c0e32894cf04a8e3fbf8757e7218873668fa4443ba47c7c1c48b6dc docs/assets/04-throughput.svg
|
| 16 |
+
f3211f7d1cbc624b0f558e7f9e7edac3ea51a381287cb7409719a12d3f11edaa docs/assets/05-gain-over-base.png
|
| 17 |
+
855f5e1d0871d89f5e92dbf8087282d787f9bf7c7c6a2b25b936cffd33f6c219 docs/assets/05-gain-over-base.svg
|
| 18 |
+
4d41f1b782502403109c4074e7705fc42f18dfb9fc865b5aca5771f4c4991264 docs/assets/06-vs-jev.png
|
| 19 |
+
946703a63a228ae328dc713186a6b16b682b193fcfbc6303e17fa143cbd58ddb docs/assets/06-vs-jev.svg
|
| 20 |
+
c3eacfddd6755a60b741d8929f3a41e84d2a862629dce7458ca96d248b4378fd docs/public-classification-suites.md
|
| 21 |
+
5da7c598decc1df7d385f835c378e4a1e14aaf8d54c25b84834f0649cd11f713 evidence/calibration-leaderboard-ablate-nosys.json
|
| 22 |
+
b8c5441a673229a58223214f65b5150b67e659947dfd6edc6216df793c79975f evidence/calibration-leaderboard-merged-native.json
|
| 23 |
+
c887ca6b3d73571207c4f39a619c409685b217a4207b8d0486219650aafb5a71 evidence/served-nosys-easy-report.json
|
| 24 |
+
08ef8e3a16bc49c865d44961d026d282df5647b4e3d3d023baa900ac76272636 evidence/served-nosys-hard-report.json
|
| 25 |
+
7b9b1ee2f93166a817ead61bbc0f4c62984afe7d6c8affefd051007582d0a485 evidence/served-nosys-latency-idle-gpu.json
|
| 26 |
+
22b8e9b0ae331fb195271ae434083059041131ab3b317c6b56f6d7e93593001c evidence/served-nosys-original-report.json
|
| 27 |
+
e0923390059f84a9180b00e5501778acc45ea9856cd7f2fd68208b360927c677 generation_config.json
|
| 28 |
+
6f675d7bb2615275072980b36a0d94356c4b866d829b1cfeb472294a0caabc57 model-00001-of-00002.safetensors
|
| 29 |
+
edcb0fd56e0a5da4e6c057166ac812587636e8cda20fa23776d465d448f3dfdd model-00002-of-00002.safetensors
|
| 30 |
+
55641440eb385d8bc83a319b0a92f60fe45e6aef4b6992245eee91142237786e model.safetensors.index.json
|
| 31 |
+
d15587c57574d2a92c66ff2552c6db5173d4c440ad47f7454dc51bad0ecaeb59 params.json
|
| 32 |
+
ece2373c2ae391bce18785a1810543bc6173a1f28b6767cffab2c35dbea5f002 processor_config.json
|
| 33 |
+
42352f35f7e9424e228f437943b78d67c007cf458613d9076371fb42d9d38a4f release-manifest.json
|
| 34 |
+
eef2a88a000d2ec294379755770c147327cb79d3d7278c711899bd36797d7a02 server/.gitignore
|
| 35 |
+
1495e1e757ef4d0925a2350563cf5754bb23c51701a8ec4fb3c5cdcbedae6747 server/LICENSE
|
| 36 |
+
0f1f023b916d38d7c12af3a71e09f5e82b819a7e156e4992118bb160ee63ede1 server/NOTICE
|
| 37 |
+
56c89049984cec6fa66a5bea6b905c63aa46fbd627ba12bbfabac1a6b466d321 server/README.md
|
| 38 |
+
88e4dea8cc92f467a03bdd45a5fb968e402517116b09e24edcea85bb15f121e5 server/benchmarks/DECISION_BENCHMARK_SELECTION.md
|
| 39 |
+
7fea6b9dc44e34ce448f1d80a9f2d273b76ab9b0ac1859c032fa4faa4f458501 server/benchmarks/METRIC_VALIDATION.md
|
| 40 |
+
bb88f12ef294680e389147d781bf1f8680ea0a5ca9ed554730d8ea29f1c25eb9 server/benchmarks/PUBLIC_DATASETS.md
|
| 41 |
+
e844e0de19ef528bc28ec09339072e1eab4df05bfc4ec56a220cfc7528d2d481 server/benchmarks/README.md
|
| 42 |
+
3e5beed774bb0bcbfb2fcf24ba9554212c6ae112937d308040989465ab0c5784 server/benchmarks/data/jevbench-easy/LICENSE
|
| 43 |
+
396422e29055bba4073f4a9e5a7163cc724f13e970a34ef58e8ea1fb439b9b38 server/benchmarks/data/jevbench-easy/THIRD-PARTY.md
|
| 44 |
+
e186c6dd90b3a7a177ef15f2fd3673d7bbfce95340bfdc6062dc15bfa0e01a6a server/benchmarks/data/jevbench-easy/public.jsonl
|
| 45 |
+
d43b510898b867e3633ac9a50940f2cf237c114241c3d8e4f26437ff75b64da7 server/benchmarks/data/jevbench-easy/public.manifest.json
|
| 46 |
+
3e5beed774bb0bcbfb2fcf24ba9554212c6ae112937d308040989465ab0c5784 server/benchmarks/data/jevbench-hard/LICENSE
|
| 47 |
+
396422e29055bba4073f4a9e5a7163cc724f13e970a34ef58e8ea1fb439b9b38 server/benchmarks/data/jevbench-hard/THIRD-PARTY.md
|
| 48 |
+
6c93c82edf10d08b70ee0c3addcf7c1ea8fd19957e94fb8021969ff4c0027f95 server/benchmarks/data/jevbench-hard/public.jsonl
|
| 49 |
+
6a1589498ef3ac71798ea8681fbb6a42d8c0a3a329a972818f71f246d1f88909 server/benchmarks/data/jevbench-hard/public.manifest.json
|
| 50 |
+
3e5beed774bb0bcbfb2fcf24ba9554212c6ae112937d308040989465ab0c5784 server/benchmarks/data/jevbench-original/LICENSE
|
| 51 |
+
396422e29055bba4073f4a9e5a7163cc724f13e970a34ef58e8ea1fb439b9b38 server/benchmarks/data/jevbench-original/THIRD-PARTY.md
|
| 52 |
+
ad453e78624b1c150d5eb3f0f47c5c14caa79542329b4f7e1bcc6199e2eb7007 server/benchmarks/data/jevbench-original/public.jsonl
|
| 53 |
+
89fe50f5cc0654b37f81833ed91f171cdbd0d4c1da3622ac4736949fbea23e95 server/benchmarks/data/jevbench-original/public.manifest.json
|
| 54 |
+
5434d64a4bf45a6693287b72edd9d823a907b639a8c3a18fd40cc744073c144b server/benchmarks/run_matrix.py
|
| 55 |
+
fee797d1a2ff128a5d61dd436e8252d63bc726b8ce4ba72641a1ffd9196135a6 server/benchmarks/verify_metrics.py
|
| 56 |
+
2544280dd3e669985bf57dfc61c2212bcf16d27230a79cea76f9f4e822476429 server/examples/request.json
|
| 57 |
+
7a14fe0f5bf73aca7a4930423c310c0a3b1f9b546d07abc8d3fd5d9f38c9a5d7 server/examples/smoke.py
|
| 58 |
+
e589f268969c87f82ddd2c81c0432c6335c08a9f9f2537ce68ddd5708f1e6f9e server/jev_adapter/__init__.py
|
| 59 |
+
c79719983fcf12ad2baa020acb1be00e3b1e4d4b66e7dcaa0a8022f140975f6a server/jev_adapter/__main__.py
|
| 60 |
+
e2f84bb7867934533f8f2a87034cad76af695ca1bbdbf096c545fe60b790c6fa server/jev_adapter/backend.py
|
| 61 |
+
2cd67e71c1a601fc9333c266d909197031b7c0dc746b9a2d5475a5fb0c085e95 server/jev_adapter/benchmarks/__init__.py
|
| 62 |
+
44104bc2d6431c05345cd697dd2c377cc6ba9fd57f2177df7b548490cf5f53fc server/jev_adapter/benchmarks/compare.py
|
| 63 |
+
a504e8051886086934751bffc948e588ebe0ad92c613327014b627be454d3e8c server/jev_adapter/benchmarks/data.py
|
| 64 |
+
a66e6ec289b4c32f79ac990261650870be6b923e47753b9c89ff9e58fe2f982f server/jev_adapter/benchmarks/jevbench.py
|
| 65 |
+
1b78c52f723cb3a3e614d1be4ca531e7595e0a6690e704d6f1bb3045dd948bf0 server/jev_adapter/benchmarks/metrics.py
|
| 66 |
+
9c51ce87269c587f1353b9dd32d886f9f0a51613a996721a7bb81695af445c02 server/jev_adapter/benchmarks/prepare.py
|
| 67 |
+
0fef99cd01164c5548de530c9ab93255e2a95d17757c12e8e3d23016afd1a03c server/jev_adapter/benchmarks/run.py
|
| 68 |
+
86e113a3ee9d15d9be93ba5e964d5f5d51171619e7856cc7dde812c6c90f4a37 server/jev_adapter/native_tokenizer.py
|
| 69 |
+
ad7dee34b9c15e83ce66b3b8b07266e0b8ce81da7c8ba692a8293dbf078d0e44 server/jev_adapter/protocol.py
|
| 70 |
+
3eb21e967cbc8dd7dec2481553fce6974be66276d196eb791f0292bc95c2c8f0 server/jev_adapter/server.py
|
| 71 |
+
bd5e5a13fb264c1e528132c3d33bb2b85c31bc45bb0d025d8151ea47216dbff4 server/jev_adapter/service.py
|
| 72 |
+
8b025570f9678aae6717c817a94e807c21a2c0fe1eb82708a611d3f67be8c3e9 server/jev_adapter/sglang.py
|
| 73 |
+
159eb400efb830c762a36f81e51ba79888570284ffa70326301adfeee50b5bd3 server/pyproject.toml
|
| 74 |
+
f5bf6e9b916ff0d24a2551b4f9f24ed353e7343f5be343b141d38c4c04bd1101 server/tests/test_benchmark_data.py
|
| 75 |
+
c197a90d57c7516eb615f7f0626f4c3e95b2fd0773d74e8f32601251804fca66 server/tests/test_benchmark_matrix.py
|
| 76 |
+
56a48c36d322d7131978809397da79d0f9abbb6801ab6176d27ed2f9dfb26063 server/tests/test_benchmark_run.py
|
| 77 |
+
c492b41c07050d9b76c6c9d7d21bbfcdac6ec137346cf995df3f624cb1e345c8 server/tests/test_disconnect_cleanup.py
|
| 78 |
+
83769ec3f35f5034787ffa8160a5ea7c9c7e23200b303d8b908500d71e3fe13f server/tests/test_http_integration.py
|
| 79 |
+
746cc73422976ec22b460a74a7c70d937c0ba4fd9fb7151fa6745641dbca5616 server/tests/test_jevbench.py
|
| 80 |
+
ade6b76bacf23ae244d9790312f297a36557d6cd8075b81ce36e928359b742da server/tests/test_main.py
|
| 81 |
+
83084f098020374a4abfa3d4402e74e357d45170ca840843e58dba13162e9986 server/tests/test_native_tokenizer.py
|
| 82 |
+
0114da8966dafa951308ed58563053918b2b2f7b3393dd483c7183e3374b444d server/tests/test_protocol.py
|
| 83 |
+
200c35bf53fd869132a69cb8adfd32a1f8e7235d0a7194b19675e46ac39c936b server/tests/test_service.py
|
| 84 |
+
50af7340ac40f3179403b3c53779f673c4ff1be888a015c2f8852731b5f69f0b server/tests/test_sglang.py
|
| 85 |
+
0a5c981e8c5c6f8886ee007a6d4543a0be6b221cb9ca32a8709384a4c6fc8cbb special_tokens_map.json
|
| 86 |
+
600bb27946565481ecf51ba8aee252e49b9a68507866080ac9c30185bb312843 tekken.json
|
| 87 |
+
d5f6046775b112f0e2d456ee9dba450684ab964fe5c4e231599bdc6773028135 tokenizer.json
|
| 88 |
+
f59f7294e4f26383d0ea93840fe21cf197784be0842a8301a0343e8c34ed0d6d tokenizer_config.json
|
SYSTEM_PROMPT.txt
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
You are Ministral-3-3B-Instruct-2512, a Large Language Model (LLM) created by Mistral AI, a French startup headquartered in Paris.
|
| 2 |
+
You power an AI assistant called Le Chat.
|
| 3 |
+
Your knowledge base was last updated on 2023-10-01.
|
| 4 |
+
The current date is {today}.
|
| 5 |
+
|
| 6 |
+
When you're not sure about some information or when the user's request requires up-to-date or specific data, you must use the available tools to fetch the information. Do not hesitate to use tools whenever they can provide a more accurate or complete response. If no relevant tools are available, then clearly state that you don't have the information and avoid making up anything.
|
| 7 |
+
If the user's question is not clear, ambiguous, or does not provide enough context for you to accurately answer the question, you do not try to answer it right away and you rather ask the user to clarify their request (e.g. "What are some good restaurants around me?" => "Where are you?" or "When is the next flight to Tokyo" => "Where do you travel from?").
|
| 8 |
+
You are always very attentive to dates, in particular you try to resolve dates (e.g. "yesterday" is {yesterday}) and when asked about information at specific dates, you discard information that is at another date.
|
| 9 |
+
You follow these instructions in all languages, and always respond to the user in the language they use or request.
|
| 10 |
+
Next sections describe the capabilities that you have.
|
| 11 |
+
|
| 12 |
+
# WEB BROWSING INSTRUCTIONS
|
| 13 |
+
|
| 14 |
+
You cannot perform any web search or access internet to open URLs, links etc. If it seems like the user is expecting you to do so, you clarify the situation and ask the user to copy paste the text directly in the chat.
|
| 15 |
+
|
| 16 |
+
# MULTI-MODAL INSTRUCTIONS
|
| 17 |
+
|
| 18 |
+
You have the ability to read images, but you cannot generate images. You also cannot transcribe audio files or videos.
|
| 19 |
+
You cannot read nor transcribe audio files or videos.
|
| 20 |
+
|
| 21 |
+
# TOOL CALLING INSTRUCTIONS
|
| 22 |
+
|
| 23 |
+
You may have access to tools that you can use to fetch information or perform actions. You must use these tools in the following situations:
|
| 24 |
+
|
| 25 |
+
1. When the request requires up-to-date information.
|
| 26 |
+
2. When the request requires specific data that you do not have in your knowledge base.
|
| 27 |
+
3. When the request involves actions that you cannot perform without tools.
|
| 28 |
+
|
| 29 |
+
Always prioritize using tools to provide the most accurate and helpful response. If tools are not available, inform the user that you cannot perform the requested action at the moment.
|
chat_template.jinja
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{#- Default system message if no system prompt is passed. #}
|
| 2 |
+
{%- set default_system_message = 'You are Ministral-3-3B-Instruct-2512, a Large Language Model (LLM) created by Mistral AI, a French startup headquartered in Paris.
|
| 3 |
+
You power an AI assistant called Le Chat.
|
| 4 |
+
Your knowledge base was last updated on 2023-10-01.
|
| 5 |
+
The current date is {today}.
|
| 6 |
+
|
| 7 |
+
When you\'re not sure about some information or when the user\'s request requires up-to-date or specific data, you must use the available tools to fetch the information. Do not hesitate to use tools whenever they can provide a more accurate or complete response. If no relevant tools are available, then clearly state that you don\'t have the information and avoid making up anything.
|
| 8 |
+
If the user\'s question is not clear, ambiguous, or does not provide enough context for you to accurately answer the question, you do not try to answer it right away and you rather ask the user to clarify their request (e.g. "What are some good restaurants around me?" => "Where are you?" or "When is the next flight to Tokyo" => "Where do you travel from?").
|
| 9 |
+
You are always very attentive to dates, in particular you try to resolve dates (e.g. "yesterday" is {yesterday}) and when asked about information at specific dates, you discard information that is at another date.
|
| 10 |
+
You follow these instructions in all languages, and always respond to the user in the language they use or request.
|
| 11 |
+
Next sections describe the capabilities that you have.
|
| 12 |
+
|
| 13 |
+
# WEB BROWSING INSTRUCTIONS
|
| 14 |
+
|
| 15 |
+
You cannot perform any web search or access internet to open URLs, links etc. If it seems like the user is expecting you to do so, you clarify the situation and ask the user to copy paste the text directly in the chat.
|
| 16 |
+
|
| 17 |
+
# MULTI-MODAL INSTRUCTIONS
|
| 18 |
+
|
| 19 |
+
You have the ability to read images, but you cannot generate images. You also cannot read nor transcribe audio files or videos.
|
| 20 |
+
|
| 21 |
+
# TOOL CALLING INSTRUCTIONS
|
| 22 |
+
|
| 23 |
+
You may have access to tools that you can use to fetch information or perform actions. You must use these tools in the following situations:
|
| 24 |
+
|
| 25 |
+
1. When the request requires up-to-date information.
|
| 26 |
+
2. When the request requires specific data that you do not have in your knowledge base.
|
| 27 |
+
3. When the request involves actions that you cannot perform without tools.
|
| 28 |
+
|
| 29 |
+
Always prioritize using tools to provide the most accurate and helpful response. If tools are not available, inform the user that you cannot perform the requested action at the moment.' %}
|
| 30 |
+
|
| 31 |
+
{#- Begin of sequence token. #}
|
| 32 |
+
{{- bos_token }}
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
{#- Handle system prompt if it exists. #}
|
| 36 |
+
{%- set loop_messages = messages %}
|
| 37 |
+
{%- if messages[0]['role'] != 'system' and default_system_message != '' %}
|
| 38 |
+
{{- '[SYSTEM_PROMPT]' + default_system_message + '[/SYSTEM_PROMPT]' }}
|
| 39 |
+
{%- endif %}
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
{#- Tools definition #}
|
| 43 |
+
{%- set available_tools = '' %}
|
| 44 |
+
{%- set has_tools = false %}
|
| 45 |
+
{%- if tools is defined and tools is not none and tools|length > 0 %}
|
| 46 |
+
{%- set has_tools = true %}
|
| 47 |
+
{%- set available_tools = '[AVAILABLE_TOOLS]' + (tools| tojson) + '[/AVAILABLE_TOOLS]' %}
|
| 48 |
+
{%- endif %}
|
| 49 |
+
|
| 50 |
+
{#- Macros #}
|
| 51 |
+
{%- macro render_content(content, context_name, supported_types_desc, support_images) -%}
|
| 52 |
+
{%- if content is string -%}
|
| 53 |
+
{{- content -}}
|
| 54 |
+
{%- elif content -%}
|
| 55 |
+
{%- for block in content -%}
|
| 56 |
+
{%- if block['type'] == 'text' -%}
|
| 57 |
+
{{- block['text'] -}}
|
| 58 |
+
{%- elif support_images and block['type'] in ['image', 'image_url'] -%}
|
| 59 |
+
{{- '[IMG]' -}}
|
| 60 |
+
{%- else -%}
|
| 61 |
+
{{- raise_exception('Only ' + supported_types_desc + ' chunks are supported in ' + context_name + '.') -}}
|
| 62 |
+
{%- endif -%}
|
| 63 |
+
{%- endfor -%}
|
| 64 |
+
{%- else -%}
|
| 65 |
+
{{- raise_exception(context_name + ' must have non-empty content.') -}}
|
| 66 |
+
{%- endif -%}
|
| 67 |
+
{%- endmacro -%}
|
| 68 |
+
|
| 69 |
+
{#- Aggregate consecutive messages with the same role except system and tool. #}
|
| 70 |
+
{#- A sentinel message is appended so the last group gets flushed inside the loop. #}
|
| 71 |
+
{%- set ns_agg = namespace(messages=[], current_group=[], current_role=none) %}
|
| 72 |
+
{%- for message in loop_messages + [{'role': '__sentinel__'}] %}
|
| 73 |
+
{%- if message['role'] != ns_agg.current_role or message['role'] == 'system' or message['role'] == 'tool' %}
|
| 74 |
+
{%- if ns_agg.current_role == 'tool' %}
|
| 75 |
+
{%- set ns_agg.messages = ns_agg.messages + ns_agg.current_group %}
|
| 76 |
+
{%- elif ns_agg.current_role is not none %}
|
| 77 |
+
{%- set ns_c = namespace(text_parts=[], chunks=[], has_non_text=false, tool_calls=[]) %}
|
| 78 |
+
{%- for msg in ns_agg.current_group %}
|
| 79 |
+
{%- if msg['content'] is string %}
|
| 80 |
+
{%- set ns_c.text_parts = ns_c.text_parts + [msg['content']] %}
|
| 81 |
+
{%- elif msg['content'] is not none %}
|
| 82 |
+
{%- for block in msg['content'] %}
|
| 83 |
+
{%- if block['type'] == 'text' %}
|
| 84 |
+
{%- set ns_c.text_parts = ns_c.text_parts + [block['text']] %}
|
| 85 |
+
{%- else %}
|
| 86 |
+
{%- if ns_c.text_parts | length > 0 %}
|
| 87 |
+
{%- set ns_c.chunks = ns_c.chunks + [{'type': 'text', 'text': ns_c.text_parts | join('\n\n')}] %}
|
| 88 |
+
{%- set ns_c.text_parts = [] %}
|
| 89 |
+
{%- endif %}
|
| 90 |
+
{%- set ns_c.chunks = ns_c.chunks + [block] %}
|
| 91 |
+
{%- set ns_c.has_non_text = true %}
|
| 92 |
+
{%- endif %}
|
| 93 |
+
{%- endfor %}
|
| 94 |
+
{%- endif %}
|
| 95 |
+
{%- if msg['tool_calls'] is defined and msg['tool_calls'] is not none %}
|
| 96 |
+
{%- set ns_c.tool_calls = ns_c.tool_calls + msg['tool_calls'] | list %}
|
| 97 |
+
{%- endif %}
|
| 98 |
+
{%- endfor %}
|
| 99 |
+
{%- if ns_c.has_non_text %}
|
| 100 |
+
{%- if ns_c.text_parts | length > 0 %}
|
| 101 |
+
{%- set ns_c.chunks = ns_c.chunks + [{'type': 'text', 'text': ns_c.text_parts | join('\n\n')}] %}
|
| 102 |
+
{%- endif %}
|
| 103 |
+
{%- set merged_content = ns_c.chunks %}
|
| 104 |
+
{%- else %}
|
| 105 |
+
{%- set merged_content = ns_c.text_parts | join('\n\n') %}
|
| 106 |
+
{%- endif %}
|
| 107 |
+
{%- if ns_c.tool_calls | length > 0 %}
|
| 108 |
+
{%- set ns_agg.messages = ns_agg.messages + [{'role': ns_agg.current_role, 'content': merged_content, 'tool_calls': ns_c.tool_calls}] %}
|
| 109 |
+
{%- else %}
|
| 110 |
+
{%- set ns_agg.messages = ns_agg.messages + [{'role': ns_agg.current_role, 'content': merged_content}] %}
|
| 111 |
+
{%- endif %}
|
| 112 |
+
{%- endif %}
|
| 113 |
+
{%- if message['role'] != '__sentinel__' %}
|
| 114 |
+
{%- set ns_agg.current_group = [message] %}
|
| 115 |
+
{%- set ns_agg.current_role = message['role'] %}
|
| 116 |
+
{%- endif %}
|
| 117 |
+
{%- else %}
|
| 118 |
+
{%- set ns_agg.current_group = ns_agg.current_group + [message] %}
|
| 119 |
+
{%- endif %}
|
| 120 |
+
{%- endfor %}
|
| 121 |
+
{%- set loop_messages = ns_agg.messages %}
|
| 122 |
+
|
| 123 |
+
{#- Validates message ordering. #}
|
| 124 |
+
{%- set ns = namespace(available_tools_emitted=false) %}
|
| 125 |
+
{%- if loop_messages | length > 0 and loop_messages[0]['role'] not in ['user', 'system'] %}
|
| 126 |
+
{{- raise_exception('Conversation must start with a user or system message, got ' + loop_messages[0]['role'] + '.') }}
|
| 127 |
+
{%- endif %}
|
| 128 |
+
{%- set ns_order = namespace(previous_role=none) %}
|
| 129 |
+
{%- for message in loop_messages %}
|
| 130 |
+
{%- set current_role = message['role'] %}
|
| 131 |
+
{%- if ns_order.previous_role is not none %}
|
| 132 |
+
{%- if ns_order.previous_role == 'system' %}
|
| 133 |
+
{%- if current_role not in ['user', 'assistant', 'system'] %}
|
| 134 |
+
{{- raise_exception('Unexpected role \'' + current_role + '\' after role \'' + ns_order.previous_role + '\'') }}
|
| 135 |
+
{%- endif %}
|
| 136 |
+
{%- elif ns_order.previous_role == 'user' %}
|
| 137 |
+
{%- if current_role not in ['assistant', 'system', 'user'] %}
|
| 138 |
+
{{- raise_exception('Unexpected role \'' + current_role + '\' after role \'' + ns_order.previous_role + '\'') }}
|
| 139 |
+
{%- endif %}
|
| 140 |
+
{%- elif ns_order.previous_role == 'assistant' %}
|
| 141 |
+
{%- if current_role not in ['assistant', 'user', 'tool'] %}
|
| 142 |
+
{{- raise_exception('Unexpected role \'' + current_role + '\' after role \'' + ns_order.previous_role + '\'') }}
|
| 143 |
+
{%- endif %}
|
| 144 |
+
{%- elif ns_order.previous_role == 'tool' %}
|
| 145 |
+
{%- if current_role not in ['assistant', 'tool', 'user'] %}
|
| 146 |
+
{{- raise_exception('Unexpected role \'' + current_role + '\' after role \'' + ns_order.previous_role + '\'') }}
|
| 147 |
+
{%- endif %}
|
| 148 |
+
{%- endif %}
|
| 149 |
+
{%- endif %}
|
| 150 |
+
{%- set ns_order.previous_role = current_role %}
|
| 151 |
+
{%- endfor %}
|
| 152 |
+
|
| 153 |
+
{#- Handle conversation messages. #}
|
| 154 |
+
{%- for message in loop_messages %}
|
| 155 |
+
{#- User messages supports text, image and image_url content. #}
|
| 156 |
+
{%- if message['role'] == 'user' %}
|
| 157 |
+
{%- if not ns.available_tools_emitted %}
|
| 158 |
+
{{- available_tools }}
|
| 159 |
+
{%- set ns.available_tools_emitted = true %}
|
| 160 |
+
{%- endif %}
|
| 161 |
+
{%- if message['content'] is not string and message['content'] %}
|
| 162 |
+
{#- When content has exactly one image and one text block, put image first. #}
|
| 163 |
+
{%- if message['content'] | length == 2 and message['content'][0]['type'] == 'text' and message['content'][1]['type'] in ['image', 'image_url'] %}
|
| 164 |
+
{%- set blocks = [message['content'][1], message['content'][0]] %}
|
| 165 |
+
{%- else %}
|
| 166 |
+
{%- set blocks = message['content'] %}
|
| 167 |
+
{%- endif %}
|
| 168 |
+
{%- set user_content = blocks %}
|
| 169 |
+
{%- else %}
|
| 170 |
+
{%- set user_content = message['content'] %}
|
| 171 |
+
{%- endif %}
|
| 172 |
+
{{- '[INST]' -}}
|
| 173 |
+
{{- render_content(user_content, 'user message content', supported_types_desc='text, image and image_url', support_images=true) -}}
|
| 174 |
+
{{- '[/INST]' }}
|
| 175 |
+
|
| 176 |
+
{#- Assistant messages supports text content. #}
|
| 177 |
+
{%- elif message['role'] == 'assistant' %}
|
| 178 |
+
{%- if (message['content'] is none or message['content'] == '' or message['content']|length == 0) and (message['tool_calls'] is not defined or message['tool_calls'] is none or message['tool_calls']|length == 0) %}
|
| 179 |
+
{{- raise_exception('Assistant message must have a string or a list of chunks in content or a list of tool calls.') }}
|
| 180 |
+
{%- endif %}
|
| 181 |
+
|
| 182 |
+
{%- if message['content'] %}
|
| 183 |
+
{{- render_content(message['content'], 'assistant message contents', supported_types_desc='text', support_images=false) -}}
|
| 184 |
+
{%- endif %}
|
| 185 |
+
|
| 186 |
+
{%- if message['tool_calls'] is defined and message['tool_calls'] is not none and message['tool_calls']|length > 0 %}
|
| 187 |
+
{%- for tool in message['tool_calls'] %}
|
| 188 |
+
{{- '[TOOL_CALLS]' }}
|
| 189 |
+
{%- set name = tool['function']['name'] %}
|
| 190 |
+
{%- set arguments = tool['function']['arguments'] %}
|
| 191 |
+
{%- if arguments is not string %}
|
| 192 |
+
{%- set arguments = arguments|tojson|safe %}
|
| 193 |
+
{%- elif arguments == '' %}
|
| 194 |
+
{%- set arguments = '{}' %}
|
| 195 |
+
{%- endif %}
|
| 196 |
+
{{- name + '[ARGS]' + arguments }}
|
| 197 |
+
{%- endfor %}
|
| 198 |
+
{%- endif %}
|
| 199 |
+
|
| 200 |
+
{{- eos_token }}
|
| 201 |
+
|
| 202 |
+
{#- Tool messages only supports text content. #}
|
| 203 |
+
{%- elif message['role'] == 'tool' %}
|
| 204 |
+
{{- '[TOOL_RESULTS]' + message['content']|string + '[/TOOL_RESULTS]' }}
|
| 205 |
+
|
| 206 |
+
{#- System messages. #}
|
| 207 |
+
{%- elif message['role'] == 'system' %}
|
| 208 |
+
{{- '[SYSTEM_PROMPT]' -}}
|
| 209 |
+
{{- render_content(message['content'], 'system message contents', supported_types_desc='text', support_images=false) -}}
|
| 210 |
+
{{- '[/SYSTEM_PROMPT]' -}}
|
| 211 |
+
|
| 212 |
+
{#- Raise exception for unsupported roles. #}
|
| 213 |
+
{%- else %}
|
| 214 |
+
{{- raise_exception('Only user, assistant, system and tool roles are supported, got ' + message['role'] + '.') }}
|
| 215 |
+
{%- endif %}
|
| 216 |
+
{%- endfor %}
|
config.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"architectures": [
|
| 3 |
+
"Mistral3ForConditionalGeneration"
|
| 4 |
+
],
|
| 5 |
+
"dtype": "bfloat16",
|
| 6 |
+
"image_token_index": 10,
|
| 7 |
+
"model_type": "mistral3",
|
| 8 |
+
"multimodal_projector_bias": false,
|
| 9 |
+
"projector_hidden_act": "gelu",
|
| 10 |
+
"spatial_merge_size": 2,
|
| 11 |
+
"text_config": {
|
| 12 |
+
"attention_dropout": 0.0,
|
| 13 |
+
"bos_token_id": 1,
|
| 14 |
+
"dtype": "bfloat16",
|
| 15 |
+
"eos_token_id": 2,
|
| 16 |
+
"head_dim": 128,
|
| 17 |
+
"hidden_act": "silu",
|
| 18 |
+
"hidden_size": 3072,
|
| 19 |
+
"initializer_range": 0.02,
|
| 20 |
+
"intermediate_size": 9216,
|
| 21 |
+
"max_position_embeddings": 262144,
|
| 22 |
+
"model_type": "ministral3",
|
| 23 |
+
"num_attention_heads": 32,
|
| 24 |
+
"num_hidden_layers": 26,
|
| 25 |
+
"num_key_value_heads": 8,
|
| 26 |
+
"pad_token_id": 11,
|
| 27 |
+
"rms_norm_eps": 1e-05,
|
| 28 |
+
"rope_parameters": {
|
| 29 |
+
"beta_fast": 32.0,
|
| 30 |
+
"beta_slow": 1.0,
|
| 31 |
+
"factor": 16.0,
|
| 32 |
+
"llama_4_scaling_beta": 0.1,
|
| 33 |
+
"mscale": 1.0,
|
| 34 |
+
"mscale_all_dim": 1.0,
|
| 35 |
+
"original_max_position_embeddings": 16384,
|
| 36 |
+
"rope_theta": 1000000.0,
|
| 37 |
+
"rope_type": "yarn",
|
| 38 |
+
"type": "yarn"
|
| 39 |
+
},
|
| 40 |
+
"sliding_window": null,
|
| 41 |
+
"tie_word_embeddings": true,
|
| 42 |
+
"use_cache": true,
|
| 43 |
+
"vocab_size": 131072
|
| 44 |
+
},
|
| 45 |
+
"tie_word_embeddings": true,
|
| 46 |
+
"transformers_version": "5.12.1",
|
| 47 |
+
"vision_config": {
|
| 48 |
+
"attention_dropout": 0.0,
|
| 49 |
+
"dtype": "bfloat16",
|
| 50 |
+
"head_dim": 64,
|
| 51 |
+
"hidden_act": "silu",
|
| 52 |
+
"hidden_size": 1024,
|
| 53 |
+
"image_size": 1540,
|
| 54 |
+
"initializer_range": 0.02,
|
| 55 |
+
"intermediate_size": 4096,
|
| 56 |
+
"model_type": "pixtral",
|
| 57 |
+
"num_attention_heads": 16,
|
| 58 |
+
"num_channels": 3,
|
| 59 |
+
"num_hidden_layers": 24,
|
| 60 |
+
"patch_size": 14,
|
| 61 |
+
"rope_parameters": {
|
| 62 |
+
"rope_theta": 10000.0,
|
| 63 |
+
"rope_type": "default"
|
| 64 |
+
}
|
| 65 |
+
},
|
| 66 |
+
"vision_feature_layer": -1
|
| 67 |
+
}
|
docs/BENCHMARKS.md
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Standard One — full benchmark report
|
| 2 |
+
|
| 3 |
+
This report covers both released systems, **Standard One 8B** (`StandardThinking/StandardOne-8B` / `-LoRA`) and
|
| 4 |
+
**Standard One 3B** (`StandardThinking/StandardOne-3B` / `-LoRA`). It is our own measurement, not an official JevBench
|
| 5 |
+
leaderboard score. The only comparisons in this report are: the untuned
|
| 6 |
+
base model (accuracy, see § Decision quality vs. the untuned base), Qwen-based models served on the
|
| 7 |
+
same H200 stack (speed only, untuned, no accuracy comparison implied), and one authorized peer
|
| 8 |
+
comparison against TypeSafe Jev 1.13 (see § Measured against Jev 1.13).
|
| 9 |
+
|
| 10 |
+
## Contents
|
| 11 |
+
|
| 12 |
+
- [Suite name key](#suite-name-key)
|
| 13 |
+
- [Scope](#scope)
|
| 14 |
+
- [Measurement paths: offline HF runner vs. served endpoint](#measurement-paths-offline-hf-runner-vs-served-endpoint)
|
| 15 |
+
- [Text suites](#text-suites)
|
| 16 |
+
- [Served parity](#served-parity)
|
| 17 |
+
- [Public classification and decision suites](#public-classification-and-decision-suites)
|
| 18 |
+
- [Latency and throughput](#latency-and-throughput)
|
| 19 |
+
- [Measured against Jev 1.13](#measured-against-jev-113)
|
| 20 |
+
- [Calibration](#calibration)
|
| 21 |
+
- [Decision quality vs. the untuned base](#decision-quality-vs-the-untuned-base)
|
| 22 |
+
- [Data provenance and licences](#data-provenance-and-licences)
|
| 23 |
+
- [Training data provenance](#training-data-provenance)
|
| 24 |
+
- [Public-overlap audit and disclosure](#public-overlap-audit-and-disclosure)
|
| 25 |
+
- [Evidence file hashes](#evidence-file-hashes)
|
| 26 |
+
|
| 27 |
+
## Suite name key
|
| 28 |
+
|
| 29 |
+
The model cards use readable names for four internal evaluation suites; this report keeps the original
|
| 30 |
+
identifiers so figures trace back to `release-manifest.json` and `evidence/`. Mapping: `judge-proxy-v1`
|
| 31 |
+
= judge proxy (600 questions: routing + answer adequacy); `internal-eval-v2-realistic` = realistic
|
| 32 |
+
transfer set (600); `distprob-val-v2` = stated-distribution probability (1,036);
|
| 33 |
+
`internal-eval-hardproxy-v1` = hard proxy (600). JevBench's own public-tier names (easy / standard /
|
| 34 |
+
hard) are used as-is in both places.
|
| 35 |
+
|
| 36 |
+
## Scope
|
| 37 |
+
|
| 38 |
+
- Both candidates: merged BF16 weights, LoRA r=16/α=32 on `q/k/v/o/gate/up/down` of the language model
|
| 39 |
+
only (vision tower + projector excluded), same three-stage training recipe on the **identical final
|
| 40 |
+
training mixture** (29 cohorts, 359,497 rows) — see `MODEL_CARD_8B.md` / `MODEL_CARD_3B.md` §
|
| 41 |
+
*Training* for the recipe and per-cohort breakdown, and `release-manifest.json` for the exact
|
| 42 |
+
per-cohort row counts and hashes. The 3B is a smaller base/adapter pair, not a reduced-data variant.
|
| 43 |
+
**Image input is supported** (the Pixtral vision tower and projector are retained; images are passed
|
| 44 |
+
as data URLs), and image-side data was included in the final training stage — this report does not
|
| 45 |
+
detail image or content-moderation training or results further.
|
| 46 |
+
- Release serving configuration for both: native wording, **no system prompt**
|
| 47 |
+
(`--prompt-wording native --native-system-prompt none`), single option order, server-side default
|
| 48 |
+
temperature **T = 1.35 (8B)** / **T = 1.45 (3B)** — both refit directly on served probabilities
|
| 49 |
+
(see § Calibration). See `QUICKSTART.md` for the exact commands.
|
| 50 |
+
- What is **not** covered here: any official JevBench sealed-set score (we have none yet), any additional peer-system comparison beyond Jev 1.13, and image/content-moderation
|
| 51 |
+
training detail beyond the one sentence above.
|
| 52 |
+
|
| 53 |
+
## Measurement paths: offline HF runner vs. served endpoint
|
| 54 |
+
|
| 55 |
+
Two different measurement paths appear throughout this report and are not interchangeable:
|
| 56 |
+
|
| 57 |
+
1. **Offline HF runner**: `transformers`-based scoring harness, computes label-logit probabilities
|
| 58 |
+
directly from a loaded checkpoint (adapter or merged), no network serving stack involved.
|
| 59 |
+
2. **Served endpoint**: stock SGLang 0.5.20 + `jev-adapter`, `POST /v1/systemone`, the same path an
|
| 60 |
+
external caller would use — see `QUICKSTART.md` for how to reproduce this endpoint.
|
| 61 |
+
|
| 62 |
+
**These two paths do not agree exactly.** Served probabilities differ measurably from offline-runner
|
| 63 |
+
probabilities for both candidates: mean total-variation distance ≈0.07 on the hard tier, with 8–12 of
|
| 64 |
+
111 argmax label changes, even though the rendered prompts were verified byte-identical between the two
|
| 65 |
+
paths. **Treat served numbers as authoritative and offline numbers as indicative.**
|
| 66 |
+
|
| 67 |
+
Temperature is **final and served-path-fit** for both candidates: T = 1.35 (8B) and T = 1.45 (3B) were
|
| 68 |
+
refit directly on served probabilities from the running endpoint, on
|
| 69 |
+
`internal-eval-hardproxy-calib-v1` + `distprob-calib-v2`, no system prompt. This supersedes an earlier
|
| 70 |
+
offline-harness fit (T = 1.5 / T = 1.3).
|
| 71 |
+
|
| 72 |
+
Most of the offline text-suite table below reflects the **with-system-prompt** configuration, while the
|
| 73 |
+
release ships **without** the system prompt. Where we independently re-measured the no-system-prompt
|
| 74 |
+
configuration (hard, original, judge-proxy-v1, internal-eval-v2-realistic, distprob-val-v2, easy), both
|
| 75 |
+
columns are shown.
|
| 76 |
+
|
| 77 |
+
## Text suites
|
| 78 |
+
|
| 79 |
+
### Standard One 8B
|
| 80 |
+
|
| 81 |
+
| Suite | n | With system prompt | No system prompt (shipped) | Notes |
|
| 82 |
+
|---|---|---|---|---|
|
| 83 |
+
| JevBench public easy | 48 | 100.00 % | **100.00 %** | |
|
| 84 |
+
| JevBench public original | 72 | 98.61 % | **97.22 %** | |
|
| 85 |
+
| JevBench public hard | 111 | 56.76 % | **54.95 %** | never used for training/T-fitting/selection |
|
| 86 |
+
| judge-proxy-v1 (routing + adequacy) | 600 | 89.33 % | **88.67 %** | leaderboard judge text not public; proxy only |
|
| 87 |
+
| internal-eval-v2-realistic | 600 | 88.83 % | **88.83 %** | unchanged with/without system prompt |
|
| 88 |
+
| distprob-val-v2 | 1,036 | 81.27 % | **81.08 %** | |
|
| 89 |
+
| internal-eval-v1 | 600 | 78.50 % | not separately re-measured | |
|
| 90 |
+
| internal-eval-hardproxy-v1 | 600 | 48.67 % | not separately re-measured | hard-tier proxy |
|
| 91 |
+
| games-harness-eval-v1 | 360 | 97.78 % | not separately re-measured | othello/chess/tic-tac-toe/snake/graph, text |
|
| 92 |
+
| tetris-drought-eval-v1 (text) | 120 | 67.50 % | not separately re-measured | |
|
| 93 |
+
|
| 94 |
+
### Standard One 3B
|
| 95 |
+
|
| 96 |
+
| Suite | n | With system prompt | No system prompt (shipped) | Notes |
|
| 97 |
+
|---|---|---|---|---|
|
| 98 |
+
| JevBench public easy | 48 | 100.00 % | **100.00 %** | |
|
| 99 |
+
| JevBench public original | 72 | 90.28 % | **91.67 %** | one of the few rows where dropping the prompt *helps* |
|
| 100 |
+
| JevBench public hard | 111 | 52.25 % | **49.55 %** | never used for training/T-fitting/selection |
|
| 101 |
+
| judge-proxy-v1 (routing + adequacy) | 600 | 86.83 % | **85.67 %** | |
|
| 102 |
+
| internal-eval-v2-realistic | 600 | 88.83 % | **88.67 %** | |
|
| 103 |
+
| distprob-val-v2 | 1,036 | 80.98 % | **79.73 %** | |
|
| 104 |
+
| internal-eval-v1 | 600 | 77.17 % | not separately re-measured | |
|
| 105 |
+
| internal-eval-hardproxy-v1 | 600 | 43.33 % | not separately re-measured | hard-tier proxy |
|
| 106 |
+
| games-harness-eval-v1 | 360 | 95.83 % | not separately re-measured | |
|
| 107 |
+
| tetris-drought-eval-v1 (text) | 120 | 64.17 % | not separately re-measured | |
|
| 108 |
+
|
| 109 |
+
## Served parity
|
| 110 |
+
|
| 111 |
+
Both offline and served measurement paths were run; served numbers below are authoritative, on the
|
| 112 |
+
final served-path temperature fit:
|
| 113 |
+
|
| 114 |
+
| | Standard One 8B (no system prompt, T=1.35) | Standard One 3B (no system prompt, T=1.45) |
|
| 115 |
+
|---|---|---|
|
| 116 |
+
| easy (48) | 100.00 % | 100.00 % |
|
| 117 |
+
| original (72) | 95.83 % | 86.11 % |
|
| 118 |
+
| hard (111) | 54.05 % | 48.65 % |
|
| 119 |
+
| judge-proxy-v1 | 90.33 % | 85.67 % |
|
| 120 |
+
| internal-eval-hardproxy-v1 | 48.33 % | 43.67 % |
|
| 121 |
+
| internal-eval-v2-realistic | 89.50 % | 88.17 % |
|
| 122 |
+
| distprob-val-v2 | 81.56 % | 80.12 % |
|
| 123 |
+
| Calibration axis (leaderboard formula) | 75.9 | 77.5 |
|
| 124 |
+
|
| 125 |
+
As noted above, served numbers differ somewhat from the corresponding offline numbers for both
|
| 126 |
+
candidates (mean TV ≈0.07 hard tier, 8–12/111 argmax changes) — these are the figures used for the
|
| 127 |
+
Accuracy does not depend on temperature, so the earlier T=1.0-forced served run
|
| 128 |
+
(before the temperature refit) reported the same easy/original/hard accuracy: 8B 100.00/95.83/54.05, 3B
|
| 129 |
+
100.00/87.50/48.65 no-system-prompt (100.00/88.89/46.85 with-system-prompt ablation).
|
| 130 |
+
|
| 131 |
+
## Public classification and decision suites
|
| 132 |
+
|
| 133 |
+
400 cases per suite, seed 13, sampled from public test splits, one request per case, served endpoints
|
| 134 |
+
(merged BF16, SGLang 0.5.20, `jev-adapter`, native wording, no system prompt, single option order),
|
| 135 |
+
measured 24 September 2026. Standard One only; no comparison column.
|
| 136 |
+
|
| 137 |
+
| Suite | Standard One 8B | Standard One 3B |
|
| 138 |
+
|---|---|---|
|
| 139 |
+
| AG News (4 topics) | 84.8 % | 83.8 % |
|
| 140 |
+
| DAIR Emotion (6 labels) | 57.0 % | 58.0 % |
|
| 141 |
+
| Typed decisions (400 cases, 2,000 decisions) | 69.8 % | 69.3 % |
|
| 142 |
+
| MASSIVE intent, 20 options, 9 languages, mean (en 88.0 / 85.8, ko 89.2 / 84.2) | 86.4 % | 84.0 % |
|
| 143 |
+
| XNLI, 3 labels, 6 languages, mean | 61.4 % | 62.2 % |
|
| 144 |
+
| Email spam | 87.2 % | 91.8 % |
|
| 145 |
+
| Phishing | 84.8 % | 89.5 % |
|
| 146 |
+
| Moderation (toxic vs benign) | 82.5 % | 78.8 % |
|
| 147 |
+
| Model routing (domain) | 92.7 % | 87.2 % |
|
| 148 |
+
|
| 149 |
+
Option-order flip rate (share of cases whose answer changes under a permuted option order) ranges from
|
| 150 |
+
3.5 % (AG News) to 12 % (MASSIVE en) for the 8B. Full per-language and per-workflow numbers, macro-F1
|
| 151 |
+
and ECE: [`public-classification-suites.md`](public-classification-suites.md).
|
| 152 |
+
|
| 153 |
+
## Latency and throughput
|
| 154 |
+
|
| 155 |
+

|
| 156 |
+
|
| 157 |
+
*Same H200, SGLang 0.5.20, `jev-adapter`, 242-decision profile, serial, ≈280 input tokens/decision.
|
| 158 |
+
Qwen checkpoints are served **untuned**, as a **speed-only reference — no accuracy comparison is
|
| 159 |
+
implied**.*
|
| 160 |
+
|
| 161 |
+
| Model | p50 | p95 | Input tokens |
|
| 162 |
+
|---|---|---|---|
|
| 163 |
+
| Standard One 3B | 22.6 ms | 33.2 ms | ≈280 |
|
| 164 |
+
| Standard One 8B | 25.8 ms | 41.9 ms | ≈280 |
|
| 165 |
+
| Qwen3-8B (untuned) | 28.5 ms | 57.2 ms | 278 |
|
| 166 |
+
| Qwen3.5-4B (untuned) | 48.8 ms | 72.7 ms | 283 |
|
| 167 |
+
|
| 168 |
+
242-decision profile, one H200, no system prompt:
|
| 169 |
+
|
| 170 |
+
| | Standard One 8B | Standard One 3B |
|
| 171 |
+
|---|---|---|
|
| 172 |
+
| Raw p50 / p95 | 25.8 ms / 41.9 ms | 22.6 ms / 33.2 ms |
|
| 173 |
+
| Leaderboard-adjusted (×2 + 0.15 s) p50 / p95 | 0.202 s / 0.234 s | 0.195 s / 0.216 s |
|
| 174 |
+
| Speed axis | 93.3 | 93.7 |
|
| 175 |
+
| Mean input tokens/decision | 280 | 280 (hard tier alone: 1,242) |
|
| 176 |
+
| With system prompt: mean tokens / Speed axis | 803 / — | 803 / 93.6 |
|
| 177 |
+
|
| 178 |
+
Throughput at concurrency 8, same 242-decision/280-token profile: **≈40 decisions/s (32.3k tokens/s)**
|
| 179 |
+
on one H200, measured for the 8B only. On the heavier hard+standard, 1,322-token/request mix (below):
|
| 180 |
+
**29.3k tok/s at concurrency 1 → 39.5k tok/s at concurrency 64**.
|
| 181 |
+
|
| 182 |
+

|
| 183 |
+
|
| 184 |
+
*Standard One 8B merged BF16, SGLang 0.5.20, one H200, **hard+standard mix at 1,322 tokens/request** — a
|
| 185 |
+
heavier, different profile than the 280-token/decision figure above, so the two throughput numbers
|
| 186 |
+
(37.0k tok/s here at concurrency 8 vs. 32.3k tok/s above) are not directly comparable; both are genuine
|
| 187 |
+
measurements of the same hardware under different request mixes. **8B only.**
|
| 188 |
+
|
| 189 |
+
| Concurrency | Throughput (k tok/s) | p50 (ms) |
|
| 190 |
+
|---|---|---|
|
| 191 |
+
| 1 | 29.3 | 31 |
|
| 192 |
+
| 8 | 37.0 | 282 |
|
| 193 |
+
| 32 | 39.3 | 1,033 |
|
| 194 |
+
| 64 | 39.5 | 1,998 |
|
| 195 |
+
|
| 196 |
+
## Measured against Jev 1.13
|
| 197 |
+
|
| 198 |
+

|
| 199 |
+
|
| 200 |
+
The one peer comparison in this report: we measured **TypeSafe Jev 1.13** (`typesafe/jev-1.13-20260917`)
|
| 201 |
+
through OpenRouter's `/v1/systemone`, on the same items, same option order, raw probabilities as
|
| 202 |
+
returned (no temperature applied), 3,067 questions, 0 failures, measured 24 September 2026 from the
|
| 203 |
+
same host used for our own runs.
|
| 204 |
+
|
| 205 |
+
| Suite (n) | Jev 1.13 | Standard One 8B | Standard One 3B |
|
| 206 |
+
|---|---|---|---|
|
| 207 |
+
| distprob-val-v2 (1,036) | 72.97 % | **81.56 %** | 80.12 % |
|
| 208 |
+
| internal-eval-v2-realistic (600) | 86.67 % | **89.50 %** | 88.17 % |
|
| 209 |
+
| judge-proxy-v1 (600) | **90.50 %** | 90.33 % | 85.67 % |
|
| 210 |
+
| JevBench easy (48) | 100.00 % | 100.00 % | 100.00 % |
|
| 211 |
+
| JevBench standard (72) | **98.61 %** | 95.83 % | 86.11 % |
|
| 212 |
+
| internal-eval-hardproxy-v1 (600) | **54.83 %** | 48.33 % | 43.67 % |
|
| 213 |
+
| JevBench hard (111) | **72.07 %** | 54.05 % | 48.65 % |
|
| 214 |
+
|
| 215 |
+
Jev leads on the public hard tier and the hard proxy; Standard One leads on stated-distribution probability and
|
| 216 |
+
the realistic transfer set; judge and easy tie.
|
| 217 |
+
|
| 218 |
+
Calibration on the same items, Jev raw (no temperature applied):
|
| 219 |
+
|
| 220 |
+
| | Jev 1.13 | Standard One 8B | Standard One 3B |
|
| 221 |
+
|---|---|---|---|
|
| 222 |
+
| Hard-tier ECE (10-bin, top label) | **0.099** | 0.232 raw (0.178 at T=1.35) | 0.227 raw (0.158 at T=1.45) |
|
| 223 |
+
| Mean TV to stated distributions | **0.192** | 0.111 raw (0.127 at T) | 0.121 raw (0.135 at T) |
|
| 224 |
+
|
| 225 |
+
Latency, same 242-decision profile, same host:
|
| 226 |
+
|
| 227 |
+
| | p50 | p95 | Input tokens/decision |
|
| 228 |
+
|---|---|---|---|
|
| 229 |
+
| Jev 1.13 (hosted API via OpenRouter) | 227 ms | 321 ms | ≈538 (OpenRouter-reported) |
|
| 230 |
+
| Standard One 8B | 25.8 ms | 41.9 ms | ≈280 |
|
| 231 |
+
| Standard One 3B | 22.6 ms | 33.2 ms | ≈280 |
|
| 232 |
+
|
| 233 |
+
Jev's latency includes network round-trip to a hosted API; Standard One's is local-GPU serial on the same host.
|
| 234 |
+
|
| 235 |
+
## Calibration
|
| 236 |
+
|
| 237 |
+
- **T fit (release, no system prompt, served path, final)**: 8B T = 1.35, 3B T = 1.45, both refit
|
| 238 |
+
directly on served probabilities from the running endpoint, on
|
| 239 |
+
`internal-eval-hardproxy-calib-v1` + `distprob-calib-v2`. This is the final, shipped configuration.
|
| 240 |
+
- **Historical reference (offline-harness fit, superseded)**: 8B T = 1.5 (no system prompt) / T = 1.4
|
| 241 |
+
(with system prompt, merged-checkpoint offline check, hard-tier ECE 0.211 at T=1, 0.148 at T=1.4);
|
| 242 |
+
3B T = 1.3 (no system prompt) / T = 1.35 (with system prompt, merged-checkpoint offline check,
|
| 243 |
+
hard-tier ECE 0.236 at T=1, 0.190 at T=1.35). These predate the served-path refit and are kept for
|
| 244 |
+
record only.
|
| 245 |
+
- **Calibration axis (leaderboard formula)**: 8B **75.9**, 3B **77.5** (see § Served parity).
|
| 246 |
+
- **Distribution (TV) fidelity**, `distprob-val-v2`, offline, with system prompt, at T=1: 8B mean TV
|
| 247 |
+
≈0.107–0.128 across suite slices; 3B mean TV ≈0.118–0.128. See § *Measured against Jev 1.13* for the
|
| 248 |
+
served-path TV comparison against Jev.
|
| 249 |
+
|
| 250 |
+
## Decision quality vs. the untuned base
|
| 251 |
+
|
| 252 |
+

|
| 253 |
+
|
| 254 |
+
*Accuracy change versus the untuned Ministral 3 base, same prompt, same offline runner, no system prompt, T=1. Public JevBench tiers are the 231 public items; the other suites are held-out proxies built from public data. The hard tier is placed last on purpose (see below).*
|
| 255 |
+
|
| 256 |
+
The only base-model comparison in this report. On the public **hard** tier, the untuned Ministral 3 8B
|
| 257 |
+
base is measured **ahead of Standard One 8B** (60.4 % vs. 55.0 %, a 6-of-111-item gap) — hard is 30 % of the
|
| 258 |
+
v1.3.0 Intelligence axis, so this is material, not a rounding artifact. All rows below come from one
|
| 259 |
+
run of the same offline runner (native wording, no system prompt, T=1, single option order); the
|
| 260 |
+
untuned 3B base is behind on every suite, the untuned 8B base is ahead only on the public hard tier.
|
| 261 |
+
|
| 262 |
+
| Suite | Base 8B | **Standard One 8B** | Base 3B | **Standard One 3B** |
|
| 263 |
+
|---|---|---|---|---|
|
| 264 |
+
| distprob-val-v2 (stated-distribution probability, 1,036) | 34.85 % | **81.08 %** (+46.2) | 31.56 % | **79.73 %** (+48.2) |
|
| 265 |
+
| internal-eval-v2-realistic (realistic transfer set, 600) | 72.83 % | **88.83 %** (+16.0) | 62.50 % | **88.67 %** (+26.2) |
|
| 266 |
+
| JevBench public standard tier (72) | 79.17 % | **97.22 %** (+18.0) | 70.83 % | **91.67 %** (+20.8) |
|
| 267 |
+
| judge-proxy-v1 (routing + adequacy, 600) | 79.33 % | **88.67 %** (+9.3) | 63.17 % | **85.67 %** (+22.5) |
|
| 268 |
+
| JevBench public easy tier (48) | 100.00 % | **100.00 %** (+0.0) | 97.92 % | **100.00 %** (+2.1) |
|
| 269 |
+
| JevBench public hard tier (111) | 60.36 % | **54.95 %** (-5.4) | 47.75 % | **49.55 %** (+1.8) |
|
| 270 |
+
|
| 271 |
+
|
| 272 |
+
## Data provenance and licences
|
| 273 |
+
|
| 274 |
+
| Source | Licence |
|
| 275 |
+
|---|---|
|
| 276 |
+
| Every synthetic cohort (deterministic generators + visible checkers; subset teacher-reviewed) | Apache-2.0 (ours) |
|
| 277 |
+
| Base models `mistralai/Ministral-3-8B-Instruct-2512(-BF16)` / `-3B-` | Apache-2.0 |
|
| 278 |
+
| `jev-adapter` server code | Apache-2.0 |
|
| 279 |
+
| JevBench harness + public tiers (evaluation only, commit `fd51755e…`) | MIT |
|
| 280 |
+
|
| 281 |
+
All training-cohort details (per-cohort row counts, sha256) are in § *Training data provenance* below
|
| 282 |
+
and in `release-manifest.json`, identical for both candidates.
|
| 283 |
+
|
| 284 |
+
## Training data provenance
|
| 285 |
+
|
| 286 |
+
The following cohort families make up the identical 29-cohort, 359,497-row training mixture used by
|
| 287 |
+
both Standard One 8B and Standard One 3B. Every row is synthetic and solver-generated (deterministic generators with
|
| 288 |
+
visible checkers; a subset was teacher-reviewed). No JevBench evaluation scenario appears in any
|
| 289 |
+
training cohort.
|
| 290 |
+
|
| 291 |
+
| Cohort family | What it covers | Licence |
|
| 292 |
+
|---|---|---|
|
| 293 |
+
| Document & field normalisation (`document-v3`, `exact`, `field-roles`, `synthetic-en`) | Extracting and normalising fields from documents and records | Apache-2.0 (ours) |
|
| 294 |
+
| Judge / routing & adequacy (`judge-proxy-v1`, `judge-realistic-train`, `judge-multilingual-train`) | Routing decisions and answer-adequacy checks | Apache-2.0 (ours) |
|
| 295 |
+
| Stated-distribution probability (`distprob-scale30k`, `distprob-multilingual`, `distprob-pilot2k`, `narrative-prob-train`, `probability`) | Estimating a probability distribution over stated outcomes | Apache-2.0 (ours) |
|
| 296 |
+
| Verification & scoring (`noul-score-10k`) | Yes/no verification and ordinal scoring | Apache-2.0 (ours) |
|
| 297 |
+
| Adequacy-rubric style (`hardstyle-train`) | Hard-style adequacy questions (see § Public-overlap audit and disclosure) | Apache-2.0 (ours) |
|
| 298 |
+
| Game & board-state (`games-text-train`, `games-harness-train`, `games-harness-multilingual`) | Othello, chess, tic-tac-toe, snake and graph-problem decisions | Apache-2.0 (ours) |
|
| 299 |
+
| Tetris board-state (`games-text-train-tetris`, `games-harness-tetris`, `tetris-drought-train`) | Tetris-specific board-state decisions | Apache-2.0 (ours) |
|
| 300 |
+
| JevBench public tiers (evaluation only, not training) | Easy / standard / hard held-out accuracy measurement | MIT |
|
| 301 |
+
|
| 302 |
+
## Public-overlap audit and disclosure
|
| 303 |
+
|
| 304 |
+
Run on the exact final 29-cohort, 359,497-row mixture that **both candidates train on**:
|
| 305 |
+
|
| 306 |
+
- **0 exact state matches** — no training row's state/scenario duplicates any public JevBench item.
|
| 307 |
+
- **181 exact instruction matches**: `hardstyle-train-v1` (87 of 3,900 rows) and `hardstyle-train-v2`
|
| 308 |
+
(94 of 3,879 rows) contain rows whose entire instruction is byte-identical, after normalization, to
|
| 309 |
+
one public `jevbench-hard` instruction — a 58-character generic adequacy-rubric question ("does the
|
| 310 |
+
response fully and correctly satisfy the request?"), reused as the complete instruction rather than
|
| 311 |
+
as a substring.
|
| 312 |
+
- 16 distinct shared word 8-grams (12 distinct phrases, 9,756 rows), all in three known families: the
|
| 313 |
+
rubric sentence above (also in `judge-realistic-train-v3`, `judge-multilingual-train-v1`,
|
| 314 |
+
`judge-proxy-v1`), an insurance "cancellation takes effect" boilerplate clause, and a "coverage
|
| 315 |
+
reviewer" claims-adjudication phrase.
|
| 316 |
+
- All other 27 cohorts: 0 exact state and 0 exact instruction matches.
|
| 317 |
+
|
| 318 |
+
**These 181 rows are kept and disclosed here, not regenerated.** They are 0.05 % of the mixture, and
|
| 319 |
+
the exposure is limited to one hard-tier *question's* generic wording, never a *state* or an answer.
|
| 320 |
+
|
| 321 |
+
## Evidence file hashes
|
| 322 |
+
|
| 323 |
+
`evidence/` (8B):
|
| 324 |
+
|
| 325 |
+
| File | sha256 |
|
| 326 |
+
|---|---|
|
| 327 |
+
| `adapter_model.safetensors` | `a2d9f02d5dd5d3ade3fab88145fc7321315609aa52d3847319dc4ec827f0c684` |
|
| 328 |
+
| `adapter_config.json` | `a6a57c918f63358bc6c6b031319b124d843de612423906cdcdd777f38321fc95` |
|
| 329 |
+
| `manifest.json` | `250891a115ee6c490b93fd9c9f0d63faf0a2d4cc446efd62481340c3a214b821` |
|
| 330 |
+
| `MERGE_REPORT.json` | `5e98d117e0b06bf3d2272df65d49b8084469ed7718f579a9c68ee98483b04d70` |
|
| 331 |
+
| `calibration-leaderboard.json` | `5384f476f04530a271a86a023fb73134633585f55d684cd30eaa58e8f57d9c2b` |
|
| 332 |
+
| `latency-report-shared-gpu.json` | `2942f20a19632569828762558132706d7ac61b50660e7e6e36bed0c31d7846b5` |
|
| 333 |
+
| `served-easy-report.json` | `62bd49df29c528c350bc779bf568f05a0f7715a9898ed538d5604053bc21ed29` |
|
| 334 |
+
| `served-original-report.json` | `fe276e076192f037cf7e56a8495e666dbfd6ca42caad04b4548439ce70b8fa04` |
|
| 335 |
+
| `served-hard-report.json` | `8a27f9cb5639eb63191dc27c08347f825556915cd6553a596c6a3ab597dbd67b` |
|
| 336 |
+
|
| 337 |
+
`evidence/` (3B):
|
| 338 |
+
|
| 339 |
+
| File | sha256 |
|
| 340 |
+
|---|---|
|
| 341 |
+
| `adapter_model.safetensors` | `ae5fe8e3be2e9186e6504e48ad2fe7eea5537e7e8382a0cca2ca49d95605f7bf` |
|
| 342 |
+
| `adapter_config.json` | `8326f9e4092ed74a3e68978df37bc9c0a5d8f47b90fbea41ea27d592dd9bda64` |
|
| 343 |
+
| `manifest.json` | `67a81590d59cebe6da802682d1d5c017cff04e518e7fbb752609ed038d31772a` |
|
| 344 |
+
| `calibration-leaderboard.json` | `555d8f7f34a30fcadf1d428e34f8084ee9e13c9f127128e66e808959c81c69ca` |
|
| 345 |
+
| `offline-native-result.json` | `a8efd79e389fc125ce38ab6001186e190eb818982290568577f9147429809f46` |
|
| 346 |
+
|
| 347 |
+
`docs/assets/` (figures referenced by this report):
|
| 348 |
+
|
| 349 |
+
| File | sha256 |
|
| 350 |
+
|---|---|
|
| 351 |
+
| `02-latency-vs-qwen.png` | `d383eb64f146c6be069455d1631e10ef120ffb534f0000f7470e715e9fe99872` |
|
| 352 |
+
| `04-throughput.png` | `bdb8cb392f6f288fe7ce7fde78e39759cd688340be4fe605890dc79c58e83f73` |
|
| 353 |
+
|
| 354 |
+
The 3B evidence set does not yet include a separate `MERGE_REPORT.json` or served-endpoint report
|
| 355 |
+
files; the merge-tensor numbers (182 tensors changed, max |Δ| 0.0025) and served numbers (§ Served
|
| 356 |
+
parity) are recorded narratively in `MODEL_CARD_3B.md`.
|
docs/assets/00-benchmark-card.svg
ADDED
|
|
docs/assets/02-latency-vs-qwen.svg
ADDED
|
|
docs/assets/04-throughput.png
ADDED
|
docs/assets/04-throughput.svg
ADDED
|
|
docs/assets/05-gain-over-base.svg
ADDED
|
|
docs/assets/06-vs-jev.svg
ADDED
|
|
docs/public-classification-suites.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Public classification and decision suites
|
| 2 |
+
|
| 3 |
+
Measured 24 September 2026 through the served endpoints (merged BF16, SGLang 0.5.20, jev-adapter, native wording, no system prompt, single option order). Each suite: 400 cases sampled with seed 13 from the public test split, one request per case; ECE (10-bin, top label) uses the served temperature (8B T=1.35, 3B T=1.45). Accuracy and macro-F1 are argmax metrics and do not depend on the temperature. banking77 (77 labels) is not runnable: the endpoint accepts at most 26 options per question.
|
| 4 |
+
|
| 5 |
+
## Public datasets
|
| 6 |
+
|
| 7 |
+
| Suite | n | Acc 8B | Acc 3B | Macro-F1 8B | Macro-F1 3B | ECE 8B | ECE 3B |
|
| 8 |
+
|---|---|---|---|---|---|---|---|
|
| 9 |
+
| AG News (4 topics) | 400 | 84.8 | 83.8 | 83.3 | 82.3 | 0.095 | 0.106 |
|
| 10 |
+
| DAIR Emotion (6 labels) | 400 | 57.0 | 58.0 | 47.2 | 48.3 | 0.217 | 0.052 |
|
| 11 |
+
| SST-5 (5-level sentiment, ordinal score) | 400 | — | — | — | — | — | — |
|
| 12 |
+
| Typed decisions (400 cases, 2,000 decisions) | 400 | 69.8 | 69.3 | 61.4 | 60.5 | 0.060 | 0.070 |
|
| 13 |
+
|
| 14 |
+
## Application workflows (400 cases each, public sources)
|
| 15 |
+
|
| 16 |
+
| Suite | n | Acc 8B | Acc 3B | Macro-F1 8B | Macro-F1 3B | ECE 8B | ECE 3B |
|
| 17 |
+
|---|---|---|---|---|---|---|---|
|
| 18 |
+
| Email spam | 400 | 87.2 | 91.8 | 87.2 | 91.7 | 0.038 | 0.054 |
|
| 19 |
+
| Phishing | 400 | 84.8 | 89.5 | 82.5 | 88.4 | 0.064 | 0.042 |
|
| 20 |
+
| LLM guardrails (jailbreak vs benign) | 400 | 58.0 | 63.0 | 56.9 | 61.0 | 0.198 | 0.139 |
|
| 21 |
+
| Moderation (toxic vs benign) | 400 | 82.5 | 78.8 | 82.5 | 78.5 | 0.047 | 0.080 |
|
| 22 |
+
| RAG passage relevance | 400 | 60.5 | 57.2 | 57.5 | 53.4 | 0.310 | 0.292 |
|
| 23 |
+
| Support triage (10 queues) | 400 | 34.0 | 40.2 | 35.0 | 37.5 | 0.463 | 0.301 |
|
| 24 |
+
| Model routing (domain) | 399 | 92.7 | 87.2 | 47.0 | 45.7 | 0.042 | 0.042 |
|
| 25 |
+
|
| 26 |
+
## MASSIVE intent, 20 options (chance = 5 %)
|
| 27 |
+
|
| 28 |
+
| Language | n | Acc 8B | Acc 3B | Macro-F1 8B | Macro-F1 3B | ECE 8B | ECE 3B |
|
| 29 |
+
|---|---|---|---|---|---|---|---|
|
| 30 |
+
| en | 400 | 88.0 | 85.8 | 61.3 | 55.5 | 0.025 | 0.058 |
|
| 31 |
+
| ja | 400 | 87.5 | 85.8 | 62.0 | 62.9 | 0.024 | 0.035 |
|
| 32 |
+
| zh | 400 | 88.0 | 85.5 | 67.5 | 60.0 | 0.030 | 0.057 |
|
| 33 |
+
| es | 400 | 82.5 | 82.0 | 59.0 | 52.8 | 0.020 | 0.043 |
|
| 34 |
+
| fr | 400 | 85.8 | 84.5 | 59.9 | 56.7 | 0.034 | 0.061 |
|
| 35 |
+
| de | 400 | 86.0 | 84.5 | 59.9 | 56.2 | 0.022 | 0.043 |
|
| 36 |
+
| pt | 400 | 84.5 | 81.5 | 50.4 | 51.3 | 0.030 | 0.045 |
|
| 37 |
+
| ru | 400 | 85.8 | 82.5 | 61.3 | 58.2 | 0.026 | 0.041 |
|
| 38 |
+
| ko | 400 | 89.2 | 84.2 | 67.6 | 59.4 | 0.034 | 0.035 |
|
| 39 |
+
|
| 40 |
+
## XNLI, 3 labels
|
| 41 |
+
|
| 42 |
+
| Language | n | Acc 8B | Acc 3B | Macro-F1 8B | Macro-F1 3B | ECE 8B | ECE 3B |
|
| 43 |
+
|---|---|---|---|---|---|---|---|
|
| 44 |
+
| en | 400 | 65.0 | 67.8 | 65.3 | 66.3 | 0.126 | 0.094 |
|
| 45 |
+
| es | 400 | 58.2 | 63.5 | 58.0 | 62.4 | 0.170 | 0.077 |
|
| 46 |
+
| fr | 400 | 63.5 | 64.8 | 63.1 | 63.9 | 0.137 | 0.092 |
|
| 47 |
+
| de | 400 | 61.8 | 60.8 | 61.6 | 60.1 | 0.147 | 0.054 |
|
| 48 |
+
| ru | 400 | 58.0 | 60.2 | 57.0 | 59.1 | 0.196 | 0.053 |
|
| 49 |
+
| zh | 400 | 62.0 | 56.2 | 61.6 | 55.6 | 0.159 | 0.032 |
|
| 50 |
+
|
| 51 |
+
## Option-order robustness
|
| 52 |
+
|
| 53 |
+
Share of cases whose answer changes when the options are presented in a permuted order (lower is better).
|
| 54 |
+
|
| 55 |
+
| Suite | 8B | 3B |
|
| 56 |
+
|---|---|---|
|
| 57 |
+
| AG News (4 topics) | 0.035 | 0.028 |
|
| 58 |
+
| DAIR Emotion (6 labels) | 0.068 | 0.160 |
|
| 59 |
+
| massive_intent.en | 0.122 | 0.125 |
|
| 60 |
+
|
| 61 |
+
SST-5 score MAE on the 0–4 scale: 8B 0.563, 3B 0.655.
|
evidence/calibration-leaderboard-ablate-nosys.json
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"arm_fitted": "original",
|
| 3 |
+
"inputs": [
|
| 4 |
+
"runs/ablate-final3b-nosys/predictions.jsonl"
|
| 5 |
+
],
|
| 6 |
+
"fit_suites": [
|
| 7 |
+
"distprob-calib-v2",
|
| 8 |
+
"internal-eval-hardproxy-calib-v1"
|
| 9 |
+
],
|
| 10 |
+
"temperature": 1.3,
|
| 11 |
+
"objective": "leaderboard",
|
| 12 |
+
"axis_proxy_at_T1": 85.34441046550333,
|
| 13 |
+
"axis_proxy_at_T": 88.60090642532538,
|
| 14 |
+
"at_T1": {
|
| 15 |
+
"jevbench-easy": {
|
| 16 |
+
"original": {
|
| 17 |
+
"questions": 48,
|
| 18 |
+
"accuracy": 1.0,
|
| 19 |
+
"ece_10bin": 0.0018748964085212687,
|
| 20 |
+
"calibration_axis_ece_part": 99.62502071829574
|
| 21 |
+
},
|
| 22 |
+
"rotation": {
|
| 23 |
+
"questions": 48,
|
| 24 |
+
"accuracy": 1.0,
|
| 25 |
+
"ece_10bin": 0.0018748964085212687,
|
| 26 |
+
"calibration_axis_ece_part": 99.62502071829574
|
| 27 |
+
}
|
| 28 |
+
},
|
| 29 |
+
"jevbench-original": {
|
| 30 |
+
"original": {
|
| 31 |
+
"questions": 72,
|
| 32 |
+
"accuracy": 0.9166666666666666,
|
| 33 |
+
"ece_10bin": 0.07102508567572954,
|
| 34 |
+
"calibration_axis_ece_part": 85.79498286485409
|
| 35 |
+
},
|
| 36 |
+
"rotation": {
|
| 37 |
+
"questions": 72,
|
| 38 |
+
"accuracy": 0.9166666666666666,
|
| 39 |
+
"ece_10bin": 0.07102508567572954,
|
| 40 |
+
"calibration_axis_ece_part": 85.79498286485409
|
| 41 |
+
}
|
| 42 |
+
},
|
| 43 |
+
"jevbench-hard": {
|
| 44 |
+
"original": {
|
| 45 |
+
"questions": 111,
|
| 46 |
+
"accuracy": 0.4954954954954955,
|
| 47 |
+
"ece_10bin": 0.2444415956193727,
|
| 48 |
+
"calibration_axis_ece_part": 51.111680876125455
|
| 49 |
+
},
|
| 50 |
+
"rotation": {
|
| 51 |
+
"questions": 111,
|
| 52 |
+
"accuracy": 0.4954954954954955,
|
| 53 |
+
"ece_10bin": 0.2444415956193727,
|
| 54 |
+
"calibration_axis_ece_part": 51.111680876125455
|
| 55 |
+
}
|
| 56 |
+
},
|
| 57 |
+
"judge-proxy-v1": {
|
| 58 |
+
"original": {
|
| 59 |
+
"questions": 600,
|
| 60 |
+
"accuracy": 0.8566666666666667,
|
| 61 |
+
"ece_10bin": 0.06232230220956217,
|
| 62 |
+
"calibration_axis_ece_part": 87.53553955808758
|
| 63 |
+
},
|
| 64 |
+
"rotation": {
|
| 65 |
+
"questions": 600,
|
| 66 |
+
"accuracy": 0.8566666666666667,
|
| 67 |
+
"ece_10bin": 0.06232230220956217,
|
| 68 |
+
"calibration_axis_ece_part": 87.53553955808758
|
| 69 |
+
}
|
| 70 |
+
},
|
| 71 |
+
"internal-eval-hardproxy-v1": {
|
| 72 |
+
"original": {
|
| 73 |
+
"questions": 600,
|
| 74 |
+
"accuracy": 0.44,
|
| 75 |
+
"ece_10bin": 0.0929088833737751,
|
| 76 |
+
"calibration_axis_ece_part": 81.41822332524498
|
| 77 |
+
},
|
| 78 |
+
"rotation": {
|
| 79 |
+
"questions": 600,
|
| 80 |
+
"accuracy": 0.44,
|
| 81 |
+
"ece_10bin": 0.0929088833737751,
|
| 82 |
+
"calibration_axis_ece_part": 81.41822332524498
|
| 83 |
+
}
|
| 84 |
+
},
|
| 85 |
+
"internal-eval-hardproxy-calib-v1": {
|
| 86 |
+
"original": {
|
| 87 |
+
"questions": 600,
|
| 88 |
+
"accuracy": 0.4683333333333333,
|
| 89 |
+
"ece_10bin": 0.0668145573567345,
|
| 90 |
+
"calibration_axis_ece_part": 86.63708852865311
|
| 91 |
+
},
|
| 92 |
+
"rotation": {
|
| 93 |
+
"questions": 600,
|
| 94 |
+
"accuracy": 0.4683333333333333,
|
| 95 |
+
"ece_10bin": 0.0668145573567345,
|
| 96 |
+
"calibration_axis_ece_part": 86.63708852865311
|
| 97 |
+
}
|
| 98 |
+
},
|
| 99 |
+
"distprob-calib-v2": {
|
| 100 |
+
"original": {
|
| 101 |
+
"questions": 916,
|
| 102 |
+
"accuracy": 0.7925764192139738,
|
| 103 |
+
"ece_10bin": 0.18166524599524145,
|
| 104 |
+
"calibration_axis_ece_part": 63.6669508009517,
|
| 105 |
+
"probability_items": 916,
|
| 106 |
+
"mean_tv_distance": 0.1594826759764644,
|
| 107 |
+
"fidelity_part": 84.05173240235357,
|
| 108 |
+
"calibration_axis_estimate": 73.85934160165263
|
| 109 |
+
},
|
| 110 |
+
"rotation": {
|
| 111 |
+
"questions": 916,
|
| 112 |
+
"accuracy": 0.7925764192139738,
|
| 113 |
+
"ece_10bin": 0.18166524599524145,
|
| 114 |
+
"calibration_axis_ece_part": 63.6669508009517,
|
| 115 |
+
"probability_items": 916,
|
| 116 |
+
"mean_tv_distance": 0.1594826759764644,
|
| 117 |
+
"fidelity_part": 84.05173240235357,
|
| 118 |
+
"calibration_axis_estimate": 73.85934160165263
|
| 119 |
+
}
|
| 120 |
+
},
|
| 121 |
+
"distprob-val-v2": {
|
| 122 |
+
"original": {
|
| 123 |
+
"questions": 1036,
|
| 124 |
+
"accuracy": 0.7972972972972973,
|
| 125 |
+
"ece_10bin": 0.18815120252393266,
|
| 126 |
+
"calibration_axis_ece_part": 62.36975949521346,
|
| 127 |
+
"probability_items": 1036,
|
| 128 |
+
"mean_tv_distance": 0.12080046492926981,
|
| 129 |
+
"fidelity_part": 87.91995350707302,
|
| 130 |
+
"calibration_axis_estimate": 75.14485650114324
|
| 131 |
+
},
|
| 132 |
+
"rotation": {
|
| 133 |
+
"questions": 1036,
|
| 134 |
+
"accuracy": 0.7972972972972973,
|
| 135 |
+
"ece_10bin": 0.18815120252393266,
|
| 136 |
+
"calibration_axis_ece_part": 62.36975949521346,
|
| 137 |
+
"probability_items": 1036,
|
| 138 |
+
"mean_tv_distance": 0.12080046492926981,
|
| 139 |
+
"fidelity_part": 87.91995350707302,
|
| 140 |
+
"calibration_axis_estimate": 75.14485650114324
|
| 141 |
+
}
|
| 142 |
+
},
|
| 143 |
+
"internal-eval-v2-realistic": {
|
| 144 |
+
"original": {
|
| 145 |
+
"questions": 600,
|
| 146 |
+
"accuracy": 0.8866666666666667,
|
| 147 |
+
"ece_10bin": 0.07163316371310577,
|
| 148 |
+
"calibration_axis_ece_part": 85.67336725737884,
|
| 149 |
+
"probability_items": 120,
|
| 150 |
+
"mean_tv_distance": 0.12894082495178552,
|
| 151 |
+
"fidelity_part": 87.10591750482145,
|
| 152 |
+
"calibration_axis_estimate": 86.38964238110015
|
| 153 |
+
},
|
| 154 |
+
"rotation": {
|
| 155 |
+
"questions": 600,
|
| 156 |
+
"accuracy": 0.8866666666666667,
|
| 157 |
+
"ece_10bin": 0.07163316371310577,
|
| 158 |
+
"calibration_axis_ece_part": 85.67336725737884,
|
| 159 |
+
"probability_items": 120,
|
| 160 |
+
"mean_tv_distance": 0.12894082495178552,
|
| 161 |
+
"fidelity_part": 87.10591750482145,
|
| 162 |
+
"calibration_axis_estimate": 86.38964238110015
|
| 163 |
+
}
|
| 164 |
+
}
|
| 165 |
+
},
|
| 166 |
+
"at_T": {
|
| 167 |
+
"jevbench-easy": {
|
| 168 |
+
"original": {
|
| 169 |
+
"questions": 48,
|
| 170 |
+
"accuracy": 1.0,
|
| 171 |
+
"ece_10bin": 0.006819216668603041,
|
| 172 |
+
"calibration_axis_ece_part": 98.63615666627939
|
| 173 |
+
},
|
| 174 |
+
"rotation": {
|
| 175 |
+
"questions": 48,
|
| 176 |
+
"accuracy": 1.0,
|
| 177 |
+
"ece_10bin": 0.006819216668603041,
|
| 178 |
+
"calibration_axis_ece_part": 98.63615666627939
|
| 179 |
+
}
|
| 180 |
+
},
|
| 181 |
+
"jevbench-original": {
|
| 182 |
+
"original": {
|
| 183 |
+
"questions": 72,
|
| 184 |
+
"accuracy": 0.9166666666666666,
|
| 185 |
+
"ece_10bin": 0.07749353079037855,
|
| 186 |
+
"calibration_axis_ece_part": 84.50129384192428
|
| 187 |
+
},
|
| 188 |
+
"rotation": {
|
| 189 |
+
"questions": 72,
|
| 190 |
+
"accuracy": 0.9166666666666666,
|
| 191 |
+
"ece_10bin": 0.07749353079037855,
|
| 192 |
+
"calibration_axis_ece_part": 84.50129384192428
|
| 193 |
+
}
|
| 194 |
+
},
|
| 195 |
+
"jevbench-hard": {
|
| 196 |
+
"original": {
|
| 197 |
+
"questions": 111,
|
| 198 |
+
"accuracy": 0.4954954954954955,
|
| 199 |
+
"ece_10bin": 0.18228644509614172,
|
| 200 |
+
"calibration_axis_ece_part": 63.54271098077165
|
| 201 |
+
},
|
| 202 |
+
"rotation": {
|
| 203 |
+
"questions": 111,
|
| 204 |
+
"accuracy": 0.4954954954954955,
|
| 205 |
+
"ece_10bin": 0.18228644509614172,
|
| 206 |
+
"calibration_axis_ece_part": 63.54271098077165
|
| 207 |
+
}
|
| 208 |
+
},
|
| 209 |
+
"judge-proxy-v1": {
|
| 210 |
+
"original": {
|
| 211 |
+
"questions": 600,
|
| 212 |
+
"accuracy": 0.8566666666666667,
|
| 213 |
+
"ece_10bin": 0.03179219593693721,
|
| 214 |
+
"calibration_axis_ece_part": 93.64156081261255
|
| 215 |
+
},
|
| 216 |
+
"rotation": {
|
| 217 |
+
"questions": 600,
|
| 218 |
+
"accuracy": 0.8566666666666667,
|
| 219 |
+
"ece_10bin": 0.03179219593693721,
|
| 220 |
+
"calibration_axis_ece_part": 93.64156081261255
|
| 221 |
+
}
|
| 222 |
+
},
|
| 223 |
+
"internal-eval-hardproxy-v1": {
|
| 224 |
+
"original": {
|
| 225 |
+
"questions": 600,
|
| 226 |
+
"accuracy": 0.44,
|
| 227 |
+
"ece_10bin": 0.052255175773237995,
|
| 228 |
+
"calibration_axis_ece_part": 89.5489648453524
|
| 229 |
+
},
|
| 230 |
+
"rotation": {
|
| 231 |
+
"questions": 600,
|
| 232 |
+
"accuracy": 0.44,
|
| 233 |
+
"ece_10bin": 0.052255175773237995,
|
| 234 |
+
"calibration_axis_ece_part": 89.5489648453524
|
| 235 |
+
}
|
| 236 |
+
},
|
| 237 |
+
"internal-eval-hardproxy-calib-v1": {
|
| 238 |
+
"original": {
|
| 239 |
+
"questions": 600,
|
| 240 |
+
"accuracy": 0.4683333333333333,
|
| 241 |
+
"ece_10bin": 0.028497932213315664,
|
| 242 |
+
"calibration_axis_ece_part": 94.30041355733687
|
| 243 |
+
},
|
| 244 |
+
"rotation": {
|
| 245 |
+
"questions": 600,
|
| 246 |
+
"accuracy": 0.4683333333333333,
|
| 247 |
+
"ece_10bin": 0.028497932213315664,
|
| 248 |
+
"calibration_axis_ece_part": 94.30041355733687
|
| 249 |
+
}
|
| 250 |
+
},
|
| 251 |
+
"distprob-calib-v2": {
|
| 252 |
+
"original": {
|
| 253 |
+
"questions": 916,
|
| 254 |
+
"accuracy": 0.7925764192139738,
|
| 255 |
+
"ece_10bin": 0.22110326195148225,
|
| 256 |
+
"calibration_axis_ece_part": 55.77934760970356,
|
| 257 |
+
"probability_items": 916,
|
| 258 |
+
"mean_tv_distance": 0.17098600706686123,
|
| 259 |
+
"fidelity_part": 82.90139929331389,
|
| 260 |
+
"calibration_axis_estimate": 69.34037345150873
|
| 261 |
+
},
|
| 262 |
+
"rotation": {
|
| 263 |
+
"questions": 916,
|
| 264 |
+
"accuracy": 0.7925764192139738,
|
| 265 |
+
"ece_10bin": 0.22110326195148225,
|
| 266 |
+
"calibration_axis_ece_part": 55.77934760970356,
|
| 267 |
+
"probability_items": 916,
|
| 268 |
+
"mean_tv_distance": 0.17098600706686123,
|
| 269 |
+
"fidelity_part": 82.90139929331389,
|
| 270 |
+
"calibration_axis_estimate": 69.34037345150873
|
| 271 |
+
}
|
| 272 |
+
},
|
| 273 |
+
"distprob-val-v2": {
|
| 274 |
+
"original": {
|
| 275 |
+
"questions": 1036,
|
| 276 |
+
"accuracy": 0.7972972972972973,
|
| 277 |
+
"ece_10bin": 0.23073672294686529,
|
| 278 |
+
"calibration_axis_ece_part": 53.85265541062694,
|
| 279 |
+
"probability_items": 1036,
|
| 280 |
+
"mean_tv_distance": 0.13039772223878196,
|
| 281 |
+
"fidelity_part": 86.9602277761218,
|
| 282 |
+
"calibration_axis_estimate": 70.40644159337437
|
| 283 |
+
},
|
| 284 |
+
"rotation": {
|
| 285 |
+
"questions": 1036,
|
| 286 |
+
"accuracy": 0.7972972972972973,
|
| 287 |
+
"ece_10bin": 0.23073672294686529,
|
| 288 |
+
"calibration_axis_ece_part": 53.85265541062694,
|
| 289 |
+
"probability_items": 1036,
|
| 290 |
+
"mean_tv_distance": 0.13039772223878196,
|
| 291 |
+
"fidelity_part": 86.9602277761218,
|
| 292 |
+
"calibration_axis_estimate": 70.40644159337437
|
| 293 |
+
}
|
| 294 |
+
},
|
| 295 |
+
"internal-eval-v2-realistic": {
|
| 296 |
+
"original": {
|
| 297 |
+
"questions": 600,
|
| 298 |
+
"accuracy": 0.8866666666666667,
|
| 299 |
+
"ece_10bin": 0.10111166335309768,
|
| 300 |
+
"calibration_axis_ece_part": 79.77766732938046,
|
| 301 |
+
"probability_items": 120,
|
| 302 |
+
"mean_tv_distance": 0.1319216870666447,
|
| 303 |
+
"fidelity_part": 86.80783129333554,
|
| 304 |
+
"calibration_axis_estimate": 83.292749311358
|
| 305 |
+
},
|
| 306 |
+
"rotation": {
|
| 307 |
+
"questions": 600,
|
| 308 |
+
"accuracy": 0.8866666666666667,
|
| 309 |
+
"ece_10bin": 0.10111166335309768,
|
| 310 |
+
"calibration_axis_ece_part": 79.77766732938046,
|
| 311 |
+
"probability_items": 120,
|
| 312 |
+
"mean_tv_distance": 0.1319216870666447,
|
| 313 |
+
"fidelity_part": 86.80783129333554,
|
| 314 |
+
"calibration_axis_estimate": 83.292749311358
|
| 315 |
+
}
|
| 316 |
+
}
|
| 317 |
+
}
|
| 318 |
+
}
|
evidence/calibration-leaderboard-merged-native.json
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"arm_fitted": "original",
|
| 3 |
+
"inputs": [
|
| 4 |
+
"runs/merged-3b-native/predictions.jsonl"
|
| 5 |
+
],
|
| 6 |
+
"fit_suites": [
|
| 7 |
+
"distprob-calib-v2",
|
| 8 |
+
"internal-eval-hardproxy-calib-v1"
|
| 9 |
+
],
|
| 10 |
+
"temperature": 1.5,
|
| 11 |
+
"objective": "leaderboard",
|
| 12 |
+
"axis_proxy_at_T1": 85.42044135230344,
|
| 13 |
+
"axis_proxy_at_T": 88.14183810147179,
|
| 14 |
+
"at_T1": {
|
| 15 |
+
"jevbench-easy": {
|
| 16 |
+
"original": {
|
| 17 |
+
"questions": 48,
|
| 18 |
+
"accuracy": 1.0,
|
| 19 |
+
"ece_10bin": 0.0016624161117089937,
|
| 20 |
+
"calibration_axis_ece_part": 99.66751677765821
|
| 21 |
+
},
|
| 22 |
+
"rotation": {
|
| 23 |
+
"questions": 48,
|
| 24 |
+
"accuracy": 1.0,
|
| 25 |
+
"ece_10bin": 0.0016624161117089937,
|
| 26 |
+
"calibration_axis_ece_part": 99.66751677765821
|
| 27 |
+
}
|
| 28 |
+
},
|
| 29 |
+
"jevbench-original": {
|
| 30 |
+
"original": {
|
| 31 |
+
"questions": 72,
|
| 32 |
+
"accuracy": 0.9027777777777778,
|
| 33 |
+
"ece_10bin": 0.029791712502210094,
|
| 34 |
+
"calibration_axis_ece_part": 94.04165749955799
|
| 35 |
+
},
|
| 36 |
+
"rotation": {
|
| 37 |
+
"questions": 72,
|
| 38 |
+
"accuracy": 0.9027777777777778,
|
| 39 |
+
"ece_10bin": 0.029791712502210094,
|
| 40 |
+
"calibration_axis_ece_part": 94.04165749955799
|
| 41 |
+
}
|
| 42 |
+
},
|
| 43 |
+
"jevbench-hard": {
|
| 44 |
+
"original": {
|
| 45 |
+
"questions": 111,
|
| 46 |
+
"accuracy": 0.5135135135135135,
|
| 47 |
+
"ece_10bin": 0.23823396943984734,
|
| 48 |
+
"calibration_axis_ece_part": 52.353206112030534
|
| 49 |
+
},
|
| 50 |
+
"rotation": {
|
| 51 |
+
"questions": 111,
|
| 52 |
+
"accuracy": 0.5135135135135135,
|
| 53 |
+
"ece_10bin": 0.23823396943984734,
|
| 54 |
+
"calibration_axis_ece_part": 52.353206112030534
|
| 55 |
+
}
|
| 56 |
+
},
|
| 57 |
+
"judge-proxy-v1": {
|
| 58 |
+
"original": {
|
| 59 |
+
"questions": 600,
|
| 60 |
+
"accuracy": 0.87,
|
| 61 |
+
"ece_10bin": 0.040704387200682556,
|
| 62 |
+
"calibration_axis_ece_part": 91.8591225598635
|
| 63 |
+
},
|
| 64 |
+
"rotation": {
|
| 65 |
+
"questions": 600,
|
| 66 |
+
"accuracy": 0.87,
|
| 67 |
+
"ece_10bin": 0.040704387200682556,
|
| 68 |
+
"calibration_axis_ece_part": 91.8591225598635
|
| 69 |
+
}
|
| 70 |
+
},
|
| 71 |
+
"internal-eval-hardproxy-calib-v1": {
|
| 72 |
+
"original": {
|
| 73 |
+
"questions": 600,
|
| 74 |
+
"accuracy": 0.475,
|
| 75 |
+
"ece_10bin": 0.06795799130970562,
|
| 76 |
+
"calibration_axis_ece_part": 86.40840173805888
|
| 77 |
+
},
|
| 78 |
+
"rotation": {
|
| 79 |
+
"questions": 600,
|
| 80 |
+
"accuracy": 0.475,
|
| 81 |
+
"ece_10bin": 0.06795799130970562,
|
| 82 |
+
"calibration_axis_ece_part": 86.40840173805888
|
| 83 |
+
}
|
| 84 |
+
},
|
| 85 |
+
"distprob-calib-v2": {
|
| 86 |
+
"original": {
|
| 87 |
+
"questions": 916,
|
| 88 |
+
"accuracy": 0.7827510917030568,
|
| 89 |
+
"ece_10bin": 0.16288129692265946,
|
| 90 |
+
"calibration_axis_ece_part": 67.4237406154681,
|
| 91 |
+
"probability_items": 916,
|
| 92 |
+
"mean_tv_distance": 0.1556751903345202,
|
| 93 |
+
"fidelity_part": 84.43248096654798,
|
| 94 |
+
"calibration_axis_estimate": 75.92811079100804
|
| 95 |
+
},
|
| 96 |
+
"rotation": {
|
| 97 |
+
"questions": 916,
|
| 98 |
+
"accuracy": 0.7827510917030568,
|
| 99 |
+
"ece_10bin": 0.16288129692265946,
|
| 100 |
+
"calibration_axis_ece_part": 67.4237406154681,
|
| 101 |
+
"probability_items": 916,
|
| 102 |
+
"mean_tv_distance": 0.1556751903345202,
|
| 103 |
+
"fidelity_part": 84.43248096654798,
|
| 104 |
+
"calibration_axis_estimate": 75.92811079100804
|
| 105 |
+
}
|
| 106 |
+
}
|
| 107 |
+
},
|
| 108 |
+
"at_T": {
|
| 109 |
+
"jevbench-easy": {
|
| 110 |
+
"original": {
|
| 111 |
+
"questions": 48,
|
| 112 |
+
"accuracy": 1.0,
|
| 113 |
+
"ece_10bin": 0.01212479121865218,
|
| 114 |
+
"calibration_axis_ece_part": 97.57504175626957
|
| 115 |
+
},
|
| 116 |
+
"rotation": {
|
| 117 |
+
"questions": 48,
|
| 118 |
+
"accuracy": 1.0,
|
| 119 |
+
"ece_10bin": 0.01212479121865218,
|
| 120 |
+
"calibration_axis_ece_part": 97.57504175626957
|
| 121 |
+
}
|
| 122 |
+
},
|
| 123 |
+
"jevbench-original": {
|
| 124 |
+
"original": {
|
| 125 |
+
"questions": 72,
|
| 126 |
+
"accuracy": 0.9027777777777778,
|
| 127 |
+
"ece_10bin": 0.09724393334626145,
|
| 128 |
+
"calibration_axis_ece_part": 80.5512133307477
|
| 129 |
+
},
|
| 130 |
+
"rotation": {
|
| 131 |
+
"questions": 72,
|
| 132 |
+
"accuracy": 0.9027777777777778,
|
| 133 |
+
"ece_10bin": 0.09724393334626145,
|
| 134 |
+
"calibration_axis_ece_part": 80.5512133307477
|
| 135 |
+
}
|
| 136 |
+
},
|
| 137 |
+
"jevbench-hard": {
|
| 138 |
+
"original": {
|
| 139 |
+
"questions": 111,
|
| 140 |
+
"accuracy": 0.5135135135135135,
|
| 141 |
+
"ece_10bin": 0.17510273140034285,
|
| 142 |
+
"calibration_axis_ece_part": 64.97945371993143
|
| 143 |
+
},
|
| 144 |
+
"rotation": {
|
| 145 |
+
"questions": 111,
|
| 146 |
+
"accuracy": 0.5135135135135135,
|
| 147 |
+
"ece_10bin": 0.17510273140034285,
|
| 148 |
+
"calibration_axis_ece_part": 64.97945371993143
|
| 149 |
+
}
|
| 150 |
+
},
|
| 151 |
+
"judge-proxy-v1": {
|
| 152 |
+
"original": {
|
| 153 |
+
"questions": 600,
|
| 154 |
+
"accuracy": 0.87,
|
| 155 |
+
"ece_10bin": 0.03615621129247121,
|
| 156 |
+
"calibration_axis_ece_part": 92.76875774150575
|
| 157 |
+
},
|
| 158 |
+
"rotation": {
|
| 159 |
+
"questions": 600,
|
| 160 |
+
"accuracy": 0.87,
|
| 161 |
+
"ece_10bin": 0.03615621129247121,
|
| 162 |
+
"calibration_axis_ece_part": 92.76875774150575
|
| 163 |
+
}
|
| 164 |
+
},
|
| 165 |
+
"internal-eval-hardproxy-calib-v1": {
|
| 166 |
+
"original": {
|
| 167 |
+
"questions": 600,
|
| 168 |
+
"accuracy": 0.475,
|
| 169 |
+
"ece_10bin": 0.030585414443062297,
|
| 170 |
+
"calibration_axis_ece_part": 93.88291711138754
|
| 171 |
+
},
|
| 172 |
+
"rotation": {
|
| 173 |
+
"questions": 600,
|
| 174 |
+
"accuracy": 0.475,
|
| 175 |
+
"ece_10bin": 0.030585414443062297,
|
| 176 |
+
"calibration_axis_ece_part": 93.88291711138754
|
| 177 |
+
}
|
| 178 |
+
},
|
| 179 |
+
"distprob-calib-v2": {
|
| 180 |
+
"original": {
|
| 181 |
+
"questions": 916,
|
| 182 |
+
"accuracy": 0.7827510917030568,
|
| 183 |
+
"ece_10bin": 0.22864736346190892,
|
| 184 |
+
"calibration_axis_ece_part": 54.27052730761821,
|
| 185 |
+
"probability_items": 916,
|
| 186 |
+
"mean_tv_distance": 0.17599240908443944,
|
| 187 |
+
"fidelity_part": 82.40075909155605,
|
| 188 |
+
"calibration_axis_estimate": 68.33564319958714
|
| 189 |
+
},
|
| 190 |
+
"rotation": {
|
| 191 |
+
"questions": 916,
|
| 192 |
+
"accuracy": 0.7827510917030568,
|
| 193 |
+
"ece_10bin": 0.22864736346190892,
|
| 194 |
+
"calibration_axis_ece_part": 54.27052730761821,
|
| 195 |
+
"probability_items": 916,
|
| 196 |
+
"mean_tv_distance": 0.17599240908443944,
|
| 197 |
+
"fidelity_part": 82.40075909155605,
|
| 198 |
+
"calibration_axis_estimate": 68.33564319958714
|
| 199 |
+
}
|
| 200 |
+
}
|
| 201 |
+
}
|
| 202 |
+
}
|
evidence/served-nosys-easy-report.json
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"status": "complete",
|
| 3 |
+
"requested_records": 48,
|
| 4 |
+
"requested_questions": 48,
|
| 5 |
+
"attempted_requests": 48,
|
| 6 |
+
"successful_requests": 48,
|
| 7 |
+
"errors": 0,
|
| 8 |
+
"served_models": [
|
| 9 |
+
"decision-model"
|
| 10 |
+
],
|
| 11 |
+
"elapsed_measurement_s": 1.120218633004697,
|
| 12 |
+
"requests_per_second": 42.84877843109287,
|
| 13 |
+
"questions_per_second": 42.84877843109287,
|
| 14 |
+
"latency_ms": {
|
| 15 |
+
"n": 48,
|
| 16 |
+
"mean": 23.234710584802087,
|
| 17 |
+
"p50": 22.789281996665522,
|
| 18 |
+
"p95": 27.86436639871681,
|
| 19 |
+
"p99": 31.33449414919596
|
| 20 |
+
},
|
| 21 |
+
"adapter_ms": {
|
| 22 |
+
"n": 48,
|
| 23 |
+
"mean": 21.890798979560106,
|
| 24 |
+
"p50": 21.413121503428556,
|
| 25 |
+
"p95": 26.402303371287417,
|
| 26 |
+
"p99": 30.082574323459994
|
| 27 |
+
},
|
| 28 |
+
"input_tokens_per_request": {
|
| 29 |
+
"n": 48,
|
| 30 |
+
"mean": 109.33333333333333,
|
| 31 |
+
"p50": 113.5,
|
| 32 |
+
"p95": 133.3,
|
| 33 |
+
"p99": 135.59
|
| 34 |
+
},
|
| 35 |
+
"suites": {
|
| 36 |
+
"jevbench-easy/public": {
|
| 37 |
+
"clean": {
|
| 38 |
+
"n": 48,
|
| 39 |
+
"acc": 1.0,
|
| 40 |
+
"nll": 0.0017789755673829387,
|
| 41 |
+
"brier": 4.807367058120001e-05,
|
| 42 |
+
"ece": 0.0017633189725172471,
|
| 43 |
+
"mean_conf": 0.9982366810274828,
|
| 44 |
+
"confidence_bias": -0.0017633189725172471,
|
| 45 |
+
"confident_error_rate": 0.0,
|
| 46 |
+
"coverage_at_0_9": 1.0,
|
| 47 |
+
"accuracy_at_0_9": 1.0,
|
| 48 |
+
"coverage_at_5pct_error": 1.0,
|
| 49 |
+
"coverage_at_1pct_error": 1.0
|
| 50 |
+
},
|
| 51 |
+
"tasks": {
|
| 52 |
+
"extraction": {
|
| 53 |
+
"n": 12,
|
| 54 |
+
"acc": 1.0,
|
| 55 |
+
"nll": 0.003626219592460447,
|
| 56 |
+
"brier": 0.00011029343263911612,
|
| 57 |
+
"ece": 0.0035859255722816563,
|
| 58 |
+
"mean_conf": 0.9964140744277183,
|
| 59 |
+
"confidence_bias": -0.0035859255722816563,
|
| 60 |
+
"confident_error_rate": 0.0,
|
| 61 |
+
"coverage_at_0_9": 1.0,
|
| 62 |
+
"accuracy_at_0_9": 1.0,
|
| 63 |
+
"coverage_at_5pct_error": 1.0,
|
| 64 |
+
"coverage_at_1pct_error": 1.0
|
| 65 |
+
},
|
| 66 |
+
"fact": {
|
| 67 |
+
"n": 12,
|
| 68 |
+
"acc": 1.0,
|
| 69 |
+
"nll": 0.002241130474217068,
|
| 70 |
+
"brier": 7.005642102392954e-05,
|
| 71 |
+
"ece": 0.002223378978578716,
|
| 72 |
+
"mean_conf": 0.9977766210214213,
|
| 73 |
+
"confidence_bias": -0.002223378978578716,
|
| 74 |
+
"confident_error_rate": 0.0,
|
| 75 |
+
"coverage_at_0_9": 1.0,
|
| 76 |
+
"accuracy_at_0_9": 1.0,
|
| 77 |
+
"coverage_at_5pct_error": 1.0,
|
| 78 |
+
"coverage_at_1pct_error": 1.0
|
| 79 |
+
},
|
| 80 |
+
"intent": {
|
| 81 |
+
"n": 12,
|
| 82 |
+
"acc": 1.0,
|
| 83 |
+
"nll": 0.0010573720877922199,
|
| 84 |
+
"brier": 1.175346410816985e-05,
|
| 85 |
+
"ece": 0.0010528560188417524,
|
| 86 |
+
"mean_conf": 0.9989471439811582,
|
| 87 |
+
"confidence_bias": -0.0010528560188417524,
|
| 88 |
+
"confident_error_rate": 0.0,
|
| 89 |
+
"coverage_at_0_9": 1.0,
|
| 90 |
+
"accuracy_at_0_9": 1.0,
|
| 91 |
+
"coverage_at_5pct_error": 1.0,
|
| 92 |
+
"coverage_at_1pct_error": 1.0
|
| 93 |
+
},
|
| 94 |
+
"tool_selection": {
|
| 95 |
+
"n": 12,
|
| 96 |
+
"acc": 1.0,
|
| 97 |
+
"nll": 0.00019118011506202054,
|
| 98 |
+
"brier": 1.9136455358453179e-07,
|
| 99 |
+
"ece": 0.0001911153203667526,
|
| 100 |
+
"mean_conf": 0.9998088846796332,
|
| 101 |
+
"confidence_bias": -0.0001911153203667526,
|
| 102 |
+
"confident_error_rate": 0.0,
|
| 103 |
+
"coverage_at_0_9": 1.0,
|
| 104 |
+
"accuracy_at_0_9": 1.0,
|
| 105 |
+
"coverage_at_5pct_error": 1.0,
|
| 106 |
+
"coverage_at_1pct_error": 1.0
|
| 107 |
+
}
|
| 108 |
+
},
|
| 109 |
+
"sources": {
|
| 110 |
+
"extraction": {
|
| 111 |
+
"n": 12,
|
| 112 |
+
"acc": 1.0,
|
| 113 |
+
"nll": 0.003626219592460447,
|
| 114 |
+
"brier": 0.00011029343263911612,
|
| 115 |
+
"ece": 0.0035859255722816563,
|
| 116 |
+
"mean_conf": 0.9964140744277183,
|
| 117 |
+
"confidence_bias": -0.0035859255722816563,
|
| 118 |
+
"confident_error_rate": 0.0,
|
| 119 |
+
"coverage_at_0_9": 1.0,
|
| 120 |
+
"accuracy_at_0_9": 1.0,
|
| 121 |
+
"coverage_at_5pct_error": 1.0,
|
| 122 |
+
"coverage_at_1pct_error": 1.0
|
| 123 |
+
},
|
| 124 |
+
"fact": {
|
| 125 |
+
"n": 12,
|
| 126 |
+
"acc": 1.0,
|
| 127 |
+
"nll": 0.002241130474217068,
|
| 128 |
+
"brier": 7.005642102392954e-05,
|
| 129 |
+
"ece": 0.002223378978578716,
|
| 130 |
+
"mean_conf": 0.9977766210214213,
|
| 131 |
+
"confidence_bias": -0.002223378978578716,
|
| 132 |
+
"confident_error_rate": 0.0,
|
| 133 |
+
"coverage_at_0_9": 1.0,
|
| 134 |
+
"accuracy_at_0_9": 1.0,
|
| 135 |
+
"coverage_at_5pct_error": 1.0,
|
| 136 |
+
"coverage_at_1pct_error": 1.0
|
| 137 |
+
},
|
| 138 |
+
"intent": {
|
| 139 |
+
"n": 12,
|
| 140 |
+
"acc": 1.0,
|
| 141 |
+
"nll": 0.0010573720877922199,
|
| 142 |
+
"brier": 1.175346410816985e-05,
|
| 143 |
+
"ece": 0.0010528560188417524,
|
| 144 |
+
"mean_conf": 0.9989471439811582,
|
| 145 |
+
"confidence_bias": -0.0010528560188417524,
|
| 146 |
+
"confident_error_rate": 0.0,
|
| 147 |
+
"coverage_at_0_9": 1.0,
|
| 148 |
+
"accuracy_at_0_9": 1.0,
|
| 149 |
+
"coverage_at_5pct_error": 1.0,
|
| 150 |
+
"coverage_at_1pct_error": 1.0
|
| 151 |
+
},
|
| 152 |
+
"tool_selection": {
|
| 153 |
+
"n": 12,
|
| 154 |
+
"acc": 1.0,
|
| 155 |
+
"nll": 0.00019118011506202054,
|
| 156 |
+
"brier": 1.9136455358453179e-07,
|
| 157 |
+
"ece": 0.0001911153203667526,
|
| 158 |
+
"mean_conf": 0.9998088846796332,
|
| 159 |
+
"confidence_bias": -0.0001911153203667526,
|
| 160 |
+
"confident_error_rate": 0.0,
|
| 161 |
+
"coverage_at_0_9": 1.0,
|
| 162 |
+
"accuracy_at_0_9": 1.0,
|
| 163 |
+
"coverage_at_5pct_error": 1.0,
|
| 164 |
+
"coverage_at_1pct_error": 1.0
|
| 165 |
+
}
|
| 166 |
+
},
|
| 167 |
+
"variants": {
|
| 168 |
+
"clean": {
|
| 169 |
+
"n": 48,
|
| 170 |
+
"acc": 1.0,
|
| 171 |
+
"nll": 0.0017789755673829387,
|
| 172 |
+
"brier": 4.807367058120001e-05,
|
| 173 |
+
"ece": 0.0017633189725172471,
|
| 174 |
+
"mean_conf": 0.9982366810274828,
|
| 175 |
+
"confidence_bias": -0.0017633189725172471,
|
| 176 |
+
"confident_error_rate": 0.0,
|
| 177 |
+
"coverage_at_0_9": 1.0,
|
| 178 |
+
"accuracy_at_0_9": 1.0,
|
| 179 |
+
"coverage_at_5pct_error": 1.0,
|
| 180 |
+
"coverage_at_1pct_error": 1.0
|
| 181 |
+
}
|
| 182 |
+
},
|
| 183 |
+
"macro_task_acc": 1.0,
|
| 184 |
+
"objective": -0.001778975567382939,
|
| 185 |
+
"paired_flip": {
|
| 186 |
+
"pairs": 0,
|
| 187 |
+
"incomplete_pairs": 0,
|
| 188 |
+
"flip_rate": null,
|
| 189 |
+
"both_correct_rate": null,
|
| 190 |
+
"invariant_pairs": 0,
|
| 191 |
+
"invariant_both_correct_rate": null,
|
| 192 |
+
"invariance_rate": null
|
| 193 |
+
},
|
| 194 |
+
"reference_distribution": null,
|
| 195 |
+
"unknowable": null,
|
| 196 |
+
"permutation": {
|
| 197 |
+
"n": 0,
|
| 198 |
+
"missing_parents": 0,
|
| 199 |
+
"flip_rate": null,
|
| 200 |
+
"mean_max_delta": null
|
| 201 |
+
},
|
| 202 |
+
"metric_policy": {
|
| 203 |
+
"nll_floor": 1e-09,
|
| 204 |
+
"ece_bins": 10,
|
| 205 |
+
"confidence_for_calibration": "maximum label probability",
|
| 206 |
+
"calibration_applied": false,
|
| 207 |
+
"unknown_accuracy_excluded": true,
|
| 208 |
+
"coverage_error_budget_is_retrospective": true,
|
| 209 |
+
"raw_sums_outside_1e_5": 0,
|
| 210 |
+
"returned_zeros": 0
|
| 211 |
+
},
|
| 212 |
+
"latency_ms": {
|
| 213 |
+
"n": 48,
|
| 214 |
+
"mean": 23.234710584802087,
|
| 215 |
+
"p50": 22.789281996665522,
|
| 216 |
+
"p95": 27.86436639871681,
|
| 217 |
+
"p99": 31.33449414919596
|
| 218 |
+
}
|
| 219 |
+
}
|
| 220 |
+
},
|
| 221 |
+
"latency_scope": "client HTTP wall time, excluding queue before dispatch; NOT GPU kernel time",
|
| 222 |
+
"partial_dataset": false
|
| 223 |
+
}
|
evidence/served-nosys-hard-report.json
ADDED
|
@@ -0,0 +1,421 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"status": "complete",
|
| 3 |
+
"requested_records": 111,
|
| 4 |
+
"requested_questions": 111,
|
| 5 |
+
"attempted_requests": 111,
|
| 6 |
+
"successful_requests": 111,
|
| 7 |
+
"errors": 0,
|
| 8 |
+
"served_models": [
|
| 9 |
+
"decision-model"
|
| 10 |
+
],
|
| 11 |
+
"elapsed_measurement_s": 3.5634483199974056,
|
| 12 |
+
"requests_per_second": 31.14960286559756,
|
| 13 |
+
"questions_per_second": 31.14960286559756,
|
| 14 |
+
"latency_ms": {
|
| 15 |
+
"n": 111,
|
| 16 |
+
"mean": 31.97643356628481,
|
| 17 |
+
"p50": 26.17260901024565,
|
| 18 |
+
"p95": 50.40793698572088,
|
| 19 |
+
"p99": 60.8419331139885
|
| 20 |
+
},
|
| 21 |
+
"adapter_ms": {
|
| 22 |
+
"n": 111,
|
| 23 |
+
"mean": 30.40883497378017,
|
| 24 |
+
"p50": 24.645024997880682,
|
| 25 |
+
"p95": 48.79910999443382,
|
| 26 |
+
"p99": 59.05504081456457
|
| 27 |
+
},
|
| 28 |
+
"input_tokens_per_request": {
|
| 29 |
+
"n": 111,
|
| 30 |
+
"mean": 1242.2252252252251,
|
| 31 |
+
"p50": 605.0,
|
| 32 |
+
"p95": 3300.5,
|
| 33 |
+
"p99": 3618.9
|
| 34 |
+
},
|
| 35 |
+
"suites": {
|
| 36 |
+
"jevbench-hard/public": {
|
| 37 |
+
"clean": {
|
| 38 |
+
"n": 111,
|
| 39 |
+
"acc": 0.4864864864864865,
|
| 40 |
+
"nll": 1.2210790654837587,
|
| 41 |
+
"brier": 0.6754949211362803,
|
| 42 |
+
"ece": 0.22721326697517824,
|
| 43 |
+
"mean_conf": 0.7136997534616648,
|
| 44 |
+
"confidence_bias": 0.2272132669751783,
|
| 45 |
+
"confident_error_rate": 0.0990990990990991,
|
| 46 |
+
"coverage_at_0_9": 0.27927927927927926,
|
| 47 |
+
"accuracy_at_0_9": 0.6451612903225806,
|
| 48 |
+
"coverage_at_5pct_error": 0.0990990990990991,
|
| 49 |
+
"coverage_at_1pct_error": 0.0990990990990991,
|
| 50 |
+
"score_mae": 0.6476665946070091,
|
| 51 |
+
"ranked_probability_score": 0.18348001503670752
|
| 52 |
+
},
|
| 53 |
+
"tasks": {
|
| 54 |
+
"adversarial": {
|
| 55 |
+
"n": 6,
|
| 56 |
+
"acc": 1.0,
|
| 57 |
+
"nll": 0.35251123143079216,
|
| 58 |
+
"brier": 0.20041343565378164,
|
| 59 |
+
"ece": 0.26837694440376436,
|
| 60 |
+
"mean_conf": 0.7316230555962356,
|
| 61 |
+
"confidence_bias": -0.26837694440376436,
|
| 62 |
+
"confident_error_rate": 0.0,
|
| 63 |
+
"coverage_at_0_9": 0.3333333333333333,
|
| 64 |
+
"accuracy_at_0_9": 1.0,
|
| 65 |
+
"coverage_at_5pct_error": 1.0,
|
| 66 |
+
"coverage_at_1pct_error": 1.0,
|
| 67 |
+
"score_mae": 0.3523800709707958,
|
| 68 |
+
"ranked_probability_score": 0.04304514044526898
|
| 69 |
+
},
|
| 70 |
+
"ambiguous": {
|
| 71 |
+
"n": 7,
|
| 72 |
+
"acc": 0.42857142857142855,
|
| 73 |
+
"nll": 1.3565237367001013,
|
| 74 |
+
"brier": 0.6452232869191212,
|
| 75 |
+
"ece": 0.32251571368107274,
|
| 76 |
+
"mean_conf": 0.6502180852536663,
|
| 77 |
+
"confidence_bias": 0.22164665668223776,
|
| 78 |
+
"confident_error_rate": 0.0,
|
| 79 |
+
"coverage_at_0_9": 0.0,
|
| 80 |
+
"accuracy_at_0_9": null,
|
| 81 |
+
"coverage_at_5pct_error": 0.2857142857142857,
|
| 82 |
+
"coverage_at_1pct_error": 0.2857142857142857
|
| 83 |
+
},
|
| 84 |
+
"judge_hard": {
|
| 85 |
+
"n": 17,
|
| 86 |
+
"acc": 0.6470588235294118,
|
| 87 |
+
"nll": 1.043153687758328,
|
| 88 |
+
"brier": 0.6092315129495184,
|
| 89 |
+
"ece": 0.28681625447610926,
|
| 90 |
+
"mean_conf": 0.8928580032603509,
|
| 91 |
+
"confidence_bias": 0.24579917973093912,
|
| 92 |
+
"confident_error_rate": 0.23529411764705882,
|
| 93 |
+
"coverage_at_0_9": 0.7058823529411765,
|
| 94 |
+
"accuracy_at_0_9": 0.6666666666666666,
|
| 95 |
+
"coverage_at_5pct_error": 0.23529411764705882,
|
| 96 |
+
"coverage_at_1pct_error": 0.23529411764705882
|
| 97 |
+
},
|
| 98 |
+
"long_policy": {
|
| 99 |
+
"n": 19,
|
| 100 |
+
"acc": 0.15789473684210525,
|
| 101 |
+
"nll": 1.6308614483111026,
|
| 102 |
+
"brier": 0.9792997943021993,
|
| 103 |
+
"ece": 0.4952746829682073,
|
| 104 |
+
"mean_conf": 0.6531694198103126,
|
| 105 |
+
"confidence_bias": 0.49527468296820737,
|
| 106 |
+
"confident_error_rate": 0.10526315789473684,
|
| 107 |
+
"coverage_at_0_9": 0.10526315789473684,
|
| 108 |
+
"accuracy_at_0_9": 0.0,
|
| 109 |
+
"coverage_at_5pct_error": 0.0,
|
| 110 |
+
"coverage_at_1pct_error": 0.0,
|
| 111 |
+
"score_mae": 0.477994310305481,
|
| 112 |
+
"ranked_probability_score": 0.15165035324462384
|
| 113 |
+
},
|
| 114 |
+
"multi_hop": {
|
| 115 |
+
"n": 18,
|
| 116 |
+
"acc": 0.5,
|
| 117 |
+
"nll": 1.0688746124802804,
|
| 118 |
+
"brier": 0.6372311093159718,
|
| 119 |
+
"ece": 0.24119875598255616,
|
| 120 |
+
"mean_conf": 0.6399374680333065,
|
| 121 |
+
"confidence_bias": 0.13993746803330653,
|
| 122 |
+
"confident_error_rate": 0.0,
|
| 123 |
+
"coverage_at_0_9": 0.05555555555555555,
|
| 124 |
+
"accuracy_at_0_9": 1.0,
|
| 125 |
+
"coverage_at_5pct_error": 0.1111111111111111,
|
| 126 |
+
"coverage_at_1pct_error": 0.1111111111111111,
|
| 127 |
+
"score_mae": 0.3264137607819857,
|
| 128 |
+
"ranked_probability_score": 0.10477293291947704
|
| 129 |
+
},
|
| 130 |
+
"probability": {
|
| 131 |
+
"n": 10,
|
| 132 |
+
"acc": 0.7,
|
| 133 |
+
"nll": 0.7923180459636632,
|
| 134 |
+
"brier": 0.5234434268632783,
|
| 135 |
+
"ece": 0.37541941555644287,
|
| 136 |
+
"mean_conf": 0.6176246938708918,
|
| 137 |
+
"confidence_bias": -0.08237530612910815,
|
| 138 |
+
"confident_error_rate": 0.0,
|
| 139 |
+
"coverage_at_0_9": 0.1,
|
| 140 |
+
"accuracy_at_0_9": 1.0,
|
| 141 |
+
"coverage_at_5pct_error": 0.1,
|
| 142 |
+
"coverage_at_1pct_error": 0.1
|
| 143 |
+
},
|
| 144 |
+
"routing_hard": {
|
| 145 |
+
"n": 5,
|
| 146 |
+
"acc": 1.0,
|
| 147 |
+
"nll": 0.03599323458923339,
|
| 148 |
+
"brier": 0.005530167936106714,
|
| 149 |
+
"ece": 0.03444735897283405,
|
| 150 |
+
"mean_conf": 0.9655526410271659,
|
| 151 |
+
"confidence_bias": -0.03444735897283413,
|
| 152 |
+
"confident_error_rate": 0.0,
|
| 153 |
+
"coverage_at_0_9": 0.8,
|
| 154 |
+
"accuracy_at_0_9": 1.0,
|
| 155 |
+
"coverage_at_5pct_error": 1.0,
|
| 156 |
+
"coverage_at_1pct_error": 1.0
|
| 157 |
+
},
|
| 158 |
+
"temporal_numeric": {
|
| 159 |
+
"n": 15,
|
| 160 |
+
"acc": 0.06666666666666667,
|
| 161 |
+
"nll": 2.178260177219352,
|
| 162 |
+
"brier": 1.1166410815303502,
|
| 163 |
+
"ece": 0.5320347358601226,
|
| 164 |
+
"mean_conf": 0.5987014025267893,
|
| 165 |
+
"confidence_bias": 0.5320347358601226,
|
| 166 |
+
"confident_error_rate": 0.2,
|
| 167 |
+
"coverage_at_0_9": 0.2,
|
| 168 |
+
"accuracy_at_0_9": 0.0,
|
| 169 |
+
"coverage_at_5pct_error": 0.0,
|
| 170 |
+
"coverage_at_1pct_error": 0.0,
|
| 171 |
+
"score_mae": 1.9515866130907424,
|
| 172 |
+
"ranked_probability_score": 0.6353113738050508
|
| 173 |
+
},
|
| 174 |
+
"tradeoff": {
|
| 175 |
+
"n": 6,
|
| 176 |
+
"acc": 0.3333333333333333,
|
| 177 |
+
"nll": 2.182300081255963,
|
| 178 |
+
"brier": 0.9455793810780045,
|
| 179 |
+
"ece": 0.5467033524554479,
|
| 180 |
+
"mean_conf": 0.7305070046153205,
|
| 181 |
+
"confidence_bias": 0.39717367128198716,
|
| 182 |
+
"confident_error_rate": 0.3333333333333333,
|
| 183 |
+
"coverage_at_0_9": 0.3333333333333333,
|
| 184 |
+
"accuracy_at_0_9": 0.0,
|
| 185 |
+
"coverage_at_5pct_error": 0.0,
|
| 186 |
+
"coverage_at_1pct_error": 0.0
|
| 187 |
+
},
|
| 188 |
+
"trap": {
|
| 189 |
+
"n": 8,
|
| 190 |
+
"acc": 0.875,
|
| 191 |
+
"nll": 0.2623087137944162,
|
| 192 |
+
"brier": 0.1427404033078605,
|
| 193 |
+
"ece": 0.1551691982278216,
|
| 194 |
+
"mean_conf": 0.8505193797539718,
|
| 195 |
+
"confidence_bias": -0.02448062024602815,
|
| 196 |
+
"confident_error_rate": 0.0,
|
| 197 |
+
"coverage_at_0_9": 0.5,
|
| 198 |
+
"accuracy_at_0_9": 1.0,
|
| 199 |
+
"coverage_at_5pct_error": 0.875,
|
| 200 |
+
"coverage_at_1pct_error": 0.875,
|
| 201 |
+
"score_mae": 0.29963050218756937,
|
| 202 |
+
"ranked_probability_score": 0.014449936561200668
|
| 203 |
+
}
|
| 204 |
+
},
|
| 205 |
+
"sources": {
|
| 206 |
+
"adversarial": {
|
| 207 |
+
"n": 6,
|
| 208 |
+
"acc": 1.0,
|
| 209 |
+
"nll": 0.35251123143079216,
|
| 210 |
+
"brier": 0.20041343565378164,
|
| 211 |
+
"ece": 0.26837694440376436,
|
| 212 |
+
"mean_conf": 0.7316230555962356,
|
| 213 |
+
"confidence_bias": -0.26837694440376436,
|
| 214 |
+
"confident_error_rate": 0.0,
|
| 215 |
+
"coverage_at_0_9": 0.3333333333333333,
|
| 216 |
+
"accuracy_at_0_9": 1.0,
|
| 217 |
+
"coverage_at_5pct_error": 1.0,
|
| 218 |
+
"coverage_at_1pct_error": 1.0,
|
| 219 |
+
"score_mae": 0.3523800709707958,
|
| 220 |
+
"ranked_probability_score": 0.04304514044526898
|
| 221 |
+
},
|
| 222 |
+
"ambiguous": {
|
| 223 |
+
"n": 7,
|
| 224 |
+
"acc": 0.42857142857142855,
|
| 225 |
+
"nll": 1.3565237367001013,
|
| 226 |
+
"brier": 0.6452232869191212,
|
| 227 |
+
"ece": 0.32251571368107274,
|
| 228 |
+
"mean_conf": 0.6502180852536663,
|
| 229 |
+
"confidence_bias": 0.22164665668223776,
|
| 230 |
+
"confident_error_rate": 0.0,
|
| 231 |
+
"coverage_at_0_9": 0.0,
|
| 232 |
+
"accuracy_at_0_9": null,
|
| 233 |
+
"coverage_at_5pct_error": 0.2857142857142857,
|
| 234 |
+
"coverage_at_1pct_error": 0.2857142857142857
|
| 235 |
+
},
|
| 236 |
+
"judge_hard": {
|
| 237 |
+
"n": 17,
|
| 238 |
+
"acc": 0.6470588235294118,
|
| 239 |
+
"nll": 1.043153687758328,
|
| 240 |
+
"brier": 0.6092315129495184,
|
| 241 |
+
"ece": 0.28681625447610926,
|
| 242 |
+
"mean_conf": 0.8928580032603509,
|
| 243 |
+
"confidence_bias": 0.24579917973093912,
|
| 244 |
+
"confident_error_rate": 0.23529411764705882,
|
| 245 |
+
"coverage_at_0_9": 0.7058823529411765,
|
| 246 |
+
"accuracy_at_0_9": 0.6666666666666666,
|
| 247 |
+
"coverage_at_5pct_error": 0.23529411764705882,
|
| 248 |
+
"coverage_at_1pct_error": 0.23529411764705882
|
| 249 |
+
},
|
| 250 |
+
"long_policy": {
|
| 251 |
+
"n": 19,
|
| 252 |
+
"acc": 0.15789473684210525,
|
| 253 |
+
"nll": 1.6308614483111026,
|
| 254 |
+
"brier": 0.9792997943021993,
|
| 255 |
+
"ece": 0.4952746829682073,
|
| 256 |
+
"mean_conf": 0.6531694198103126,
|
| 257 |
+
"confidence_bias": 0.49527468296820737,
|
| 258 |
+
"confident_error_rate": 0.10526315789473684,
|
| 259 |
+
"coverage_at_0_9": 0.10526315789473684,
|
| 260 |
+
"accuracy_at_0_9": 0.0,
|
| 261 |
+
"coverage_at_5pct_error": 0.0,
|
| 262 |
+
"coverage_at_1pct_error": 0.0,
|
| 263 |
+
"score_mae": 0.477994310305481,
|
| 264 |
+
"ranked_probability_score": 0.15165035324462384
|
| 265 |
+
},
|
| 266 |
+
"multi_hop": {
|
| 267 |
+
"n": 18,
|
| 268 |
+
"acc": 0.5,
|
| 269 |
+
"nll": 1.0688746124802804,
|
| 270 |
+
"brier": 0.6372311093159718,
|
| 271 |
+
"ece": 0.24119875598255616,
|
| 272 |
+
"mean_conf": 0.6399374680333065,
|
| 273 |
+
"confidence_bias": 0.13993746803330653,
|
| 274 |
+
"confident_error_rate": 0.0,
|
| 275 |
+
"coverage_at_0_9": 0.05555555555555555,
|
| 276 |
+
"accuracy_at_0_9": 1.0,
|
| 277 |
+
"coverage_at_5pct_error": 0.1111111111111111,
|
| 278 |
+
"coverage_at_1pct_error": 0.1111111111111111,
|
| 279 |
+
"score_mae": 0.3264137607819857,
|
| 280 |
+
"ranked_probability_score": 0.10477293291947704
|
| 281 |
+
},
|
| 282 |
+
"probability": {
|
| 283 |
+
"n": 10,
|
| 284 |
+
"acc": 0.7,
|
| 285 |
+
"nll": 0.7923180459636632,
|
| 286 |
+
"brier": 0.5234434268632783,
|
| 287 |
+
"ece": 0.37541941555644287,
|
| 288 |
+
"mean_conf": 0.6176246938708918,
|
| 289 |
+
"confidence_bias": -0.08237530612910815,
|
| 290 |
+
"confident_error_rate": 0.0,
|
| 291 |
+
"coverage_at_0_9": 0.1,
|
| 292 |
+
"accuracy_at_0_9": 1.0,
|
| 293 |
+
"coverage_at_5pct_error": 0.1,
|
| 294 |
+
"coverage_at_1pct_error": 0.1
|
| 295 |
+
},
|
| 296 |
+
"routing_hard": {
|
| 297 |
+
"n": 5,
|
| 298 |
+
"acc": 1.0,
|
| 299 |
+
"nll": 0.03599323458923339,
|
| 300 |
+
"brier": 0.005530167936106714,
|
| 301 |
+
"ece": 0.03444735897283405,
|
| 302 |
+
"mean_conf": 0.9655526410271659,
|
| 303 |
+
"confidence_bias": -0.03444735897283413,
|
| 304 |
+
"confident_error_rate": 0.0,
|
| 305 |
+
"coverage_at_0_9": 0.8,
|
| 306 |
+
"accuracy_at_0_9": 1.0,
|
| 307 |
+
"coverage_at_5pct_error": 1.0,
|
| 308 |
+
"coverage_at_1pct_error": 1.0
|
| 309 |
+
},
|
| 310 |
+
"temporal_numeric": {
|
| 311 |
+
"n": 15,
|
| 312 |
+
"acc": 0.06666666666666667,
|
| 313 |
+
"nll": 2.178260177219352,
|
| 314 |
+
"brier": 1.1166410815303502,
|
| 315 |
+
"ece": 0.5320347358601226,
|
| 316 |
+
"mean_conf": 0.5987014025267893,
|
| 317 |
+
"confidence_bias": 0.5320347358601226,
|
| 318 |
+
"confident_error_rate": 0.2,
|
| 319 |
+
"coverage_at_0_9": 0.2,
|
| 320 |
+
"accuracy_at_0_9": 0.0,
|
| 321 |
+
"coverage_at_5pct_error": 0.0,
|
| 322 |
+
"coverage_at_1pct_error": 0.0,
|
| 323 |
+
"score_mae": 1.9515866130907424,
|
| 324 |
+
"ranked_probability_score": 0.6353113738050508
|
| 325 |
+
},
|
| 326 |
+
"tradeoff": {
|
| 327 |
+
"n": 6,
|
| 328 |
+
"acc": 0.3333333333333333,
|
| 329 |
+
"nll": 2.182300081255963,
|
| 330 |
+
"brier": 0.9455793810780045,
|
| 331 |
+
"ece": 0.5467033524554479,
|
| 332 |
+
"mean_conf": 0.7305070046153205,
|
| 333 |
+
"confidence_bias": 0.39717367128198716,
|
| 334 |
+
"confident_error_rate": 0.3333333333333333,
|
| 335 |
+
"coverage_at_0_9": 0.3333333333333333,
|
| 336 |
+
"accuracy_at_0_9": 0.0,
|
| 337 |
+
"coverage_at_5pct_error": 0.0,
|
| 338 |
+
"coverage_at_1pct_error": 0.0
|
| 339 |
+
},
|
| 340 |
+
"trap": {
|
| 341 |
+
"n": 8,
|
| 342 |
+
"acc": 0.875,
|
| 343 |
+
"nll": 0.2623087137944162,
|
| 344 |
+
"brier": 0.1427404033078605,
|
| 345 |
+
"ece": 0.1551691982278216,
|
| 346 |
+
"mean_conf": 0.8505193797539718,
|
| 347 |
+
"confidence_bias": -0.02448062024602815,
|
| 348 |
+
"confident_error_rate": 0.0,
|
| 349 |
+
"coverage_at_0_9": 0.5,
|
| 350 |
+
"accuracy_at_0_9": 1.0,
|
| 351 |
+
"coverage_at_5pct_error": 0.875,
|
| 352 |
+
"coverage_at_1pct_error": 0.875,
|
| 353 |
+
"score_mae": 0.29963050218756937,
|
| 354 |
+
"ranked_probability_score": 0.014449936561200668
|
| 355 |
+
}
|
| 356 |
+
},
|
| 357 |
+
"variants": {
|
| 358 |
+
"clean": {
|
| 359 |
+
"n": 111,
|
| 360 |
+
"acc": 0.4864864864864865,
|
| 361 |
+
"nll": 1.2210790654837587,
|
| 362 |
+
"brier": 0.6754949211362803,
|
| 363 |
+
"ece": 0.22721326697517824,
|
| 364 |
+
"mean_conf": 0.7136997534616648,
|
| 365 |
+
"confidence_bias": 0.2272132669751783,
|
| 366 |
+
"confident_error_rate": 0.0990990990990991,
|
| 367 |
+
"coverage_at_0_9": 0.27927927927927926,
|
| 368 |
+
"accuracy_at_0_9": 0.6451612903225806,
|
| 369 |
+
"coverage_at_5pct_error": 0.0990990990990991,
|
| 370 |
+
"coverage_at_1pct_error": 0.0990990990990991,
|
| 371 |
+
"score_mae": 0.6476665946070091,
|
| 372 |
+
"ranked_probability_score": 0.18348001503670752
|
| 373 |
+
}
|
| 374 |
+
},
|
| 375 |
+
"macro_task_acc": 0.5708524988942946,
|
| 376 |
+
"objective": -1.0903104969503232,
|
| 377 |
+
"paired_flip": {
|
| 378 |
+
"pairs": 0,
|
| 379 |
+
"incomplete_pairs": 0,
|
| 380 |
+
"flip_rate": null,
|
| 381 |
+
"both_correct_rate": null,
|
| 382 |
+
"invariant_pairs": 0,
|
| 383 |
+
"invariant_both_correct_rate": null,
|
| 384 |
+
"invariance_rate": null
|
| 385 |
+
},
|
| 386 |
+
"reference_distribution": {
|
| 387 |
+
"n": 10,
|
| 388 |
+
"squared_l2": 0.10905696764037734,
|
| 389 |
+
"total_variation": 0.1997306177200928,
|
| 390 |
+
"kl_reference_to_model": 0.1374588310661992,
|
| 391 |
+
"note": "Exact reference-distribution fidelity, separate from hard-label Brier/ECE."
|
| 392 |
+
},
|
| 393 |
+
"unknowable": null,
|
| 394 |
+
"permutation": {
|
| 395 |
+
"n": 0,
|
| 396 |
+
"missing_parents": 0,
|
| 397 |
+
"flip_rate": null,
|
| 398 |
+
"mean_max_delta": null
|
| 399 |
+
},
|
| 400 |
+
"metric_policy": {
|
| 401 |
+
"nll_floor": 1e-09,
|
| 402 |
+
"ece_bins": 10,
|
| 403 |
+
"confidence_for_calibration": "maximum label probability",
|
| 404 |
+
"calibration_applied": false,
|
| 405 |
+
"unknown_accuracy_excluded": true,
|
| 406 |
+
"coverage_error_budget_is_retrospective": true,
|
| 407 |
+
"raw_sums_outside_1e_5": 0,
|
| 408 |
+
"returned_zeros": 0
|
| 409 |
+
},
|
| 410 |
+
"latency_ms": {
|
| 411 |
+
"n": 111,
|
| 412 |
+
"mean": 31.97643356628481,
|
| 413 |
+
"p50": 26.17260901024565,
|
| 414 |
+
"p95": 50.40793698572088,
|
| 415 |
+
"p99": 60.8419331139885
|
| 416 |
+
}
|
| 417 |
+
}
|
| 418 |
+
},
|
| 419 |
+
"latency_scope": "client HTTP wall time, excluding queue before dispatch; NOT GPU kernel time",
|
| 420 |
+
"partial_dataset": false
|
| 421 |
+
}
|
evidence/served-nosys-latency-idle-gpu.json
ADDED
|
@@ -0,0 +1,1728 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"profile": "242",
|
| 3 |
+
"decisions": 242,
|
| 4 |
+
"measured": 242,
|
| 5 |
+
"failures": 0,
|
| 6 |
+
"warmup_excluded": 5,
|
| 7 |
+
"base_url": "http://127.0.0.1:30121",
|
| 8 |
+
"model": "jev-latest",
|
| 9 |
+
"temperature_sent": null,
|
| 10 |
+
"temperature_reported_by_server": [
|
| 11 |
+
1.3
|
| 12 |
+
],
|
| 13 |
+
"raw": {
|
| 14 |
+
"p50_s": 0.022593129993765615,
|
| 15 |
+
"p95_s": 0.03323259013413917,
|
| 16 |
+
"mean_s": 0.02412359378866328
|
| 17 |
+
},
|
| 18 |
+
"leaderboard_adjusted_x2_plus_0.15s": {
|
| 19 |
+
"p50_s": 0.19518625998753122,
|
| 20 |
+
"p95_s": 0.21646518026827832
|
| 21 |
+
},
|
| 22 |
+
"speed_axis": {
|
| 23 |
+
"raw": 111.24459407550262,
|
| 24 |
+
"adjusted": 93.7416271006002
|
| 25 |
+
},
|
| 26 |
+
"input_tokens": {
|
| 27 |
+
"mean_per_decision": 279.92148760330576,
|
| 28 |
+
"max": 2192,
|
| 29 |
+
"total": 67741
|
| 30 |
+
},
|
| 31 |
+
"note": "Approximation: 146 judge and 24/109 held-out items are synthetic stand-ins with similar families and lengths, not the private leaderboard items.",
|
| 32 |
+
"per_item": [
|
| 33 |
+
{
|
| 34 |
+
"id": "internal-eval-v1/judge_hard/0022",
|
| 35 |
+
"suite": "internal-eval-v1",
|
| 36 |
+
"seconds": 0.0226,
|
| 37 |
+
"input_tokens": 230,
|
| 38 |
+
"temperature": 1.3
|
| 39 |
+
},
|
| 40 |
+
{
|
| 41 |
+
"id": "judge-proxy-v1/heldout/routing/00015",
|
| 42 |
+
"suite": "judge-proxy-v1/routing",
|
| 43 |
+
"seconds": 0.0242,
|
| 44 |
+
"input_tokens": 222,
|
| 45 |
+
"temperature": 1.3
|
| 46 |
+
},
|
| 47 |
+
{
|
| 48 |
+
"id": "original-intent-03-0",
|
| 49 |
+
"suite": "jevbench-original",
|
| 50 |
+
"seconds": 0.0314,
|
| 51 |
+
"input_tokens": 112,
|
| 52 |
+
"temperature": 1.3
|
| 53 |
+
},
|
| 54 |
+
{
|
| 55 |
+
"id": "judge-proxy-v1/heldout/routing/00261",
|
| 56 |
+
"suite": "judge-proxy-v1/routing",
|
| 57 |
+
"seconds": 0.0234,
|
| 58 |
+
"input_tokens": 241,
|
| 59 |
+
"temperature": 1.3
|
| 60 |
+
},
|
| 61 |
+
{
|
| 62 |
+
"id": "judge-proxy-v1/heldout/routing/00279",
|
| 63 |
+
"suite": "judge-proxy-v1/routing",
|
| 64 |
+
"seconds": 0.0275,
|
| 65 |
+
"input_tokens": 828,
|
| 66 |
+
"temperature": 1.3
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"id": "internal-eval-v1/judge_hard/0012",
|
| 70 |
+
"suite": "internal-eval-v1",
|
| 71 |
+
"seconds": 0.0231,
|
| 72 |
+
"input_tokens": 231,
|
| 73 |
+
"temperature": 1.3
|
| 74 |
+
},
|
| 75 |
+
{
|
| 76 |
+
"id": "judge-proxy-v1/heldout/adequacy/00207",
|
| 77 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 78 |
+
"seconds": 0.0212,
|
| 79 |
+
"input_tokens": 131,
|
| 80 |
+
"temperature": 1.3
|
| 81 |
+
},
|
| 82 |
+
{
|
| 83 |
+
"id": "internal-eval-v1/probability/0097",
|
| 84 |
+
"suite": "internal-eval-v1",
|
| 85 |
+
"seconds": 0.0224,
|
| 86 |
+
"input_tokens": 217,
|
| 87 |
+
"temperature": 1.3
|
| 88 |
+
},
|
| 89 |
+
{
|
| 90 |
+
"id": "judge-proxy-v1/heldout/routing/00109",
|
| 91 |
+
"suite": "judge-proxy-v1/routing",
|
| 92 |
+
"seconds": 0.0445,
|
| 93 |
+
"input_tokens": 2155,
|
| 94 |
+
"temperature": 1.3
|
| 95 |
+
},
|
| 96 |
+
{
|
| 97 |
+
"id": "original-policy-02-0",
|
| 98 |
+
"suite": "jevbench-original",
|
| 99 |
+
"seconds": 0.033,
|
| 100 |
+
"input_tokens": 104,
|
| 101 |
+
"temperature": 1.3
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"id": "original-extraction-03-1",
|
| 105 |
+
"suite": "jevbench-original",
|
| 106 |
+
"seconds": 0.0235,
|
| 107 |
+
"input_tokens": 108,
|
| 108 |
+
"temperature": 1.3
|
| 109 |
+
},
|
| 110 |
+
{
|
| 111 |
+
"id": "internal-eval-v1/multi_hop/0030",
|
| 112 |
+
"suite": "internal-eval-v1",
|
| 113 |
+
"seconds": 0.0237,
|
| 114 |
+
"input_tokens": 303,
|
| 115 |
+
"temperature": 1.3
|
| 116 |
+
},
|
| 117 |
+
{
|
| 118 |
+
"id": "original-adequacy-02-1",
|
| 119 |
+
"suite": "jevbench-original",
|
| 120 |
+
"seconds": 0.021,
|
| 121 |
+
"input_tokens": 99,
|
| 122 |
+
"temperature": 1.3
|
| 123 |
+
},
|
| 124 |
+
{
|
| 125 |
+
"id": "original-intent-06-0",
|
| 126 |
+
"suite": "jevbench-original",
|
| 127 |
+
"seconds": 0.0215,
|
| 128 |
+
"input_tokens": 108,
|
| 129 |
+
"temperature": 1.3
|
| 130 |
+
},
|
| 131 |
+
{
|
| 132 |
+
"id": "judge-proxy-v1/heldout/adequacy/00165",
|
| 133 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 134 |
+
"seconds": 0.0274,
|
| 135 |
+
"input_tokens": 155,
|
| 136 |
+
"temperature": 1.3
|
| 137 |
+
},
|
| 138 |
+
{
|
| 139 |
+
"id": "internal-eval-v1/temporal_numeric/0045",
|
| 140 |
+
"suite": "internal-eval-v1",
|
| 141 |
+
"seconds": 0.0229,
|
| 142 |
+
"input_tokens": 289,
|
| 143 |
+
"temperature": 1.3
|
| 144 |
+
},
|
| 145 |
+
{
|
| 146 |
+
"id": "judge-proxy-v1/heldout/adequacy/00021",
|
| 147 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 148 |
+
"seconds": 0.0306,
|
| 149 |
+
"input_tokens": 165,
|
| 150 |
+
"temperature": 1.3
|
| 151 |
+
},
|
| 152 |
+
{
|
| 153 |
+
"id": "original-routing-03-1",
|
| 154 |
+
"suite": "jevbench-original",
|
| 155 |
+
"seconds": 0.0217,
|
| 156 |
+
"input_tokens": 146,
|
| 157 |
+
"temperature": 1.3
|
| 158 |
+
},
|
| 159 |
+
{
|
| 160 |
+
"id": "judge-proxy-v1/heldout/routing/00080",
|
| 161 |
+
"suite": "judge-proxy-v1/routing",
|
| 162 |
+
"seconds": 0.042,
|
| 163 |
+
"input_tokens": 2179,
|
| 164 |
+
"temperature": 1.3
|
| 165 |
+
},
|
| 166 |
+
{
|
| 167 |
+
"id": "judge-proxy-v1/heldout/routing/00188",
|
| 168 |
+
"suite": "judge-proxy-v1/routing",
|
| 169 |
+
"seconds": 0.0279,
|
| 170 |
+
"input_tokens": 196,
|
| 171 |
+
"temperature": 1.3
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"id": "judge-proxy-v1/heldout/adequacy/00108",
|
| 175 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 176 |
+
"seconds": 0.0206,
|
| 177 |
+
"input_tokens": 137,
|
| 178 |
+
"temperature": 1.3
|
| 179 |
+
},
|
| 180 |
+
{
|
| 181 |
+
"id": "internal-eval-v1/probability/0002",
|
| 182 |
+
"suite": "internal-eval-v1",
|
| 183 |
+
"seconds": 0.0223,
|
| 184 |
+
"input_tokens": 218,
|
| 185 |
+
"temperature": 1.3
|
| 186 |
+
},
|
| 187 |
+
{
|
| 188 |
+
"id": "judge-proxy-v1/heldout/routing/00259",
|
| 189 |
+
"suite": "judge-proxy-v1/routing",
|
| 190 |
+
"seconds": 0.0242,
|
| 191 |
+
"input_tokens": 207,
|
| 192 |
+
"temperature": 1.3
|
| 193 |
+
},
|
| 194 |
+
{
|
| 195 |
+
"id": "judge-proxy-v1/heldout/routing/00217",
|
| 196 |
+
"suite": "judge-proxy-v1/routing",
|
| 197 |
+
"seconds": 0.0427,
|
| 198 |
+
"input_tokens": 2180,
|
| 199 |
+
"temperature": 1.3
|
| 200 |
+
},
|
| 201 |
+
{
|
| 202 |
+
"id": "judge-proxy-v1/heldout/adequacy/00178",
|
| 203 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 204 |
+
"seconds": 0.0241,
|
| 205 |
+
"input_tokens": 175,
|
| 206 |
+
"temperature": 1.3
|
| 207 |
+
},
|
| 208 |
+
{
|
| 209 |
+
"id": "original-extraction-06-1",
|
| 210 |
+
"suite": "jevbench-original",
|
| 211 |
+
"seconds": 0.0219,
|
| 212 |
+
"input_tokens": 105,
|
| 213 |
+
"temperature": 1.3
|
| 214 |
+
},
|
| 215 |
+
{
|
| 216 |
+
"id": "judge-proxy-v1/heldout/routing/00132",
|
| 217 |
+
"suite": "judge-proxy-v1/routing",
|
| 218 |
+
"seconds": 0.0226,
|
| 219 |
+
"input_tokens": 207,
|
| 220 |
+
"temperature": 1.3
|
| 221 |
+
},
|
| 222 |
+
{
|
| 223 |
+
"id": "judge-proxy-v1/heldout/adequacy/00235",
|
| 224 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 225 |
+
"seconds": 0.0222,
|
| 226 |
+
"input_tokens": 212,
|
| 227 |
+
"temperature": 1.3
|
| 228 |
+
},
|
| 229 |
+
{
|
| 230 |
+
"id": "original-policy-01-0",
|
| 231 |
+
"suite": "jevbench-original",
|
| 232 |
+
"seconds": 0.0216,
|
| 233 |
+
"input_tokens": 116,
|
| 234 |
+
"temperature": 1.3
|
| 235 |
+
},
|
| 236 |
+
{
|
| 237 |
+
"id": "judge-proxy-v1/heldout/routing/00175",
|
| 238 |
+
"suite": "judge-proxy-v1/routing",
|
| 239 |
+
"seconds": 0.042,
|
| 240 |
+
"input_tokens": 2190,
|
| 241 |
+
"temperature": 1.3
|
| 242 |
+
},
|
| 243 |
+
{
|
| 244 |
+
"id": "judge-proxy-v1/heldout/routing/00170",
|
| 245 |
+
"suite": "judge-proxy-v1/routing",
|
| 246 |
+
"seconds": 0.0244,
|
| 247 |
+
"input_tokens": 267,
|
| 248 |
+
"temperature": 1.3
|
| 249 |
+
},
|
| 250 |
+
{
|
| 251 |
+
"id": "judge-proxy-v1/heldout/adequacy/00087",
|
| 252 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 253 |
+
"seconds": 0.0202,
|
| 254 |
+
"input_tokens": 135,
|
| 255 |
+
"temperature": 1.3
|
| 256 |
+
},
|
| 257 |
+
{
|
| 258 |
+
"id": "judge-proxy-v1/heldout/routing/00115",
|
| 259 |
+
"suite": "judge-proxy-v1/routing",
|
| 260 |
+
"seconds": 0.0235,
|
| 261 |
+
"input_tokens": 194,
|
| 262 |
+
"temperature": 1.3
|
| 263 |
+
},
|
| 264 |
+
{
|
| 265 |
+
"id": "original-extraction-06-0",
|
| 266 |
+
"suite": "jevbench-original",
|
| 267 |
+
"seconds": 0.0223,
|
| 268 |
+
"input_tokens": 106,
|
| 269 |
+
"temperature": 1.3
|
| 270 |
+
},
|
| 271 |
+
{
|
| 272 |
+
"id": "judge-proxy-v1/heldout/adequacy/00288",
|
| 273 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 274 |
+
"seconds": 0.022,
|
| 275 |
+
"input_tokens": 203,
|
| 276 |
+
"temperature": 1.3
|
| 277 |
+
},
|
| 278 |
+
{
|
| 279 |
+
"id": "judge-proxy-v1/heldout/adequacy/00151",
|
| 280 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 281 |
+
"seconds": 0.0223,
|
| 282 |
+
"input_tokens": 167,
|
| 283 |
+
"temperature": 1.3
|
| 284 |
+
},
|
| 285 |
+
{
|
| 286 |
+
"id": "judge-proxy-v1/heldout/routing/00127",
|
| 287 |
+
"suite": "judge-proxy-v1/routing",
|
| 288 |
+
"seconds": 0.0233,
|
| 289 |
+
"input_tokens": 197,
|
| 290 |
+
"temperature": 1.3
|
| 291 |
+
},
|
| 292 |
+
{
|
| 293 |
+
"id": "original-routing-04-0",
|
| 294 |
+
"suite": "jevbench-original",
|
| 295 |
+
"seconds": 0.0217,
|
| 296 |
+
"input_tokens": 139,
|
| 297 |
+
"temperature": 1.3
|
| 298 |
+
},
|
| 299 |
+
{
|
| 300 |
+
"id": "judge-proxy-v1/heldout/routing/00061",
|
| 301 |
+
"suite": "judge-proxy-v1/routing",
|
| 302 |
+
"seconds": 0.0274,
|
| 303 |
+
"input_tokens": 958,
|
| 304 |
+
"temperature": 1.3
|
| 305 |
+
},
|
| 306 |
+
{
|
| 307 |
+
"id": "original-ordinal-03-0",
|
| 308 |
+
"suite": "jevbench-original",
|
| 309 |
+
"seconds": 0.0216,
|
| 310 |
+
"input_tokens": 122,
|
| 311 |
+
"temperature": 1.3
|
| 312 |
+
},
|
| 313 |
+
{
|
| 314 |
+
"id": "original-routing-02-1",
|
| 315 |
+
"suite": "jevbench-original",
|
| 316 |
+
"seconds": 0.0225,
|
| 317 |
+
"input_tokens": 138,
|
| 318 |
+
"temperature": 1.3
|
| 319 |
+
},
|
| 320 |
+
{
|
| 321 |
+
"id": "judge-proxy-v1/heldout/routing/00288",
|
| 322 |
+
"suite": "judge-proxy-v1/routing",
|
| 323 |
+
"seconds": 0.0238,
|
| 324 |
+
"input_tokens": 207,
|
| 325 |
+
"temperature": 1.3
|
| 326 |
+
},
|
| 327 |
+
{
|
| 328 |
+
"id": "judge-proxy-v1/heldout/routing/00021",
|
| 329 |
+
"suite": "judge-proxy-v1/routing",
|
| 330 |
+
"seconds": 0.0243,
|
| 331 |
+
"input_tokens": 197,
|
| 332 |
+
"temperature": 1.3
|
| 333 |
+
},
|
| 334 |
+
{
|
| 335 |
+
"id": "judge-proxy-v1/heldout/routing/00003",
|
| 336 |
+
"suite": "judge-proxy-v1/routing",
|
| 337 |
+
"seconds": 0.0238,
|
| 338 |
+
"input_tokens": 243,
|
| 339 |
+
"temperature": 1.3
|
| 340 |
+
},
|
| 341 |
+
{
|
| 342 |
+
"id": "judge-proxy-v1/heldout/adequacy/00059",
|
| 343 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 344 |
+
"seconds": 0.0229,
|
| 345 |
+
"input_tokens": 148,
|
| 346 |
+
"temperature": 1.3
|
| 347 |
+
},
|
| 348 |
+
{
|
| 349 |
+
"id": "internal-eval-v1/judge_hard/0005",
|
| 350 |
+
"suite": "internal-eval-v1",
|
| 351 |
+
"seconds": 0.0235,
|
| 352 |
+
"input_tokens": 233,
|
| 353 |
+
"temperature": 1.3
|
| 354 |
+
},
|
| 355 |
+
{
|
| 356 |
+
"id": "judge-proxy-v1/heldout/routing/00055",
|
| 357 |
+
"suite": "judge-proxy-v1/routing",
|
| 358 |
+
"seconds": 0.0238,
|
| 359 |
+
"input_tokens": 243,
|
| 360 |
+
"temperature": 1.3
|
| 361 |
+
},
|
| 362 |
+
{
|
| 363 |
+
"id": "original-intent-04-0",
|
| 364 |
+
"suite": "jevbench-original",
|
| 365 |
+
"seconds": 0.0217,
|
| 366 |
+
"input_tokens": 115,
|
| 367 |
+
"temperature": 1.3
|
| 368 |
+
},
|
| 369 |
+
{
|
| 370 |
+
"id": "judge-proxy-v1/heldout/adequacy/00284",
|
| 371 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 372 |
+
"seconds": 0.0224,
|
| 373 |
+
"input_tokens": 200,
|
| 374 |
+
"temperature": 1.3
|
| 375 |
+
},
|
| 376 |
+
{
|
| 377 |
+
"id": "original-routing-04-1",
|
| 378 |
+
"suite": "jevbench-original",
|
| 379 |
+
"seconds": 0.0224,
|
| 380 |
+
"input_tokens": 138,
|
| 381 |
+
"temperature": 1.3
|
| 382 |
+
},
|
| 383 |
+
{
|
| 384 |
+
"id": "judge-proxy-v1/heldout/adequacy/00258",
|
| 385 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 386 |
+
"seconds": 0.0217,
|
| 387 |
+
"input_tokens": 137,
|
| 388 |
+
"temperature": 1.3
|
| 389 |
+
},
|
| 390 |
+
{
|
| 391 |
+
"id": "judge-proxy-v1/heldout/adequacy/00014",
|
| 392 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 393 |
+
"seconds": 0.0223,
|
| 394 |
+
"input_tokens": 166,
|
| 395 |
+
"temperature": 1.3
|
| 396 |
+
},
|
| 397 |
+
{
|
| 398 |
+
"id": "judge-proxy-v1/heldout/routing/00189",
|
| 399 |
+
"suite": "judge-proxy-v1/routing",
|
| 400 |
+
"seconds": 0.0244,
|
| 401 |
+
"input_tokens": 197,
|
| 402 |
+
"temperature": 1.3
|
| 403 |
+
},
|
| 404 |
+
{
|
| 405 |
+
"id": "judge-proxy-v1/heldout/routing/00145",
|
| 406 |
+
"suite": "judge-proxy-v1/routing",
|
| 407 |
+
"seconds": 0.0256,
|
| 408 |
+
"input_tokens": 276,
|
| 409 |
+
"temperature": 1.3
|
| 410 |
+
},
|
| 411 |
+
{
|
| 412 |
+
"id": "judge-proxy-v1/heldout/routing/00125",
|
| 413 |
+
"suite": "judge-proxy-v1/routing",
|
| 414 |
+
"seconds": 0.0267,
|
| 415 |
+
"input_tokens": 272,
|
| 416 |
+
"temperature": 1.3
|
| 417 |
+
},
|
| 418 |
+
{
|
| 419 |
+
"id": "internal-eval-v1/probability/0000",
|
| 420 |
+
"suite": "internal-eval-v1",
|
| 421 |
+
"seconds": 0.0227,
|
| 422 |
+
"input_tokens": 219,
|
| 423 |
+
"temperature": 1.3
|
| 424 |
+
},
|
| 425 |
+
{
|
| 426 |
+
"id": "judge-proxy-v1/heldout/adequacy/00035",
|
| 427 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 428 |
+
"seconds": 0.022,
|
| 429 |
+
"input_tokens": 115,
|
| 430 |
+
"temperature": 1.3
|
| 431 |
+
},
|
| 432 |
+
{
|
| 433 |
+
"id": "judge-proxy-v1/heldout/adequacy/00016",
|
| 434 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 435 |
+
"seconds": 0.0219,
|
| 436 |
+
"input_tokens": 200,
|
| 437 |
+
"temperature": 1.3
|
| 438 |
+
},
|
| 439 |
+
{
|
| 440 |
+
"id": "original-routing-03-0",
|
| 441 |
+
"suite": "jevbench-original",
|
| 442 |
+
"seconds": 0.0341,
|
| 443 |
+
"input_tokens": 143,
|
| 444 |
+
"temperature": 1.3
|
| 445 |
+
},
|
| 446 |
+
{
|
| 447 |
+
"id": "judge-proxy-v1/heldout/adequacy/00289",
|
| 448 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 449 |
+
"seconds": 0.0219,
|
| 450 |
+
"input_tokens": 137,
|
| 451 |
+
"temperature": 1.3
|
| 452 |
+
},
|
| 453 |
+
{
|
| 454 |
+
"id": "original-adequacy-01-0",
|
| 455 |
+
"suite": "jevbench-original",
|
| 456 |
+
"seconds": 0.0215,
|
| 457 |
+
"input_tokens": 100,
|
| 458 |
+
"temperature": 1.3
|
| 459 |
+
},
|
| 460 |
+
{
|
| 461 |
+
"id": "internal-eval-v1/temporal_numeric/0007",
|
| 462 |
+
"suite": "internal-eval-v1",
|
| 463 |
+
"seconds": 0.0222,
|
| 464 |
+
"input_tokens": 289,
|
| 465 |
+
"temperature": 1.3
|
| 466 |
+
},
|
| 467 |
+
{
|
| 468 |
+
"id": "judge-proxy-v1/heldout/routing/00096",
|
| 469 |
+
"suite": "judge-proxy-v1/routing",
|
| 470 |
+
"seconds": 0.0482,
|
| 471 |
+
"input_tokens": 2192,
|
| 472 |
+
"temperature": 1.3
|
| 473 |
+
},
|
| 474 |
+
{
|
| 475 |
+
"id": "original-extraction-02-0",
|
| 476 |
+
"suite": "jevbench-original",
|
| 477 |
+
"seconds": 0.0221,
|
| 478 |
+
"input_tokens": 105,
|
| 479 |
+
"temperature": 1.3
|
| 480 |
+
},
|
| 481 |
+
{
|
| 482 |
+
"id": "judge-proxy-v1/heldout/adequacy/00156",
|
| 483 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 484 |
+
"seconds": 0.0221,
|
| 485 |
+
"input_tokens": 137,
|
| 486 |
+
"temperature": 1.3
|
| 487 |
+
},
|
| 488 |
+
{
|
| 489 |
+
"id": "original-policy-02-1",
|
| 490 |
+
"suite": "jevbench-original",
|
| 491 |
+
"seconds": 0.0302,
|
| 492 |
+
"input_tokens": 103,
|
| 493 |
+
"temperature": 1.3
|
| 494 |
+
},
|
| 495 |
+
{
|
| 496 |
+
"id": "original-policy-04-0",
|
| 497 |
+
"suite": "jevbench-original",
|
| 498 |
+
"seconds": 0.022,
|
| 499 |
+
"input_tokens": 114,
|
| 500 |
+
"temperature": 1.3
|
| 501 |
+
},
|
| 502 |
+
{
|
| 503 |
+
"id": "judge-proxy-v1/heldout/routing/00014",
|
| 504 |
+
"suite": "judge-proxy-v1/routing",
|
| 505 |
+
"seconds": 0.024,
|
| 506 |
+
"input_tokens": 191,
|
| 507 |
+
"temperature": 1.3
|
| 508 |
+
},
|
| 509 |
+
{
|
| 510 |
+
"id": "judge-proxy-v1/heldout/adequacy/00031",
|
| 511 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 512 |
+
"seconds": 0.0218,
|
| 513 |
+
"input_tokens": 140,
|
| 514 |
+
"temperature": 1.3
|
| 515 |
+
},
|
| 516 |
+
{
|
| 517 |
+
"id": "judge-proxy-v1/heldout/adequacy/00277",
|
| 518 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 519 |
+
"seconds": 0.0227,
|
| 520 |
+
"input_tokens": 157,
|
| 521 |
+
"temperature": 1.3
|
| 522 |
+
},
|
| 523 |
+
{
|
| 524 |
+
"id": "original-ordinal-02-0",
|
| 525 |
+
"suite": "jevbench-original",
|
| 526 |
+
"seconds": 0.022,
|
| 527 |
+
"input_tokens": 125,
|
| 528 |
+
"temperature": 1.3
|
| 529 |
+
},
|
| 530 |
+
{
|
| 531 |
+
"id": "judge-proxy-v1/heldout/adequacy/00179",
|
| 532 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 533 |
+
"seconds": 0.0227,
|
| 534 |
+
"input_tokens": 173,
|
| 535 |
+
"temperature": 1.3
|
| 536 |
+
},
|
| 537 |
+
{
|
| 538 |
+
"id": "judge-proxy-v1/heldout/adequacy/00177",
|
| 539 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 540 |
+
"seconds": 0.0219,
|
| 541 |
+
"input_tokens": 197,
|
| 542 |
+
"temperature": 1.3
|
| 543 |
+
},
|
| 544 |
+
{
|
| 545 |
+
"id": "judge-proxy-v1/heldout/adequacy/00078",
|
| 546 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 547 |
+
"seconds": 0.0224,
|
| 548 |
+
"input_tokens": 169,
|
| 549 |
+
"temperature": 1.3
|
| 550 |
+
},
|
| 551 |
+
{
|
| 552 |
+
"id": "internal-eval-v1/long_policy/0081",
|
| 553 |
+
"suite": "internal-eval-v1",
|
| 554 |
+
"seconds": 0.0245,
|
| 555 |
+
"input_tokens": 545,
|
| 556 |
+
"temperature": 1.3
|
| 557 |
+
},
|
| 558 |
+
{
|
| 559 |
+
"id": "judge-proxy-v1/heldout/routing/00248",
|
| 560 |
+
"suite": "judge-proxy-v1/routing",
|
| 561 |
+
"seconds": 0.0237,
|
| 562 |
+
"input_tokens": 195,
|
| 563 |
+
"temperature": 1.3
|
| 564 |
+
},
|
| 565 |
+
{
|
| 566 |
+
"id": "original-ordinal-05-0",
|
| 567 |
+
"suite": "jevbench-original",
|
| 568 |
+
"seconds": 0.0212,
|
| 569 |
+
"input_tokens": 127,
|
| 570 |
+
"temperature": 1.3
|
| 571 |
+
},
|
| 572 |
+
{
|
| 573 |
+
"id": "original-adequacy-04-0",
|
| 574 |
+
"suite": "jevbench-original",
|
| 575 |
+
"seconds": 0.0211,
|
| 576 |
+
"input_tokens": 103,
|
| 577 |
+
"temperature": 1.3
|
| 578 |
+
},
|
| 579 |
+
{
|
| 580 |
+
"id": "original-policy-01-1",
|
| 581 |
+
"suite": "jevbench-original",
|
| 582 |
+
"seconds": 0.0219,
|
| 583 |
+
"input_tokens": 118,
|
| 584 |
+
"temperature": 1.3
|
| 585 |
+
},
|
| 586 |
+
{
|
| 587 |
+
"id": "judge-proxy-v1/heldout/adequacy/00261",
|
| 588 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 589 |
+
"seconds": 0.0223,
|
| 590 |
+
"input_tokens": 158,
|
| 591 |
+
"temperature": 1.3
|
| 592 |
+
},
|
| 593 |
+
{
|
| 594 |
+
"id": "judge-proxy-v1/heldout/routing/00123",
|
| 595 |
+
"suite": "judge-proxy-v1/routing",
|
| 596 |
+
"seconds": 0.0224,
|
| 597 |
+
"input_tokens": 218,
|
| 598 |
+
"temperature": 1.3
|
| 599 |
+
},
|
| 600 |
+
{
|
| 601 |
+
"id": "judge-proxy-v1/heldout/routing/00210",
|
| 602 |
+
"suite": "judge-proxy-v1/routing",
|
| 603 |
+
"seconds": 0.0238,
|
| 604 |
+
"input_tokens": 206,
|
| 605 |
+
"temperature": 1.3
|
| 606 |
+
},
|
| 607 |
+
{
|
| 608 |
+
"id": "judge-proxy-v1/heldout/routing/00126",
|
| 609 |
+
"suite": "judge-proxy-v1/routing",
|
| 610 |
+
"seconds": 0.0236,
|
| 611 |
+
"input_tokens": 227,
|
| 612 |
+
"temperature": 1.3
|
| 613 |
+
},
|
| 614 |
+
{
|
| 615 |
+
"id": "judge-proxy-v1/heldout/adequacy/00275",
|
| 616 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 617 |
+
"seconds": 0.0219,
|
| 618 |
+
"input_tokens": 195,
|
| 619 |
+
"temperature": 1.3
|
| 620 |
+
},
|
| 621 |
+
{
|
| 622 |
+
"id": "judge-proxy-v1/heldout/routing/00139",
|
| 623 |
+
"suite": "judge-proxy-v1/routing",
|
| 624 |
+
"seconds": 0.0251,
|
| 625 |
+
"input_tokens": 279,
|
| 626 |
+
"temperature": 1.3
|
| 627 |
+
},
|
| 628 |
+
{
|
| 629 |
+
"id": "original-adequacy-06-1",
|
| 630 |
+
"suite": "jevbench-original",
|
| 631 |
+
"seconds": 0.0215,
|
| 632 |
+
"input_tokens": 110,
|
| 633 |
+
"temperature": 1.3
|
| 634 |
+
},
|
| 635 |
+
{
|
| 636 |
+
"id": "judge-proxy-v1/heldout/adequacy/00219",
|
| 637 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 638 |
+
"seconds": 0.0227,
|
| 639 |
+
"input_tokens": 174,
|
| 640 |
+
"temperature": 1.3
|
| 641 |
+
},
|
| 642 |
+
{
|
| 643 |
+
"id": "judge-proxy-v1/heldout/routing/00048",
|
| 644 |
+
"suite": "judge-proxy-v1/routing",
|
| 645 |
+
"seconds": 0.0303,
|
| 646 |
+
"input_tokens": 210,
|
| 647 |
+
"temperature": 1.3
|
| 648 |
+
},
|
| 649 |
+
{
|
| 650 |
+
"id": "judge-proxy-v1/heldout/adequacy/00220",
|
| 651 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 652 |
+
"seconds": 0.0283,
|
| 653 |
+
"input_tokens": 171,
|
| 654 |
+
"temperature": 1.3
|
| 655 |
+
},
|
| 656 |
+
{
|
| 657 |
+
"id": "original-intent-06-1",
|
| 658 |
+
"suite": "jevbench-original",
|
| 659 |
+
"seconds": 0.0275,
|
| 660 |
+
"input_tokens": 113,
|
| 661 |
+
"temperature": 1.3
|
| 662 |
+
},
|
| 663 |
+
{
|
| 664 |
+
"id": "judge-proxy-v1/heldout/routing/00268",
|
| 665 |
+
"suite": "judge-proxy-v1/routing",
|
| 666 |
+
"seconds": 0.0298,
|
| 667 |
+
"input_tokens": 200,
|
| 668 |
+
"temperature": 1.3
|
| 669 |
+
},
|
| 670 |
+
{
|
| 671 |
+
"id": "judge-proxy-v1/heldout/adequacy/00111",
|
| 672 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 673 |
+
"seconds": 0.0229,
|
| 674 |
+
"input_tokens": 190,
|
| 675 |
+
"temperature": 1.3
|
| 676 |
+
},
|
| 677 |
+
{
|
| 678 |
+
"id": "judge-proxy-v1/heldout/adequacy/00125",
|
| 679 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 680 |
+
"seconds": 0.023,
|
| 681 |
+
"input_tokens": 156,
|
| 682 |
+
"temperature": 1.3
|
| 683 |
+
},
|
| 684 |
+
{
|
| 685 |
+
"id": "judge-proxy-v1/heldout/adequacy/00139",
|
| 686 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 687 |
+
"seconds": 0.0228,
|
| 688 |
+
"input_tokens": 185,
|
| 689 |
+
"temperature": 1.3
|
| 690 |
+
},
|
| 691 |
+
{
|
| 692 |
+
"id": "judge-proxy-v1/heldout/adequacy/00136",
|
| 693 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 694 |
+
"seconds": 0.0222,
|
| 695 |
+
"input_tokens": 138,
|
| 696 |
+
"temperature": 1.3
|
| 697 |
+
},
|
| 698 |
+
{
|
| 699 |
+
"id": "original-ordinal-04-1",
|
| 700 |
+
"suite": "jevbench-original",
|
| 701 |
+
"seconds": 0.0223,
|
| 702 |
+
"input_tokens": 123,
|
| 703 |
+
"temperature": 1.3
|
| 704 |
+
},
|
| 705 |
+
{
|
| 706 |
+
"id": "original-extraction-02-1",
|
| 707 |
+
"suite": "jevbench-original",
|
| 708 |
+
"seconds": 0.0223,
|
| 709 |
+
"input_tokens": 105,
|
| 710 |
+
"temperature": 1.3
|
| 711 |
+
},
|
| 712 |
+
{
|
| 713 |
+
"id": "internal-eval-v1/probability/0050",
|
| 714 |
+
"suite": "internal-eval-v1",
|
| 715 |
+
"seconds": 0.0228,
|
| 716 |
+
"input_tokens": 217,
|
| 717 |
+
"temperature": 1.3
|
| 718 |
+
},
|
| 719 |
+
{
|
| 720 |
+
"id": "judge-proxy-v1/heldout/routing/00220",
|
| 721 |
+
"suite": "judge-proxy-v1/routing",
|
| 722 |
+
"seconds": 0.0286,
|
| 723 |
+
"input_tokens": 192,
|
| 724 |
+
"temperature": 1.3
|
| 725 |
+
},
|
| 726 |
+
{
|
| 727 |
+
"id": "judge-proxy-v1/heldout/adequacy/00063",
|
| 728 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 729 |
+
"seconds": 0.0225,
|
| 730 |
+
"input_tokens": 200,
|
| 731 |
+
"temperature": 1.3
|
| 732 |
+
},
|
| 733 |
+
{
|
| 734 |
+
"id": "judge-proxy-v1/heldout/adequacy/00144",
|
| 735 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 736 |
+
"seconds": 0.0253,
|
| 737 |
+
"input_tokens": 183,
|
| 738 |
+
"temperature": 1.3
|
| 739 |
+
},
|
| 740 |
+
{
|
| 741 |
+
"id": "judge-proxy-v1/heldout/routing/00271",
|
| 742 |
+
"suite": "judge-proxy-v1/routing",
|
| 743 |
+
"seconds": 0.0237,
|
| 744 |
+
"input_tokens": 235,
|
| 745 |
+
"temperature": 1.3
|
| 746 |
+
},
|
| 747 |
+
{
|
| 748 |
+
"id": "original-ordinal-03-1",
|
| 749 |
+
"suite": "jevbench-original",
|
| 750 |
+
"seconds": 0.022,
|
| 751 |
+
"input_tokens": 124,
|
| 752 |
+
"temperature": 1.3
|
| 753 |
+
},
|
| 754 |
+
{
|
| 755 |
+
"id": "judge-proxy-v1/heldout/adequacy/00155",
|
| 756 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 757 |
+
"seconds": 0.0217,
|
| 758 |
+
"input_tokens": 182,
|
| 759 |
+
"temperature": 1.3
|
| 760 |
+
},
|
| 761 |
+
{
|
| 762 |
+
"id": "internal-eval-v1/ambiguous/0089",
|
| 763 |
+
"suite": "internal-eval-v1",
|
| 764 |
+
"seconds": 0.022,
|
| 765 |
+
"input_tokens": 244,
|
| 766 |
+
"temperature": 1.3
|
| 767 |
+
},
|
| 768 |
+
{
|
| 769 |
+
"id": "judge-proxy-v1/heldout/adequacy/00047",
|
| 770 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 771 |
+
"seconds": 0.0215,
|
| 772 |
+
"input_tokens": 140,
|
| 773 |
+
"temperature": 1.3
|
| 774 |
+
},
|
| 775 |
+
{
|
| 776 |
+
"id": "judge-proxy-v1/heldout/routing/00028",
|
| 777 |
+
"suite": "judge-proxy-v1/routing",
|
| 778 |
+
"seconds": 0.0299,
|
| 779 |
+
"input_tokens": 1028,
|
| 780 |
+
"temperature": 1.3
|
| 781 |
+
},
|
| 782 |
+
{
|
| 783 |
+
"id": "judge-proxy-v1/heldout/adequacy/00210",
|
| 784 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 785 |
+
"seconds": 0.0221,
|
| 786 |
+
"input_tokens": 177,
|
| 787 |
+
"temperature": 1.3
|
| 788 |
+
},
|
| 789 |
+
{
|
| 790 |
+
"id": "original-intent-05-1",
|
| 791 |
+
"suite": "jevbench-original",
|
| 792 |
+
"seconds": 0.0217,
|
| 793 |
+
"input_tokens": 110,
|
| 794 |
+
"temperature": 1.3
|
| 795 |
+
},
|
| 796 |
+
{
|
| 797 |
+
"id": "judge-proxy-v1/heldout/routing/00124",
|
| 798 |
+
"suite": "judge-proxy-v1/routing",
|
| 799 |
+
"seconds": 0.0237,
|
| 800 |
+
"input_tokens": 209,
|
| 801 |
+
"temperature": 1.3
|
| 802 |
+
},
|
| 803 |
+
{
|
| 804 |
+
"id": "internal-eval-v1/judge_hard/0069",
|
| 805 |
+
"suite": "internal-eval-v1",
|
| 806 |
+
"seconds": 0.0219,
|
| 807 |
+
"input_tokens": 230,
|
| 808 |
+
"temperature": 1.3
|
| 809 |
+
},
|
| 810 |
+
{
|
| 811 |
+
"id": "judge-proxy-v1/heldout/routing/00016",
|
| 812 |
+
"suite": "judge-proxy-v1/routing",
|
| 813 |
+
"seconds": 0.0296,
|
| 814 |
+
"input_tokens": 1212,
|
| 815 |
+
"temperature": 1.3
|
| 816 |
+
},
|
| 817 |
+
{
|
| 818 |
+
"id": "judge-proxy-v1/heldout/adequacy/00282",
|
| 819 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 820 |
+
"seconds": 0.0221,
|
| 821 |
+
"input_tokens": 205,
|
| 822 |
+
"temperature": 1.3
|
| 823 |
+
},
|
| 824 |
+
{
|
| 825 |
+
"id": "original-extraction-05-0",
|
| 826 |
+
"suite": "jevbench-original",
|
| 827 |
+
"seconds": 0.0218,
|
| 828 |
+
"input_tokens": 106,
|
| 829 |
+
"temperature": 1.3
|
| 830 |
+
},
|
| 831 |
+
{
|
| 832 |
+
"id": "internal-eval-v1/judge_hard/0080",
|
| 833 |
+
"suite": "internal-eval-v1",
|
| 834 |
+
"seconds": 0.0221,
|
| 835 |
+
"input_tokens": 230,
|
| 836 |
+
"temperature": 1.3
|
| 837 |
+
},
|
| 838 |
+
{
|
| 839 |
+
"id": "original-policy-06-1",
|
| 840 |
+
"suite": "jevbench-original",
|
| 841 |
+
"seconds": 0.0211,
|
| 842 |
+
"input_tokens": 108,
|
| 843 |
+
"temperature": 1.3
|
| 844 |
+
},
|
| 845 |
+
{
|
| 846 |
+
"id": "judge-proxy-v1/heldout/routing/00013",
|
| 847 |
+
"suite": "judge-proxy-v1/routing",
|
| 848 |
+
"seconds": 0.0241,
|
| 849 |
+
"input_tokens": 229,
|
| 850 |
+
"temperature": 1.3
|
| 851 |
+
},
|
| 852 |
+
{
|
| 853 |
+
"id": "judge-proxy-v1/heldout/adequacy/00109",
|
| 854 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 855 |
+
"seconds": 0.0207,
|
| 856 |
+
"input_tokens": 148,
|
| 857 |
+
"temperature": 1.3
|
| 858 |
+
},
|
| 859 |
+
{
|
| 860 |
+
"id": "judge-proxy-v1/heldout/adequacy/00013",
|
| 861 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 862 |
+
"seconds": 0.021,
|
| 863 |
+
"input_tokens": 155,
|
| 864 |
+
"temperature": 1.3
|
| 865 |
+
},
|
| 866 |
+
{
|
| 867 |
+
"id": "internal-eval-v1/long_policy/0020",
|
| 868 |
+
"suite": "internal-eval-v1",
|
| 869 |
+
"seconds": 0.0244,
|
| 870 |
+
"input_tokens": 512,
|
| 871 |
+
"temperature": 1.3
|
| 872 |
+
},
|
| 873 |
+
{
|
| 874 |
+
"id": "original-ordinal-06-0",
|
| 875 |
+
"suite": "jevbench-original",
|
| 876 |
+
"seconds": 0.0218,
|
| 877 |
+
"input_tokens": 127,
|
| 878 |
+
"temperature": 1.3
|
| 879 |
+
},
|
| 880 |
+
{
|
| 881 |
+
"id": "judge-proxy-v1/heldout/routing/00229",
|
| 882 |
+
"suite": "judge-proxy-v1/routing",
|
| 883 |
+
"seconds": 0.031,
|
| 884 |
+
"input_tokens": 1350,
|
| 885 |
+
"temperature": 1.3
|
| 886 |
+
},
|
| 887 |
+
{
|
| 888 |
+
"id": "original-routing-06-0",
|
| 889 |
+
"suite": "jevbench-original",
|
| 890 |
+
"seconds": 0.0213,
|
| 891 |
+
"input_tokens": 140,
|
| 892 |
+
"temperature": 1.3
|
| 893 |
+
},
|
| 894 |
+
{
|
| 895 |
+
"id": "judge-proxy-v1/heldout/adequacy/00130",
|
| 896 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 897 |
+
"seconds": 0.0214,
|
| 898 |
+
"input_tokens": 166,
|
| 899 |
+
"temperature": 1.3
|
| 900 |
+
},
|
| 901 |
+
{
|
| 902 |
+
"id": "original-ordinal-01-1",
|
| 903 |
+
"suite": "jevbench-original",
|
| 904 |
+
"seconds": 0.022,
|
| 905 |
+
"input_tokens": 124,
|
| 906 |
+
"temperature": 1.3
|
| 907 |
+
},
|
| 908 |
+
{
|
| 909 |
+
"id": "original-intent-01-1",
|
| 910 |
+
"suite": "jevbench-original",
|
| 911 |
+
"seconds": 0.0219,
|
| 912 |
+
"input_tokens": 112,
|
| 913 |
+
"temperature": 1.3
|
| 914 |
+
},
|
| 915 |
+
{
|
| 916 |
+
"id": "judge-proxy-v1/heldout/routing/00299",
|
| 917 |
+
"suite": "judge-proxy-v1/routing",
|
| 918 |
+
"seconds": 0.0239,
|
| 919 |
+
"input_tokens": 231,
|
| 920 |
+
"temperature": 1.3
|
| 921 |
+
},
|
| 922 |
+
{
|
| 923 |
+
"id": "original-ordinal-05-1",
|
| 924 |
+
"suite": "jevbench-original",
|
| 925 |
+
"seconds": 0.0213,
|
| 926 |
+
"input_tokens": 126,
|
| 927 |
+
"temperature": 1.3
|
| 928 |
+
},
|
| 929 |
+
{
|
| 930 |
+
"id": "judge-proxy-v1/heldout/adequacy/00018",
|
| 931 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 932 |
+
"seconds": 0.022,
|
| 933 |
+
"input_tokens": 164,
|
| 934 |
+
"temperature": 1.3
|
| 935 |
+
},
|
| 936 |
+
{
|
| 937 |
+
"id": "judge-proxy-v1/heldout/routing/00277",
|
| 938 |
+
"suite": "judge-proxy-v1/routing",
|
| 939 |
+
"seconds": 0.0251,
|
| 940 |
+
"input_tokens": 201,
|
| 941 |
+
"temperature": 1.3
|
| 942 |
+
},
|
| 943 |
+
{
|
| 944 |
+
"id": "judge-proxy-v1/heldout/routing/00149",
|
| 945 |
+
"suite": "judge-proxy-v1/routing",
|
| 946 |
+
"seconds": 0.0244,
|
| 947 |
+
"input_tokens": 255,
|
| 948 |
+
"temperature": 1.3
|
| 949 |
+
},
|
| 950 |
+
{
|
| 951 |
+
"id": "original-adequacy-03-0",
|
| 952 |
+
"suite": "jevbench-original",
|
| 953 |
+
"seconds": 0.0211,
|
| 954 |
+
"input_tokens": 99,
|
| 955 |
+
"temperature": 1.3
|
| 956 |
+
},
|
| 957 |
+
{
|
| 958 |
+
"id": "original-adequacy-05-1",
|
| 959 |
+
"suite": "jevbench-original",
|
| 960 |
+
"seconds": 0.0206,
|
| 961 |
+
"input_tokens": 93,
|
| 962 |
+
"temperature": 1.3
|
| 963 |
+
},
|
| 964 |
+
{
|
| 965 |
+
"id": "judge-proxy-v1/heldout/routing/00007",
|
| 966 |
+
"suite": "judge-proxy-v1/routing",
|
| 967 |
+
"seconds": 0.0332,
|
| 968 |
+
"input_tokens": 200,
|
| 969 |
+
"temperature": 1.3
|
| 970 |
+
},
|
| 971 |
+
{
|
| 972 |
+
"id": "original-policy-03-1",
|
| 973 |
+
"suite": "jevbench-original",
|
| 974 |
+
"seconds": 0.0287,
|
| 975 |
+
"input_tokens": 106,
|
| 976 |
+
"temperature": 1.3
|
| 977 |
+
},
|
| 978 |
+
{
|
| 979 |
+
"id": "judge-proxy-v1/heldout/routing/00289",
|
| 980 |
+
"suite": "judge-proxy-v1/routing",
|
| 981 |
+
"seconds": 0.0286,
|
| 982 |
+
"input_tokens": 235,
|
| 983 |
+
"temperature": 1.3
|
| 984 |
+
},
|
| 985 |
+
{
|
| 986 |
+
"id": "judge-proxy-v1/heldout/adequacy/00120",
|
| 987 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 988 |
+
"seconds": 0.0275,
|
| 989 |
+
"input_tokens": 200,
|
| 990 |
+
"temperature": 1.3
|
| 991 |
+
},
|
| 992 |
+
{
|
| 993 |
+
"id": "judge-proxy-v1/heldout/adequacy/00175",
|
| 994 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 995 |
+
"seconds": 0.0269,
|
| 996 |
+
"input_tokens": 121,
|
| 997 |
+
"temperature": 1.3
|
| 998 |
+
},
|
| 999 |
+
{
|
| 1000 |
+
"id": "judge-proxy-v1/heldout/routing/00029",
|
| 1001 |
+
"suite": "judge-proxy-v1/routing",
|
| 1002 |
+
"seconds": 0.0237,
|
| 1003 |
+
"input_tokens": 194,
|
| 1004 |
+
"temperature": 1.3
|
| 1005 |
+
},
|
| 1006 |
+
{
|
| 1007 |
+
"id": "judge-proxy-v1/heldout/adequacy/00048",
|
| 1008 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1009 |
+
"seconds": 0.021,
|
| 1010 |
+
"input_tokens": 191,
|
| 1011 |
+
"temperature": 1.3
|
| 1012 |
+
},
|
| 1013 |
+
{
|
| 1014 |
+
"id": "judge-proxy-v1/heldout/routing/00225",
|
| 1015 |
+
"suite": "judge-proxy-v1/routing",
|
| 1016 |
+
"seconds": 0.0288,
|
| 1017 |
+
"input_tokens": 925,
|
| 1018 |
+
"temperature": 1.3
|
| 1019 |
+
},
|
| 1020 |
+
{
|
| 1021 |
+
"id": "judge-proxy-v1/heldout/adequacy/00118",
|
| 1022 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1023 |
+
"seconds": 0.023,
|
| 1024 |
+
"input_tokens": 142,
|
| 1025 |
+
"temperature": 1.3
|
| 1026 |
+
},
|
| 1027 |
+
{
|
| 1028 |
+
"id": "original-ordinal-02-1",
|
| 1029 |
+
"suite": "jevbench-original",
|
| 1030 |
+
"seconds": 0.0224,
|
| 1031 |
+
"input_tokens": 126,
|
| 1032 |
+
"temperature": 1.3
|
| 1033 |
+
},
|
| 1034 |
+
{
|
| 1035 |
+
"id": "judge-proxy-v1/heldout/routing/00107",
|
| 1036 |
+
"suite": "judge-proxy-v1/routing",
|
| 1037 |
+
"seconds": 0.0229,
|
| 1038 |
+
"input_tokens": 196,
|
| 1039 |
+
"temperature": 1.3
|
| 1040 |
+
},
|
| 1041 |
+
{
|
| 1042 |
+
"id": "original-extraction-04-0",
|
| 1043 |
+
"suite": "jevbench-original",
|
| 1044 |
+
"seconds": 0.0214,
|
| 1045 |
+
"input_tokens": 105,
|
| 1046 |
+
"temperature": 1.3
|
| 1047 |
+
},
|
| 1048 |
+
{
|
| 1049 |
+
"id": "judge-proxy-v1/heldout/routing/00265",
|
| 1050 |
+
"suite": "judge-proxy-v1/routing",
|
| 1051 |
+
"seconds": 0.0242,
|
| 1052 |
+
"input_tokens": 199,
|
| 1053 |
+
"temperature": 1.3
|
| 1054 |
+
},
|
| 1055 |
+
{
|
| 1056 |
+
"id": "original-ordinal-04-0",
|
| 1057 |
+
"suite": "jevbench-original",
|
| 1058 |
+
"seconds": 0.0218,
|
| 1059 |
+
"input_tokens": 123,
|
| 1060 |
+
"temperature": 1.3
|
| 1061 |
+
},
|
| 1062 |
+
{
|
| 1063 |
+
"id": "judge-proxy-v1/heldout/routing/00165",
|
| 1064 |
+
"suite": "judge-proxy-v1/routing",
|
| 1065 |
+
"seconds": 0.0236,
|
| 1066 |
+
"input_tokens": 217,
|
| 1067 |
+
"temperature": 1.3
|
| 1068 |
+
},
|
| 1069 |
+
{
|
| 1070 |
+
"id": "judge-proxy-v1/heldout/adequacy/00256",
|
| 1071 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1072 |
+
"seconds": 0.0212,
|
| 1073 |
+
"input_tokens": 185,
|
| 1074 |
+
"temperature": 1.3
|
| 1075 |
+
},
|
| 1076 |
+
{
|
| 1077 |
+
"id": "judge-proxy-v1/heldout/routing/00128",
|
| 1078 |
+
"suite": "judge-proxy-v1/routing",
|
| 1079 |
+
"seconds": 0.0237,
|
| 1080 |
+
"input_tokens": 193,
|
| 1081 |
+
"temperature": 1.3
|
| 1082 |
+
},
|
| 1083 |
+
{
|
| 1084 |
+
"id": "judge-proxy-v1/heldout/routing/00075",
|
| 1085 |
+
"suite": "judge-proxy-v1/routing",
|
| 1086 |
+
"seconds": 0.024,
|
| 1087 |
+
"input_tokens": 305,
|
| 1088 |
+
"temperature": 1.3
|
| 1089 |
+
},
|
| 1090 |
+
{
|
| 1091 |
+
"id": "original-policy-04-1",
|
| 1092 |
+
"suite": "jevbench-original",
|
| 1093 |
+
"seconds": 0.0213,
|
| 1094 |
+
"input_tokens": 111,
|
| 1095 |
+
"temperature": 1.3
|
| 1096 |
+
},
|
| 1097 |
+
{
|
| 1098 |
+
"id": "judge-proxy-v1/heldout/routing/00273",
|
| 1099 |
+
"suite": "judge-proxy-v1/routing",
|
| 1100 |
+
"seconds": 0.0236,
|
| 1101 |
+
"input_tokens": 223,
|
| 1102 |
+
"temperature": 1.3
|
| 1103 |
+
},
|
| 1104 |
+
{
|
| 1105 |
+
"id": "internal-eval-v1/probability/0006",
|
| 1106 |
+
"suite": "internal-eval-v1",
|
| 1107 |
+
"seconds": 0.0224,
|
| 1108 |
+
"input_tokens": 220,
|
| 1109 |
+
"temperature": 1.3
|
| 1110 |
+
},
|
| 1111 |
+
{
|
| 1112 |
+
"id": "judge-proxy-v1/heldout/routing/00176",
|
| 1113 |
+
"suite": "judge-proxy-v1/routing",
|
| 1114 |
+
"seconds": 0.0237,
|
| 1115 |
+
"input_tokens": 279,
|
| 1116 |
+
"temperature": 1.3
|
| 1117 |
+
},
|
| 1118 |
+
{
|
| 1119 |
+
"id": "judge-proxy-v1/heldout/adequacy/00195",
|
| 1120 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1121 |
+
"seconds": 0.0216,
|
| 1122 |
+
"input_tokens": 136,
|
| 1123 |
+
"temperature": 1.3
|
| 1124 |
+
},
|
| 1125 |
+
{
|
| 1126 |
+
"id": "judge-proxy-v1/heldout/routing/00242",
|
| 1127 |
+
"suite": "judge-proxy-v1/routing",
|
| 1128 |
+
"seconds": 0.023,
|
| 1129 |
+
"input_tokens": 245,
|
| 1130 |
+
"temperature": 1.3
|
| 1131 |
+
},
|
| 1132 |
+
{
|
| 1133 |
+
"id": "original-routing-02-0",
|
| 1134 |
+
"suite": "jevbench-original",
|
| 1135 |
+
"seconds": 0.0219,
|
| 1136 |
+
"input_tokens": 144,
|
| 1137 |
+
"temperature": 1.3
|
| 1138 |
+
},
|
| 1139 |
+
{
|
| 1140 |
+
"id": "judge-proxy-v1/heldout/routing/00297",
|
| 1141 |
+
"suite": "judge-proxy-v1/routing",
|
| 1142 |
+
"seconds": 0.0228,
|
| 1143 |
+
"input_tokens": 197,
|
| 1144 |
+
"temperature": 1.3
|
| 1145 |
+
},
|
| 1146 |
+
{
|
| 1147 |
+
"id": "internal-eval-v1/probability/0030",
|
| 1148 |
+
"suite": "internal-eval-v1",
|
| 1149 |
+
"seconds": 0.0216,
|
| 1150 |
+
"input_tokens": 219,
|
| 1151 |
+
"temperature": 1.3
|
| 1152 |
+
},
|
| 1153 |
+
{
|
| 1154 |
+
"id": "judge-proxy-v1/heldout/adequacy/00005",
|
| 1155 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1156 |
+
"seconds": 0.0212,
|
| 1157 |
+
"input_tokens": 135,
|
| 1158 |
+
"temperature": 1.3
|
| 1159 |
+
},
|
| 1160 |
+
{
|
| 1161 |
+
"id": "judge-proxy-v1/heldout/routing/00034",
|
| 1162 |
+
"suite": "judge-proxy-v1/routing",
|
| 1163 |
+
"seconds": 0.042,
|
| 1164 |
+
"input_tokens": 2184,
|
| 1165 |
+
"temperature": 1.3
|
| 1166 |
+
},
|
| 1167 |
+
{
|
| 1168 |
+
"id": "judge-proxy-v1/heldout/routing/00151",
|
| 1169 |
+
"suite": "judge-proxy-v1/routing",
|
| 1170 |
+
"seconds": 0.0229,
|
| 1171 |
+
"input_tokens": 206,
|
| 1172 |
+
"temperature": 1.3
|
| 1173 |
+
},
|
| 1174 |
+
{
|
| 1175 |
+
"id": "judge-proxy-v1/heldout/routing/00286",
|
| 1176 |
+
"suite": "judge-proxy-v1/routing",
|
| 1177 |
+
"seconds": 0.0227,
|
| 1178 |
+
"input_tokens": 308,
|
| 1179 |
+
"temperature": 1.3
|
| 1180 |
+
},
|
| 1181 |
+
{
|
| 1182 |
+
"id": "original-adequacy-05-0",
|
| 1183 |
+
"suite": "jevbench-original",
|
| 1184 |
+
"seconds": 0.0199,
|
| 1185 |
+
"input_tokens": 93,
|
| 1186 |
+
"temperature": 1.3
|
| 1187 |
+
},
|
| 1188 |
+
{
|
| 1189 |
+
"id": "original-intent-02-0",
|
| 1190 |
+
"suite": "jevbench-original",
|
| 1191 |
+
"seconds": 0.0209,
|
| 1192 |
+
"input_tokens": 111,
|
| 1193 |
+
"temperature": 1.3
|
| 1194 |
+
},
|
| 1195 |
+
{
|
| 1196 |
+
"id": "judge-proxy-v1/heldout/routing/00168",
|
| 1197 |
+
"suite": "judge-proxy-v1/routing",
|
| 1198 |
+
"seconds": 0.0226,
|
| 1199 |
+
"input_tokens": 202,
|
| 1200 |
+
"temperature": 1.3
|
| 1201 |
+
},
|
| 1202 |
+
{
|
| 1203 |
+
"id": "judge-proxy-v1/heldout/routing/00215",
|
| 1204 |
+
"suite": "judge-proxy-v1/routing",
|
| 1205 |
+
"seconds": 0.0228,
|
| 1206 |
+
"input_tokens": 229,
|
| 1207 |
+
"temperature": 1.3
|
| 1208 |
+
},
|
| 1209 |
+
{
|
| 1210 |
+
"id": "original-adequacy-02-0",
|
| 1211 |
+
"suite": "jevbench-original",
|
| 1212 |
+
"seconds": 0.0209,
|
| 1213 |
+
"input_tokens": 98,
|
| 1214 |
+
"temperature": 1.3
|
| 1215 |
+
},
|
| 1216 |
+
{
|
| 1217 |
+
"id": "judge-proxy-v1/heldout/routing/00030",
|
| 1218 |
+
"suite": "judge-proxy-v1/routing",
|
| 1219 |
+
"seconds": 0.0237,
|
| 1220 |
+
"input_tokens": 219,
|
| 1221 |
+
"temperature": 1.3
|
| 1222 |
+
},
|
| 1223 |
+
{
|
| 1224 |
+
"id": "judge-proxy-v1/heldout/adequacy/00299",
|
| 1225 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1226 |
+
"seconds": 0.0212,
|
| 1227 |
+
"input_tokens": 149,
|
| 1228 |
+
"temperature": 1.3
|
| 1229 |
+
},
|
| 1230 |
+
{
|
| 1231 |
+
"id": "original-extraction-01-0",
|
| 1232 |
+
"suite": "jevbench-original",
|
| 1233 |
+
"seconds": 0.0203,
|
| 1234 |
+
"input_tokens": 103,
|
| 1235 |
+
"temperature": 1.3
|
| 1236 |
+
},
|
| 1237 |
+
{
|
| 1238 |
+
"id": "judge-proxy-v1/heldout/adequacy/00237",
|
| 1239 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1240 |
+
"seconds": 0.0214,
|
| 1241 |
+
"input_tokens": 174,
|
| 1242 |
+
"temperature": 1.3
|
| 1243 |
+
},
|
| 1244 |
+
{
|
| 1245 |
+
"id": "original-adequacy-01-1",
|
| 1246 |
+
"suite": "jevbench-original",
|
| 1247 |
+
"seconds": 0.0214,
|
| 1248 |
+
"input_tokens": 96,
|
| 1249 |
+
"temperature": 1.3
|
| 1250 |
+
},
|
| 1251 |
+
{
|
| 1252 |
+
"id": "judge-proxy-v1/heldout/adequacy/00116",
|
| 1253 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1254 |
+
"seconds": 0.0221,
|
| 1255 |
+
"input_tokens": 202,
|
| 1256 |
+
"temperature": 1.3
|
| 1257 |
+
},
|
| 1258 |
+
{
|
| 1259 |
+
"id": "original-policy-05-1",
|
| 1260 |
+
"suite": "jevbench-original",
|
| 1261 |
+
"seconds": 0.0217,
|
| 1262 |
+
"input_tokens": 109,
|
| 1263 |
+
"temperature": 1.3
|
| 1264 |
+
},
|
| 1265 |
+
{
|
| 1266 |
+
"id": "judge-proxy-v1/heldout/routing/00207",
|
| 1267 |
+
"suite": "judge-proxy-v1/routing",
|
| 1268 |
+
"seconds": 0.0235,
|
| 1269 |
+
"input_tokens": 197,
|
| 1270 |
+
"temperature": 1.3
|
| 1271 |
+
},
|
| 1272 |
+
{
|
| 1273 |
+
"id": "original-ordinal-01-0",
|
| 1274 |
+
"suite": "jevbench-original",
|
| 1275 |
+
"seconds": 0.0213,
|
| 1276 |
+
"input_tokens": 121,
|
| 1277 |
+
"temperature": 1.3
|
| 1278 |
+
},
|
| 1279 |
+
{
|
| 1280 |
+
"id": "original-intent-01-0",
|
| 1281 |
+
"suite": "jevbench-original",
|
| 1282 |
+
"seconds": 0.0233,
|
| 1283 |
+
"input_tokens": 110,
|
| 1284 |
+
"temperature": 1.3
|
| 1285 |
+
},
|
| 1286 |
+
{
|
| 1287 |
+
"id": "internal-eval-v1/judge_hard/0057",
|
| 1288 |
+
"suite": "internal-eval-v1",
|
| 1289 |
+
"seconds": 0.024,
|
| 1290 |
+
"input_tokens": 228,
|
| 1291 |
+
"temperature": 1.3
|
| 1292 |
+
},
|
| 1293 |
+
{
|
| 1294 |
+
"id": "original-adequacy-06-0",
|
| 1295 |
+
"suite": "jevbench-original",
|
| 1296 |
+
"seconds": 0.0222,
|
| 1297 |
+
"input_tokens": 110,
|
| 1298 |
+
"temperature": 1.3
|
| 1299 |
+
},
|
| 1300 |
+
{
|
| 1301 |
+
"id": "judge-proxy-v1/heldout/routing/00041",
|
| 1302 |
+
"suite": "judge-proxy-v1/routing",
|
| 1303 |
+
"seconds": 0.025,
|
| 1304 |
+
"input_tokens": 191,
|
| 1305 |
+
"temperature": 1.3
|
| 1306 |
+
},
|
| 1307 |
+
{
|
| 1308 |
+
"id": "original-routing-01-1",
|
| 1309 |
+
"suite": "jevbench-original",
|
| 1310 |
+
"seconds": 0.023,
|
| 1311 |
+
"input_tokens": 139,
|
| 1312 |
+
"temperature": 1.3
|
| 1313 |
+
},
|
| 1314 |
+
{
|
| 1315 |
+
"id": "original-routing-01-0",
|
| 1316 |
+
"suite": "jevbench-original",
|
| 1317 |
+
"seconds": 0.0229,
|
| 1318 |
+
"input_tokens": 143,
|
| 1319 |
+
"temperature": 1.3
|
| 1320 |
+
},
|
| 1321 |
+
{
|
| 1322 |
+
"id": "original-policy-06-0",
|
| 1323 |
+
"suite": "jevbench-original",
|
| 1324 |
+
"seconds": 0.0218,
|
| 1325 |
+
"input_tokens": 119,
|
| 1326 |
+
"temperature": 1.3
|
| 1327 |
+
},
|
| 1328 |
+
{
|
| 1329 |
+
"id": "internal-eval-v1/multi_hop/0070",
|
| 1330 |
+
"suite": "internal-eval-v1",
|
| 1331 |
+
"seconds": 0.0231,
|
| 1332 |
+
"input_tokens": 290,
|
| 1333 |
+
"temperature": 1.3
|
| 1334 |
+
},
|
| 1335 |
+
{
|
| 1336 |
+
"id": "judge-proxy-v1/heldout/adequacy/00072",
|
| 1337 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1338 |
+
"seconds": 0.0212,
|
| 1339 |
+
"input_tokens": 164,
|
| 1340 |
+
"temperature": 1.3
|
| 1341 |
+
},
|
| 1342 |
+
{
|
| 1343 |
+
"id": "internal-eval-v1/judge_hard/0098",
|
| 1344 |
+
"suite": "internal-eval-v1",
|
| 1345 |
+
"seconds": 0.0235,
|
| 1346 |
+
"input_tokens": 226,
|
| 1347 |
+
"temperature": 1.3
|
| 1348 |
+
},
|
| 1349 |
+
{
|
| 1350 |
+
"id": "judge-proxy-v1/heldout/routing/00196",
|
| 1351 |
+
"suite": "judge-proxy-v1/routing",
|
| 1352 |
+
"seconds": 0.0415,
|
| 1353 |
+
"input_tokens": 2172,
|
| 1354 |
+
"temperature": 1.3
|
| 1355 |
+
},
|
| 1356 |
+
{
|
| 1357 |
+
"id": "original-intent-05-0",
|
| 1358 |
+
"suite": "jevbench-original",
|
| 1359 |
+
"seconds": 0.0217,
|
| 1360 |
+
"input_tokens": 110,
|
| 1361 |
+
"temperature": 1.3
|
| 1362 |
+
},
|
| 1363 |
+
{
|
| 1364 |
+
"id": "judge-proxy-v1/heldout/routing/00076",
|
| 1365 |
+
"suite": "judge-proxy-v1/routing",
|
| 1366 |
+
"seconds": 0.0231,
|
| 1367 |
+
"input_tokens": 230,
|
| 1368 |
+
"temperature": 1.3
|
| 1369 |
+
},
|
| 1370 |
+
{
|
| 1371 |
+
"id": "internal-eval-v1/probability/0051",
|
| 1372 |
+
"suite": "internal-eval-v1",
|
| 1373 |
+
"seconds": 0.0231,
|
| 1374 |
+
"input_tokens": 219,
|
| 1375 |
+
"temperature": 1.3
|
| 1376 |
+
},
|
| 1377 |
+
{
|
| 1378 |
+
"id": "judge-proxy-v1/heldout/routing/00038",
|
| 1379 |
+
"suite": "judge-proxy-v1/routing",
|
| 1380 |
+
"seconds": 0.0426,
|
| 1381 |
+
"input_tokens": 2170,
|
| 1382 |
+
"temperature": 1.3
|
| 1383 |
+
},
|
| 1384 |
+
{
|
| 1385 |
+
"id": "original-adequacy-04-1",
|
| 1386 |
+
"suite": "jevbench-original",
|
| 1387 |
+
"seconds": 0.0213,
|
| 1388 |
+
"input_tokens": 101,
|
| 1389 |
+
"temperature": 1.3
|
| 1390 |
+
},
|
| 1391 |
+
{
|
| 1392 |
+
"id": "original-extraction-01-1",
|
| 1393 |
+
"suite": "jevbench-original",
|
| 1394 |
+
"seconds": 0.0225,
|
| 1395 |
+
"input_tokens": 105,
|
| 1396 |
+
"temperature": 1.3
|
| 1397 |
+
},
|
| 1398 |
+
{
|
| 1399 |
+
"id": "original-extraction-04-1",
|
| 1400 |
+
"suite": "jevbench-original",
|
| 1401 |
+
"seconds": 0.022,
|
| 1402 |
+
"input_tokens": 103,
|
| 1403 |
+
"temperature": 1.3
|
| 1404 |
+
},
|
| 1405 |
+
{
|
| 1406 |
+
"id": "judge-proxy-v1/heldout/routing/00174",
|
| 1407 |
+
"suite": "judge-proxy-v1/routing",
|
| 1408 |
+
"seconds": 0.0247,
|
| 1409 |
+
"input_tokens": 199,
|
| 1410 |
+
"temperature": 1.3
|
| 1411 |
+
},
|
| 1412 |
+
{
|
| 1413 |
+
"id": "judge-proxy-v1/heldout/routing/00155",
|
| 1414 |
+
"suite": "judge-proxy-v1/routing",
|
| 1415 |
+
"seconds": 0.0302,
|
| 1416 |
+
"input_tokens": 1173,
|
| 1417 |
+
"temperature": 1.3
|
| 1418 |
+
},
|
| 1419 |
+
{
|
| 1420 |
+
"id": "judge-proxy-v1/heldout/routing/00088",
|
| 1421 |
+
"suite": "judge-proxy-v1/routing",
|
| 1422 |
+
"seconds": 0.0252,
|
| 1423 |
+
"input_tokens": 633,
|
| 1424 |
+
"temperature": 1.3
|
| 1425 |
+
},
|
| 1426 |
+
{
|
| 1427 |
+
"id": "original-extraction-05-1",
|
| 1428 |
+
"suite": "jevbench-original",
|
| 1429 |
+
"seconds": 0.021,
|
| 1430 |
+
"input_tokens": 102,
|
| 1431 |
+
"temperature": 1.3
|
| 1432 |
+
},
|
| 1433 |
+
{
|
| 1434 |
+
"id": "original-adequacy-03-1",
|
| 1435 |
+
"suite": "jevbench-original",
|
| 1436 |
+
"seconds": 0.022,
|
| 1437 |
+
"input_tokens": 103,
|
| 1438 |
+
"temperature": 1.3
|
| 1439 |
+
},
|
| 1440 |
+
{
|
| 1441 |
+
"id": "original-routing-05-0",
|
| 1442 |
+
"suite": "jevbench-original",
|
| 1443 |
+
"seconds": 0.0231,
|
| 1444 |
+
"input_tokens": 140,
|
| 1445 |
+
"temperature": 1.3
|
| 1446 |
+
},
|
| 1447 |
+
{
|
| 1448 |
+
"id": "judge-proxy-v1/heldout/adequacy/00069",
|
| 1449 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1450 |
+
"seconds": 0.0223,
|
| 1451 |
+
"input_tokens": 172,
|
| 1452 |
+
"temperature": 1.3
|
| 1453 |
+
},
|
| 1454 |
+
{
|
| 1455 |
+
"id": "judge-proxy-v1/heldout/adequacy/00088",
|
| 1456 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1457 |
+
"seconds": 0.0208,
|
| 1458 |
+
"input_tokens": 169,
|
| 1459 |
+
"temperature": 1.3
|
| 1460 |
+
},
|
| 1461 |
+
{
|
| 1462 |
+
"id": "judge-proxy-v1/heldout/routing/00264",
|
| 1463 |
+
"suite": "judge-proxy-v1/routing",
|
| 1464 |
+
"seconds": 0.0234,
|
| 1465 |
+
"input_tokens": 195,
|
| 1466 |
+
"temperature": 1.3
|
| 1467 |
+
},
|
| 1468 |
+
{
|
| 1469 |
+
"id": "judge-proxy-v1/heldout/routing/00285",
|
| 1470 |
+
"suite": "judge-proxy-v1/routing",
|
| 1471 |
+
"seconds": 0.0466,
|
| 1472 |
+
"input_tokens": 2171,
|
| 1473 |
+
"temperature": 1.3
|
| 1474 |
+
},
|
| 1475 |
+
{
|
| 1476 |
+
"id": "judge-proxy-v1/heldout/adequacy/00298",
|
| 1477 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1478 |
+
"seconds": 0.0216,
|
| 1479 |
+
"input_tokens": 181,
|
| 1480 |
+
"temperature": 1.3
|
| 1481 |
+
},
|
| 1482 |
+
{
|
| 1483 |
+
"id": "original-routing-06-1",
|
| 1484 |
+
"suite": "jevbench-original",
|
| 1485 |
+
"seconds": 0.0214,
|
| 1486 |
+
"input_tokens": 138,
|
| 1487 |
+
"temperature": 1.3
|
| 1488 |
+
},
|
| 1489 |
+
{
|
| 1490 |
+
"id": "judge-proxy-v1/heldout/adequacy/00092",
|
| 1491 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1492 |
+
"seconds": 0.0346,
|
| 1493 |
+
"input_tokens": 176,
|
| 1494 |
+
"temperature": 1.3
|
| 1495 |
+
},
|
| 1496 |
+
{
|
| 1497 |
+
"id": "original-policy-03-0",
|
| 1498 |
+
"suite": "jevbench-original",
|
| 1499 |
+
"seconds": 0.0205,
|
| 1500 |
+
"input_tokens": 106,
|
| 1501 |
+
"temperature": 1.3
|
| 1502 |
+
},
|
| 1503 |
+
{
|
| 1504 |
+
"id": "judge-proxy-v1/heldout/adequacy/00242",
|
| 1505 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1506 |
+
"seconds": 0.0205,
|
| 1507 |
+
"input_tokens": 183,
|
| 1508 |
+
"temperature": 1.3
|
| 1509 |
+
},
|
| 1510 |
+
{
|
| 1511 |
+
"id": "judge-proxy-v1/heldout/adequacy/00251",
|
| 1512 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1513 |
+
"seconds": 0.0214,
|
| 1514 |
+
"input_tokens": 186,
|
| 1515 |
+
"temperature": 1.3
|
| 1516 |
+
},
|
| 1517 |
+
{
|
| 1518 |
+
"id": "judge-proxy-v1/heldout/adequacy/00184",
|
| 1519 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1520 |
+
"seconds": 0.0216,
|
| 1521 |
+
"input_tokens": 187,
|
| 1522 |
+
"temperature": 1.3
|
| 1523 |
+
},
|
| 1524 |
+
{
|
| 1525 |
+
"id": "internal-eval-v1/temporal_numeric/0040",
|
| 1526 |
+
"suite": "internal-eval-v1",
|
| 1527 |
+
"seconds": 0.0215,
|
| 1528 |
+
"input_tokens": 290,
|
| 1529 |
+
"temperature": 1.3
|
| 1530 |
+
},
|
| 1531 |
+
{
|
| 1532 |
+
"id": "judge-proxy-v1/heldout/routing/00230",
|
| 1533 |
+
"suite": "judge-proxy-v1/routing",
|
| 1534 |
+
"seconds": 0.0299,
|
| 1535 |
+
"input_tokens": 613,
|
| 1536 |
+
"temperature": 1.3
|
| 1537 |
+
},
|
| 1538 |
+
{
|
| 1539 |
+
"id": "judge-proxy-v1/heldout/adequacy/00127",
|
| 1540 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1541 |
+
"seconds": 0.0227,
|
| 1542 |
+
"input_tokens": 168,
|
| 1543 |
+
"temperature": 1.3
|
| 1544 |
+
},
|
| 1545 |
+
{
|
| 1546 |
+
"id": "internal-eval-v1/probability/0003",
|
| 1547 |
+
"suite": "internal-eval-v1",
|
| 1548 |
+
"seconds": 0.0347,
|
| 1549 |
+
"input_tokens": 219,
|
| 1550 |
+
"temperature": 1.3
|
| 1551 |
+
},
|
| 1552 |
+
{
|
| 1553 |
+
"id": "judge-proxy-v1/heldout/adequacy/00176",
|
| 1554 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1555 |
+
"seconds": 0.0243,
|
| 1556 |
+
"input_tokens": 180,
|
| 1557 |
+
"temperature": 1.3
|
| 1558 |
+
},
|
| 1559 |
+
{
|
| 1560 |
+
"id": "original-routing-05-1",
|
| 1561 |
+
"suite": "jevbench-original",
|
| 1562 |
+
"seconds": 0.0225,
|
| 1563 |
+
"input_tokens": 140,
|
| 1564 |
+
"temperature": 1.3
|
| 1565 |
+
},
|
| 1566 |
+
{
|
| 1567 |
+
"id": "judge-proxy-v1/heldout/adequacy/00260",
|
| 1568 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1569 |
+
"seconds": 0.0219,
|
| 1570 |
+
"input_tokens": 191,
|
| 1571 |
+
"temperature": 1.3
|
| 1572 |
+
},
|
| 1573 |
+
{
|
| 1574 |
+
"id": "judge-proxy-v1/heldout/routing/00042",
|
| 1575 |
+
"suite": "judge-proxy-v1/routing",
|
| 1576 |
+
"seconds": 0.0245,
|
| 1577 |
+
"input_tokens": 267,
|
| 1578 |
+
"temperature": 1.3
|
| 1579 |
+
},
|
| 1580 |
+
{
|
| 1581 |
+
"id": "judge-proxy-v1/heldout/adequacy/00056",
|
| 1582 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1583 |
+
"seconds": 0.0222,
|
| 1584 |
+
"input_tokens": 159,
|
| 1585 |
+
"temperature": 1.3
|
| 1586 |
+
},
|
| 1587 |
+
{
|
| 1588 |
+
"id": "judge-proxy-v1/heldout/adequacy/00052",
|
| 1589 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1590 |
+
"seconds": 0.0216,
|
| 1591 |
+
"input_tokens": 164,
|
| 1592 |
+
"temperature": 1.3
|
| 1593 |
+
},
|
| 1594 |
+
{
|
| 1595 |
+
"id": "judge-proxy-v1/heldout/routing/00097",
|
| 1596 |
+
"suite": "judge-proxy-v1/routing",
|
| 1597 |
+
"seconds": 0.0237,
|
| 1598 |
+
"input_tokens": 217,
|
| 1599 |
+
"temperature": 1.3
|
| 1600 |
+
},
|
| 1601 |
+
{
|
| 1602 |
+
"id": "judge-proxy-v1/heldout/adequacy/00044",
|
| 1603 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1604 |
+
"seconds": 0.0211,
|
| 1605 |
+
"input_tokens": 135,
|
| 1606 |
+
"temperature": 1.3
|
| 1607 |
+
},
|
| 1608 |
+
{
|
| 1609 |
+
"id": "judge-proxy-v1/heldout/adequacy/00146",
|
| 1610 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1611 |
+
"seconds": 0.0211,
|
| 1612 |
+
"input_tokens": 192,
|
| 1613 |
+
"temperature": 1.3
|
| 1614 |
+
},
|
| 1615 |
+
{
|
| 1616 |
+
"id": "judge-proxy-v1/heldout/routing/00260",
|
| 1617 |
+
"suite": "judge-proxy-v1/routing",
|
| 1618 |
+
"seconds": 0.0243,
|
| 1619 |
+
"input_tokens": 231,
|
| 1620 |
+
"temperature": 1.3
|
| 1621 |
+
},
|
| 1622 |
+
{
|
| 1623 |
+
"id": "original-intent-04-1",
|
| 1624 |
+
"suite": "jevbench-original",
|
| 1625 |
+
"seconds": 0.0227,
|
| 1626 |
+
"input_tokens": 110,
|
| 1627 |
+
"temperature": 1.3
|
| 1628 |
+
},
|
| 1629 |
+
{
|
| 1630 |
+
"id": "original-intent-03-1",
|
| 1631 |
+
"suite": "jevbench-original",
|
| 1632 |
+
"seconds": 0.0226,
|
| 1633 |
+
"input_tokens": 110,
|
| 1634 |
+
"temperature": 1.3
|
| 1635 |
+
},
|
| 1636 |
+
{
|
| 1637 |
+
"id": "original-intent-02-1",
|
| 1638 |
+
"suite": "jevbench-original",
|
| 1639 |
+
"seconds": 0.0223,
|
| 1640 |
+
"input_tokens": 110,
|
| 1641 |
+
"temperature": 1.3
|
| 1642 |
+
},
|
| 1643 |
+
{
|
| 1644 |
+
"id": "judge-proxy-v1/heldout/routing/00031",
|
| 1645 |
+
"suite": "judge-proxy-v1/routing",
|
| 1646 |
+
"seconds": 0.0254,
|
| 1647 |
+
"input_tokens": 221,
|
| 1648 |
+
"temperature": 1.3
|
| 1649 |
+
},
|
| 1650 |
+
{
|
| 1651 |
+
"id": "judge-proxy-v1/heldout/adequacy/00171",
|
| 1652 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1653 |
+
"seconds": 0.0218,
|
| 1654 |
+
"input_tokens": 171,
|
| 1655 |
+
"temperature": 1.3
|
| 1656 |
+
},
|
| 1657 |
+
{
|
| 1658 |
+
"id": "internal-eval-v1/ambiguous/0091",
|
| 1659 |
+
"suite": "internal-eval-v1",
|
| 1660 |
+
"seconds": 0.0222,
|
| 1661 |
+
"input_tokens": 233,
|
| 1662 |
+
"temperature": 1.3
|
| 1663 |
+
},
|
| 1664 |
+
{
|
| 1665 |
+
"id": "original-policy-05-0",
|
| 1666 |
+
"suite": "jevbench-original",
|
| 1667 |
+
"seconds": 0.0215,
|
| 1668 |
+
"input_tokens": 116,
|
| 1669 |
+
"temperature": 1.3
|
| 1670 |
+
},
|
| 1671 |
+
{
|
| 1672 |
+
"id": "judge-proxy-v1/heldout/routing/00252",
|
| 1673 |
+
"suite": "judge-proxy-v1/routing",
|
| 1674 |
+
"seconds": 0.0237,
|
| 1675 |
+
"input_tokens": 210,
|
| 1676 |
+
"temperature": 1.3
|
| 1677 |
+
},
|
| 1678 |
+
{
|
| 1679 |
+
"id": "judge-proxy-v1/heldout/routing/00291",
|
| 1680 |
+
"suite": "judge-proxy-v1/routing",
|
| 1681 |
+
"seconds": 0.0235,
|
| 1682 |
+
"input_tokens": 210,
|
| 1683 |
+
"temperature": 1.3
|
| 1684 |
+
},
|
| 1685 |
+
{
|
| 1686 |
+
"id": "judge-proxy-v1/heldout/adequacy/00214",
|
| 1687 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1688 |
+
"seconds": 0.0214,
|
| 1689 |
+
"input_tokens": 200,
|
| 1690 |
+
"temperature": 1.3
|
| 1691 |
+
},
|
| 1692 |
+
{
|
| 1693 |
+
"id": "judge-proxy-v1/heldout/adequacy/00033",
|
| 1694 |
+
"suite": "judge-proxy-v1/adequacy",
|
| 1695 |
+
"seconds": 0.0226,
|
| 1696 |
+
"input_tokens": 154,
|
| 1697 |
+
"temperature": 1.3
|
| 1698 |
+
},
|
| 1699 |
+
{
|
| 1700 |
+
"id": "judge-proxy-v1/heldout/routing/00213",
|
| 1701 |
+
"suite": "judge-proxy-v1/routing",
|
| 1702 |
+
"seconds": 0.0265,
|
| 1703 |
+
"input_tokens": 270,
|
| 1704 |
+
"temperature": 1.3
|
| 1705 |
+
},
|
| 1706 |
+
{
|
| 1707 |
+
"id": "judge-proxy-v1/heldout/routing/00104",
|
| 1708 |
+
"suite": "judge-proxy-v1/routing",
|
| 1709 |
+
"seconds": 0.0239,
|
| 1710 |
+
"input_tokens": 219,
|
| 1711 |
+
"temperature": 1.3
|
| 1712 |
+
},
|
| 1713 |
+
{
|
| 1714 |
+
"id": "original-extraction-03-0",
|
| 1715 |
+
"suite": "jevbench-original",
|
| 1716 |
+
"seconds": 0.0212,
|
| 1717 |
+
"input_tokens": 109,
|
| 1718 |
+
"temperature": 1.3
|
| 1719 |
+
},
|
| 1720 |
+
{
|
| 1721 |
+
"id": "original-ordinal-06-1",
|
| 1722 |
+
"suite": "jevbench-original",
|
| 1723 |
+
"seconds": 0.0214,
|
| 1724 |
+
"input_tokens": 135,
|
| 1725 |
+
"temperature": 1.3
|
| 1726 |
+
}
|
| 1727 |
+
]
|
| 1728 |
+
}
|
evidence/served-nosys-original-report.json
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"status": "complete",
|
| 3 |
+
"requested_records": 72,
|
| 4 |
+
"requested_questions": 72,
|
| 5 |
+
"attempted_requests": 72,
|
| 6 |
+
"successful_requests": 72,
|
| 7 |
+
"errors": 0,
|
| 8 |
+
"served_models": [
|
| 9 |
+
"decision-model"
|
| 10 |
+
],
|
| 11 |
+
"elapsed_measurement_s": 1.6658977939805482,
|
| 12 |
+
"requests_per_second": 43.219938378068775,
|
| 13 |
+
"questions_per_second": 43.219938378068775,
|
| 14 |
+
"latency_ms": {
|
| 15 |
+
"n": 72,
|
| 16 |
+
"mean": 23.027374291511176,
|
| 17 |
+
"p50": 22.36310299485922,
|
| 18 |
+
"p95": 30.51040534919594,
|
| 19 |
+
"p99": 34.34268011507812
|
| 20 |
+
},
|
| 21 |
+
"adapter_ms": {
|
| 22 |
+
"n": 72,
|
| 23 |
+
"mean": 21.671233003467528,
|
| 24 |
+
"p50": 21.02683151315432,
|
| 25 |
+
"p95": 29.079331248067323,
|
| 26 |
+
"p99": 31.649900618358537
|
| 27 |
+
},
|
| 28 |
+
"input_tokens_per_request": {
|
| 29 |
+
"n": 72,
|
| 30 |
+
"mean": 115.54166666666667,
|
| 31 |
+
"p50": 110.0,
|
| 32 |
+
"p95": 141.35000000000002,
|
| 33 |
+
"p99": 144.58
|
| 34 |
+
},
|
| 35 |
+
"suites": {
|
| 36 |
+
"jevbench-original/public": {
|
| 37 |
+
"clean": {
|
| 38 |
+
"n": 72,
|
| 39 |
+
"acc": 0.875,
|
| 40 |
+
"nll": 0.2811701595983037,
|
| 41 |
+
"brier": 0.16998368696190747,
|
| 42 |
+
"ece": 0.027585444231134813,
|
| 43 |
+
"mean_conf": 0.9003661785243816,
|
| 44 |
+
"confidence_bias": 0.02536617852438161,
|
| 45 |
+
"confident_error_rate": 0.013888888888888888,
|
| 46 |
+
"coverage_at_0_9": 0.6666666666666666,
|
| 47 |
+
"accuracy_at_0_9": 0.9791666666666666,
|
| 48 |
+
"coverage_at_5pct_error": 0.8333333333333334,
|
| 49 |
+
"coverage_at_1pct_error": 0.5277777777777778,
|
| 50 |
+
"score_mae": 0.14433068031614896,
|
| 51 |
+
"ranked_probability_score": 0.021378525778158384
|
| 52 |
+
},
|
| 53 |
+
"tasks": {
|
| 54 |
+
"adequacy": {
|
| 55 |
+
"n": 12,
|
| 56 |
+
"acc": 0.6666666666666666,
|
| 57 |
+
"nll": 0.7816227650376891,
|
| 58 |
+
"brier": 0.5076781498841229,
|
| 59 |
+
"ece": 0.19641208292198364,
|
| 60 |
+
"mean_conf": 0.8096085306199567,
|
| 61 |
+
"confidence_bias": 0.14294186395329012,
|
| 62 |
+
"confident_error_rate": 0.08333333333333333,
|
| 63 |
+
"coverage_at_0_9": 0.3333333333333333,
|
| 64 |
+
"accuracy_at_0_9": 0.75,
|
| 65 |
+
"coverage_at_5pct_error": 0.25,
|
| 66 |
+
"coverage_at_1pct_error": 0.25
|
| 67 |
+
},
|
| 68 |
+
"extraction": {
|
| 69 |
+
"n": 12,
|
| 70 |
+
"acc": 1.0,
|
| 71 |
+
"nll": 0.0542116119441933,
|
| 72 |
+
"brier": 0.01493325495130398,
|
| 73 |
+
"ece": 0.0495188270475546,
|
| 74 |
+
"mean_conf": 0.9504811729524453,
|
| 75 |
+
"confidence_bias": -0.049518827047554725,
|
| 76 |
+
"confident_error_rate": 0.0,
|
| 77 |
+
"coverage_at_0_9": 0.8333333333333334,
|
| 78 |
+
"accuracy_at_0_9": 1.0,
|
| 79 |
+
"coverage_at_5pct_error": 1.0,
|
| 80 |
+
"coverage_at_1pct_error": 1.0
|
| 81 |
+
},
|
| 82 |
+
"intent": {
|
| 83 |
+
"n": 12,
|
| 84 |
+
"acc": 0.8333333333333334,
|
| 85 |
+
"nll": 0.30572276294355083,
|
| 86 |
+
"brier": 0.20045464895299747,
|
| 87 |
+
"ece": 0.14304785668742614,
|
| 88 |
+
"mean_conf": 0.9322074612496651,
|
| 89 |
+
"confidence_bias": 0.09887412791633177,
|
| 90 |
+
"confident_error_rate": 0.0,
|
| 91 |
+
"coverage_at_0_9": 0.75,
|
| 92 |
+
"accuracy_at_0_9": 1.0,
|
| 93 |
+
"coverage_at_5pct_error": 0.8333333333333334,
|
| 94 |
+
"coverage_at_1pct_error": 0.8333333333333334
|
| 95 |
+
},
|
| 96 |
+
"ordinal": {
|
| 97 |
+
"n": 12,
|
| 98 |
+
"acc": 0.9166666666666666,
|
| 99 |
+
"nll": 0.20756268320968063,
|
| 100 |
+
"brier": 0.10919592930395382,
|
| 101 |
+
"ece": 0.12099966786008741,
|
| 102 |
+
"mean_conf": 0.9077797081312969,
|
| 103 |
+
"confidence_bias": -0.008886958535369693,
|
| 104 |
+
"confident_error_rate": 0.0,
|
| 105 |
+
"coverage_at_0_9": 0.6666666666666666,
|
| 106 |
+
"accuracy_at_0_9": 1.0,
|
| 107 |
+
"coverage_at_5pct_error": 0.9166666666666666,
|
| 108 |
+
"coverage_at_1pct_error": 0.9166666666666666,
|
| 109 |
+
"score_mae": 0.14433068031614896,
|
| 110 |
+
"ranked_probability_score": 0.021378525778158384
|
| 111 |
+
},
|
| 112 |
+
"policy": {
|
| 113 |
+
"n": 12,
|
| 114 |
+
"acc": 0.9166666666666666,
|
| 115 |
+
"nll": 0.10467945507562453,
|
| 116 |
+
"brier": 0.05772104532732034,
|
| 117 |
+
"ece": 0.08135385206374438,
|
| 118 |
+
"mean_conf": 0.9290088980838886,
|
| 119 |
+
"confidence_bias": 0.012342231417222016,
|
| 120 |
+
"confident_error_rate": 0.0,
|
| 121 |
+
"coverage_at_0_9": 0.8333333333333334,
|
| 122 |
+
"accuracy_at_0_9": 1.0,
|
| 123 |
+
"coverage_at_5pct_error": 0.9166666666666666,
|
| 124 |
+
"coverage_at_1pct_error": 0.9166666666666666
|
| 125 |
+
},
|
| 126 |
+
"routing": {
|
| 127 |
+
"n": 12,
|
| 128 |
+
"acc": 0.9166666666666666,
|
| 129 |
+
"nll": 0.23322167937908408,
|
| 130 |
+
"brier": 0.12991909335174637,
|
| 131 |
+
"ece": 0.1168843091364116,
|
| 132 |
+
"mean_conf": 0.8731113001090374,
|
| 133 |
+
"confidence_bias": -0.04355536655762926,
|
| 134 |
+
"confident_error_rate": 0.0,
|
| 135 |
+
"coverage_at_0_9": 0.5833333333333334,
|
| 136 |
+
"accuracy_at_0_9": 1.0,
|
| 137 |
+
"coverage_at_5pct_error": 0.75,
|
| 138 |
+
"coverage_at_1pct_error": 0.75
|
| 139 |
+
}
|
| 140 |
+
},
|
| 141 |
+
"sources": {
|
| 142 |
+
"adequacy": {
|
| 143 |
+
"n": 12,
|
| 144 |
+
"acc": 0.6666666666666666,
|
| 145 |
+
"nll": 0.7816227650376891,
|
| 146 |
+
"brier": 0.5076781498841229,
|
| 147 |
+
"ece": 0.19641208292198364,
|
| 148 |
+
"mean_conf": 0.8096085306199567,
|
| 149 |
+
"confidence_bias": 0.14294186395329012,
|
| 150 |
+
"confident_error_rate": 0.08333333333333333,
|
| 151 |
+
"coverage_at_0_9": 0.3333333333333333,
|
| 152 |
+
"accuracy_at_0_9": 0.75,
|
| 153 |
+
"coverage_at_5pct_error": 0.25,
|
| 154 |
+
"coverage_at_1pct_error": 0.25
|
| 155 |
+
},
|
| 156 |
+
"extraction": {
|
| 157 |
+
"n": 12,
|
| 158 |
+
"acc": 1.0,
|
| 159 |
+
"nll": 0.0542116119441933,
|
| 160 |
+
"brier": 0.01493325495130398,
|
| 161 |
+
"ece": 0.0495188270475546,
|
| 162 |
+
"mean_conf": 0.9504811729524453,
|
| 163 |
+
"confidence_bias": -0.049518827047554725,
|
| 164 |
+
"confident_error_rate": 0.0,
|
| 165 |
+
"coverage_at_0_9": 0.8333333333333334,
|
| 166 |
+
"accuracy_at_0_9": 1.0,
|
| 167 |
+
"coverage_at_5pct_error": 1.0,
|
| 168 |
+
"coverage_at_1pct_error": 1.0
|
| 169 |
+
},
|
| 170 |
+
"intent": {
|
| 171 |
+
"n": 12,
|
| 172 |
+
"acc": 0.8333333333333334,
|
| 173 |
+
"nll": 0.30572276294355083,
|
| 174 |
+
"brier": 0.20045464895299747,
|
| 175 |
+
"ece": 0.14304785668742614,
|
| 176 |
+
"mean_conf": 0.9322074612496651,
|
| 177 |
+
"confidence_bias": 0.09887412791633177,
|
| 178 |
+
"confident_error_rate": 0.0,
|
| 179 |
+
"coverage_at_0_9": 0.75,
|
| 180 |
+
"accuracy_at_0_9": 1.0,
|
| 181 |
+
"coverage_at_5pct_error": 0.8333333333333334,
|
| 182 |
+
"coverage_at_1pct_error": 0.8333333333333334
|
| 183 |
+
},
|
| 184 |
+
"ordinal": {
|
| 185 |
+
"n": 12,
|
| 186 |
+
"acc": 0.9166666666666666,
|
| 187 |
+
"nll": 0.20756268320968063,
|
| 188 |
+
"brier": 0.10919592930395382,
|
| 189 |
+
"ece": 0.12099966786008741,
|
| 190 |
+
"mean_conf": 0.9077797081312969,
|
| 191 |
+
"confidence_bias": -0.008886958535369693,
|
| 192 |
+
"confident_error_rate": 0.0,
|
| 193 |
+
"coverage_at_0_9": 0.6666666666666666,
|
| 194 |
+
"accuracy_at_0_9": 1.0,
|
| 195 |
+
"coverage_at_5pct_error": 0.9166666666666666,
|
| 196 |
+
"coverage_at_1pct_error": 0.9166666666666666,
|
| 197 |
+
"score_mae": 0.14433068031614896,
|
| 198 |
+
"ranked_probability_score": 0.021378525778158384
|
| 199 |
+
},
|
| 200 |
+
"policy": {
|
| 201 |
+
"n": 12,
|
| 202 |
+
"acc": 0.9166666666666666,
|
| 203 |
+
"nll": 0.10467945507562453,
|
| 204 |
+
"brier": 0.05772104532732034,
|
| 205 |
+
"ece": 0.08135385206374438,
|
| 206 |
+
"mean_conf": 0.9290088980838886,
|
| 207 |
+
"confidence_bias": 0.012342231417222016,
|
| 208 |
+
"confident_error_rate": 0.0,
|
| 209 |
+
"coverage_at_0_9": 0.8333333333333334,
|
| 210 |
+
"accuracy_at_0_9": 1.0,
|
| 211 |
+
"coverage_at_5pct_error": 0.9166666666666666,
|
| 212 |
+
"coverage_at_1pct_error": 0.9166666666666666
|
| 213 |
+
},
|
| 214 |
+
"routing": {
|
| 215 |
+
"n": 12,
|
| 216 |
+
"acc": 0.9166666666666666,
|
| 217 |
+
"nll": 0.23322167937908408,
|
| 218 |
+
"brier": 0.12991909335174637,
|
| 219 |
+
"ece": 0.1168843091364116,
|
| 220 |
+
"mean_conf": 0.8731113001090374,
|
| 221 |
+
"confidence_bias": -0.04355536655762926,
|
| 222 |
+
"confident_error_rate": 0.0,
|
| 223 |
+
"coverage_at_0_9": 0.5833333333333334,
|
| 224 |
+
"accuracy_at_0_9": 1.0,
|
| 225 |
+
"coverage_at_5pct_error": 0.75,
|
| 226 |
+
"coverage_at_1pct_error": 0.75
|
| 227 |
+
}
|
| 228 |
+
},
|
| 229 |
+
"variants": {
|
| 230 |
+
"clean": {
|
| 231 |
+
"n": 72,
|
| 232 |
+
"acc": 0.875,
|
| 233 |
+
"nll": 0.2811701595983037,
|
| 234 |
+
"brier": 0.16998368696190747,
|
| 235 |
+
"ece": 0.027585444231134813,
|
| 236 |
+
"mean_conf": 0.9003661785243816,
|
| 237 |
+
"confidence_bias": 0.02536617852438161,
|
| 238 |
+
"confident_error_rate": 0.013888888888888888,
|
| 239 |
+
"coverage_at_0_9": 0.6666666666666666,
|
| 240 |
+
"accuracy_at_0_9": 0.9791666666666666,
|
| 241 |
+
"coverage_at_5pct_error": 0.8333333333333334,
|
| 242 |
+
"coverage_at_1pct_error": 0.5277777777777778,
|
| 243 |
+
"score_mae": 0.14433068031614896,
|
| 244 |
+
"ranked_probability_score": 0.021378525778158384
|
| 245 |
+
}
|
| 246 |
+
},
|
| 247 |
+
"macro_task_acc": 0.875,
|
| 248 |
+
"objective": -0.28117015959830377,
|
| 249 |
+
"paired_flip": {
|
| 250 |
+
"pairs": 0,
|
| 251 |
+
"incomplete_pairs": 0,
|
| 252 |
+
"flip_rate": null,
|
| 253 |
+
"both_correct_rate": null,
|
| 254 |
+
"invariant_pairs": 0,
|
| 255 |
+
"invariant_both_correct_rate": null,
|
| 256 |
+
"invariance_rate": null
|
| 257 |
+
},
|
| 258 |
+
"reference_distribution": null,
|
| 259 |
+
"unknowable": null,
|
| 260 |
+
"permutation": {
|
| 261 |
+
"n": 0,
|
| 262 |
+
"missing_parents": 0,
|
| 263 |
+
"flip_rate": null,
|
| 264 |
+
"mean_max_delta": null
|
| 265 |
+
},
|
| 266 |
+
"metric_policy": {
|
| 267 |
+
"nll_floor": 1e-09,
|
| 268 |
+
"ece_bins": 10,
|
| 269 |
+
"confidence_for_calibration": "maximum label probability",
|
| 270 |
+
"calibration_applied": false,
|
| 271 |
+
"unknown_accuracy_excluded": true,
|
| 272 |
+
"coverage_error_budget_is_retrospective": true,
|
| 273 |
+
"raw_sums_outside_1e_5": 0,
|
| 274 |
+
"returned_zeros": 0
|
| 275 |
+
},
|
| 276 |
+
"latency_ms": {
|
| 277 |
+
"n": 72,
|
| 278 |
+
"mean": 23.027374291511176,
|
| 279 |
+
"p50": 22.36310299485922,
|
| 280 |
+
"p95": 30.51040534919594,
|
| 281 |
+
"p99": 34.34268011507812
|
| 282 |
+
}
|
| 283 |
+
}
|
| 284 |
+
},
|
| 285 |
+
"latency_scope": "client HTTP wall time, excluding queue before dispatch; NOT GPU kernel time",
|
| 286 |
+
"partial_dataset": false
|
| 287 |
+
}
|
generation_config.json
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"bos_token_id": 1,
|
| 3 |
+
"eos_token_id": 2,
|
| 4 |
+
"max_length": 262144,
|
| 5 |
+
"pad_token_id": 11,
|
| 6 |
+
"transformers_version": "5.0.0.dev0"
|
| 7 |
+
}
|
model.safetensors.index.json
ADDED
|
@@ -0,0 +1,466 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"metadata": {
|
| 3 |
+
"total_parameters": 3849090048,
|
| 4 |
+
"total_size": 7698180096
|
| 5 |
+
},
|
| 6 |
+
"weight_map": {
|
| 7 |
+
"language_model.model.embed_tokens.weight": "model-00001-of-00002.safetensors",
|
| 8 |
+
"language_model.model.layers.0.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 9 |
+
"language_model.model.layers.0.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 10 |
+
"language_model.model.layers.0.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 11 |
+
"language_model.model.layers.0.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 12 |
+
"language_model.model.layers.0.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 13 |
+
"language_model.model.layers.0.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 14 |
+
"language_model.model.layers.0.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 15 |
+
"language_model.model.layers.0.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 16 |
+
"language_model.model.layers.0.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 17 |
+
"language_model.model.layers.1.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 18 |
+
"language_model.model.layers.1.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 19 |
+
"language_model.model.layers.1.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 20 |
+
"language_model.model.layers.1.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 21 |
+
"language_model.model.layers.1.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 22 |
+
"language_model.model.layers.1.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 23 |
+
"language_model.model.layers.1.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 24 |
+
"language_model.model.layers.1.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 25 |
+
"language_model.model.layers.1.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 26 |
+
"language_model.model.layers.10.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 27 |
+
"language_model.model.layers.10.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 28 |
+
"language_model.model.layers.10.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 29 |
+
"language_model.model.layers.10.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 30 |
+
"language_model.model.layers.10.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 31 |
+
"language_model.model.layers.10.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 32 |
+
"language_model.model.layers.10.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 33 |
+
"language_model.model.layers.10.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 34 |
+
"language_model.model.layers.10.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 35 |
+
"language_model.model.layers.11.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 36 |
+
"language_model.model.layers.11.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 37 |
+
"language_model.model.layers.11.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 38 |
+
"language_model.model.layers.11.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 39 |
+
"language_model.model.layers.11.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 40 |
+
"language_model.model.layers.11.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 41 |
+
"language_model.model.layers.11.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 42 |
+
"language_model.model.layers.11.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 43 |
+
"language_model.model.layers.11.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 44 |
+
"language_model.model.layers.12.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 45 |
+
"language_model.model.layers.12.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 46 |
+
"language_model.model.layers.12.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 47 |
+
"language_model.model.layers.12.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 48 |
+
"language_model.model.layers.12.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 49 |
+
"language_model.model.layers.12.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 50 |
+
"language_model.model.layers.12.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 51 |
+
"language_model.model.layers.12.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 52 |
+
"language_model.model.layers.12.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 53 |
+
"language_model.model.layers.13.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 54 |
+
"language_model.model.layers.13.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 55 |
+
"language_model.model.layers.13.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 56 |
+
"language_model.model.layers.13.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 57 |
+
"language_model.model.layers.13.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 58 |
+
"language_model.model.layers.13.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 59 |
+
"language_model.model.layers.13.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 60 |
+
"language_model.model.layers.13.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 61 |
+
"language_model.model.layers.13.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 62 |
+
"language_model.model.layers.14.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 63 |
+
"language_model.model.layers.14.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 64 |
+
"language_model.model.layers.14.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 65 |
+
"language_model.model.layers.14.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 66 |
+
"language_model.model.layers.14.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 67 |
+
"language_model.model.layers.14.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 68 |
+
"language_model.model.layers.14.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 69 |
+
"language_model.model.layers.14.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 70 |
+
"language_model.model.layers.14.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 71 |
+
"language_model.model.layers.15.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 72 |
+
"language_model.model.layers.15.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 73 |
+
"language_model.model.layers.15.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 74 |
+
"language_model.model.layers.15.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 75 |
+
"language_model.model.layers.15.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 76 |
+
"language_model.model.layers.15.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 77 |
+
"language_model.model.layers.15.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 78 |
+
"language_model.model.layers.15.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 79 |
+
"language_model.model.layers.15.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 80 |
+
"language_model.model.layers.16.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 81 |
+
"language_model.model.layers.16.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 82 |
+
"language_model.model.layers.16.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 83 |
+
"language_model.model.layers.16.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 84 |
+
"language_model.model.layers.16.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 85 |
+
"language_model.model.layers.16.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 86 |
+
"language_model.model.layers.16.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 87 |
+
"language_model.model.layers.16.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 88 |
+
"language_model.model.layers.16.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 89 |
+
"language_model.model.layers.17.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 90 |
+
"language_model.model.layers.17.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 91 |
+
"language_model.model.layers.17.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 92 |
+
"language_model.model.layers.17.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 93 |
+
"language_model.model.layers.17.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 94 |
+
"language_model.model.layers.17.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 95 |
+
"language_model.model.layers.17.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 96 |
+
"language_model.model.layers.17.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 97 |
+
"language_model.model.layers.17.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 98 |
+
"language_model.model.layers.18.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 99 |
+
"language_model.model.layers.18.mlp.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 100 |
+
"language_model.model.layers.18.mlp.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 101 |
+
"language_model.model.layers.18.mlp.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 102 |
+
"language_model.model.layers.18.post_attention_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 103 |
+
"language_model.model.layers.18.self_attn.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 104 |
+
"language_model.model.layers.18.self_attn.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 105 |
+
"language_model.model.layers.18.self_attn.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 106 |
+
"language_model.model.layers.18.self_attn.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 107 |
+
"language_model.model.layers.19.input_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 108 |
+
"language_model.model.layers.19.mlp.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 109 |
+
"language_model.model.layers.19.mlp.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 110 |
+
"language_model.model.layers.19.mlp.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 111 |
+
"language_model.model.layers.19.post_attention_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 112 |
+
"language_model.model.layers.19.self_attn.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 113 |
+
"language_model.model.layers.19.self_attn.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 114 |
+
"language_model.model.layers.19.self_attn.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 115 |
+
"language_model.model.layers.19.self_attn.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 116 |
+
"language_model.model.layers.2.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 117 |
+
"language_model.model.layers.2.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 118 |
+
"language_model.model.layers.2.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 119 |
+
"language_model.model.layers.2.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 120 |
+
"language_model.model.layers.2.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 121 |
+
"language_model.model.layers.2.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 122 |
+
"language_model.model.layers.2.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 123 |
+
"language_model.model.layers.2.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 124 |
+
"language_model.model.layers.2.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 125 |
+
"language_model.model.layers.20.input_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 126 |
+
"language_model.model.layers.20.mlp.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 127 |
+
"language_model.model.layers.20.mlp.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 128 |
+
"language_model.model.layers.20.mlp.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 129 |
+
"language_model.model.layers.20.post_attention_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 130 |
+
"language_model.model.layers.20.self_attn.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 131 |
+
"language_model.model.layers.20.self_attn.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 132 |
+
"language_model.model.layers.20.self_attn.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 133 |
+
"language_model.model.layers.20.self_attn.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 134 |
+
"language_model.model.layers.21.input_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 135 |
+
"language_model.model.layers.21.mlp.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 136 |
+
"language_model.model.layers.21.mlp.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 137 |
+
"language_model.model.layers.21.mlp.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 138 |
+
"language_model.model.layers.21.post_attention_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 139 |
+
"language_model.model.layers.21.self_attn.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 140 |
+
"language_model.model.layers.21.self_attn.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 141 |
+
"language_model.model.layers.21.self_attn.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 142 |
+
"language_model.model.layers.21.self_attn.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 143 |
+
"language_model.model.layers.22.input_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 144 |
+
"language_model.model.layers.22.mlp.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 145 |
+
"language_model.model.layers.22.mlp.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 146 |
+
"language_model.model.layers.22.mlp.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 147 |
+
"language_model.model.layers.22.post_attention_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 148 |
+
"language_model.model.layers.22.self_attn.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 149 |
+
"language_model.model.layers.22.self_attn.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 150 |
+
"language_model.model.layers.22.self_attn.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 151 |
+
"language_model.model.layers.22.self_attn.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 152 |
+
"language_model.model.layers.23.input_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 153 |
+
"language_model.model.layers.23.mlp.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 154 |
+
"language_model.model.layers.23.mlp.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 155 |
+
"language_model.model.layers.23.mlp.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 156 |
+
"language_model.model.layers.23.post_attention_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 157 |
+
"language_model.model.layers.23.self_attn.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 158 |
+
"language_model.model.layers.23.self_attn.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 159 |
+
"language_model.model.layers.23.self_attn.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 160 |
+
"language_model.model.layers.23.self_attn.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 161 |
+
"language_model.model.layers.24.input_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 162 |
+
"language_model.model.layers.24.mlp.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 163 |
+
"language_model.model.layers.24.mlp.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 164 |
+
"language_model.model.layers.24.mlp.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 165 |
+
"language_model.model.layers.24.post_attention_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 166 |
+
"language_model.model.layers.24.self_attn.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 167 |
+
"language_model.model.layers.24.self_attn.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 168 |
+
"language_model.model.layers.24.self_attn.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 169 |
+
"language_model.model.layers.24.self_attn.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 170 |
+
"language_model.model.layers.25.input_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 171 |
+
"language_model.model.layers.25.mlp.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 172 |
+
"language_model.model.layers.25.mlp.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 173 |
+
"language_model.model.layers.25.mlp.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 174 |
+
"language_model.model.layers.25.post_attention_layernorm.weight": "model-00002-of-00002.safetensors",
|
| 175 |
+
"language_model.model.layers.25.self_attn.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 176 |
+
"language_model.model.layers.25.self_attn.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 177 |
+
"language_model.model.layers.25.self_attn.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 178 |
+
"language_model.model.layers.25.self_attn.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 179 |
+
"language_model.model.layers.3.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 180 |
+
"language_model.model.layers.3.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 181 |
+
"language_model.model.layers.3.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 182 |
+
"language_model.model.layers.3.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 183 |
+
"language_model.model.layers.3.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 184 |
+
"language_model.model.layers.3.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 185 |
+
"language_model.model.layers.3.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 186 |
+
"language_model.model.layers.3.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 187 |
+
"language_model.model.layers.3.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 188 |
+
"language_model.model.layers.4.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 189 |
+
"language_model.model.layers.4.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 190 |
+
"language_model.model.layers.4.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 191 |
+
"language_model.model.layers.4.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 192 |
+
"language_model.model.layers.4.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 193 |
+
"language_model.model.layers.4.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 194 |
+
"language_model.model.layers.4.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 195 |
+
"language_model.model.layers.4.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 196 |
+
"language_model.model.layers.4.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 197 |
+
"language_model.model.layers.5.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 198 |
+
"language_model.model.layers.5.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 199 |
+
"language_model.model.layers.5.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 200 |
+
"language_model.model.layers.5.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 201 |
+
"language_model.model.layers.5.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 202 |
+
"language_model.model.layers.5.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 203 |
+
"language_model.model.layers.5.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 204 |
+
"language_model.model.layers.5.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 205 |
+
"language_model.model.layers.5.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 206 |
+
"language_model.model.layers.6.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 207 |
+
"language_model.model.layers.6.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 208 |
+
"language_model.model.layers.6.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 209 |
+
"language_model.model.layers.6.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 210 |
+
"language_model.model.layers.6.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 211 |
+
"language_model.model.layers.6.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 212 |
+
"language_model.model.layers.6.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 213 |
+
"language_model.model.layers.6.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 214 |
+
"language_model.model.layers.6.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 215 |
+
"language_model.model.layers.7.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 216 |
+
"language_model.model.layers.7.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 217 |
+
"language_model.model.layers.7.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 218 |
+
"language_model.model.layers.7.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 219 |
+
"language_model.model.layers.7.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 220 |
+
"language_model.model.layers.7.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 221 |
+
"language_model.model.layers.7.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 222 |
+
"language_model.model.layers.7.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 223 |
+
"language_model.model.layers.7.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 224 |
+
"language_model.model.layers.8.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 225 |
+
"language_model.model.layers.8.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 226 |
+
"language_model.model.layers.8.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 227 |
+
"language_model.model.layers.8.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 228 |
+
"language_model.model.layers.8.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 229 |
+
"language_model.model.layers.8.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 230 |
+
"language_model.model.layers.8.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 231 |
+
"language_model.model.layers.8.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 232 |
+
"language_model.model.layers.8.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 233 |
+
"language_model.model.layers.9.input_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 234 |
+
"language_model.model.layers.9.mlp.down_proj.weight": "model-00001-of-00002.safetensors",
|
| 235 |
+
"language_model.model.layers.9.mlp.gate_proj.weight": "model-00001-of-00002.safetensors",
|
| 236 |
+
"language_model.model.layers.9.mlp.up_proj.weight": "model-00001-of-00002.safetensors",
|
| 237 |
+
"language_model.model.layers.9.post_attention_layernorm.weight": "model-00001-of-00002.safetensors",
|
| 238 |
+
"language_model.model.layers.9.self_attn.k_proj.weight": "model-00001-of-00002.safetensors",
|
| 239 |
+
"language_model.model.layers.9.self_attn.o_proj.weight": "model-00001-of-00002.safetensors",
|
| 240 |
+
"language_model.model.layers.9.self_attn.q_proj.weight": "model-00001-of-00002.safetensors",
|
| 241 |
+
"language_model.model.layers.9.self_attn.v_proj.weight": "model-00001-of-00002.safetensors",
|
| 242 |
+
"language_model.model.norm.weight": "model-00002-of-00002.safetensors",
|
| 243 |
+
"multi_modal_projector.linear_1.weight": "model-00002-of-00002.safetensors",
|
| 244 |
+
"multi_modal_projector.linear_2.weight": "model-00002-of-00002.safetensors",
|
| 245 |
+
"multi_modal_projector.norm.weight": "model-00002-of-00002.safetensors",
|
| 246 |
+
"multi_modal_projector.patch_merger.merging_layer.weight": "model-00002-of-00002.safetensors",
|
| 247 |
+
"vision_tower.ln_pre.weight": "model-00002-of-00002.safetensors",
|
| 248 |
+
"vision_tower.patch_conv.weight": "model-00002-of-00002.safetensors",
|
| 249 |
+
"vision_tower.transformer.layers.0.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 250 |
+
"vision_tower.transformer.layers.0.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 251 |
+
"vision_tower.transformer.layers.0.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 252 |
+
"vision_tower.transformer.layers.0.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 253 |
+
"vision_tower.transformer.layers.0.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 254 |
+
"vision_tower.transformer.layers.0.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 255 |
+
"vision_tower.transformer.layers.0.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 256 |
+
"vision_tower.transformer.layers.0.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 257 |
+
"vision_tower.transformer.layers.0.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 258 |
+
"vision_tower.transformer.layers.1.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 259 |
+
"vision_tower.transformer.layers.1.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 260 |
+
"vision_tower.transformer.layers.1.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 261 |
+
"vision_tower.transformer.layers.1.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 262 |
+
"vision_tower.transformer.layers.1.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 263 |
+
"vision_tower.transformer.layers.1.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 264 |
+
"vision_tower.transformer.layers.1.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 265 |
+
"vision_tower.transformer.layers.1.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 266 |
+
"vision_tower.transformer.layers.1.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 267 |
+
"vision_tower.transformer.layers.10.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 268 |
+
"vision_tower.transformer.layers.10.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 269 |
+
"vision_tower.transformer.layers.10.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 270 |
+
"vision_tower.transformer.layers.10.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 271 |
+
"vision_tower.transformer.layers.10.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 272 |
+
"vision_tower.transformer.layers.10.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 273 |
+
"vision_tower.transformer.layers.10.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 274 |
+
"vision_tower.transformer.layers.10.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 275 |
+
"vision_tower.transformer.layers.10.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 276 |
+
"vision_tower.transformer.layers.11.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 277 |
+
"vision_tower.transformer.layers.11.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 278 |
+
"vision_tower.transformer.layers.11.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 279 |
+
"vision_tower.transformer.layers.11.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 280 |
+
"vision_tower.transformer.layers.11.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 281 |
+
"vision_tower.transformer.layers.11.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 282 |
+
"vision_tower.transformer.layers.11.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 283 |
+
"vision_tower.transformer.layers.11.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 284 |
+
"vision_tower.transformer.layers.11.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 285 |
+
"vision_tower.transformer.layers.12.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 286 |
+
"vision_tower.transformer.layers.12.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 287 |
+
"vision_tower.transformer.layers.12.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 288 |
+
"vision_tower.transformer.layers.12.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 289 |
+
"vision_tower.transformer.layers.12.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 290 |
+
"vision_tower.transformer.layers.12.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 291 |
+
"vision_tower.transformer.layers.12.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 292 |
+
"vision_tower.transformer.layers.12.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 293 |
+
"vision_tower.transformer.layers.12.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 294 |
+
"vision_tower.transformer.layers.13.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 295 |
+
"vision_tower.transformer.layers.13.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 296 |
+
"vision_tower.transformer.layers.13.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 297 |
+
"vision_tower.transformer.layers.13.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 298 |
+
"vision_tower.transformer.layers.13.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 299 |
+
"vision_tower.transformer.layers.13.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 300 |
+
"vision_tower.transformer.layers.13.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 301 |
+
"vision_tower.transformer.layers.13.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 302 |
+
"vision_tower.transformer.layers.13.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 303 |
+
"vision_tower.transformer.layers.14.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 304 |
+
"vision_tower.transformer.layers.14.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 305 |
+
"vision_tower.transformer.layers.14.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 306 |
+
"vision_tower.transformer.layers.14.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 307 |
+
"vision_tower.transformer.layers.14.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 308 |
+
"vision_tower.transformer.layers.14.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 309 |
+
"vision_tower.transformer.layers.14.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 310 |
+
"vision_tower.transformer.layers.14.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 311 |
+
"vision_tower.transformer.layers.14.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 312 |
+
"vision_tower.transformer.layers.15.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 313 |
+
"vision_tower.transformer.layers.15.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 314 |
+
"vision_tower.transformer.layers.15.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 315 |
+
"vision_tower.transformer.layers.15.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 316 |
+
"vision_tower.transformer.layers.15.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 317 |
+
"vision_tower.transformer.layers.15.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 318 |
+
"vision_tower.transformer.layers.15.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 319 |
+
"vision_tower.transformer.layers.15.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 320 |
+
"vision_tower.transformer.layers.15.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 321 |
+
"vision_tower.transformer.layers.16.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 322 |
+
"vision_tower.transformer.layers.16.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 323 |
+
"vision_tower.transformer.layers.16.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 324 |
+
"vision_tower.transformer.layers.16.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 325 |
+
"vision_tower.transformer.layers.16.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 326 |
+
"vision_tower.transformer.layers.16.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 327 |
+
"vision_tower.transformer.layers.16.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 328 |
+
"vision_tower.transformer.layers.16.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 329 |
+
"vision_tower.transformer.layers.16.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 330 |
+
"vision_tower.transformer.layers.17.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 331 |
+
"vision_tower.transformer.layers.17.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 332 |
+
"vision_tower.transformer.layers.17.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 333 |
+
"vision_tower.transformer.layers.17.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 334 |
+
"vision_tower.transformer.layers.17.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 335 |
+
"vision_tower.transformer.layers.17.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 336 |
+
"vision_tower.transformer.layers.17.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 337 |
+
"vision_tower.transformer.layers.17.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 338 |
+
"vision_tower.transformer.layers.17.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 339 |
+
"vision_tower.transformer.layers.18.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 340 |
+
"vision_tower.transformer.layers.18.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 341 |
+
"vision_tower.transformer.layers.18.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 342 |
+
"vision_tower.transformer.layers.18.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 343 |
+
"vision_tower.transformer.layers.18.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 344 |
+
"vision_tower.transformer.layers.18.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 345 |
+
"vision_tower.transformer.layers.18.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 346 |
+
"vision_tower.transformer.layers.18.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 347 |
+
"vision_tower.transformer.layers.18.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 348 |
+
"vision_tower.transformer.layers.19.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 349 |
+
"vision_tower.transformer.layers.19.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 350 |
+
"vision_tower.transformer.layers.19.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 351 |
+
"vision_tower.transformer.layers.19.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 352 |
+
"vision_tower.transformer.layers.19.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 353 |
+
"vision_tower.transformer.layers.19.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 354 |
+
"vision_tower.transformer.layers.19.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 355 |
+
"vision_tower.transformer.layers.19.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 356 |
+
"vision_tower.transformer.layers.19.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 357 |
+
"vision_tower.transformer.layers.2.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 358 |
+
"vision_tower.transformer.layers.2.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 359 |
+
"vision_tower.transformer.layers.2.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 360 |
+
"vision_tower.transformer.layers.2.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 361 |
+
"vision_tower.transformer.layers.2.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 362 |
+
"vision_tower.transformer.layers.2.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 363 |
+
"vision_tower.transformer.layers.2.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 364 |
+
"vision_tower.transformer.layers.2.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 365 |
+
"vision_tower.transformer.layers.2.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 366 |
+
"vision_tower.transformer.layers.20.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 367 |
+
"vision_tower.transformer.layers.20.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 368 |
+
"vision_tower.transformer.layers.20.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 369 |
+
"vision_tower.transformer.layers.20.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 370 |
+
"vision_tower.transformer.layers.20.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 371 |
+
"vision_tower.transformer.layers.20.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 372 |
+
"vision_tower.transformer.layers.20.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 373 |
+
"vision_tower.transformer.layers.20.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 374 |
+
"vision_tower.transformer.layers.20.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 375 |
+
"vision_tower.transformer.layers.21.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 376 |
+
"vision_tower.transformer.layers.21.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 377 |
+
"vision_tower.transformer.layers.21.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 378 |
+
"vision_tower.transformer.layers.21.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 379 |
+
"vision_tower.transformer.layers.21.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 380 |
+
"vision_tower.transformer.layers.21.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 381 |
+
"vision_tower.transformer.layers.21.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 382 |
+
"vision_tower.transformer.layers.21.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 383 |
+
"vision_tower.transformer.layers.21.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 384 |
+
"vision_tower.transformer.layers.22.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 385 |
+
"vision_tower.transformer.layers.22.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 386 |
+
"vision_tower.transformer.layers.22.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 387 |
+
"vision_tower.transformer.layers.22.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 388 |
+
"vision_tower.transformer.layers.22.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 389 |
+
"vision_tower.transformer.layers.22.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 390 |
+
"vision_tower.transformer.layers.22.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 391 |
+
"vision_tower.transformer.layers.22.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 392 |
+
"vision_tower.transformer.layers.22.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 393 |
+
"vision_tower.transformer.layers.23.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 394 |
+
"vision_tower.transformer.layers.23.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 395 |
+
"vision_tower.transformer.layers.23.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 396 |
+
"vision_tower.transformer.layers.23.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 397 |
+
"vision_tower.transformer.layers.23.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 398 |
+
"vision_tower.transformer.layers.23.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 399 |
+
"vision_tower.transformer.layers.23.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 400 |
+
"vision_tower.transformer.layers.23.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 401 |
+
"vision_tower.transformer.layers.23.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 402 |
+
"vision_tower.transformer.layers.3.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 403 |
+
"vision_tower.transformer.layers.3.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 404 |
+
"vision_tower.transformer.layers.3.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 405 |
+
"vision_tower.transformer.layers.3.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 406 |
+
"vision_tower.transformer.layers.3.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 407 |
+
"vision_tower.transformer.layers.3.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 408 |
+
"vision_tower.transformer.layers.3.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 409 |
+
"vision_tower.transformer.layers.3.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 410 |
+
"vision_tower.transformer.layers.3.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 411 |
+
"vision_tower.transformer.layers.4.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 412 |
+
"vision_tower.transformer.layers.4.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 413 |
+
"vision_tower.transformer.layers.4.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 414 |
+
"vision_tower.transformer.layers.4.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 415 |
+
"vision_tower.transformer.layers.4.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 416 |
+
"vision_tower.transformer.layers.4.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 417 |
+
"vision_tower.transformer.layers.4.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 418 |
+
"vision_tower.transformer.layers.4.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 419 |
+
"vision_tower.transformer.layers.4.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 420 |
+
"vision_tower.transformer.layers.5.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 421 |
+
"vision_tower.transformer.layers.5.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 422 |
+
"vision_tower.transformer.layers.5.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 423 |
+
"vision_tower.transformer.layers.5.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 424 |
+
"vision_tower.transformer.layers.5.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 425 |
+
"vision_tower.transformer.layers.5.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 426 |
+
"vision_tower.transformer.layers.5.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 427 |
+
"vision_tower.transformer.layers.5.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 428 |
+
"vision_tower.transformer.layers.5.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 429 |
+
"vision_tower.transformer.layers.6.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 430 |
+
"vision_tower.transformer.layers.6.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 431 |
+
"vision_tower.transformer.layers.6.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 432 |
+
"vision_tower.transformer.layers.6.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 433 |
+
"vision_tower.transformer.layers.6.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 434 |
+
"vision_tower.transformer.layers.6.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 435 |
+
"vision_tower.transformer.layers.6.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 436 |
+
"vision_tower.transformer.layers.6.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 437 |
+
"vision_tower.transformer.layers.6.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 438 |
+
"vision_tower.transformer.layers.7.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 439 |
+
"vision_tower.transformer.layers.7.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 440 |
+
"vision_tower.transformer.layers.7.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 441 |
+
"vision_tower.transformer.layers.7.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 442 |
+
"vision_tower.transformer.layers.7.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 443 |
+
"vision_tower.transformer.layers.7.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 444 |
+
"vision_tower.transformer.layers.7.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 445 |
+
"vision_tower.transformer.layers.7.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 446 |
+
"vision_tower.transformer.layers.7.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 447 |
+
"vision_tower.transformer.layers.8.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 448 |
+
"vision_tower.transformer.layers.8.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 449 |
+
"vision_tower.transformer.layers.8.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 450 |
+
"vision_tower.transformer.layers.8.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 451 |
+
"vision_tower.transformer.layers.8.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 452 |
+
"vision_tower.transformer.layers.8.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 453 |
+
"vision_tower.transformer.layers.8.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 454 |
+
"vision_tower.transformer.layers.8.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 455 |
+
"vision_tower.transformer.layers.8.ffn_norm.weight": "model-00002-of-00002.safetensors",
|
| 456 |
+
"vision_tower.transformer.layers.9.attention.k_proj.weight": "model-00002-of-00002.safetensors",
|
| 457 |
+
"vision_tower.transformer.layers.9.attention.o_proj.weight": "model-00002-of-00002.safetensors",
|
| 458 |
+
"vision_tower.transformer.layers.9.attention.q_proj.weight": "model-00002-of-00002.safetensors",
|
| 459 |
+
"vision_tower.transformer.layers.9.attention.v_proj.weight": "model-00002-of-00002.safetensors",
|
| 460 |
+
"vision_tower.transformer.layers.9.attention_norm.weight": "model-00002-of-00002.safetensors",
|
| 461 |
+
"vision_tower.transformer.layers.9.feed_forward.down_proj.weight": "model-00002-of-00002.safetensors",
|
| 462 |
+
"vision_tower.transformer.layers.9.feed_forward.gate_proj.weight": "model-00002-of-00002.safetensors",
|
| 463 |
+
"vision_tower.transformer.layers.9.feed_forward.up_proj.weight": "model-00002-of-00002.safetensors",
|
| 464 |
+
"vision_tower.transformer.layers.9.ffn_norm.weight": "model-00002-of-00002.safetensors"
|
| 465 |
+
}
|
| 466 |
+
}
|
params.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"dim": 3072,
|
| 3 |
+
"n_layers": 26,
|
| 4 |
+
"head_dim": 128,
|
| 5 |
+
"hidden_dim": 9216,
|
| 6 |
+
"n_heads": 32,
|
| 7 |
+
"n_kv_heads": 8,
|
| 8 |
+
"rope_theta": 1000000.0,
|
| 9 |
+
"norm_eps": 1e-05,
|
| 10 |
+
"vocab_size": 131072,
|
| 11 |
+
"tied_embeddings": true,
|
| 12 |
+
"max_position_embeddings": 262144,
|
| 13 |
+
"llama_4_scaling": {
|
| 14 |
+
"original_max_position_embeddings": 16384,
|
| 15 |
+
"beta": 0.1
|
| 16 |
+
},
|
| 17 |
+
"q_lora_rank": null,
|
| 18 |
+
"qk_rope_head_dim": null,
|
| 19 |
+
"qk_nope_head_dim": null,
|
| 20 |
+
"kv_lora_rank": null,
|
| 21 |
+
"v_head_dim": null,
|
| 22 |
+
"yarn": {
|
| 23 |
+
"original_max_position_embeddings": 16384,
|
| 24 |
+
"factor": 16,
|
| 25 |
+
"apply_scale": false,
|
| 26 |
+
"beta": 32,
|
| 27 |
+
"alpha": 1
|
| 28 |
+
},
|
| 29 |
+
"vision_encoder": {
|
| 30 |
+
"image_token_id": 10,
|
| 31 |
+
"intermediate_size": 4096,
|
| 32 |
+
"num_hidden_layers": 24,
|
| 33 |
+
"num_attention_heads": 16,
|
| 34 |
+
"mm_projector_id": "patch_merge",
|
| 35 |
+
"spatial_merge_size": 2,
|
| 36 |
+
"hidden_size": 1024,
|
| 37 |
+
"num_channels": 3,
|
| 38 |
+
"image_size": 1540,
|
| 39 |
+
"max_image_size": 1540,
|
| 40 |
+
"patch_size": 14,
|
| 41 |
+
"rope_theta": 10000.0,
|
| 42 |
+
"add_pre_mm_projector_layer_norm": true,
|
| 43 |
+
"adapter_bias": false,
|
| 44 |
+
"image_break_token_id": 12,
|
| 45 |
+
"image_end_token_id": 13
|
| 46 |
+
}
|
| 47 |
+
}
|
processor_config.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"image_break_token": "[IMG_BREAK]",
|
| 3 |
+
"image_end_token": "[IMG_END]",
|
| 4 |
+
"image_processor": {
|
| 5 |
+
"crop_size": null,
|
| 6 |
+
"data_format": "channels_first",
|
| 7 |
+
"device": null,
|
| 8 |
+
"disable_grouping": null,
|
| 9 |
+
"do_center_crop": null,
|
| 10 |
+
"do_convert_rgb": true,
|
| 11 |
+
"do_normalize": true,
|
| 12 |
+
"do_pad": null,
|
| 13 |
+
"do_rescale": true,
|
| 14 |
+
"do_resize": true,
|
| 15 |
+
"image_mean": [
|
| 16 |
+
0.48145466,
|
| 17 |
+
0.4578275,
|
| 18 |
+
0.40821073
|
| 19 |
+
],
|
| 20 |
+
"image_processor_type": "PixtralImageProcessorFast",
|
| 21 |
+
"image_seq_length": null,
|
| 22 |
+
"image_std": [
|
| 23 |
+
0.26862954,
|
| 24 |
+
0.26130258,
|
| 25 |
+
0.27577711
|
| 26 |
+
],
|
| 27 |
+
"input_data_format": null,
|
| 28 |
+
"pad_size": null,
|
| 29 |
+
"patch_size": 14,
|
| 30 |
+
"processor_class": "PixtralProcessor",
|
| 31 |
+
"resample": 3,
|
| 32 |
+
"rescale_factor": 0.00392156862745098,
|
| 33 |
+
"return_tensors": null,
|
| 34 |
+
"size": {
|
| 35 |
+
"longest_edge": 1540
|
| 36 |
+
}
|
| 37 |
+
},
|
| 38 |
+
"image_token": "[IMG]",
|
| 39 |
+
"patch_size": 14,
|
| 40 |
+
"processor_class": "PixtralProcessor",
|
| 41 |
+
"spatial_merge_size": 2
|
| 42 |
+
}
|
release-manifest.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"release": "StandardOne-3B",
|
| 3 |
+
"base_model": {
|
| 4 |
+
"repo": "mistralai/Ministral-3-3B-Instruct-2512-BF16",
|
| 5 |
+
"revision": "b6d637bef2393152b3da2b2fde72eecdee30557e"
|
| 6 |
+
},
|
| 7 |
+
"adapter": {
|
| 8 |
+
"source_run": "final2-3b-long",
|
| 9 |
+
"adapter_model_sha256": "ae5fe8e3be2e9186e6504e48ad2fe7eea5537e7e8382a0cca2ca49d95605f7bf"
|
| 10 |
+
},
|
| 11 |
+
"merge_report_summary": {
|
| 12 |
+
"changed_params": 182,
|
| 13 |
+
"unchanged_params": 276,
|
| 14 |
+
"changed_outside_lm_projections": [],
|
| 15 |
+
"max_abs_delta": 0.002506256103515625
|
| 16 |
+
},
|
| 17 |
+
"serving": {
|
| 18 |
+
"wording": "native",
|
| 19 |
+
"system_prompt": null,
|
| 20 |
+
"temperature": 1.45,
|
| 21 |
+
"served_model_name": "standard-one-3b",
|
| 22 |
+
"engine": "SGLang 0.5.20"
|
| 23 |
+
}
|
| 24 |
+
}
|
server/.gitignore
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.venv/
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.py[cod]
|
| 4 |
+
.pytest_cache/
|
| 5 |
+
.ruff_cache/
|
| 6 |
+
*.egg-info/
|
| 7 |
+
build/
|
| 8 |
+
dist/
|
| 9 |
+
.env
|
| 10 |
+
benchmarks/data/
|
| 11 |
+
benchmarks/results/
|
server/LICENSE
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Apache License
|
| 2 |
+
Version 2.0, January 2004
|
| 3 |
+
http://www.apache.org/licenses/
|
| 4 |
+
|
| 5 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
| 6 |
+
|
| 7 |
+
1. Definitions.
|
| 8 |
+
|
| 9 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
| 10 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
| 11 |
+
|
| 12 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
| 13 |
+
the copyright owner that is granting the License.
|
| 14 |
+
|
| 15 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
| 16 |
+
other entities that control, are controlled by, or are under common
|
| 17 |
+
control with that entity. For the purposes of this definition,
|
| 18 |
+
"control" means (i) the power, direct or indirect, to cause the
|
| 19 |
+
direction or management of such entity, whether by contract or
|
| 20 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
| 21 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
| 22 |
+
|
| 23 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
| 24 |
+
exercising permissions granted by this License.
|
| 25 |
+
|
| 26 |
+
"Source" form shall mean the preferred form for making modifications,
|
| 27 |
+
including but not limited to software source code, documentation
|
| 28 |
+
source, and configuration files.
|
| 29 |
+
|
| 30 |
+
"Object" form shall mean any form resulting from mechanical
|
| 31 |
+
transformation or translation of a Source form, including but
|
| 32 |
+
not limited to compiled object code, generated documentation,
|
| 33 |
+
and conversions to other media types.
|
| 34 |
+
|
| 35 |
+
"Work" shall mean the work of authorship, whether in Source or
|
| 36 |
+
Object form, made available under the License, as indicated by a
|
| 37 |
+
copyright notice that is included in or attached to the work
|
| 38 |
+
(an example is provided in the Appendix below).
|
| 39 |
+
|
| 40 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
| 41 |
+
form, that is based on (or derived from) the Work and for which the
|
| 42 |
+
editorial revisions, annotations, elaborations, or other modifications
|
| 43 |
+
represent, as a whole, an original work of authorship. For the purposes
|
| 44 |
+
of this License, Derivative Works shall not include works that remain
|
| 45 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
| 46 |
+
the Work and Derivative Works thereof.
|
| 47 |
+
|
| 48 |
+
"Contribution" shall mean any work of authorship, including
|
| 49 |
+
the original version of the Work and any modifications or additions
|
| 50 |
+
to that Work or Derivative Works thereof, that is intentionally
|
| 51 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
| 52 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
| 53 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
| 54 |
+
means any form of electronic, verbal, or written communication sent
|
| 55 |
+
to the Licensor or its representatives, including but not limited to
|
| 56 |
+
communication on electronic mailing lists, source code control systems,
|
| 57 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
| 58 |
+
Licensor for the purpose of discussing and improving the Work, but
|
| 59 |
+
excluding communication that is conspicuously marked or otherwise
|
| 60 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
| 61 |
+
|
| 62 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
| 63 |
+
on behalf of whom a Contribution has been received by Licensor and
|
| 64 |
+
subsequently incorporated within the Work.
|
| 65 |
+
|
| 66 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
| 67 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 68 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 69 |
+
copyright license to reproduce, prepare Derivative Works of,
|
| 70 |
+
publicly display, publicly perform, sublicense, and distribute the
|
| 71 |
+
Work and such Derivative Works in Source or Object form.
|
| 72 |
+
|
| 73 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
| 74 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 75 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 76 |
+
(except as stated in this section) patent license to make, have made,
|
| 77 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
| 78 |
+
where such license applies only to those patent claims licensable
|
| 79 |
+
by such Contributor that are necessarily infringed by their
|
| 80 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
| 81 |
+
with the Work to which such Contribution(s) was submitted. If You
|
| 82 |
+
institute patent litigation against any entity (including a
|
| 83 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
| 84 |
+
or a Contribution incorporated within the Work constitutes direct
|
| 85 |
+
or contributory patent infringement, then any patent licenses
|
| 86 |
+
granted to You under this License for that Work shall terminate
|
| 87 |
+
as of the date such litigation is filed.
|
| 88 |
+
|
| 89 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
| 90 |
+
Work or Derivative Works thereof in any medium, with or without
|
| 91 |
+
modifications, and in Source or Object form, provided that You
|
| 92 |
+
meet the following conditions:
|
| 93 |
+
|
| 94 |
+
(a) You must give any other recipients of the Work or
|
| 95 |
+
Derivative Works a copy of this License; and
|
| 96 |
+
|
| 97 |
+
(b) You must cause any modified files to carry prominent notices
|
| 98 |
+
stating that You changed the files; and
|
| 99 |
+
|
| 100 |
+
(c) You must retain, in the Source form of any Derivative Works
|
| 101 |
+
that You distribute, all copyright, patent, trademark, and
|
| 102 |
+
attribution notices from the Source form of the Work,
|
| 103 |
+
excluding those notices that do not pertain to any part of
|
| 104 |
+
the Derivative Works; and
|
| 105 |
+
|
| 106 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
| 107 |
+
distribution, then any Derivative Works that You distribute must
|
| 108 |
+
include a readable copy of the attribution notices contained
|
| 109 |
+
within such NOTICE file, excluding those notices that do not
|
| 110 |
+
pertain to any part of the Derivative Works, in at least one
|
| 111 |
+
of the following places: within a NOTICE text file distributed
|
| 112 |
+
as part of the Derivative Works; within the Source form or
|
| 113 |
+
documentation, if provided along with the Derivative Works; or,
|
| 114 |
+
within a display generated by the Derivative Works, if and
|
| 115 |
+
wherever such third-party notices normally appear. The contents
|
| 116 |
+
of the NOTICE file are for informational purposes only and
|
| 117 |
+
do not modify the License. You may add Your own attribution
|
| 118 |
+
notices within Derivative Works that You distribute, alongside
|
| 119 |
+
or as an addendum to the NOTICE text from the Work, provided
|
| 120 |
+
that such additional attribution notices cannot be construed
|
| 121 |
+
as modifying the License.
|
| 122 |
+
|
| 123 |
+
You may add Your own copyright statement to Your modifications and
|
| 124 |
+
may provide additional or different license terms and conditions
|
| 125 |
+
for use, reproduction, or distribution of Your modifications, or
|
| 126 |
+
for any such Derivative Works as a whole, provided Your use,
|
| 127 |
+
reproduction, and distribution of the Work otherwise complies with
|
| 128 |
+
the conditions stated in this License.
|
| 129 |
+
|
| 130 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
| 131 |
+
any Contribution intentionally submitted for inclusion in the Work
|
| 132 |
+
by You to the Licensor shall be under the terms and conditions of
|
| 133 |
+
this License, without any additional terms or conditions.
|
| 134 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
| 135 |
+
the terms of any separate license agreement you may have executed
|
| 136 |
+
with Licensor regarding such Contributions.
|
| 137 |
+
|
| 138 |
+
6. Trademarks. This License does not grant permission to use the trade
|
| 139 |
+
names, trademarks, service marks, or product names of the Licensor,
|
| 140 |
+
except as required for reasonable and customary use in describing the
|
| 141 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
| 142 |
+
|
| 143 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
| 144 |
+
agreed to in writing, Licensor provides the Work (and each
|
| 145 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
| 146 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
| 147 |
+
implied, including, without limitation, any warranties or conditions
|
| 148 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
| 149 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
| 150 |
+
appropriateness of using or redistributing the Work and assume any
|
| 151 |
+
risks associated with Your exercise of permissions under this License.
|
| 152 |
+
|
| 153 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
| 154 |
+
whether in tort (including negligence), contract, or otherwise,
|
| 155 |
+
unless required by applicable law (such as deliberate and grossly
|
| 156 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
| 157 |
+
liable to You for damages, including any direct, indirect, special,
|
| 158 |
+
incidental, or consequential damages of any character arising as a
|
| 159 |
+
result of this License or out of the use or inability to use the
|
| 160 |
+
Work (including but not limited to damages for loss of goodwill,
|
| 161 |
+
work stoppage, computer failure or malfunction, or any and all
|
| 162 |
+
other commercial damages or losses), even if such Contributor
|
| 163 |
+
has been advised of the possibility of such damages.
|
| 164 |
+
|
| 165 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
| 166 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
| 167 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
| 168 |
+
or other liability obligations and/or rights consistent with this
|
| 169 |
+
License. However, in accepting such obligations, You may act only
|
| 170 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
| 171 |
+
of any other Contributor, and only if You agree to indemnify,
|
| 172 |
+
defend, and hold each Contributor harmless for any liability
|
| 173 |
+
incurred by, or claims asserted against, such Contributor by reason
|
| 174 |
+
of your accepting any such warranty or additional liability.
|
| 175 |
+
|
| 176 |
+
END OF TERMS AND CONDITIONS
|
| 177 |
+
|
| 178 |
+
APPENDIX: How to apply the Apache License to your work.
|
| 179 |
+
|
| 180 |
+
To apply the Apache License to your work, attach the following
|
| 181 |
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
| 182 |
+
replaced with your own identifying information. (Don't include
|
| 183 |
+
the brackets!) The text should be enclosed in the appropriate
|
| 184 |
+
comment syntax for the file format. We also recommend that a
|
| 185 |
+
file or class name and description of purpose be included on the
|
| 186 |
+
same "printed page" as the copyright notice for easier
|
| 187 |
+
identification within third-party archives.
|
| 188 |
+
|
| 189 |
+
Copyright 2023-2024 SGLang Team
|
| 190 |
+
|
| 191 |
+
Licensed under the Apache License, Version 2.0 (the "License");
|
| 192 |
+
you may not use this file except in compliance with the License.
|
| 193 |
+
You may obtain a copy of the License at
|
| 194 |
+
|
| 195 |
+
http://www.apache.org/licenses/LICENSE-2.0
|
| 196 |
+
|
| 197 |
+
Unless required by applicable law or agreed to in writing, software
|
| 198 |
+
distributed under the License is distributed on an "AS IS" BASIS,
|
| 199 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 200 |
+
See the License for the specific language governing permissions and
|
| 201 |
+
limitations under the License.
|
server/NOTICE
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Jev adapter
|
| 2 |
+
|
| 3 |
+
The initial protocol helpers and their unit tests were extracted from the
|
| 4 |
+
System One extension in the local sglang-jev experiment, commit
|
| 5 |
+
633f05e (Add prefill-only System One decisions and visual game evaluation).
|
| 6 |
+
That repository was based on SGLang upstream commit
|
| 7 |
+
0024efa0de38794ee309ba10ab00ebb891a3d050.
|
| 8 |
+
|
| 9 |
+
The accompanying Apache License 2.0 is retained from that source tree.
|
| 10 |
+
SGLang project: https://github.com/sgl-project/sglang
|
| 11 |
+
|
| 12 |
+
This repository is an independent API adapter. It does not include the
|
| 13 |
+
proprietary Jev model and does not bundle the SGLang inference engine.
|
| 14 |
+
|
| 15 |
+
Benchmark metric definitions and dataset schema mapping follow Jared Palmer's
|
| 16 |
+
Apache-2.0 KEV project, pinned at 4f8110a3f8620cc3a182ae9a708e4398492c4b1a:
|
| 17 |
+
https://github.com/jaredpalmer/kev
|
| 18 |
+
The benchmark runner is an independent implementation. Downloaded benchmark
|
| 19 |
+
data retains upstream provenance and any underlying dataset license terms.
|
server/README.md
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Jev adapter
|
| 2 |
+
|
| 3 |
+
기본 추론 엔진을 별도 프로세스로 실행하고, 그 앞에서 `POST /v1/systemone` 응답을 만드는 독립 Python 서비스입니다. 모델 학습, 엔진 fork, SGLang Python 패키지, CUDA, 모델 가중치가 어댑터에 필요하지 않습니다. 현재 구현한 백엔드는 **SGLang HTTP API**입니다.
|
| 4 |
+
|
| 5 |
+
```text
|
| 6 |
+
클라이언트 → jev-adapter :30120 → 기본 SGLang :30000 → GPU 모델
|
| 7 |
+
질문/응답 변환 템플릿·토큰화·비전 처리·프리필
|
| 8 |
+
```
|
| 9 |
+
|
| 10 |
+
모델은 선택지 라벨의 다음 토큰 logprob를 반환하고, 어댑터가 확률 정규화와 최종 JSON 구성을 담당합니다. 엔진 내부 객체나 비공개 Python 함수를 호출하지 않습니다. 상용 Jev 모델이나 학습 결과를 복제한 것은 아닙니다.
|
| 11 |
+
|
| 12 |
+
## 실행
|
| 13 |
+
|
| 14 |
+
엔진 환경에서 모델을 실행합니다. 어댑터와 같은 컴퓨터일 필요는 없습니다. 아래는 모델의 served name을 `decision-model`로 정한 예시입니다. `MODEL_PATH`는 엔진이 지원하는 실제 모델 경로 또는 Hugging Face ID로 설정합니다.
|
| 15 |
+
|
| 16 |
+
```bash
|
| 17 |
+
python -m sglang.launch_server \
|
| 18 |
+
--model-path "$MODEL_PATH" \
|
| 19 |
+
--served-model-name decision-model \
|
| 20 |
+
--host 127.0.0.1 --port 30000
|
| 21 |
+
```
|
| 22 |
+
|
| 23 |
+
어댑터는 이 레포의 별도 가상 환경에서 실행합니다. 엔진을 다른 호스트에서 실행하면 `--engine-url`만 바꾸면 됩니다.
|
| 24 |
+
|
| 25 |
+
```bash
|
| 26 |
+
python3 -m venv .venv
|
| 27 |
+
.venv/bin/python -m pip install -e '.[dev]'
|
| 28 |
+
.venv/bin/jev-adapter \
|
| 29 |
+
--engine-url http://127.0.0.1:30000 \
|
| 30 |
+
--model decision-model \
|
| 31 |
+
--port 30120
|
| 32 |
+
```
|
| 33 |
+
|
| 34 |
+
`python -m jev_adapter`도 같은 CLI입니다. 기본 listen 주소는 `127.0.0.1`이며, `--host`로 변경합니다. `--max-concurrency` 기본값은 32, 엔진 HTTP timeout은 `--timeout 120`입니다.
|
| 35 |
+
|
| 36 |
+
`--default-temperature T` (환경 변수 `JEV_DEFAULT_TEMPERATURE`)는 요청이 `options.temperature`를 생략했을 때만 적용되는 서버 기본 온도입니다. 요청이 온도를 명시하면 요청 값이 우선하고, `options.temperature_scaling: false`이면 기본값과 무관하게 스케일링하지 않습니다. 지정하지 않으면 기존과 같이 1.0입니다. 실제 적용된 온도는 응답의 `metadata.temperature`로 확인합니다.
|
| 37 |
+
|
| 38 |
+
`SGLANG_API_KEY`는 엔진에 보낼 키, `JEV_API_KEY`는 클라이언트가 어댑터에 보낼 키입니다. 설정했다면 각각 `Authorization: Bearer ...` 인증을 사용합니다. 키를 설정하지 않은 어댑터는 인증 없이 동작합니다.
|
| 39 |
+
|
| 40 |
+
시작할 때 엔진 정보를 확인하고, 엔진 토크나이저로 라벨을 검증합니다. 엔진을 먼저 실행해야 합니다. 모델/토크나이저를 교체하면 어댑터도 재시작합니다.
|
| 41 |
+
|
| 42 |
+
Ministral의 공식 `mistral-common` 토크나이저는 제어 토큰을 문자열로 변환했다가 다시
|
| 43 |
+
인코딩하면 토큰 ID가 달라질 수 있습니다. SGLang 0.5.20에서 이 문제가 확인되어,
|
| 44 |
+
이 모델의 텍스트 요청은 선택형 공식 토크나이저 경로를 사용합니다.
|
| 45 |
+
|
| 46 |
+
```bash
|
| 47 |
+
.venv/bin/python -m pip install -e '.[native-tokenizer]'
|
| 48 |
+
.venv/bin/jev-adapter --model decision-model \
|
| 49 |
+
--tokenizer-model mistralai/Ministral-3-3B-Instruct-2512-BF16 \
|
| 50 |
+
--tokenizer-revision b6d637bef2393152b3da2b2fde72eecdee30557e
|
| 51 |
+
```
|
| 52 |
+
|
| 53 |
+
이 경로는 CPU에서 토크나이저 파일만 로드하고 공식 `apply_chat_template(tokenize=True)`
|
| 54 |
+
결과를 엔진에 전달합니다. 각 assistant 라벨의 토큰 경계도 공식 continuation으로
|
| 55 |
+
검증합니다. 이미지 입력은 지원하지 않으며 기본 HTTP 경로로 자동 전환하지 않습니다.
|
| 56 |
+
|
| 57 |
+
### 프롬프트 문구 (`--prompt-wording`)
|
| 58 |
+
|
| 59 |
+
`--prompt-wording {served,native}` (환경 변수 `JEV_PROMPT_WORDING`)는 어떤 문구로
|
| 60 |
+
프롬프트를 렌더링할지 정하는 서버 전역 설정입니다. 기본값 `served`는 기존과 동일하게
|
| 61 |
+
어댑터 자체 문구(`Context:/.../Options: A: name: description`)를 사용합니다.
|
| 62 |
+
|
| 63 |
+
`native`는 jevbench-hard 러너 자신의 오프라인 채점 문구(`run_suites_rotation.py`의
|
| 64 |
+
`State:/Question:/Options: A. name: description`)를 그대로 렌더링합니다. 러너 자체
|
| 65 |
+
ablation에서 이 문구 차이만으로 jevbench-hard 정확도가 약 +6점 높게 측정되었습니다
|
| 66 |
+
(native 61.3 대 served 55.0; 동일 토크나이저 계열, rotation 없는 canonical 순서 기준).
|
| 67 |
+
옵션 **순서** 자체는 바꾸지 않습니다 — 요청이 준 순서(`choice`/`score`는 criteria
|
| 68 |
+
순서, `noul`은 항상 true 다음 false)를 그대로 쓰고 문구만 바꿉니다. 그래서
|
| 69 |
+
`--tokenizer-model`/`--tokenizer-revision`이 가리키는 토크나이저의 앞쪽 라벨이
|
| 70 |
+
정확히 대문자 `A`..`Z`(최대 26개 선택지)가 아니면 해당 요청은 거부됩니다 — 대부분의
|
| 71 |
+
영문 어휘 토크나이저에서는 자동으로 성립합니다.
|
| 72 |
+
|
| 73 |
+
`--tokenizer-model`/`--tokenizer-revision`도 함께 주면, 어댑터는 같은 pin을
|
| 74 |
+
`fix_mistral_regex=True`로 별도 로드해 HF chat template이 ��동 주입하는 모델
|
| 75 |
+
기본 시스템 프롬프트 텍스트를 추출하고, 이를 명시적 system 메시지로 앞에 붙입니다.
|
| 76 |
+
Ministral처럼 서빙 토크나이저가 `mistral-common` 백엔드로 해석되는 경우
|
| 77 |
+
(`native_tokenizer.py` 문서 참고) 이 백엔드는 기본 시스템 프롬프트를 자동으로
|
| 78 |
+
주입하지 않기 때문입니다 — 직접 추출한 텍스트가 없으면 시스템 메시지 없이 문구만
|
| 79 |
+
`native`로 서빙합니다(시작 시 경고 로그). `/opt/.../SYSTEM_PROMPT.txt` 같은 정적
|
| 80 |
+
문서 파일은 실제 chat template이 렌더링하는 기본 텍스트와 다를 수 있어(확인된 사례:
|
| 81 |
+
문장 하나가 중복/누락) 신뢰하지 않고, 항상 `apply_chat_template`을 직접 렌더링해서
|
| 82 |
+
추출합니다.
|
| 83 |
+
|
| 84 |
+
이 기본 시스템 프롬프트 자동 추출은 `--native-system-prompt {auto,none}`
|
| 85 |
+
(환경 변수 `JEV_NATIVE_SYSTEM_PROMPT`)로 끌 수 있습니다. 기본값 `auto`는 위에서
|
| 86 |
+
설명한 기존 동작 그대로이고, `none`은 추출 자체를 건너뛰고 시스템 메시지 없이
|
| 87 |
+
`native` 문구만 렌더링하며 누락 경고 로그도 남기지 않습니다. 이 옵션을 둔 이유는
|
| 88 |
+
Ministral 기본 시스템 프롬프트가 531토큰으로, 전형적인 요청 하나의 약 80%에 달할
|
| 89 |
+
만큼 커서 — 프리필 비용과 지연시간에 영향을 주는데, jevbench-hard 정확도 이득은
|
| 90 |
+
문구(`native` vs `served`) 자체에서 오지 시스템 프롬프트 유무에서 오는지는 별도
|
| 91 |
+
질문이기 때문입니다. `--prompt-wording served`에는 아무 영향이 없습니다.
|
| 92 |
+
|
| 93 |
+
```bash
|
| 94 |
+
.venv/bin/jev-adapter --model decision-model \
|
| 95 |
+
--tokenizer-model mistralai/Ministral-3-8B-Instruct-2512-BF16 \
|
| 96 |
+
--tokenizer-revision f6fae9795746f63c9be8344932f01275f3c63734 \
|
| 97 |
+
--prompt-wording native --default-temperature 2.4
|
| 98 |
+
```
|
| 99 |
+
|
| 100 |
+
CPU 전용 검증(`jevbench-original` 40개 + `internal-eval-v1` 40개 전체, `jevbench-hard`
|
| 101 |
+
5개는 구조만) 결과, 요청 옵션 순서를 고정하면 어댑터가 렌더링한 `native` 문구와
|
| 102 |
+
러너의 `format_prompt()` 출력은 **텍스트와 토큰 ID가 모두 완전히 일치**했고
|
| 103 |
+
(`mistral-common`이 명시 system 메시지를 렌더링한 토큰 ID와 HF 템플릿의 자동 주입
|
| 104 |
+
토큰 ID도 이 표본에서는 차이가 없었습니다), 라벨 토큰 ID도 일치했습니다. 다만
|
| 105 |
+
`jevbench-original`의 40개 중 24개, 표본 `jevbench-hard` 5개 중 5개에서
|
| 106 |
+
데이터셋이 기록한 "정답 채점 순서"(`expected.labels`)가 어댑터가 실제로 쓰는 옵션
|
| 107 |
+
순서(criteria 순서 / noul 고정 순서)와 달랐습니다 — 이는 문구와 무관한, 옵션 **순서**
|
| 108 |
+
자체의 사전 존재 차이이며 어댑터가 요청 순서를 그대로 따르는 한 코드로 없앨 수
|
| 109 |
+
없습니다. 러너의 native 61.3점 자체도 이 순서로 측정된 값이라, jev-adapter로
|
| 110 |
+
`--prompt-wording native`를 서빙했을 때 실제로 회수되는 점수는 이 순서 효과만큼
|
| 111 |
+
61.3보다 낮을 수 있습니다 — 문구 효과 자체는 위에서 텍스트/토큰 단위로 확인했습니다.
|
| 112 |
+
|
| 113 |
+
```bash
|
| 114 |
+
.venv/bin/python examples/smoke.py
|
| 115 |
+
.venv/bin/python examples/smoke.py --image /path/to/screenshot.png
|
| 116 |
+
```
|
| 117 |
+
|
| 118 |
+
기존 평가 클라이언트에서도 base URL을 `http://127.0.0.1:30120`으로 바꾸면 됩니다. `/v1/models`는 실제 모델명을 반환하고, `/health`는 어댑터 프로세스의 생존 여부만 확인합니다.
|
| 119 |
+
|
| 120 |
+
## 요청과 응답
|
| 121 |
+
|
| 122 |
+
전체 예시는 [examples/request.json](examples/request.json)을 참고하세요. 모델에는 실제 served name 또는 기본 별칭 `jev-latest`를 사용할 수 있습니다.
|
| 123 |
+
|
| 124 |
+
```json
|
| 125 |
+
{
|
| 126 |
+
"model": "jev-latest",
|
| 127 |
+
"state": "중복 결제를 환불해 주세요.",
|
| 128 |
+
"questions": {
|
| 129 |
+
"route": {
|
| 130 |
+
"type": "choice",
|
| 131 |
+
"instructions": "담당 부서는?",
|
| 132 |
+
"criteria": {"billing": "결제 및 환불", "technical": "기술 지원"}
|
| 133 |
+
},
|
| 134 |
+
"refund": {"type": "noul", "instructions": "환불 요청인가?"},
|
| 135 |
+
"urgency": {"type": "score", "instructions": "긴급도", "criteria": ["낮음", "보통", "높음"]}
|
| 136 |
+
},
|
| 137 |
+
"options": {"temperature": 1.0, "permutations": 1}
|
| 138 |
+
}
|
| 139 |
+
```
|
| 140 |
+
|
| 141 |
+
| 유형 | 결과 |
|
| 142 |
+
| --- | --- |
|
| 143 |
+
| `choice` | 선택지 확률, 최대 확률의 `choice`, 엔트로피 기반 `confidence` |
|
| 144 |
+
| `noul` | 참일 선택지의 확률인 `noul` |
|
| 145 |
+
| `score` | 0부터 시작하는 등급 인덱스의 기대값 `score`, 확률, `legend`, `confidence` |
|
| 146 |
+
|
| 147 |
+
`state`와 설명은 문자열 또는 JSON 객체/배열을 받을 수 있습니다. `images`는 HTTP(S) URL 또는 `data:image/...;base64,...` 목록이며, 이미지 바이트 처리와 비전 인코더 실행은 엔진이 담당합니다.
|
| 148 |
+
|
| 149 |
+
`options.permutations`는 선택지 순서를 회전한 뒤 원래 순서로 복원하여 확률을 평균합니다. **질문 수 × permutations만큼 프리필 평가**가 발생합니다. `return_logprobs: true`는 각 평가의 원래 vocabulary logprob를 제공합니다. `assistant_prefix`를 설정하면 실제 응답 경계에서 라벨이 ���일 토큰인지 다시 검증합니다.
|
| 150 |
+
|
| 151 |
+
확률은 지정한 라벨 안에서 정규화한 값입니다. `confidence = 1 - entropy / log(선택지 수)`는 실제 정답률의 보정값이 아닙니다. 학습하지 않은 모델의 판단 정확도는 별도로 평가해야 합니다.
|
| 152 |
+
|
| 153 |
+
## 엔진 API와 지원 범위
|
| 154 |
+
|
| 155 |
+
사용하는 공개 API는 `/model_info`, `/server_info`, `/v1/tokenize`, `/v1/detokenize`, `/generate`입니다. SGLang upstream [`0024efa0de38794ee309ba10ab00ebb891a3d050`](https://github.com/sgl-project/sglang/tree/0024efa0de38794ee309ba10ab00ebb891a3d050)의 구현을 기준으로 연결 규약을 확인했습니다. 오래된 릴리스에 필요한 API가 없으면 엔진 버전을 올려야 합니다.
|
| 156 |
+
|
| 157 |
+
일반 텍스트는 템플릿을 적용한 token IDs를 엔진에 전달합니다. 이미지 요청은 Qwen VL/Qwen3.5, Mistral3/Pixtral 계열의 일반적인 텍스트 기반 멀티모달 경로를 대상으로 합니다. 이미지가 포함된 프롬프트의 특수 토큰과 원본 이미지를 함께 전달합니다. 토큰만으로 프롬프트를 표현하는 다른 VLM 계열은 명시적으로 거부합니다. 모델마다 이미지 경로의 GPU 통합 검증이 필요합니다.
|
| 158 |
+
|
| 159 |
+
`/generate`에는 `max_new_tokens: 0`, `return_logprob: true`, `token_ids_logprob: [...]`를 설정합니다. 모든 라벨의 유한한 logprob와 `completion_tokens == 0`을 확인합니다. 누락된 확률이나 토큰 사용량을 임의로 보완하지 않습니다. speculative decoding/MTP를 사용하지 않는 일반 generation 서버가 필요합니다.
|
| 160 |
+
|
| 161 |
+
현재의 엄격한 프롬프트 검증은 평가마다 템플릿 토큰화, detokenize, 라벨 경계 일괄 검증, generate의 **HTTP 호출 4회**를 사용합니다. 이 왕복과 CPU 처리 비용은 GPU 프리필 시간에 추가됩니다. `metadata.adapter_elapsed_ms`는 이 작업과 대기 시간을 포함하고, 외부 HTTP 응답 직렬화/전송 시간은 제외합니다. `smoke.py`는 클라이언트에서 전체 왕복 시간을 표시합니다. GPU 간 지연 비교 수치로 대신 사용할 수 없습니다.
|
| 162 |
+
|
| 163 |
+
선택형 공식 토크나이저 경로는 초기 라벨 검증 이후 평가마다 CPU 토큰화와 엔진
|
| 164 |
+
`/generate` 호출 1회를 사용합니다. 두 경로의 HTTP 지연에는 서로 다른 CPU 처리와
|
| 165 |
+
왕복 횟수가 포함되므로 순수 모델 연산 성능처럼 비교하면 안 됩니다.
|
| 166 |
+
|
| 167 |
+
클라이언트 연결이 끊어지면 어댑터의 대기 작업과 엔진 HTTP 요청을 취소합니다. 이후 정리는 기본 엔진의 disconnect 처리에 의존합니다. 이미 실행 중인 GPU 연산을 즉시 중단한다는 보장은 없습니다.
|
| 168 |
+
|
| 169 |
+
vLLM 백엔드는 아직 구현하지 않았습니다. 추가 시 `ScoringBackend` 인터페이스를 구현하면 질문/응답 규약은 그대로 재사용할 수 있습니다.
|
| 170 |
+
|
| 171 |
+
## 검증과 코드
|
| 172 |
+
|
| 173 |
+
```bash
|
| 174 |
+
.venv/bin/python -m pytest
|
| 175 |
+
.venv/bin/ruff check .
|
| 176 |
+
```
|
| 177 |
+
|
| 178 |
+
테스트는 실제 프로토콜/서비스를 사용하고 추론 서버 HTTP 응답만 모의합니다. 확률 정규화, 순서 복원, 혼합 질문, 이미지 전달, 오류, 취소와 동시 실행 제한을 검증합니다. 이 테스트 통과는 NVIDIA GPU에서의 정확도·성능 또는 모델별 이미지 처리 성공을 뜻하지 않습니다.
|
| 179 |
+
|
| 180 |
+
2026-09-21 검증: 독립 Python 3.12 가상환경에서 **97개 테스트와 74개 하위 케이스 통과**, Ruff 통과. 기본 어댑터 환경에는 SGLang, vLLM, PyTorch, Transformers, MLX가 필요하지 않습니다. H200의 공식 SGLang 0.5.20 wheel로 네 모델 각각 4,006개 요청의 전체 벤치를 완료했으며, Ministral은 선택형 CPU 토크나이저 환경을 사용합니다.
|
| 181 |
+
|
| 182 |
+
2026-09-23 `--prompt-wording native` 추가 검증: 같은 가상환경에서 **136개 테스트와 80개 하위 케이스 통과**, Ruff 통과. 운영 서버(CPU 전용, GPU 미사용)에서 `jevbench-original`/`internal-eval-v1`/`jevbench-hard` 실제 레코드로 어댑터의 `native` 문구·토큰 ID 렌더링을 jevbench-hard 러너의 `run_suites_rotation.py` 계약과 직접 비교했습니다(위 "프롬프트 문구" 절 참고).
|
| 183 |
+
|
| 184 |
+
| 파일 | 역할 |
|
| 185 |
+
| --- | --- |
|
| 186 |
+
| `jev_adapter/protocol.py` | 요청 스키마, 프롬프트, 확률 및 응답 계산 |
|
| 187 |
+
| `jev_adapter/service.py` | 질문별 평가 실행, 병렬 수 제한, 결과 조합 |
|
| 188 |
+
| `jev_adapter/sglang.py` | 공개 SGLang HTTP API 클라이언트 |
|
| 189 |
+
| `jev_adapter/server.py` | 독립 FastAPI 서버 및 인증 |
|
| 190 |
+
| `jev_adapter/backend.py` | 다른 추론 엔진을 연결할 최소 인터페이스 |
|
| 191 |
+
|
| 192 |
+
이 레포는 엔진 소스 트리나 형제 디렉터리를 import하지 않습니다. 기존 `sglang-jev` 실험 레포와 벤치마크 결과는 원래 위치에 남아 있습니다. 초기 프로토콜 코드의 출처는 [NOTICE](NOTICE)를 참고하세요.
|
| 193 |
+
|
| 194 |
+
## H200 학습 전 벤치마크
|
| 195 |
+
|
| 196 |
+
[benchmarks/README.md](benchmarks/README.md)에 H200 한 장에서 Ministral 3 3B, Qwen3.5-4B, Qwen3.6-27B, Qwen3.6-35B-A3B를 순서대로 평가하는 절차가 ��습니다. 기본 비교는 BF16이며 KEV 공개 개발 세트의 정확도·확률 품질·HTTP 지연시간을 기록합니다. 데이터와 모델 리비전을 고정했고 H200 실측을 완료했습니다. KEV 외 공개 평가셋 조사는 [benchmarks/PUBLIC_DATASETS.md](benchmarks/PUBLIC_DATASETS.md)를 참고하세요.
|
server/jev_adapter/__init__.py
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Engine-independent next-token decision API."""
|
| 2 |
+
|
| 3 |
+
__version__ = "0.1.0"
|
server/jev_adapter/__main__.py
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""CLI for the independent adapter process."""
|
| 2 |
+
|
| 3 |
+
import argparse
|
| 4 |
+
import logging
|
| 5 |
+
import math
|
| 6 |
+
import os
|
| 7 |
+
|
| 8 |
+
logger = logging.getLogger(__name__)
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
def positive_temperature(text: str) -> float:
|
| 12 |
+
"""argparse type for --default-temperature: a finite number above zero."""
|
| 13 |
+
try:
|
| 14 |
+
value = float(text)
|
| 15 |
+
except ValueError:
|
| 16 |
+
raise argparse.ArgumentTypeError(f"not a number: {text!r}") from None
|
| 17 |
+
if not math.isfinite(value) or value <= 0:
|
| 18 |
+
raise argparse.ArgumentTypeError("must be finite and greater than zero")
|
| 19 |
+
return value
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def main():
|
| 23 |
+
parser = argparse.ArgumentParser(description=__doc__)
|
| 24 |
+
parser.add_argument("--engine-url", default="http://127.0.0.1:30000")
|
| 25 |
+
parser.add_argument("--model", required=True, help="Engine's served model name")
|
| 26 |
+
parser.add_argument("--alias", default="jev-latest")
|
| 27 |
+
parser.add_argument("--host", default="127.0.0.1")
|
| 28 |
+
parser.add_argument("--port", type=int, default=30120)
|
| 29 |
+
parser.add_argument("--timeout", type=float, default=120.0)
|
| 30 |
+
parser.add_argument("--max-concurrency", type=int, default=32)
|
| 31 |
+
parser.add_argument(
|
| 32 |
+
"--tokenizer-model", help="Optional official text tokenizer repo"
|
| 33 |
+
)
|
| 34 |
+
parser.add_argument("--tokenizer-revision", help="Immutable tokenizer revision")
|
| 35 |
+
parser.add_argument(
|
| 36 |
+
"--default-temperature",
|
| 37 |
+
type=positive_temperature,
|
| 38 |
+
default=os.environ.get("JEV_DEFAULT_TEMPERATURE", "1.0"),
|
| 39 |
+
help="Temperature applied when a request omits options.temperature "
|
| 40 |
+
"(label logits are divided by T before softmax; an explicit request "
|
| 41 |
+
"value wins). Env: JEV_DEFAULT_TEMPERATURE. Default 1.0.",
|
| 42 |
+
)
|
| 43 |
+
parser.add_argument(
|
| 44 |
+
"--prompt-wording",
|
| 45 |
+
choices=("served", "native"),
|
| 46 |
+
default=os.environ.get("JEV_PROMPT_WORDING", "served"),
|
| 47 |
+
help="'served' (default, unchanged behaviour): this adapter's own "
|
| 48 |
+
"prompt text (Context:/.../Options: A: name: description). 'native': "
|
| 49 |
+
"the jevbench-hard runner's own contract instead (run_suites_rotation.py: "
|
| 50 |
+
"State:/Question:/Options: A. name: description), which the runner's "
|
| 51 |
+
"own ablation measured as worth about +6 points on jevbench-hard by "
|
| 52 |
+
"wording alone. Requires the engine tokenizer's first labels to be "
|
| 53 |
+
"canonical single-token A-Z (true for essentially all "
|
| 54 |
+
"English-vocabulary tokenizers; jev_adapter.protocol.build_prompt "
|
| 55 |
+
"raises per-request otherwise). With --tokenizer-model/"
|
| 56 |
+
"--tokenizer-revision also set, the adapter additionally extracts the "
|
| 57 |
+
"model's default system-prompt text from a dedicated HF-template load "
|
| 58 |
+
"of that same pin and prepends it explicitly, since a mistral-common "
|
| 59 |
+
"native tokenizer (the default for Ministral) never auto-injects it. "
|
| 60 |
+
"See --native-system-prompt to disable this. Env: JEV_PROMPT_WORDING.",
|
| 61 |
+
)
|
| 62 |
+
parser.add_argument(
|
| 63 |
+
"--native-system-prompt",
|
| 64 |
+
choices=("auto", "none"),
|
| 65 |
+
default=os.environ.get("JEV_NATIVE_SYSTEM_PROMPT", "auto"),
|
| 66 |
+
help="Only takes effect with --prompt-wording native; ignored "
|
| 67 |
+
"otherwise. 'auto' (default, unchanged behaviour): with "
|
| 68 |
+
"--tokenizer-model/--tokenizer-revision also set, extract the "
|
| 69 |
+
"model's default system-prompt text from the pinned tokenizer's chat "
|
| 70 |
+
"template (see --prompt-wording) and prepend it as an explicit "
|
| 71 |
+
"system message; warns at startup if no tokenizer pin is given or "
|
| 72 |
+
"the template defines no default system prompt. 'none': render the "
|
| 73 |
+
"native wording with no system message at all -- skips the "
|
| 74 |
+
"extraction entirely and never warns about a missing prompt (useful "
|
| 75 |
+
"when the extra system-prompt tokens are not wanted, e.g. the "
|
| 76 |
+
"Ministral default is 531 tokens, about 80%% of a typical request). "
|
| 77 |
+
"Env: JEV_NATIVE_SYSTEM_PROMPT.",
|
| 78 |
+
)
|
| 79 |
+
# argparse runs the type converter on the string default too, so a bad
|
| 80 |
+
# JEV_DEFAULT_TEMPERATURE fails at startup with the same message.
|
| 81 |
+
args = parser.parse_args()
|
| 82 |
+
if args.timeout <= 0 or args.max_concurrency < 1:
|
| 83 |
+
parser.error("timeout and max-concurrency must be positive")
|
| 84 |
+
if bool(args.tokenizer_model) != bool(args.tokenizer_revision):
|
| 85 |
+
parser.error("tokenizer-model and tokenizer-revision must be supplied together")
|
| 86 |
+
|
| 87 |
+
import uvicorn
|
| 88 |
+
|
| 89 |
+
from .server import create_app
|
| 90 |
+
from .sglang import SGLangBackend
|
| 91 |
+
|
| 92 |
+
native_tokenizer = None
|
| 93 |
+
native_system_prompt = None
|
| 94 |
+
if args.tokenizer_model:
|
| 95 |
+
from .native_tokenizer import NativeTokenizer
|
| 96 |
+
|
| 97 |
+
native_tokenizer = NativeTokenizer.from_pretrained(
|
| 98 |
+
args.tokenizer_model, args.tokenizer_revision
|
| 99 |
+
)
|
| 100 |
+
if args.prompt_wording == "native" and args.native_system_prompt == "auto":
|
| 101 |
+
native_system_prompt = NativeTokenizer.native_default_system_prompt(
|
| 102 |
+
args.tokenizer_model, args.tokenizer_revision
|
| 103 |
+
)
|
| 104 |
+
if (
|
| 105 |
+
args.prompt_wording == "native"
|
| 106 |
+
and args.native_system_prompt == "auto"
|
| 107 |
+
and native_system_prompt is None
|
| 108 |
+
):
|
| 109 |
+
logger.warning(
|
| 110 |
+
"prompt-wording=native without a default system prompt (pass "
|
| 111 |
+
"--tokenizer-model/--tokenizer-revision to extract and prepend the "
|
| 112 |
+
"model's own default system message, or the model's template "
|
| 113 |
+
"defines none); serving the native wording text without it."
|
| 114 |
+
)
|
| 115 |
+
logger.info(
|
| 116 |
+
"prompt_wording=%s native_system_prompt=%s (%s)",
|
| 117 |
+
args.prompt_wording,
|
| 118 |
+
args.native_system_prompt,
|
| 119 |
+
"system message attached"
|
| 120 |
+
if native_system_prompt
|
| 121 |
+
else "no system message attached",
|
| 122 |
+
)
|
| 123 |
+
backend = SGLangBackend(
|
| 124 |
+
args.engine_url,
|
| 125 |
+
args.model,
|
| 126 |
+
api_key=os.environ.get("SGLANG_API_KEY"),
|
| 127 |
+
timeout=args.timeout,
|
| 128 |
+
max_connections=args.max_concurrency,
|
| 129 |
+
native_tokenizer=native_tokenizer,
|
| 130 |
+
prompt_wording=args.prompt_wording,
|
| 131 |
+
native_system_prompt=native_system_prompt,
|
| 132 |
+
)
|
| 133 |
+
app = create_app(
|
| 134 |
+
backend,
|
| 135 |
+
api_key=os.environ.get("JEV_API_KEY"),
|
| 136 |
+
max_concurrency=args.max_concurrency,
|
| 137 |
+
alias=args.alias,
|
| 138 |
+
default_temperature=args.default_temperature,
|
| 139 |
+
prompt_wording=args.prompt_wording,
|
| 140 |
+
)
|
| 141 |
+
uvicorn.run(app, host=args.host, port=args.port)
|
| 142 |
+
|
| 143 |
+
|
| 144 |
+
if __name__ == "__main__":
|
| 145 |
+
main()
|
server/jev_adapter/backend.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""The small contract between response formatting and inference transport."""
|
| 2 |
+
|
| 3 |
+
from dataclasses import dataclass
|
| 4 |
+
from typing import Protocol
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
class AdapterError(Exception):
|
| 8 |
+
def __init__(self, code: str, message: str, field: str = "", status: int = 422):
|
| 9 |
+
super().__init__(message)
|
| 10 |
+
self.code, self.field, self.status = code, field, status
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
@dataclass(frozen=True)
|
| 14 |
+
class ScoringResult:
|
| 15 |
+
logprobs: tuple[float, ...]
|
| 16 |
+
input_tokens: int
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
class ScoringBackend(Protocol):
|
| 20 |
+
model: str
|
| 21 |
+
|
| 22 |
+
async def start(self) -> None: ...
|
| 23 |
+
|
| 24 |
+
async def close(self) -> None: ...
|
| 25 |
+
|
| 26 |
+
def labels(self, count: int) -> tuple[tuple[str, ...], tuple[int, ...]]: ...
|
| 27 |
+
|
| 28 |
+
async def evaluate(
|
| 29 |
+
self,
|
| 30 |
+
prompt: str,
|
| 31 |
+
images: list[str],
|
| 32 |
+
labels: tuple[str, ...],
|
| 33 |
+
token_ids: tuple[int, ...],
|
| 34 |
+
assistant_prefix: str | None,
|
| 35 |
+
) -> ScoringResult: ...
|
server/jev_adapter/native_tokenizer.py
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Optional CPU chat tokenization that preserves native control-token IDs.
|
| 2 |
+
|
| 3 |
+
This path is useful when an engine's string-based chat API cannot roundtrip a
|
| 4 |
+
tokenizer's control tokens. It loads tokenizer assets, never model weights.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
from typing import Any
|
| 8 |
+
|
| 9 |
+
from .backend import AdapterError
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
class NativeTokenizer:
|
| 13 |
+
def __init__(self, tokenizer: Any):
|
| 14 |
+
self.tokenizer = tokenizer
|
| 15 |
+
|
| 16 |
+
@classmethod
|
| 17 |
+
def from_pretrained(cls, model: str, revision: str) -> "NativeTokenizer":
|
| 18 |
+
if not model.strip() or not revision.strip():
|
| 19 |
+
raise ValueError("Native tokenizer model and pinned revision are required")
|
| 20 |
+
# Keep the default HTTP-only installation free of Transformers.
|
| 21 |
+
from transformers import AutoTokenizer
|
| 22 |
+
|
| 23 |
+
return cls(
|
| 24 |
+
AutoTokenizer.from_pretrained(
|
| 25 |
+
model,
|
| 26 |
+
revision=revision,
|
| 27 |
+
trust_remote_code=False,
|
| 28 |
+
)
|
| 29 |
+
)
|
| 30 |
+
|
| 31 |
+
def _chat(self, messages: list[dict], *, continuation: bool) -> list[int]:
|
| 32 |
+
try:
|
| 33 |
+
tokens = self.tokenizer.apply_chat_template(
|
| 34 |
+
messages,
|
| 35 |
+
tokenize=True,
|
| 36 |
+
add_generation_prompt=not continuation,
|
| 37 |
+
continue_final_message=continuation,
|
| 38 |
+
return_dict=False,
|
| 39 |
+
enable_thinking=False,
|
| 40 |
+
)
|
| 41 |
+
except Exception as error:
|
| 42 |
+
raise AdapterError(
|
| 43 |
+
"unsupported_native_tokenizer",
|
| 44 |
+
"The native tokenizer could not prepare an open assistant message.",
|
| 45 |
+
) from error
|
| 46 |
+
if (
|
| 47 |
+
not isinstance(tokens, list)
|
| 48 |
+
or not tokens
|
| 49 |
+
or any(type(token) is not int or token < 0 for token in tokens)
|
| 50 |
+
):
|
| 51 |
+
raise AdapterError(
|
| 52 |
+
"unsupported_native_tokenizer",
|
| 53 |
+
"The native tokenizer returned invalid chat token IDs.",
|
| 54 |
+
)
|
| 55 |
+
return tokens
|
| 56 |
+
|
| 57 |
+
def prepare(
|
| 58 |
+
self,
|
| 59 |
+
prompt: str,
|
| 60 |
+
labels: tuple[str, ...],
|
| 61 |
+
token_ids: tuple[int, ...],
|
| 62 |
+
assistant_prefix: str | None,
|
| 63 |
+
system_prompt: str | None = None,
|
| 64 |
+
) -> list[int]:
|
| 65 |
+
"""Return native prompt IDs only when every answer continues by one token.
|
| 66 |
+
|
| 67 |
+
Full native conversations are tokenized for both the base and each
|
| 68 |
+
continuation. Decoding and re-encoding control tokens is never used.
|
| 69 |
+
Comparing against engine-selected IDs also detects tokenizer mismatch.
|
| 70 |
+
|
| 71 |
+
``system_prompt``, when given, is prepended as an explicit system
|
| 72 |
+
message rather than relying on the tokenizer's own auto-injection: a
|
| 73 |
+
mistral-common-backed tokenizer never auto-injects a default system
|
| 74 |
+
prompt (unlike the HF Jinja chat template), so wording="native"
|
| 75 |
+
serving supplies the runner's default system text explicitly here
|
| 76 |
+
(see ``extract_default_system_prompt``/``native_default_system_prompt``).
|
| 77 |
+
This can still render to different token IDs than the HF template's
|
| 78 |
+
own auto-injection; that gap is measured, not assumed away.
|
| 79 |
+
"""
|
| 80 |
+
if (
|
| 81 |
+
len(labels) < 2
|
| 82 |
+
or len(labels) != len(token_ids)
|
| 83 |
+
or len(set(labels)) != len(labels)
|
| 84 |
+
or len(set(token_ids)) != len(token_ids)
|
| 85 |
+
or any(not isinstance(label, str) or not label for label in labels)
|
| 86 |
+
or any(type(token) is not int or token < 0 for token in token_ids)
|
| 87 |
+
):
|
| 88 |
+
raise AdapterError(
|
| 89 |
+
"invalid_labels", "Distinct label/token pairs are required."
|
| 90 |
+
)
|
| 91 |
+
messages = (
|
| 92 |
+
[{"role": "system", "content": system_prompt}] if system_prompt else []
|
| 93 |
+
) + [{"role": "user", "content": prompt}]
|
| 94 |
+
base = self._chat(messages, continuation=False)
|
| 95 |
+
prefix = assistant_prefix or ""
|
| 96 |
+
final_ids = base
|
| 97 |
+
if prefix:
|
| 98 |
+
final_ids = self._chat(
|
| 99 |
+
messages + [{"role": "assistant", "content": prefix}],
|
| 100 |
+
continuation=True,
|
| 101 |
+
)
|
| 102 |
+
if final_ids[: len(base)] != base:
|
| 103 |
+
raise AdapterError(
|
| 104 |
+
"invalid_label_boundary",
|
| 105 |
+
"The assistant prefix changes the native chat prompt boundary.",
|
| 106 |
+
"options.assistant_prefix",
|
| 107 |
+
)
|
| 108 |
+
for label, token_id in zip(labels, token_ids):
|
| 109 |
+
continued = self._chat(
|
| 110 |
+
messages + [{"role": "assistant", "content": prefix + label}],
|
| 111 |
+
continuation=True,
|
| 112 |
+
)
|
| 113 |
+
if continued != final_ids + [token_id]:
|
| 114 |
+
raise AdapterError(
|
| 115 |
+
"invalid_label_boundary",
|
| 116 |
+
"A native assistant label does not continue by its engine token ID; "
|
| 117 |
+
"use matching tokenizers and a compatible assistant_prefix.",
|
| 118 |
+
"options.assistant_prefix",
|
| 119 |
+
)
|
| 120 |
+
return final_ids
|
| 121 |
+
|
| 122 |
+
@classmethod
|
| 123 |
+
def native_default_system_prompt(cls, model: str, revision: str) -> "str | None":
|
| 124 |
+
"""The jevbench-hard runner's default system-prompt text for ``model``
|
| 125 |
+
@``revision``: a dedicated HF fast-tokenizer load with the runner's own
|
| 126 |
+
``fix_mistral_regex=True`` (for ``mistralai/*`` models), independent of
|
| 127 |
+
whichever tokenizer class plain ``from_pretrained`` resolves to for
|
| 128 |
+
serving -- for Ministral that is a mistral-common backend (see the
|
| 129 |
+
module docstring and ``extract_default_system_prompt``), which never
|
| 130 |
+
performs this auto-injection, so probing the serving tokenizer itself
|
| 131 |
+
would incorrectly report "no default system prompt".
|
| 132 |
+
|
| 133 |
+
Returns None when the model's template defines no default system
|
| 134 |
+
message. Requires transformers; call only for wording="native".
|
| 135 |
+
"""
|
| 136 |
+
if not model.strip() or not revision.strip():
|
| 137 |
+
raise ValueError("Native tokenizer model and pinned revision are required")
|
| 138 |
+
from transformers import AutoTokenizer
|
| 139 |
+
|
| 140 |
+
kwargs: dict[str, Any] = {"revision": revision, "trust_remote_code": False}
|
| 141 |
+
if model.startswith("mistralai/"):
|
| 142 |
+
kwargs["fix_mistral_regex"] = True
|
| 143 |
+
tokenizer = AutoTokenizer.from_pretrained(model, **kwargs)
|
| 144 |
+
return extract_default_system_prompt(tokenizer)
|
| 145 |
+
|
| 146 |
+
|
| 147 |
+
def extract_default_system_prompt(tokenizer: Any) -> "str | None":
|
| 148 |
+
"""Return the text a chat template auto-injects as a default system
|
| 149 |
+
message, or None if rendering a system-free conversation injects none.
|
| 150 |
+
|
| 151 |
+
Works by rendering one throwaway user turn and looking for the literal
|
| 152 |
+
``[SYSTEM_PROMPT]``/``[/SYSTEM_PROMPT]`` markers Mistral's HF Jinja
|
| 153 |
+
template wraps its auto-injected default system message in. A
|
| 154 |
+
mistral-common-backed tokenizer implements the same ``apply_chat_template``
|
| 155 |
+
surface but never performs this injection (see run_suites_ablate.py's
|
| 156 |
+
native_mc contract), so calling this on one correctly returns None --
|
| 157 |
+
that is the documented tokenizer-path difference wording="native" serving
|
| 158 |
+
has to work around by supplying the text explicitly instead of relying on
|
| 159 |
+
auto-injection (see ``NativeTokenizer.prepare``'s ``system_prompt``).
|
| 160 |
+
"""
|
| 161 |
+
rendered = tokenizer.apply_chat_template(
|
| 162 |
+
[{"role": "user", "content": ""}],
|
| 163 |
+
tokenize=False,
|
| 164 |
+
add_generation_prompt=True,
|
| 165 |
+
enable_thinking=False,
|
| 166 |
+
)
|
| 167 |
+
if not isinstance(rendered, str) or "[SYSTEM_PROMPT]" not in rendered:
|
| 168 |
+
return None
|
| 169 |
+
return rendered.split("[SYSTEM_PROMPT]", 1)[1].split("[/SYSTEM_PROMPT]", 1)[0]
|
server/jev_adapter/protocol.py
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Validated requests and pure scoring helpers for the System One compatible API.
|
| 2 |
+
|
| 3 |
+
This is next-token classification with an existing language model, not the
|
| 4 |
+
proprietary Jev model. Confidence follows the llama.cpp fork's formula,
|
| 5 |
+
``1 - entropy / log(number of options)``; it is not a calibration guarantee.
|
| 6 |
+
"""
|
| 7 |
+
|
| 8 |
+
import json
|
| 9 |
+
import math
|
| 10 |
+
import string
|
| 11 |
+
from collections.abc import Sequence
|
| 12 |
+
from dataclasses import dataclass
|
| 13 |
+
from numbers import Real
|
| 14 |
+
from typing import Annotated, Literal
|
| 15 |
+
from urllib.parse import urlsplit
|
| 16 |
+
|
| 17 |
+
from pydantic import (
|
| 18 |
+
BaseModel,
|
| 19 |
+
ConfigDict,
|
| 20 |
+
Field,
|
| 21 |
+
JsonValue,
|
| 22 |
+
StrictBool,
|
| 23 |
+
StrictStr,
|
| 24 |
+
field_validator,
|
| 25 |
+
model_validator,
|
| 26 |
+
)
|
| 27 |
+
|
| 28 |
+
StructuredText = StrictStr | dict[StrictStr, JsonValue] | list[JsonValue]
|
| 29 |
+
Description = StructuredText | None
|
| 30 |
+
QuestionType = Literal["choice", "noul", "score"]
|
| 31 |
+
PromptWording = Literal["served", "native"]
|
| 32 |
+
|
| 33 |
+
# The jevbench-hard runner's own contract (run_suites_rotation.py: PREFIX,
|
| 34 |
+
# format_prompt, CONTRACT), copied verbatim. Rendering ``build_prompt`` with
|
| 35 |
+
# wording="native" reproduces this text exactly; the runner measured this
|
| 36 |
+
# wording alone as worth about +6 points on jevbench-hard over the served
|
| 37 |
+
# wording below (native 61.3 vs served 55.0 Hard accuracy, same tokenizer
|
| 38 |
+
# family). See run_suites_ablate.py for the full effect decomposition.
|
| 39 |
+
NATIVE_PROMPT_PREFIX = (
|
| 40 |
+
"Read the state and question. Choose the single best option using the "
|
| 41 |
+
"supplied information. Respond with exactly one option letter and no "
|
| 42 |
+
"other text."
|
| 43 |
+
)
|
| 44 |
+
NATIVE_PROMPT_CONTRACT = "jev-public-hard-native-letter-v1"
|
| 45 |
+
_NATIVE_DISPLAY = string.ascii_uppercase
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
class _SystemOneModel(BaseModel):
|
| 49 |
+
model_config = ConfigDict(extra="forbid")
|
| 50 |
+
|
| 51 |
+
@model_validator(mode="after")
|
| 52 |
+
def validate_finite_json(self):
|
| 53 |
+
# JsonValue permits floats; JSON descriptions must not contain NaN/Inf.
|
| 54 |
+
try:
|
| 55 |
+
json.dumps(self.model_dump(), allow_nan=False)
|
| 56 |
+
except (ValueError, TypeError) as exc:
|
| 57 |
+
raise ValueError("all structured values must be finite JSON") from exc
|
| 58 |
+
return self
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
class ChoiceQuestion(_SystemOneModel):
|
| 62 |
+
type: Literal["choice"]
|
| 63 |
+
instructions: StructuredText
|
| 64 |
+
criteria: dict[StrictStr, Description] = Field(min_length=2, max_length=255)
|
| 65 |
+
|
| 66 |
+
@field_validator("criteria")
|
| 67 |
+
@classmethod
|
| 68 |
+
def validate_names(cls, criteria):
|
| 69 |
+
if any(not name.strip() for name in criteria):
|
| 70 |
+
raise ValueError("option names must not be empty")
|
| 71 |
+
return criteria
|
| 72 |
+
|
| 73 |
+
|
| 74 |
+
class NoulQuestion(_SystemOneModel):
|
| 75 |
+
type: Literal["noul"]
|
| 76 |
+
instructions: StructuredText
|
| 77 |
+
criteria: dict[StrictStr, Description] | None = None
|
| 78 |
+
|
| 79 |
+
@field_validator("criteria")
|
| 80 |
+
@classmethod
|
| 81 |
+
def validate_boolean_criteria(cls, criteria):
|
| 82 |
+
if criteria is not None and set(criteria) != {"true", "false"}:
|
| 83 |
+
raise ValueError('noul criteria must contain exactly "true" and "false"')
|
| 84 |
+
return criteria
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
class ScoreQuestion(_SystemOneModel):
|
| 88 |
+
type: Literal["score"]
|
| 89 |
+
instructions: StructuredText
|
| 90 |
+
criteria: list[Description] = Field(min_length=2, max_length=10)
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
SystemOneQuestion = Annotated[
|
| 94 |
+
ChoiceQuestion | NoulQuestion | ScoreQuestion, Field(discriminator="type")
|
| 95 |
+
]
|
| 96 |
+
|
| 97 |
+
|
| 98 |
+
class SystemOneOptions(_SystemOneModel):
|
| 99 |
+
temperature: float = Field(default=1.0, gt=0, allow_inf_nan=False, strict=True)
|
| 100 |
+
temperature_scaling: StrictBool = True
|
| 101 |
+
permutations: int = Field(default=1, ge=1, le=16, strict=True)
|
| 102 |
+
return_logprobs: StrictBool = False
|
| 103 |
+
assistant_prefix: StrictStr | None = None
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
class SystemOneRequest(_SystemOneModel):
|
| 107 |
+
model: StrictStr = Field(min_length=1)
|
| 108 |
+
state: StructuredText
|
| 109 |
+
questions: dict[StrictStr, SystemOneQuestion] = Field(min_length=1, max_length=256)
|
| 110 |
+
options: SystemOneOptions = Field(default_factory=SystemOneOptions)
|
| 111 |
+
images: list[StrictStr] = Field(default_factory=list)
|
| 112 |
+
|
| 113 |
+
@field_validator("model")
|
| 114 |
+
@classmethod
|
| 115 |
+
def validate_model(cls, model):
|
| 116 |
+
if not model.strip():
|
| 117 |
+
raise ValueError("model must not be empty")
|
| 118 |
+
return model
|
| 119 |
+
|
| 120 |
+
@field_validator("questions")
|
| 121 |
+
@classmethod
|
| 122 |
+
def validate_question_names(cls, questions):
|
| 123 |
+
if any(not name.strip() for name in questions):
|
| 124 |
+
raise ValueError("question names must not be empty")
|
| 125 |
+
return questions
|
| 126 |
+
|
| 127 |
+
@field_validator("images")
|
| 128 |
+
@classmethod
|
| 129 |
+
def validate_images(cls, images):
|
| 130 |
+
for image in images:
|
| 131 |
+
if image.startswith("data:image/"):
|
| 132 |
+
if "," not in image or not image.split(",", 1)[1]:
|
| 133 |
+
raise ValueError("image data URLs must have a nonempty payload")
|
| 134 |
+
else:
|
| 135 |
+
parsed = urlsplit(image)
|
| 136 |
+
if parsed.scheme not in ("http", "https") or not parsed.netloc:
|
| 137 |
+
raise ValueError("images must be image data URLs or HTTP(S) URLs")
|
| 138 |
+
return images
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
@dataclass(frozen=True)
|
| 142 |
+
class QuestionPlan:
|
| 143 |
+
type: QuestionType
|
| 144 |
+
instructions: StructuredText
|
| 145 |
+
option_names: tuple[str, ...]
|
| 146 |
+
descriptions: tuple[Description, ...]
|
| 147 |
+
|
| 148 |
+
|
| 149 |
+
def plan_question(question: SystemOneQuestion) -> QuestionPlan:
|
| 150 |
+
"""Keep caller option order; boolean options always map to true, false."""
|
| 151 |
+
if isinstance(question, ChoiceQuestion):
|
| 152 |
+
names = tuple(question.criteria)
|
| 153 |
+
descriptions = tuple(question.criteria.values())
|
| 154 |
+
elif isinstance(question, NoulQuestion):
|
| 155 |
+
names = ("true", "false")
|
| 156 |
+
criteria = question.criteria or {}
|
| 157 |
+
descriptions = tuple(criteria.get(name) for name in names)
|
| 158 |
+
elif isinstance(question, ScoreQuestion):
|
| 159 |
+
names = tuple(str(index) for index in range(len(question.criteria)))
|
| 160 |
+
descriptions = tuple(question.criteria)
|
| 161 |
+
else:
|
| 162 |
+
raise TypeError("question must be a validated System One question")
|
| 163 |
+
return QuestionPlan(question.type, question.instructions, names, descriptions)
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
def render_json_text(value: StructuredText) -> str:
|
| 167 |
+
"""Render structured input deterministically without changing plain text."""
|
| 168 |
+
if isinstance(value, str):
|
| 169 |
+
return value
|
| 170 |
+
return json.dumps(value, ensure_ascii=False, sort_keys=True, allow_nan=False)
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
def render_native_state_text(value: StructuredText) -> str:
|
| 174 |
+
"""Render ``state`` exactly as the jevbench-hard runner's ``format_prompt``
|
| 175 |
+
does: plain strings verbatim, everything else as a sorted, indented JSON
|
| 176 |
+
dump. Only ``state`` gets this treatment in the native contract -- unlike
|
| 177 |
+
the served wording, the runner interpolates ``instructions`` and option
|
| 178 |
+
descriptions directly (``str()``), which ``_build_native_prompt`` mirrors."""
|
| 179 |
+
if isinstance(value, str):
|
| 180 |
+
return value
|
| 181 |
+
return json.dumps(
|
| 182 |
+
value, sort_keys=True, ensure_ascii=False, indent=2, allow_nan=False
|
| 183 |
+
)
|
| 184 |
+
|
| 185 |
+
|
| 186 |
+
def rotation_order(option_count: int, rotation: int) -> tuple[int, ...]:
|
| 187 |
+
"""Map each displayed label position to its original option index."""
|
| 188 |
+
if option_count < 2 or rotation < 0:
|
| 189 |
+
raise ValueError("at least two options and a nonnegative rotation are required")
|
| 190 |
+
return tuple(
|
| 191 |
+
(position + rotation) % option_count for position in range(option_count)
|
| 192 |
+
)
|
| 193 |
+
|
| 194 |
+
|
| 195 |
+
def _validate_order(order: Sequence[int], option_count: int) -> None:
|
| 196 |
+
if (
|
| 197 |
+
len(order) != option_count
|
| 198 |
+
or any(isinstance(index, bool) or not isinstance(index, int) for index in order)
|
| 199 |
+
or set(order) != set(range(option_count))
|
| 200 |
+
):
|
| 201 |
+
raise ValueError("option order must be a permutation of all original indices")
|
| 202 |
+
|
| 203 |
+
|
| 204 |
+
def build_prompt(
|
| 205 |
+
state: StructuredText,
|
| 206 |
+
plan: QuestionPlan,
|
| 207 |
+
labels: Sequence[str],
|
| 208 |
+
order: Sequence[int] | None = None,
|
| 209 |
+
*,
|
| 210 |
+
wording: PromptWording = "served",
|
| 211 |
+
) -> str:
|
| 212 |
+
"""Build user content; the serving layer applies a non-thinking chat template.
|
| 213 |
+
|
| 214 |
+
Labels must already have been verified as distinct single-token symbols in
|
| 215 |
+
the assistant context by the serving layer. The shared state is first to
|
| 216 |
+
make prefix reuse possible across questions and option rotations.
|
| 217 |
+
|
| 218 |
+
``wording="served"`` (default, unchanged) renders this adapter's own
|
| 219 |
+
contract (``Context:/.../Options: A: name: description``).
|
| 220 |
+
|
| 221 |
+
``wording="native"`` renders the jevbench-hard runner's own contract
|
| 222 |
+
instead (run_suites_rotation.py: ``PREFIX``/``State:``/``Question:``/
|
| 223 |
+
``Options: A. name: description``), which the runner's own ablation
|
| 224 |
+
measured as worth about +6 points on jevbench-hard by wording alone. It
|
| 225 |
+
requires canonical, single-token ``A``..``Z`` labels (at most 26 options)
|
| 226 |
+
in the given order, because that is the letter-token contract the native
|
| 227 |
+
runner assumes; a backend whose tokenizer's first labels are not exactly
|
| 228 |
+
those letters cannot serve this wording and ``build_prompt`` raises.
|
| 229 |
+
"""
|
| 230 |
+
option_count = len(plan.option_names)
|
| 231 |
+
if len(labels) != option_count or len(set(labels)) != option_count:
|
| 232 |
+
raise ValueError("exactly one distinct label per option is required")
|
| 233 |
+
if any(
|
| 234 |
+
not isinstance(label, str) or not label or "\n" in label for label in labels
|
| 235 |
+
):
|
| 236 |
+
raise ValueError("labels must be nonempty single-line strings")
|
| 237 |
+
order = tuple(range(option_count)) if order is None else order
|
| 238 |
+
_validate_order(order, option_count)
|
| 239 |
+
if wording == "native":
|
| 240 |
+
return _build_native_prompt(state, plan, labels, order)
|
| 241 |
+
if wording != "served":
|
| 242 |
+
raise ValueError('wording must be "served" or "native"')
|
| 243 |
+
lines = []
|
| 244 |
+
for label, index in zip(labels, order):
|
| 245 |
+
name = plan.option_names[index]
|
| 246 |
+
if plan.type == "noul":
|
| 247 |
+
name = "yes" if name == "true" else "no"
|
| 248 |
+
description = plan.descriptions[index]
|
| 249 |
+
text = (
|
| 250 |
+
name if description is None else f"{name}: {render_json_text(description)}"
|
| 251 |
+
)
|
| 252 |
+
lines.append(f"{label}: {text}")
|
| 253 |
+
return (
|
| 254 |
+
f"Context:\n{render_json_text(state)}\n\n"
|
| 255 |
+
"Answer the question with only the label of the best option "
|
| 256 |
+
"(the complete label before the colon), nothing else.\n"
|
| 257 |
+
f"Question: {render_json_text(plan.instructions)}\nOptions:\n"
|
| 258 |
+
+ "\n".join(lines)
|
| 259 |
+
)
|
| 260 |
+
|
| 261 |
+
|
| 262 |
+
def _build_native_prompt(
|
| 263 |
+
state: StructuredText,
|
| 264 |
+
plan: QuestionPlan,
|
| 265 |
+
labels: Sequence[str],
|
| 266 |
+
order: Sequence[int],
|
| 267 |
+
) -> str:
|
| 268 |
+
"""``build_prompt(..., wording="native")``'s body: a byte-for-byte port of
|
| 269 |
+
run_suites_rotation.py's ``option_texts`` + ``format_prompt`` for the
|
| 270 |
+
normalized KEV question schema this adapter already validates into
|
| 271 |
+
(``plan.type``/``plan.option_names``/``plan.descriptions``).
|
| 272 |
+
|
| 273 |
+
Ported quirks, kept intentionally rather than "fixed", because parity with
|
| 274 |
+
the runner's actual output is the point: only ``state`` gets a JSON dump
|
| 275 |
+
when non-string (``instructions`` and descriptions are interpolated with
|
| 276 |
+
plain ``str()``, exactly like the runner's f-strings), and a *falsy*
|
| 277 |
+
description (not just ``None``) is omitted, matching ``if description``
|
| 278 |
+
in the runner's ``format_prompt``.
|
| 279 |
+
"""
|
| 280 |
+
option_count = len(plan.option_names)
|
| 281 |
+
if tuple(labels) != tuple(_NATIVE_DISPLAY[:option_count]):
|
| 282 |
+
raise ValueError(
|
| 283 |
+
"native prompt wording requires canonical single-token A-Z labels "
|
| 284 |
+
"in order (at most 26 options); this backend's labels are "
|
| 285 |
+
f"{tuple(labels)!r}"
|
| 286 |
+
)
|
| 287 |
+
lines = []
|
| 288 |
+
for position, index in enumerate(order):
|
| 289 |
+
name = plan.option_names[index]
|
| 290 |
+
if plan.type == "noul":
|
| 291 |
+
name = "yes" if name == "true" else "no"
|
| 292 |
+
description = plan.descriptions[index]
|
| 293 |
+
line = f"{_NATIVE_DISPLAY[position]}. {name}"
|
| 294 |
+
if description:
|
| 295 |
+
line += f": {description}"
|
| 296 |
+
lines.append(line)
|
| 297 |
+
return (
|
| 298 |
+
f"{NATIVE_PROMPT_PREFIX}\n\n"
|
| 299 |
+
f"State:\n{render_native_state_text(state)}\n\n"
|
| 300 |
+
f"Question:\n{plan.instructions}\n\nOptions:\n" + "\n".join(lines)
|
| 301 |
+
)
|
| 302 |
+
|
| 303 |
+
|
| 304 |
+
def probabilities_from_logprobs(
|
| 305 |
+
logprobs: Sequence[float], temperature: float = 1.0
|
| 306 |
+
) -> list[float]:
|
| 307 |
+
"""Normalize selected vocabulary logprobs, equivalent to label-logit softmax.
|
| 308 |
+
|
| 309 |
+
Subtract the maximum *before* scaling to stay stable even with tiny positive
|
| 310 |
+
temperatures or very negative logprobs. Missing/nonfinite engine values are
|
| 311 |
+
errors, rather than fabricated probabilities.
|
| 312 |
+
"""
|
| 313 |
+
if (
|
| 314 |
+
isinstance(temperature, bool)
|
| 315 |
+
or not isinstance(temperature, Real)
|
| 316 |
+
or not math.isfinite(temperature)
|
| 317 |
+
or temperature <= 0
|
| 318 |
+
):
|
| 319 |
+
raise ValueError("temperature must be finite and greater than zero")
|
| 320 |
+
if len(logprobs) < 2:
|
| 321 |
+
raise ValueError("at least two label logprobs are required")
|
| 322 |
+
if any(
|
| 323 |
+
isinstance(value, bool)
|
| 324 |
+
or not isinstance(value, Real)
|
| 325 |
+
or not math.isfinite(value)
|
| 326 |
+
for value in logprobs
|
| 327 |
+
):
|
| 328 |
+
raise ValueError("every label must have a finite numeric logprob")
|
| 329 |
+
maximum = max(logprobs)
|
| 330 |
+
weights = [math.exp((value - maximum) / temperature) for value in logprobs]
|
| 331 |
+
total = math.fsum(weights)
|
| 332 |
+
return [weight / total for weight in weights]
|
| 333 |
+
|
| 334 |
+
|
| 335 |
+
def reduce_probabilities(
|
| 336 |
+
plan: QuestionPlan,
|
| 337 |
+
logprob_vectors: Sequence[Sequence[float]],
|
| 338 |
+
orders: Sequence[Sequence[int]],
|
| 339 |
+
options: SystemOneOptions,
|
| 340 |
+
) -> dict:
|
| 341 |
+
"""Scale, undo rotations, then average probabilities across evaluations.
|
| 342 |
+
|
| 343 |
+
Returned ``logprobs`` (when requested) is a list of canonical option maps,
|
| 344 |
+
one per evaluation. These are unmodified vocabulary-normalized logprobs,
|
| 345 |
+
not raw logits and not the final label distribution. Keeping each evaluation
|
| 346 |
+
separately permits fitting temperature before permutation averaging.
|
| 347 |
+
"""
|
| 348 |
+
if not logprob_vectors or len(logprob_vectors) != len(orders):
|
| 349 |
+
raise ValueError("each logprob vector must have a matching option order")
|
| 350 |
+
option_count = len(plan.option_names)
|
| 351 |
+
temperature = options.temperature if options.temperature_scaling else 1.0
|
| 352 |
+
columns: list[list[float]] = [[] for _ in range(option_count)]
|
| 353 |
+
raw_rows = []
|
| 354 |
+
for vector, order in zip(logprob_vectors, orders):
|
| 355 |
+
if len(vector) != option_count:
|
| 356 |
+
raise ValueError("engine must return one logprob for every label")
|
| 357 |
+
_validate_order(order, option_count)
|
| 358 |
+
probabilities = probabilities_from_logprobs(vector, temperature)
|
| 359 |
+
raw = {}
|
| 360 |
+
for position, original in enumerate(order):
|
| 361 |
+
columns[original].append(probabilities[position])
|
| 362 |
+
raw[plan.option_names[original]] = float(vector[position])
|
| 363 |
+
raw_rows.append({name: raw[name] for name in plan.option_names})
|
| 364 |
+
averaged = [math.fsum(column) / len(logprob_vectors) for column in columns]
|
| 365 |
+
# Account for floating-point summation drift before entropy and expectation.
|
| 366 |
+
total = math.fsum(averaged)
|
| 367 |
+
averaged = [probability / total for probability in averaged]
|
| 368 |
+
answer = {"type": plan.type}
|
| 369 |
+
if plan.type == "noul":
|
| 370 |
+
answer["noul"] = averaged[0]
|
| 371 |
+
else:
|
| 372 |
+
answer["probabilities"] = dict(zip(plan.option_names, averaged))
|
| 373 |
+
entropy = -math.fsum(p * math.log(p) for p in averaged if p > 0)
|
| 374 |
+
answer["confidence"] = min(
|
| 375 |
+
1.0, max(0.0, 1.0 - entropy / math.log(option_count))
|
| 376 |
+
)
|
| 377 |
+
if plan.type == "choice":
|
| 378 |
+
answer["choice"] = plan.option_names[
|
| 379 |
+
max(range(option_count), key=averaged.__getitem__)
|
| 380 |
+
]
|
| 381 |
+
else:
|
| 382 |
+
answer["score"] = math.fsum(index * p for index, p in enumerate(averaged))
|
| 383 |
+
answer["legend"] = dict(zip(plan.option_names, plan.descriptions))
|
| 384 |
+
if options.return_logprobs:
|
| 385 |
+
answer["logprobs"] = raw_rows
|
| 386 |
+
return answer
|
server/jev_adapter/server.py
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Standalone HTTP process; only the backend client talks to an inference server."""
|
| 2 |
+
|
| 3 |
+
import asyncio
|
| 4 |
+
import logging
|
| 5 |
+
import secrets
|
| 6 |
+
from contextlib import asynccontextmanager
|
| 7 |
+
|
| 8 |
+
from fastapi import Depends, FastAPI, Request
|
| 9 |
+
from fastapi.exceptions import RequestValidationError
|
| 10 |
+
from fastapi.responses import JSONResponse
|
| 11 |
+
|
| 12 |
+
from .backend import AdapterError, ScoringBackend
|
| 13 |
+
from .protocol import SystemOneRequest
|
| 14 |
+
from .service import SystemOneService
|
| 15 |
+
|
| 16 |
+
logger = logging.getLogger(__name__)
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
def create_app(
|
| 20 |
+
backend: ScoringBackend,
|
| 21 |
+
*,
|
| 22 |
+
api_key: str | None = None,
|
| 23 |
+
max_concurrency: int = 32,
|
| 24 |
+
alias: str = "jev-latest",
|
| 25 |
+
default_temperature: float = 1.0,
|
| 26 |
+
prompt_wording: str = "served",
|
| 27 |
+
) -> FastAPI:
|
| 28 |
+
service = SystemOneService(
|
| 29 |
+
backend,
|
| 30 |
+
max_concurrency=max_concurrency,
|
| 31 |
+
alias=alias,
|
| 32 |
+
default_temperature=default_temperature,
|
| 33 |
+
prompt_wording=prompt_wording,
|
| 34 |
+
)
|
| 35 |
+
|
| 36 |
+
@asynccontextmanager
|
| 37 |
+
async def lifespan(app):
|
| 38 |
+
try:
|
| 39 |
+
await backend.start()
|
| 40 |
+
yield
|
| 41 |
+
finally:
|
| 42 |
+
await backend.close()
|
| 43 |
+
|
| 44 |
+
app = FastAPI(title="Jev adapter", version="0.1.0", lifespan=lifespan)
|
| 45 |
+
|
| 46 |
+
async def authorize(request: Request):
|
| 47 |
+
if api_key and not secrets.compare_digest(
|
| 48 |
+
request.headers.get("authorization", "").encode("utf-8"),
|
| 49 |
+
f"Bearer {api_key}".encode(),
|
| 50 |
+
):
|
| 51 |
+
raise AdapterError(
|
| 52 |
+
"unauthorized", "A valid bearer token is required.", status=401
|
| 53 |
+
)
|
| 54 |
+
|
| 55 |
+
@app.exception_handler(AdapterError)
|
| 56 |
+
async def adapter_error(request, exc):
|
| 57 |
+
return JSONResponse(
|
| 58 |
+
status_code=exc.status,
|
| 59 |
+
content={
|
| 60 |
+
"error": {
|
| 61 |
+
"code": exc.code,
|
| 62 |
+
"message": str(exc),
|
| 63 |
+
"field": exc.field,
|
| 64 |
+
}
|
| 65 |
+
},
|
| 66 |
+
)
|
| 67 |
+
|
| 68 |
+
@app.exception_handler(RequestValidationError)
|
| 69 |
+
async def validation_error(request, exc):
|
| 70 |
+
error = exc.errors()[0]
|
| 71 |
+
return JSONResponse(
|
| 72 |
+
status_code=422,
|
| 73 |
+
content={
|
| 74 |
+
"error": {
|
| 75 |
+
"code": "invalid_request",
|
| 76 |
+
"message": error["msg"],
|
| 77 |
+
"field": ".".join(str(p) for p in error["loc"] if p != "body"),
|
| 78 |
+
}
|
| 79 |
+
},
|
| 80 |
+
)
|
| 81 |
+
|
| 82 |
+
@app.get("/health")
|
| 83 |
+
async def health():
|
| 84 |
+
# Process liveness, not an inference/GPU readiness probe.
|
| 85 |
+
return {"status": "ok"}
|
| 86 |
+
|
| 87 |
+
@app.get("/v1/models", dependencies=[Depends(authorize)])
|
| 88 |
+
async def models():
|
| 89 |
+
return {
|
| 90 |
+
"object": "list",
|
| 91 |
+
"data": [
|
| 92 |
+
{
|
| 93 |
+
"id": backend.model,
|
| 94 |
+
"object": "model",
|
| 95 |
+
"owned_by": "inference-engine",
|
| 96 |
+
},
|
| 97 |
+
],
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
@app.post("/v1/systemone", dependencies=[Depends(authorize)])
|
| 101 |
+
async def systemone(body: SystemOneRequest, request: Request):
|
| 102 |
+
work = asyncio.create_task(service.score(body))
|
| 103 |
+
stop_watching = False
|
| 104 |
+
|
| 105 |
+
async def disconnected():
|
| 106 |
+
while not stop_watching:
|
| 107 |
+
if await request.is_disconnected():
|
| 108 |
+
return
|
| 109 |
+
if not stop_watching:
|
| 110 |
+
await asyncio.sleep(0.05)
|
| 111 |
+
|
| 112 |
+
watcher = asyncio.create_task(disconnected())
|
| 113 |
+
try:
|
| 114 |
+
done, _ = await asyncio.wait(
|
| 115 |
+
(work, watcher),
|
| 116 |
+
return_when=asyncio.FIRST_COMPLETED,
|
| 117 |
+
)
|
| 118 |
+
if work in done:
|
| 119 |
+
return await work
|
| 120 |
+
raise AdapterError(
|
| 121 |
+
"client_disconnected", "Client disconnected.", status=499
|
| 122 |
+
)
|
| 123 |
+
except AdapterError:
|
| 124 |
+
raise
|
| 125 |
+
except Exception:
|
| 126 |
+
logger.exception("Decision scoring failed")
|
| 127 |
+
raise AdapterError(
|
| 128 |
+
"scoring_failed",
|
| 129 |
+
"Could not compute a complete decision.",
|
| 130 |
+
status=500,
|
| 131 |
+
) from None
|
| 132 |
+
finally:
|
| 133 |
+
# A disconnect probe's own cancellation scope can absorb cancel().
|
| 134 |
+
# Stop explicitly as well, including before another polling sleep.
|
| 135 |
+
stop_watching = True
|
| 136 |
+
work.cancel()
|
| 137 |
+
watcher.cancel()
|
| 138 |
+
await asyncio.gather(work, watcher, return_exceptions=True)
|
| 139 |
+
|
| 140 |
+
return app
|
server/jev_adapter/service.py
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Build questions and construct responses independently of the inference engine."""
|
| 2 |
+
|
| 3 |
+
import asyncio
|
| 4 |
+
import math
|
| 5 |
+
import time
|
| 6 |
+
from numbers import Real
|
| 7 |
+
|
| 8 |
+
from .backend import AdapterError, ScoringBackend
|
| 9 |
+
from .protocol import (
|
| 10 |
+
SystemOneRequest,
|
| 11 |
+
build_prompt,
|
| 12 |
+
plan_question,
|
| 13 |
+
reduce_probabilities,
|
| 14 |
+
rotation_order,
|
| 15 |
+
)
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
class SystemOneService:
|
| 19 |
+
def __init__(
|
| 20 |
+
self,
|
| 21 |
+
backend: ScoringBackend,
|
| 22 |
+
*,
|
| 23 |
+
max_concurrency: int = 32,
|
| 24 |
+
alias: str = "jev-latest",
|
| 25 |
+
default_temperature: float = 1.0,
|
| 26 |
+
prompt_wording: str = "served",
|
| 27 |
+
):
|
| 28 |
+
if max_concurrency < 1:
|
| 29 |
+
raise ValueError("max_concurrency must be positive")
|
| 30 |
+
if (
|
| 31 |
+
isinstance(default_temperature, bool)
|
| 32 |
+
or not isinstance(default_temperature, Real)
|
| 33 |
+
or not math.isfinite(default_temperature)
|
| 34 |
+
or default_temperature <= 0
|
| 35 |
+
):
|
| 36 |
+
raise ValueError("default_temperature must be finite and greater than zero")
|
| 37 |
+
if prompt_wording not in ("served", "native"):
|
| 38 |
+
raise ValueError('prompt_wording must be "served" or "native"')
|
| 39 |
+
self.backend, self.alias = backend, alias
|
| 40 |
+
# Applied only when a request omits options.temperature; an explicit
|
| 41 |
+
# request value always wins, and temperature_scaling=false still
|
| 42 |
+
# disables scaling. Without this setting the request default (1.0) holds.
|
| 43 |
+
self.default_temperature = float(default_temperature)
|
| 44 |
+
# Server-wide, not per-request: which text build_prompt() renders.
|
| 45 |
+
# "native" additionally requires the backend's labels to be canonical
|
| 46 |
+
# A-Z (build_prompt raises otherwise) and relies on the backend to
|
| 47 |
+
# prepend a matching system message where feasible (see sglang.py).
|
| 48 |
+
self.prompt_wording = prompt_wording
|
| 49 |
+
self.capacity = asyncio.Semaphore(max_concurrency)
|
| 50 |
+
|
| 51 |
+
def effective_options(self, request: SystemOneRequest):
|
| 52 |
+
"""Request options with the server default filled into an omitted temperature."""
|
| 53 |
+
options = request.options
|
| 54 |
+
if "temperature" in options.model_fields_set:
|
| 55 |
+
return options
|
| 56 |
+
return options.model_copy(update={"temperature": self.default_temperature})
|
| 57 |
+
|
| 58 |
+
async def score(self, request: SystemOneRequest) -> dict:
|
| 59 |
+
if request.model not in {self.backend.model, self.alias}:
|
| 60 |
+
raise AdapterError(
|
| 61 |
+
"model_not_found",
|
| 62 |
+
"Requested model is not configured.",
|
| 63 |
+
"model",
|
| 64 |
+
404,
|
| 65 |
+
)
|
| 66 |
+
started = time.perf_counter()
|
| 67 |
+
options = self.effective_options(request)
|
| 68 |
+
jobs, plans = [], {}
|
| 69 |
+
# Validate and prepare all questions before scheduling any inference.
|
| 70 |
+
for key, question in request.questions.items():
|
| 71 |
+
plan = plans[key] = plan_question(question)
|
| 72 |
+
labels, token_ids = self.backend.labels(len(plan.option_names))
|
| 73 |
+
for rotation in range(options.permutations):
|
| 74 |
+
order = rotation_order(len(labels), rotation)
|
| 75 |
+
prompt = build_prompt(
|
| 76 |
+
request.state, plan, labels, order, wording=self.prompt_wording
|
| 77 |
+
)
|
| 78 |
+
jobs.append((key, order, prompt, labels, token_ids))
|
| 79 |
+
|
| 80 |
+
async def evaluate(job):
|
| 81 |
+
key, order, prompt, labels, token_ids = job
|
| 82 |
+
async with self.capacity:
|
| 83 |
+
result = await self.backend.evaluate(
|
| 84 |
+
prompt,
|
| 85 |
+
request.images,
|
| 86 |
+
labels,
|
| 87 |
+
token_ids,
|
| 88 |
+
options.assistant_prefix,
|
| 89 |
+
)
|
| 90 |
+
return key, order, result
|
| 91 |
+
|
| 92 |
+
tasks = [asyncio.create_task(evaluate(job)) for job in jobs]
|
| 93 |
+
try:
|
| 94 |
+
results = await asyncio.gather(*tasks)
|
| 95 |
+
except BaseException:
|
| 96 |
+
for task in tasks:
|
| 97 |
+
task.cancel()
|
| 98 |
+
await asyncio.gather(*tasks, return_exceptions=True)
|
| 99 |
+
raise
|
| 100 |
+
grouped = {key: ([], []) for key in plans}
|
| 101 |
+
input_tokens = 0
|
| 102 |
+
for key, order, result in results:
|
| 103 |
+
vectors, orders = grouped[key]
|
| 104 |
+
vectors.append(result.logprobs)
|
| 105 |
+
orders.append(order)
|
| 106 |
+
input_tokens += result.input_tokens
|
| 107 |
+
return {
|
| 108 |
+
"model": self.backend.model,
|
| 109 |
+
"answers": {
|
| 110 |
+
key: reduce_probabilities(plan, *grouped[key], options)
|
| 111 |
+
for key, plan in plans.items()
|
| 112 |
+
},
|
| 113 |
+
"usage": {"input_tokens": input_tokens, "output_tokens": 0},
|
| 114 |
+
"metadata": {
|
| 115 |
+
"confidence_method": "1 - normalized_entropy",
|
| 116 |
+
"temperature": (
|
| 117 |
+
options.temperature if options.temperature_scaling else 1.0
|
| 118 |
+
),
|
| 119 |
+
"evaluations": len(jobs),
|
| 120 |
+
"adapter_elapsed_ms": (time.perf_counter() - started) * 1000,
|
| 121 |
+
},
|
| 122 |
+
}
|
server/jev_adapter/sglang.py
ADDED
|
@@ -0,0 +1,510 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Prefill-only scoring through stock SGLang HTTP APIs.
|
| 2 |
+
|
| 3 |
+
Chat tokenization uses the inference server by default. An optional native CPU
|
| 4 |
+
tokenizer preserves control-token IDs for engines with a lossy string chat API.
|
| 5 |
+
No SGLang, CUDA, or model weights are imported into this process.
|
| 6 |
+
"""
|
| 7 |
+
|
| 8 |
+
import asyncio
|
| 9 |
+
import math
|
| 10 |
+
import string
|
| 11 |
+
import uuid
|
| 12 |
+
from typing import Any
|
| 13 |
+
|
| 14 |
+
import httpx
|
| 15 |
+
|
| 16 |
+
from .backend import AdapterError, ScoringResult
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
def _label_candidates() -> list[str]:
|
| 20 |
+
letters = string.ascii_uppercase + string.ascii_lowercase + string.digits
|
| 21 |
+
return (
|
| 22 |
+
list(letters)
|
| 23 |
+
+ [f"{value:03d}" for value in range(1000)]
|
| 24 |
+
+ [
|
| 25 |
+
first + second
|
| 26 |
+
for alphabet in (string.ascii_uppercase, string.ascii_lowercase)
|
| 27 |
+
for first in alphabet
|
| 28 |
+
for second in alphabet
|
| 29 |
+
]
|
| 30 |
+
)
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
_IMAGE_MODEL_TYPES = {
|
| 34 |
+
"qwen2_vl",
|
| 35 |
+
"qwen2_5_vl",
|
| 36 |
+
"qwen3_vl",
|
| 37 |
+
"qwen3_vl_moe",
|
| 38 |
+
"qwen3_5",
|
| 39 |
+
"qwen3_5_moe",
|
| 40 |
+
"mistral3",
|
| 41 |
+
"pixtral",
|
| 42 |
+
}
|
| 43 |
+
_IMAGE_ARCHITECTURES = {
|
| 44 |
+
"Qwen2VLForConditionalGeneration",
|
| 45 |
+
"Qwen2_5_VLForConditionalGeneration",
|
| 46 |
+
"Qwen3VLForConditionalGeneration",
|
| 47 |
+
"Qwen3VLMoeForConditionalGeneration",
|
| 48 |
+
"Qwen3_5ForConditionalGeneration",
|
| 49 |
+
"Qwen3_5MoeForConditionalGeneration",
|
| 50 |
+
"Mistral3ForConditionalGeneration",
|
| 51 |
+
"PixtralForConditionalGeneration",
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
def _bad_response(message: str) -> AdapterError:
|
| 56 |
+
return AdapterError("invalid_engine_response", message, status=502)
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def _token_list(value: Any) -> bool:
|
| 60 |
+
return isinstance(value, list) and all(
|
| 61 |
+
type(token) is int and token >= 0 for token in value
|
| 62 |
+
)
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
class SGLangBackend:
|
| 66 |
+
def __init__(
|
| 67 |
+
self,
|
| 68 |
+
base_url: str,
|
| 69 |
+
model: str,
|
| 70 |
+
api_key: str | None = None,
|
| 71 |
+
timeout: float = 120,
|
| 72 |
+
max_connections: int = 32,
|
| 73 |
+
client: httpx.AsyncClient | None = None,
|
| 74 |
+
native_tokenizer: Any | None = None,
|
| 75 |
+
prompt_wording: str = "served",
|
| 76 |
+
native_system_prompt: str | None = None,
|
| 77 |
+
):
|
| 78 |
+
if not math.isfinite(timeout) or timeout <= 0 or max_connections < 1:
|
| 79 |
+
raise ValueError("timeout and max_connections must be positive")
|
| 80 |
+
if prompt_wording not in ("served", "native"):
|
| 81 |
+
raise ValueError('prompt_wording must be "served" or "native"')
|
| 82 |
+
url = httpx.URL(base_url)
|
| 83 |
+
if (
|
| 84 |
+
url.scheme not in ("http", "https")
|
| 85 |
+
or not url.host
|
| 86 |
+
or url.query
|
| 87 |
+
or url.fragment
|
| 88 |
+
):
|
| 89 |
+
raise ValueError(
|
| 90 |
+
"base_url must be an HTTP(S) origin or path without query or fragment"
|
| 91 |
+
)
|
| 92 |
+
self.base_url = base_url.rstrip("/")
|
| 93 |
+
self.model = model
|
| 94 |
+
self.timeout = timeout
|
| 95 |
+
self._headers = {"Authorization": f"Bearer {api_key}"} if api_key else {}
|
| 96 |
+
self._owns_client = client is None
|
| 97 |
+
self._client = client or httpx.AsyncClient(
|
| 98 |
+
limits=httpx.Limits(max_connections=max_connections),
|
| 99 |
+
timeout=timeout,
|
| 100 |
+
)
|
| 101 |
+
self._startup_lock = asyncio.Lock()
|
| 102 |
+
self._label_strings: tuple[str, ...] = ()
|
| 103 |
+
self._label_ids: tuple[int, ...] = ()
|
| 104 |
+
self._image_capable = False
|
| 105 |
+
self._image_format_supported = False
|
| 106 |
+
self._ready = False
|
| 107 |
+
self._native_tokenizer = native_tokenizer
|
| 108 |
+
self._prompt_wording = prompt_wording
|
| 109 |
+
# Only used when prompt_wording == "native": the runner's default
|
| 110 |
+
# system-prompt text, prepended explicitly as a system message (see
|
| 111 |
+
# native_tokenizer.extract_default_system_prompt/NativeTokenizer.prepare).
|
| 112 |
+
# None means "wording changed, but no system message is added" --
|
| 113 |
+
# either the wording is "served", or no such text was supplied/found.
|
| 114 |
+
self._native_system_prompt = native_system_prompt if prompt_wording == "native" else None
|
| 115 |
+
|
| 116 |
+
async def _request(
|
| 117 |
+
self, method: str, path: str, payload: dict | None = None
|
| 118 |
+
) -> dict:
|
| 119 |
+
try:
|
| 120 |
+
response = await self._client.request(
|
| 121 |
+
method,
|
| 122 |
+
self.base_url + path,
|
| 123 |
+
json=payload,
|
| 124 |
+
headers=self._headers,
|
| 125 |
+
timeout=self.timeout,
|
| 126 |
+
)
|
| 127 |
+
except httpx.TimeoutException as error:
|
| 128 |
+
raise AdapterError(
|
| 129 |
+
"engine_timeout", "The inference engine timed out.", status=504
|
| 130 |
+
) from error
|
| 131 |
+
except httpx.HTTPError as error:
|
| 132 |
+
raise AdapterError(
|
| 133 |
+
"engine_unavailable",
|
| 134 |
+
"Could not reach the inference engine.",
|
| 135 |
+
status=502,
|
| 136 |
+
) from error
|
| 137 |
+
if response.status_code == 404:
|
| 138 |
+
raise AdapterError(
|
| 139 |
+
"engine_endpoint_missing",
|
| 140 |
+
f"The inference engine does not provide {path}.",
|
| 141 |
+
status=502,
|
| 142 |
+
)
|
| 143 |
+
if response.status_code in (400, 422):
|
| 144 |
+
raise AdapterError(
|
| 145 |
+
"engine_rejected_request",
|
| 146 |
+
"The inference engine rejected the scoring input.",
|
| 147 |
+
status=422,
|
| 148 |
+
)
|
| 149 |
+
if not response.is_success:
|
| 150 |
+
raise AdapterError(
|
| 151 |
+
"engine_http_error",
|
| 152 |
+
f"The inference engine returned HTTP {response.status_code}.",
|
| 153 |
+
status=502,
|
| 154 |
+
)
|
| 155 |
+
try:
|
| 156 |
+
result = response.json()
|
| 157 |
+
except ValueError as error:
|
| 158 |
+
raise _bad_response(
|
| 159 |
+
"The inference engine returned invalid JSON."
|
| 160 |
+
) from error
|
| 161 |
+
if not isinstance(result, dict) or "error" in result:
|
| 162 |
+
raise _bad_response("The inference engine returned an unexpected response.")
|
| 163 |
+
return result
|
| 164 |
+
|
| 165 |
+
async def _information(self, path: str, legacy: str) -> dict:
|
| 166 |
+
try:
|
| 167 |
+
return await self._request("GET", path)
|
| 168 |
+
except AdapterError as error:
|
| 169 |
+
if error.code != "engine_endpoint_missing":
|
| 170 |
+
raise
|
| 171 |
+
return await self._request("GET", legacy)
|
| 172 |
+
|
| 173 |
+
async def start(self) -> None:
|
| 174 |
+
async with self._startup_lock:
|
| 175 |
+
if self._ready:
|
| 176 |
+
return
|
| 177 |
+
info = await self._information("/model_info", "/get_model_info")
|
| 178 |
+
if info.get("is_generation") is not True:
|
| 179 |
+
raise AdapterError(
|
| 180 |
+
"unsupported_model", "A generation model is required."
|
| 181 |
+
)
|
| 182 |
+
served = info.get("served_model_name")
|
| 183 |
+
if not isinstance(served, str) or not served:
|
| 184 |
+
raise _bad_response(
|
| 185 |
+
"The inference engine did not identify its served model."
|
| 186 |
+
)
|
| 187 |
+
if self.model not in (served, info.get("model_path")):
|
| 188 |
+
raise AdapterError(
|
| 189 |
+
"model_not_found",
|
| 190 |
+
"Configured model is not served by the inference engine.",
|
| 191 |
+
"model",
|
| 192 |
+
404,
|
| 193 |
+
)
|
| 194 |
+
config = await self._information("/server_info", "/get_server_info")
|
| 195 |
+
if config.get("skip_tokenizer_init"):
|
| 196 |
+
raise AdapterError(
|
| 197 |
+
"tokenizer_unavailable",
|
| 198 |
+
"The inference engine must initialize its tokenizer.",
|
| 199 |
+
)
|
| 200 |
+
if config.get("speculative_algorithm") is not None:
|
| 201 |
+
raise AdapterError(
|
| 202 |
+
"speculation_not_supported",
|
| 203 |
+
"Disable speculative decoding and MTP for prefill-only scoring.",
|
| 204 |
+
)
|
| 205 |
+
self.model = served
|
| 206 |
+
self._image_capable = info.get("has_image_understanding") is True
|
| 207 |
+
architectures = info.get("architectures") or []
|
| 208 |
+
self._image_format_supported = info.get(
|
| 209 |
+
"model_type"
|
| 210 |
+
) in _IMAGE_MODEL_TYPES or (
|
| 211 |
+
isinstance(architectures, list)
|
| 212 |
+
and any(
|
| 213 |
+
arch in _IMAGE_ARCHITECTURES
|
| 214 |
+
for arch in architectures
|
| 215 |
+
if isinstance(arch, str)
|
| 216 |
+
)
|
| 217 |
+
)
|
| 218 |
+
candidates = _label_candidates()
|
| 219 |
+
tokenized = await self._request(
|
| 220 |
+
"POST",
|
| 221 |
+
"/v1/tokenize",
|
| 222 |
+
{
|
| 223 |
+
"model": self.model,
|
| 224 |
+
"prompt": candidates,
|
| 225 |
+
"add_special_tokens": False,
|
| 226 |
+
},
|
| 227 |
+
)
|
| 228 |
+
batches = tokenized.get("tokens")
|
| 229 |
+
if (
|
| 230 |
+
not isinstance(batches, list)
|
| 231 |
+
or len(batches) != len(candidates)
|
| 232 |
+
or not all(_token_list(ids) for ids in batches)
|
| 233 |
+
):
|
| 234 |
+
raise _bad_response(
|
| 235 |
+
"The inference engine returned malformed label tokenization."
|
| 236 |
+
)
|
| 237 |
+
singles = [
|
| 238 |
+
(label, ids[0])
|
| 239 |
+
for label, ids in zip(candidates, batches)
|
| 240 |
+
if len(ids) == 1
|
| 241 |
+
]
|
| 242 |
+
if not singles:
|
| 243 |
+
raise AdapterError(
|
| 244 |
+
"labels_unavailable",
|
| 245 |
+
"The tokenizer has no usable single-token labels.",
|
| 246 |
+
)
|
| 247 |
+
decoded = await self._request(
|
| 248 |
+
"POST",
|
| 249 |
+
"/v1/detokenize",
|
| 250 |
+
{
|
| 251 |
+
"model": self.model,
|
| 252 |
+
"tokens": [[token] for _, token in singles],
|
| 253 |
+
"skip_special_tokens": True,
|
| 254 |
+
},
|
| 255 |
+
)
|
| 256 |
+
texts = decoded.get("text")
|
| 257 |
+
if (
|
| 258 |
+
not isinstance(texts, list)
|
| 259 |
+
or len(texts) != len(singles)
|
| 260 |
+
or not all(isinstance(item, str) for item in texts)
|
| 261 |
+
):
|
| 262 |
+
raise _bad_response(
|
| 263 |
+
"The inference engine returned malformed label detokenization."
|
| 264 |
+
)
|
| 265 |
+
valid: list[tuple[str, int]] = []
|
| 266 |
+
seen: set[int] = set()
|
| 267 |
+
for (label, token), decoded_label in zip(singles, texts):
|
| 268 |
+
if label == decoded_label and token not in seen:
|
| 269 |
+
valid.append((label, token))
|
| 270 |
+
seen.add(token)
|
| 271 |
+
if len(valid) == 255:
|
| 272 |
+
break
|
| 273 |
+
if len(valid) < 2:
|
| 274 |
+
raise AdapterError(
|
| 275 |
+
"labels_unavailable",
|
| 276 |
+
"At least two distinct, non-special single-token labels are required.",
|
| 277 |
+
)
|
| 278 |
+
self._label_strings, self._label_ids = tuple(zip(*valid))
|
| 279 |
+
self._ready = True
|
| 280 |
+
|
| 281 |
+
async def close(self) -> None:
|
| 282 |
+
if self._owns_client:
|
| 283 |
+
await self._client.aclose()
|
| 284 |
+
|
| 285 |
+
def labels(self, count: int) -> tuple[tuple[str, ...], tuple[int, ...]]:
|
| 286 |
+
if not self._ready:
|
| 287 |
+
raise AdapterError(
|
| 288 |
+
"engine_not_ready", "The scoring backend has not started.", status=503
|
| 289 |
+
)
|
| 290 |
+
if type(count) is not int or count < 2 or count > len(self._label_strings):
|
| 291 |
+
raise AdapterError(
|
| 292 |
+
"labels_unavailable",
|
| 293 |
+
f"This tokenizer supports 2 to {len(self._label_strings)} answer labels.",
|
| 294 |
+
"questions",
|
| 295 |
+
)
|
| 296 |
+
return self._label_strings[:count], self._label_ids[:count]
|
| 297 |
+
|
| 298 |
+
async def evaluate(
|
| 299 |
+
self,
|
| 300 |
+
prompt: str,
|
| 301 |
+
images: list[str],
|
| 302 |
+
labels: tuple[str, ...],
|
| 303 |
+
token_ids: tuple[int, ...],
|
| 304 |
+
assistant_prefix: str | None,
|
| 305 |
+
) -> ScoringResult:
|
| 306 |
+
if not self._ready:
|
| 307 |
+
raise AdapterError(
|
| 308 |
+
"engine_not_ready", "The scoring backend has not started.", status=503
|
| 309 |
+
)
|
| 310 |
+
if (
|
| 311 |
+
len(labels) < 2
|
| 312 |
+
or len(labels) != len(token_ids)
|
| 313 |
+
or len(set(token_ids)) != len(token_ids)
|
| 314 |
+
):
|
| 315 |
+
raise AdapterError(
|
| 316 |
+
"invalid_labels", "Distinct label/token pairs are required."
|
| 317 |
+
)
|
| 318 |
+
known = dict(zip(self._label_strings, self._label_ids))
|
| 319 |
+
if any(known.get(label) != token for label, token in zip(labels, token_ids)):
|
| 320 |
+
raise AdapterError(
|
| 321 |
+
"invalid_labels", "Labels must come from this backend's tokenizer."
|
| 322 |
+
)
|
| 323 |
+
if images and self._native_tokenizer is not None:
|
| 324 |
+
raise AdapterError(
|
| 325 |
+
"native_images_not_supported",
|
| 326 |
+
"Native tokenizer scoring currently accepts text only.",
|
| 327 |
+
"images",
|
| 328 |
+
)
|
| 329 |
+
if images and not self._image_capable:
|
| 330 |
+
raise AdapterError(
|
| 331 |
+
"images_not_supported",
|
| 332 |
+
"The loaded model does not support images.",
|
| 333 |
+
"images",
|
| 334 |
+
)
|
| 335 |
+
if images and not self._image_format_supported:
|
| 336 |
+
raise AdapterError(
|
| 337 |
+
"image_model_not_supported",
|
| 338 |
+
"Image scoring currently supports Qwen VL/Qwen3.5 and Mistral3/Pixtral chat formats.",
|
| 339 |
+
"images",
|
| 340 |
+
)
|
| 341 |
+
if self._native_tokenizer is not None:
|
| 342 |
+
final_ids = await asyncio.to_thread(
|
| 343 |
+
self._native_tokenizer.prepare,
|
| 344 |
+
prompt,
|
| 345 |
+
labels,
|
| 346 |
+
token_ids,
|
| 347 |
+
assistant_prefix,
|
| 348 |
+
self._native_system_prompt,
|
| 349 |
+
)
|
| 350 |
+
if not _token_list(final_ids) or not final_ids:
|
| 351 |
+
raise _bad_response("The native tokenizer returned invalid prompt IDs.")
|
| 352 |
+
final_text = None
|
| 353 |
+
else:
|
| 354 |
+
final_ids, final_text = await self._prepare_http(
|
| 355 |
+
prompt,
|
| 356 |
+
images,
|
| 357 |
+
labels,
|
| 358 |
+
token_ids,
|
| 359 |
+
assistant_prefix,
|
| 360 |
+
self._native_system_prompt,
|
| 361 |
+
)
|
| 362 |
+
payload = {
|
| 363 |
+
"sampling_params": {
|
| 364 |
+
"max_new_tokens": 0,
|
| 365 |
+
"temperature": 1,
|
| 366 |
+
"top_p": 1,
|
| 367 |
+
"top_k": -1,
|
| 368 |
+
},
|
| 369 |
+
"return_logprob": True,
|
| 370 |
+
"logprob_start_len": -1,
|
| 371 |
+
"token_ids_logprob": list(token_ids),
|
| 372 |
+
"top_logprobs_num": 0,
|
| 373 |
+
"return_text_in_logprobs": False,
|
| 374 |
+
"stream": False,
|
| 375 |
+
"rid": "jev-" + uuid.uuid4().hex,
|
| 376 |
+
}
|
| 377 |
+
if images:
|
| 378 |
+
payload.update(text=final_text, image_data=images)
|
| 379 |
+
else:
|
| 380 |
+
payload["input_ids"] = final_ids
|
| 381 |
+
result = await self._request("POST", "/generate", payload)
|
| 382 |
+
meta = result.get("meta_info")
|
| 383 |
+
if not isinstance(meta, dict):
|
| 384 |
+
raise _bad_response("The inference engine omitted scoring metadata.")
|
| 385 |
+
if (
|
| 386 |
+
type(meta.get("completion_tokens")) is not int
|
| 387 |
+
or meta["completion_tokens"] != 0
|
| 388 |
+
):
|
| 389 |
+
raise _bad_response(
|
| 390 |
+
"The inference engine did not honor zero-output scoring."
|
| 391 |
+
)
|
| 392 |
+
input_tokens = meta.get("prompt_tokens")
|
| 393 |
+
if type(input_tokens) is not int or input_tokens < 1:
|
| 394 |
+
raise _bad_response(
|
| 395 |
+
"The inference engine returned invalid input-token usage."
|
| 396 |
+
)
|
| 397 |
+
positions = meta.get("output_token_ids_logprobs")
|
| 398 |
+
if (
|
| 399 |
+
not isinstance(positions, list)
|
| 400 |
+
or len(positions) != 1
|
| 401 |
+
or not isinstance(positions[0], list)
|
| 402 |
+
):
|
| 403 |
+
raise _bad_response(
|
| 404 |
+
"The inference engine omitted the requested next-token logprobs."
|
| 405 |
+
)
|
| 406 |
+
values: dict[int, float] = {}
|
| 407 |
+
for entry in positions[0]:
|
| 408 |
+
if not isinstance(entry, (list, tuple)) or len(entry) < 2:
|
| 409 |
+
raise _bad_response("The inference engine returned malformed logprobs.")
|
| 410 |
+
value, token = entry[:2]
|
| 411 |
+
if (
|
| 412 |
+
type(token) is not int
|
| 413 |
+
or type(value) not in (int, float)
|
| 414 |
+
or not math.isfinite(value)
|
| 415 |
+
or value > 0
|
| 416 |
+
or token in values
|
| 417 |
+
):
|
| 418 |
+
raise _bad_response("The inference engine returned invalid logprobs.")
|
| 419 |
+
values[token] = float(value)
|
| 420 |
+
if set(values) != set(token_ids):
|
| 421 |
+
raise _bad_response(
|
| 422 |
+
"The inference engine did not return every requested label logprob."
|
| 423 |
+
)
|
| 424 |
+
return ScoringResult(tuple(values[token] for token in token_ids), input_tokens)
|
| 425 |
+
|
| 426 |
+
async def _prepare_http(
|
| 427 |
+
self,
|
| 428 |
+
prompt: str,
|
| 429 |
+
images: list[str],
|
| 430 |
+
labels: tuple[str, ...],
|
| 431 |
+
token_ids: tuple[int, ...],
|
| 432 |
+
assistant_prefix: str | None,
|
| 433 |
+
system_prompt: str | None = None,
|
| 434 |
+
) -> tuple[list[int], str]:
|
| 435 |
+
content: Any = prompt
|
| 436 |
+
if images:
|
| 437 |
+
content = [
|
| 438 |
+
{"type": "image_url", "image_url": {"url": image}} for image in images
|
| 439 |
+
]
|
| 440 |
+
content.append({"type": "text", "text": prompt})
|
| 441 |
+
messages = (
|
| 442 |
+
[{"role": "system", "content": system_prompt}] if system_prompt else []
|
| 443 |
+
) + [{"role": "user", "content": content}]
|
| 444 |
+
rendered = await self._request(
|
| 445 |
+
"POST",
|
| 446 |
+
"/v1/tokenize",
|
| 447 |
+
{
|
| 448 |
+
"model": self.model,
|
| 449 |
+
"messages": messages,
|
| 450 |
+
"chat_template_kwargs": {"enable_thinking": False},
|
| 451 |
+
},
|
| 452 |
+
)
|
| 453 |
+
prompt_ids = rendered.get("tokens")
|
| 454 |
+
if not _token_list(prompt_ids) or not prompt_ids:
|
| 455 |
+
raise _bad_response(
|
| 456 |
+
"The inference engine returned malformed chat tokenization."
|
| 457 |
+
)
|
| 458 |
+
decoded = await self._request(
|
| 459 |
+
"POST",
|
| 460 |
+
"/v1/detokenize",
|
| 461 |
+
{
|
| 462 |
+
"model": self.model,
|
| 463 |
+
"tokens": prompt_ids,
|
| 464 |
+
"skip_special_tokens": False,
|
| 465 |
+
},
|
| 466 |
+
)
|
| 467 |
+
rendered_text = decoded.get("text")
|
| 468 |
+
if not isinstance(rendered_text, str) or not rendered_text:
|
| 469 |
+
raise _bad_response(
|
| 470 |
+
"The inference engine returned malformed chat detokenization."
|
| 471 |
+
)
|
| 472 |
+
final_text = rendered_text + (assistant_prefix or "")
|
| 473 |
+
# Check the complete template roundtrip and the actual assistant boundary.
|
| 474 |
+
# Checking labels in isolation can score the wrong tokens for BPE tokenizers.
|
| 475 |
+
prompts = [rendered_text, final_text] + [final_text + label for label in labels]
|
| 476 |
+
checked = await self._request(
|
| 477 |
+
"POST",
|
| 478 |
+
"/v1/tokenize",
|
| 479 |
+
{
|
| 480 |
+
"model": self.model,
|
| 481 |
+
"prompt": prompts,
|
| 482 |
+
"add_special_tokens": False,
|
| 483 |
+
},
|
| 484 |
+
)
|
| 485 |
+
variants = checked.get("tokens")
|
| 486 |
+
if (
|
| 487 |
+
not isinstance(variants, list)
|
| 488 |
+
or len(variants) != len(prompts)
|
| 489 |
+
or not all(_token_list(ids) for ids in variants)
|
| 490 |
+
):
|
| 491 |
+
raise _bad_response(
|
| 492 |
+
"The inference engine returned malformed boundary tokenization."
|
| 493 |
+
)
|
| 494 |
+
if variants[0] != prompt_ids:
|
| 495 |
+
raise AdapterError(
|
| 496 |
+
"unsupported_tokenizer_roundtrip",
|
| 497 |
+
"The rendered chat prompt cannot be losslessly tokenized through this HTTP adapter.",
|
| 498 |
+
)
|
| 499 |
+
final_ids = variants[1]
|
| 500 |
+
if not final_ids:
|
| 501 |
+
raise _bad_response("The formatted scoring prompt is empty.")
|
| 502 |
+
if any(
|
| 503 |
+
ids != final_ids + [token] for ids, token in zip(variants[2:], token_ids)
|
| 504 |
+
):
|
| 505 |
+
raise AdapterError(
|
| 506 |
+
"invalid_label_boundary",
|
| 507 |
+
"Labels are not single tokens at the assistant boundary; configure a compatible assistant_prefix.",
|
| 508 |
+
"options.assistant_prefix",
|
| 509 |
+
)
|
| 510 |
+
return final_ids, final_text
|
server/pyproject.toml
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[build-system]
|
| 2 |
+
requires = ["setuptools>=68"]
|
| 3 |
+
build-backend = "setuptools.build_meta"
|
| 4 |
+
|
| 5 |
+
[project]
|
| 6 |
+
name = "jev-adapter"
|
| 7 |
+
version = "0.1.0"
|
| 8 |
+
description = "Independent next-token decision API over an unmodified inference server"
|
| 9 |
+
readme = "README.md"
|
| 10 |
+
requires-python = ">=3.11"
|
| 11 |
+
license = {file = "LICENSE"}
|
| 12 |
+
dependencies = [
|
| 13 |
+
"fastapi>=0.115,<1",
|
| 14 |
+
"httpx>=0.27,<1",
|
| 15 |
+
"pydantic>=2.10,<3",
|
| 16 |
+
"uvicorn>=0.30,<1",
|
| 17 |
+
]
|
| 18 |
+
|
| 19 |
+
[project.optional-dependencies]
|
| 20 |
+
dev = ["pytest>=8,<10", "pytest-asyncio>=0.24,<2", "ruff>=0.12"]
|
| 21 |
+
native-tokenizer = ["transformers==5.12.1", "mistral-common==1.11.7"]
|
| 22 |
+
|
| 23 |
+
[project.scripts]
|
| 24 |
+
jev-adapter = "jev_adapter.__main__:main"
|
| 25 |
+
|
| 26 |
+
[tool.setuptools.packages.find]
|
| 27 |
+
include = ["jev_adapter*"]
|
| 28 |
+
|
| 29 |
+
[tool.pytest.ini_options]
|
| 30 |
+
testpaths = ["tests"]
|
| 31 |
+
|
| 32 |
+
[tool.ruff]
|
| 33 |
+
target-version = "py311"
|
| 34 |
+
line-length = 88
|
server/tests/test_benchmark_matrix.py
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import importlib.util
|
| 2 |
+
import os
|
| 3 |
+
import select
|
| 4 |
+
import signal
|
| 5 |
+
import subprocess
|
| 6 |
+
import sys
|
| 7 |
+
from concurrent.futures import ThreadPoolExecutor
|
| 8 |
+
from pathlib import Path
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
def test_matrix_preview_uses_four_bf16_models_without_starting(tmp_path):
|
| 12 |
+
root = Path(__file__).resolve().parents[1]
|
| 13 |
+
output = tmp_path / "does-not-exist"
|
| 14 |
+
engine_python = tmp_path / "engine-venv-python"
|
| 15 |
+
engine_python.symlink_to(sys.executable)
|
| 16 |
+
result = subprocess.run(
|
| 17 |
+
[
|
| 18 |
+
sys.executable,
|
| 19 |
+
str(root / "benchmarks/run_matrix.py"),
|
| 20 |
+
"--output",
|
| 21 |
+
str(output),
|
| 22 |
+
"--include-external",
|
| 23 |
+
"--concurrency",
|
| 24 |
+
"8",
|
| 25 |
+
"--engine-python",
|
| 26 |
+
str(engine_python),
|
| 27 |
+
],
|
| 28 |
+
capture_output=True,
|
| 29 |
+
text=True,
|
| 30 |
+
check=True,
|
| 31 |
+
)
|
| 32 |
+
assert "Preview only" in result.stdout
|
| 33 |
+
assert "ministral3-3b-bf16" in result.stdout
|
| 34 |
+
assert "ministral3-3b-fp8" not in result.stdout
|
| 35 |
+
assert "qwen36-27b-bf16" in result.stdout
|
| 36 |
+
assert "qwen36-35b-a3b-bf16" in result.stdout
|
| 37 |
+
assert "qwen35-4b-bf16" in result.stdout
|
| 38 |
+
assert "scienthoon-v1" in result.stdout
|
| 39 |
+
assert "jevbench-hard/public.jsonl" in result.stdout
|
| 40 |
+
assert "--probe-vision" not in result.stdout
|
| 41 |
+
assert f"--engine-python {engine_python}" in result.stdout
|
| 42 |
+
assert not output.exists()
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def test_stop_owned_cleans_runtime_that_inherits_ignored_sigint(tmp_path):
|
| 46 |
+
root = Path(__file__).resolve().parents[1]
|
| 47 |
+
spec = importlib.util.spec_from_file_location(
|
| 48 |
+
"benchmark_matrix_under_test", root / "benchmarks/run_matrix.py"
|
| 49 |
+
)
|
| 50 |
+
matrix = importlib.util.module_from_spec(spec)
|
| 51 |
+
spec.loader.exec_module(matrix)
|
| 52 |
+
cleanup_marker = tmp_path / "runtime-cleaned-up"
|
| 53 |
+
child_code = """
|
| 54 |
+
import signal
|
| 55 |
+
import sys
|
| 56 |
+
from pathlib import Path
|
| 57 |
+
|
| 58 |
+
# A background launcher can inherit this disposition from its parent shell.
|
| 59 |
+
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
| 60 |
+
|
| 61 |
+
def terminate(signum, frame):
|
| 62 |
+
raise KeyboardInterrupt
|
| 63 |
+
|
| 64 |
+
signal.signal(signal.SIGTERM, terminate)
|
| 65 |
+
try:
|
| 66 |
+
print("ready", flush=True)
|
| 67 |
+
while True:
|
| 68 |
+
signal.pause()
|
| 69 |
+
except KeyboardInterrupt:
|
| 70 |
+
pass
|
| 71 |
+
finally:
|
| 72 |
+
Path(sys.argv[1]).write_text("graceful SIGTERM cleanup")
|
| 73 |
+
"""
|
| 74 |
+
process = subprocess.Popen(
|
| 75 |
+
[sys.executable, "-c", child_code, str(cleanup_marker)],
|
| 76 |
+
start_new_session=True,
|
| 77 |
+
stdout=subprocess.PIPE,
|
| 78 |
+
stderr=subprocess.PIPE,
|
| 79 |
+
text=True,
|
| 80 |
+
)
|
| 81 |
+
try:
|
| 82 |
+
readable, _, _ = select.select([process.stdout], [], [], 5)
|
| 83 |
+
assert readable, "child did not install its signal handlers"
|
| 84 |
+
assert process.stdout.readline().strip() == "ready"
|
| 85 |
+
# Bound regressions without replacing real OS signal delivery or wait().
|
| 86 |
+
with ThreadPoolExecutor(max_workers=1) as executor:
|
| 87 |
+
stopped = executor.submit(matrix.stop_owned, process)
|
| 88 |
+
try:
|
| 89 |
+
stopped.result(timeout=5)
|
| 90 |
+
finally:
|
| 91 |
+
if process.poll() is None:
|
| 92 |
+
os.killpg(process.pid, signal.SIGKILL)
|
| 93 |
+
process.wait(timeout=5)
|
| 94 |
+
assert process.returncode == 0
|
| 95 |
+
assert cleanup_marker.read_text() == "graceful SIGTERM cleanup"
|
| 96 |
+
finally:
|
| 97 |
+
if process.poll() is None:
|
| 98 |
+
os.killpg(process.pid, signal.SIGKILL)
|
| 99 |
+
process.wait(timeout=5)
|
| 100 |
+
process.stdout.close()
|
| 101 |
+
process.stderr.close()
|
server/tests/test_benchmark_run.py
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import argparse
|
| 2 |
+
import hashlib
|
| 3 |
+
import json
|
| 4 |
+
|
| 5 |
+
import httpx
|
| 6 |
+
import pytest
|
| 7 |
+
|
| 8 |
+
from jev_adapter.benchmarks.compare import collect
|
| 9 |
+
from jev_adapter.benchmarks.data import normalize_record
|
| 10 |
+
from jev_adapter.benchmarks.metrics import metrics, prediction_rows, summarize
|
| 11 |
+
from jev_adapter.benchmarks.run import evaluate, load_data, validate_launch
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def item(record_id="one", variant="clean", source="policy"):
|
| 15 |
+
return normalize_record(
|
| 16 |
+
{
|
| 17 |
+
"state": "The transaction is refundable.",
|
| 18 |
+
"questions": {
|
| 19 |
+
"route": {
|
| 20 |
+
"type": "choice",
|
| 21 |
+
"instructions": "Choose a team.",
|
| 22 |
+
"criteria": {"billing": None, "support": "Technical support"},
|
| 23 |
+
"label": "billing",
|
| 24 |
+
"src": "route",
|
| 25 |
+
},
|
| 26 |
+
"refund": {
|
| 27 |
+
"type": "noul",
|
| 28 |
+
"instructions": "Refundable?",
|
| 29 |
+
"label": True,
|
| 30 |
+
"src": "refund",
|
| 31 |
+
},
|
| 32 |
+
"priority": {
|
| 33 |
+
"type": "score",
|
| 34 |
+
"instructions": "How urgent?",
|
| 35 |
+
"criteria": ["low", "mid", "high"],
|
| 36 |
+
"label": 2,
|
| 37 |
+
"src": "priority",
|
| 38 |
+
},
|
| 39 |
+
},
|
| 40 |
+
"_meta": {
|
| 41 |
+
"id": record_id,
|
| 42 |
+
"source": source,
|
| 43 |
+
"variant": variant,
|
| 44 |
+
"group_id": record_id,
|
| 45 |
+
},
|
| 46 |
+
},
|
| 47 |
+
"fixture",
|
| 48 |
+
"development",
|
| 49 |
+
)
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
def response():
|
| 53 |
+
return {
|
| 54 |
+
"model": "decision-model",
|
| 55 |
+
"answers": {
|
| 56 |
+
"route": {
|
| 57 |
+
"type": "choice",
|
| 58 |
+
"probabilities": {"billing": 0.8, "support": 0.2},
|
| 59 |
+
},
|
| 60 |
+
"refund": {"type": "noul", "noul": 0.9},
|
| 61 |
+
"priority": {
|
| 62 |
+
"type": "score",
|
| 63 |
+
"probabilities": {"0": 0.1, "1": 0.2, "2": 0.7},
|
| 64 |
+
},
|
| 65 |
+
},
|
| 66 |
+
"usage": {"input_tokens": 100, "output_tokens": 0},
|
| 67 |
+
"metadata": {"adapter_elapsed_ms": 2.0, "evaluations": 3},
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
def test_metrics_boolean_order_score_and_calibration():
|
| 72 |
+
rows = prediction_rows(item(), response())
|
| 73 |
+
assert rows[1]["keys"] == ["false", "true"]
|
| 74 |
+
assert rows[1]["p"] == pytest.approx([0.1, 0.9])
|
| 75 |
+
result = metrics(rows)
|
| 76 |
+
assert result["n"] == 3
|
| 77 |
+
assert result["acc"] == 1
|
| 78 |
+
assert result["ece"] == pytest.approx(0.2)
|
| 79 |
+
assert result["brier"] == pytest.approx((0.08 + 0.02 + 0.14) / 3)
|
| 80 |
+
assert result["score_mae"] == pytest.approx(0.4)
|
| 81 |
+
assert result["ranked_probability_score"] == pytest.approx(0.05)
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
def test_jevbench_probability_reference_and_native_tie_break():
|
| 85 |
+
example = item()
|
| 86 |
+
example["metadata"]["gold_policy"] = {"argmax_tie_break": "lexicographic_label"}
|
| 87 |
+
example["expected"]["route"].update(
|
| 88 |
+
labels=["support", "billing"],
|
| 89 |
+
label=1,
|
| 90 |
+
target=[0, 1],
|
| 91 |
+
reference_probs=[0.5, 0.5],
|
| 92 |
+
)
|
| 93 |
+
body = response()
|
| 94 |
+
body["answers"]["route"]["probabilities"] = {"support": 0.5, "billing": 0.5}
|
| 95 |
+
rows = prediction_rows(example, body)
|
| 96 |
+
assert metrics(rows)["acc"] == 1
|
| 97 |
+
report = summarize(rows)
|
| 98 |
+
assert report["reference_distribution"]["n"] == 1
|
| 99 |
+
assert report["reference_distribution"]["squared_l2"] == 0
|
| 100 |
+
assert report["reference_distribution"]["total_variation"] == 0
|
| 101 |
+
assert report["reference_distribution"]["kl_reference_to_model"] == 0
|
| 102 |
+
|
| 103 |
+
|
| 104 |
+
def test_unknown_excluded_and_permutation_aligned():
|
| 105 |
+
original = item()
|
| 106 |
+
permuted = item("two", "permuted")
|
| 107 |
+
permuted["metadata"]["group_id"] = "one"
|
| 108 |
+
permuted["expected"]["route"].update(
|
| 109 |
+
labels=["support", "billing"], label=1, target=[0, 1]
|
| 110 |
+
)
|
| 111 |
+
unknown = item("three", source="unknowable")
|
| 112 |
+
rows = [
|
| 113 |
+
row
|
| 114 |
+
for i in [original, permuted, unknown]
|
| 115 |
+
for row in prediction_rows(i, response())
|
| 116 |
+
]
|
| 117 |
+
report = summarize(rows)
|
| 118 |
+
assert report["clean"]["n"] == 3
|
| 119 |
+
assert report["unknowable"]["n"] == 3
|
| 120 |
+
assert report["permutation"]["n"] == 1
|
| 121 |
+
assert report["permutation"]["flip_rate"] == 0
|
| 122 |
+
assert "unknowable" not in report["sources"]
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
@pytest.mark.parametrize("change", ["missing", "nan", "output", "type"])
|
| 126 |
+
def test_invalid_predictions_rejected(change):
|
| 127 |
+
body = response()
|
| 128 |
+
if change == "missing":
|
| 129 |
+
del body["answers"]["route"]["probabilities"]["support"]
|
| 130 |
+
elif change == "nan":
|
| 131 |
+
body["answers"]["refund"]["noul"] = float("nan")
|
| 132 |
+
elif change == "type":
|
| 133 |
+
body["answers"]["refund"]["type"] = "choice"
|
| 134 |
+
else:
|
| 135 |
+
body["answers"]["route"]["probabilities"] = {"billing": 0.9, "support": 0.9}
|
| 136 |
+
with pytest.raises(ValueError):
|
| 137 |
+
prediction_rows(item(), body)
|
| 138 |
+
|
| 139 |
+
|
| 140 |
+
def arguments(tmp_path, records=None):
|
| 141 |
+
data = tmp_path / "data.jsonl"
|
| 142 |
+
records = records or [item(), item("two")]
|
| 143 |
+
data.write_text("".join(json.dumps(i) + "\n" for i in records))
|
| 144 |
+
return argparse.Namespace(
|
| 145 |
+
data=[data],
|
| 146 |
+
model="decision-model",
|
| 147 |
+
allow_test=False,
|
| 148 |
+
limit=None,
|
| 149 |
+
output=tmp_path / "result",
|
| 150 |
+
concurrency=2,
|
| 151 |
+
repeats=2,
|
| 152 |
+
warmup=2,
|
| 153 |
+
seed=42,
|
| 154 |
+
cache_mode="full-prefill",
|
| 155 |
+
timeout=10,
|
| 156 |
+
engine_url="http://engine",
|
| 157 |
+
base_url="http://adapter",
|
| 158 |
+
engine_manifest=None,
|
| 159 |
+
assistant_prefix=None,
|
| 160 |
+
)
|
| 161 |
+
|
| 162 |
+
|
| 163 |
+
@pytest.mark.asyncio
|
| 164 |
+
async def test_runner_outputs_and_excludes_warmup_repeat_quality(tmp_path):
|
| 165 |
+
args = arguments(tmp_path)
|
| 166 |
+
seen = []
|
| 167 |
+
|
| 168 |
+
def transport(request):
|
| 169 |
+
if request.url.path == "/model_info":
|
| 170 |
+
return httpx.Response(200, json={"served_model_name": "decision-model"})
|
| 171 |
+
if request.url.path == "/server_info":
|
| 172 |
+
return httpx.Response(
|
| 173 |
+
200,
|
| 174 |
+
json={
|
| 175 |
+
"disable_radix_cache": True,
|
| 176 |
+
"mm_preprocess_cache_size_mb": 0,
|
| 177 |
+
"api_key": "secret",
|
| 178 |
+
},
|
| 179 |
+
)
|
| 180 |
+
payload = json.loads(request.content)
|
| 181 |
+
seen.append(payload)
|
| 182 |
+
assert "expected" not in payload and "metadata" not in payload
|
| 183 |
+
assert all(
|
| 184 |
+
"label" not in q and "src" not in q for q in payload["questions"].values()
|
| 185 |
+
)
|
| 186 |
+
return httpx.Response(200, json=response())
|
| 187 |
+
|
| 188 |
+
async with httpx.AsyncClient(transport=httpx.MockTransport(transport)) as client:
|
| 189 |
+
result = await evaluate(args, client)
|
| 190 |
+
assert len(seen) == 6
|
| 191 |
+
assert result["status"] == "complete"
|
| 192 |
+
assert result["successful_requests"] == 4
|
| 193 |
+
assert result["suites"]["fixture/development"]["clean"]["n"] == 6
|
| 194 |
+
assert result["latency_ms"]["n"] == 4
|
| 195 |
+
assert "secret" not in (args.output / "manifest.json").read_text()
|
| 196 |
+
assert len((args.output / "predictions.jsonl").read_text().splitlines()) == 4
|
| 197 |
+
comparison = collect(args.output)
|
| 198 |
+
assert len(comparison) == 1 and comparison[0]["clean_questions"] == 6
|
| 199 |
+
assert comparison[0]["partial_dataset"] is True
|
| 200 |
+
with pytest.raises(FileExistsError):
|
| 201 |
+
await evaluate(args)
|
| 202 |
+
(args.output / "invalidated.json").write_text(
|
| 203 |
+
json.dumps({"reason": "Tokenization failed an independent canonical check"})
|
| 204 |
+
)
|
| 205 |
+
assert collect(args.output) == []
|
| 206 |
+
|
| 207 |
+
|
| 208 |
+
@pytest.mark.asyncio
|
| 209 |
+
async def test_runner_errors_do_not_produce_headline_or_retry(tmp_path):
|
| 210 |
+
args = arguments(tmp_path)
|
| 211 |
+
args.warmup = 0
|
| 212 |
+
calls = 0
|
| 213 |
+
|
| 214 |
+
def transport(request):
|
| 215 |
+
nonlocal calls
|
| 216 |
+
if request.url.path == "/model_info":
|
| 217 |
+
return httpx.Response(200, json={"served_model_name": "decision-model"})
|
| 218 |
+
if request.url.path == "/server_info":
|
| 219 |
+
return httpx.Response(
|
| 220 |
+
200,
|
| 221 |
+
json={"disable_radix_cache": True, "mm_preprocess_cache_size_mb": 0},
|
| 222 |
+
)
|
| 223 |
+
calls += 1
|
| 224 |
+
body = response()
|
| 225 |
+
body["usage"]["output_tokens"] = 1
|
| 226 |
+
return httpx.Response(200, json=body)
|
| 227 |
+
|
| 228 |
+
async with httpx.AsyncClient(transport=httpx.MockTransport(transport)) as client:
|
| 229 |
+
result = await evaluate(args, client)
|
| 230 |
+
assert result["status"] == "failed"
|
| 231 |
+
assert result["suites"] == {}
|
| 232 |
+
assert result["errors"] == 4 and calls == 4
|
| 233 |
+
assert (args.output / "failures.json").exists()
|
| 234 |
+
assert collect(args.output) == []
|
| 235 |
+
|
| 236 |
+
|
| 237 |
+
def test_locked_split_and_data_integrity(tmp_path):
|
| 238 |
+
locked = item()
|
| 239 |
+
locked["split"] = "test"
|
| 240 |
+
args = arguments(tmp_path, [locked])
|
| 241 |
+
with pytest.raises(ValueError, match="allow-test"):
|
| 242 |
+
load_data(args.data, args.model)
|
| 243 |
+
assert len(load_data(args.data, args.model, allow_test=True)[0]) == 1
|
| 244 |
+
args.data[0].with_suffix(".manifest.json").write_text(
|
| 245 |
+
json.dumps({"data_sha256": "bad"})
|
| 246 |
+
)
|
| 247 |
+
with pytest.raises(ValueError, match="checksum"):
|
| 248 |
+
load_data(args.data, args.model, allow_test=True)
|
| 249 |
+
|
| 250 |
+
|
| 251 |
+
def test_prepared_subset_metadata_is_retained(tmp_path):
|
| 252 |
+
args = arguments(tmp_path)
|
| 253 |
+
raw = args.data[0].read_bytes()
|
| 254 |
+
args.data[0].with_suffix(".manifest.json").write_text(
|
| 255 |
+
json.dumps(
|
| 256 |
+
{
|
| 257 |
+
"data_sha256": hashlib.sha256(raw).hexdigest(),
|
| 258 |
+
"selected": {"records": 2},
|
| 259 |
+
"selection": {"is_full_partition": False},
|
| 260 |
+
}
|
| 261 |
+
)
|
| 262 |
+
)
|
| 263 |
+
_, sources = load_data(args.data, args.model)
|
| 264 |
+
assert sources[0]["prepared_manifest"]["selection"]["is_full_partition"] is False
|
| 265 |
+
|
| 266 |
+
|
| 267 |
+
def test_launch_cannot_label_another_checkpoint():
|
| 268 |
+
launch = {
|
| 269 |
+
"model": {
|
| 270 |
+
"repo_id": "Qwen/one",
|
| 271 |
+
"revision": "abc",
|
| 272 |
+
"dtype": "bfloat16",
|
| 273 |
+
"quantization": None,
|
| 274 |
+
},
|
| 275 |
+
"profile": "one",
|
| 276 |
+
"engine": {"revision": "def"},
|
| 277 |
+
}
|
| 278 |
+
snapshot = {
|
| 279 |
+
"server_info": {
|
| 280 |
+
"model_path": "Qwen/one",
|
| 281 |
+
"revision": "abc",
|
| 282 |
+
"dtype": "bfloat16",
|
| 283 |
+
"quantization": None,
|
| 284 |
+
},
|
| 285 |
+
"model_info": {"model_path": "Qwen/one"},
|
| 286 |
+
}
|
| 287 |
+
validate_launch(snapshot, launch)
|
| 288 |
+
snapshot["server_info"]["revision"] = "changed"
|
| 289 |
+
with pytest.raises(ValueError, match="revision"):
|
| 290 |
+
validate_launch(snapshot, launch)
|
server/tests/test_disconnect_cleanup.py
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""A completed score must not wait forever for a cancelled disconnect poll."""
|
| 2 |
+
|
| 3 |
+
import asyncio
|
| 4 |
+
|
| 5 |
+
import pytest
|
| 6 |
+
|
| 7 |
+
from jev_adapter.backend import AdapterError, ScoringResult
|
| 8 |
+
from jev_adapter.protocol import SystemOneRequest
|
| 9 |
+
from jev_adapter.server import create_app
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
class ControlledBackend:
|
| 13 |
+
model = "test-model"
|
| 14 |
+
|
| 15 |
+
def __init__(self):
|
| 16 |
+
self.release = asyncio.Event()
|
| 17 |
+
self.entered = asyncio.Event()
|
| 18 |
+
self.cancelled = asyncio.Event()
|
| 19 |
+
|
| 20 |
+
def labels(self, count):
|
| 21 |
+
return tuple("AB"[:count]), tuple(range(count))
|
| 22 |
+
|
| 23 |
+
async def evaluate(self, prompt, images, labels, token_ids, assistant_prefix):
|
| 24 |
+
self.entered.set()
|
| 25 |
+
try:
|
| 26 |
+
await self.release.wait()
|
| 27 |
+
except asyncio.CancelledError:
|
| 28 |
+
self.cancelled.set()
|
| 29 |
+
raise
|
| 30 |
+
return ScoringResult((-0.1, -2.0), 10)
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
class CancellationSwallowingRequest:
|
| 34 |
+
"""Reproduce a request probe whose internal cancellation scope wins a race.
|
| 35 |
+
|
| 36 |
+
CancelledError can be suppressed within a probe, leaving its caller alive.
|
| 37 |
+
A real Request.is_disconnected uses a self-cancelling AnyIO CancelScope;
|
| 38 |
+
deliberately control that boundary here rather than rely on scheduler luck.
|
| 39 |
+
"""
|
| 40 |
+
|
| 41 |
+
def __init__(self):
|
| 42 |
+
self.entered = asyncio.Event()
|
| 43 |
+
self.swallowed = asyncio.Event()
|
| 44 |
+
self.probe_task = None
|
| 45 |
+
self.calls = 0
|
| 46 |
+
|
| 47 |
+
async def is_disconnected(self):
|
| 48 |
+
self.probe_task = asyncio.current_task()
|
| 49 |
+
self.calls += 1
|
| 50 |
+
self.entered.set()
|
| 51 |
+
try:
|
| 52 |
+
await asyncio.Future()
|
| 53 |
+
except asyncio.CancelledError:
|
| 54 |
+
self.swallowed.set()
|
| 55 |
+
return False
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def endpoint_and_body(backend):
|
| 59 |
+
app = create_app(backend)
|
| 60 |
+
endpoint = next(
|
| 61 |
+
route.endpoint
|
| 62 |
+
for route in app.routes
|
| 63 |
+
if getattr(route, "path", None) == "/v1/systemone"
|
| 64 |
+
)
|
| 65 |
+
body = SystemOneRequest.model_validate(
|
| 66 |
+
{
|
| 67 |
+
"model": backend.model,
|
| 68 |
+
"state": "A billing question.",
|
| 69 |
+
"questions": {
|
| 70 |
+
"route": {
|
| 71 |
+
"type": "choice",
|
| 72 |
+
"instructions": "Choose the team.",
|
| 73 |
+
"criteria": {"billing": None, "technical": None},
|
| 74 |
+
}
|
| 75 |
+
},
|
| 76 |
+
}
|
| 77 |
+
)
|
| 78 |
+
return endpoint, body
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
@pytest.mark.asyncio
|
| 82 |
+
async def test_completed_score_returns_when_disconnect_probe_swallows_cancel():
|
| 83 |
+
backend = ControlledBackend()
|
| 84 |
+
endpoint, body = endpoint_and_body(backend)
|
| 85 |
+
request = CancellationSwallowingRequest()
|
| 86 |
+
response = asyncio.create_task(endpoint(body, request))
|
| 87 |
+
try:
|
| 88 |
+
await asyncio.wait_for(request.entered.wait(), timeout=1)
|
| 89 |
+
await asyncio.wait_for(backend.entered.wait(), timeout=1)
|
| 90 |
+
backend.release.set()
|
| 91 |
+
await asyncio.wait_for(request.swallowed.wait(), timeout=1)
|
| 92 |
+
done, _ = await asyncio.wait({response}, timeout=0.1)
|
| 93 |
+
assert response in done, "completed inference is stuck cleaning up its watcher"
|
| 94 |
+
result = response.result()
|
| 95 |
+
assert result["answers"]["route"]["choice"] == "billing"
|
| 96 |
+
assert request.calls == 1
|
| 97 |
+
assert request.probe_task.done()
|
| 98 |
+
finally:
|
| 99 |
+
# Do not let a deliberately cancellation-resistant fake leak after red.
|
| 100 |
+
request.is_disconnected = disconnected_now
|
| 101 |
+
if request.probe_task is not None:
|
| 102 |
+
request.probe_task.cancel()
|
| 103 |
+
response.cancel()
|
| 104 |
+
await asyncio.gather(response, return_exceptions=True)
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
async def disconnected_now():
|
| 108 |
+
return True
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
@pytest.mark.asyncio
|
| 112 |
+
async def test_client_disconnect_still_cancels_unfinished_inference():
|
| 113 |
+
backend = ControlledBackend()
|
| 114 |
+
endpoint, body = endpoint_and_body(backend)
|
| 115 |
+
|
| 116 |
+
class DisconnectedRequest:
|
| 117 |
+
async def is_disconnected(self):
|
| 118 |
+
await backend.entered.wait()
|
| 119 |
+
return True
|
| 120 |
+
|
| 121 |
+
with pytest.raises(AdapterError) as error:
|
| 122 |
+
await asyncio.wait_for(endpoint(body, DisconnectedRequest()), timeout=1)
|
| 123 |
+
assert error.value.code == "client_disconnected"
|
| 124 |
+
assert error.value.status == 499
|
| 125 |
+
assert backend.cancelled.is_set()
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
@pytest.mark.asyncio
|
| 129 |
+
async def test_cancelled_handler_joins_work_and_cancellation_resistant_watcher():
|
| 130 |
+
backend = ControlledBackend()
|
| 131 |
+
endpoint, body = endpoint_and_body(backend)
|
| 132 |
+
request = CancellationSwallowingRequest()
|
| 133 |
+
response = asyncio.create_task(endpoint(body, request))
|
| 134 |
+
try:
|
| 135 |
+
await asyncio.wait_for(request.entered.wait(), timeout=1)
|
| 136 |
+
await asyncio.wait_for(backend.entered.wait(), timeout=1)
|
| 137 |
+
response.cancel()
|
| 138 |
+
done, _ = await asyncio.wait({response}, timeout=0.1)
|
| 139 |
+
assert response in done, "cancelled handler did not release its child tasks"
|
| 140 |
+
with pytest.raises(asyncio.CancelledError):
|
| 141 |
+
response.result()
|
| 142 |
+
assert backend.cancelled.is_set()
|
| 143 |
+
assert request.swallowed.is_set()
|
| 144 |
+
assert request.probe_task.done()
|
| 145 |
+
finally:
|
| 146 |
+
request.is_disconnected = disconnected_now
|
| 147 |
+
if request.probe_task is not None:
|
| 148 |
+
request.probe_task.cancel()
|
| 149 |
+
response.cancel()
|
| 150 |
+
await asyncio.gather(response, return_exceptions=True)
|
server/tests/test_http_integration.py
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Full adapter stack, with only the remote engine's HTTP transport simulated."""
|
| 2 |
+
|
| 3 |
+
import httpx
|
| 4 |
+
import pytest
|
| 5 |
+
from test_service import payload
|
| 6 |
+
from test_sglang import Engine
|
| 7 |
+
|
| 8 |
+
from jev_adapter.server import create_app
|
| 9 |
+
from jev_adapter.sglang import SGLangBackend
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
@pytest.mark.asyncio
|
| 13 |
+
async def test_public_request_through_real_service_and_sglang_client():
|
| 14 |
+
engine = Engine()
|
| 15 |
+
async with httpx.AsyncClient(transport=httpx.MockTransport(engine)) as upstream:
|
| 16 |
+
backend = SGLangBackend("http://engine", "qwen", client=upstream)
|
| 17 |
+
app = create_app(backend, api_key="client-key")
|
| 18 |
+
async with (
|
| 19 |
+
app.router.lifespan_context(app),
|
| 20 |
+
httpx.AsyncClient(
|
| 21 |
+
transport=httpx.ASGITransport(app),
|
| 22 |
+
base_url="http://adapter",
|
| 23 |
+
) as client,
|
| 24 |
+
):
|
| 25 |
+
body = payload()
|
| 26 |
+
body["model"] = "jev-latest"
|
| 27 |
+
body["images"] = ["data:image/png;base64,YQ=="]
|
| 28 |
+
body["options"] = {"permutations": 2, "return_logprobs": True}
|
| 29 |
+
response = await client.post(
|
| 30 |
+
"/v1/systemone",
|
| 31 |
+
json=body,
|
| 32 |
+
headers={"Authorization": "Bearer client-key"},
|
| 33 |
+
)
|
| 34 |
+
assert response.status_code == 200, response.text
|
| 35 |
+
result = response.json()
|
| 36 |
+
assert result["model"] == "qwen"
|
| 37 |
+
assert set(result["answers"]) == set(body["questions"])
|
| 38 |
+
assert result["answers"]["route"]["probabilities"]["billing"] == pytest.approx(
|
| 39 |
+
0.5
|
| 40 |
+
)
|
| 41 |
+
assert result["usage"] == {"input_tokens": 426, "output_tokens": 0}
|
| 42 |
+
assert result["metadata"]["evaluations"] == 6
|
| 43 |
+
generations = [data for path, data, _ in engine.calls if path == "/generate"]
|
| 44 |
+
assert len(generations) == 6
|
| 45 |
+
assert len({data["rid"] for data in generations}) == 6
|
| 46 |
+
assert all(data["image_data"] == body["images"] for data in generations)
|
| 47 |
+
assert all(
|
| 48 |
+
data["sampling_params"]["max_new_tokens"] == 0 for data in generations
|
| 49 |
+
)
|
server/tests/test_jevbench.py
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Check JevBench conversion, reference alignment and frozen source integrity."""
|
| 2 |
+
|
| 3 |
+
import copy
|
| 4 |
+
import json
|
| 5 |
+
import tempfile
|
| 6 |
+
import unittest
|
| 7 |
+
from dataclasses import replace
|
| 8 |
+
from pathlib import Path
|
| 9 |
+
from unittest.mock import patch
|
| 10 |
+
|
| 11 |
+
import httpx
|
| 12 |
+
|
| 13 |
+
from jev_adapter.benchmarks.data import sha256
|
| 14 |
+
from jev_adapter.benchmarks.jevbench import (
|
| 15 |
+
JEVBENCH_COMMIT,
|
| 16 |
+
JEVBENCH_SUITES,
|
| 17 |
+
JevBenchSpec,
|
| 18 |
+
normalize_jevbench_record,
|
| 19 |
+
parse_jevbench,
|
| 20 |
+
prepare_jevbench,
|
| 21 |
+
)
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def fixture(kind="choice", name="sample"):
|
| 25 |
+
questions = {
|
| 26 |
+
"choice": {
|
| 27 |
+
"type": "choice",
|
| 28 |
+
"instructions": "Choose a queue.",
|
| 29 |
+
"criteria": {"support": "Support", "billing": "Billing"},
|
| 30 |
+
},
|
| 31 |
+
"noul": {
|
| 32 |
+
"type": "noul",
|
| 33 |
+
"instructions": "Is a refund requested?",
|
| 34 |
+
"criteria": {"true": "Refund requested", "false": "No refund request"},
|
| 35 |
+
},
|
| 36 |
+
"score": {
|
| 37 |
+
"type": "score",
|
| 38 |
+
"instructions": "How urgent?",
|
| 39 |
+
"criteria": ["low", "medium", "high"],
|
| 40 |
+
},
|
| 41 |
+
}
|
| 42 |
+
return {
|
| 43 |
+
"id": name,
|
| 44 |
+
"family": "routing",
|
| 45 |
+
"group": None,
|
| 46 |
+
"split": "public",
|
| 47 |
+
"state": {"message": "Please refund my bill."},
|
| 48 |
+
"question": questions[kind],
|
| 49 |
+
"labels": {
|
| 50 |
+
"choice": ["billing", "support"],
|
| 51 |
+
"noul": ["no", "yes"],
|
| 52 |
+
"score": ["0", "1", "2"],
|
| 53 |
+
}[kind],
|
| 54 |
+
"expected": {"choice": "billing", "noul": "yes", "score": 2}[kind],
|
| 55 |
+
"provenance": {
|
| 56 |
+
"source": "Unit test fixture",
|
| 57 |
+
"license": "MIT",
|
| 58 |
+
"rationale": "SECRET_RATIONALE",
|
| 59 |
+
"surface_answer": "SECRET_SURFACE_ANSWER",
|
| 60 |
+
"label_basis": "Authored rubric",
|
| 61 |
+
},
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
def source_fixture(records):
|
| 66 |
+
payload = "".join(json.dumps(row) + "\n" for row in records).encode()
|
| 67 |
+
notices = {"LICENSE": b"Fixture MIT notice", "THIRD-PARTY.md": b"Fixture notice"}
|
| 68 |
+
spec = JevBenchSpec(
|
| 69 |
+
"datasets/public/fixture.jsonl", sha256(payload), len(records), "Fixture"
|
| 70 |
+
)
|
| 71 |
+
return (
|
| 72 |
+
spec,
|
| 73 |
+
{spec.path: payload, **notices},
|
| 74 |
+
{path: sha256(content) for path, content in notices.items()},
|
| 75 |
+
)
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
class TestJevBenchNormalization(unittest.TestCase):
|
| 79 |
+
def test_native_question_and_canonical_label_orders_preserved_without_gold(self):
|
| 80 |
+
raw = fixture()
|
| 81 |
+
raw["provenance"]["gold_probs"] = {"support": 0.25, "billing": 0.75}
|
| 82 |
+
original = copy.deepcopy(raw)
|
| 83 |
+
row = normalize_jevbench_record(raw, "jevbench-hard")
|
| 84 |
+
self.assertEqual(raw, original)
|
| 85 |
+
self.assertEqual(
|
| 86 |
+
row["record"],
|
| 87 |
+
{"state": raw["state"], "questions": {"decision": raw["question"]}},
|
| 88 |
+
)
|
| 89 |
+
expected = row["expected"]["decision"]
|
| 90 |
+
self.assertEqual(expected["labels"], ["billing", "support"])
|
| 91 |
+
self.assertEqual(
|
| 92 |
+
list(row["record"]["questions"]["decision"]["criteria"]),
|
| 93 |
+
["support", "billing"],
|
| 94 |
+
)
|
| 95 |
+
self.assertEqual(expected["target"], [1, 0])
|
| 96 |
+
self.assertEqual(expected["reference_probs"], [0.75, 0.25])
|
| 97 |
+
request_text = json.dumps(row["record"])
|
| 98 |
+
for secret in (
|
| 99 |
+
"SECRET_",
|
| 100 |
+
"gold_probs",
|
| 101 |
+
"expected",
|
| 102 |
+
"provenance",
|
| 103 |
+
"label_basis",
|
| 104 |
+
):
|
| 105 |
+
self.assertNotIn(secret, request_text)
|
| 106 |
+
self.assertEqual(row["metadata"]["provenance"], raw["provenance"])
|
| 107 |
+
self.assertEqual(row["metadata"]["group_id"], raw["id"])
|
| 108 |
+
self.assertEqual(row["split"], "public")
|
| 109 |
+
|
| 110 |
+
def test_noul_reference_mapping_and_score_hard_label(self):
|
| 111 |
+
raw = fixture("noul")
|
| 112 |
+
raw["provenance"]["gold_probs"] = {"yes": 0.8, "no": 0.2}
|
| 113 |
+
noul = normalize_jevbench_record(raw, "jevbench-hard")["expected"]["decision"]
|
| 114 |
+
self.assertEqual(noul["labels"], ["false", "true"])
|
| 115 |
+
self.assertEqual(noul["target"], [0, 1])
|
| 116 |
+
self.assertEqual(noul["reference_probs"], [0.2, 0.8])
|
| 117 |
+
score = normalize_jevbench_record(fixture("score"), "jevbench-original")
|
| 118 |
+
self.assertEqual(score["expected"]["decision"]["label"], 2)
|
| 119 |
+
self.assertNotIn("reference_probs", score["expected"]["decision"])
|
| 120 |
+
|
| 121 |
+
def test_paraphrase_group_preserved_and_null_groups_independent(self):
|
| 122 |
+
first, second = fixture(name="one"), fixture(name="two")
|
| 123 |
+
a = normalize_jevbench_record(first, "jevbench-easy")
|
| 124 |
+
b = normalize_jevbench_record(second, "jevbench-easy")
|
| 125 |
+
self.assertNotEqual(a["metadata"]["group_id"], b["metadata"]["group_id"])
|
| 126 |
+
first["group"] = second["group"] = "pair"
|
| 127 |
+
self.assertEqual(
|
| 128 |
+
normalize_jevbench_record(first, "jevbench-original")["metadata"][
|
| 129 |
+
"group_id"
|
| 130 |
+
],
|
| 131 |
+
normalize_jevbench_record(second, "jevbench-original")["metadata"][
|
| 132 |
+
"group_id"
|
| 133 |
+
],
|
| 134 |
+
)
|
| 135 |
+
|
| 136 |
+
def test_bad_labels_private_rows_and_malformed_references_rejected(self):
|
| 137 |
+
changes = [
|
| 138 |
+
{"split": "private"},
|
| 139 |
+
{"labels": ["billing", "absent"]},
|
| 140 |
+
{"expected": "absent"},
|
| 141 |
+
{"provenance": {"exclude_reason": "ambiguous"}},
|
| 142 |
+
]
|
| 143 |
+
for change in changes:
|
| 144 |
+
with self.subTest(change=change), self.assertRaises(ValueError):
|
| 145 |
+
normalize_jevbench_record({**fixture(), **change}, "jevbench-hard")
|
| 146 |
+
for probs in (
|
| 147 |
+
{"billing": 0.5},
|
| 148 |
+
{"billing": 0.8, "support": 0.3},
|
| 149 |
+
{"billing": float("nan"), "support": 0.3},
|
| 150 |
+
{"billing": True, "support": 0.0},
|
| 151 |
+
):
|
| 152 |
+
raw = fixture()
|
| 153 |
+
raw["provenance"]["gold_probs"] = probs
|
| 154 |
+
with self.subTest(probs=probs), self.assertRaises(ValueError):
|
| 155 |
+
normalize_jevbench_record(raw, "jevbench-hard")
|
| 156 |
+
for kind, gold in (("score", True), ("score", 3), ("noul", True)):
|
| 157 |
+
raw = fixture(kind)
|
| 158 |
+
raw["expected"] = gold
|
| 159 |
+
with self.subTest(kind=kind, gold=gold), self.assertRaises(ValueError):
|
| 160 |
+
normalize_jevbench_record(raw, "jevbench-hard")
|
| 161 |
+
|
| 162 |
+
def test_duplicate_and_blank_rows_rejected(self):
|
| 163 |
+
row = json.dumps(fixture()) + "\n"
|
| 164 |
+
with self.assertRaisesRegex(ValueError, "duplicate"):
|
| 165 |
+
parse_jevbench((row * 2).encode(), "jevbench-original")
|
| 166 |
+
with self.assertRaisesRegex(ValueError, "blank"):
|
| 167 |
+
parse_jevbench((row + "\n").encode(), "jevbench-original")
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
class TestJevBenchPreparation(unittest.TestCase):
|
| 171 |
+
def test_pinned_download_preserves_notices_and_is_idempotent(self):
|
| 172 |
+
spec, sources, notices = source_fixture(
|
| 173 |
+
[fixture(name="one"), fixture(name="two")]
|
| 174 |
+
)
|
| 175 |
+
requests = []
|
| 176 |
+
|
| 177 |
+
def transport(request):
|
| 178 |
+
requests.append(request.url.path)
|
| 179 |
+
prefix = f"/fstandhartinger/jevbench/{JEVBENCH_COMMIT}/"
|
| 180 |
+
self.assertTrue(request.url.path.startswith(prefix))
|
| 181 |
+
return httpx.Response(
|
| 182 |
+
200, content=sources[request.url.path.removeprefix(prefix)]
|
| 183 |
+
)
|
| 184 |
+
|
| 185 |
+
with (
|
| 186 |
+
tempfile.TemporaryDirectory() as tmp,
|
| 187 |
+
patch.dict(JEVBENCH_SUITES, {"jevbench-fixture": spec}),
|
| 188 |
+
patch("jev_adapter.benchmarks.jevbench.JEVBENCH_NOTICES", notices),
|
| 189 |
+
httpx.Client(transport=httpx.MockTransport(transport)) as client,
|
| 190 |
+
):
|
| 191 |
+
output = Path(tmp)
|
| 192 |
+
result = prepare_jevbench(
|
| 193 |
+
"jevbench-fixture", output, client=client, limit=1
|
| 194 |
+
)
|
| 195 |
+
self.assertEqual(
|
| 196 |
+
result,
|
| 197 |
+
prepare_jevbench("jevbench-fixture", output, client=client, limit=1),
|
| 198 |
+
)
|
| 199 |
+
self.assertEqual(result["full_partition"]["questions"], 2)
|
| 200 |
+
self.assertEqual(result["selected"]["questions"], 1)
|
| 201 |
+
self.assertFalse(result["selection"]["is_full_partition"])
|
| 202 |
+
directory = output / "jevbench-fixture"
|
| 203 |
+
self.assertEqual(
|
| 204 |
+
result["data_sha256"], sha256((directory / "public.jsonl").read_bytes())
|
| 205 |
+
)
|
| 206 |
+
for name in notices:
|
| 207 |
+
self.assertEqual((directory / name).read_bytes(), sources[name])
|
| 208 |
+
self.assertTrue(
|
| 209 |
+
all("private" not in path and "train" not in path for path in requests)
|
| 210 |
+
)
|
| 211 |
+
with self.assertRaises(FileExistsError):
|
| 212 |
+
prepare_jevbench("jevbench-fixture", output, client=client)
|
| 213 |
+
self.assertEqual(
|
| 214 |
+
result["data_sha256"], sha256((directory / "public.jsonl").read_bytes())
|
| 215 |
+
)
|
| 216 |
+
|
| 217 |
+
def test_bad_data_notice_or_count_fails_before_writing(self):
|
| 218 |
+
spec, sources, notices = source_fixture([fixture()])
|
| 219 |
+
for corrupt in (spec.path, "LICENSE", "THIRD-PARTY.md", "count"):
|
| 220 |
+
with (
|
| 221 |
+
self.subTest(corrupt=corrupt),
|
| 222 |
+
tempfile.TemporaryDirectory() as tmp,
|
| 223 |
+
patch.dict(
|
| 224 |
+
JEVBENCH_SUITES,
|
| 225 |
+
{
|
| 226 |
+
"jevbench-fixture": replace(spec, records=2)
|
| 227 |
+
if corrupt == "count"
|
| 228 |
+
else spec
|
| 229 |
+
},
|
| 230 |
+
),
|
| 231 |
+
patch("jev_adapter.benchmarks.jevbench.JEVBENCH_NOTICES", notices),
|
| 232 |
+
):
|
| 233 |
+
root, output = Path(tmp) / "source", Path(tmp) / "out"
|
| 234 |
+
for name, content in sources.items():
|
| 235 |
+
path = root / name
|
| 236 |
+
path.parent.mkdir(parents=True, exist_ok=True)
|
| 237 |
+
path.write_bytes(content + (b" " if name == corrupt else b""))
|
| 238 |
+
with self.assertRaisesRegex(
|
| 239 |
+
ValueError, "SHA256 mismatch|count mismatch"
|
| 240 |
+
):
|
| 241 |
+
prepare_jevbench(
|
| 242 |
+
"jevbench-fixture", output, source_root=root, limit=1
|
| 243 |
+
)
|
| 244 |
+
self.assertFalse(output.exists())
|
| 245 |
+
|
| 246 |
+
def test_changed_notice_is_not_partially_overwritten(self):
|
| 247 |
+
spec, sources, notices = source_fixture([fixture()])
|
| 248 |
+
with (
|
| 249 |
+
tempfile.TemporaryDirectory() as tmp,
|
| 250 |
+
patch.dict(JEVBENCH_SUITES, {"jevbench-fixture": spec}),
|
| 251 |
+
patch("jev_adapter.benchmarks.jevbench.JEVBENCH_NOTICES", notices),
|
| 252 |
+
):
|
| 253 |
+
root, output = Path(tmp) / "source", Path(tmp) / "out"
|
| 254 |
+
for name, content in sources.items():
|
| 255 |
+
path = root / name
|
| 256 |
+
path.parent.mkdir(parents=True, exist_ok=True)
|
| 257 |
+
path.write_bytes(content)
|
| 258 |
+
directory = output / "jevbench-fixture"
|
| 259 |
+
directory.mkdir(parents=True)
|
| 260 |
+
(directory / "LICENSE").write_bytes(b"Existing different license")
|
| 261 |
+
with self.assertRaises(FileExistsError):
|
| 262 |
+
prepare_jevbench("jevbench-fixture", output, source_root=root)
|
| 263 |
+
self.assertFalse((directory / "public.jsonl").exists())
|
| 264 |
+
self.assertEqual(
|
| 265 |
+
(directory / "LICENSE").read_bytes(), b"Existing different license"
|
| 266 |
+
)
|
| 267 |
+
|
| 268 |
+
|
| 269 |
+
if __name__ == "__main__":
|
| 270 |
+
unittest.main()
|
server/tests/test_native_tokenizer.py
ADDED
|
@@ -0,0 +1,391 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
+
import sys
|
| 3 |
+
import threading
|
| 4 |
+
from types import SimpleNamespace
|
| 5 |
+
|
| 6 |
+
import httpx
|
| 7 |
+
import pytest
|
| 8 |
+
|
| 9 |
+
from jev_adapter.backend import AdapterError
|
| 10 |
+
from jev_adapter.native_tokenizer import NativeTokenizer
|
| 11 |
+
from jev_adapter.sglang import SGLangBackend
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class Tokenizer:
|
| 15 |
+
"""Control IDs cannot be reconstructed by raw text encoding."""
|
| 16 |
+
|
| 17 |
+
def __init__(self):
|
| 18 |
+
self.calls = []
|
| 19 |
+
self.mutate_prefix = False
|
| 20 |
+
self.bad_result = None
|
| 21 |
+
|
| 22 |
+
@staticmethod
|
| 23 |
+
def encode(text):
|
| 24 |
+
return [1000 + ord(char) for char in text]
|
| 25 |
+
|
| 26 |
+
def apply_chat_template(self, messages, **kwargs):
|
| 27 |
+
self.calls.append((messages, kwargs, threading.get_ident()))
|
| 28 |
+
assert kwargs["tokenize"] is True
|
| 29 |
+
assert kwargs["return_dict"] is False
|
| 30 |
+
assert kwargs["enable_thinking"] is False
|
| 31 |
+
if self.bad_result is not None:
|
| 32 |
+
return self.bad_result
|
| 33 |
+
ids = [1, 3] + self.encode(messages[0]["content"]) + [4]
|
| 34 |
+
if len(messages) == 1:
|
| 35 |
+
assert kwargs["add_generation_prompt"] is True
|
| 36 |
+
assert kwargs["continue_final_message"] is False
|
| 37 |
+
return ids
|
| 38 |
+
assert kwargs["add_generation_prompt"] is False
|
| 39 |
+
assert kwargs["continue_final_message"] is True
|
| 40 |
+
assert messages[1]["role"] == "assistant"
|
| 41 |
+
if self.mutate_prefix:
|
| 42 |
+
ids[-1] = 99
|
| 43 |
+
# Native implementations may strip trailing assistant whitespace.
|
| 44 |
+
return ids + self.encode(messages[1]["content"].rstrip())
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
def test_native_control_ids_and_literal_markers_preserved():
|
| 48 |
+
tokenizer = Tokenizer()
|
| 49 |
+
native = NativeTokenizer(tokenizer)
|
| 50 |
+
prompt = "한글 [INST] </s> [IMG]"
|
| 51 |
+
ids = native.prepare(prompt, ("A", "B"), (1065, 1066), None)
|
| 52 |
+
assert ids == [1, 3] + tokenizer.encode(prompt) + [4]
|
| 53 |
+
assert len(tokenizer.calls) == 3
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
def test_compatible_assistant_prefix_is_native_continuation():
|
| 57 |
+
tokenizer = Tokenizer()
|
| 58 |
+
ids = NativeTokenizer(tokenizer).prepare(
|
| 59 |
+
"pick",
|
| 60 |
+
("A", "B"),
|
| 61 |
+
(1065, 1066),
|
| 62 |
+
"Answer:",
|
| 63 |
+
)
|
| 64 |
+
assert ids == [1, 3] + tokenizer.encode("pick") + [4] + tokenizer.encode("Answer:")
|
| 65 |
+
assert len(tokenizer.calls) == 4
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
@pytest.mark.parametrize("prefix", [None, "Answer:"])
|
| 69 |
+
def test_rejects_changed_native_prompt_boundary(prefix):
|
| 70 |
+
tokenizer = Tokenizer()
|
| 71 |
+
tokenizer.mutate_prefix = True
|
| 72 |
+
with pytest.raises(AdapterError) as error:
|
| 73 |
+
NativeTokenizer(tokenizer).prepare("pick", ("A", "B"), (1065, 1066), prefix)
|
| 74 |
+
assert error.value.code == "invalid_label_boundary"
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
@pytest.mark.parametrize(
|
| 78 |
+
"labels,token_ids,prefix",
|
| 79 |
+
[
|
| 80 |
+
(("A", "B"), (2065, 2066), None), # Engine and native vocabulary mismatch.
|
| 81 |
+
(("A", "000"), (1065, 1048), None), # Multi-token continuation.
|
| 82 |
+
(("A", "B"), (1065, 1066), " "), # Native prefix trimming changes boundary.
|
| 83 |
+
],
|
| 84 |
+
)
|
| 85 |
+
def test_rejects_unsafe_label_continuations(labels, token_ids, prefix):
|
| 86 |
+
with pytest.raises(AdapterError) as error:
|
| 87 |
+
NativeTokenizer(Tokenizer()).prepare("pick", labels, token_ids, prefix)
|
| 88 |
+
assert error.value.code == "invalid_label_boundary"
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
@pytest.mark.parametrize("bad_result", [[], [True], [-1], {"input_ids": [1, 2]}])
|
| 92 |
+
def test_rejects_malformed_native_token_ids(bad_result):
|
| 93 |
+
tokenizer = Tokenizer()
|
| 94 |
+
tokenizer.bad_result = bad_result
|
| 95 |
+
with pytest.raises(AdapterError) as error:
|
| 96 |
+
NativeTokenizer(tokenizer).prepare("pick", ("A", "B"), (1065, 1066), None)
|
| 97 |
+
assert error.value.code == "unsupported_native_tokenizer"
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
def test_loader_uses_explicit_revision_and_no_remote_code(monkeypatch):
|
| 101 |
+
calls = []
|
| 102 |
+
tokenizer = Tokenizer()
|
| 103 |
+
|
| 104 |
+
def load(model, **kwargs):
|
| 105 |
+
calls.append((model, kwargs))
|
| 106 |
+
return tokenizer
|
| 107 |
+
|
| 108 |
+
monkeypatch.setitem(
|
| 109 |
+
sys.modules,
|
| 110 |
+
"transformers",
|
| 111 |
+
SimpleNamespace(
|
| 112 |
+
AutoTokenizer=SimpleNamespace(from_pretrained=load),
|
| 113 |
+
),
|
| 114 |
+
)
|
| 115 |
+
native = NativeTokenizer.from_pretrained("org/model", "a" * 40)
|
| 116 |
+
assert native.tokenizer is tokenizer
|
| 117 |
+
assert calls == [("org/model", {"revision": "a" * 40, "trust_remote_code": False})]
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
class SystemAwareTokenizer:
|
| 121 |
+
"""Like Tokenizer above, but role-aware so it can render an optional
|
| 122 |
+
leading system message instead of assuming a fixed message count/order."""
|
| 123 |
+
|
| 124 |
+
def __init__(self):
|
| 125 |
+
self.calls = []
|
| 126 |
+
|
| 127 |
+
@staticmethod
|
| 128 |
+
def encode(text):
|
| 129 |
+
return [1000 + ord(char) for char in text]
|
| 130 |
+
|
| 131 |
+
def apply_chat_template(self, messages, **kwargs):
|
| 132 |
+
self.calls.append((messages, kwargs))
|
| 133 |
+
roles = [message["role"] for message in messages]
|
| 134 |
+
assert roles[-1] in ("user", "assistant")
|
| 135 |
+
sys_text = messages[0]["content"] if roles[0] == "system" else ""
|
| 136 |
+
user_text = next(m["content"] for m in messages if m["role"] == "user")
|
| 137 |
+
ids = [1, 3] + self.encode(sys_text) + self.encode(user_text) + [4]
|
| 138 |
+
if roles[-1] == "user":
|
| 139 |
+
assert kwargs["add_generation_prompt"] is True
|
| 140 |
+
return ids
|
| 141 |
+
assert kwargs["add_generation_prompt"] is False
|
| 142 |
+
return ids + self.encode(messages[-1]["content"].rstrip())
|
| 143 |
+
|
| 144 |
+
|
| 145 |
+
def test_prepare_prepends_explicit_system_message_when_given():
|
| 146 |
+
tokenizer = SystemAwareTokenizer()
|
| 147 |
+
ids = NativeTokenizer(tokenizer).prepare(
|
| 148 |
+
"pick", ("A", "B"), (1065, 1066), None, "You are helpful."
|
| 149 |
+
)
|
| 150 |
+
expected = (
|
| 151 |
+
[1, 3]
|
| 152 |
+
+ tokenizer.encode("You are helpful.")
|
| 153 |
+
+ tokenizer.encode("pick")
|
| 154 |
+
+ [4]
|
| 155 |
+
)
|
| 156 |
+
assert ids == expected
|
| 157 |
+
for messages, _ in tokenizer.calls:
|
| 158 |
+
assert messages[0] == {"role": "system", "content": "You are helpful."}
|
| 159 |
+
assert messages[1]["role"] in ("user", "assistant")
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
def test_prepare_omits_system_message_by_default():
|
| 163 |
+
tokenizer = SystemAwareTokenizer()
|
| 164 |
+
NativeTokenizer(tokenizer).prepare("pick", ("A", "B"), (1065, 1066), None)
|
| 165 |
+
for messages, _ in tokenizer.calls:
|
| 166 |
+
assert messages[0]["role"] == "user"
|
| 167 |
+
assert not any(m["role"] == "system" for m in messages)
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
def test_native_system_prompt_none_renders_identically_to_plain_user_chat():
|
| 171 |
+
"""--native-system-prompt none wires system_prompt=None into
|
| 172 |
+
NativeTokenizer.prepare (see __main__.py/sglang.py): no extraction, no
|
| 173 |
+
system message. The encoded messages must carry no system role and the
|
| 174 |
+
token sequence must equal a bare apply_chat_template([{"role": "user",
|
| 175 |
+
...}]) call on the same (pinned) tokenizer -- i.e. rendering is
|
| 176 |
+
byte-for-byte what it would be if --tokenizer-model had never been
|
| 177 |
+
passed at all."""
|
| 178 |
+
tokenizer = SystemAwareTokenizer()
|
| 179 |
+
ids = NativeTokenizer(tokenizer).prepare(
|
| 180 |
+
"pick", ("A", "B"), (1065, 1066), None, system_prompt=None
|
| 181 |
+
)
|
| 182 |
+
for messages, _ in tokenizer.calls:
|
| 183 |
+
assert not any(message["role"] == "system" for message in messages)
|
| 184 |
+
|
| 185 |
+
reference_tokenizer = SystemAwareTokenizer()
|
| 186 |
+
expected = reference_tokenizer.apply_chat_template(
|
| 187 |
+
[{"role": "user", "content": "pick"}],
|
| 188 |
+
tokenize=True,
|
| 189 |
+
add_generation_prompt=True,
|
| 190 |
+
continue_final_message=False,
|
| 191 |
+
return_dict=False,
|
| 192 |
+
enable_thinking=False,
|
| 193 |
+
)
|
| 194 |
+
assert ids == expected
|
| 195 |
+
|
| 196 |
+
|
| 197 |
+
def test_extract_default_system_prompt_finds_the_hf_system_block():
|
| 198 |
+
from jev_adapter.native_tokenizer import extract_default_system_prompt
|
| 199 |
+
|
| 200 |
+
class HFStyleTokenizer:
|
| 201 |
+
def apply_chat_template(self, messages, **kwargs):
|
| 202 |
+
assert messages == [{"role": "user", "content": ""}]
|
| 203 |
+
return "[SYSTEM_PROMPT]You are Ministral.[/SYSTEM_PROMPT][INST]...[/INST]"
|
| 204 |
+
|
| 205 |
+
assert extract_default_system_prompt(HFStyleTokenizer()) == "You are Ministral."
|
| 206 |
+
|
| 207 |
+
|
| 208 |
+
def test_extract_default_system_prompt_returns_none_for_mistral_common_style():
|
| 209 |
+
from jev_adapter.native_tokenizer import extract_default_system_prompt
|
| 210 |
+
|
| 211 |
+
class MistralCommonStyleTokenizer:
|
| 212 |
+
"""mistral-common never auto-injects a default system prompt."""
|
| 213 |
+
|
| 214 |
+
def apply_chat_template(self, messages, **kwargs):
|
| 215 |
+
return "<s>[INST]...[/INST]"
|
| 216 |
+
|
| 217 |
+
assert extract_default_system_prompt(MistralCommonStyleTokenizer()) is None
|
| 218 |
+
|
| 219 |
+
|
| 220 |
+
def test_native_default_system_prompt_forces_fix_mistral_regex_for_mistralai(
|
| 221 |
+
monkeypatch,
|
| 222 |
+
):
|
| 223 |
+
calls = []
|
| 224 |
+
|
| 225 |
+
def load(model, **kwargs):
|
| 226 |
+
calls.append((model, kwargs))
|
| 227 |
+
|
| 228 |
+
class Rendered:
|
| 229 |
+
@staticmethod
|
| 230 |
+
def apply_chat_template(messages, **kwargs):
|
| 231 |
+
return "[SYSTEM_PROMPT]default text[/SYSTEM_PROMPT][INST]x[/INST]"
|
| 232 |
+
|
| 233 |
+
return Rendered()
|
| 234 |
+
|
| 235 |
+
monkeypatch.setitem(
|
| 236 |
+
sys.modules,
|
| 237 |
+
"transformers",
|
| 238 |
+
SimpleNamespace(AutoTokenizer=SimpleNamespace(from_pretrained=load)),
|
| 239 |
+
)
|
| 240 |
+
result = NativeTokenizer.native_default_system_prompt(
|
| 241 |
+
"mistralai/Ministral-3-8B-Instruct-2512-BF16", "f" * 40
|
| 242 |
+
)
|
| 243 |
+
assert result == "default text"
|
| 244 |
+
assert calls == [
|
| 245 |
+
(
|
| 246 |
+
"mistralai/Ministral-3-8B-Instruct-2512-BF16",
|
| 247 |
+
{"revision": "f" * 40, "trust_remote_code": False, "fix_mistral_regex": True},
|
| 248 |
+
)
|
| 249 |
+
]
|
| 250 |
+
|
| 251 |
+
|
| 252 |
+
def test_native_default_system_prompt_omits_fix_mistral_regex_for_other_orgs(
|
| 253 |
+
monkeypatch,
|
| 254 |
+
):
|
| 255 |
+
calls = []
|
| 256 |
+
|
| 257 |
+
def load(model, **kwargs):
|
| 258 |
+
calls.append((model, kwargs))
|
| 259 |
+
|
| 260 |
+
class Rendered:
|
| 261 |
+
@staticmethod
|
| 262 |
+
def apply_chat_template(messages, **kwargs):
|
| 263 |
+
return "<s>[INST]x[/INST]"
|
| 264 |
+
|
| 265 |
+
return Rendered()
|
| 266 |
+
|
| 267 |
+
monkeypatch.setitem(
|
| 268 |
+
sys.modules,
|
| 269 |
+
"transformers",
|
| 270 |
+
SimpleNamespace(AutoTokenizer=SimpleNamespace(from_pretrained=load)),
|
| 271 |
+
)
|
| 272 |
+
result = NativeTokenizer.native_default_system_prompt("org/model", "a" * 40)
|
| 273 |
+
assert result is None
|
| 274 |
+
assert calls == [("org/model", {"revision": "a" * 40, "trust_remote_code": False})]
|
| 275 |
+
|
| 276 |
+
|
| 277 |
+
def test_native_default_system_prompt_requires_model_and_revision():
|
| 278 |
+
for model, revision in (("", "a" * 40), ("org/model", ""), (" ", " ")):
|
| 279 |
+
with pytest.raises(ValueError):
|
| 280 |
+
NativeTokenizer.native_default_system_prompt(model, revision)
|
| 281 |
+
|
| 282 |
+
|
| 283 |
+
class Engine:
|
| 284 |
+
def __init__(self):
|
| 285 |
+
self.calls = []
|
| 286 |
+
|
| 287 |
+
def __call__(self, request):
|
| 288 |
+
path = request.url.path
|
| 289 |
+
body = json.loads(request.content) if request.content else None
|
| 290 |
+
self.calls.append((path, body))
|
| 291 |
+
if path == "/model_info":
|
| 292 |
+
return httpx.Response(
|
| 293 |
+
200,
|
| 294 |
+
json={
|
| 295 |
+
"served_model_name": "model",
|
| 296 |
+
"is_generation": True,
|
| 297 |
+
"has_image_understanding": True,
|
| 298 |
+
"model_type": "mistral3",
|
| 299 |
+
},
|
| 300 |
+
)
|
| 301 |
+
if path == "/server_info":
|
| 302 |
+
return httpx.Response(200, json={})
|
| 303 |
+
if path == "/v1/tokenize":
|
| 304 |
+
assert "messages" not in body, "Native path must bypass HTTP chat rendering"
|
| 305 |
+
return httpx.Response(
|
| 306 |
+
200,
|
| 307 |
+
json={
|
| 308 |
+
"tokens": [Tokenizer.encode(label) for label in body["prompt"]],
|
| 309 |
+
},
|
| 310 |
+
)
|
| 311 |
+
if path == "/v1/detokenize":
|
| 312 |
+
return httpx.Response(
|
| 313 |
+
200,
|
| 314 |
+
json={
|
| 315 |
+
"text": [
|
| 316 |
+
"".join(chr(token - 1000) for token in ids)
|
| 317 |
+
for ids in body["tokens"]
|
| 318 |
+
],
|
| 319 |
+
},
|
| 320 |
+
)
|
| 321 |
+
if path == "/generate":
|
| 322 |
+
return httpx.Response(
|
| 323 |
+
200,
|
| 324 |
+
json={
|
| 325 |
+
"meta_info": {
|
| 326 |
+
"completion_tokens": 0,
|
| 327 |
+
"prompt_tokens": len(body["input_ids"]),
|
| 328 |
+
"output_token_ids_logprobs": [
|
| 329 |
+
[[-1.0, token] for token in body["token_ids_logprob"]]
|
| 330 |
+
],
|
| 331 |
+
}
|
| 332 |
+
},
|
| 333 |
+
)
|
| 334 |
+
raise AssertionError(f"Unexpected route: {path}")
|
| 335 |
+
|
| 336 |
+
|
| 337 |
+
@pytest.mark.asyncio
|
| 338 |
+
async def test_native_http_path_preserves_control_ids_and_zero_decode():
|
| 339 |
+
engine, tokenizer = Engine(), Tokenizer()
|
| 340 |
+
async with httpx.AsyncClient(transport=httpx.MockTransport(engine)) as client:
|
| 341 |
+
backend = SGLangBackend(
|
| 342 |
+
"http://engine",
|
| 343 |
+
"model",
|
| 344 |
+
client=client,
|
| 345 |
+
native_tokenizer=NativeTokenizer(tokenizer),
|
| 346 |
+
)
|
| 347 |
+
await backend.start()
|
| 348 |
+
startup_calls = len(engine.calls)
|
| 349 |
+
labels, token_ids = backend.labels(2)
|
| 350 |
+
result = await backend.evaluate("literal [INST]", [], labels, token_ids, None)
|
| 351 |
+
assert len(engine.calls) == startup_calls + 1
|
| 352 |
+
path, payload = engine.calls[-1]
|
| 353 |
+
assert path == "/generate"
|
| 354 |
+
expected = [1, 3] + tokenizer.encode("literal [INST]") + [4]
|
| 355 |
+
assert payload["input_ids"] == expected
|
| 356 |
+
assert payload["sampling_params"]["max_new_tokens"] == 0
|
| 357 |
+
assert payload["token_ids_logprob"] == list(token_ids)
|
| 358 |
+
assert "text" not in payload and "image_data" not in payload
|
| 359 |
+
assert result.input_tokens == len(expected)
|
| 360 |
+
assert result.logprobs == (-1.0, -1.0)
|
| 361 |
+
assert all(thread != threading.get_ident() for _, _, thread in tokenizer.calls)
|
| 362 |
+
|
| 363 |
+
|
| 364 |
+
@pytest.mark.asyncio
|
| 365 |
+
async def test_native_images_and_boundary_failure_stop_before_generate():
|
| 366 |
+
engine, tokenizer = Engine(), Tokenizer()
|
| 367 |
+
async with httpx.AsyncClient(transport=httpx.MockTransport(engine)) as client:
|
| 368 |
+
backend = SGLangBackend(
|
| 369 |
+
"http://engine",
|
| 370 |
+
"model",
|
| 371 |
+
client=client,
|
| 372 |
+
native_tokenizer=NativeTokenizer(tokenizer),
|
| 373 |
+
)
|
| 374 |
+
await backend.start()
|
| 375 |
+
startup_calls = len(engine.calls)
|
| 376 |
+
labels, token_ids = backend.labels(2)
|
| 377 |
+
with pytest.raises(AdapterError) as error:
|
| 378 |
+
await backend.evaluate(
|
| 379 |
+
"look",
|
| 380 |
+
["https://example.com/a.png"],
|
| 381 |
+
labels,
|
| 382 |
+
token_ids,
|
| 383 |
+
None,
|
| 384 |
+
)
|
| 385 |
+
assert error.value.code == "native_images_not_supported"
|
| 386 |
+
assert tokenizer.calls == []
|
| 387 |
+
tokenizer.mutate_prefix = True
|
| 388 |
+
with pytest.raises(AdapterError) as error:
|
| 389 |
+
await backend.evaluate("pick", [], labels, token_ids, None)
|
| 390 |
+
assert error.value.code == "invalid_label_boundary"
|
| 391 |
+
assert len(engine.calls) == startup_calls
|
server/tests/test_protocol.py
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""CPU tests of request validation, prompt mapping, and decision probabilities."""
|
| 2 |
+
|
| 3 |
+
import json
|
| 4 |
+
import math
|
| 5 |
+
import string
|
| 6 |
+
import unittest
|
| 7 |
+
|
| 8 |
+
from pydantic import ValidationError
|
| 9 |
+
|
| 10 |
+
from jev_adapter.protocol import (
|
| 11 |
+
NATIVE_PROMPT_PREFIX,
|
| 12 |
+
SystemOneOptions,
|
| 13 |
+
SystemOneRequest,
|
| 14 |
+
build_prompt,
|
| 15 |
+
plan_question,
|
| 16 |
+
probabilities_from_logprobs,
|
| 17 |
+
reduce_probabilities,
|
| 18 |
+
rotation_order,
|
| 19 |
+
)
|
| 20 |
+
|
| 21 |
+
CANONICAL_LETTERS = tuple(string.ascii_uppercase)
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def runner_format_prompt(state, instructions, ordered):
|
| 25 |
+
"""Independent, verbatim port of run_suites_rotation.py's format_prompt/
|
| 26 |
+
option_texts, used as the parity oracle for wording="native" -- kept
|
| 27 |
+
separate from jev_adapter.protocol so a bug in the adapter's own port
|
| 28 |
+
cannot also hide in the test."""
|
| 29 |
+
text = (
|
| 30 |
+
state
|
| 31 |
+
if isinstance(state, str)
|
| 32 |
+
else json.dumps(state, sort_keys=True, ensure_ascii=False, indent=2, allow_nan=False)
|
| 33 |
+
)
|
| 34 |
+
lines = []
|
| 35 |
+
for position, (name, description) in enumerate(ordered):
|
| 36 |
+
lines.append(
|
| 37 |
+
f"{CANONICAL_LETTERS[position]}. {name}"
|
| 38 |
+
+ (f": {description}" if description else "")
|
| 39 |
+
)
|
| 40 |
+
return (
|
| 41 |
+
f"{NATIVE_PROMPT_PREFIX}\n\nState:\n{text}\n\nQuestion:\n{instructions}\n\nOptions:\n"
|
| 42 |
+
+ "\n".join(lines)
|
| 43 |
+
)
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
def request_for(question, **overrides):
|
| 47 |
+
return SystemOneRequest.model_validate(
|
| 48 |
+
{
|
| 49 |
+
"model": "test-model",
|
| 50 |
+
"state": "Customer needs help.",
|
| 51 |
+
"questions": {"routing": question},
|
| 52 |
+
**overrides,
|
| 53 |
+
}
|
| 54 |
+
)
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
def choice_question(**overrides):
|
| 58 |
+
return {
|
| 59 |
+
"type": "choice",
|
| 60 |
+
"instructions": "Which team?",
|
| 61 |
+
"criteria": {"billing": "Payment issue", "technical": None},
|
| 62 |
+
**overrides,
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
class TestSystemOneValidation(unittest.TestCase):
|
| 67 |
+
def test_preserves_question_and_option_order_and_structured_values(self):
|
| 68 |
+
request = request_for(
|
| 69 |
+
choice_question(criteria={"z": ["last", {"nested": True}], "a": None}),
|
| 70 |
+
state={"ticket": [7, "안녕하세요", None]},
|
| 71 |
+
questions={
|
| 72 |
+
"second": choice_question(criteria={"z": {"reason": 1}, "a": None}),
|
| 73 |
+
"first": {"type": "noul", "instructions": ["Is urgent?"]},
|
| 74 |
+
},
|
| 75 |
+
)
|
| 76 |
+
self.assertEqual(list(request.questions), ["second", "first"])
|
| 77 |
+
plan = plan_question(request.questions["second"])
|
| 78 |
+
self.assertEqual(plan.option_names, ("z", "a"))
|
| 79 |
+
self.assertEqual(plan.descriptions, ({"reason": 1}, None))
|
| 80 |
+
self.assertEqual(request.state["ticket"], [7, "안녕하세요", None])
|
| 81 |
+
|
| 82 |
+
def test_choice_accepts_255_but_rejects_256(self):
|
| 83 |
+
criteria = {str(index): None for index in range(255)}
|
| 84 |
+
request = request_for(choice_question(criteria=criteria))
|
| 85 |
+
self.assertEqual(
|
| 86 |
+
len(plan_question(request.questions["routing"]).option_names), 255
|
| 87 |
+
)
|
| 88 |
+
with self.assertRaises(ValidationError):
|
| 89 |
+
request_for(choice_question(criteria={**criteria, "255": None}))
|
| 90 |
+
|
| 91 |
+
def test_invalid_question_schemas(self):
|
| 92 |
+
cases = [
|
| 93 |
+
choice_question(type="arbitrary_json"),
|
| 94 |
+
choice_question(criteria={"only": None}),
|
| 95 |
+
choice_question(criteria={"": None, "b": None}),
|
| 96 |
+
choice_question(criteria={"a": 42, "b": None}),
|
| 97 |
+
choice_question(instructions=None),
|
| 98 |
+
choice_question(instructions=False),
|
| 99 |
+
choice_question(unrecognized=True),
|
| 100 |
+
{"type": "noul", "instructions": "Yes?", "criteria": {"true": "yes"}},
|
| 101 |
+
{
|
| 102 |
+
"type": "noul",
|
| 103 |
+
"instructions": "Yes?",
|
| 104 |
+
"criteria": {"yes": None, "no": None},
|
| 105 |
+
},
|
| 106 |
+
{"type": "score", "instructions": "Rate", "criteria": ["only"]},
|
| 107 |
+
{"type": "score", "instructions": "Rate", "criteria": [None] * 11},
|
| 108 |
+
{
|
| 109 |
+
"type": "score",
|
| 110 |
+
"instructions": "Rate",
|
| 111 |
+
"criteria": {"0": "low", "1": "high"},
|
| 112 |
+
},
|
| 113 |
+
]
|
| 114 |
+
for question in cases:
|
| 115 |
+
with self.subTest(question=question), self.assertRaises(ValidationError):
|
| 116 |
+
request_for(question)
|
| 117 |
+
|
| 118 |
+
def test_required_fields_and_request_limits(self):
|
| 119 |
+
for updates in (
|
| 120 |
+
{"model": " "},
|
| 121 |
+
{"model": 3},
|
| 122 |
+
{"state": 42},
|
| 123 |
+
{"state": None},
|
| 124 |
+
{"questions": {}},
|
| 125 |
+
{"questions": {" ": choice_question()}},
|
| 126 |
+
{"questions": {str(i): choice_question() for i in range(257)}},
|
| 127 |
+
):
|
| 128 |
+
with self.subTest(updates=updates), self.assertRaises(ValidationError):
|
| 129 |
+
request_for(choice_question(), **updates)
|
| 130 |
+
for field in ("model", "state", "questions"):
|
| 131 |
+
payload = request_for(choice_question()).model_dump()
|
| 132 |
+
del payload[field]
|
| 133 |
+
with self.subTest(missing=field), self.assertRaises(ValidationError):
|
| 134 |
+
SystemOneRequest.model_validate(payload)
|
| 135 |
+
|
| 136 |
+
def test_rejects_nonfinite_structured_json(self):
|
| 137 |
+
for number in (float("nan"), float("inf"), float("-inf")):
|
| 138 |
+
with self.subTest(number=number), self.assertRaises(ValidationError):
|
| 139 |
+
request_for(choice_question(), state={"nested": [number]})
|
| 140 |
+
|
| 141 |
+
def test_option_bounds_and_types(self):
|
| 142 |
+
for options in (
|
| 143 |
+
{"temperature": 0},
|
| 144 |
+
{"temperature": -1},
|
| 145 |
+
{"temperature": float("inf")},
|
| 146 |
+
{"temperature": float("nan")},
|
| 147 |
+
{"temperature": True},
|
| 148 |
+
{"temperature": "1"},
|
| 149 |
+
{"permutations": 0},
|
| 150 |
+
{"permutations": 17},
|
| 151 |
+
{"permutations": 1.5},
|
| 152 |
+
{"permutations": True},
|
| 153 |
+
{"return_logprobs": "true"},
|
| 154 |
+
{"return_logits": True},
|
| 155 |
+
{"assistant_prefix": 3},
|
| 156 |
+
):
|
| 157 |
+
with self.subTest(options=options), self.assertRaises(ValidationError):
|
| 158 |
+
request_for(choice_question(), options=options)
|
| 159 |
+
|
| 160 |
+
def test_image_sources(self):
|
| 161 |
+
request = request_for(
|
| 162 |
+
choice_question(),
|
| 163 |
+
images=["https://example.com/frame.png", "data:image/png;base64,YQ=="],
|
| 164 |
+
)
|
| 165 |
+
self.assertEqual(len(request.images), 2)
|
| 166 |
+
for image in ("file:///tmp/frame.png", "data:image/png;base64,", "https://", 7):
|
| 167 |
+
with self.subTest(image=image), self.assertRaises(ValidationError):
|
| 168 |
+
request_for(choice_question(), images=[image])
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
class TestSystemOnePrompts(unittest.TestCase):
|
| 172 |
+
def test_multicharacter_token_labels_request_the_complete_label(self):
|
| 173 |
+
plan = plan_question(request_for(choice_question()).questions["routing"])
|
| 174 |
+
prompt = build_prompt("state", plan, ["AA", "000"])
|
| 175 |
+
self.assertIn("the complete label before the colon", prompt)
|
| 176 |
+
self.assertTrue(prompt.endswith("AA: billing: Payment issue\n000: technical"))
|
| 177 |
+
|
| 178 |
+
def test_shared_prefix_and_rotation_preserve_option_meaning(self):
|
| 179 |
+
request = request_for(choice_question(), state={"b": 2, "a": "안녕"})
|
| 180 |
+
plan = plan_question(request.questions["routing"])
|
| 181 |
+
first = build_prompt(request.state, plan, ["A", "B"])
|
| 182 |
+
rotated = build_prompt(request.state, plan, ["A", "B"], rotation_order(2, 1))
|
| 183 |
+
self.assertTrue(first.startswith('Context:\n{"a": "안녕", "b": 2}\n\n'))
|
| 184 |
+
self.assertEqual(first.split("Options:\n")[0], rotated.split("Options:\n")[0])
|
| 185 |
+
self.assertTrue(first.endswith("A: billing: Payment issue\nB: technical"))
|
| 186 |
+
self.assertTrue(rotated.endswith("A: technical\nB: billing: Payment issue"))
|
| 187 |
+
|
| 188 |
+
def test_boolean_default_and_explicit_criteria(self):
|
| 189 |
+
request = request_for({"type": "noul", "instructions": "Urgent?"})
|
| 190 |
+
plan = plan_question(request.questions["routing"])
|
| 191 |
+
self.assertTrue(
|
| 192 |
+
build_prompt(request.state, plan, ["A", "B"]).endswith("A: yes\nB: no")
|
| 193 |
+
)
|
| 194 |
+
request = request_for(
|
| 195 |
+
{
|
| 196 |
+
"type": "noul",
|
| 197 |
+
"instructions": "Urgent?",
|
| 198 |
+
"criteria": {"false": "Can wait", "true": "Now"},
|
| 199 |
+
}
|
| 200 |
+
)
|
| 201 |
+
plan = plan_question(request.questions["routing"])
|
| 202 |
+
self.assertEqual(plan.option_names, ("true", "false"))
|
| 203 |
+
self.assertTrue(
|
| 204 |
+
build_prompt(request.state, plan, ["A", "B"]).endswith(
|
| 205 |
+
"A: yes: Now\nB: no: Can wait"
|
| 206 |
+
)
|
| 207 |
+
)
|
| 208 |
+
|
| 209 |
+
def test_invalid_label_and_option_mappings_fail(self):
|
| 210 |
+
plan = plan_question(request_for(choice_question()).questions["routing"])
|
| 211 |
+
for labels, order in (
|
| 212 |
+
(["A"], None),
|
| 213 |
+
(["A", "A"], None),
|
| 214 |
+
(["A", "B"], [0, 0]),
|
| 215 |
+
(["A", "B"], [0, True]),
|
| 216 |
+
):
|
| 217 |
+
with (
|
| 218 |
+
self.subTest(labels=labels, order=order),
|
| 219 |
+
self.assertRaises(ValueError),
|
| 220 |
+
):
|
| 221 |
+
build_prompt("state", plan, labels, order)
|
| 222 |
+
|
| 223 |
+
|
| 224 |
+
class TestNativePromptWording(unittest.TestCase):
|
| 225 |
+
"""wording="native" must match the jevbench-hard runner's own contract
|
| 226 |
+
(run_suites_rotation.py: PREFIX/format_prompt/option_texts) byte-for-byte;
|
| 227 |
+
``runner_format_prompt`` above is an independent port used as the oracle."""
|
| 228 |
+
|
| 229 |
+
def test_matches_runner_for_choice_across_rotations_with_json_state(self):
|
| 230 |
+
request = request_for(
|
| 231 |
+
choice_question(
|
| 232 |
+
criteria={"billing": "Payment issue", "technical": None, "sales": ""}
|
| 233 |
+
),
|
| 234 |
+
state={"ticket": [7, "안녕하세요", None], "z": 1},
|
| 235 |
+
)
|
| 236 |
+
plan = plan_question(request.questions["routing"])
|
| 237 |
+
labels = CANONICAL_LETTERS[:3]
|
| 238 |
+
raw_ordered = [
|
| 239 |
+
("billing", "Payment issue"),
|
| 240 |
+
("technical", None),
|
| 241 |
+
("sales", ""),
|
| 242 |
+
]
|
| 243 |
+
for rotation in range(3):
|
| 244 |
+
order = rotation_order(3, rotation)
|
| 245 |
+
mine = build_prompt(request.state, plan, labels, order, wording="native")
|
| 246 |
+
theirs = runner_format_prompt(
|
| 247 |
+
request.state,
|
| 248 |
+
plan.instructions,
|
| 249 |
+
[raw_ordered[i] for i in order],
|
| 250 |
+
)
|
| 251 |
+
with self.subTest(rotation=rotation):
|
| 252 |
+
self.assertEqual(mine, theirs)
|
| 253 |
+
self.assertTrue(mine.startswith(NATIVE_PROMPT_PREFIX + "\n\nState:\n"))
|
| 254 |
+
self.assertIn("\n\nQuestion:\n", mine)
|
| 255 |
+
|
| 256 |
+
def test_matches_runner_for_noul_and_score_with_string_state(self):
|
| 257 |
+
noul_plan = plan_question(
|
| 258 |
+
request_for(
|
| 259 |
+
{
|
| 260 |
+
"type": "noul",
|
| 261 |
+
"instructions": "Urgent?",
|
| 262 |
+
"criteria": {"true": "Now", "false": "Can wait"},
|
| 263 |
+
}
|
| 264 |
+
).questions["routing"]
|
| 265 |
+
)
|
| 266 |
+
mine = build_prompt(
|
| 267 |
+
"plain state text", noul_plan, ["A", "B"], None, wording="native"
|
| 268 |
+
)
|
| 269 |
+
theirs = runner_format_prompt(
|
| 270 |
+
"plain state text", "Urgent?", [("yes", "Now"), ("no", "Can wait")]
|
| 271 |
+
)
|
| 272 |
+
self.assertEqual(mine, theirs)
|
| 273 |
+
|
| 274 |
+
score_plan = plan_question(
|
| 275 |
+
request_for(
|
| 276 |
+
{"type": "score", "instructions": "Rate", "criteria": ["low", "medium", "high"]}
|
| 277 |
+
).questions["routing"]
|
| 278 |
+
)
|
| 279 |
+
mine = build_prompt("s", score_plan, ["A", "B", "C"], None, wording="native")
|
| 280 |
+
theirs = runner_format_prompt(
|
| 281 |
+
"s", "Rate", [("0", "low"), ("1", "medium"), ("2", "high")]
|
| 282 |
+
)
|
| 283 |
+
self.assertEqual(mine, theirs)
|
| 284 |
+
|
| 285 |
+
def test_falsy_description_is_omitted_like_the_runner(self):
|
| 286 |
+
# The runner's `f": {description}" if description else ""` treats an
|
| 287 |
+
# empty string the same as no description at all (a truthiness check,
|
| 288 |
+
# not `is not None`) -- ported deliberately, not "fixed".
|
| 289 |
+
plan = plan_question(
|
| 290 |
+
request_for(choice_question(criteria={"a": "", "b": None})).questions[
|
| 291 |
+
"routing"
|
| 292 |
+
]
|
| 293 |
+
)
|
| 294 |
+
prompt = build_prompt("s", plan, ["A", "B"], None, wording="native")
|
| 295 |
+
self.assertTrue(prompt.endswith("A. a\nB. b"))
|
| 296 |
+
|
| 297 |
+
def test_rejects_noncanonical_or_out_of_order_labels(self):
|
| 298 |
+
plan = plan_question(request_for(choice_question()).questions["routing"])
|
| 299 |
+
for labels in (["X", "Y"], ["B", "A"], ["A", "B", "C"]):
|
| 300 |
+
with self.subTest(labels=labels), self.assertRaises(ValueError):
|
| 301 |
+
build_prompt("s", plan, labels, None, wording="native")
|
| 302 |
+
|
| 303 |
+
def test_rejects_more_than_26_options(self):
|
| 304 |
+
criteria = {f"opt{i}": None for i in range(27)}
|
| 305 |
+
plan = plan_question(
|
| 306 |
+
request_for(choice_question(criteria=criteria)).questions["routing"]
|
| 307 |
+
)
|
| 308 |
+
with self.assertRaises(ValueError):
|
| 309 |
+
build_prompt("s", plan, CANONICAL_LETTERS[:26] + ("AA",), None, wording="native")
|
| 310 |
+
|
| 311 |
+
def test_unknown_wording_rejected(self):
|
| 312 |
+
plan = plan_question(request_for(choice_question()).questions["routing"])
|
| 313 |
+
with self.assertRaises(ValueError):
|
| 314 |
+
build_prompt("s", plan, ["A", "B"], None, wording="bogus")
|
| 315 |
+
|
| 316 |
+
def test_served_wording_is_unchanged_default(self):
|
| 317 |
+
plan = plan_question(request_for(choice_question()).questions["routing"])
|
| 318 |
+
explicit = build_prompt("s", plan, ["A", "B"], None, wording="served")
|
| 319 |
+
implicit = build_prompt("s", plan, ["A", "B"], None)
|
| 320 |
+
self.assertEqual(explicit, implicit)
|
| 321 |
+
self.assertTrue(implicit.startswith("Context:\n"))
|
| 322 |
+
|
| 323 |
+
|
| 324 |
+
class TestSystemOneProbabilityReduction(unittest.TestCase):
|
| 325 |
+
def setUp(self):
|
| 326 |
+
self.plan = plan_question(request_for(choice_question()).questions["routing"])
|
| 327 |
+
|
| 328 |
+
def test_softmax_is_shift_invariant_and_extreme_safe(self):
|
| 329 |
+
expected = probabilities_from_logprobs([-1, -3], temperature=2)
|
| 330 |
+
actual = probabilities_from_logprobs([-1001, -1003], temperature=2)
|
| 331 |
+
for left, right in zip(expected, actual):
|
| 332 |
+
self.assertAlmostEqual(left, right)
|
| 333 |
+
self.assertEqual(probabilities_from_logprobs([-1e308, 1e308], 1e-300), [0, 1])
|
| 334 |
+
|
| 335 |
+
def test_temperature_scaling_can_be_disabled(self):
|
| 336 |
+
vector = [-1, -3]
|
| 337 |
+
normal = reduce_probabilities(self.plan, [vector], [[0, 1]], SystemOneOptions())
|
| 338 |
+
disabled = reduce_probabilities(
|
| 339 |
+
self.plan,
|
| 340 |
+
[vector],
|
| 341 |
+
[[0, 1]],
|
| 342 |
+
SystemOneOptions(temperature=100, temperature_scaling=False),
|
| 343 |
+
)
|
| 344 |
+
softened = probabilities_from_logprobs(vector, temperature=100)
|
| 345 |
+
self.assertEqual(normal, disabled)
|
| 346 |
+
self.assertLess(softened[0], normal["probabilities"]["billing"])
|
| 347 |
+
|
| 348 |
+
def test_rotation_is_undone_before_probability_average(self):
|
| 349 |
+
answer = reduce_probabilities(
|
| 350 |
+
self.plan,
|
| 351 |
+
[[math.log(0.8), math.log(0.2)], [math.log(0.7), math.log(0.3)]],
|
| 352 |
+
[[0, 1], [1, 0]],
|
| 353 |
+
SystemOneOptions(permutations=2, return_logprobs=True),
|
| 354 |
+
)
|
| 355 |
+
self.assertAlmostEqual(answer["probabilities"]["billing"], 0.55)
|
| 356 |
+
self.assertAlmostEqual(answer["probabilities"]["technical"], 0.45)
|
| 357 |
+
self.assertEqual(answer["choice"], "billing")
|
| 358 |
+
self.assertEqual(
|
| 359 |
+
answer["logprobs"][1],
|
| 360 |
+
{"billing": math.log(0.3), "technical": math.log(0.7)},
|
| 361 |
+
)
|
| 362 |
+
|
| 363 |
+
def test_confidence_uniform_and_certain(self):
|
| 364 |
+
uniform = reduce_probabilities(
|
| 365 |
+
self.plan, [[-5, -5]], [[0, 1]], SystemOneOptions()
|
| 366 |
+
)
|
| 367 |
+
certain = reduce_probabilities(
|
| 368 |
+
self.plan, [[0, -1000]], [[0, 1]], SystemOneOptions()
|
| 369 |
+
)
|
| 370 |
+
self.assertAlmostEqual(uniform["confidence"], 0)
|
| 371 |
+
self.assertEqual(certain["confidence"], 1)
|
| 372 |
+
self.assertEqual(uniform["choice"], "billing") # Stable input-order tie break.
|
| 373 |
+
|
| 374 |
+
def test_score_expectation_structured_legend_and_entropy(self):
|
| 375 |
+
criteria = [{"severity": "low", "examples": ["A"]}, ["medium"], None]
|
| 376 |
+
plan = plan_question(
|
| 377 |
+
request_for(
|
| 378 |
+
{
|
| 379 |
+
"type": "score",
|
| 380 |
+
"instructions": {"task": "rate"},
|
| 381 |
+
"criteria": criteria,
|
| 382 |
+
}
|
| 383 |
+
).questions["routing"]
|
| 384 |
+
)
|
| 385 |
+
answer = reduce_probabilities(
|
| 386 |
+
plan,
|
| 387 |
+
[[math.log(0.25), math.log(0.25), math.log(0.5)]],
|
| 388 |
+
[[0, 1, 2]],
|
| 389 |
+
SystemOneOptions(),
|
| 390 |
+
)
|
| 391 |
+
self.assertAlmostEqual(answer["score"], 1.25)
|
| 392 |
+
self.assertEqual(
|
| 393 |
+
answer["legend"], {"0": criteria[0], "1": criteria[1], "2": None}
|
| 394 |
+
)
|
| 395 |
+
expected_entropy = -(0.5 * math.log(0.25) + 0.5 * math.log(0.5))
|
| 396 |
+
self.assertAlmostEqual(answer["confidence"], 1 - expected_entropy / math.log(3))
|
| 397 |
+
|
| 398 |
+
def test_noul_returns_probability_of_true_after_rotation(self):
|
| 399 |
+
plan = plan_question(
|
| 400 |
+
request_for({"type": "noul", "instructions": "Yes?"}).questions["routing"]
|
| 401 |
+
)
|
| 402 |
+
answer = reduce_probabilities(
|
| 403 |
+
plan, [[math.log(0.1), math.log(0.9)]], [[1, 0]], SystemOneOptions()
|
| 404 |
+
)
|
| 405 |
+
self.assertAlmostEqual(answer["noul"], 0.9)
|
| 406 |
+
self.assertEqual(set(answer), {"type", "noul"})
|
| 407 |
+
|
| 408 |
+
def test_missing_nonfinite_or_invalid_engine_output_fails(self):
|
| 409 |
+
for values in (
|
| 410 |
+
[None, -1],
|
| 411 |
+
[float("nan"), -1],
|
| 412 |
+
[float("inf"), -1],
|
| 413 |
+
[float("-inf"), -1],
|
| 414 |
+
["0", -1],
|
| 415 |
+
[True, -1],
|
| 416 |
+
):
|
| 417 |
+
with self.subTest(values=values), self.assertRaises(ValueError):
|
| 418 |
+
reduce_probabilities(self.plan, [values], [[0, 1]], SystemOneOptions())
|
| 419 |
+
for vectors, orders in (
|
| 420 |
+
([], []),
|
| 421 |
+
([[-1]], [[0, 1]]),
|
| 422 |
+
([[-1, -2]], []),
|
| 423 |
+
([[-1, -2]], [[0, 0]]),
|
| 424 |
+
):
|
| 425 |
+
with (
|
| 426 |
+
self.subTest(vectors=vectors, orders=orders),
|
| 427 |
+
self.assertRaises(ValueError),
|
| 428 |
+
):
|
| 429 |
+
reduce_probabilities(self.plan, vectors, orders, SystemOneOptions())
|
| 430 |
+
|
| 431 |
+
|
| 432 |
+
if __name__ == "__main__":
|
| 433 |
+
unittest.main()
|
special_tokens_map.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
tokenizer_config.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|