diff --git a/packages/embeddings/src/dataconnect-generated/index.d.ts b/packages/embeddings/src/dataconnect-generated/index.d.ts new file mode 100644 index 000000000..af31c8231 --- /dev/null +++ b/packages/embeddings/src/dataconnect-generated/index.d.ts @@ -0,0 +1,49 @@ +/** + * Stub types for Firebase Data Connect SDK + * + * In production, this file would be auto-generated by Firebase Data Connect. + * For Vercel builds where Data Connect isn't available, we provide stubs + * that throw helpful errors at runtime. + */ +export interface VideoEmbedding { + id: string; + segmentType: string; + segmentIndex: number; + content: string; + job?: { + id: string; + title?: string; + videoUrl?: string; + }; +} +export interface ListEmbeddingsResponse { + data: { + videoEmbeddings: VideoEmbedding[]; + }; +} +export interface GetJobEmbeddingsResponse { + data: { + videoEmbeddings: VideoEmbedding[]; + }; +} +type UUID = `${string}-${string}-${string}-${string}-${string}`; +/** + * List embeddings - stub that throws when Data Connect unavailable + */ +export declare function listEmbeddings(_params: { + limit: number; +}): Promise; +/** + * Get embeddings for a specific job - stub + */ +export declare function getJobEmbeddings(_params: { + jobId: UUID; +}): Promise; +/** + * Delete embeddings for a job - stub + */ +export declare function deleteJobEmbeddings(_params: { + jobId: UUID; +}): Promise; +export {}; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/embeddings/src/dataconnect-generated/index.d.ts.map b/packages/embeddings/src/dataconnect-generated/index.d.ts.map new file mode 100644 index 000000000..fb4d6542c --- /dev/null +++ b/packages/embeddings/src/dataconnect-generated/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE;QACJ,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE;QACJ,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;CACH;AAGD,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAEhE;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMlC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,KAAK,EAAE,IAAI,CAAC;CACb,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAMpC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,KAAK,EAAE,IAAI,CAAC;CACb,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhB"} \ No newline at end of file diff --git a/packages/embeddings/src/dataconnect-generated/index.js b/packages/embeddings/src/dataconnect-generated/index.js new file mode 100644 index 000000000..27795f4ae --- /dev/null +++ b/packages/embeddings/src/dataconnect-generated/index.js @@ -0,0 +1,37 @@ +"use strict"; +/** + * Stub types for Firebase Data Connect SDK + * + * In production, this file would be auto-generated by Firebase Data Connect. + * For Vercel builds where Data Connect isn't available, we provide stubs + * that throw helpful errors at runtime. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.listEmbeddings = listEmbeddings; +exports.getJobEmbeddings = getJobEmbeddings; +exports.deleteJobEmbeddings = deleteJobEmbeddings; +/** + * List embeddings - stub that throws when Data Connect unavailable + */ +async function listEmbeddings(_params) { + throw new Error("Firebase Data Connect is not configured. " + + "Run 'firebase dataconnect:sdk:generate' to generate the SDK, " + + "or use raw SQL queries for embedding operations."); +} +/** + * Get embeddings for a specific job - stub + */ +async function getJobEmbeddings(_params) { + throw new Error("Firebase Data Connect is not configured. " + + "Run 'firebase dataconnect:sdk:generate' to generate the SDK, " + + "or use raw SQL queries for embedding operations."); +} +/** + * Delete embeddings for a job - stub + */ +async function deleteJobEmbeddings(_params) { + throw new Error("Firebase Data Connect is not configured. " + + "Run 'firebase dataconnect:sdk:generate' to generate the SDK, " + + "or use raw SQL queries for embedding operations."); +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/embeddings/src/dataconnect-generated/index.js.map b/packages/embeddings/src/dataconnect-generated/index.js.map new file mode 100644 index 000000000..88ac4b2da --- /dev/null +++ b/packages/embeddings/src/dataconnect-generated/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAiCH,wCAQC;AAKD,4CAQC;AAKD,kDAQC;AArCD;;GAEG;AACI,KAAK,UAAU,cAAc,CAAC,OAEpC;IACC,MAAM,IAAI,KAAK,CACb,2CAA2C;QACzC,+DAA+D;QAC/D,kDAAkD,CACrD,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAAC,OAEtC;IACC,MAAM,IAAI,KAAK,CACb,2CAA2C;QACzC,+DAA+D;QAC/D,kDAAkD,CACrD,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CAAC,OAEzC;IACC,MAAM,IAAI,KAAK,CACb,2CAA2C;QACzC,+DAA+D;QAC/D,kDAAkD,CACrD,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/packages/embeddings/src/dataconnect-generated/index.ts b/packages/embeddings/src/dataconnect-generated/index.ts new file mode 100644 index 000000000..83064c2c0 --- /dev/null +++ b/packages/embeddings/src/dataconnect-generated/index.ts @@ -0,0 +1,74 @@ +/** + * Stub types for Firebase Data Connect SDK + * + * In production, this file would be auto-generated by Firebase Data Connect. + * For Vercel builds where Data Connect isn't available, we provide stubs + * that throw helpful errors at runtime. + */ + +// Type definitions matching expected Data Connect schema +export interface VideoEmbedding { + id: string; + segmentType: string; + segmentIndex: number; + content: string; + job?: { + id: string; + title?: string; + videoUrl?: string; + }; +} + +export interface ListEmbeddingsResponse { + data: { + videoEmbeddings: VideoEmbedding[]; + }; +} + +export interface GetJobEmbeddingsResponse { + data: { + videoEmbeddings: VideoEmbedding[]; + }; +} + +// UUID type for job IDs +type UUID = `${string}-${string}-${string}-${string}-${string}`; + +/** + * List embeddings - stub that throws when Data Connect unavailable + */ +export async function listEmbeddings(_params: { + limit: number; +}): Promise { + throw new Error( + "Firebase Data Connect is not configured. " + + "Run 'firebase dataconnect:sdk:generate' to generate the SDK, " + + "or use raw SQL queries for embedding operations." + ); +} + +/** + * Get embeddings for a specific job - stub + */ +export async function getJobEmbeddings(_params: { + jobId: UUID; +}): Promise { + throw new Error( + "Firebase Data Connect is not configured. " + + "Run 'firebase dataconnect:sdk:generate' to generate the SDK, " + + "or use raw SQL queries for embedding operations." + ); +} + +/** + * Delete embeddings for a job - stub + */ +export async function deleteJobEmbeddings(_params: { + jobId: UUID; +}): Promise { + throw new Error( + "Firebase Data Connect is not configured. " + + "Run 'firebase dataconnect:sdk:generate' to generate the SDK, " + + "or use raw SQL queries for embedding operations." + ); +} diff --git a/packages/embeddings/src/embedding.ts b/packages/embeddings/src/embedding.ts index ea46b09d8..1cdfc2c15 100644 --- a/packages/embeddings/src/embedding.ts +++ b/packages/embeddings/src/embedding.ts @@ -17,7 +17,8 @@ import { listEmbeddings, getJobEmbeddings, deleteJobEmbeddings, -} from "../dataconnect-generated"; + type VideoEmbedding, +} from "./dataconnect-generated"; // ============================================================================= // Types @@ -108,7 +109,9 @@ export async function generateEmbedding(text: string): Promise { throw new Error(`Embedding API error: ${response.status} ${await response.text()}`); } - const data = await response.json(); + const data = (await response.json()) as { + predictions: Array<{ embeddings: { values: number[] } }>; + }; return data.predictions[0].embeddings.values; } @@ -134,8 +137,10 @@ export async function generateEmbeddings(texts: string[]): Promise { throw new Error(`Embedding API error: ${response.status} ${await response.text()}`); } - const data = await response.json(); - return data.predictions.map((p: { embeddings: { values: number[] } }) => p.embeddings.values); + const data = (await response.json()) as { + predictions: Array<{ embeddings: { values: number[] } }>; + }; + return data.predictions.map((p) => p.embeddings.values); } /** @@ -148,7 +153,7 @@ async function getAccessToken(): Promise { "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token", { headers: { "Metadata-Flavor": "Google" } } ); - const data = await response.json(); + const data = (await response.json()) as { access_token: string }; return data.access_token; } @@ -356,7 +361,7 @@ export async function embedJobAnalysis( */ export async function getEmbeddingsForJob(jobId: string): Promise { const result = await getJobEmbeddings({ jobId: jobId as `${string}-${string}-${string}-${string}-${string}` }); - return result.data.videoEmbeddings.map((e) => ({ + return result.data.videoEmbeddings.map((e: VideoEmbedding) => ({ id: e.id, segmentType: e.segmentType, segmentIndex: e.segmentIndex, @@ -377,7 +382,7 @@ export async function clearJobEmbeddings(jobId: string): Promise { */ export async function listRecentEmbeddings(limit: number = 100): Promise { const result = await listEmbeddings({ limit }); - return result.data.videoEmbeddings.map((e) => ({ + return result.data.videoEmbeddings.map((e: VideoEmbedding) => ({ id: e.id, segmentType: e.segmentType, segmentIndex: e.segmentIndex,