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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAIProvider.js","sourceRoot":"","sources":["../../src/providers/OpenAIProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LLMProvider } from './types.js';
|
|
2
|
+
import type { ProviderName } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get the configured LLM provider.
|
|
5
|
+
* Reads from LLM_PROVIDER env var, defaults to 'copilot'.
|
|
6
|
+
* Caches the instance for reuse.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getProvider(name?: ProviderName): LLMProvider;
|
|
9
|
+
/** Reset the cached provider (for testing) */
|
|
10
|
+
export declare function resetProvider(): Promise<void>;
|
|
11
|
+
/** Get the name of the current provider */
|
|
12
|
+
export declare function getProviderName(): ProviderName;
|
|
13
|
+
export type { LLMProvider, LLMSession, LLMResponse, SessionConfig, ToolWithHandler, TokenUsage, CostInfo, QuotaSnapshot, ProviderEvent, ProviderEventType } from './types.js';
|
|
14
|
+
export type { ProviderName } from './types.js';
|
|
15
|
+
export { CopilotProvider } from './CopilotProvider.js';
|
|
16
|
+
export { OpenAIProvider } from './OpenAIProvider.js';
|
|
17
|
+
export { ClaudeProvider } from './ClaudeProvider.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgB/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,WAAW,CAkC5D;AAED,8CAA8C;AAC9C,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAInD;AAED,2CAA2C;AAC3C,wBAAgB,eAAe,IAAI,YAAY,CAI9C;AAGD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC9K,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { CopilotProvider } from './CopilotProvider.js';
|
|
2
|
+
import { OpenAIProvider } from './OpenAIProvider.js';
|
|
3
|
+
import { ClaudeProvider } from './ClaudeProvider.js';
|
|
4
|
+
import logger from '../config/logger.js';
|
|
5
|
+
const providers = {
|
|
6
|
+
copilot: () => new CopilotProvider(),
|
|
7
|
+
openai: () => new OpenAIProvider(),
|
|
8
|
+
claude: () => new ClaudeProvider(),
|
|
9
|
+
};
|
|
10
|
+
/** Cached singleton provider instance */
|
|
11
|
+
let currentProvider = null;
|
|
12
|
+
let currentProviderName = null;
|
|
13
|
+
/**
|
|
14
|
+
* Get the configured LLM provider.
|
|
15
|
+
* Reads from LLM_PROVIDER env var, defaults to 'copilot'.
|
|
16
|
+
* Caches the instance for reuse.
|
|
17
|
+
*/
|
|
18
|
+
export function getProvider(name) {
|
|
19
|
+
const raw = name ?? (process.env.LLM_PROVIDER || 'copilot').trim().toLowerCase();
|
|
20
|
+
const providerName = raw;
|
|
21
|
+
if (currentProvider && currentProviderName === providerName) {
|
|
22
|
+
return currentProvider;
|
|
23
|
+
}
|
|
24
|
+
// Close old provider if switching to a different one
|
|
25
|
+
currentProvider?.close?.().catch(() => { });
|
|
26
|
+
if (!providers[providerName]) {
|
|
27
|
+
throw new Error(`Unknown LLM provider: "${providerName}". ` +
|
|
28
|
+
`Valid options: ${Object.keys(providers).join(', ')}`);
|
|
29
|
+
}
|
|
30
|
+
const provider = providers[providerName]();
|
|
31
|
+
if (!provider.isAvailable()) {
|
|
32
|
+
logger.warn(`Provider "${providerName}" is not available (missing API key or config). ` +
|
|
33
|
+
`Falling back to copilot provider.`);
|
|
34
|
+
currentProvider = providers.copilot();
|
|
35
|
+
currentProviderName = 'copilot';
|
|
36
|
+
return currentProvider;
|
|
37
|
+
}
|
|
38
|
+
logger.info(`Using LLM provider: ${providerName} (model: ${provider.getDefaultModel()})`);
|
|
39
|
+
currentProvider = provider;
|
|
40
|
+
currentProviderName = providerName;
|
|
41
|
+
return currentProvider;
|
|
42
|
+
}
|
|
43
|
+
/** Reset the cached provider (for testing) */
|
|
44
|
+
export async function resetProvider() {
|
|
45
|
+
try {
|
|
46
|
+
await currentProvider?.close?.();
|
|
47
|
+
}
|
|
48
|
+
catch { /* ignore close errors */ }
|
|
49
|
+
currentProvider = null;
|
|
50
|
+
currentProviderName = null;
|
|
51
|
+
}
|
|
52
|
+
/** Get the name of the current provider */
|
|
53
|
+
export function getProviderName() {
|
|
54
|
+
const raw = (process.env.LLM_PROVIDER || 'copilot').trim().toLowerCase();
|
|
55
|
+
const valid = ['copilot', 'openai', 'claude'];
|
|
56
|
+
return currentProviderName ?? (valid.includes(raw) ? raw : 'copilot');
|
|
57
|
+
}
|
|
58
|
+
export { CopilotProvider } from './CopilotProvider.js';
|
|
59
|
+
export { OpenAIProvider } from './OpenAIProvider.js';
|
|
60
|
+
export { ClaudeProvider } from './ClaudeProvider.js';
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider Abstraction Layer
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for all LLM providers (Copilot SDK, OpenAI, Claude).
|
|
5
|
+
* Providers normalize different SDK patterns into a unified interface.
|
|
6
|
+
*/
|
|
7
|
+
/** Supported LLM provider names */
|
|
8
|
+
export type ProviderName = 'copilot' | 'openai' | 'claude';
|
|
9
|
+
/** Tool definition in JSON Schema format (compatible with all providers) */
|
|
10
|
+
export interface ToolDefinition {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
parameters: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/** A tool call requested by the LLM */
|
|
16
|
+
export interface ToolCall {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
arguments: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/** Token usage for a single LLM call */
|
|
22
|
+
export interface TokenUsage {
|
|
23
|
+
inputTokens: number;
|
|
24
|
+
outputTokens: number;
|
|
25
|
+
totalTokens: number;
|
|
26
|
+
cacheReadTokens?: number;
|
|
27
|
+
cacheWriteTokens?: number;
|
|
28
|
+
}
|
|
29
|
+
/** Cost information for a single LLM call */
|
|
30
|
+
export interface CostInfo {
|
|
31
|
+
/** Provider-specific cost (e.g., USD for OpenAI/Claude, PRUs for Copilot) */
|
|
32
|
+
amount: number;
|
|
33
|
+
/** Unit of measurement */
|
|
34
|
+
unit: 'usd' | 'premium_requests';
|
|
35
|
+
/** Model used */
|
|
36
|
+
model: string;
|
|
37
|
+
/** Model multiplier (for Copilot PRU calculation) */
|
|
38
|
+
multiplier?: number;
|
|
39
|
+
}
|
|
40
|
+
/** Copilot-specific quota snapshot from assistant.usage event */
|
|
41
|
+
export interface QuotaSnapshot {
|
|
42
|
+
isUnlimitedEntitlement: boolean;
|
|
43
|
+
entitlementRequests: number;
|
|
44
|
+
usedRequests: number;
|
|
45
|
+
remainingPercentage: number;
|
|
46
|
+
resetDate?: string;
|
|
47
|
+
overage: number;
|
|
48
|
+
}
|
|
49
|
+
/** Response from an LLM provider call */
|
|
50
|
+
export interface LLMResponse {
|
|
51
|
+
/** Text content of the response */
|
|
52
|
+
content: string;
|
|
53
|
+
/** Tool calls requested by the LLM (if any) */
|
|
54
|
+
toolCalls: ToolCall[];
|
|
55
|
+
/** Token usage metrics */
|
|
56
|
+
usage: TokenUsage;
|
|
57
|
+
/** Cost information */
|
|
58
|
+
cost?: CostInfo;
|
|
59
|
+
/** Copilot quota snapshots (only for Copilot provider) */
|
|
60
|
+
quotaSnapshots?: Record<string, QuotaSnapshot>;
|
|
61
|
+
/** Duration of the call in milliseconds */
|
|
62
|
+
durationMs?: number;
|
|
63
|
+
}
|
|
64
|
+
/** Event types emitted by provider sessions */
|
|
65
|
+
export type ProviderEventType = 'delta' | 'tool_start' | 'tool_end' | 'usage' | 'error';
|
|
66
|
+
/** Event data for provider events */
|
|
67
|
+
export interface ProviderEvent {
|
|
68
|
+
type: ProviderEventType;
|
|
69
|
+
data: unknown;
|
|
70
|
+
}
|
|
71
|
+
/** Tool handler function - executes tool logic and returns result */
|
|
72
|
+
export type ToolHandler = (args: Record<string, unknown>) => Promise<unknown>;
|
|
73
|
+
/** Tool with its handler attached */
|
|
74
|
+
export interface ToolWithHandler extends ToolDefinition {
|
|
75
|
+
handler: ToolHandler;
|
|
76
|
+
}
|
|
77
|
+
/** Configuration for creating a provider session */
|
|
78
|
+
export interface SessionConfig {
|
|
79
|
+
/** System prompt for the LLM */
|
|
80
|
+
systemPrompt: string;
|
|
81
|
+
/** Tools available to the LLM */
|
|
82
|
+
tools: ToolWithHandler[];
|
|
83
|
+
/** Whether to enable streaming */
|
|
84
|
+
streaming?: boolean;
|
|
85
|
+
/** Model to use (provider-specific, e.g., 'claude-sonnet-4', 'gpt-4o') */
|
|
86
|
+
model?: string;
|
|
87
|
+
/** Timeout in milliseconds */
|
|
88
|
+
timeoutMs?: number;
|
|
89
|
+
}
|
|
90
|
+
/** An active session with an LLM provider */
|
|
91
|
+
export interface LLMSession {
|
|
92
|
+
/** Send a message and wait for the complete response */
|
|
93
|
+
sendAndWait(message: string): Promise<LLMResponse>;
|
|
94
|
+
/** Subscribe to session events */
|
|
95
|
+
on(event: ProviderEventType, handler: (event: ProviderEvent) => void): void;
|
|
96
|
+
/** Close and clean up the session */
|
|
97
|
+
close(): Promise<void>;
|
|
98
|
+
}
|
|
99
|
+
/** LLM Provider interface - the main contract */
|
|
100
|
+
export interface LLMProvider {
|
|
101
|
+
/** Provider name identifier */
|
|
102
|
+
readonly name: ProviderName;
|
|
103
|
+
/** Create a new session with the given configuration */
|
|
104
|
+
createSession(config: SessionConfig): Promise<LLMSession>;
|
|
105
|
+
/** Check if the provider is available (API key set, etc.) */
|
|
106
|
+
isAvailable(): boolean;
|
|
107
|
+
/** Get the default model for this provider */
|
|
108
|
+
getDefaultModel(): string;
|
|
109
|
+
/** Optional lifecycle hook to release provider-level resources. */
|
|
110
|
+
close?(): Promise<void>;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { TokenUsage, CostInfo, QuotaSnapshot } from '../providers/types.js';
|
|
2
|
+
/** Record of a single LLM usage event */
|
|
3
|
+
export interface UsageRecord {
|
|
4
|
+
timestamp: Date;
|
|
5
|
+
provider: string;
|
|
6
|
+
model: string;
|
|
7
|
+
agent: string;
|
|
8
|
+
stage: string;
|
|
9
|
+
usage: TokenUsage;
|
|
10
|
+
cost: CostInfo;
|
|
11
|
+
durationMs?: number;
|
|
12
|
+
}
|
|
13
|
+
/** Aggregated cost report */
|
|
14
|
+
export interface CostReport {
|
|
15
|
+
totalCostUSD: number;
|
|
16
|
+
totalPRUs: number;
|
|
17
|
+
totalTokens: {
|
|
18
|
+
input: number;
|
|
19
|
+
output: number;
|
|
20
|
+
total: number;
|
|
21
|
+
};
|
|
22
|
+
byProvider: Record<string, {
|
|
23
|
+
costUSD: number;
|
|
24
|
+
prus: number;
|
|
25
|
+
calls: number;
|
|
26
|
+
}>;
|
|
27
|
+
byAgent: Record<string, {
|
|
28
|
+
costUSD: number;
|
|
29
|
+
prus: number;
|
|
30
|
+
calls: number;
|
|
31
|
+
}>;
|
|
32
|
+
byModel: Record<string, {
|
|
33
|
+
costUSD: number;
|
|
34
|
+
prus: number;
|
|
35
|
+
calls: number;
|
|
36
|
+
}>;
|
|
37
|
+
records: UsageRecord[];
|
|
38
|
+
/** Copilot quota info (if available) */
|
|
39
|
+
copilotQuota?: QuotaSnapshot;
|
|
40
|
+
}
|
|
41
|
+
/** Singleton cost tracker for a pipeline run */
|
|
42
|
+
declare class CostTracker {
|
|
43
|
+
private records;
|
|
44
|
+
private latestQuota?;
|
|
45
|
+
private currentAgent;
|
|
46
|
+
private currentStage;
|
|
47
|
+
/** Set the current agent name (called by BaseAgent before LLM calls) */
|
|
48
|
+
setAgent(agent: string): void;
|
|
49
|
+
/** Set the current pipeline stage */
|
|
50
|
+
setStage(stage: string): void;
|
|
51
|
+
/** Record a usage event from any provider */
|
|
52
|
+
recordUsage(provider: string, model: string, usage: TokenUsage, cost?: CostInfo, durationMs?: number, quotaSnapshot?: QuotaSnapshot): void;
|
|
53
|
+
/** Get the full cost report */
|
|
54
|
+
getReport(): CostReport;
|
|
55
|
+
/** Format report as human-readable string for console output */
|
|
56
|
+
formatReport(): string;
|
|
57
|
+
/** Reset all tracking (for new pipeline run) */
|
|
58
|
+
reset(): void;
|
|
59
|
+
}
|
|
60
|
+
/** Global singleton instance */
|
|
61
|
+
export declare const costTracker: CostTracker;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=costTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"costTracker.d.ts","sourceRoot":"","sources":["../../src/services/costTracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAIjF,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,6BAA6B;AAC7B,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,wCAAwC;IACxC,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B;AAED,gDAAgD;AAChD,cAAM,WAAW;IACf,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,YAAY,CAAa;IAEjC,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,6CAA6C;IAC7C,WAAW,CACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,QAAQ,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,IAAI;IAkCP,+BAA+B;IAC/B,SAAS,IAAI,UAAU;IAgDvB,gEAAgE;IAChE,YAAY,IAAI,MAAM;IAmDtB,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAMd;AAED,gCAAgC;AAChC,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { calculateTokenCost, calculatePRUCost, COPILOT_PRU_OVERAGE_RATE } from '../config/pricing.js';
|
|
2
|
+
import logger from '../config/logger.js';
|
|
3
|
+
/** Singleton cost tracker for a pipeline run */
|
|
4
|
+
class CostTracker {
|
|
5
|
+
records = [];
|
|
6
|
+
latestQuota;
|
|
7
|
+
currentAgent = 'unknown';
|
|
8
|
+
currentStage = 'unknown';
|
|
9
|
+
/** Set the current agent name (called by BaseAgent before LLM calls) */
|
|
10
|
+
setAgent(agent) {
|
|
11
|
+
this.currentAgent = agent;
|
|
12
|
+
}
|
|
13
|
+
/** Set the current pipeline stage */
|
|
14
|
+
setStage(stage) {
|
|
15
|
+
this.currentStage = stage;
|
|
16
|
+
}
|
|
17
|
+
/** Record a usage event from any provider */
|
|
18
|
+
recordUsage(provider, model, usage, cost, durationMs, quotaSnapshot) {
|
|
19
|
+
// Calculate cost if not provided
|
|
20
|
+
const finalCost = cost ?? {
|
|
21
|
+
amount: provider === 'copilot'
|
|
22
|
+
? calculatePRUCost(model)
|
|
23
|
+
: calculateTokenCost(model, usage.inputTokens, usage.outputTokens),
|
|
24
|
+
unit: provider === 'copilot' ? 'premium_requests' : 'usd',
|
|
25
|
+
model,
|
|
26
|
+
};
|
|
27
|
+
const record = {
|
|
28
|
+
timestamp: new Date(),
|
|
29
|
+
provider,
|
|
30
|
+
model,
|
|
31
|
+
agent: this.currentAgent,
|
|
32
|
+
stage: this.currentStage,
|
|
33
|
+
usage,
|
|
34
|
+
cost: finalCost,
|
|
35
|
+
durationMs,
|
|
36
|
+
};
|
|
37
|
+
this.records.push(record);
|
|
38
|
+
if (quotaSnapshot) {
|
|
39
|
+
this.latestQuota = quotaSnapshot;
|
|
40
|
+
}
|
|
41
|
+
logger.debug(`[CostTracker] ${provider}/${model} | ${this.currentAgent} | ` +
|
|
42
|
+
`in=${usage.inputTokens} out=${usage.outputTokens} | ` +
|
|
43
|
+
`cost=${finalCost.amount.toFixed(4)} ${finalCost.unit}`);
|
|
44
|
+
}
|
|
45
|
+
/** Get the full cost report */
|
|
46
|
+
getReport() {
|
|
47
|
+
const report = {
|
|
48
|
+
totalCostUSD: 0,
|
|
49
|
+
totalPRUs: 0,
|
|
50
|
+
totalTokens: { input: 0, output: 0, total: 0 },
|
|
51
|
+
byProvider: {},
|
|
52
|
+
byAgent: {},
|
|
53
|
+
byModel: {},
|
|
54
|
+
records: [...this.records],
|
|
55
|
+
copilotQuota: this.latestQuota,
|
|
56
|
+
};
|
|
57
|
+
for (const record of this.records) {
|
|
58
|
+
const { provider, model, agent, usage, cost } = record;
|
|
59
|
+
// Accumulate tokens
|
|
60
|
+
report.totalTokens.input += usage.inputTokens;
|
|
61
|
+
report.totalTokens.output += usage.outputTokens;
|
|
62
|
+
report.totalTokens.total += usage.totalTokens;
|
|
63
|
+
// Accumulate costs
|
|
64
|
+
const usdCost = cost.unit === 'usd' ? cost.amount : cost.amount * COPILOT_PRU_OVERAGE_RATE;
|
|
65
|
+
const prus = cost.unit === 'premium_requests' ? cost.amount : 0;
|
|
66
|
+
report.totalCostUSD += usdCost;
|
|
67
|
+
report.totalPRUs += prus;
|
|
68
|
+
// By provider
|
|
69
|
+
if (!report.byProvider[provider])
|
|
70
|
+
report.byProvider[provider] = { costUSD: 0, prus: 0, calls: 0 };
|
|
71
|
+
report.byProvider[provider].costUSD += usdCost;
|
|
72
|
+
report.byProvider[provider].prus += prus;
|
|
73
|
+
report.byProvider[provider].calls += 1;
|
|
74
|
+
// By agent
|
|
75
|
+
if (!report.byAgent[agent])
|
|
76
|
+
report.byAgent[agent] = { costUSD: 0, prus: 0, calls: 0 };
|
|
77
|
+
report.byAgent[agent].costUSD += usdCost;
|
|
78
|
+
report.byAgent[agent].prus += prus;
|
|
79
|
+
report.byAgent[agent].calls += 1;
|
|
80
|
+
// By model
|
|
81
|
+
if (!report.byModel[model])
|
|
82
|
+
report.byModel[model] = { costUSD: 0, prus: 0, calls: 0 };
|
|
83
|
+
report.byModel[model].costUSD += usdCost;
|
|
84
|
+
report.byModel[model].prus += prus;
|
|
85
|
+
report.byModel[model].calls += 1;
|
|
86
|
+
}
|
|
87
|
+
return report;
|
|
88
|
+
}
|
|
89
|
+
/** Format report as human-readable string for console output */
|
|
90
|
+
formatReport() {
|
|
91
|
+
const report = this.getReport();
|
|
92
|
+
const lines = [
|
|
93
|
+
'',
|
|
94
|
+
'═══════════════════════════════════════════',
|
|
95
|
+
' 💰 Pipeline Cost Report',
|
|
96
|
+
'═══════════════════════════════════════════',
|
|
97
|
+
'',
|
|
98
|
+
` Total Cost: $${report.totalCostUSD.toFixed(4)} USD`,
|
|
99
|
+
];
|
|
100
|
+
if (report.totalPRUs > 0) {
|
|
101
|
+
lines.push(` Total PRUs: ${report.totalPRUs} premium requests`);
|
|
102
|
+
}
|
|
103
|
+
lines.push(` Total Tokens: ${report.totalTokens.total.toLocaleString()} (${report.totalTokens.input.toLocaleString()} in / ${report.totalTokens.output.toLocaleString()} out)`, ` LLM Calls: ${this.records.length}`);
|
|
104
|
+
if (report.copilotQuota) {
|
|
105
|
+
lines.push('', ` Copilot Quota: ${report.copilotQuota.remainingPercentage.toFixed(1)}% remaining`, ` Used/Total: ${report.copilotQuota.usedRequests}/${report.copilotQuota.entitlementRequests} PRUs`);
|
|
106
|
+
if (report.copilotQuota.resetDate) {
|
|
107
|
+
lines.push(` Resets: ${report.copilotQuota.resetDate}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// By agent breakdown
|
|
111
|
+
if (Object.keys(report.byAgent).length > 1) {
|
|
112
|
+
lines.push('', ' By Agent:');
|
|
113
|
+
for (const [agent, data] of Object.entries(report.byAgent)) {
|
|
114
|
+
lines.push(` ${agent}: $${data.costUSD.toFixed(4)} (${data.calls} calls)`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// By model breakdown
|
|
118
|
+
if (Object.keys(report.byModel).length > 1) {
|
|
119
|
+
lines.push('', ' By Model:');
|
|
120
|
+
for (const [model, data] of Object.entries(report.byModel)) {
|
|
121
|
+
lines.push(` ${model}: $${data.costUSD.toFixed(4)} (${data.calls} calls)`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
lines.push('', '═══════════════════════════════════════════', '');
|
|
125
|
+
return lines.join('\n');
|
|
126
|
+
}
|
|
127
|
+
/** Reset all tracking (for new pipeline run) */
|
|
128
|
+
reset() {
|
|
129
|
+
this.records = [];
|
|
130
|
+
this.latestQuota = undefined;
|
|
131
|
+
this.currentAgent = 'unknown';
|
|
132
|
+
this.currentStage = 'unknown';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Global singleton instance */
|
|
136
|
+
export const costTracker = new CostTracker();
|
|
137
|
+
//# sourceMappingURL=costTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"costTracker.js","sourceRoot":"","sources":["../../src/services/costTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipExtraction.d.ts","sourceRoot":"","sources":["../../../src/tools/ffmpeg/clipExtraction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clipExtraction.d.ts","sourceRoot":"","sources":["../../../src/tools/ffmpeg/clipExtraction.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkC3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EAAE,EACxB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAgEjB;AAED;;;;;;;GAOG;AACH,wBAAsB,mCAAmC,CACvD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EAAE,EACxB,UAAU,EAAE,MAAM,EAClB,kBAAkB,GAAE,MAAY,EAChC,MAAM,GAAE,MAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CA6FjB"}
|
|
@@ -2,12 +2,32 @@ import ffmpeg from 'fluent-ffmpeg';
|
|
|
2
2
|
import { execFile } from 'child_process';
|
|
3
3
|
import { promises as fs } from 'fs';
|
|
4
4
|
import pathMod from 'path';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
5
6
|
import logger from '../../config/logger';
|
|
6
7
|
import { getFFmpegPath, getFFprobePath } from '../../config/ffmpegResolver.js';
|
|
7
8
|
const ffmpegPath = getFFmpegPath();
|
|
8
9
|
const ffprobePath = getFFprobePath();
|
|
9
10
|
ffmpeg.setFfmpegPath(ffmpegPath);
|
|
10
11
|
ffmpeg.setFfprobePath(ffprobePath);
|
|
12
|
+
const DEFAULT_FPS = 25;
|
|
13
|
+
/**
|
|
14
|
+
* Probe the source video's frame rate using ffprobe.
|
|
15
|
+
* Returns a rounded integer fps, or DEFAULT_FPS if probing fails.
|
|
16
|
+
* Needed because FFmpeg 7.x xfade requires constant-framerate inputs.
|
|
17
|
+
*/
|
|
18
|
+
async function getVideoFps(videoPath) {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
execFile(ffprobePath, ['-v', 'error', '-select_streams', 'v:0', '-show_entries', 'stream=r_frame_rate', '-of', 'csv=p=0', videoPath], { timeout: 5000 }, (error, stdout) => {
|
|
21
|
+
if (error || !stdout.trim()) {
|
|
22
|
+
resolve(DEFAULT_FPS);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const parts = stdout.trim().split('/');
|
|
26
|
+
const fps = parts.length === 2 ? parseInt(parts[0]) / parseInt(parts[1]) : parseFloat(stdout.trim());
|
|
27
|
+
resolve(isFinite(fps) && fps > 0 ? Math.round(fps) : DEFAULT_FPS);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
11
31
|
/**
|
|
12
32
|
* Extract a single clip segment using re-encode for frame-accurate timing.
|
|
13
33
|
*
|
|
@@ -66,7 +86,7 @@ export async function extractCompositeClip(videoPath, segments, outputPath, buff
|
|
|
66
86
|
}
|
|
67
87
|
const outputDir = pathMod.dirname(outputPath);
|
|
68
88
|
await fs.mkdir(outputDir, { recursive: true });
|
|
69
|
-
const tempDir = pathMod.join(outputDir, `.temp-${
|
|
89
|
+
const tempDir = pathMod.join(outputDir, `.temp-${randomUUID()}`);
|
|
70
90
|
await fs.mkdir(tempDir, { recursive: true });
|
|
71
91
|
const tempFiles = [];
|
|
72
92
|
try {
|
|
@@ -135,6 +155,8 @@ export async function extractCompositeClipWithTransitions(videoPath, segments, o
|
|
|
135
155
|
}
|
|
136
156
|
const outputDir = pathMod.dirname(outputPath);
|
|
137
157
|
await fs.mkdir(outputDir, { recursive: true });
|
|
158
|
+
// Detect source fps so we can force CFR after trim (FFmpeg 7.x xfade requires it)
|
|
159
|
+
const fps = await getVideoFps(videoPath);
|
|
138
160
|
// Build filter_complex for xfade transitions between segments
|
|
139
161
|
const filterParts = [];
|
|
140
162
|
const segDurations = [];
|
|
@@ -144,7 +166,7 @@ export async function extractCompositeClipWithTransitions(videoPath, segments, o
|
|
|
144
166
|
const bufferedEnd = seg.end + buffer;
|
|
145
167
|
const duration = bufferedEnd - bufferedStart;
|
|
146
168
|
segDurations.push(duration);
|
|
147
|
-
filterParts.push(`[0:v]trim=start=${bufferedStart.toFixed(3)}:end=${bufferedEnd.toFixed(3)},setpts=PTS-STARTPTS[v${i}]`);
|
|
169
|
+
filterParts.push(`[0:v]trim=start=${bufferedStart.toFixed(3)}:end=${bufferedEnd.toFixed(3)},setpts=PTS-STARTPTS,fps=${fps}[v${i}]`);
|
|
148
170
|
filterParts.push(`[0:a]atrim=start=${bufferedStart.toFixed(3)}:end=${bufferedEnd.toFixed(3)},asetpts=PTS-STARTPTS[a${i}]`);
|
|
149
171
|
}
|
|
150
172
|
// Chain xfade transitions: [v0][v1]xfade → [xv0]; [xv0][v2]xfade → [xv1]; ...
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipExtraction.js","sourceRoot":"","sources":["../../../src/tools/ffmpeg/clipExtraction.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"clipExtraction.js","sourceRoot":"","sources":["../../../src/tools/ffmpeg/clipExtraction.ts"],"names":[],"mappings":"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"}
|