vidpipe 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/agents/BaseAgent.d.ts +17 -17
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +41 -47
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +53 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/config/environment.d.ts +3 -0
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/environment.js +3 -0
- package/dist/config/environment.js.map +1 -1
- package/dist/config/pricing.d.ts +34 -0
- package/dist/config/pricing.d.ts.map +1 -0
- package/dist/config/pricing.js +71 -0
- package/dist/config/pricing.js.map +1 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +37 -0
- package/dist/pipeline.js.map +1 -1
- package/dist/providers/ClaudeProvider.d.ts +14 -0
- package/dist/providers/ClaudeProvider.d.ts.map +1 -0
- package/dist/providers/ClaudeProvider.js +182 -0
- package/dist/providers/ClaudeProvider.js.map +1 -0
- package/dist/providers/CopilotProvider.d.ts +17 -0
- package/dist/providers/CopilotProvider.d.ts.map +1 -0
- package/dist/providers/CopilotProvider.js +149 -0
- package/dist/providers/CopilotProvider.js.map +1 -0
- package/dist/providers/OpenAIProvider.d.ts +14 -0
- package/dist/providers/OpenAIProvider.d.ts.map +1 -0
- package/dist/providers/OpenAIProvider.js +175 -0
- package/dist/providers/OpenAIProvider.js.map +1 -0
- package/dist/providers/index.d.ts +18 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +61 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/types.d.ts +112 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +8 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/services/costTracker.d.ts +63 -0
- package/dist/services/costTracker.d.ts.map +1 -0
- package/dist/services/costTracker.js +137 -0
- package/dist/services/costTracker.js.map +1 -0
- package/dist/tools/ffmpeg/clipExtraction.d.ts.map +1 -1
- package/dist/tools/ffmpeg/clipExtraction.js +24 -2
- package/dist/tools/ffmpeg/clipExtraction.js.map +1 -1
- package/package.json +67 -66
package/README.md
CHANGED
|
@@ -181,6 +181,22 @@ Each stage can be independently skipped with `--no-*` flags. A stage failure doe
|
|
|
181
181
|
|
|
182
182
|
---
|
|
183
183
|
|
|
184
|
+
## 🤖 LLM Providers
|
|
185
|
+
|
|
186
|
+
VidPipe supports multiple LLM providers:
|
|
187
|
+
|
|
188
|
+
| Provider | Env Var | Default Model | Notes |
|
|
189
|
+
|----------|---------|---------------|-------|
|
|
190
|
+
| `copilot` (default) | — | Claude Opus 4.6 | Uses GitHub Copilot auth |
|
|
191
|
+
| `openai` | `OPENAI_API_KEY` | gpt-4o | Direct OpenAI API |
|
|
192
|
+
| `claude` | `ANTHROPIC_API_KEY` | claude-opus-4.6 | Direct Anthropic API |
|
|
193
|
+
|
|
194
|
+
Set `LLM_PROVIDER` in your `.env` or pass via CLI. Override model with `LLM_MODEL`.
|
|
195
|
+
|
|
196
|
+
The pipeline tracks token usage and estimated cost across all providers, displaying a summary at the end of each run.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
184
200
|
## ⚙️ Configuration
|
|
185
201
|
|
|
186
202
|
Configuration is loaded from CLI flags → environment variables → `.env` file → defaults.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { LLMProvider, LLMSession, ToolWithHandler } from '../providers/types.js';
|
|
2
2
|
/**
|
|
3
|
-
* BaseAgent — abstract foundation for all
|
|
3
|
+
* BaseAgent — abstract foundation for all LLM-powered agents.
|
|
4
4
|
*
|
|
5
5
|
* ### Agent pattern
|
|
6
6
|
* Each agent in the pipeline (SummaryAgent, ShortsAgent, BlogAgent, etc.)
|
|
@@ -9,14 +9,14 @@ import { CopilotClient, CopilotSession, Tool } from '@github/copilot-sdk';
|
|
|
9
9
|
* - `handleToolCall()` — dispatches tool invocations to concrete implementations
|
|
10
10
|
*
|
|
11
11
|
* ### Tool registration
|
|
12
|
-
* Tools are declared as JSON Schema objects and passed to the
|
|
13
|
-
* at creation time. When the LLM decides to call a tool, the
|
|
14
|
-
* call through
|
|
15
|
-
* (e.g. reading files, running FFmpeg, querying APIs).
|
|
12
|
+
* Tools are declared as JSON Schema objects and passed to the LLMSession
|
|
13
|
+
* at creation time. When the LLM decides to call a tool, the provider routes
|
|
14
|
+
* the call through the tool handler where the subclass executes the actual
|
|
15
|
+
* logic (e.g. reading files, running FFmpeg, querying APIs).
|
|
16
16
|
*
|
|
17
17
|
* ### Message flow
|
|
18
|
-
* 1. `run(userMessage)` lazily creates
|
|
19
|
-
*
|
|
18
|
+
* 1. `run(userMessage)` lazily creates an LLMSession via the configured
|
|
19
|
+
* provider (Copilot, OpenAI, or Claude).
|
|
20
20
|
* 2. The user message is sent via `sendAndWait()`, which blocks until the
|
|
21
21
|
* LLM produces a final response (with a 5-minute timeout).
|
|
22
22
|
* 3. During processing, the LLM may invoke tools multiple times — each call
|
|
@@ -29,24 +29,24 @@ import { CopilotClient, CopilotSession, Tool } from '@github/copilot-sdk';
|
|
|
29
29
|
export declare abstract class BaseAgent {
|
|
30
30
|
protected readonly agentName: string;
|
|
31
31
|
protected readonly systemPrompt: string;
|
|
32
|
-
protected
|
|
33
|
-
protected session:
|
|
34
|
-
constructor(agentName: string, systemPrompt: string);
|
|
32
|
+
protected provider: LLMProvider;
|
|
33
|
+
protected session: LLMSession | null;
|
|
34
|
+
constructor(agentName: string, systemPrompt: string, provider?: LLMProvider);
|
|
35
35
|
/** Tools this agent exposes to the LLM. Override in subclasses. */
|
|
36
|
-
protected getTools():
|
|
36
|
+
protected getTools(): ToolWithHandler[];
|
|
37
37
|
/** Dispatch a tool call to the concrete agent. Override in subclasses. */
|
|
38
38
|
protected abstract handleToolCall(toolName: string, args: Record<string, unknown>): Promise<unknown>;
|
|
39
39
|
/**
|
|
40
40
|
* Send a user message to the agent and return the final response text.
|
|
41
41
|
*
|
|
42
|
-
* 1. Lazily creates
|
|
43
|
-
* 2. Registers
|
|
44
|
-
* 3. Calls sendAndWait and
|
|
42
|
+
* 1. Lazily creates an LLMSession via the provider
|
|
43
|
+
* 2. Registers event listeners for logging
|
|
44
|
+
* 3. Calls sendAndWait and records usage via CostTracker
|
|
45
45
|
*/
|
|
46
46
|
run(userMessage: string): Promise<string>;
|
|
47
|
-
/** Wire up session event listeners for logging
|
|
47
|
+
/** Wire up session event listeners for logging. */
|
|
48
48
|
private setupEventHandlers;
|
|
49
|
-
/** Tear down the
|
|
49
|
+
/** Tear down the session. */
|
|
50
50
|
destroy(): Promise<void>;
|
|
51
51
|
}
|
|
52
52
|
//# sourceMappingURL=BaseAgent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseAgent.d.ts","sourceRoot":"","sources":["../../src/agents/BaseAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"BaseAgent.d.ts","sourceRoot":"","sources":["../../src/agents/BaseAgent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAKrF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,8BAAsB,SAAS;IAK3B,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM;IALzC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAA;IAC/B,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAO;gBAGtB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACvC,QAAQ,CAAC,EAAE,WAAW;IAKxB,mEAAmE;IACnE,SAAS,CAAC,QAAQ,IAAI,eAAe,EAAE;IAIvC,0EAA0E;IAC1E,SAAS,CAAC,QAAQ,CAAC,cAAc,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC;IAEnB;;;;;;OAMG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkC/C,mDAAmD;IACnD,OAAO,CAAC,kBAAkB;IAkB1B,6BAA6B;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAU/B"}
|
package/dist/agents/BaseAgent.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { getProvider } from '../providers/index.js';
|
|
2
|
+
import { costTracker } from '../services/costTracker.js';
|
|
3
|
+
import logger from '../config/logger.js';
|
|
3
4
|
/**
|
|
4
|
-
* BaseAgent — abstract foundation for all
|
|
5
|
+
* BaseAgent — abstract foundation for all LLM-powered agents.
|
|
5
6
|
*
|
|
6
7
|
* ### Agent pattern
|
|
7
8
|
* Each agent in the pipeline (SummaryAgent, ShortsAgent, BlogAgent, etc.)
|
|
@@ -10,14 +11,14 @@ import logger from '../config/logger';
|
|
|
10
11
|
* - `handleToolCall()` — dispatches tool invocations to concrete implementations
|
|
11
12
|
*
|
|
12
13
|
* ### Tool registration
|
|
13
|
-
* Tools are declared as JSON Schema objects and passed to the
|
|
14
|
-
* at creation time. When the LLM decides to call a tool, the
|
|
15
|
-
* call through
|
|
16
|
-
* (e.g. reading files, running FFmpeg, querying APIs).
|
|
14
|
+
* Tools are declared as JSON Schema objects and passed to the LLMSession
|
|
15
|
+
* at creation time. When the LLM decides to call a tool, the provider routes
|
|
16
|
+
* the call through the tool handler where the subclass executes the actual
|
|
17
|
+
* logic (e.g. reading files, running FFmpeg, querying APIs).
|
|
17
18
|
*
|
|
18
19
|
* ### Message flow
|
|
19
|
-
* 1. `run(userMessage)` lazily creates
|
|
20
|
-
*
|
|
20
|
+
* 1. `run(userMessage)` lazily creates an LLMSession via the configured
|
|
21
|
+
* provider (Copilot, OpenAI, or Claude).
|
|
21
22
|
* 2. The user message is sent via `sendAndWait()`, which blocks until the
|
|
22
23
|
* LLM produces a final response (with a 5-minute timeout).
|
|
23
24
|
* 3. During processing, the LLM may invoke tools multiple times — each call
|
|
@@ -30,11 +31,12 @@ import logger from '../config/logger';
|
|
|
30
31
|
export class BaseAgent {
|
|
31
32
|
agentName;
|
|
32
33
|
systemPrompt;
|
|
33
|
-
|
|
34
|
+
provider;
|
|
34
35
|
session = null;
|
|
35
|
-
constructor(agentName, systemPrompt) {
|
|
36
|
+
constructor(agentName, systemPrompt, provider) {
|
|
36
37
|
this.agentName = agentName;
|
|
37
38
|
this.systemPrompt = systemPrompt;
|
|
39
|
+
this.provider = provider ?? getProvider();
|
|
38
40
|
}
|
|
39
41
|
/** Tools this agent exposes to the LLM. Override in subclasses. */
|
|
40
42
|
getTools() {
|
|
@@ -43,62 +45,54 @@ export class BaseAgent {
|
|
|
43
45
|
/**
|
|
44
46
|
* Send a user message to the agent and return the final response text.
|
|
45
47
|
*
|
|
46
|
-
* 1. Lazily creates
|
|
47
|
-
* 2. Registers
|
|
48
|
-
* 3. Calls sendAndWait and
|
|
48
|
+
* 1. Lazily creates an LLMSession via the provider
|
|
49
|
+
* 2. Registers event listeners for logging
|
|
50
|
+
* 3. Calls sendAndWait and records usage via CostTracker
|
|
49
51
|
*/
|
|
50
52
|
async run(userMessage) {
|
|
51
|
-
if (!this.client) {
|
|
52
|
-
this.client = new CopilotClient({ autoStart: true, logLevel: 'error' });
|
|
53
|
-
}
|
|
54
53
|
if (!this.session) {
|
|
55
|
-
this.session = await this.
|
|
56
|
-
|
|
54
|
+
this.session = await this.provider.createSession({
|
|
55
|
+
systemPrompt: this.systemPrompt,
|
|
57
56
|
tools: this.getTools(),
|
|
58
57
|
streaming: true,
|
|
58
|
+
model: process.env.LLM_MODEL || undefined,
|
|
59
|
+
timeoutMs: 300_000, // 5 min timeout
|
|
59
60
|
});
|
|
60
61
|
this.setupEventHandlers(this.session);
|
|
61
62
|
}
|
|
62
63
|
logger.info(`[${this.agentName}] Sending message: ${userMessage.substring(0, 80)}…`);
|
|
63
|
-
|
|
64
|
-
const
|
|
64
|
+
costTracker.setAgent(this.agentName);
|
|
65
|
+
const response = await this.session.sendAndWait(userMessage);
|
|
66
|
+
// Record usage via CostTracker
|
|
67
|
+
costTracker.recordUsage(this.provider.name, response.cost?.model ?? this.provider.getDefaultModel(), response.usage, response.cost, response.durationMs, response.quotaSnapshots
|
|
68
|
+
? Object.values(response.quotaSnapshots)[0]
|
|
69
|
+
: undefined);
|
|
70
|
+
const content = response.content;
|
|
65
71
|
logger.info(`[${this.agentName}] Response received (${content.length} chars)`);
|
|
66
72
|
return content;
|
|
67
73
|
}
|
|
68
|
-
/** Wire up session event listeners for logging
|
|
74
|
+
/** Wire up session event listeners for logging. */
|
|
69
75
|
setupEventHandlers(session) {
|
|
70
|
-
session.on((event) => {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
break;
|
|
82
|
-
case 'tool.execution_complete':
|
|
83
|
-
logger.info(`[${this.agentName}] tool done: ${event.data.toolCallId} success=${event.data.success}`);
|
|
84
|
-
break;
|
|
85
|
-
case 'session.error':
|
|
86
|
-
logger.error(`[${this.agentName}] error: ${event.data.message}`);
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
76
|
+
session.on('delta', (event) => {
|
|
77
|
+
logger.debug(`[${this.agentName}] delta: ${JSON.stringify(event.data)}`);
|
|
78
|
+
});
|
|
79
|
+
session.on('tool_start', (event) => {
|
|
80
|
+
logger.info(`[${this.agentName}] tool start: ${JSON.stringify(event.data)}`);
|
|
81
|
+
});
|
|
82
|
+
session.on('tool_end', (event) => {
|
|
83
|
+
logger.info(`[${this.agentName}] tool done: ${JSON.stringify(event.data)}`);
|
|
84
|
+
});
|
|
85
|
+
session.on('error', (event) => {
|
|
86
|
+
logger.error(`[${this.agentName}] error: ${JSON.stringify(event.data)}`);
|
|
89
87
|
});
|
|
90
88
|
}
|
|
91
|
-
/** Tear down the
|
|
89
|
+
/** Tear down the session. */
|
|
92
90
|
async destroy() {
|
|
93
91
|
try {
|
|
94
92
|
if (this.session) {
|
|
95
|
-
await this.session.
|
|
93
|
+
await this.session.close();
|
|
96
94
|
this.session = null;
|
|
97
95
|
}
|
|
98
|
-
if (this.client) {
|
|
99
|
-
await this.client.stop();
|
|
100
|
-
this.client = null;
|
|
101
|
-
}
|
|
102
96
|
}
|
|
103
97
|
catch (err) {
|
|
104
98
|
logger.error(`[${this.agentName}] Error during destroy: ${err}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseAgent.js","sourceRoot":"","sources":["../../src/agents/BaseAgent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseAgent.js","sourceRoot":"","sources":["../../src/agents/BaseAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAeA,qEAAqE;AACrE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAErE;AAsID,wBAAgB,SAAS,IAAI,IAAI,CA0EhC"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -3,6 +3,10 @@ import { existsSync } from 'fs';
|
|
|
3
3
|
import { createRequire } from 'module';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
const require = createRequire(import.meta.url);
|
|
6
|
+
/** Normalize LLM_PROVIDER the same way the provider factory does. */
|
|
7
|
+
export function normalizeProviderName(raw) {
|
|
8
|
+
return (raw || 'copilot').trim().toLowerCase();
|
|
9
|
+
}
|
|
6
10
|
function resolveFFmpegPath() {
|
|
7
11
|
if (process.env.FFMPEG_PATH) {
|
|
8
12
|
return { path: process.env.FFMPEG_PATH, source: 'FFMPEG_PATH env' };
|
|
@@ -145,6 +149,55 @@ export function runDoctor() {
|
|
|
145
149
|
const icon = r.ok ? '✅' : r.required ? '❌' : '⬚';
|
|
146
150
|
console.log(` ${icon} ${r.message}`);
|
|
147
151
|
}
|
|
152
|
+
// LLM Provider section — check env vars directly to avoid silent fallback
|
|
153
|
+
console.log('\nLLM Provider');
|
|
154
|
+
const providerName = normalizeProviderName(process.env.LLM_PROVIDER);
|
|
155
|
+
const isDefault = !process.env.LLM_PROVIDER;
|
|
156
|
+
const providerLabel = isDefault ? `${providerName} (default)` : providerName;
|
|
157
|
+
const validProviders = ['copilot', 'openai', 'claude'];
|
|
158
|
+
if (!validProviders.includes(providerName)) {
|
|
159
|
+
console.log(` ❌ Provider: ${providerLabel} — unknown provider`);
|
|
160
|
+
results.push({ label: 'LLM Provider', ok: false, required: true, message: `Unknown provider: ${providerName}` });
|
|
161
|
+
}
|
|
162
|
+
else if (providerName === 'copilot') {
|
|
163
|
+
console.log(` ✅ Provider: ${providerLabel}`);
|
|
164
|
+
console.log(' ✅ Copilot — uses GitHub auth');
|
|
165
|
+
}
|
|
166
|
+
else if (providerName === 'openai') {
|
|
167
|
+
console.log(` ✅ Provider: ${providerLabel}`);
|
|
168
|
+
if (process.env.OPENAI_API_KEY) {
|
|
169
|
+
console.log(' ✅ OPENAI_API_KEY is set (also used for Whisper)');
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
console.log(' ❌ OPENAI_API_KEY not set (required for openai provider)');
|
|
173
|
+
results.push({ label: 'LLM Provider', ok: false, required: true, message: 'OPENAI_API_KEY not set for OpenAI LLM' });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else if (providerName === 'claude') {
|
|
177
|
+
console.log(` ✅ Provider: ${providerLabel}`);
|
|
178
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
179
|
+
console.log(' ✅ ANTHROPIC_API_KEY is set');
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(' ❌ ANTHROPIC_API_KEY not set (required for claude provider)');
|
|
183
|
+
results.push({ label: 'LLM Provider', ok: false, required: true, message: 'ANTHROPIC_API_KEY not set for Claude LLM' });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const defaultModels = {
|
|
187
|
+
copilot: 'Claude Opus 4.6',
|
|
188
|
+
openai: 'gpt-4o',
|
|
189
|
+
claude: 'claude-opus-4.6',
|
|
190
|
+
};
|
|
191
|
+
if (validProviders.includes(providerName)) {
|
|
192
|
+
const defaultModel = defaultModels[providerName];
|
|
193
|
+
const modelOverride = process.env.LLM_MODEL;
|
|
194
|
+
if (modelOverride) {
|
|
195
|
+
console.log(` ℹ️ Model override: ${modelOverride} (default: ${defaultModel})`);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.log(` ℹ️ Default model: ${defaultModel}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
148
201
|
const failedRequired = results.filter(r => r.required && !r.ok);
|
|
149
202
|
console.log();
|
|
150
203
|
if (failedRequired.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,IAAI,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,WAAW,EAAE,OAAO,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAID,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,GAAG,GAAE,UAAe,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,WAAW,EAAE,OAAO,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAID,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,GAAG,GAAE,UAAe,GAAG,cAAc,CAyB/D;AAED,wBAAgB,SAAS,IAAI,cAAc,CAO1C"}
|
|
@@ -22,6 +22,9 @@ export function initConfig(cli = {}) {
|
|
|
22
22
|
FFMPEG_PATH: process.env.FFMPEG_PATH || 'ffmpeg', // legacy; prefer ffmpegResolver
|
|
23
23
|
FFPROBE_PATH: process.env.FFPROBE_PATH || 'ffprobe', // legacy; prefer ffmpegResolver
|
|
24
24
|
EXA_API_KEY: cli.exaKey || process.env.EXA_API_KEY || '',
|
|
25
|
+
LLM_PROVIDER: process.env.LLM_PROVIDER || 'copilot',
|
|
26
|
+
LLM_MODEL: process.env.LLM_MODEL || '',
|
|
27
|
+
ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY || '',
|
|
25
28
|
OUTPUT_DIR: cli.outputDir || process.env.OUTPUT_DIR || path.join(repoRoot, 'recordings'),
|
|
26
29
|
BRAND_PATH: cli.brand || process.env.BRAND_PATH || path.join(repoRoot, 'brand.json'),
|
|
27
30
|
VERBOSE: cli.verbose ?? false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,gCAAgC;AAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAA;AAChD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AAClC,CAAC;
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,gCAAgC;AAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAA;AAChD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AAClC,CAAC;AAsCD,IAAI,MAAM,GAA0B,IAAI,CAAA;AAExC,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,MAAM,EAAE,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;IACvF,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAE;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAEvD,MAAM,GAAG;QACP,cAAc,EAAE,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;QACjE,YAAY,EAAE,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;QACtF,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,QAAQ,EAAI,gCAAgC;QACpF,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS,EAAE,gCAAgC;QACrF,WAAW,EAAE,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;QACxD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS;QACnD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE;QACtC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;QACtD,UAAU,EAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;QACvF,UAAU,EAAE,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;QACpF,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,KAAK;QAC7B,QAAQ,EAAE,GAAG,CAAC,GAAG,KAAK,KAAK;QAC3B,oBAAoB,EAAE,GAAG,CAAC,cAAc,KAAK,KAAK;QAClD,WAAW,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK;QACjC,iBAAiB,EAAE,GAAG,CAAC,WAAW,KAAK,KAAK;QAC5C,WAAW,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK;QACjC,aAAa,EAAE,GAAG,CAAC,QAAQ,KAAK,KAAK;KACtC,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAA;IACf,CAAC;IAED,yDAAyD;IACzD,OAAO,UAAU,EAAE,CAAA;AACrB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Model Pricing Configuration
|
|
3
|
+
*
|
|
4
|
+
* Per-model pricing for cost calculation. Updated Feb 2026.
|
|
5
|
+
* Copilot uses Premium Request Units (PRUs), others use per-token pricing.
|
|
6
|
+
*/
|
|
7
|
+
export interface ModelPricing {
|
|
8
|
+
/** Price per 1M input tokens (USD) — for OpenAI/Claude */
|
|
9
|
+
inputPer1M?: number;
|
|
10
|
+
/** Price per 1M output tokens (USD) — for OpenAI/Claude */
|
|
11
|
+
outputPer1M?: number;
|
|
12
|
+
/** Premium request multiplier — for Copilot */
|
|
13
|
+
pruMultiplier?: number;
|
|
14
|
+
/** Whether this model is included free on paid Copilot plans */
|
|
15
|
+
copilotIncluded?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Overage rate for Copilot premium requests: $0.04 per PRU */
|
|
18
|
+
export declare const COPILOT_PRU_OVERAGE_RATE = 0.04;
|
|
19
|
+
export declare const MODEL_PRICING: Record<string, ModelPricing>;
|
|
20
|
+
/**
|
|
21
|
+
* Calculate cost for a single LLM call using per-token pricing.
|
|
22
|
+
* Returns USD amount.
|
|
23
|
+
*/
|
|
24
|
+
export declare function calculateTokenCost(model: string, inputTokens: number, outputTokens: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Calculate PRU cost for a Copilot premium request.
|
|
27
|
+
* Returns PRU count consumed (multiply by $0.04 for overage cost).
|
|
28
|
+
*/
|
|
29
|
+
export declare function calculatePRUCost(model: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Look up model pricing. Returns undefined if model is unknown.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getModelPricing(model: string): ModelPricing | undefined;
|
|
34
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/config/pricing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,+DAA+D;AAC/D,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CA8BtD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAOvE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Model Pricing Configuration
|
|
3
|
+
*
|
|
4
|
+
* Per-model pricing for cost calculation. Updated Feb 2026.
|
|
5
|
+
* Copilot uses Premium Request Units (PRUs), others use per-token pricing.
|
|
6
|
+
*/
|
|
7
|
+
/** Overage rate for Copilot premium requests: $0.04 per PRU */
|
|
8
|
+
export const COPILOT_PRU_OVERAGE_RATE = 0.04;
|
|
9
|
+
export const MODEL_PRICING = {
|
|
10
|
+
// === OpenAI Models (from Copilot model picker) ===
|
|
11
|
+
'gpt-4o': { inputPer1M: 2.50, outputPer1M: 10.00, pruMultiplier: 0, copilotIncluded: true },
|
|
12
|
+
'gpt-4o-mini': { inputPer1M: 0.15, outputPer1M: 0.60, pruMultiplier: 0, copilotIncluded: true },
|
|
13
|
+
'gpt-4.1': { inputPer1M: 2.00, outputPer1M: 8.00, pruMultiplier: 0, copilotIncluded: true },
|
|
14
|
+
'gpt-4.1-mini': { inputPer1M: 0.40, outputPer1M: 1.60 },
|
|
15
|
+
'gpt-5-mini': { inputPer1M: 0.15, outputPer1M: 0.60, pruMultiplier: 0, copilotIncluded: true },
|
|
16
|
+
'gpt-5': { inputPer1M: 2.50, outputPer1M: 10.00, pruMultiplier: 1 },
|
|
17
|
+
'gpt-5-codex': { inputPer1M: 2.50, outputPer1M: 10.00, pruMultiplier: 1 },
|
|
18
|
+
'gpt-5.1': { inputPer1M: 2.50, outputPer1M: 10.00, pruMultiplier: 1 },
|
|
19
|
+
'gpt-5.1-codex': { inputPer1M: 2.50, outputPer1M: 10.00, pruMultiplier: 1 },
|
|
20
|
+
'gpt-5.1-codex-max': { inputPer1M: 2.50, outputPer1M: 10.00, pruMultiplier: 1 },
|
|
21
|
+
'gpt-5.1-codex-mini': { inputPer1M: 0.15, outputPer1M: 0.60, pruMultiplier: 0.33 },
|
|
22
|
+
'gpt-5.2': { inputPer1M: 2.50, outputPer1M: 10.00, pruMultiplier: 1 },
|
|
23
|
+
'gpt-5.2-codex': { inputPer1M: 2.50, outputPer1M: 10.00, pruMultiplier: 1 },
|
|
24
|
+
'o3': { inputPer1M: 10.00, outputPer1M: 40.00, pruMultiplier: 5 },
|
|
25
|
+
'o4-mini-high': { inputPer1M: 1.10, outputPer1M: 4.40, pruMultiplier: 20 },
|
|
26
|
+
// === Anthropic Models (from Copilot model picker) ===
|
|
27
|
+
'claude-haiku-4.5': { inputPer1M: 0.80, outputPer1M: 4.00, pruMultiplier: 0.33 },
|
|
28
|
+
'claude-sonnet-4': { inputPer1M: 3.00, outputPer1M: 15.00, pruMultiplier: 1 },
|
|
29
|
+
'claude-sonnet-4.5': { inputPer1M: 3.00, outputPer1M: 15.00, pruMultiplier: 1 },
|
|
30
|
+
'claude-opus-4.5': { inputPer1M: 15.00, outputPer1M: 75.00, pruMultiplier: 3 },
|
|
31
|
+
'claude-opus-4.6': { inputPer1M: 5.00, outputPer1M: 25.00, pruMultiplier: 3 },
|
|
32
|
+
'claude-opus-4.6-fast': { inputPer1M: 5.00, outputPer1M: 25.00, pruMultiplier: 9 },
|
|
33
|
+
// === Google Models (from Copilot model picker) ===
|
|
34
|
+
'gemini-2.5-pro': { inputPer1M: 1.25, outputPer1M: 5.00, pruMultiplier: 1 },
|
|
35
|
+
'gemini-3-flash': { inputPer1M: 0.10, outputPer1M: 0.40, pruMultiplier: 0.33 },
|
|
36
|
+
'gemini-3-pro': { inputPer1M: 1.25, outputPer1M: 5.00, pruMultiplier: 1 },
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Calculate cost for a single LLM call using per-token pricing.
|
|
40
|
+
* Returns USD amount.
|
|
41
|
+
*/
|
|
42
|
+
export function calculateTokenCost(model, inputTokens, outputTokens) {
|
|
43
|
+
const pricing = getModelPricing(model);
|
|
44
|
+
if (!pricing || (!pricing.inputPer1M && !pricing.outputPer1M))
|
|
45
|
+
return 0;
|
|
46
|
+
const inputCost = ((pricing.inputPer1M ?? 0) / 1_000_000) * inputTokens;
|
|
47
|
+
const outputCost = ((pricing.outputPer1M ?? 0) / 1_000_000) * outputTokens;
|
|
48
|
+
return inputCost + outputCost;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Calculate PRU cost for a Copilot premium request.
|
|
52
|
+
* Returns PRU count consumed (multiply by $0.04 for overage cost).
|
|
53
|
+
*/
|
|
54
|
+
export function calculatePRUCost(model) {
|
|
55
|
+
const pricing = getModelPricing(model);
|
|
56
|
+
if (!pricing)
|
|
57
|
+
return 1; // Default 1 PRU for unknown models
|
|
58
|
+
if (pricing.copilotIncluded)
|
|
59
|
+
return 0; // Free on paid plans
|
|
60
|
+
return pricing.pruMultiplier ?? 1;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Look up model pricing. Returns undefined if model is unknown.
|
|
64
|
+
*/
|
|
65
|
+
export function getModelPricing(model) {
|
|
66
|
+
// Try exact match first, then case-insensitive
|
|
67
|
+
return MODEL_PRICING[model] ??
|
|
68
|
+
MODEL_PRICING[model.toLowerCase()] ??
|
|
69
|
+
Object.entries(MODEL_PRICING).find(([key]) => model.toLowerCase().includes(key.toLowerCase()))?.[1];
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/config/pricing.ts"],"names":[],"mappings":"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"}
|
package/dist/pipeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAEV,UAAU,EAKV,WAAW,EACX,cAAc,EACd,aAAa,EAGd,MAAM,SAAS,CAAA;AAGhB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,SAAS,EAAE,aAAa,EACxB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,YAAY,EAAE,WAAW,EAAE,GAC1B,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAgBxB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,GACzC,UAAU,CAmCZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoN7E;AA8BD,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQxF"}
|
package/dist/pipeline.js
CHANGED
|
@@ -15,6 +15,7 @@ import { commitAndPush } from './services/gitOperations';
|
|
|
15
15
|
import { removeDeadSilence } from './agents/SilenceRemovalAgent';
|
|
16
16
|
import { burnCaptions } from './tools/ffmpeg/captionBurning';
|
|
17
17
|
import { singlePassEditAndCaption } from './tools/ffmpeg/singlePassEdit';
|
|
18
|
+
import { costTracker } from './services/costTracker.js';
|
|
18
19
|
import { PipelineStage as Stage } from './types';
|
|
19
20
|
/**
|
|
20
21
|
* Execute a single pipeline stage with error isolation and timing.
|
|
@@ -36,6 +37,7 @@ import { PipelineStage as Stage } from './types';
|
|
|
36
37
|
* @returns The stage result on success, or `undefined` on failure
|
|
37
38
|
*/
|
|
38
39
|
export async function runStage(stageName, fn, stageResults) {
|
|
40
|
+
costTracker.setStage(stageName);
|
|
39
41
|
const start = Date.now();
|
|
40
42
|
try {
|
|
41
43
|
const result = await fn();
|
|
@@ -121,6 +123,7 @@ export async function processVideo(videoPath) {
|
|
|
121
123
|
const pipelineStart = Date.now();
|
|
122
124
|
const stageResults = [];
|
|
123
125
|
const cfg = getConfig();
|
|
126
|
+
costTracker.reset();
|
|
124
127
|
logger.info(`Pipeline starting for: ${videoPath}`);
|
|
125
128
|
// 1. Ingestion — required for all subsequent stages
|
|
126
129
|
const video = await runStage(Stage.Ingestion, () => ingestVideo(videoPath), stageResults);
|
|
@@ -257,6 +260,15 @@ export async function processVideo(videoPath) {
|
|
|
257
260
|
await runStage(Stage.GitPush, () => commitAndPush(video.slug), stageResults);
|
|
258
261
|
}
|
|
259
262
|
const totalDuration = Date.now() - pipelineStart;
|
|
263
|
+
// Cost tracking report
|
|
264
|
+
const report = costTracker.getReport();
|
|
265
|
+
if (report.records.length > 0) {
|
|
266
|
+
logger.info(costTracker.formatReport());
|
|
267
|
+
const costMd = generateCostMarkdown(report);
|
|
268
|
+
const costPath = path.join(video.videoDir, 'cost-report.md');
|
|
269
|
+
await fs.writeFile(costPath, costMd, 'utf-8');
|
|
270
|
+
logger.info(`Cost report saved: ${costPath}`);
|
|
271
|
+
}
|
|
260
272
|
logger.info(`Pipeline completed in ${totalDuration}ms`);
|
|
261
273
|
return {
|
|
262
274
|
video,
|
|
@@ -274,6 +286,31 @@ export async function processVideo(videoPath) {
|
|
|
274
286
|
totalDuration,
|
|
275
287
|
};
|
|
276
288
|
}
|
|
289
|
+
function generateCostMarkdown(report) {
|
|
290
|
+
let md = '# Pipeline Cost Report\n\n';
|
|
291
|
+
md += `| Metric | Value |\n|--------|-------|\n`;
|
|
292
|
+
md += `| Total Cost | $${report.totalCostUSD.toFixed(4)} USD |\n`;
|
|
293
|
+
if (report.totalPRUs > 0)
|
|
294
|
+
md += `| Total PRUs | ${report.totalPRUs} |\n`;
|
|
295
|
+
md += `| Input Tokens | ${report.totalTokens.input.toLocaleString()} |\n`;
|
|
296
|
+
md += `| Output Tokens | ${report.totalTokens.output.toLocaleString()} |\n`;
|
|
297
|
+
md += `| LLM Calls | ${report.records.length} |\n\n`;
|
|
298
|
+
if (Object.keys(report.byAgent).length > 0) {
|
|
299
|
+
md += '## By Agent\n\n| Agent | Cost | PRUs | Calls |\n|-------|------|------|-------|\n';
|
|
300
|
+
for (const [agent, data] of Object.entries(report.byAgent)) {
|
|
301
|
+
md += `| ${agent} | $${data.costUSD.toFixed(4)} | ${data.prus} | ${data.calls} |\n`;
|
|
302
|
+
}
|
|
303
|
+
md += '\n';
|
|
304
|
+
}
|
|
305
|
+
if (Object.keys(report.byModel).length > 1) {
|
|
306
|
+
md += '## By Model\n\n| Model | Cost | PRUs | Calls |\n|-------|------|------|-------|\n';
|
|
307
|
+
for (const [model, data] of Object.entries(report.byModel)) {
|
|
308
|
+
md += `| ${model} | $${data.costUSD.toFixed(4)} | ${data.prus} | ${data.calls} |\n`;
|
|
309
|
+
}
|
|
310
|
+
md += '\n';
|
|
311
|
+
}
|
|
312
|
+
return md;
|
|
313
|
+
}
|
|
277
314
|
export async function processVideoSafe(videoPath) {
|
|
278
315
|
try {
|
|
279
316
|
return await processVideo(videoPath);
|