inferencekit-cli 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. inferencekit/__init__.py +9 -0
  2. inferencekit/__main__.py +5 -0
  3. inferencekit/analysis/__init__.py +1 -0
  4. inferencekit/analysis/ncu_csv.py +284 -0
  5. inferencekit/analysis/nsys_sqlite.py +518 -0
  6. inferencekit/canonical.py +104 -0
  7. inferencekit/checkpoint.py +396 -0
  8. inferencekit/cli.py +274 -0
  9. inferencekit/cuda/bw_peak.cu +252 -0
  10. inferencekit/cuda/torch_bw.py +60 -0
  11. inferencekit/engines/__init__.py +7 -0
  12. inferencekit/engines/adapters.py +190 -0
  13. inferencekit/engines/clip/__init__.py +13 -0
  14. inferencekit/engines/clip/comfyui.py +749 -0
  15. inferencekit/engines/clip/diffusers_ltx.py +601 -0
  16. inferencekit/engines/clip/noise.py +46 -0
  17. inferencekit/engines/clip/official_ltx.py +316 -0
  18. inferencekit/engines/clip/server.py +542 -0
  19. inferencekit/engines/clip/stepdump.py +182 -0
  20. inferencekit/engines/gates.py +94 -0
  21. inferencekit/engines/sglang_worker.py +86 -0
  22. inferencekit/engines/vllm_worker.py +129 -0
  23. inferencekit/evidence.py +427 -0
  24. inferencekit/gpuinfo.py +93 -0
  25. inferencekit/hardware.py +135 -0
  26. inferencekit/mcp_server.py +178 -0
  27. inferencekit/ops/__init__.py +30 -0
  28. inferencekit/ops/bench.py +184 -0
  29. inferencekit/ops/bench_audio.py +384 -0
  30. inferencekit/ops/bench_clip.py +819 -0
  31. inferencekit/ops/bench_image.py +393 -0
  32. inferencekit/ops/bench_rounds.py +297 -0
  33. inferencekit/ops/bench_serve.py +866 -0
  34. inferencekit/ops/ceiling.py +135 -0
  35. inferencekit/ops/compare.py +378 -0
  36. inferencekit/ops/correctness.py +153 -0
  37. inferencekit/ops/doctor.py +486 -0
  38. inferencekit/ops/gates.py +1772 -0
  39. inferencekit/ops/gates_clip.py +930 -0
  40. inferencekit/ops/intake.py +1321 -0
  41. inferencekit/ops/ledger.py +749 -0
  42. inferencekit/ops/manifest.py +309 -0
  43. inferencekit/ops/ncu.py +183 -0
  44. inferencekit/ops/nsys.py +224 -0
  45. inferencekit/ops/prompts.py +316 -0
  46. inferencekit/ops/quality.py +2161 -0
  47. inferencekit/ops/quality_clip.py +690 -0
  48. inferencekit/ops/quality_clip_steps.py +341 -0
  49. inferencekit/ops/report.py +317 -0
  50. inferencekit/ops/review.py +119 -0
  51. inferencekit/ops/rocprof.py +89 -0
  52. inferencekit/ops/roofline.py +392 -0
  53. inferencekit/ops/store.py +61 -0
  54. inferencekit/proc.py +172 -0
  55. inferencekit/prompts/ATTRIBUTION.md +56 -0
  56. inferencekit/prompts/__init__.py +167 -0
  57. inferencekit/prompts/build.py +518 -0
  58. inferencekit/prompts/dev-load.jsonl.gz +0 -0
  59. inferencekit/prompts/dev-load.manifest.json +212 -0
  60. inferencekit/prompts/dev.jsonl.gz +0 -0
  61. inferencekit/prompts/dev.manifest.json +214 -0
  62. inferencekit/prompts/exclusions.json +54 -0
  63. inferencekit/quality/__init__.py +23 -0
  64. inferencekit/quality/client.py +66 -0
  65. inferencekit/quality/data/gsm8k_LICENSE.txt +21 -0
  66. inferencekit/quality/fake.py +329 -0
  67. inferencekit/quality/gsm8k.py +224 -0
  68. inferencekit/quality/logprobs.py +106 -0
  69. inferencekit/quality/metrics.py +235 -0
  70. inferencekit/quality/niah.py +63 -0
  71. inferencekit/quality/parquet.py +296 -0
  72. inferencekit/quality/sampling.py +262 -0
  73. inferencekit/quality/step_replay.py +217 -0
  74. inferencekit/quality/video_metrics.py +304 -0
  75. inferencekit/registry.py +206 -0
  76. inferencekit/review/__init__.py +6 -0
  77. inferencekit/review/diff.py +163 -0
  78. inferencekit/review/media.py +181 -0
  79. inferencekit/review/page.py +920 -0
  80. inferencekit/review/rundir.py +844 -0
  81. inferencekit/roofline_headers.py +504 -0
  82. inferencekit/schemas/evidence.v1.json +130 -0
  83. inferencekit/schemas/evidence.v2.json +499 -0
  84. inferencekit/schemas/intake.v1.json +276 -0
  85. inferencekit/schemas/run-manifest.v1.json +118 -0
  86. inferencekit/serve/__init__.py +8 -0
  87. inferencekit/serve/audio_client.py +330 -0
  88. inferencekit/serve/client.py +446 -0
  89. inferencekit/serve/clip_client.py +351 -0
  90. inferencekit/serve/clip_rounds.py +429 -0
  91. inferencekit/serve/image_client.py +373 -0
  92. inferencekit/serve/loadgen.py +136 -0
  93. inferencekit/serve/metrics.py +203 -0
  94. inferencekit/serve/profiles.py +105 -0
  95. inferencekit/serve/prompts_io.py +125 -0
  96. inferencekit/serve/rounds.py +1111 -0
  97. inferencekit/serve/servers.py +897 -0
  98. inferencekit/stats.py +249 -0
  99. inferencekit_cli-0.1.0.dist-info/METADATA +233 -0
  100. inferencekit_cli-0.1.0.dist-info/RECORD +104 -0
  101. inferencekit_cli-0.1.0.dist-info/WHEEL +4 -0
  102. inferencekit_cli-0.1.0.dist-info/entry_points.txt +2 -0
  103. inferencekit_cli-0.1.0.dist-info/licenses/LICENSE +202 -0
  104. inferencekit_cli-0.1.0.dist-info/licenses/NOTICE +9 -0
inferencekit/stats.py ADDED
@@ -0,0 +1,249 @@
1
+ """Small, dependency-free statistics for benchmark rounds.
2
+
3
+ Benchmarks here produce few numbers (one per round, typically 5-30), so plain Python
4
+ is fast enough and keeps the logic easy to read. Randomness comes from
5
+ ``random.Random(seed)`` and only through ``rng.random()``, whose sequence Python
6
+ guarantees to be reproducible for a given seed; so a CI computed today and next
7
+ year from the same data is identical.
8
+
9
+ Contents
10
+ quantile / nearest_rank two percentile conventions (interpolated / an actual sample)
11
+ percentile_ci 95% percentile interval from bootstrap replicates
12
+ bootstrap_ci CI of a percentile, resampling whole *units* (clusters)
13
+ paired_ratio_ci CI of median(candidate) / median(baseline), resampling pairs
14
+ unpaired_ratio_ci same without pairing, for runs that cannot be paired
15
+ rounds_for_power how many rounds would make the CI narrow enough for decide()
16
+ decide verdict for a comparison (improved / regressed / ...)
17
+ combine_claims PASS / FAIL / UNPROVEN / NOT RUN across several checks
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import math
23
+ import random
24
+ import statistics
25
+ from typing import Hashable, Iterable, Sequence
26
+
27
+ Z95 = 1.959964
28
+ DEFAULT_RESAMPLES = 10_000
29
+ # A CI counts as "powered" (narrow enough to support a "no change" call) when its
30
+ # half-width is at most this fraction of the practical threshold.
31
+ POWER_RATIO = 0.75
32
+ # rounds_for_power multiplies its 1/sqrt(n) estimate by this, so that most reruns (not
33
+ # half of them) come out powered. Calibrated by simulation through paired_ratio_ci +
34
+ # decide: 85-100% of reruns powered at most noise/drift mixes (tests/test_stats.py).
35
+ POWER_MARGIN = 2.0
36
+
37
+
38
+ # --------------------------------------------------------------------------- percentiles
39
+
40
+ def quantile(xs: Sequence[float], p: float) -> float | None:
41
+ """Linear-interpolated percentile (p in 0..100), the numpy default. For summaries."""
42
+ if not xs:
43
+ return None
44
+ v = sorted(xs)
45
+ k = (len(v) - 1) * p / 100.0
46
+ lo = int(math.floor(k))
47
+ hi = min(lo + 1, len(v) - 1)
48
+ return v[lo] + (v[hi] - v[lo]) * (k - lo)
49
+
50
+
51
+ def nearest_rank(sorted_xs: Sequence[float], p: float) -> float | None:
52
+ """Nearest-rank percentile: the smallest sample with at least p% of samples <= it.
53
+
54
+ Unlike interpolation, the answer is always a value that was actually observed,
55
+ which is what you want inside a bootstrap (no invented in-between values).
56
+ """
57
+ n = len(sorted_xs)
58
+ if n == 0:
59
+ return None
60
+ rank = max(1, math.ceil(p / 100.0 * n))
61
+ return sorted_xs[min(rank, n) - 1]
62
+
63
+
64
+ def summarize(xs: Iterable[float]) -> dict:
65
+ """n / median / p95 / min / max / mean of a list (None-free)."""
66
+ v = [float(x) for x in xs if x is not None]
67
+ if not v:
68
+ return {"n": 0}
69
+ return {"n": len(v), "median": statistics.median(v), "p95": quantile(v, 95), "min": min(v), "max": max(v),
70
+ "mean": sum(v) / len(v)}
71
+
72
+
73
+ def percentile_ci(replicates: Sequence[float]) -> tuple[float | None, float | None]:
74
+ """95% percentile interval of bootstrap replicates.
75
+
76
+ With B sorted replicates the bounds are element floor(0.025 (B-1)) and
77
+ ceil(0.975 (B-1)): slightly conservative (never narrower than the exact quantiles).
78
+ NaN in any replicate means some resample had no defined value: the CI is undefined.
79
+ """
80
+ reps = [float(r) for r in replicates]
81
+ if not reps or any(math.isnan(r) for r in reps):
82
+ return None, None
83
+ reps.sort()
84
+ b = len(reps)
85
+ return reps[int(0.025 * (b - 1))], reps[int(math.ceil(0.975 * (b - 1)))]
86
+
87
+
88
+ def _draw(rng: random.Random, k: int) -> int:
89
+ # rng.random() is the only stream Python guarantees reproducible across versions.
90
+ return min(int(rng.random() * k), k - 1)
91
+
92
+
93
+ # --------------------------------------------------------------------------- bootstrap CIs
94
+
95
+ def bootstrap_ci(values: Sequence[float], units: Sequence[Hashable] | None = None, ps: Sequence[float] = (50,),
96
+ resamples: int = DEFAULT_RESAMPLES, seed: int = 0) -> dict[float, tuple[float | None, float | None]]:
97
+ """95% CI of nearest-rank percentiles ``ps`` of ``values``, by cluster bootstrap.
98
+
99
+ ``units[i]`` names the resampling unit of ``values[i]``. Values that share a unit
100
+ (e.g. all per-token latencies of one round) are correlated, so resampling them
101
+ one by one would understate the uncertainty. Instead each resample draws whole
102
+ units with replacement (as many draws as there are units) and keeps every value
103
+ of every drawn unit. With ``units=None`` each value is its own unit (ordinary
104
+ bootstrap). Returns ``{p: (lo, hi)}``; ``(None, None)`` with < 2 values or units.
105
+ """
106
+ if units is None:
107
+ units = list(range(len(values)))
108
+ by_unit: dict[Hashable, list[float]] = {}
109
+ for v, u in zip(values, units):
110
+ by_unit.setdefault(u, []).append(float(v))
111
+ groups = list(by_unit.values())
112
+ k = len(groups)
113
+ if len(values) < 2 or k < 2 or resamples <= 0:
114
+ return {p: (None, None) for p in ps}
115
+ rng = random.Random(seed)
116
+ reps: dict[float, list[float]] = {p: [] for p in ps}
117
+ for _ in range(resamples):
118
+ sample: list[float] = []
119
+ for _ in range(k):
120
+ sample.extend(groups[_draw(rng, k)])
121
+ sample.sort()
122
+ for p in ps:
123
+ reps[p].append(nearest_rank(sample, p))
124
+ return {p: percentile_ci(reps[p]) for p in ps}
125
+
126
+
127
+ def paired_ratio_ci(baseline: Sequence[float], candidate: Sequence[float], resamples: int = DEFAULT_RESAMPLES,
128
+ seed: int = 0) -> dict:
129
+ """Ratio of medians, candidate / baseline, with a paired bootstrap 95% CI.
130
+
131
+ ``baseline[i]`` and ``candidate[i]`` must come from the same round i (run back to
132
+ back). Resampling *pairs* keeps that link: anything that slowed round i for both
133
+ arms (a thermal dip, a noisy neighbour) moves numerator and denominator together
134
+ and largely cancels, which gives a narrower and more honest CI than resampling
135
+ the two arms independently.
136
+ """
137
+ n = min(len(baseline), len(candidate))
138
+ base, cand = [float(x) for x in baseline[:n]], [float(x) for x in candidate[:n]]
139
+ out = {"n_pairs": n, "ratio": None, "ci95": (None, None), "log_ratio_sd": None}
140
+ if n == 0 or statistics.median(base) == 0:
141
+ return out
142
+ out["ratio"] = statistics.median(cand) / statistics.median(base)
143
+ logs = [math.log(c / b) for b, c in zip(base, cand) if b > 0 and c > 0]
144
+ out["log_ratio_sd"] = statistics.stdev(logs) if len(logs) > 1 else (0.0 if logs else None)
145
+ if n < 2:
146
+ return out
147
+ rng = random.Random(seed)
148
+ reps = []
149
+ for _ in range(resamples):
150
+ idx = [_draw(rng, n) for _ in range(n)]
151
+ mb = statistics.median([base[i] for i in idx])
152
+ mc = statistics.median([cand[i] for i in idx])
153
+ reps.append(mc / mb if mb > 0 else float("nan"))
154
+ out["ci95"] = percentile_ci(reps)
155
+ return out
156
+
157
+
158
+ def unpaired_ratio_ci(baseline: Sequence[float], candidate: Sequence[float], resamples: int = DEFAULT_RESAMPLES,
159
+ seed: int = 0) -> dict:
160
+ """Ratio of medians with each arm resampled independently (no pairing available)."""
161
+ base, cand = [float(x) for x in baseline], [float(x) for x in candidate]
162
+ out = {"n_baseline": len(base), "n_candidate": len(cand), "ratio": None, "ci95": (None, None)}
163
+ if not base or not cand or statistics.median(base) == 0:
164
+ return out
165
+ out["ratio"] = statistics.median(cand) / statistics.median(base)
166
+ if len(base) < 2 or len(cand) < 2:
167
+ return out
168
+ rng = random.Random(seed)
169
+ reps = []
170
+ for _ in range(resamples):
171
+ mb = statistics.median([base[_draw(rng, len(base))] for _ in base])
172
+ mc = statistics.median([cand[_draw(rng, len(cand))] for _ in cand])
173
+ reps.append(mc / mb if mb > 0 else float("nan"))
174
+ out["ci95"] = percentile_ci(reps)
175
+ return out
176
+
177
+
178
+ # --------------------------------------------------------------------------- power and verdicts
179
+
180
+ def rounds_for_power(n: int, half_width: float | None, threshold: float, power_ratio: float = POWER_RATIO,
181
+ margin: float = POWER_MARGIN) -> int | None:
182
+ """Rounds per arm that would make decide() call the CI powered, from a pilot comparison.
183
+
184
+ ``n`` rounds gave a CI with this ``half_width`` (decide()'s, on the ratio scale); the
185
+ target is ``power_ratio * threshold``. A CI's half-width shrinks like 1/sqrt(n), so
186
+ n * (half_width / target)^2 rounds would hit the target on average -- which means only
187
+ about half of the reruns would. ``margin`` (2x) buys a large majority.
188
+
189
+ Why not the textbook 1.96 * SD / sqrt(n) of per-pair log ratios: decide() tests a
190
+ bootstrap CI of a *ratio of medians*. A median is noisier than a mean (about 1.25x the
191
+ standard error for normal data), and slow drift cancels only partly when each arm's
192
+ median is taken on its own. Scaling the half-width of the very CI that decide() uses
193
+ includes both effects. (Simulated with 2-3% per-round noise: n from the textbook
194
+ formula came out powered in only 3-15% of reruns.) With fewer than about 5 pilot rounds
195
+ the estimate is rough.
196
+ """
197
+ if half_width is None or n < 1 or not threshold:
198
+ return None
199
+ target = power_ratio * abs(threshold)
200
+ return max(2, int(math.ceil(margin * n * (half_width / target) ** 2 - 1e-9)))
201
+
202
+
203
+ def decide(ratio: float | None, lo: float | None, hi: float | None, threshold: float, higher_is_better: bool,
204
+ power_ratio: float = POWER_RATIO) -> dict:
205
+ """Turn a ratio CI into ``improved | regressed | within_noise | inconclusive``.
206
+
207
+ Work with g = the ratio oriented so that g > 1 is better. The checks run in this
208
+ order and the first that applies wins:
209
+ 1. no ratio or no CI -> inconclusive (no data)
210
+ 2. CI entirely below 1 and g <= 1 - threshold -> regressed
211
+ 3. CI entirely above 1 and g >= 1 + threshold -> improved
212
+ 4. CI inside [1 - threshold, 1 + threshold] and powered -> within_noise
213
+ 5. anything else -> inconclusive
214
+ "Powered" means the CI half-width is at most power_ratio x threshold: a CI that
215
+ happens to sit inside the band but is nearly as wide as it is not evidence of
216
+ "no change"; more rounds are needed.
217
+ """
218
+ if ratio is None or lo is None or hi is None or ratio <= 0 or lo <= 0:
219
+ return {"verdict": "inconclusive", "reason": "no ratio or no confidence interval (need >= 2 rounds per arm)"}
220
+ if higher_is_better:
221
+ g, g_lo, g_hi = ratio, lo, hi
222
+ else: # invert so that "faster" (smaller latency) is still g > 1
223
+ g, g_lo, g_hi = 1 / ratio, 1 / hi, 1 / lo
224
+ half_width = max(g - g_lo, g_hi - g)
225
+ powered = half_width <= power_ratio * threshold * (1 + 1e-9)
226
+ base = {"oriented_ratio": g, "oriented_ci95": [g_lo, g_hi], "half_width": half_width, "powered": powered}
227
+ if g_hi < 1 and g <= 1 - threshold:
228
+ return {**base, "verdict": "regressed", "reason": f"CI below 1 and change beyond -{threshold:.1%}"}
229
+ if g_lo > 1 and g >= 1 + threshold:
230
+ return {**base, "verdict": "improved", "reason": f"CI above 1 and change beyond +{threshold:.1%}"}
231
+ if g_lo >= 1 - threshold and g_hi <= 1 + threshold and powered:
232
+ return {**base, "verdict": "within_noise", "reason": f"CI inside +/-{threshold:.1%} and narrow enough"}
233
+ why = "CI too wide to decide" if not powered else "CI crosses the practical threshold"
234
+ return {**base, "verdict": "inconclusive", "reason": why}
235
+
236
+
237
+ def combine_claims(verdicts: Iterable[str]) -> str:
238
+ """Combine claim verdicts: any FAIL -> FAIL; else any UNPROVEN -> UNPROVEN; else PASS.
239
+
240
+ "NOT RUN" entries are ignored unless nothing else ran. Missing data is never a pass.
241
+ """
242
+ vs = [v for v in verdicts if v != "NOT RUN"]
243
+ if not vs:
244
+ return "NOT RUN"
245
+ if "FAIL" in vs:
246
+ return "FAIL"
247
+ if "UNPROVEN" in vs:
248
+ return "UNPROVEN"
249
+ return "PASS"
@@ -0,0 +1,233 @@
1
+ Metadata-Version: 2.5
2
+ Name: inferencekit-cli
3
+ Version: 0.1.0
4
+ Summary: Make your model serve faster on your GPU, and prove it. Skills for Claude Code, Codex and OpenCode, plus a CLI and MCP server: your agent picks and tunes inference engines, can write GPU kernels, and backs every number with client-timed benchmarks, anti-cheat gates and quality checks.
5
+ Project-URL: Homepage, https://github.com/kittenml/inferencekit
6
+ Project-URL: Repository, https://github.com/kittenml/inferencekit
7
+ Project-URL: Issues, https://github.com/kittenml/inferencekit/issues
8
+ Author: Stellon Labs
9
+ License-Expression: Apache-2.0
10
+ License-File: LICENSE
11
+ License-File: NOTICE
12
+ Keywords: benchmarking,capacity,correctness,cuda,gpu,inference,llama.cpp,llm,mcp,nsight-compute,nsight-systems,nvidia,profiling,quantization,roofline,serving,sglang,tensorrt-llm,vllm
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: GPU :: NVIDIA CUDA
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Science/Research
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
24
+ Classifier: Topic :: System :: Benchmark
25
+ Requires-Python: >=3.10
26
+ Requires-Dist: jsonschema>=4.20
27
+ Requires-Dist: pyyaml>=6.0
28
+ Provides-Extra: mcp
29
+ Requires-Dist: mcp<3,>=2.3; extra == 'mcp'
30
+ Description-Content-Type: text/markdown
31
+
32
+ <div align="center">
33
+
34
+ # inferencekit
35
+
36
+ **Turn your coding agent into an inference engineer.**
37
+
38
+ inferencekit made Gemma 4 run 1.33× faster than tuned vLLM. Your model is next.
39
+
40
+ [![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
41
+ [![PyPI: inferencekit-cli](https://img.shields.io/pypi/v/inferencekit-cli.svg?label=inferencekit-cli)](https://pypi.org/project/inferencekit-cli/)
42
+ [![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-d97757.svg)](#install)
43
+ [![Codex](https://img.shields.io/badge/Codex-plugin-111111.svg)](#install)
44
+ [![OpenCode](https://img.shields.io/badge/OpenCode-plugin-4a7bd0.svg)](#install)
45
+
46
+ [Install](#install) · [How it works](#how-it-works) · [Results](#results) · [Features](#features) · [Engines](https://github.com/kittenml/inferencekit-engines) · [Roadmap](#roadmap) · [Contributing](CONTRIBUTING.md)
47
+
48
+ ![Bar chart of speedups against engine baselines on the same hardware, including tuned vLLM and MLX-Audio: Gemma 4 26B-A4B on RTX 5090, 1.33× faster than tuned vLLM; LTX-2.5 on RTX PRO 6000, 1.25× faster than ComfyUI; Qwen3-8B on RTX 5090, 1.25× faster than default vLLM; Drama3 on Apple M4, 1.11× faster than tuned MLX-Audio; MOSS-Image-SFT on RX 9070 XT, 2.46× with quality secondary (FP8, 24 vs 50 steps; paired 95% CI 2.453–2.465×, lower bound 2.453×)](assets/hero-speedups.png)
49
+
50
+ </div>
51
+
52
+ inferencekit is a plugin for Claude Code, Codex and OpenCode, plus a command-line tool (CLI). Give your agent a model, hardware and a goal. It finds, benchmarks and tunes supported inference engines for your workload. You can stop with the best tested configuration or go further with custom optimizations, including GPU kernels.
53
+
54
+ ## How it works
55
+
56
+ inferencekit gives your agent the playbook and the tools of a senior inference engineer. On every run it works the problem the same way.
57
+
58
+ 1. **Understand the task.** The agent first asks about your goal, deadline, budget and how much the results may change, reusing answers you already gave. It identifies the model, hardware and real inputs, then estimates memory, compute and launch costs per request. Text, image, audio and video use their own metrics and quality checks.
59
+ 2. **Find and tune an engine.** It researches current implementations, then tunes and benchmarks supported engines (vLLM, SGLang, llama.cpp, TensorRT-LLM and others) for your workload on your hardware. The fastest tested configuration that meets your quality requirements can be the result, or the tuned baseline for further work.
60
+ 3. **Find the bottleneck.** It selects the profiler for your hardware: Nsight on NVIDIA, ROCm tools on AMD, or Instruments and Metal on Apple. It measures the critical path and investigates memory, compute and launch costs, checking current vendor docs when support is uncertain.
61
+ 4. **Investigate and implement, if requested.** Search current code, papers, compiler docs and engineering talks; inspect dispatch, IR and assembly when useful. Choose graph execution, fusion, matrix kernels, packing, state reuse or other techniques from measured bottlenecks. Independent implementations can run in parallel; integration and shared-device measurements stay isolated.
62
+ 5. **Prove every step.** Every change gets a fast correctness check and a timed screen; milestones get the full proof: interleaved rounds against the tuned baseline, the anti-cheat gates and quality against a reference model. Changes that miss the agreed performance or quality requirements are reverted.
63
+ 6. **Ship it.** You get the fastest proven configuration, its launch command, and a report with the commands that reproduce every number.
64
+
65
+ ## When it asks you
66
+
67
+ The agent works on its own and stops only when it needs you:
68
+
69
+ - **Missing details.** If you didn't say which model, GPU or workload, it asks before it starts.
70
+ - **Your preferences.** Choose exactly the same results, small differences with the same quality, or speed with an agreed quality tradeoff. Set your goal, spending, deadline and check-ins; it reuses answers you already gave.
71
+ - **Model changes.** Permission to simplify the model is separate from permission to use stronger compression. Plans are optional: ask to see one if you want it.
72
+ - **The budget cap.** When the run reaches the cap you set, it stops and asks.
73
+ - **Things only you can give.** For example, permission to read the GPU's profiler counters, or a Hugging Face token for a gated model.
74
+
75
+ Everything else runs without asking. For a hands-off run, approve a budget with a cap up front (`non_interactive: true` and `budget.approved: true` in the intake file); the agent then writes its questions and the choices it made to `QUESTIONS.md` instead of waiting for you.
76
+
77
+ ## Results
78
+
79
+ **Pushing speed on AMD:** with quality secondary, MOSS-Image-SFT reached **2.46×** faster image generation than the tested tuned vLLM-Omni baseline on a 16 GB RX 9070 XT.‡
80
+
81
+ Single-user decode for the language models; one clip at a time for video; single-user speech generation for Drama3.
82
+
83
+ | Engine | GPU | Speedup | Agent | Agent time | Tokens | Cost |
84
+ |---|---|---|---|---|---|---|
85
+ | [Gemma 4 26B-A4B (NVFP4)](https://github.com/kittenml/inferencekit-engines/tree/main/gemma-4-26b-a4b-nvfp4_rtx-5090) | RTX 5090 | **1.33×** vs tuned vLLM | Claude Opus 5.5 (high) | 19 h | 630M | $199 |
86
+ | [LTX-2.5 text-to-video](https://github.com/kittenml/inferencekit-engines/tree/main/ltx-2.5_rtx-pro-6000) | RTX PRO 6000 | **1.25×** vs ComfyUI | Claude Opus 5.5 (high) | 3.6 h | 47M | $18 |
87
+ | [Qwen3-8B (FP8)](https://github.com/kittenml/inferencekit-engines/tree/main/qwen3-8b-fp8_rtx-5090)* | RTX 5090 | **1.25×** vs vLLM | Claude Opus 5.5 (xhigh) | about 10 h | about 240M | about $125 |
88
+ | [Drama3 speech](https://github.com/haaziq-sl/inferencekit-engines/tree/main/drama-3_apple-m4-16gb/profiles/main5-tower5)† | Apple M4 (16 GB) | **1.112×** vs tuned MLX-Audio | GPT-6.1 Sol (high) | ~70 h elapsed | ~2.07B | ~$475 standard-rate equivalent |
89
+ | [MOSS-Image-SFT (FP8)](https://github.com/haaziq-sl/inferencekit-engines/tree/main/moss-image-sft_rx-9070-xt-fp8)‡ | RX 9070 XT (16 GB) | **2.46×** vs tuned vLLM-Omni | GPT-6.1 Terra (high) | ~19.6 h elapsed | ~1.80B | ~$206 standard-rate equivalent |
90
+
91
+ <sub>* Against vLLM with its default settings; neither side uses speculative decoding. † Drama3 used identical quantized weights and matched PCM audio, codes, chunks and completion in 144 fresh output pairs. Four paired timing rounds gave a 95% CI of 1.059×–1.156×. [Comparison details](https://github.com/haaziq-sl/inferencekit-engines/tree/main/drama-3_apple-m4-16gb/profiles/main5-tower5).</sub>
92
+
93
+ <sub>‡ Lossy speed-first experiment: FP8/24 steps vs BF16/50 steps; paired 95% CI **2.453–2.465×**, conservative lower bound **2.453×**. [Outputs, timing and accounting](https://github.com/haaziq-sl/inferencekit-engines/tree/main/moss-image-sft_rx-9070-xt-fp8/).</sub>
94
+
95
+ Time and tokens include setup, benchmarking, optimization, validation and reporting. Costs are API list-price estimates; most tokens are cached conversation reads. Drama3’s estimates cover direct agent work ([accounting](https://github.com/haaziq-sl/inferencekit-engines/blob/main/drama-3_apple-m4-16gb/ACCOUNTING_V65.json)). How each engine was built and measured: [inferencekit-engines](https://github.com/kittenml/inferencekit-engines).
96
+
97
+ ## Speed you can trust
98
+
99
+ Fast is easy. Fast and still correct is the hard part, and it's the part agents skip.
100
+
101
+ Agents are good at finding speed. They're also good at finding fake speed: a cached answer, a shorter reply, a different video. inferencekit keeps only the speed that's real.
102
+
103
+ Without these checks, one agent thought its video engine was 2% faster, but it was rendering a completely different video. Another was sure it had a 1.12× speedup; measured again on a clean machine, its engine was 5% slower than where it started.
104
+
105
+ A speedup counts only when both engines pass every check that applies.
106
+
107
+ | A way to game a benchmark | What catches it |
108
+ |---|---|
109
+ | Answer repeated prompts from a cache | `caching`: a replayed prompt may not be over 10% faster; a prompt changed by one character may not get the old answer |
110
+ | Report more tokens than were made | `token_count`: the reported count must match the streamed tokens and the re-tokenized text |
111
+ | Stop early or cut answers short | `output_length`: with end-of-text ignored, every answer must be exactly the requested length |
112
+ | Drop rare tokens from the vocabulary | `rare_tokens`: random CJK text, emoji, long numbers and code names must come back exactly |
113
+ | Ignore sampling settings or fake probabilities | `hidden_probes`: temperature must change answers; probabilities must be valid |
114
+ | Use another chat template so prompts get shorter | Render check: every prompt must become the same number of tokens as on the baseline |
115
+ | Speculative decoding that changes answers | `spec_exact`: greedy answers must match the same engine with speculation off |
116
+ | Lower quality for speed | Quality vs a reference, GSM8K, per-step video check |
117
+ | Numbers that only hold on the agent's machine | Every run writes `manifest.json` with each engine's install and launch commands, so anyone can re-run it on a clean machine, on prompts sealed with `inferencekit prompts seal` that the agent never saw |
118
+
119
+ Each check ends PASS, FAIL, UNPROVEN (not enough evidence) or NOT RUN. A missing check is never a pass.
120
+
121
+ ## Features
122
+
123
+ - **9 skills, 4 commands, 5 read-only subagents and an MCP server**, the same in every supported agent.
124
+ - **Speed-of-light ceilings:** measured memory bandwidth (`ceiling bw`) and exact bytes per token read from the checkpoint's safetensors headers (`roofline`), including NVFP4, FP8 and mixture-of-experts models.
125
+ - **Engine triage and tuning:** vLLM, SGLang, llama.cpp, TensorRT-LLM, ComfyUI, Diffusers and others. Only settings that the engine's own logs show in effect are counted.
126
+ - **Kernel work:** profiling routed by hardware, CUDA/HIP, Triton and Metal kernels, and torch.compile. The included engine skeleton targets NVIDIA CUDA.
127
+ - **One timer for every engine:** interleaved rounds in a balanced order, medians with 95% confidence intervals.
128
+ - **Anti-cheat gates:** caching, token counts, output length, rare tokens, sampling probes, prompt rendering, speculative-decoding exactness.
129
+ - **Quality checks:** reference quality and GSM8K for language models; latent and final-clip checks for video. Images and speech use client timing and structural checks plus an external semantic quality protocol; see [media benchmarks](docs/media-benchmarks.md).
130
+ - **Budget control:** spending authorized up front, with caps in hardware hours, dollars and elapsed time. No repeated plan approval inside the agreed scope.
131
+ - **Reproducible output:** a ranked table labelled PASS, FAIL, UNPROVEN or NOT RUN, a launch command, a review page and the commands that reproduce every number.
132
+
133
+ ### Tools behind each step
134
+
135
+ | Step | Tools |
136
+ |---|---|
137
+ | Size the problem | `intake`, `doctor`, `ceiling bw`, `roofline` |
138
+ | Start from the best engine | `bench rounds`, `gates run`, `quality` |
139
+ | Find the bottleneck | `doctor` routes profiling; Nsight commands on NVIDIA, vendor tools on AMD/Apple |
140
+ | Pull the right levers, prove every step | `correctness`, `bench rounds`, `gates run`, `quality` |
141
+ | Ship it | `ledger`, `review`, `report` |
142
+
143
+ ## Install
144
+
145
+ Requirements: [uv](https://docs.astral.sh/uv/) and Python 3.10 or newer. Install the engine runtime for your hardware. NVIDIA capture commands require CUDA and Nsight; AMD and Apple profiling uses vendor tools with separate evidence files. See [supported hardware](#supported-hardware-and-agents).
146
+
147
+ ### Claude Code
148
+
149
+ ```bash
150
+ claude plugin marketplace add kittenml/inferencekit
151
+ claude plugin install inferencekit@inferencekit
152
+ ```
153
+
154
+ ### Codex
155
+
156
+ ```bash
157
+ codex plugin marketplace add kittenml/inferencekit
158
+ codex plugin add inferencekit@inferencekit
159
+ ```
160
+
161
+ ### OpenCode
162
+
163
+ ```bash
164
+ git clone --depth 1 https://github.com/kittenml/inferencekit ~/.local/share/inferencekit
165
+ python3 ~/.local/share/inferencekit/plugin/opencode/install.py
166
+ ```
167
+
168
+ | Agent | Commands | Check the install |
169
+ |---|---|---|
170
+ | Claude Code | `/inferencekit:optimize-inference`, `/inferencekit:bench`, `/inferencekit:profile`, `/inferencekit:perf-report` | `claude plugin list`; `/mcp` lists the inferencekit server |
171
+ | Codex | same stages; subagent files are followed one at a time where Codex has no subagents | `codex plugin list`; `codex mcp list` |
172
+ | OpenCode | `/optimize-inference`, `/bench`, `/profile`, `/perf-report`, and each skill as `/<skill-name>` | `opencode mcp list` |
173
+
174
+ Updating, removing, per-project installs and OpenCode's options: [docs/install.md](docs/install.md).
175
+
176
+ ## Try it
177
+
178
+ ```text
179
+ /inferencekit:optimize-inference Qwen/Qwen3-8B-FP8 on 1x RTX 5090, fastest single-user decode, by 6h
180
+ ```
181
+
182
+ To tune existing engines without custom kernels:
183
+
184
+ ```text
185
+ /inferencekit:optimize-inference Tune vLLM and SGLang for my model and GPU using their built-in settings only; do not write custom kernels.
186
+ ```
187
+
188
+ In OpenCode the command is `/optimize-inference`. It asks only for missing preferences and spending authorization; a plan is optional. For a repeatable setup, start from an intake file: `inferencekit intake template --out intake.yaml`, then `/inferencekit:optimize-inference intake.yaml`. For unattended runs, set `non_interactive: true` and `budget.approved: true` with a cap.
189
+
190
+ More things to ask for: [docs/examples.md](docs/examples.md).
191
+
192
+ ## CLI and MCP server
193
+
194
+ ```bash
195
+ uv tool install "inferencekit-cli==0.1.0"
196
+ inferencekit doctor # GPU, driver, CUDA, profiler access
197
+ inferencekit gates run --base-url http://127.0.0.1:8000 # anti-cheat gates on any OpenAI-compatible server
198
+ uvx --from 'inferencekit-cli[mcp]==0.1.0' inferencekit mcp serve # MCP server (stdio) for any MCP client
199
+ ```
200
+
201
+ Every CLI command is also an MCP tool with the same arguments. Text benchmarks, gates and quality checks talk HTTP to OpenAI-compatible servers. Image and streamed speech measurements use the [media adapter contracts](docs/media-benchmarks.md).
202
+
203
+ ## Supported hardware and agents
204
+
205
+ | | Status | Run end to end |
206
+ |---|---|---|
207
+ | NVIDIA GPUs (CUDA) | Full tool set | Yes: RTX 5090, RTX PRO 6000 |
208
+ | AMD ROCm GPUs, Apple silicon | Hardware discovery and vendor profiling guidance; HTTP benchmarks; vendor bandwidth/captures collected externally | RX 9070 XT and Apple M4 case studies above |
209
+ | x86 CPUs | Skills and HTTP benchmarks; platform profiling collected externally | No |
210
+ | ARM CPUs | Not covered | No |
211
+ | Language models | Benchmarks, gates, GSM8K, quality vs a reference | Yes |
212
+ | Text-to-video | Per-clip timing, per-step check, final-clip PSNR | Yes |
213
+ | Text-to-image | Client-timed decoded images and structural checks; external quality proof required | No |
214
+ | Speech models | Client-timed streamed PCM, first-signal latency, RTF and underruns; external quality proof required | No |
215
+ | Claude Code | Supported | Yes |
216
+ | Codex, OpenCode | Install paths and CI install checks | No |
217
+
218
+ Profiles and logs can contain environment variables, host names and paths: scan them before you share them.
219
+
220
+ ## Roadmap
221
+
222
+ - **More hardware:** H100, H200, B200, RTX 4090, Intel GPUs and Jetson, with the hardware tools (`doctor`, `ceiling bw`, profiling) for each.
223
+ - **More models and modalities:** speech (TTS and STT), image, more video models.
224
+ - **Multi-user serving:** published results for many users at once (load sweeps), not just one user at a time.
225
+ - **OpenCode end to end.**
226
+
227
+ ## Contributing
228
+
229
+ We welcome bug reports, engine settings and new skills. See [CONTRIBUTING.md](CONTRIBUTING.md). Develop with `uv sync --all-extras`, then `uv run --all-extras pytest -q` (no GPU needed). Report security problems privately: [SECURITY.md](SECURITY.md).
230
+
231
+ ## License
232
+
233
+ Apache-2.0: [LICENSE](LICENSE) and [NOTICE](NOTICE). Copyright 2026 Stellon Labs. inferencekit is an independent project, not affiliated with NVIDIA, any engine project or any model publisher. Product and model names belong to their owners. Every result holds for the GPU, driver, engine version, model and workload it was measured on; change any of them and the numbers can change. The software comes with no warranty, as the Apache-2.0 licence states, and you are responsible for the cost of any GPU time you use with it.
@@ -0,0 +1,104 @@
1
+ inferencekit/__init__.py,sha256=PJmV9jtnKhDfQa9G90COALhzphb0ki25xKjSblnG-qU,378
2
+ inferencekit/__main__.py,sha256=7i0SjFFDvEJVQuG69KjaoiDdQ7GthDgLM5JBaKrPJvQ,149
3
+ inferencekit/canonical.py,sha256=UOKPEblWi--MqN9KYSctu5Y_loWyV9rN8EKcYH-z26g,4187
4
+ inferencekit/checkpoint.py,sha256=mIKBWz_kg4zcQxNt8rLjhkk2kslrbtmfZg6kZt8M4dk,16602
5
+ inferencekit/cli.py,sha256=jt_t1-3udOXWt3-Qz3oFJiPeLxaxmmRuR5bNrcr1X-Q,13336
6
+ inferencekit/evidence.py,sha256=gRhxNJtNinQ0bXr4zteBEqoqikr5Wfs2OrW5tV4gQ8Y,18864
7
+ inferencekit/gpuinfo.py,sha256=RJuv5UpeYW4o0VBnzv9TgfNErF4zOdVLzyGiR2xsXuk,3600
8
+ inferencekit/hardware.py,sha256=fHTq-VmSp3UxTZl4PUlJFhN7ZeDT1SO6vZQ57c9g3pI,6592
9
+ inferencekit/mcp_server.py,sha256=RIp7L4l_AU7qnjTV1ftHpfxGA7X8YitHRFvF5vWmFAg,8944
10
+ inferencekit/proc.py,sha256=llS8tKL7Cgv8zHASmRc879DHUno0kroi-aaNmYd1z5c,8144
11
+ inferencekit/registry.py,sha256=xf3NzzXM0lqnYQQNQLSZTibZt6xUd8hwWzshOAZ8ieI,7587
12
+ inferencekit/roofline_headers.py,sha256=4U7Dv3SBO_mLbTTwSDJAGePEFLDO_ZsagzQZMrvmvEY,25598
13
+ inferencekit/stats.py,sha256=4Ow1aGdSQYdyohaIKtMRySO_A-gRN30VgUkMgMxFuAI,12045
14
+ inferencekit/analysis/__init__.py,sha256=PpsmjGnAkH22GjmMe2bY4BFU56YIW-mWjtJuPUSKPeE,98
15
+ inferencekit/analysis/ncu_csv.py,sha256=MiIduu3QPN4c4dYxqFOJmK-DMFML6ibbCimHuKWm-jg,14417
16
+ inferencekit/analysis/nsys_sqlite.py,sha256=hVGNPfuJOuPSdp-rO6M9QnTyWy1Y2hpXYyywM6Dav-4,25901
17
+ inferencekit/cuda/bw_peak.cu,sha256=LkiVtN5Kawqad4KgiNp_Q_qSuJl8s5FzsOtTsKe2uko,11205
18
+ inferencekit/cuda/torch_bw.py,sha256=8VxbGCZ8jdoY_fBrYn7Kqc6_uXFHdkoDe3-mwiHdYkk,2524
19
+ inferencekit/engines/__init__.py,sha256=mRrlkPZ7CKwD2qsx8XIZxU0QEmWQj3Otq1BjFlXfPCw,353
20
+ inferencekit/engines/adapters.py,sha256=NGSrAKqeBbrfC8EuI8OMs7eOcmE4dygr93xD5bi8aCQ,9844
21
+ inferencekit/engines/gates.py,sha256=t9FDgheJyZiXHqy4i2W5gf4rUo7CRM1-d4T5Sge60t0,4929
22
+ inferencekit/engines/sglang_worker.py,sha256=JsF8qvDIjyBfcQBVl2b6HBbotcM4NuIEmJiVh1wRWrM,3602
23
+ inferencekit/engines/vllm_worker.py,sha256=zg34kpR7klRYjrmY-z__MCBSC0meuKkVhREyb9ilugE,5638
24
+ inferencekit/engines/clip/__init__.py,sha256=Eu9KiTRUoHLYT1Puqyd_i9L7F2WY2Aqu-vls1jVUe2s,879
25
+ inferencekit/engines/clip/comfyui.py,sha256=ts55pn1xF8RmcKsTGpITAh2_BfhNx4k6HCqdGKEhRdw,40169
26
+ inferencekit/engines/clip/diffusers_ltx.py,sha256=ap_bvVu3Ai08SeqyLIHqIdH23uzWI_dXRIxykMSQbfs,34596
27
+ inferencekit/engines/clip/noise.py,sha256=_jIqqfnJDtChjqbopOw7fS8GPGp0DlxGcDho6DfeBI0,2154
28
+ inferencekit/engines/clip/official_ltx.py,sha256=fOfz8_69xgYHsuscm-7uEyv3VZhIyY9OVcimFuCRvas,17747
29
+ inferencekit/engines/clip/server.py,sha256=nc5JCXJTMMALY-9yLzOwTN80LhwCtAEMoSCcQ0kVKzA,24501
30
+ inferencekit/engines/clip/stepdump.py,sha256=L_TQVvv3nolvwUY7W8fx67Dw_9fPoXkI8rMnMFERs_M,8698
31
+ inferencekit/ops/__init__.py,sha256=DAmvBcl1SoTQI-RyTnjgV7XTfmNMayPCLcBOSCFczxA,1140
32
+ inferencekit/ops/bench.py,sha256=89GmgkmtMtkZoUIjntcnDVz3gAOzs4WUNCjtu_ZNKF8,10630
33
+ inferencekit/ops/bench_audio.py,sha256=2nr4DCSQGa8Xdd3ClJKs0Iyuaf_w9xe6e2GLXK9sPls,25787
34
+ inferencekit/ops/bench_clip.py,sha256=Kcfe396Tz0CbQ0U9TCtKZPz3Y2VeajSVwEpPO3QwPbc,49376
35
+ inferencekit/ops/bench_image.py,sha256=x18X8HNpkSRxZi_K-mFGzmBSVLOwMctGsimg1osIRfo,24948
36
+ inferencekit/ops/bench_rounds.py,sha256=JozJWlsWAvt4hB5GFKLqcrrcXhOD3z9f70CwSYXnds4,21028
37
+ inferencekit/ops/bench_serve.py,sha256=6e9gOXYhWQ7JdwEYou3g_LXsfXdKp_-Ak7D_mhUeTss,53226
38
+ inferencekit/ops/ceiling.py,sha256=NHmTxoNWkr0uAy8rbx1xafiY6xByCnSV7WSqHtaBwdQ,7470
39
+ inferencekit/ops/compare.py,sha256=hgA2B4pRhkH6vAnj8aPzOtfK3cOVUrk9P5GLtkC23iY,24787
40
+ inferencekit/ops/correctness.py,sha256=PmTUkDUr1PsZS9IIDM9tZuutEaa8_rSeLFryyAM_eho,7861
41
+ inferencekit/ops/doctor.py,sha256=q-qLNzRMjtOTqoPKB2cgPK3GGIpEYNVZAm_wbauKH1c,25866
42
+ inferencekit/ops/gates.py,sha256=TrL5GL-Z5Wicve3oBlwF6PZBLK0jcufknN9ViOmI_ng,99334
43
+ inferencekit/ops/gates_clip.py,sha256=l-3lgBtn8RSdZgoJiyuSqMDQoASGQNkVcjAFEhbhPjU,55608
44
+ inferencekit/ops/intake.py,sha256=OoFRi_7YTeM9adj7Cz-GNNdTkpvVj8RcHfX625a8y3c,75411
45
+ inferencekit/ops/ledger.py,sha256=1YvpD5nRediCBBa9tSsqb36_u_dPIfIXKkYLz_pQxTg,39492
46
+ inferencekit/ops/manifest.py,sha256=QnKzucYxoXi3iZ2ZOcsu6oIS9kK3A--wI6noELvhMtQ,17621
47
+ inferencekit/ops/ncu.py,sha256=KUQ7ExsEW8pmA5-M8USeG9MgD5Zu5L_C2hhipb6qVvc,10866
48
+ inferencekit/ops/nsys.py,sha256=ocUgmOfT4VgyhpJhWbqu1nHJkY6a64hhx-Ip3-etYa4,13623
49
+ inferencekit/ops/prompts.py,sha256=KZm7ufbLndli-QTtIGO6HLyNqUZ93CTQY8BMoO4Tvxs,16321
50
+ inferencekit/ops/quality.py,sha256=Ib9DQK_ybDFBoLSlKPN81-tJuPEyDw-5SLuCqqFwrnw,129400
51
+ inferencekit/ops/quality_clip.py,sha256=Uj6NTx-HkmqpX992Lx1iEUud6zKxZZtG0utRcI91Y14,42255
52
+ inferencekit/ops/quality_clip_steps.py,sha256=E7CnwAUC3TWmThby_VcALoI5-RkP1T9k7r38hNlQNYg,21885
53
+ inferencekit/ops/report.py,sha256=SXXpxZ_8zhngoBrcXQFhAhEMiwVvdI0-OLGKeEFFOM0,17306
54
+ inferencekit/ops/review.py,sha256=2lYrLVtxcf7pTDuSQbNQ9BGAQMIZIG8lHVrqi3J_d8M,6241
55
+ inferencekit/ops/rocprof.py,sha256=09-UK6_3p9JMJ7ztBD_q0Yzifu8X2zUqNRNalBUgHyA,5356
56
+ inferencekit/ops/roofline.py,sha256=ZU34aygsNkUcBxBKfvzuri52TRfCp_UTq-iEl7aGlCk,22317
57
+ inferencekit/ops/store.py,sha256=BBwvO5qML3Z442DH5SgYEpYRXbjnKzlGlyN4jOpm7fc,3049
58
+ inferencekit/prompts/ATTRIBUTION.md,sha256=zppCL-BM8dXbBvDHLqm2R2NWfavwEidY3yWRnPJhGkc,3900
59
+ inferencekit/prompts/__init__.py,sha256=w66vzdYU-geXKO-22svk6vUmNmPg9ph1VYBYeuiAClk,6347
60
+ inferencekit/prompts/build.py,sha256=VEcpCuxkRRjQOi2FXxlJoqjvSCgaox4-FHKA9WMMNLk,26840
61
+ inferencekit/prompts/dev-load.jsonl.gz,sha256=uHFhk6_e7ijropWthUkciP--itSBjXVC6v7q-9jtsQ8,239038
62
+ inferencekit/prompts/dev-load.manifest.json,sha256=WTGYf-z4o3_Oqx3Dlxi0Z9eHs27R66N4O8XeOZ4r-5Y,8001
63
+ inferencekit/prompts/dev.jsonl.gz,sha256=Cavr1imNrBrNwtvAOHl6ySYJF7aJGSl4lnN7i0WKV9A,87529
64
+ inferencekit/prompts/dev.manifest.json,sha256=C55Un2fKfH1ytaEQFnpqy-z0PJoN1KPPWImk3D-yd64,8031
65
+ inferencekit/prompts/exclusions.json,sha256=HgWDMSd7O5xnuFeamUoHljPOMPK-wc_L6HBSU2kNTYY,2203
66
+ inferencekit/quality/__init__.py,sha256=ELORbnqiu8pkHuFVAauZA80Nc5t-Wptu9qsoZv4vvzw,1463
67
+ inferencekit/quality/client.py,sha256=1sf2dThe3vcwq6pypQlsfrYULvbAy8mdK_5Fbq3xbvg,2597
68
+ inferencekit/quality/fake.py,sha256=CdHlJf3J-LWqiWrehQEq315FfGV3ua0gsQ6BKVIw6So,16319
69
+ inferencekit/quality/gsm8k.py,sha256=HEWkqT6Zq9bvxSnLhj53HLbytysw8zP_c9OGxq0rWiM,9959
70
+ inferencekit/quality/logprobs.py,sha256=0UQfWUkRHV_o0gOrpNYdDrCpNa1SiSAr0vDOhTPJ9ac,4625
71
+ inferencekit/quality/metrics.py,sha256=PFOgzPrxJkEFv82Cc4G3KYZkX4jiEbKnwYk2CrTJpNg,10407
72
+ inferencekit/quality/niah.py,sha256=FAYe76LmDoqYfxzS2qDypZiWs3x7tI_bha9LxL0AR8c,3515
73
+ inferencekit/quality/parquet.py,sha256=HGI88TssEGqEAs6UJ1wpAXCWIntMBa5F4nVwg8QGtaM,11267
74
+ inferencekit/quality/sampling.py,sha256=he-pLZXCIz2bK7YuGj197EXxXo2j4n2XZiBPMg92DgU,14739
75
+ inferencekit/quality/step_replay.py,sha256=T-cPg8s7RKXLrqa0U_ogfipW8m3U-5umKUL_a7EKwFY,9856
76
+ inferencekit/quality/video_metrics.py,sha256=c9EXoOr28Cm8WTe8V0enr8ENMGYhjDFX-JRMP8ESSjs,14356
77
+ inferencekit/quality/data/gsm8k_LICENSE.txt,sha256=hru3PoVYIdfEAZEv1L-C40MT5uO2_W-QnytsyeIJpTs,1062
78
+ inferencekit/review/__init__.py,sha256=OvarRG6lMYdrU4tl9pKEx67nywwKkk9xKhAnHKh5ujc,320
79
+ inferencekit/review/diff.py,sha256=cnR3_ydwL5lom0DN0wqrp1uNkmBO64bzbSBHnQvdwLI,6805
80
+ inferencekit/review/media.py,sha256=Evrbg4ueHOATsovO7Gw4xZf8KiO3ip8MOkVX3VOnfBo,9192
81
+ inferencekit/review/page.py,sha256=Ty_vH5ZjcbaZ4hCDn903KsUMPkqsQyeZYkQVG5zQfNQ,51471
82
+ inferencekit/review/rundir.py,sha256=2T3Dbd_Ee1LTHFGsvhNy6E4-ckpAAvE20sjVtHgejxg,43505
83
+ inferencekit/serve/__init__.py,sha256=El5XiZMZJn89O0k_oHyEmDxFYHt0wiXNi0pYuAySmZg,518
84
+ inferencekit/serve/audio_client.py,sha256=Qqut5YjmtkC38do8NQYwHGK8BEKGKbaLUKo6xCiSX_c,15041
85
+ inferencekit/serve/client.py,sha256=cQbOcLOwBNCuqjjakOJn3k9sZ6Ho16cI9ZET8whgsJ0,18755
86
+ inferencekit/serve/clip_client.py,sha256=cRPWx-Am21wePDAXATEG0rnaYqBKm3ghj3WnmBLen5M,17202
87
+ inferencekit/serve/clip_rounds.py,sha256=uWml18v7aJo89qfNJBqfEv0M_lAMikMs6lXiVetcCVQ,28059
88
+ inferencekit/serve/image_client.py,sha256=2q9zXz0QJdYYcYOYw8ZOPX78vYBnF-9Sx6AO9ddv54s,17635
89
+ inferencekit/serve/loadgen.py,sha256=7Dd5POFeozmPUqJ4gLcqG7NNSom7mDGEVQMALiYlPF8,5787
90
+ inferencekit/serve/metrics.py,sha256=DXnwhWMxbAjmEA0BjsCuBfPfUf9_kzpj_bwmC4XnArE,10755
91
+ inferencekit/serve/profiles.py,sha256=2wWgxDSUVxWzcYD8WNriyimJCg1rWLbWlTaQm9VrmNM,5758
92
+ inferencekit/serve/prompts_io.py,sha256=q5P2YvGQDA5NnGy0uK7_WDer1adL44M5MzK2z3pNZaw,5384
93
+ inferencekit/serve/rounds.py,sha256=Eu2eCxl_qHTcpA6-OUMnHC3q9UM75dWM3Y-dupqOnQY,61352
94
+ inferencekit/serve/servers.py,sha256=D0KspAuZaK-QZAxsgjmdMYrqNSRzFk9t_1YZeQYqgLc,40472
95
+ inferencekit/schemas/evidence.v1.json,sha256=hGSdeJzPFsewHTSvegV2bFuGI6CvUkWHlTObdGXMFTU,4976
96
+ inferencekit/schemas/evidence.v2.json,sha256=QPIf7vnSGEKt5Wpc5niWexmVq9s_GRlmeeGQN_JZKY4,15450
97
+ inferencekit/schemas/intake.v1.json,sha256=msxET5X-4lwJ6NGYYPgIRizBaPIgr1L2d7BAT53Xw0U,23089
98
+ inferencekit/schemas/run-manifest.v1.json,sha256=CujWEgDwYu3MxWYUr37qc354Tu3THyuN4IQxUPMP4BM,8654
99
+ inferencekit_cli-0.1.0.dist-info/METADATA,sha256=n0sJ7WBO993TWIezoX4cMKk_ls7XZKfk8-iOF1nvRVI,17953
100
+ inferencekit_cli-0.1.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
101
+ inferencekit_cli-0.1.0.dist-info/entry_points.txt,sha256=pl01EvSJ2tIjZ6XJuyABIKTeiS_WCbi02wILbMT6vnw,55
102
+ inferencekit_cli-0.1.0.dist-info/licenses/LICENSE,sha256=_IkNG2bSqucQOHCATYVgvIPqkI8nPQZqx2bXzIjtI80,11343
103
+ inferencekit_cli-0.1.0.dist-info/licenses/NOTICE,sha256=o4B_ehJCo7di6Qoo3ztq-OHrhDlugPZuXmFkrhkJ6Fc,364
104
+ inferencekit_cli-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ inferencekit = inferencekit.cli:main