video-context-mcp-server 0.22.0-beta → 0.23.1-beta
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/README.md +6 -2
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/services/audioRouter.d.ts +16 -0
- package/dist/services/audioRouter.d.ts.map +1 -1
- package/dist/services/audioRouter.js +22 -0
- package/dist/services/audioRouter.js.map +1 -1
- package/dist/services/providerRouter.d.ts +14 -7
- package/dist/services/providerRouter.d.ts.map +1 -1
- package/dist/services/providerRouter.js +34 -21
- package/dist/services/providerRouter.js.map +1 -1
- package/dist/tools/transcribeVideo.d.ts.map +1 -1
- package/dist/tools/transcribeVideo.js +72 -37
- package/dist/tools/transcribeVideo.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -216,7 +216,11 @@ Set all three keys to get the full fallback chain. The server will try GLM first
|
|
|
216
216
|
| **Kimi K2.5** | `MOONSHOT_API_KEY` | [Get key](https://platform.moonshot.ai) |
|
|
217
217
|
| **Gemini 3 Flash Preview** | `GEMINI_API_KEY` | [Get key](https://aistudio.google.com/app/apikey) |
|
|
218
218
|
|
|
219
|
-
When a provider's API key is missing, tools automatically fall back
|
|
219
|
+
When a provider's API key is missing or its API call fails at runtime, tools automatically fall back through the remaining providers in priority order, starting from the configured default:
|
|
220
|
+
|
|
221
|
+
- GLM default (standard): **GLM → Kimi → Gemini**
|
|
222
|
+
- Kimi default: **Kimi → GLM → Gemini**
|
|
223
|
+
- Gemini default: **Gemini → GLM → Kimi**
|
|
220
224
|
|
|
221
225
|
### Audio Providers
|
|
222
226
|
|
|
@@ -229,7 +233,7 @@ Similarly, set all audio keys so transcription always has a fallback provider av
|
|
|
229
233
|
| **Groq/Whisper** (free) | `GROQ_API_KEY` | [Get key](https://console.groq.com/) |
|
|
230
234
|
| **Gemini** | `GEMINI_API_KEY` | Reuses the same key as the video backend |
|
|
231
235
|
|
|
232
|
-
When an audio key is missing, tools fall back: **Deepgram → AssemblyAI → Groq → Gemini
|
|
236
|
+
When an audio key is missing or an audio API call fails at runtime, tools automatically fall back through the remaining providers in priority order, starting from the configured default (e.g. with Deepgram default: **Deepgram → AssemblyAI → Groq → Gemini**).
|
|
233
237
|
|
|
234
238
|
---
|
|
235
239
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.23.1-beta";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -31,6 +31,22 @@ export declare function getDefaultAudioProvider(keys: AudioProviderKeys): AudioP
|
|
|
31
31
|
* Throws only when no provider API key is available at all.
|
|
32
32
|
*/
|
|
33
33
|
export declare function resolveAudioProvider(requested: AudioProvider | undefined, keys: AudioProviderKeys): AudioProviderResult;
|
|
34
|
+
/**
|
|
35
|
+
* Returns an ordered list of audio providers to attempt for a given starting
|
|
36
|
+
* provider, filtered to only those whose API keys are available.
|
|
37
|
+
*
|
|
38
|
+
* Fallback order: start with the requested provider, then visit remaining
|
|
39
|
+
* providers in canonical ranking order (deepgram → assemblyai → groq → gemini),
|
|
40
|
+
* so every starting provider can reach all others:
|
|
41
|
+
* deepgram → deepgram, assemblyai, groq, gemini
|
|
42
|
+
* assemblyai → assemblyai, deepgram, groq, gemini
|
|
43
|
+
* groq → groq, deepgram, assemblyai, gemini
|
|
44
|
+
* gemini → gemini, deepgram, assemblyai, groq
|
|
45
|
+
*
|
|
46
|
+
* Used for runtime error-based fallback in transcribeVideo: if the first
|
|
47
|
+
* provider's API call throws, the caller retries with the next entry.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getRuntimeAudioFallbackChain(provider: AudioProvider, keys: AudioProviderKeys): AudioProvider[];
|
|
34
50
|
/**
|
|
35
51
|
* Build the AudioProviderKeys object from environment variables
|
|
36
52
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioRouter.d.ts","sourceRoot":"","sources":["../../src/services/audioRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEzE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,aAAa,CAAA;IACvB,YAAY,CAAC,EAAE,aAAa,CAAA;CAC7B,CAAA;AA6BD,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,OAAO,CAAA;IACvB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,iBAAiB,GACtB,aAAa,CAsBf;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,GAAG,SAAS,EACpC,IAAI,EAAE,iBAAiB,GACtB,mBAAmB,CAiBrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAOxD"}
|
|
1
|
+
{"version":3,"file":"audioRouter.d.ts","sourceRoot":"","sources":["../../src/services/audioRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEzE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,aAAa,CAAA;IACvB,YAAY,CAAC,EAAE,aAAa,CAAA;CAC7B,CAAA;AA6BD,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,OAAO,CAAA;IACvB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,iBAAiB,GACtB,aAAa,CAsBf;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,GAAG,SAAS,EACpC,IAAI,EAAE,iBAAiB,GACtB,mBAAmB,CAiBrB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,iBAAiB,GACtB,aAAa,EAAE,CAMjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAOxD"}
|
|
@@ -67,6 +67,28 @@ export function resolveAudioProvider(requested, keys) {
|
|
|
67
67
|
}
|
|
68
68
|
throw new Error('No audio provider API key found. Please set one of: DEEPGRAM_API_KEY, ASSEMBLYAI_API_KEY, GROQ_API_KEY, or GEMINI_API_KEY');
|
|
69
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns an ordered list of audio providers to attempt for a given starting
|
|
72
|
+
* provider, filtered to only those whose API keys are available.
|
|
73
|
+
*
|
|
74
|
+
* Fallback order: start with the requested provider, then visit remaining
|
|
75
|
+
* providers in canonical ranking order (deepgram → assemblyai → groq → gemini),
|
|
76
|
+
* so every starting provider can reach all others:
|
|
77
|
+
* deepgram → deepgram, assemblyai, groq, gemini
|
|
78
|
+
* assemblyai → assemblyai, deepgram, groq, gemini
|
|
79
|
+
* groq → groq, deepgram, assemblyai, gemini
|
|
80
|
+
* gemini → gemini, deepgram, assemblyai, groq
|
|
81
|
+
*
|
|
82
|
+
* Used for runtime error-based fallback in transcribeVideo: if the first
|
|
83
|
+
* provider's API call throws, the caller retries with the next entry.
|
|
84
|
+
*/
|
|
85
|
+
export function getRuntimeAudioFallbackChain(provider, keys) {
|
|
86
|
+
const candidates = [
|
|
87
|
+
provider,
|
|
88
|
+
...AUDIO_PROVIDER_RANKING.filter((p) => p !== provider),
|
|
89
|
+
];
|
|
90
|
+
return candidates.filter((p) => hasAudioKey(p, keys));
|
|
91
|
+
}
|
|
70
92
|
/**
|
|
71
93
|
* Build the AudioProviderKeys object from environment variables
|
|
72
94
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioRouter.js","sourceRoot":"","sources":["../../src/services/audioRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;;GAGG;AACH,MAAM,sBAAsB,GAAoB;IAC9C,UAAU;IACV,YAAY;IACZ,MAAM;IACN,QAAQ;CACT,CAAA;AAED,SAAS,WAAW,CAClB,QAAuB,EACvB,IAAuB;IAEvB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,cAAc,CAAA;QAC5B,KAAK,YAAY;YACf,OAAO,IAAI,CAAC,gBAAgB,CAAA;QAC9B,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,UAAU,CAAA;QACxB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,YAAY,CAAA;IAC5B,CAAC;AACH,CAAC;AASD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAuB;IAEvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAEnB,CAAA;IACb,IACE,WAAW,KAAK,UAAU;QAC1B,WAAW,KAAK,YAAY;QAC5B,WAAW,KAAK,MAAM;QACtB,WAAW,KAAK,QAAQ,EACxB,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,yDAAyD;IACzD,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO,UAAU,CAAA;IAC1C,IAAI,IAAI,CAAC,gBAAgB;QAAE,OAAO,YAAY,CAAA;IAC9C,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAA;IAClC,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAA;IAEtC,MAAM,IAAI,KAAK,CACb,2HAA2H,CAC5H,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAoC,EACpC,IAAuB;IAEvB,MAAM,QAAQ,GAAG,SAAS,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAA;IAE3D,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,QAAQ,EAAE,CAAA;IACrB,CAAC;IAED,oEAAoE;IACpE,KAAK,MAAM,QAAQ,IAAI,sBAAsB,EAAE,CAAC;QAC9C,IAAI,QAAQ,KAAK,QAAQ,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAA;QACvD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2HAA2H,CAC5H,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC9C,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAClD,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;QACtC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;KAC3C,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"audioRouter.js","sourceRoot":"","sources":["../../src/services/audioRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;;GAGG;AACH,MAAM,sBAAsB,GAAoB;IAC9C,UAAU;IACV,YAAY;IACZ,MAAM;IACN,QAAQ;CACT,CAAA;AAED,SAAS,WAAW,CAClB,QAAuB,EACvB,IAAuB;IAEvB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,cAAc,CAAA;QAC5B,KAAK,YAAY;YACf,OAAO,IAAI,CAAC,gBAAgB,CAAA;QAC9B,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,UAAU,CAAA;QACxB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,YAAY,CAAA;IAC5B,CAAC;AACH,CAAC;AASD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAuB;IAEvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAEnB,CAAA;IACb,IACE,WAAW,KAAK,UAAU;QAC1B,WAAW,KAAK,YAAY;QAC5B,WAAW,KAAK,MAAM;QACtB,WAAW,KAAK,QAAQ,EACxB,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,yDAAyD;IACzD,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO,UAAU,CAAA;IAC1C,IAAI,IAAI,CAAC,gBAAgB;QAAE,OAAO,YAAY,CAAA;IAC9C,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAA;IAClC,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAA;IAEtC,MAAM,IAAI,KAAK,CACb,2HAA2H,CAC5H,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAoC,EACpC,IAAuB;IAEvB,MAAM,QAAQ,GAAG,SAAS,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAA;IAE3D,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,QAAQ,EAAE,CAAA;IACrB,CAAC;IAED,oEAAoE;IACpE,KAAK,MAAM,QAAQ,IAAI,sBAAsB,EAAE,CAAC;QAC9C,IAAI,QAAQ,KAAK,QAAQ,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAA;QACvD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2HAA2H,CAC5H,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAuB,EACvB,IAAuB;IAEvB,MAAM,UAAU,GAAoB;QAClC,QAAQ;QACR,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC;KACxD,CAAA;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC9C,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAClD,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;QACtC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;KAC3C,CAAA;AACH,CAAC"}
|
|
@@ -23,10 +23,15 @@ export type ProviderResult = {
|
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
25
25
|
* Resolve the provider, with optional fallback behavior.
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* If the requested provider's key is missing, falls back in canonical priority
|
|
27
|
+
* order (glm → kimi → gemini), skipping the requested provider and visiting
|
|
28
|
+
* all remaining candidates. This means every starting provider can eventually
|
|
29
|
+
* reach any other provider:
|
|
30
|
+
* glm → kimi → gemini
|
|
31
|
+
* kimi → glm → gemini
|
|
32
|
+
* gemini → glm → kimi
|
|
29
33
|
* Returns a ProviderResult with `fallbackFrom` set if a fallback occurred.
|
|
34
|
+
* Throws only when no provider API key is available at all.
|
|
30
35
|
*/
|
|
31
36
|
export declare function resolveProviderWithFallback(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean): ProviderResult;
|
|
32
37
|
/**
|
|
@@ -37,10 +42,12 @@ export declare function getDefaultProvider(): VideoProvider;
|
|
|
37
42
|
* Returns an ordered list of providers to attempt for a given starting provider,
|
|
38
43
|
* filtered to only those whose API keys are available.
|
|
39
44
|
*
|
|
40
|
-
* Fallback order
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
45
|
+
* Fallback order: start with the requested provider, then visit remaining
|
|
46
|
+
* providers in canonical priority order (glm → kimi → gemini), so every
|
|
47
|
+
* starting provider can reach all other providers:
|
|
48
|
+
* glm → glm, kimi, gemini
|
|
49
|
+
* kimi → kimi, glm, gemini
|
|
50
|
+
* gemini → gemini, glm, kimi
|
|
44
51
|
*
|
|
45
52
|
* This is used for runtime error-based fallback: if the first provider's API call
|
|
46
53
|
* throws (overloaded, timeout, 5xx, etc.), the caller retries with the next entry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providerRouter.d.ts","sourceRoot":"","sources":["../../src/services/providerRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAErD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,aAAa,CAiBf;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,aAAa,CAAA;IACvB,YAAY,CAAC,EAAE,aAAa,CAAA;CAC7B,CAAA;
|
|
1
|
+
{"version":3,"file":"providerRouter.d.ts","sourceRoot":"","sources":["../../src/services/providerRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAErD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,aAAa,CAiBf;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,aAAa,CAAA;IACvB,YAAY,CAAC,EAAE,aAAa,CAAA;CAC7B,CAAA;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,cAAc,CAqBhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAUlD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,aAAa,EAAE,CAcjB;AAQD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAerC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAQzC"}
|
|
@@ -23,25 +23,36 @@ export function selectProvider(provider, hasKimiKey, hasGLMKey, hasGeminiKey = f
|
|
|
23
23
|
}
|
|
24
24
|
return provider;
|
|
25
25
|
}
|
|
26
|
+
/** Canonical priority order for all video providers. */
|
|
27
|
+
const VIDEO_PROVIDER_PRIORITY = ['glm', 'kimi', 'gemini'];
|
|
26
28
|
/**
|
|
27
29
|
* Resolve the provider, with optional fallback behavior.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
30
|
+
* If the requested provider's key is missing, falls back in canonical priority
|
|
31
|
+
* order (glm → kimi → gemini), skipping the requested provider and visiting
|
|
32
|
+
* all remaining candidates. This means every starting provider can eventually
|
|
33
|
+
* reach any other provider:
|
|
34
|
+
* glm → kimi → gemini
|
|
35
|
+
* kimi → glm → gemini
|
|
36
|
+
* gemini → glm → kimi
|
|
31
37
|
* Returns a ProviderResult with `fallbackFrom` set if a fallback occurred.
|
|
38
|
+
* Throws only when no provider API key is available at all.
|
|
32
39
|
*/
|
|
33
40
|
export function resolveProviderWithFallback(provider, hasKimiKey, hasGLMKey, hasGeminiKey = false) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
const keyMap = {
|
|
42
|
+
glm: hasGLMKey,
|
|
43
|
+
kimi: hasKimiKey,
|
|
44
|
+
gemini: hasGeminiKey,
|
|
45
|
+
};
|
|
46
|
+
if (keyMap[provider]) {
|
|
47
|
+
return { provider };
|
|
39
48
|
}
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
// Walk remaining providers in canonical priority order, skipping the requested one
|
|
50
|
+
for (const candidate of VIDEO_PROVIDER_PRIORITY) {
|
|
51
|
+
if (candidate !== provider && keyMap[candidate]) {
|
|
52
|
+
return { provider: candidate, fallbackFrom: provider };
|
|
53
|
+
}
|
|
42
54
|
}
|
|
43
|
-
|
|
44
|
-
return { provider: validated };
|
|
55
|
+
throw new Error('No video provider API key found. Please set at least one of: Z_AI_API_KEY, MOONSHOT_API_KEY, or GEMINI_API_KEY');
|
|
45
56
|
}
|
|
46
57
|
/**
|
|
47
58
|
* Get the default provider from environment variable
|
|
@@ -59,20 +70,22 @@ export function getDefaultProvider() {
|
|
|
59
70
|
* Returns an ordered list of providers to attempt for a given starting provider,
|
|
60
71
|
* filtered to only those whose API keys are available.
|
|
61
72
|
*
|
|
62
|
-
* Fallback order
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
73
|
+
* Fallback order: start with the requested provider, then visit remaining
|
|
74
|
+
* providers in canonical priority order (glm → kimi → gemini), so every
|
|
75
|
+
* starting provider can reach all other providers:
|
|
76
|
+
* glm → glm, kimi, gemini
|
|
77
|
+
* kimi → kimi, glm, gemini
|
|
78
|
+
* gemini → gemini, glm, kimi
|
|
66
79
|
*
|
|
67
80
|
* This is used for runtime error-based fallback: if the first provider's API call
|
|
68
81
|
* throws (overloaded, timeout, 5xx, etc.), the caller retries with the next entry.
|
|
69
82
|
*/
|
|
70
83
|
export function getRuntimeFallbackChain(provider, hasKimiKey, hasGLMKey, hasGeminiKey = false) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
84
|
+
// Start with the requested provider, then remaining in canonical priority order
|
|
85
|
+
const candidates = [
|
|
86
|
+
provider,
|
|
87
|
+
...VIDEO_PROVIDER_PRIORITY.filter((p) => p !== provider),
|
|
88
|
+
];
|
|
76
89
|
const keyMap = {
|
|
77
90
|
glm: hasGLMKey,
|
|
78
91
|
kimi: hasKimiKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providerRouter.js","sourceRoot":"","sources":["../../src/services/providerRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAI3C;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAuB,EACvB,UAAmB,EACnB,SAAkB,EAClB,eAAwB,KAAK;IAE7B,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAYD
|
|
1
|
+
{"version":3,"file":"providerRouter.js","sourceRoot":"","sources":["../../src/services/providerRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAI3C;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAuB,EACvB,UAAmB,EACnB,SAAkB,EAClB,eAAwB,KAAK;IAE7B,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAYD,wDAAwD;AACxD,MAAM,uBAAuB,GAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;AAE1E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAAuB,EACvB,UAAmB,EACnB,SAAkB,EAClB,eAAwB,KAAK;IAE7B,MAAM,MAAM,GAAmC;QAC7C,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,YAAY;KACrB,CAAA;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,QAAQ,EAAE,CAAA;IACrB,CAAC;IAED,mFAAmF;IACnF,KAAK,MAAM,SAAS,IAAI,uBAAuB,EAAE,CAAC;QAChD,IAAI,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAA;QACxD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,gHAAgH,CACjH,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAA;IAC1D,IACE,WAAW,KAAK,KAAK;QACrB,WAAW,KAAK,MAAM;QACtB,WAAW,KAAK,QAAQ,EACxB,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAuB,EACvB,UAAmB,EACnB,SAAkB,EAClB,eAAwB,KAAK;IAE7B,gFAAgF;IAChF,MAAM,UAAU,GAAoB;QAClC,QAAQ;QACR,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC;KACzD,CAAA;IAED,MAAM,MAAM,GAAmC;QAC7C,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,YAAY;KACrB,CAAA;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,iEAAiE;AACjE,MAAM,eAAe,GAAG,EAAE,CAAA;AAE1B,yFAAyF;AACzF,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAE9B;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAA;IAClD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAClC,MAAM,QAAQ,GAAG,OAAO,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAEnD,IAAI,KAAK,EAAE,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ;YAAE,OAAO,kBAAkB,CAAA,CAAC,4BAA4B;QACrE,IAAI,QAAQ,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAA,CAAC,2BAA2B;QAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA,CAAC,4BAA4B;IAC3D,CAAC;IAED,kEAAkE;IAClE,IAAI,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,eAAe,CAAA;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAA;AACzD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAA;IAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACtD,kEAAkE;IAClE,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3B,OAAO,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,eAAe,CAAA;AACpD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcribeVideo.d.ts","sourceRoot":"","sources":["../../src/tools/transcribeVideo.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"transcribeVideo.d.ts","sourceRoot":"","sources":["../../src/tools/transcribeVideo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8BH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,KAAK,qBAAqB,GAAG,OAAO,KAAK,EAAE,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAmD9E,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,qBAAqB,KAC5B,OAAO,CAAC,cAAc,CAyGxB,CAAA"}
|
|
@@ -8,11 +8,50 @@ import { DeepgramClient } from '../services/audio/deepgramClient.js';
|
|
|
8
8
|
import { AssemblyAiClient } from '../services/audio/assemblyAiClient.js';
|
|
9
9
|
import { GroqAudioClient } from '../services/audio/groqAudioClient.js';
|
|
10
10
|
import { createGeminiClient } from '../services/geminiClient.js';
|
|
11
|
-
import { resolveAudioProvider, getAudioProviderKeys, } from '../services/audioRouter.js';
|
|
11
|
+
import { resolveAudioProvider, getAudioProviderKeys, getRuntimeAudioFallbackChain, } from '../services/audioRouter.js';
|
|
12
12
|
import { createTempDir, cleanupTempDir, generateTempFilename, } from '../utils/tempFiles.js';
|
|
13
13
|
import { isPlatformUrl, isRemoteUrl, normalizeVideoPath, downloadVideoToTemp, downloadWithYtDlp, wasResolutionCapped, } from '../utils/videoUtils.js';
|
|
14
14
|
import { logProgress } from '../utils/logger.js';
|
|
15
15
|
import { proNotice } from '../utils/license.js';
|
|
16
|
+
/**
|
|
17
|
+
* Dispatch transcription to the given audio provider.
|
|
18
|
+
* Extracted into a standalone helper so the retry loop in transcribeVideoTool
|
|
19
|
+
* can call it without duplicating the switch statement.
|
|
20
|
+
*/
|
|
21
|
+
async function doTranscribe(provider, audioPath, opts) {
|
|
22
|
+
const { language, diarize, translate } = opts;
|
|
23
|
+
switch (provider) {
|
|
24
|
+
case 'deepgram': {
|
|
25
|
+
const apiKey = process.env.DEEPGRAM_API_KEY;
|
|
26
|
+
const client = new DeepgramClient(apiKey);
|
|
27
|
+
const result = await client.transcribe(audioPath, { language, diarize });
|
|
28
|
+
return result.text;
|
|
29
|
+
}
|
|
30
|
+
case 'assemblyai': {
|
|
31
|
+
const apiKey = process.env.ASSEMBLYAI_API_KEY;
|
|
32
|
+
const client = new AssemblyAiClient(apiKey);
|
|
33
|
+
const result = await client.transcribe(audioPath, { language, diarize });
|
|
34
|
+
return result.text;
|
|
35
|
+
}
|
|
36
|
+
case 'groq': {
|
|
37
|
+
const apiKey = process.env.GROQ_API_KEY;
|
|
38
|
+
const client = new GroqAudioClient(apiKey);
|
|
39
|
+
const result = await client.transcribe(audioPath, { language, translate });
|
|
40
|
+
return result.text;
|
|
41
|
+
}
|
|
42
|
+
case 'gemini': {
|
|
43
|
+
const geminiClient = createGeminiClient();
|
|
44
|
+
if (!geminiClient) {
|
|
45
|
+
throw new Error('Gemini provider selected but GEMINI_API_KEY is not configured.');
|
|
46
|
+
}
|
|
47
|
+
await logProgress('Uploading audio to Gemini...');
|
|
48
|
+
const uploadedFile = await geminiClient.uploadVideo(audioPath, 'audio/mp4');
|
|
49
|
+
await logProgress('Waiting for Gemini to process audio...');
|
|
50
|
+
await geminiClient.waitForFileProcessing(uploadedFile.name);
|
|
51
|
+
return geminiClient.transcribeAudio(uploadedFile);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
16
55
|
export const transcribeVideoTool = async (params) => {
|
|
17
56
|
let tempDir = null;
|
|
18
57
|
try {
|
|
@@ -21,8 +60,9 @@ export const transcribeVideoTool = async (params) => {
|
|
|
21
60
|
const keys = getAudioProviderKeys();
|
|
22
61
|
const { provider: selectedProvider, fallbackFrom } = resolveAudioProvider(provider, keys);
|
|
23
62
|
if (fallbackFrom) {
|
|
24
|
-
await logProgress(`Audio provider ${fallbackFrom} unavailable, using ${selectedProvider}`);
|
|
63
|
+
await logProgress(`Audio provider ${fallbackFrom} unavailable (no API key), using ${selectedProvider}`);
|
|
25
64
|
}
|
|
65
|
+
const chain = getRuntimeAudioFallbackChain(selectedProvider, keys);
|
|
26
66
|
tempDir = await createTempDir();
|
|
27
67
|
// Resolve local path — platform URLs via yt-dlp, other remote via fetch, local as-is
|
|
28
68
|
let localVideoPath;
|
|
@@ -37,55 +77,50 @@ export const transcribeVideoTool = async (params) => {
|
|
|
37
77
|
else {
|
|
38
78
|
localVideoPath = normalizeVideoPath(videoPath);
|
|
39
79
|
}
|
|
40
|
-
// Extract audio to temp .m4a
|
|
41
|
-
await logProgress(
|
|
80
|
+
// Extract audio to temp .m4a (once, before the retry loop)
|
|
81
|
+
await logProgress('Extracting audio...');
|
|
42
82
|
const audioPath = path.join(tempDir, generateTempFilename('.m4a'));
|
|
43
83
|
await extractAudio(localVideoPath, audioPath);
|
|
44
|
-
// Transcribe
|
|
84
|
+
// Transcribe with runtime fallback loop
|
|
45
85
|
await logProgress('Transcribing...');
|
|
46
|
-
let transcript;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
transcript =
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
case 'assemblyai': {
|
|
56
|
-
const apiKey = process.env.ASSEMBLYAI_API_KEY;
|
|
57
|
-
const client = new AssemblyAiClient(apiKey);
|
|
58
|
-
const result = await client.transcribe(audioPath, { language, diarize });
|
|
59
|
-
transcript = result.text;
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
case 'groq': {
|
|
63
|
-
const apiKey = process.env.GROQ_API_KEY;
|
|
64
|
-
const client = new GroqAudioClient(apiKey);
|
|
65
|
-
const result = await client.transcribe(audioPath, {
|
|
86
|
+
let transcript = '';
|
|
87
|
+
let usedProvider = selectedProvider;
|
|
88
|
+
const runtimeFallbacks = [];
|
|
89
|
+
for (let i = 0; i < chain.length; i++) {
|
|
90
|
+
const currentProvider = chain[i];
|
|
91
|
+
try {
|
|
92
|
+
transcript = await doTranscribe(currentProvider, audioPath, {
|
|
66
93
|
language,
|
|
94
|
+
diarize,
|
|
67
95
|
translate,
|
|
68
96
|
});
|
|
69
|
-
|
|
97
|
+
usedProvider = currentProvider;
|
|
70
98
|
break;
|
|
71
99
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (i < chain.length - 1) {
|
|
102
|
+
runtimeFallbacks.push(currentProvider);
|
|
103
|
+
const nextProvider = chain[i + 1];
|
|
104
|
+
await logProgress(`${currentProvider} failed (${err instanceof Error ? err.message : String(err)}), retrying with ${nextProvider}...`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
throw err;
|
|
76
108
|
}
|
|
77
|
-
await logProgress('Uploading audio to Gemini...');
|
|
78
|
-
const uploadedFile = await geminiClient.uploadVideo(audioPath, 'audio/mp4');
|
|
79
|
-
await logProgress('Waiting for Gemini to process audio...');
|
|
80
|
-
await geminiClient.waitForFileProcessing(uploadedFile.name);
|
|
81
|
-
transcript = await geminiClient.transcribeAudio(uploadedFile);
|
|
82
|
-
break;
|
|
83
109
|
}
|
|
84
110
|
}
|
|
111
|
+
// Build provider notice (key-based + runtime fallbacks)
|
|
112
|
+
const fallbackParts = [];
|
|
113
|
+
if (fallbackFrom)
|
|
114
|
+
fallbackParts.push(`${fallbackFrom} (no API key)`);
|
|
115
|
+
for (const f of runtimeFallbacks)
|
|
116
|
+
fallbackParts.push(`${f} (runtime error)`);
|
|
117
|
+
const fallbackNotice = fallbackParts.length > 0
|
|
118
|
+
? ` (fell back from: ${fallbackParts.join(', ')})`
|
|
119
|
+
: '';
|
|
85
120
|
const content = [
|
|
86
121
|
{
|
|
87
122
|
type: 'text',
|
|
88
|
-
text: `[Transcript — provider: ${
|
|
123
|
+
text: `[Transcript — provider: ${usedProvider}${fallbackNotice}${diarize ? ', diarization enabled' : ''}${translate ? ', translated to English' : ''}]\n\n${transcript}`,
|
|
89
124
|
},
|
|
90
125
|
];
|
|
91
126
|
if (wasResolutionCapped()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcribeVideo.js","sourceRoot":"","sources":["../../src/tools/transcribeVideo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"transcribeVideo.js","sourceRoot":"","sources":["../../src/tools/transcribeVideo.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "video-context-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.1-beta",
|
|
4
4
|
"description": "A Model Context Protocol server that gives GitHub Copilot the ability to understand and analyze video content",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"fluent-ffmpeg": "^2.1.3",
|
|
45
45
|
"openai": "^4.0.0",
|
|
46
46
|
"p-limit": "^7.3.0",
|
|
47
|
-
"youtube-dl-exec": "^3.1.
|
|
47
|
+
"youtube-dl-exec": "^3.1.3",
|
|
48
48
|
"zod": "^3.25.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|