video-context-mcp-server 1.2.3 → 1.3.0
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 +34 -25
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/m3Client.d.ts +75 -0
- package/dist/services/m3Client.d.ts.map +1 -0
- package/dist/services/m3Client.js +195 -0
- package/dist/services/m3Client.js.map +1 -0
- package/dist/services/providerRouter.d.ts +28 -22
- package/dist/services/providerRouter.d.ts.map +1 -1
- package/dist/services/providerRouter.js +51 -27
- package/dist/services/providerRouter.js.map +1 -1
- package/dist/tools/analyzeVideo.d.ts.map +1 -1
- package/dist/tools/analyzeVideo.js +22 -0
- package/dist/tools/analyzeVideo.js.map +1 -1
- package/dist/tools/orchestrator.d.ts +2 -0
- package/dist/tools/orchestrator.d.ts.map +1 -1
- package/dist/tools/orchestrator.js +4 -2
- package/dist/tools/orchestrator.js.map +1 -1
- package/dist/tools/redactSensitive.d.ts.map +1 -1
- package/dist/tools/redactSensitive.js +14 -0
- package/dist/tools/redactSensitive.js.map +1 -1
- package/dist/tools/schemas.d.ts +5 -0
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +5 -4
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/searchTimestamp.d.ts.map +1 -1
- package/dist/tools/searchTimestamp.js +7 -1
- package/dist/tools/searchTimestamp.js.map +1 -1
- package/dist/tools/summarizeVideo.d.ts.map +1 -1
- package/dist/tools/summarizeVideo.js +53 -7
- package/dist/tools/summarizeVideo.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,8 +14,8 @@ An MCP server that gives coding assistants (GitHub Copilot, Cursor, Claude Code)
|
|
|
14
14
|
- 📊 **Video Metadata** — Get duration, resolution, fps, codec, and other technical details
|
|
15
15
|
- 🎙️ **Audio Transcription** — Transcribe speech with paragraph-level timestamps (`[MM:SS]`) or export as SRT/VTT subtitles and JSON using Deepgram, AssemblyAI, Groq/Whisper, or Gemini
|
|
16
16
|
- 🔊 **Speaker Diarization** — Identify who said what (Deepgram and AssemblyAI)
|
|
17
|
-
- 🔊 **Audio-Enhanced Analysis** — Auto-transcribes audio and injects transcripts into AI prompts for richer results (GLM
|
|
18
|
-
- 🔄 **Multi-Provider Support** — Choose between GLM-4.6V, Qwen3.7, Kimi K2.6, Gemini,
|
|
17
|
+
- 🔊 **Audio-Enhanced Analysis** — Auto-transcribes audio and injects transcripts into AI prompts for richer results (all non-Gemini video providers: GLM, MiniMax-M3, Kimi, Qwen, MiMo)
|
|
18
|
+
- 🔄 **Multi-Provider Support** — Choose between GLM-4.6V, Qwen3.7, Kimi K2.6, Gemini, MiMo-V2.5, or MiniMax-M3
|
|
19
19
|
- 🎯 **Smart Video Handling** — Extracts keyframes from long videos to reduce token usage
|
|
20
20
|
- 🗣️ **Text-to-Speech** ⚠️ _Experimental_ — Convert text to natural speech audio (MiniMax TTS)
|
|
21
21
|
- 🖼️ **Image Generation** ⚠️ _Experimental_ — Generate images from text prompts (MiniMax image-01)
|
|
@@ -411,7 +411,7 @@ If you need a MiniMax API key, get it from the [MiniMax interface key page](http
|
|
|
411
411
|
|
|
412
412
|
### Video Providers
|
|
413
413
|
|
|
414
|
-
Set all keys to get the full fallback chain. The server will try Gemini first, then
|
|
414
|
+
Set all keys to get the full fallback chain. The server will try Gemini first, then MiniMax-M3, then Kimi, then Qwen, then MiMo, then GLM last (the free tier is aggressively rate-limited, so GLM is the last-resort fallback), so having all keys ensures it never gets stuck without a working provider:
|
|
415
415
|
|
|
416
416
|
| Provider | Key | Link |
|
|
417
417
|
| ----------------------------------------- | ------------------- | --------------------------------------------------------------------------------------------- |
|
|
@@ -420,14 +420,16 @@ Set all keys to get the full fallback chain. The server will try Gemini first, t
|
|
|
420
420
|
| **Qwen3.7** (paid) | `DASHSCOPE_API_KEY` | [Get key](https://modelstudio.console.alibabacloud.com/ap-southeast-1?tab=dashboard#/api-key) |
|
|
421
421
|
| **Kimi K2.6** (paid) | `MOONSHOT_API_KEY` | [Get key](https://platform.kimi.ai) |
|
|
422
422
|
| **MiMo-V2.5** (paid) | `MIMO_API_KEY` | [Get key](https://platform.xiaomimimo.com/#/console/api-keys) |
|
|
423
|
+
| **MiniMax-M3** (paid) | `MINIMAX_API_KEY` | [Get key](https://platform.minimax.io/user-center/basic-information/interface-key) |
|
|
423
424
|
|
|
424
|
-
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:
|
|
425
|
+
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. **GLM is last in the chain** — its free tier applies aggressive rate-limit throttling, so all other providers are preferred when their keys are available. **Kimi is placed ahead of Qwen** because Kimi accepts native file upload up to 100 MB, so large local videos work out-of-the-box without setting up the optional S3 relay (which most users skip):
|
|
425
426
|
|
|
426
|
-
- Gemini default (standard): **Gemini →
|
|
427
|
-
-
|
|
428
|
-
-
|
|
429
|
-
-
|
|
430
|
-
- MiMo default: **MiMo → Gemini →
|
|
427
|
+
- Gemini default (standard): **Gemini → MiniMax-M3 → Kimi → Qwen → MiMo → GLM**
|
|
428
|
+
- MiniMax-M3 default: **MiniMax-M3 → Gemini → Kimi → Qwen → MiMo → GLM**
|
|
429
|
+
- Kimi default: **Kimi → Gemini → MiniMax-M3 → Qwen → MiMo → GLM**
|
|
430
|
+
- Qwen default: **Qwen → Gemini → MiniMax-M3 → Kimi → MiMo → GLM**
|
|
431
|
+
- MiMo default: **MiMo → Gemini → MiniMax-M3 → Kimi → Qwen → GLM**
|
|
432
|
+
- GLM default: **GLM → Gemini → MiniMax-M3 → Kimi → Qwen → MiMo**
|
|
431
433
|
|
|
432
434
|
### Audio Providers
|
|
433
435
|
|
|
@@ -448,17 +450,17 @@ When an audio key is missing or an audio API call fails at runtime, tools automa
|
|
|
448
450
|
|
|
449
451
|
### Video Providers
|
|
450
452
|
|
|
451
|
-
| Feature | Gemini 3.5 Flash (default) | GLM-4.6V | Qwen3.7 | Kimi K2.6 | MiMo-V2.5 |
|
|
452
|
-
| -------------- | ---------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------ | ---------------------------------------------- | ------------------------------------------------------ |
|
|
453
|
-
| Price | Free tier available | Free tier available (GLM-4.6V-Flash) | $0.50 input / $3.00 output per 1M tokens | $0.60 input / $3.00 output per 1M tokens | $0.40 input / $2.00 output per 1M tokens |
|
|
454
|
-
| Video formats | mp4, mpeg, mov, avi, flv, mpg, webm, wmv, 3gpp | mp4, avi, mov, wmv, webm, m4v | mp4, avi, mov, wmv, webm, m4v | mp4, mpeg, mov, avi, flv, mpg, webm, wmv, 3gpp | mp4, mov, avi, wmv |
|
|
455
|
-
| Context window | 1M tokens | 128K tokens | 1M tokens | 256K tokens | 256K tokens |
|
|
456
|
-
| Max file size | 2 GB | ~12 MB base64 / frames fallback / **unlimited w/ S3↓** | ~10 MB base64 / frames fallback / **unlimited w/ S3↓** | 100 MB | ~10 MB base64 / frames fallback / **unlimited w/ S3↓** |
|
|
457
|
-
| Best for | **Default** — free, no card required | Free, no card required | SOTA agentic coding | Paid — broadest format support | Paid — thinking mode; multimodal |
|
|
453
|
+
| Feature | Gemini 3.5 Flash (default) | GLM-4.6V | Qwen3.7 | Kimi K2.6 | MiMo-V2.5 | MiniMax-M3 |
|
|
454
|
+
| -------------- | ---------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------ | ---------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
|
|
455
|
+
| Price | Free tier available | Free tier available (GLM-4.6V-Flash) | $0.50 input / $3.00 output per 1M tokens | $0.60 input / $3.00 output per 1M tokens | $0.40 input / $2.00 output per 1M tokens | **$0.30 / $1.20** (effective; permanent 50% off) ≤512K |
|
|
456
|
+
| Video formats | mp4, mpeg, mov, avi, flv, mpg, webm, wmv, 3gpp | mp4, avi, mov, wmv, webm, m4v | mp4, avi, mov, wmv, webm, m4v | mp4, mpeg, mov, avi, flv, mpg, webm, wmv, 3gpp | mp4, mov, avi, wmv | mp4, mov, avi, etc. (image frames; ≤100 per request) |
|
|
457
|
+
| Context window | 1M tokens | 128K tokens | 1M tokens | 256K tokens | 256K tokens | **1M tokens** (built for long-video understanding) |
|
|
458
|
+
| Max file size | 2 GB | ~12 MB base64 / frames fallback / **unlimited w/ S3↓** | ~10 MB base64 / frames fallback / **unlimited w/ S3↓** | 100 MB | ~10 MB base64 / frames fallback / **unlimited w/ S3↓** | 100 MB image batch budget / frames fallback |
|
|
459
|
+
| Best for | **Default** — free, no card required | Free, no card required | SOTA agentic coding | Paid — broadest format support | Paid — thinking mode; multimodal | Paid — **best for long videos** (1M context, 100-frame budget, prompt caching 5× cheaper on follow-up) |
|
|
458
460
|
|
|
459
|
-
**Gemini 3.5 Flash** is the default — it offers a free tier with no credit card required, 1M context window, and 2 GB file support. **
|
|
461
|
+
**Gemini 3.5 Flash** is the default — it offers a free tier with no credit card required, 1M context window, and 2 GB file support. **MiniMax-M3** is the second fallback — paid, but has the largest context window (1M tokens) and 100-image-per-request budget, making it the best long-video fallback. **Kimi K2.6** is the third fallback — paid, with native file upload up to 100 MB so large local videos work without S3 relay. **Qwen3.7** is the fourth fallback — paid at $0.50 input / $3.00 output per 1M tokens with SOTA agentic coding performance (capped at 10 MB base64 — large files require S3 relay or frame fallback). **MiMo-V2.5** is the fifth fallback — Xiaomi's multimodal model with thinking mode support ($0.40 input / $2.00 output per 1M tokens). **GLM-4.6V** is the last-resort fallback — also free with no card required, but the free tier applies aggressive rate-limit throttling, so all other providers are preferred when their keys are available.
|
|
460
462
|
|
|
461
|
-
Set `VIDEO_MCP_DEFAULT_PROVIDER=gemini`, `glm`, `qwen`, `kimi`, or `
|
|
463
|
+
Set `VIDEO_MCP_DEFAULT_PROVIDER=gemini`, `glm`, `qwen`, `kimi`, `mimo`, or `m3` to change the default provider used when a tool call does not pass `provider`. If a tool call includes `provider`, that per-call value takes precedence.
|
|
462
464
|
|
|
463
465
|
> **ℹ️ Large local files with GLM, Qwen, or MiMo:** All three providers have a 10–12 MB base64 limit for local files. When a file exceeds this limit, the server first tries to fall back to an upload-capable provider (Gemini or Kimi) if one is available in the fallback chain. Frame-based analysis (evenly-spaced keyframes sent as images) is used only as a **last resort** when no upload-capable provider is available, or when all upload-capable providers fail at runtime — no configuration needed. For the highest quality with large local videos, set up the optional **S3 relay** (below) — GLM, Qwen, and MiMo will receive a presigned URL to the full video, bypassing the limit entirely and taking priority over both fallbacks.
|
|
464
466
|
|
|
@@ -709,13 +711,13 @@ Set `AUDIO_MCP_DEFAULT_PROVIDER` to change the default.
|
|
|
709
711
|
|
|
710
712
|
### Audio
|
|
711
713
|
|
|
712
|
-
| Variable | Description
|
|
713
|
-
| ------------------------------ |
|
|
714
|
-
| `DEEPGRAM_API_KEY` | Deepgram API key
|
|
715
|
-
| `ASSEMBLYAI_API_KEY` | AssemblyAI API key
|
|
716
|
-
| `GROQ_API_KEY` | Groq API key for Whisper transcription
|
|
717
|
-
| `AUDIO_MCP_DEFAULT_PROVIDER` | Default audio provider: `deepgram`, `assemblyai`, `groq`, or `gemini`. Falls back in that order when the selected key is missing.
|
|
718
|
-
| `AUDIO_ENHANCE_VIDEO_ANALYSIS` | Inject audio transcripts into `analyze_video`/`summarize_video` prompts (GLM/Kimi/Qwen/MiMo). `auto` = transcribe when audio track detected; `true` = always; `false` = disabled. | `auto` |
|
|
714
|
+
| Variable | Description | Default |
|
|
715
|
+
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
716
|
+
| `DEEPGRAM_API_KEY` | Deepgram API key | — |
|
|
717
|
+
| `ASSEMBLYAI_API_KEY` | AssemblyAI API key | — |
|
|
718
|
+
| `GROQ_API_KEY` | Groq API key for Whisper transcription | — |
|
|
719
|
+
| `AUDIO_MCP_DEFAULT_PROVIDER` | Default audio provider: `deepgram`, `assemblyai`, `groq`, or `gemini`. Falls back in that order when the selected key is missing. | `deepgram` |
|
|
720
|
+
| `AUDIO_ENHANCE_VIDEO_ANALYSIS` | Inject audio transcripts into `analyze_video`/`summarize_video` prompts (GLM/Kimi/Qwen/MiMo/M3). `auto` = transcribe when audio track detected; `true` = always; `false` = disabled. | `auto` |
|
|
719
721
|
|
|
720
722
|
### Media Generation (MiniMax)
|
|
721
723
|
|
|
@@ -823,6 +825,12 @@ vmcp cache clear:all --yes # skip confirmation
|
|
|
823
825
|
| ------------------------- | ------------------------------------------------------------------------------ | ---------------- |
|
|
824
826
|
| `MIMO_REQUEST_TIMEOUT_MS` | Client-side timeout (ms) for MiMo API requests. Default: `240000` (4 minutes). | `240000` (4 min) |
|
|
825
827
|
|
|
828
|
+
### M3 (MiniMax-M3)
|
|
829
|
+
|
|
830
|
+
| Variable | Description | Default |
|
|
831
|
+
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------- | ---------------- |
|
|
832
|
+
| `M3_REQUEST_TIMEOUT_MS` | Client-side timeout (ms) for MiniMax-M3 API requests. MiniMax-M3 is image-only (100 images per request, 10 MB per image). | `240000` (4 min) |
|
|
833
|
+
|
|
826
834
|
### yt-dlp (Platform Downloads)
|
|
827
835
|
|
|
828
836
|
| Variable | Description | Default |
|
|
@@ -877,6 +885,7 @@ vmcp cache clear:all --yes # skip confirmation
|
|
|
877
885
|
"QWEN_REQUEST_TIMEOUT_MS": "240000",
|
|
878
886
|
"GLM_REQUEST_TIMEOUT_MS": "240000",
|
|
879
887
|
"MIMO_REQUEST_TIMEOUT_MS": "240000",
|
|
888
|
+
"M3_REQUEST_TIMEOUT_MS": "240000",
|
|
880
889
|
"VIDEO_MCP_LICENSE_KEY": "your-license-key"
|
|
881
890
|
}
|
|
882
891
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "1.
|
|
1
|
+
export declare const VERSION = "1.3.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -88,7 +88,7 @@ async function main() {
|
|
|
88
88
|
// Tool 2: summarize_video - Generate structured video summary
|
|
89
89
|
server.registerTool('summarize_video', {
|
|
90
90
|
title: 'Summarize Video',
|
|
91
|
-
description: "Generate a structured summary of the video including overview, key scenes, and timeline. For long videos (>5 min), extracts keyframes to reduce token usage (unless using Gemini, which processes natively). Provider options: '
|
|
91
|
+
description: "Generate a structured summary of the video including overview, key scenes, and timeline. For long videos (>5 min), extracts keyframes to reduce token usage (unless using Gemini, which processes natively). Provider options: 'gemini' (Gemini 3.5 Flash, default), 'glm' (GLM-4.6V), 'qwen' (Qwen3.7), 'kimi' (Kimi K2.6), 'mimo' (MiMo-V2.5), or 'm3' (MiniMax-M3).",
|
|
92
92
|
inputSchema: summarizeVideoSchema,
|
|
93
93
|
}, withUpdateCheck(summarizeVideoTool));
|
|
94
94
|
// Tool 3: extract_frames - Extract frames from video
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiniMax-M3 Client
|
|
3
|
+
* Handles multimodal video understanding via MiniMax's Anthropic-compatible API.
|
|
4
|
+
*
|
|
5
|
+
* API Specification (Confirmed):
|
|
6
|
+
* - Base URL (Anthropic-compatible, recommended): https://api.minimax.io/anthropic
|
|
7
|
+
* - Endpoint: POST {baseURL}/v1/messages
|
|
8
|
+
* - Auth: x-api-key header (Anthropic-style)
|
|
9
|
+
* - Anthropic version: 2023-06-01
|
|
10
|
+
* - Model: MiniMax-M3
|
|
11
|
+
* - Native multimodality with 1M-token context window; explicitly built for
|
|
12
|
+
* "long-video understanding" via extracted JPEG frames.
|
|
13
|
+
* - Per-request caps inherited from Anthropic Messages vision:
|
|
14
|
+
* up to 100 images, 10 MB per image (base64-encoded), 8000x8000 px max.
|
|
15
|
+
* - Caching: $0.06/M effective cache-hit vs $0.30/M effective new input
|
|
16
|
+
* (5x cheaper on follow-up calls when content is the same).
|
|
17
|
+
*/
|
|
18
|
+
export interface M3ClientOptions {
|
|
19
|
+
apiKey: string;
|
|
20
|
+
baseURL?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare class M3Client {
|
|
23
|
+
private apiKey;
|
|
24
|
+
private baseURL;
|
|
25
|
+
constructor(options: M3ClientOptions);
|
|
26
|
+
/**
|
|
27
|
+
* Send a vision analysis request — array of JPEG/PNG frames + text prompt.
|
|
28
|
+
* Returns the model's text response (skipping `thinking` blocks).
|
|
29
|
+
*
|
|
30
|
+
* @param images Base64-encoded frames with MIME types
|
|
31
|
+
* @param prompt Text prompt (question, summarization, etc.)
|
|
32
|
+
* @param opts.maxImages Cap images per request (default 100, Anthropic 200K cap)
|
|
33
|
+
* @param opts.maxImageBytes Cap per-image base64 size (default 10 MB)
|
|
34
|
+
* @param opts.useCache Add `cache_control: { type: 'ephemeral' }` to the last
|
|
35
|
+
* image block to enable explicit prompt caching
|
|
36
|
+
*/
|
|
37
|
+
analyzeImages(images: Array<{
|
|
38
|
+
data: string;
|
|
39
|
+
mimeType: string;
|
|
40
|
+
}>, prompt: string, opts?: {
|
|
41
|
+
maxImages?: number;
|
|
42
|
+
maxImageBytes?: number;
|
|
43
|
+
useCache?: boolean;
|
|
44
|
+
maxTokens?: number;
|
|
45
|
+
}): Promise<string>;
|
|
46
|
+
/** Throw if any image exceeds the per-request caps. */
|
|
47
|
+
private validateImagesOrThrow;
|
|
48
|
+
/** Convert base64 frames to Anthropic-style image content blocks. */
|
|
49
|
+
private buildImageBlocks;
|
|
50
|
+
/** Surface any API error envelope and return the model text otherwise. */
|
|
51
|
+
private extractErrorOrText;
|
|
52
|
+
/**
|
|
53
|
+
* Convenience wrapper for prompt caching. Equivalent to
|
|
54
|
+
* `analyzeImages(images, prompt, { useCache: true })`.
|
|
55
|
+
*/
|
|
56
|
+
analyzeImagesCached(images: Array<{
|
|
57
|
+
data: string;
|
|
58
|
+
mimeType: string;
|
|
59
|
+
}>, prompt: string, opts?: {
|
|
60
|
+
maxImages?: number;
|
|
61
|
+
maxImageBytes?: number;
|
|
62
|
+
maxTokens?: number;
|
|
63
|
+
}): Promise<string>;
|
|
64
|
+
/** Extract the first text content block, skipping thinking/tool_use blocks. */
|
|
65
|
+
private extractText;
|
|
66
|
+
private post;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create an M3Client if the API key is available.
|
|
70
|
+
* @param apiKey MiniMax API key (MINIMAX_API_KEY env var)
|
|
71
|
+
* @param baseURL Optional custom base URL
|
|
72
|
+
* @returns M3Client instance or null if no API key
|
|
73
|
+
*/
|
|
74
|
+
export declare function createM3Client(apiKey?: string, baseURL?: string): M3Client | null;
|
|
75
|
+
//# sourceMappingURL=m3Client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"m3Client.d.ts","sourceRoot":"","sources":["../../src/services/m3Client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAqBH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA8CD,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,EAAE,eAAe;IAKpC;;;;;;;;;;OAUG;IACG,aAAa,CACjB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EACjD,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QACJ,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;KACd,GACL,OAAO,CAAC,MAAM,CAAC;IAyBlB,uDAAuD;IACvD,OAAO,CAAC,qBAAqB;IAsB7B,qEAAqE;IACrE,OAAO,CAAC,gBAAgB;IAsBxB,0EAA0E;IAC1E,OAAO,CAAC,kBAAkB;IAmB1B;;;OAGG;IACG,mBAAmB,CACvB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EACjD,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QACJ,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,SAAS,CAAC,EAAE,MAAM,CAAA;KACd,GACL,OAAO,CAAC,MAAM,CAAC;IAOlB,+EAA+E;IAC/E,OAAO,CAAC,WAAW;YAgBL,IAAI;CAqDnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,QAAQ,GAAG,IAAI,CAIjB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiniMax-M3 Client
|
|
3
|
+
* Handles multimodal video understanding via MiniMax's Anthropic-compatible API.
|
|
4
|
+
*
|
|
5
|
+
* API Specification (Confirmed):
|
|
6
|
+
* - Base URL (Anthropic-compatible, recommended): https://api.minimax.io/anthropic
|
|
7
|
+
* - Endpoint: POST {baseURL}/v1/messages
|
|
8
|
+
* - Auth: x-api-key header (Anthropic-style)
|
|
9
|
+
* - Anthropic version: 2023-06-01
|
|
10
|
+
* - Model: MiniMax-M3
|
|
11
|
+
* - Native multimodality with 1M-token context window; explicitly built for
|
|
12
|
+
* "long-video understanding" via extracted JPEG frames.
|
|
13
|
+
* - Per-request caps inherited from Anthropic Messages vision:
|
|
14
|
+
* up to 100 images, 10 MB per image (base64-encoded), 8000x8000 px max.
|
|
15
|
+
* - Caching: $0.06/M effective cache-hit vs $0.30/M effective new input
|
|
16
|
+
* (5x cheaper on follow-up calls when content is the same).
|
|
17
|
+
*/
|
|
18
|
+
const M3_BASE_URL = 'https://api.minimax.io/anthropic';
|
|
19
|
+
const M3_MODEL = 'MiniMax-M3';
|
|
20
|
+
/** Client-side request timeout in ms. Default: 4 min.
|
|
21
|
+
* Override via M3_REQUEST_TIMEOUT_MS env var (milliseconds). */
|
|
22
|
+
const M3_REQUEST_TIMEOUT_MS = process.env.M3_REQUEST_TIMEOUT_MS
|
|
23
|
+
? Number(process.env.M3_REQUEST_TIMEOUT_MS)
|
|
24
|
+
: 4 * 60 * 1000;
|
|
25
|
+
const M3_TIMEOUT_LABEL = `${Math.round(M3_REQUEST_TIMEOUT_MS / 60000)} minutes`;
|
|
26
|
+
/** Anthropic-API version pinned for M3 multimodal vision support. */
|
|
27
|
+
const M3_ANTHROPIC_VERSION = '2023-06-01';
|
|
28
|
+
/** Default per-request image cap. Matches Anthropic 200K-context ceiling. */
|
|
29
|
+
const M3_MAX_IMAGES_DEFAULT = 100;
|
|
30
|
+
/** Per-image base64 size cap. Matches Anthropic vision limit. */
|
|
31
|
+
const M3_MAX_IMAGE_BYTES = 10 * 1024 * 1024;
|
|
32
|
+
export class M3Client {
|
|
33
|
+
apiKey;
|
|
34
|
+
baseURL;
|
|
35
|
+
constructor(options) {
|
|
36
|
+
this.apiKey = options.apiKey;
|
|
37
|
+
this.baseURL = (options.baseURL ?? M3_BASE_URL).replace(/\/+$/, '');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Send a vision analysis request — array of JPEG/PNG frames + text prompt.
|
|
41
|
+
* Returns the model's text response (skipping `thinking` blocks).
|
|
42
|
+
*
|
|
43
|
+
* @param images Base64-encoded frames with MIME types
|
|
44
|
+
* @param prompt Text prompt (question, summarization, etc.)
|
|
45
|
+
* @param opts.maxImages Cap images per request (default 100, Anthropic 200K cap)
|
|
46
|
+
* @param opts.maxImageBytes Cap per-image base64 size (default 10 MB)
|
|
47
|
+
* @param opts.useCache Add `cache_control: { type: 'ephemeral' }` to the last
|
|
48
|
+
* image block to enable explicit prompt caching
|
|
49
|
+
*/
|
|
50
|
+
async analyzeImages(images, prompt, opts = {}) {
|
|
51
|
+
const maxImages = opts.maxImages ?? M3_MAX_IMAGES_DEFAULT;
|
|
52
|
+
const maxImageBytes = opts.maxImageBytes ?? M3_MAX_IMAGE_BYTES;
|
|
53
|
+
this.validateImagesOrThrow(images, maxImages, maxImageBytes);
|
|
54
|
+
const messages = [
|
|
55
|
+
{
|
|
56
|
+
role: 'user',
|
|
57
|
+
content: [
|
|
58
|
+
...this.buildImageBlocks(images, opts.useCache === true),
|
|
59
|
+
{ type: 'text', text: prompt },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
const body = {
|
|
64
|
+
model: M3_MODEL,
|
|
65
|
+
max_tokens: opts.maxTokens ?? 4096,
|
|
66
|
+
messages,
|
|
67
|
+
};
|
|
68
|
+
const data = await this.post('/v1/messages', body);
|
|
69
|
+
return this.extractErrorOrText(data);
|
|
70
|
+
}
|
|
71
|
+
/** Throw if any image exceeds the per-request caps. */
|
|
72
|
+
validateImagesOrThrow(images, maxImages, maxImageBytes) {
|
|
73
|
+
if (images.length > maxImages) {
|
|
74
|
+
throw new Error(`M3: too many images (${images.length} > ${maxImages}). ` +
|
|
75
|
+
`Reduce frame count or split into multiple requests.`);
|
|
76
|
+
}
|
|
77
|
+
for (const [i, img] of images.entries()) {
|
|
78
|
+
if (img.data.length > maxImageBytes) {
|
|
79
|
+
throw new Error(`M3: image ${i} exceeds per-image base64 size limit ` +
|
|
80
|
+
`(${img.data.length} > ${maxImageBytes} bytes). ` +
|
|
81
|
+
`Re-encode at a lower resolution.`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Convert base64 frames to Anthropic-style image content blocks. */
|
|
86
|
+
buildImageBlocks(images, useCache) {
|
|
87
|
+
return images.map((img, i) => {
|
|
88
|
+
const isLast = i === images.length - 1;
|
|
89
|
+
const block = {
|
|
90
|
+
type: 'image',
|
|
91
|
+
source: {
|
|
92
|
+
type: 'base64',
|
|
93
|
+
media_type: img.mimeType,
|
|
94
|
+
data: img.data,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
if (useCache && isLast) {
|
|
98
|
+
// Cache the last image so subsequent calls on the same video are cheap
|
|
99
|
+
block.cache_control = { type: 'ephemeral' };
|
|
100
|
+
}
|
|
101
|
+
return block;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** Surface any API error envelope and return the model text otherwise. */
|
|
105
|
+
extractErrorOrText(data) {
|
|
106
|
+
// MiniMax-style error envelope
|
|
107
|
+
if (data.base_resp?.status_code !== undefined &&
|
|
108
|
+
data.base_resp.status_code !== 0) {
|
|
109
|
+
throw new Error(`M3 API error ${data.base_resp.status_code}: ${data.base_resp.status_msg ?? 'unknown error'}`);
|
|
110
|
+
}
|
|
111
|
+
// Anthropic-style top-level error
|
|
112
|
+
if (data.error) {
|
|
113
|
+
throw new Error(`M3 API error: ${data.error.message ?? data.error.type ?? 'unknown error'}`);
|
|
114
|
+
}
|
|
115
|
+
return this.extractText(data);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Convenience wrapper for prompt caching. Equivalent to
|
|
119
|
+
* `analyzeImages(images, prompt, { useCache: true })`.
|
|
120
|
+
*/
|
|
121
|
+
async analyzeImagesCached(images, prompt, opts = {}) {
|
|
122
|
+
return this.analyzeImages(images, prompt, {
|
|
123
|
+
...opts,
|
|
124
|
+
useCache: true,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** Extract the first text content block, skipping thinking/tool_use blocks. */
|
|
128
|
+
extractText(data) {
|
|
129
|
+
const blocks = data.content ?? [];
|
|
130
|
+
const textBlocks = blocks.filter((b) => b.type === 'text');
|
|
131
|
+
if (textBlocks.length === 0) {
|
|
132
|
+
throw new Error('M3 returned no text content');
|
|
133
|
+
}
|
|
134
|
+
return textBlocks
|
|
135
|
+
.map((b) => b.text ?? '')
|
|
136
|
+
.join('\n')
|
|
137
|
+
.trim();
|
|
138
|
+
}
|
|
139
|
+
// ── HTTP helpers ──────────────────────────────────────────────────────
|
|
140
|
+
async post(path, body) {
|
|
141
|
+
const url = `${this.baseURL}${path}`;
|
|
142
|
+
const controller = new AbortController();
|
|
143
|
+
const timeoutId = setTimeout(() => controller.abort(), M3_REQUEST_TIMEOUT_MS);
|
|
144
|
+
try {
|
|
145
|
+
const response = await fetch(url, {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
headers: {
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
'x-api-key': this.apiKey,
|
|
150
|
+
'anthropic-version': M3_ANTHROPIC_VERSION,
|
|
151
|
+
},
|
|
152
|
+
body: JSON.stringify(body),
|
|
153
|
+
signal: controller.signal,
|
|
154
|
+
});
|
|
155
|
+
const text = await response.text();
|
|
156
|
+
let data;
|
|
157
|
+
try {
|
|
158
|
+
data = JSON.parse(text);
|
|
159
|
+
}
|
|
160
|
+
catch (parseError) {
|
|
161
|
+
throw new Error(`M3 API returned non-JSON response (HTTP ${response.status}): ${text.substring(0, 200)}`, { cause: parseError });
|
|
162
|
+
}
|
|
163
|
+
if (!response.ok &&
|
|
164
|
+
!data.base_resp &&
|
|
165
|
+
!data.error) {
|
|
166
|
+
throw new Error(`M3 API HTTP ${response.status}: ${text.substring(0, 200)}`);
|
|
167
|
+
}
|
|
168
|
+
return data;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
172
|
+
throw new Error(`M3 API request timed out after ${M3_TIMEOUT_LABEL}`, {
|
|
173
|
+
cause: error,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
clearTimeout(timeoutId);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Create an M3Client if the API key is available.
|
|
185
|
+
* @param apiKey MiniMax API key (MINIMAX_API_KEY env var)
|
|
186
|
+
* @param baseURL Optional custom base URL
|
|
187
|
+
* @returns M3Client instance or null if no API key
|
|
188
|
+
*/
|
|
189
|
+
export function createM3Client(apiKey, baseURL) {
|
|
190
|
+
const key = apiKey || process.env.MINIMAX_API_KEY;
|
|
191
|
+
if (!key)
|
|
192
|
+
return null;
|
|
193
|
+
return new M3Client({ apiKey: key, baseURL });
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=m3Client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"m3Client.js","sourceRoot":"","sources":["../../src/services/m3Client.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,18 +2,19 @@
|
|
|
2
2
|
* Provider Selection
|
|
3
3
|
* Determines which AI backend to use based on user preference
|
|
4
4
|
*/
|
|
5
|
-
export type VideoProvider = 'glm' | 'kimi' | 'gemini' | 'qwen' | 'mimo';
|
|
5
|
+
export type VideoProvider = 'glm' | 'kimi' | 'gemini' | 'qwen' | 'mimo' | 'm3';
|
|
6
6
|
/**
|
|
7
7
|
* Validate that the selected provider has a configured API key
|
|
8
|
-
* @param provider - User-specified provider ('glm', 'kimi', 'gemini', 'qwen', or '
|
|
8
|
+
* @param provider - User-specified provider ('glm', 'kimi', 'gemini', 'qwen', 'mimo', or 'm3')
|
|
9
9
|
* @param hasKimiKey - Whether Kimi API key is available
|
|
10
10
|
* @param hasGLMKey - Whether GLM API key is available
|
|
11
11
|
* @param hasGeminiKey - Whether Gemini API key is available
|
|
12
12
|
* @param hasQwenKey - Whether Qwen API key is available
|
|
13
13
|
* @param hasMimoKey - Whether MiMo API key is available
|
|
14
|
+
* @param hasM3Key - Whether MiniMax-M3 API key is available
|
|
14
15
|
* @returns The validated provider
|
|
15
16
|
*/
|
|
16
|
-
export declare function selectProvider(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean, hasMimoKey?: boolean): VideoProvider;
|
|
17
|
+
export declare function selectProvider(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean, hasMimoKey?: boolean, hasM3Key?: boolean): VideoProvider;
|
|
17
18
|
/**
|
|
18
19
|
* Result type returned by resolveProviderWithFallback.
|
|
19
20
|
* When `fallbackFrom` is set, the caller should notify the user that the
|
|
@@ -26,18 +27,19 @@ export type ProviderResult = {
|
|
|
26
27
|
/**
|
|
27
28
|
* Resolve the provider, with optional fallback behavior.
|
|
28
29
|
* If the requested provider's key is missing, falls back in canonical priority
|
|
29
|
-
* order (gemini →
|
|
30
|
-
* visiting all remaining candidates. This means every starting provider can
|
|
30
|
+
* order (gemini → m3 → kimi → qwen → mimo → glm), skipping the requested provider
|
|
31
|
+
* and visiting all remaining candidates. This means every starting provider can
|
|
31
32
|
* eventually reach any other provider:
|
|
32
|
-
* gemini →
|
|
33
|
-
* glm → gemini →
|
|
34
|
-
* kimi → gemini →
|
|
35
|
-
* qwen → gemini →
|
|
36
|
-
* mimo → gemini →
|
|
33
|
+
* gemini → m3 → kimi → qwen → mimo → glm
|
|
34
|
+
* glm → gemini → m3 → kimi → qwen → mimo
|
|
35
|
+
* kimi → gemini → m3 → qwen → mimo → glm
|
|
36
|
+
* qwen → gemini → m3 → kimi → mimo → glm
|
|
37
|
+
* mimo → gemini → m3 → kimi → qwen → glm
|
|
38
|
+
* m3 → gemini → kimi → qwen → mimo → glm
|
|
37
39
|
* Returns a ProviderResult with `fallbackFrom` set if a fallback occurred.
|
|
38
40
|
* Throws only when no provider API key is available at all.
|
|
39
41
|
*/
|
|
40
|
-
export declare function resolveProviderWithFallback(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean, hasMimoKey?: boolean): ProviderResult;
|
|
42
|
+
export declare function resolveProviderWithFallback(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean, hasMimoKey?: boolean, hasM3Key?: boolean): ProviderResult;
|
|
41
43
|
/**
|
|
42
44
|
* Get the default provider from environment variable
|
|
43
45
|
*/
|
|
@@ -47,18 +49,19 @@ export declare function getDefaultProvider(): VideoProvider;
|
|
|
47
49
|
* filtered to only those whose API keys are available.
|
|
48
50
|
*
|
|
49
51
|
* Fallback order: start with the requested provider, then visit remaining
|
|
50
|
-
* providers in canonical priority order (gemini →
|
|
51
|
-
* every starting provider can reach all other providers:
|
|
52
|
-
* gemini → gemini,
|
|
53
|
-
* glm → glm, gemini,
|
|
54
|
-
* kimi → kimi, gemini,
|
|
55
|
-
* qwen → qwen, gemini,
|
|
56
|
-
* mimo → mimo, gemini,
|
|
52
|
+
* providers in canonical priority order (gemini → m3 → kimi → qwen → mimo → glm),
|
|
53
|
+
* so every starting provider can reach all other providers:
|
|
54
|
+
* gemini → gemini, m3, kimi, qwen, mimo, glm
|
|
55
|
+
* glm → glm, gemini, m3, kimi, qwen, mimo
|
|
56
|
+
* kimi → kimi, gemini, m3, qwen, mimo, glm
|
|
57
|
+
* qwen → qwen, gemini, m3, kimi, mimo, glm
|
|
58
|
+
* mimo → mimo, gemini, m3, kimi, qwen, glm
|
|
59
|
+
* m3 → m3, gemini, kimi, qwen, mimo, glm
|
|
57
60
|
*
|
|
58
61
|
* This is used for runtime error-based fallback: if the first provider's API call
|
|
59
62
|
* throws (overloaded, timeout, 5xx, etc.), the caller retries with the next entry.
|
|
60
63
|
*/
|
|
61
|
-
export declare function getRuntimeFallbackChain(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean, hasMimoKey?: boolean): VideoProvider[];
|
|
64
|
+
export declare function getRuntimeFallbackChain(provider: VideoProvider, hasKimiKey: boolean, hasGLMKey: boolean, hasGeminiKey?: boolean, hasQwenKey?: boolean, hasMimoKey?: boolean, hasM3Key?: boolean): VideoProvider[];
|
|
62
65
|
/**
|
|
63
66
|
* Get the maximum number of frames to extract for summarization.
|
|
64
67
|
*
|
|
@@ -74,8 +77,8 @@ export declare function getMaxFrames(): number;
|
|
|
74
77
|
* Returns the maximum number of images that can be sent in a single
|
|
75
78
|
* analyzeImages() request for a given provider.
|
|
76
79
|
*
|
|
77
|
-
* Qwen3.
|
|
78
|
-
*
|
|
80
|
+
* Qwen3.7, MiMo-V2.5 and GLM-4.6V enforce a per-request image cap of 20.
|
|
81
|
+
* M3 (MiniMax-M3) inherits Anthropic's 200K-context vision cap of 100.
|
|
79
82
|
* Kimi/Gemini are upload-based and do not use multi-image requests.
|
|
80
83
|
*/
|
|
81
84
|
export declare function getProviderImageCountLimit(provider: VideoProvider): number;
|
|
@@ -88,6 +91,8 @@ export declare function getProviderImageCountLimit(provider: VideoProvider): num
|
|
|
88
91
|
* Qwen cap: ~10 MB (DashScope hard reject above this)
|
|
89
92
|
* Kimi cap: ~80 MB (frame payload budget — base64 overhead keeps request body under 100 MB)
|
|
90
93
|
* MiMo cap: ~10 MB (confirmed for mimo-v2.5)
|
|
94
|
+
* M3 cap: 100 MB overall request budget (image-only provider; 1M-token context,
|
|
95
|
+
* 10 MB per-image Anthropic cap is enforced in M3Client.analyzeImages).
|
|
91
96
|
* Gemini: no base64 path — always uses the Files API
|
|
92
97
|
*/
|
|
93
98
|
export declare function getProviderBase64SizeLimit(provider: VideoProvider): number;
|
|
@@ -105,7 +110,8 @@ export declare const KIMI_FILE_UPLOAD_LIMIT: number;
|
|
|
105
110
|
* Returns true when at least one provider remaining in the fallback chain
|
|
106
111
|
* (after `chainIndex`) can accept the given file via native upload (not
|
|
107
112
|
* base64). Gemini always qualifies (2 GB Files API). Kimi qualifies when
|
|
108
|
-
* the raw file is ≤ 100 MB.
|
|
113
|
+
* the raw file is ≤ 100 MB. M3 is image-only (no native upload) so it
|
|
114
|
+
* does not qualify — GLM/Qwen/MiMo will only defer to Gemini or Kimi.
|
|
109
115
|
*/
|
|
110
116
|
export declare function hasUploadCapableProviderRemaining(chain: VideoProvider[], chainIndex: number, fileSizeBytes: number): boolean;
|
|
111
117
|
/**
|
|
@@ -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,GAAG,MAAM,GAAG,MAAM,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,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;AAE9E;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,EAC7B,UAAU,GAAE,OAAe,EAC3B,UAAU,GAAE,OAAe,EAC3B,QAAQ,GAAE,OAAe,GACxB,aAAa,CA+Bf;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,aAAa,CAAA;IACvB,YAAY,CAAC,EAAE,aAAa,CAAA;CAC7B,CAAA;AAmBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,EAC7B,UAAU,GAAE,OAAe,EAC3B,UAAU,GAAE,OAAe,EAC3B,QAAQ,GAAE,OAAe,GACxB,cAAc,CAwBhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAalD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,EAClB,YAAY,GAAE,OAAe,EAC7B,UAAU,GAAE,OAAe,EAC3B,UAAU,GAAE,OAAe,EAC3B,QAAQ,GAAE,OAAe,GACxB,aAAa,EAAE,CAiBjB;AAQD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAerC;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAM1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAO1E;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAGT;AAED,qDAAqD;AACrD,eAAO,MAAM,sBAAsB,QAAoB,CAAA;AAEvD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,aAAa,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAOT;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAQzC"}
|