jeopi-ai 16.2.25 → 16.2.26

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [16.2.26] - 2026-07-05
6
+
7
+ ### Fixed
8
+
9
+ - `renderDemotedThinking`'s classifier-safe markdown-italic prose form (avoids Anthropic's `reasoning_extraction` refusal when replaying a prior turn's unsigned reasoning as plaintext) was keyed off a hand-rolled `claude-fable`-only regex, missing `claude-mythos-5` — a real first-party Anthropic model the rest of the catalog already treats as classifier-equivalent to Fable (`isAnthropicFableOrMythosModel`). Unsigned Mythos thinking replayed cross-model/branch-handoff was demoted to a raw `<thinking>...</thinking>` text block instead, which can trip the same reasoning-extraction classifier Fable's carve-out exists to avoid. Now uses the canonical `isAnthropicFableOrMythosModel` classifier for both.
10
+
5
11
  ## [16.2.25] - 2026-07-05
6
12
 
7
13
  ### Added
@@ -5,10 +5,10 @@
5
5
  * replayed unsigned `thought` part is schema-accepted but silently discarded —
6
6
  * neither recalled nor influencing generation).
7
7
  *
8
- * Fable is the exception: replaying prior reasoning inside `<thinking>` /
8
+ * Fable/Mythos are the exception: replaying prior reasoning inside `<thinking>` /
9
9
  * `antml:thinking`-style assistant text is treated as a reasoning-extraction
10
- * attempt and can train the next turn to leak thoughts, so Fable receives the
11
- * reasoning as markdown-italic assistant prose instead. Harmony and Gemma are
10
+ * attempt and can train the next turn to leak thoughts, so Fable/Mythos receive
11
+ * the reasoning as markdown-italic assistant prose instead. Harmony and Gemma are
12
12
  * also exceptions: their `renderThinking` emits chat-template control tokens
13
13
  * (`<|channel|>analysis`, `<|channel>thought`) that must not appear inside a
14
14
  * structured native message, so they fall back to a plain `<think>` block. Every
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "jeopi-ai",
4
- "version": "16.2.25",
4
+ "version": "16.2.26",
5
5
  "description": "Unified LLM API with automatic model discovery and provider configuration",
6
6
  "homepage": "https://github.com/akillness/jeopi",
7
7
  "author": "Can Boluk",
@@ -38,9 +38,9 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@bufbuild/protobuf": "^2.12.0",
41
- "jeopi-catalog": "16.2.25",
42
- "jeopi-utils": "16.2.25",
43
- "jeopi-wire": "16.2.25",
41
+ "jeopi-catalog": "16.2.26",
42
+ "jeopi-utils": "16.2.26",
43
+ "jeopi-wire": "16.2.26",
44
44
  "arktype": "^2.2.0",
45
45
  "zod": "^4"
46
46
  },
@@ -1,8 +1,6 @@
1
- import { bareModelId, preferredDialect } from "jeopi-catalog/identity";
1
+ import { isAnthropicFableOrMythosModel, preferredDialect } from "jeopi-catalog/identity";
2
2
  import { getDialectDefinition } from "./factory";
3
3
 
4
- const CLAUDE_FABLE_ID = /(?:^|[./])claude[-.]fable(?:[-.]|$)/i;
5
-
6
4
  /**
7
5
  * Wrap a prior-turn reasoning string for demotion into native conversation
8
6
  * history — the cross-provider / cross-model case where the target cannot replay
@@ -10,10 +8,10 @@ const CLAUDE_FABLE_ID = /(?:^|[./])claude[-.]fable(?:[-.]|$)/i;
10
8
  * replayed unsigned `thought` part is schema-accepted but silently discarded —
11
9
  * neither recalled nor influencing generation).
12
10
  *
13
- * Fable is the exception: replaying prior reasoning inside `<thinking>` /
11
+ * Fable/Mythos are the exception: replaying prior reasoning inside `<thinking>` /
14
12
  * `antml:thinking`-style assistant text is treated as a reasoning-extraction
15
- * attempt and can train the next turn to leak thoughts, so Fable receives the
16
- * reasoning as markdown-italic assistant prose instead. Harmony and Gemma are
13
+ * attempt and can train the next turn to leak thoughts, so Fable/Mythos receive
14
+ * the reasoning as markdown-italic assistant prose instead. Harmony and Gemma are
17
15
  * also exceptions: their `renderThinking` emits chat-template control tokens
18
16
  * (`<|channel|>analysis`, `<|channel>thought`) that must not appear inside a
19
17
  * structured native message, so they fall back to a plain `<think>` block. Every
@@ -28,9 +26,8 @@ const CLAUDE_FABLE_ID = /(?:^|[./])claude[-.]fable(?:[-.]|$)/i;
28
26
  export function renderDemotedThinking(modelId: string, text: string): string {
29
27
  if (!text) return "";
30
28
  text = text.toWellFormed();
31
- const canonicalId = bareModelId(modelId);
32
29
  const dialect = preferredDialect(modelId);
33
- if (CLAUDE_FABLE_ID.test(canonicalId)) return `_Hmm. ${text}_\n`;
30
+ if (isAnthropicFableOrMythosModel(modelId)) return `_Hmm. ${text}_\n`;
34
31
  if (dialect === "harmony" || dialect === "gemma") return `<think>\n${text}\n</think>\n`;
35
32
  return `${getDialectDefinition(dialect).renderThinking(text)}\n`;
36
33
  }