ldrouter 1.14.0 → 1.14.1
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
|
@@ -4,6 +4,13 @@ All notable changes to this project are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/) and the project adheres to
|
|
5
5
|
[Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [1.14.1] - 2026-09-12
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Do not reject any model solely because its stored `reasoning` capability is `false`; reasoning support is advisory for OpenAI-compatible providers and must not block Claude/Hermes requests.
|
|
12
|
+
- Redact API-key digests and metadata from authentication debug logs.
|
|
13
|
+
|
|
7
14
|
## [1.14.0] - 2026-09-11
|
|
8
15
|
|
|
9
16
|
### Added
|
|
@@ -42,12 +42,12 @@ export function authenticateGatewayKey(req) {
|
|
|
42
42
|
// Custom keys are stored verbatim (no prefix requirement); auto-generated
|
|
43
43
|
// keys start with ld-, but authentication must accept any stored secret.
|
|
44
44
|
const digest = sha256Hex(candidate);
|
|
45
|
-
console.log(
|
|
45
|
+
console.log('🔑 API KEY AUTH - Digest computed');
|
|
46
46
|
const db = getDb();
|
|
47
47
|
// DEBUG: Check total keys in database
|
|
48
48
|
const allKeys = db.select().from(schema.apiKeys).all();
|
|
49
49
|
console.log(`📊 TOTAL KEYS IN DB: ${allKeys.length}`);
|
|
50
|
-
console.log(
|
|
50
|
+
console.log('📋 API key metadata loaded');
|
|
51
51
|
const row = db.select().from(schema.apiKeys).where(eq(schema.apiKeys.keyDigest, digest)).get();
|
|
52
52
|
console.log(`❓ QUERY RESULT: Found match? ${!!row}`);
|
|
53
53
|
if (!row) {
|
|
@@ -38,7 +38,9 @@ export function deriveRequiredCapabilities(req) {
|
|
|
38
38
|
* IMPORTANT: Treat undefined as "unknown" rather than "unsupported".
|
|
39
39
|
* For generic OpenAI-compatible providers where capabilities weren't explicitly imported,
|
|
40
40
|
* undefined means we don't know, so we should assume it's potentially supported.
|
|
41
|
-
* Explicit false means "known unsupported"
|
|
41
|
+
* Explicit false means "known unsupported" for protocol capabilities such as
|
|
42
|
+
* tools, images, and streaming. Reasoning is advisory metadata because the
|
|
43
|
+
* upstream may support it even when discovery cannot identify it.
|
|
42
44
|
*/
|
|
43
45
|
export function modelMeets(caps, req) {
|
|
44
46
|
// Only reject if capability is explicitly false, not if unknown (undefined)
|
|
@@ -52,8 +54,6 @@ export function modelMeets(caps, req) {
|
|
|
52
54
|
return false;
|
|
53
55
|
if (req.audioInput && caps.audio_input === false)
|
|
54
56
|
return false;
|
|
55
|
-
if (req.reasoning && caps.reasoning === false)
|
|
56
|
-
return false;
|
|
57
57
|
if (req.responses && caps.responses === false)
|
|
58
58
|
return false;
|
|
59
59
|
return true;
|
|
@@ -69,8 +69,6 @@ function capabilityRejection(caps, req) {
|
|
|
69
69
|
return 'image_input';
|
|
70
70
|
if (req.audioInput && caps.audio_input === false)
|
|
71
71
|
return 'audio_input';
|
|
72
|
-
if (req.reasoning && caps.reasoning === false)
|
|
73
|
-
return 'reasoning';
|
|
74
72
|
if (req.responses && caps.responses === false)
|
|
75
73
|
return 'responses';
|
|
76
74
|
return 'capability_mismatch';
|