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 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: **GLM Kimi Gemini**.
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.21.0-beta";
1
+ export declare const VERSION = "0.23.1-beta";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by scripts/sync-version.ts — do not edit
2
- export const VERSION = '0.21.0-beta';
2
+ export const VERSION = '0.23.1-beta';
3
3
  //# sourceMappingURL=version.js.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
- * - If requested provider is glm but GLM key is missing, fallback to kimi, then gemini.
27
- * - If requested provider is kimi but Kimi key is missing and Gemini key exists, fallback to gemini.
28
- * - If requested provider is gemini, no fallback is applied (it's the last resort).
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 (mirrors the key-check convention in resolveProviderWithFallback):
41
- * glm → glm, kimi, gemini (filtered to those with keys)
42
- * kimi → kimi, gemini (no kimi glm fallback)
43
- * gemini gemini (last resort, no fallback)
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;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,cAAc,CAgBhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAUlD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,GAC5B,aAAa,EAAE,CAejB;AAQD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAerC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAQzC"}
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
- * - If requested provider is glm but GLM key is missing, fallback to kimi, then gemini.
29
- * - If requested provider is kimi but Kimi key is missing and Gemini key exists, fallback to gemini.
30
- * - If requested provider is gemini, no fallback is applied (it's the last resort).
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
- if (provider === 'glm' && !hasGLMKey) {
35
- if (hasKimiKey)
36
- return { provider: 'kimi', fallbackFrom: 'glm' };
37
- if (hasGeminiKey)
38
- return { provider: 'gemini', fallbackFrom: 'glm' };
41
+ const keyMap = {
42
+ glm: hasGLMKey,
43
+ kimi: hasKimiKey,
44
+ gemini: hasGeminiKey,
45
+ };
46
+ if (keyMap[provider]) {
47
+ return { provider };
39
48
  }
40
- if (provider === 'kimi' && !hasKimiKey && hasGeminiKey) {
41
- return { provider: 'gemini', fallbackFrom: 'kimi' };
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
- const validated = selectProvider(provider, hasKimiKey, hasGLMKey, hasGeminiKey);
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 (mirrors the key-check convention in resolveProviderWithFallback):
63
- * glm → glm, kimi, gemini (filtered to those with keys)
64
- * kimi → kimi, gemini (no kimi glm fallback)
65
- * gemini gemini (last resort, no fallback)
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
- const candidates = provider === 'glm'
72
- ? ['glm', 'kimi', 'gemini']
73
- : provider === 'kimi'
74
- ? ['kimi', 'gemini']
75
- : ['gemini'];
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":"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"}
1
+ {"version":3,"file":"providerRouter.js","sourceRoot":"","sources":["../../src/services/providerRouter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transcribeVideo.d.ts","sourceRoot":"","sources":["../../src/tools/transcribeVideo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH,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;AAE9E,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,qBAAqB,KAC5B,OAAO,CAAC,cAAc,CAiHxB,CAAA"}
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(`Extracting audio (${selectedProvider})...`);
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 via selected provider
84
+ // Transcribe with runtime fallback loop
45
85
  await logProgress('Transcribing...');
46
- let transcript;
47
- switch (selectedProvider) {
48
- case 'deepgram': {
49
- const apiKey = process.env.DEEPGRAM_API_KEY;
50
- const client = new DeepgramClient(apiKey);
51
- const result = await client.transcribe(audioPath, { language, diarize });
52
- transcript = result.text;
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
- transcript = result.text;
97
+ usedProvider = currentProvider;
70
98
  break;
71
99
  }
72
- case 'gemini': {
73
- const geminiClient = createGeminiClient();
74
- if (!geminiClient) {
75
- throw new Error('Gemini provider selected but GEMINI_API_KEY is not configured.');
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: ${selectedProvider}${fallbackFrom ? ` (fell back from ${fallbackFrom})` : ''}${diarize ? ', diarization enabled' : ''}${translate ? ', translated to English' : ''}]\n\n${transcript}`,
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":"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"}
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,EACpB,4BAA4B,GAG7B,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,aAAa,EACb,cAAc,EACd,oBAAoB,GACrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAM/C;;;;GAIG;AACH,KAAK,UAAU,YAAY,CACzB,QAAuB,EACvB,SAAiB,EACjB,IAAiE;IAEjE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;IAC7C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAiB,CAAA;YAC5C,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;YACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;YACxE,OAAO,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAmB,CAAA;YAC9C,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;YAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;YACxE,OAAO,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAa,CAAA;YACxC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;YAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAA;YAC1E,OAAO,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAA;YACzC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAA;YACH,CAAC;YACD,MAAM,WAAW,CAAC,8BAA8B,CAAC,CAAA;YACjD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,CACjD,SAAS,EACT,WAAW,CACZ,CAAA;YACD,MAAM,WAAW,CAAC,wCAAwC,CAAC,CAAA;YAC3D,MAAM,YAAY,CAAC,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAC3D,OAAO,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,MAA6B,EACJ,EAAE;IAC3B,IAAI,OAAO,GAAkB,IAAI,CAAA;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;QAC1E,MAAM,QAAQ,GAA8B,MAAM,CAAC,QAAQ,CAAA;QAE3D,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAA;QACnC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAChD,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAEtC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,WAAW,CACf,kBAAkB,YAAY,oCAAoC,gBAAgB,EAAE,CACrF,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,4BAA4B,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;QAElE,OAAO,GAAG,MAAM,aAAa,EAAE,CAAA;QAE/B,qFAAqF;QACrF,IAAI,cAAsB,CAAA;QAC1B,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,WAAW,CAAC,yCAAyC,CAAC,CAAA;YAC5D,cAAc,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC9D,CAAC;aAAM,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,MAAM,WAAW,CAAC,6BAA6B,CAAC,CAAA;YAChD,cAAc,GAAG,MAAM,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAChE,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;QAChD,CAAC;QAED,2DAA2D;QAC3D,MAAM,WAAW,CAAC,qBAAqB,CAAC,CAAA;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAA;QAClE,MAAM,YAAY,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;QAE7C,wCAAwC;QACxC,MAAM,WAAW,CAAC,iBAAiB,CAAC,CAAA;QACpC,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,YAAY,GAAkB,gBAAgB,CAAA;QAClD,MAAM,gBAAgB,GAAoB,EAAE,CAAA;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAChC,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,SAAS,EAAE;oBAC1D,QAAQ;oBACR,OAAO;oBACP,SAAS;iBACV,CAAC,CAAA;gBACF,YAAY,GAAG,eAAe,CAAA;gBAC9B,MAAK;YACP,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;oBACtC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;oBACjC,MAAM,WAAW,CACf,GAAG,eAAe,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,YAAY,KAAK,CACpH,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,MAAM,aAAa,GAAa,EAAE,CAAA;QAClC,IAAI,YAAY;YAAE,aAAa,CAAC,IAAI,CAAC,GAAG,YAAY,eAAe,CAAC,CAAA;QACpE,KAAK,MAAM,CAAC,IAAI,gBAAgB;YAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QAC5E,MAAM,cAAc,GAClB,aAAa,CAAC,MAAM,GAAG,CAAC;YACtB,CAAC,CAAC,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAClD,CAAC,CAAC,EAAE,CAAA;QAER,MAAM,OAAO,GAA8B;YACzC;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,2BAA2B,YAAY,GAAG,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,QAAQ,UAAU,EAAE;aACzK;SACF,CAAA;QAED,IAAI,mBAAmB,EAAE,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,SAAS,CAAC,2CAA2C,CAAC;aAC7D,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAA;IACpB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBAC3F;aACF;SACF,CAAA;IACH,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,cAAc,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "video-context-mcp-server",
3
- "version": "0.22.0-beta",
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.1",
47
+ "youtube-dl-exec": "^3.1.3",
48
48
  "zod": "^3.25.0"
49
49
  },
50
50
  "devDependencies": {