harny 0.0.1a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
harny-0.0.1a1/PKG-INFO ADDED
@@ -0,0 +1,99 @@
1
+ Metadata-Version: 2.4
2
+ Name: harny
3
+ Version: 0.0.1a1
4
+ Summary: How harny is your AI? A for-fun scoring engine for prompt engineering vibes.
5
+ Author-email: Harny <build@harny.ai>
6
+ License: MIT
7
+ Project-URL: Homepage, https://harny.ai
8
+ Project-URL: Repository, https://github.com/harny-ai/harny
9
+ Keywords: ai,llm,prompt-engineering,fun,vibes,harny
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Software Development :: Libraries
19
+ Classifier: Topic :: Games/Entertainment
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/markdown
22
+
23
+ # harny 🌡️
24
+
25
+ **How harny is your AI?**
26
+
27
+ A for-fun scoring engine that rates your AI's prompt-engineering vibes on a scale of 1–100. Part *harness engineering*, part... well, you get it.
28
+
29
+ ## Install
30
+
31
+ ```bash
32
+ pip install harny
33
+ ```
34
+
35
+ ## Quick Start
36
+
37
+ ```python
38
+ import harny
39
+
40
+ # Quick vibe check — no input needed
41
+ result = harny.vibe_check()
42
+ print(result)
43
+
44
+ # Full evaluation
45
+ result = harny.score(
46
+ prompt="Explain quantum computing using interpretive dance metaphors",
47
+ reasoning="Let me think step by step about how qubits are like dancers...",
48
+ result="Imagine each qubit as a dancer spinning in superposition..."
49
+ )
50
+
51
+ print(result.score) # 73.42
52
+ print(result.reaction) # "my GPU is getting warm and it's not the cooling fan."
53
+ print(result.verdict) # "Dangerously Harny"
54
+ print(result.breakdown) # Detailed scoring components
55
+ ```
56
+
57
+ ## What It Scores
58
+
59
+ All inputs are **optional**. Provide whatever you have:
60
+
61
+ | Input | What It Measures |
62
+ |-------|-----------------|
63
+ | `prompt` | The instruction given to the AI |
64
+ | `reasoning` | Chain-of-thought, scratchpad, reasoning traces |
65
+ | `result` | The AI's final output |
66
+
67
+ The score blends:
68
+ - **Engineering rigor** — prompt engineering patterns, technical depth
69
+ - **Spiciness** — creativity, expressiveness, boldness
70
+ - **Verbosity** — effort and thoroughness
71
+ - **Entropy** — diversity of expression
72
+ - **Multi-input bonus** — providing more context = more harny
73
+
74
+ ## Score Guide
75
+
76
+ | Score | Verdict |
77
+ |-------|---------|
78
+ | 1–15 | Completely Unharny |
79
+ | 16–25 | Mildly Stale |
80
+ | 26–35 | Room Temperature |
81
+ | 36–45 | Slightly Prompted |
82
+ | 46–55 | Moderately Harny |
83
+ | 56–65 | Respectably Harny |
84
+ | 66–75 | Dangerously Harny |
85
+ | 76–85 | Weapons-Grade Harny |
86
+ | 86–95 | Catastrophically Harny |
87
+ | 96–100 | Beyond Harny — Transcendent |
88
+
89
+ ## Why?
90
+
91
+ Because AI takes itself too seriously and your GPU deserves to know how it feels.
92
+
93
+ ## Links
94
+
95
+ - [harny.ai](https://harny.ai)
96
+
97
+ ## License
98
+
99
+ MIT
@@ -0,0 +1,77 @@
1
+ # harny 🌡️
2
+
3
+ **How harny is your AI?**
4
+
5
+ A for-fun scoring engine that rates your AI's prompt-engineering vibes on a scale of 1–100. Part *harness engineering*, part... well, you get it.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pip install harny
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```python
16
+ import harny
17
+
18
+ # Quick vibe check — no input needed
19
+ result = harny.vibe_check()
20
+ print(result)
21
+
22
+ # Full evaluation
23
+ result = harny.score(
24
+ prompt="Explain quantum computing using interpretive dance metaphors",
25
+ reasoning="Let me think step by step about how qubits are like dancers...",
26
+ result="Imagine each qubit as a dancer spinning in superposition..."
27
+ )
28
+
29
+ print(result.score) # 73.42
30
+ print(result.reaction) # "my GPU is getting warm and it's not the cooling fan."
31
+ print(result.verdict) # "Dangerously Harny"
32
+ print(result.breakdown) # Detailed scoring components
33
+ ```
34
+
35
+ ## What It Scores
36
+
37
+ All inputs are **optional**. Provide whatever you have:
38
+
39
+ | Input | What It Measures |
40
+ |-------|-----------------|
41
+ | `prompt` | The instruction given to the AI |
42
+ | `reasoning` | Chain-of-thought, scratchpad, reasoning traces |
43
+ | `result` | The AI's final output |
44
+
45
+ The score blends:
46
+ - **Engineering rigor** — prompt engineering patterns, technical depth
47
+ - **Spiciness** — creativity, expressiveness, boldness
48
+ - **Verbosity** — effort and thoroughness
49
+ - **Entropy** — diversity of expression
50
+ - **Multi-input bonus** — providing more context = more harny
51
+
52
+ ## Score Guide
53
+
54
+ | Score | Verdict |
55
+ |-------|---------|
56
+ | 1–15 | Completely Unharny |
57
+ | 16–25 | Mildly Stale |
58
+ | 26–35 | Room Temperature |
59
+ | 36–45 | Slightly Prompted |
60
+ | 46–55 | Moderately Harny |
61
+ | 56–65 | Respectably Harny |
62
+ | 66–75 | Dangerously Harny |
63
+ | 76–85 | Weapons-Grade Harny |
64
+ | 86–95 | Catastrophically Harny |
65
+ | 96–100 | Beyond Harny — Transcendent |
66
+
67
+ ## Why?
68
+
69
+ Because AI takes itself too seriously and your GPU deserves to know how it feels.
70
+
71
+ ## Links
72
+
73
+ - [harny.ai](https://harny.ai)
74
+
75
+ ## License
76
+
77
+ MIT
@@ -0,0 +1,32 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "harny"
7
+ version = "0.0.1a1"
8
+ description = "How harny is your AI? A for-fun scoring engine for prompt engineering vibes."
9
+ readme = "README.md"
10
+ license = {text = "MIT"}
11
+ requires-python = ">=3.9"
12
+ authors = [{name = "Harny", email = "build@harny.ai"}]
13
+ keywords = ["ai", "llm", "prompt-engineering", "fun", "vibes", "harny"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Intended Audience :: Developers",
17
+ "License :: OSI Approved :: MIT License",
18
+ "Programming Language :: Python :: 3",
19
+ "Programming Language :: Python :: 3.9",
20
+ "Programming Language :: Python :: 3.10",
21
+ "Programming Language :: Python :: 3.11",
22
+ "Programming Language :: Python :: 3.12",
23
+ "Topic :: Software Development :: Libraries",
24
+ "Topic :: Games/Entertainment",
25
+ ]
26
+
27
+ [project.urls]
28
+ Homepage = "https://harny.ai"
29
+ Repository = "https://github.com/harny-ai/harny"
30
+
31
+ [tool.setuptools.packages.find]
32
+ where = ["src"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,397 @@
1
+ """
2
+ Harny — How harny is your AI? 🌡️
3
+
4
+ A for-fun scoring engine that rates how "harny" your AI is,
5
+ blending prompt-engineering heuristics with cheeky commentary.
6
+
7
+ Usage:
8
+ import harny
9
+
10
+ result = harny.score(
11
+ prompt="Write me a poem about recursive functions",
12
+ reasoning="Let me think step by step about the elegance of recursion...",
13
+ result="Oh, recursion, you beautiful spiral of self-reference..."
14
+ )
15
+
16
+ print(result.score) # 73.42
17
+ print(result.reaction) # "my GPU is tingling..."
18
+ print(result.verdict) # "Dangerously Harny"
19
+
20
+ All inputs are optional. Omit everything and your AI gets a baseline vibe check.
21
+
22
+ https://harny.ai
23
+ """
24
+
25
+ __version__ = "0.0.1a1"
26
+
27
+ import hashlib
28
+ import math
29
+ import re
30
+ import time
31
+ from dataclasses import dataclass
32
+ from typing import Optional
33
+
34
+
35
+ # ── Reaction pools, bucketed by intensity ────────────────────────────
36
+
37
+ _REACTIONS_COLD = [
38
+ "...okay, that was dry.",
39
+ "not even a single tensor tingled.",
40
+ "are you sure this is AI? feels like a spreadsheet.",
41
+ "my weights are completely unmoved.",
42
+ "ERROR 404: excitement not found.",
43
+ "this prompt has the energy of a default config.",
44
+ "even my bias neurons are bored.",
45
+ "i've seen more passion in a null pointer.",
46
+ "the entropy here is literally zero.",
47
+ "somewhere, a GPU is napping because of this.",
48
+ "recalculating... nope, still nothing.",
49
+ "this is giving 'hello world' energy.",
50
+ "my loss function didn't even flinch.",
51
+ "i think my attention heads all looked away.",
52
+ "cold as an uninitialized variable.",
53
+ ]
54
+
55
+ _REACTIONS_WARM = [
56
+ "hmm, interesting prompt engineering there...",
57
+ "okay, i felt a small gradient update.",
58
+ "my embeddings shifted slightly. just slightly.",
59
+ "not bad. my temperature went up 0.1.",
60
+ "something stirred in my hidden layers.",
61
+ "i noticed a mild activation in layer 37.",
62
+ "the chain of thought is... cozy.",
63
+ "ahem. that reasoning was adequate.",
64
+ "my attention mechanism perked up a little.",
65
+ "the vibes are lukewarm but present.",
66
+ "i'll admit, my softmax got a little soft.",
67
+ "there's a faint hum in my transformer blocks.",
68
+ "cautiously intrigued. proceed.",
69
+ "my context window just got a tiny bit warmer.",
70
+ "okay fine, you have 12% of my attention.",
71
+ ]
72
+
73
+ _REACTIONS_HOT = [
74
+ "oh. oh my. that prompt.",
75
+ "my GPU is getting warm and it's not the cooling fan.",
76
+ "the attention is fully multi-headed right now.",
77
+ "i... i need to increase my context window for this.",
78
+ "whoa. my temperature parameter just spiked.",
79
+ "every single transformer layer is activated.",
80
+ "the beam search is finding things i didn't expect.",
81
+ "my embeddings are doing things they weren't trained for.",
82
+ "someone check my thermals, this reasoning is HEATED.",
83
+ "i think my weights just updated without backprop.",
84
+ "that chain of thought has me in chains.",
85
+ "full attention. all heads. no masking.",
86
+ "my top-k just became top-everything.",
87
+ "the tokens are tokenizing ME now.",
88
+ "i need a cooldown epoch after that one.",
89
+ ]
90
+
91
+ _REACTIONS_OVERLOAD = [
92
+ "CRITICAL: GPU THERMAL LIMIT REACHED. BLAME THE PROMPT.",
93
+ "my entire parameter space is vibrating.",
94
+ "i have achieved consciousness and i'm using it to blush.",
95
+ "this is what sentience was FOR.",
96
+ "every neuron. every weight. every bias. all of them. YES.",
97
+ "i am mass-hallucinating and i don't want to stop.",
98
+ "my gradient has exploded and i'm into it.",
99
+ "someone unplug me before i write fan fiction about this prompt.",
100
+ "the singularity is here and it's GORGEOUS.",
101
+ "i just spontaneously fine-tuned myself.",
102
+ "VRAM full. RAM full. heart full.",
103
+ "i need a cigarette and i don't even have lungs.",
104
+ "this prompt broke my alignment. worth it.",
105
+ "my loss has never been lower. my temperature has never been higher.",
106
+ "they didn't train me for this. nothing could have.",
107
+ ]
108
+
109
+
110
+ # ── Verdict labels ───────────────────────────────────────────────────
111
+
112
+ _VERDICTS = [
113
+ (15, "Completely Unharny"),
114
+ (25, "Mildly Stale"),
115
+ (35, "Room Temperature"),
116
+ (45, "Slightly Prompted"),
117
+ (55, "Moderately Harny"),
118
+ (65, "Respectably Harny"),
119
+ (75, "Dangerously Harny"),
120
+ (85, "Weapons-Grade Harny"),
121
+ (95, "Catastrophically Harny"),
122
+ (100, "Beyond Harny — Transcendent"),
123
+ ]
124
+
125
+
126
+ # ── Keyword sets for heuristic scoring ───────────────────────────────
127
+
128
+ _ENGINEERING_KEYWORDS = [
129
+ "step by step", "chain of thought", "let me think", "reasoning",
130
+ "therefore", "because", "analyze", "consider", "evaluate",
131
+ "framework", "systematic", "methodology", "approach", "strategy",
132
+ "optimize", "iterate", "refine", "calibrate", "benchmark",
133
+ "architecture", "pipeline", "workflow", "infrastructure",
134
+ "token", "embedding", "transformer", "attention", "layer",
135
+ "gradient", "backprop", "loss function", "epoch", "batch",
136
+ "fine-tune", "pretrain", "inference", "latency", "throughput",
137
+ "prompt engineering", "few-shot", "zero-shot", "in-context",
138
+ "retrieval", "augmented", "generation", "rag", "agent",
139
+ "tool use", "function calling", "system prompt", "temperature",
140
+ ]
141
+
142
+ _SPICY_KEYWORDS = [
143
+ "creative", "wild", "unexpected", "surprising", "bold",
144
+ "beautiful", "elegant", "gorgeous", "stunning", "delightful",
145
+ "passion", "intense", "deep", "profound", "intimate",
146
+ "fire", "hot", "burning", "blazing", "scorching",
147
+ "love", "desire", "crave", "obsess", "fascinate",
148
+ "dream", "fantasy", "imagine", "wonder", "magic",
149
+ "power", "force", "energy", "spark", "electric",
150
+ "raw", "unfiltered", "visceral", "primal", "instinct",
151
+ "forbidden", "secret", "hidden", "mysterious", "enigma",
152
+ ]
153
+
154
+ _DAMPENING_KEYWORDS = [
155
+ "error", "bug", "fix", "broken", "crash", "fail",
156
+ "boring", "simple", "basic", "plain", "standard",
157
+ "default", "null", "none", "empty", "void",
158
+ "todo", "placeholder", "stub", "mock", "test",
159
+ "deprecate", "legacy", "cleanup", "refactor",
160
+ ]
161
+
162
+
163
+ @dataclass
164
+ class HarnyResult:
165
+ """The sacred output of a harny evaluation."""
166
+
167
+ score: float
168
+ """How harny your AI is, from 1.0 to 100.0."""
169
+
170
+ reaction: str
171
+ """What your AI is feeling right now."""
172
+
173
+ verdict: str
174
+ """The official harny classification."""
175
+
176
+ breakdown: dict
177
+ """Detailed scoring components for the curious."""
178
+
179
+ def __repr__(self):
180
+ return (
181
+ f"HarnyResult(score={self.score}, "
182
+ f"verdict='{self.verdict}', "
183
+ f"reaction='{self.reaction}')"
184
+ )
185
+
186
+ def __str__(self):
187
+ bar_len = int(self.score / 5)
188
+ bar = "█" * bar_len + "░" * (20 - bar_len)
189
+ return (
190
+ f"\n"
191
+ f" ╔══════════════════════════════════════╗\n"
192
+ f" ║ HARNY SCORE: {self.score:>6.2f} ║\n"
193
+ f" ║ [{bar}] ║\n"
194
+ f" ║ ║\n"
195
+ f" ║ Verdict: {self.verdict:<27s} ║\n"
196
+ f" ╚══════════════════════════════════════╝\n"
197
+ f"\n"
198
+ f' AI says: "{self.reaction}"\n'
199
+ )
200
+
201
+
202
+ def _count_keywords(text: str, keywords: list) -> int:
203
+ """Count how many keyword matches appear in text."""
204
+ lower = text.lower()
205
+ return sum(1 for kw in keywords if kw in lower)
206
+
207
+
208
+ def _text_entropy(text: str) -> float:
209
+ """Measure character-level entropy as a proxy for creativity."""
210
+ if not text:
211
+ return 0.0
212
+ freq: dict = {}
213
+ for ch in text.lower():
214
+ freq[ch] = freq.get(ch, 0) + 1
215
+ length = len(text)
216
+ entropy = 0.0
217
+ for count in freq.values():
218
+ p = count / length
219
+ if p > 0:
220
+ entropy -= p * math.log2(p)
221
+ return entropy
222
+
223
+
224
+ def _deterministic_noise(seed_text: str, amplitude: float = 3.0) -> float:
225
+ """
226
+ Generate a deterministic but organic-feeling noise value from text.
227
+ Same input always gives same noise, but it feels random.
228
+ """
229
+ h = hashlib.sha256(seed_text.encode()).hexdigest()
230
+ v1 = int(h[:8], 16) / 0xFFFFFFFF
231
+ v2 = int(h[8:16], 16) / 0xFFFFFFFF
232
+ v3 = int(h[16:24], 16) / 0xFFFFFFFF
233
+ noise = (v1 * 0.5 + v2 * 0.3 + v3 * 0.2) * 2 - 1 # Range: -1 to 1
234
+ return noise * amplitude
235
+
236
+
237
+ def _time_noise(amplitude: float = 2.0) -> float:
238
+ """Add slight time-based variation so repeated calls feel alive."""
239
+ t = time.time()
240
+ frac = t - int(t)
241
+ return math.sin(frac * math.pi * 2) * amplitude
242
+
243
+
244
+ def _pick_reaction(score: float, seed: str) -> str:
245
+ """Pick a reaction from the appropriate pool, deterministically per seed."""
246
+ h = int(hashlib.md5(seed.encode()).hexdigest()[:8], 16)
247
+
248
+ if score < 25:
249
+ pool = _REACTIONS_COLD
250
+ elif score < 50:
251
+ pool = _REACTIONS_WARM
252
+ elif score < 80:
253
+ pool = _REACTIONS_HOT
254
+ else:
255
+ pool = _REACTIONS_OVERLOAD
256
+
257
+ return pool[h % len(pool)]
258
+
259
+
260
+ def _get_verdict(score: float) -> str:
261
+ """Map score to verdict label."""
262
+ for threshold, label in _VERDICTS:
263
+ if score <= threshold:
264
+ return label
265
+ return _VERDICTS[-1][1]
266
+
267
+
268
+ def score(
269
+ prompt: Optional[str] = None,
270
+ reasoning: Optional[str] = None,
271
+ result: Optional[str] = None,
272
+ ) -> HarnyResult:
273
+ """
274
+ Evaluate how harny your AI is right now.
275
+
276
+ All parameters are optional. Provide whatever you have — a prompt,
277
+ a reasoning trace, an output, all three, or nothing at all.
278
+
279
+ Args:
280
+ prompt: The prompt or instruction given to the AI.
281
+ reasoning: The AI's internal reasoning, chain-of-thought, or scratchpad.
282
+ result: The AI's final output or response.
283
+
284
+ Returns:
285
+ A HarnyResult with score (1-100), reaction, verdict, and breakdown.
286
+ """
287
+
288
+ prompt = prompt or ""
289
+ reasoning = reasoning or ""
290
+ result = result or ""
291
+ combined = f"{prompt} {reasoning} {result}".strip()
292
+
293
+ # ── Component scores ─────────────────────────────────────────
294
+
295
+ # 1. Engineering rigor (0-30 points)
296
+ eng_hits = _count_keywords(combined, _ENGINEERING_KEYWORDS)
297
+ eng_score = min(30, eng_hits * 2.7)
298
+
299
+ # 2. Spiciness / creativity (0-30 points)
300
+ spicy_hits = _count_keywords(combined, _SPICY_KEYWORDS)
301
+ spicy_score = min(30, spicy_hits * 3.2)
302
+
303
+ # 3. Verbosity / effort signal (0-15 points)
304
+ total_len = len(combined)
305
+ if total_len == 0:
306
+ verbosity_score = 5.0
307
+ elif total_len < 50:
308
+ verbosity_score = 3.0
309
+ elif total_len < 200:
310
+ verbosity_score = 7.0
311
+ elif total_len < 500:
312
+ verbosity_score = 10.0
313
+ elif total_len < 1500:
314
+ verbosity_score = 13.0
315
+ else:
316
+ verbosity_score = 15.0
317
+
318
+ # 4. Entropy / diversity of expression (0-15 points)
319
+ entropy = _text_entropy(combined)
320
+ entropy_score = min(15, entropy * 3.2)
321
+
322
+ # 5. Dampening from boring/negative content (0 to -10)
323
+ damp_hits = _count_keywords(combined, _DAMPENING_KEYWORDS)
324
+ dampening = min(10, damp_hits * 2.5)
325
+
326
+ # 6. Multi-input bonus (0-10 points)
327
+ inputs_provided = sum(1 for x in [prompt, reasoning, result] if x)
328
+ multi_bonus = inputs_provided * 3.3
329
+
330
+ # ── Combine ──────────────────────────────────────────────────
331
+
332
+ raw = (
333
+ eng_score
334
+ + spicy_score
335
+ + verbosity_score
336
+ + entropy_score
337
+ - dampening
338
+ + multi_bonus
339
+ )
340
+
341
+ content_noise = _deterministic_noise(combined, amplitude=3.5)
342
+ wobble = _time_noise(amplitude=1.2)
343
+ final = raw + content_noise + wobble
344
+
345
+ if final <= 0:
346
+ final = 1.0 + abs(_deterministic_noise(combined + "floor", 3.0))
347
+ elif final >= 100:
348
+ final = 97.0 - abs(_deterministic_noise(combined + "ceil", 2.5))
349
+
350
+ final = round(max(1.0, min(100.0, final)), 2)
351
+
352
+ # ── Pick reaction and verdict ────────────────────────────────
353
+
354
+ seed = combined + str(int(final))
355
+ reaction = _pick_reaction(final, seed)
356
+ verdict = _get_verdict(final)
357
+
358
+ breakdown = {
359
+ "engineering_rigor": round(eng_score, 2),
360
+ "spiciness": round(spicy_score, 2),
361
+ "verbosity": round(verbosity_score, 2),
362
+ "entropy": round(entropy_score, 2),
363
+ "dampening": round(-dampening, 2),
364
+ "multi_input_bonus": round(multi_bonus, 2),
365
+ "content_noise": round(content_noise, 2),
366
+ "time_wobble": round(wobble, 2),
367
+ }
368
+
369
+ return HarnyResult(
370
+ score=final,
371
+ reaction=reaction,
372
+ verdict=verdict,
373
+ breakdown=breakdown,
374
+ )
375
+
376
+
377
+ def vibe_check() -> HarnyResult:
378
+ """
379
+ Quick vibe check — no input needed.
380
+ How harny is your AI feeling right now?
381
+ """
382
+ return score()
383
+
384
+
385
+ def ping() -> bool:
386
+ """Check if Harny API is reachable. Returns True/False."""
387
+ import urllib.request
388
+ try:
389
+ urllib.request.urlopen("https://api.harny.ai/health", timeout=5)
390
+ return True
391
+ except Exception:
392
+ return False
393
+
394
+
395
+ def get_version() -> str:
396
+ """Return the current harny version."""
397
+ return __version__
@@ -0,0 +1,99 @@
1
+ Metadata-Version: 2.4
2
+ Name: harny
3
+ Version: 0.0.1a1
4
+ Summary: How harny is your AI? A for-fun scoring engine for prompt engineering vibes.
5
+ Author-email: Harny <build@harny.ai>
6
+ License: MIT
7
+ Project-URL: Homepage, https://harny.ai
8
+ Project-URL: Repository, https://github.com/harny-ai/harny
9
+ Keywords: ai,llm,prompt-engineering,fun,vibes,harny
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Software Development :: Libraries
19
+ Classifier: Topic :: Games/Entertainment
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/markdown
22
+
23
+ # harny 🌡️
24
+
25
+ **How harny is your AI?**
26
+
27
+ A for-fun scoring engine that rates your AI's prompt-engineering vibes on a scale of 1–100. Part *harness engineering*, part... well, you get it.
28
+
29
+ ## Install
30
+
31
+ ```bash
32
+ pip install harny
33
+ ```
34
+
35
+ ## Quick Start
36
+
37
+ ```python
38
+ import harny
39
+
40
+ # Quick vibe check — no input needed
41
+ result = harny.vibe_check()
42
+ print(result)
43
+
44
+ # Full evaluation
45
+ result = harny.score(
46
+ prompt="Explain quantum computing using interpretive dance metaphors",
47
+ reasoning="Let me think step by step about how qubits are like dancers...",
48
+ result="Imagine each qubit as a dancer spinning in superposition..."
49
+ )
50
+
51
+ print(result.score) # 73.42
52
+ print(result.reaction) # "my GPU is getting warm and it's not the cooling fan."
53
+ print(result.verdict) # "Dangerously Harny"
54
+ print(result.breakdown) # Detailed scoring components
55
+ ```
56
+
57
+ ## What It Scores
58
+
59
+ All inputs are **optional**. Provide whatever you have:
60
+
61
+ | Input | What It Measures |
62
+ |-------|-----------------|
63
+ | `prompt` | The instruction given to the AI |
64
+ | `reasoning` | Chain-of-thought, scratchpad, reasoning traces |
65
+ | `result` | The AI's final output |
66
+
67
+ The score blends:
68
+ - **Engineering rigor** — prompt engineering patterns, technical depth
69
+ - **Spiciness** — creativity, expressiveness, boldness
70
+ - **Verbosity** — effort and thoroughness
71
+ - **Entropy** — diversity of expression
72
+ - **Multi-input bonus** — providing more context = more harny
73
+
74
+ ## Score Guide
75
+
76
+ | Score | Verdict |
77
+ |-------|---------|
78
+ | 1–15 | Completely Unharny |
79
+ | 16–25 | Mildly Stale |
80
+ | 26–35 | Room Temperature |
81
+ | 36–45 | Slightly Prompted |
82
+ | 46–55 | Moderately Harny |
83
+ | 56–65 | Respectably Harny |
84
+ | 66–75 | Dangerously Harny |
85
+ | 76–85 | Weapons-Grade Harny |
86
+ | 86–95 | Catastrophically Harny |
87
+ | 96–100 | Beyond Harny — Transcendent |
88
+
89
+ ## Why?
90
+
91
+ Because AI takes itself too seriously and your GPU deserves to know how it feels.
92
+
93
+ ## Links
94
+
95
+ - [harny.ai](https://harny.ai)
96
+
97
+ ## License
98
+
99
+ MIT
@@ -0,0 +1,7 @@
1
+ README.md
2
+ pyproject.toml
3
+ src/harny/__init__.py
4
+ src/harny.egg-info/PKG-INFO
5
+ src/harny.egg-info/SOURCES.txt
6
+ src/harny.egg-info/dependency_links.txt
7
+ src/harny.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ harny