@node-llm/core 0.2.2 → 0.4.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 +288 -16
- package/dist/chat/Chat.d.ts +58 -17
- package/dist/chat/Chat.d.ts.map +1 -1
- package/dist/chat/Chat.js +185 -33
- package/dist/chat/ChatOptions.d.ts +10 -0
- package/dist/chat/ChatOptions.d.ts.map +1 -1
- package/dist/chat/ChatResponse.d.ts +23 -0
- package/dist/chat/ChatResponse.d.ts.map +1 -0
- package/dist/chat/ChatResponse.js +38 -0
- package/dist/chat/Stream.d.ts.map +1 -1
- package/dist/chat/Stream.js +10 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/embedding/Embedding.d.ts +17 -0
- package/dist/embedding/Embedding.d.ts.map +1 -0
- package/dist/embedding/Embedding.js +24 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/llm.d.ts +35 -3
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +88 -14
- package/dist/models/ModelRegistry.d.ts +23 -0
- package/dist/models/ModelRegistry.d.ts.map +1 -0
- package/dist/models/ModelRegistry.js +54 -0
- package/dist/moderation/Moderation.d.ts +56 -0
- package/dist/moderation/Moderation.d.ts.map +1 -0
- package/dist/moderation/Moderation.js +92 -0
- package/dist/providers/Embedding.d.ts +20 -0
- package/dist/providers/Embedding.d.ts.map +1 -0
- package/dist/providers/Provider.d.ts +50 -4
- package/dist/providers/Provider.d.ts.map +1 -1
- package/dist/providers/gemini/Capabilities.d.ts +30 -0
- package/dist/providers/gemini/Capabilities.d.ts.map +1 -0
- package/dist/providers/gemini/Capabilities.js +148 -0
- package/dist/providers/gemini/Chat.d.ts +8 -0
- package/dist/providers/gemini/Chat.d.ts.map +1 -0
- package/dist/providers/gemini/Chat.js +69 -0
- package/dist/providers/gemini/ChatUtils.d.ts +9 -0
- package/dist/providers/gemini/ChatUtils.d.ts.map +1 -0
- package/dist/providers/gemini/ChatUtils.js +83 -0
- package/dist/providers/gemini/Embeddings.d.ts +8 -0
- package/dist/providers/gemini/Embeddings.d.ts.map +1 -0
- package/dist/providers/gemini/Embeddings.js +44 -0
- package/dist/providers/gemini/Errors.d.ts +2 -0
- package/dist/providers/gemini/Errors.d.ts.map +1 -0
- package/dist/providers/gemini/Errors.js +34 -0
- package/dist/providers/gemini/GeminiProvider.d.ts +34 -0
- package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiProvider.js +55 -0
- package/dist/providers/gemini/Image.d.ts +8 -0
- package/dist/providers/gemini/Image.d.ts.map +1 -0
- package/dist/providers/gemini/Image.js +47 -0
- package/dist/providers/gemini/Models.d.ts +8 -0
- package/dist/providers/gemini/Models.d.ts.map +1 -0
- package/dist/providers/gemini/Models.js +38 -0
- package/dist/providers/gemini/Streaming.d.ts +8 -0
- package/dist/providers/gemini/Streaming.d.ts.map +1 -0
- package/dist/providers/gemini/Streaming.js +70 -0
- package/dist/providers/gemini/Transcription.d.ts +9 -0
- package/dist/providers/gemini/Transcription.d.ts.map +1 -0
- package/dist/providers/gemini/Transcription.js +63 -0
- package/dist/providers/gemini/index.d.ts +11 -0
- package/dist/providers/gemini/index.d.ts.map +1 -0
- package/dist/providers/gemini/index.js +24 -0
- package/dist/providers/gemini/types.d.ts +118 -0
- package/dist/providers/gemini/types.d.ts.map +1 -0
- package/dist/providers/gemini/types.js +1 -0
- package/dist/providers/openai/Capabilities.d.ts +7 -2
- package/dist/providers/openai/Capabilities.d.ts.map +1 -1
- package/dist/providers/openai/Capabilities.js +52 -214
- package/dist/providers/openai/Chat.d.ts.map +1 -1
- package/dist/providers/openai/Chat.js +4 -0
- package/dist/providers/openai/Embedding.d.ts +8 -0
- package/dist/providers/openai/Embedding.d.ts.map +1 -0
- package/dist/providers/openai/Embedding.js +48 -0
- package/dist/providers/openai/ModelDefinitions.d.ts +25 -0
- package/dist/providers/openai/ModelDefinitions.d.ts.map +1 -0
- package/dist/providers/openai/ModelDefinitions.js +211 -0
- package/dist/providers/openai/Moderation.d.ts +8 -0
- package/dist/providers/openai/Moderation.d.ts.map +1 -0
- package/dist/providers/openai/Moderation.js +27 -0
- package/dist/providers/openai/OpenAIProvider.d.ts +13 -1
- package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/openai/OpenAIProvider.js +22 -0
- package/dist/providers/openai/Streaming.d.ts.map +1 -1
- package/dist/providers/openai/Streaming.js +19 -8
- package/dist/providers/openai/Transcription.d.ts +10 -0
- package/dist/providers/openai/Transcription.d.ts.map +1 -0
- package/dist/providers/openai/Transcription.js +162 -0
- package/dist/providers/openai/index.d.ts +8 -0
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +12 -0
- package/dist/schema/Schema.d.ts +20 -0
- package/dist/schema/Schema.d.ts.map +1 -0
- package/dist/schema/Schema.js +22 -0
- package/dist/schema/to-json-schema.d.ts +3 -0
- package/dist/schema/to-json-schema.d.ts.map +1 -0
- package/dist/schema/to-json-schema.js +10 -0
- package/dist/transcription/Transcription.d.ts +11 -0
- package/dist/transcription/Transcription.d.ts.map +1 -0
- package/dist/transcription/Transcription.js +21 -0
- package/dist/utils/Binary.d.ts +12 -0
- package/dist/utils/Binary.d.ts.map +1 -0
- package/dist/utils/Binary.js +71 -0
- package/dist/utils/FileLoader.d.ts.map +1 -1
- package/dist/utils/FileLoader.js +12 -1
- package/dist/utils/audio.d.ts +10 -0
- package/dist/utils/audio.d.ts.map +1 -0
- package/dist/utils/audio.js +46 -0
- package/package.json +18 -7
- package/dist/providers/openai/register.d.ts +0 -2
- package/dist/providers/openai/register.d.ts.map +0 -1
- package/dist/providers/openai/register.js +0 -15
- package/dist/tools/Tool.d.ts +0 -8
- package/dist/tools/Tool.d.ts.map +0 -1
- package/dist/tools/ToolSet.d.ts +0 -15
- package/dist/tools/ToolSet.d.ts.map +0 -1
- package/dist/tools/ToolSet.js +0 -29
- package/dist/tools/index.d.ts +0 -2
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -1
- package/dist/tools/runCommandTool.d.ts +0 -8
- package/dist/tools/runCommandTool.d.ts.map +0 -1
- package/dist/tools/runCommandTool.js +0 -19
- /package/dist/{tools/Tool.js → providers/Embedding.js} +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { handleOpenAIError } from "./Errors.js";
|
|
2
|
+
import { DEFAULT_MODELS } from "../../constants.js";
|
|
3
|
+
export class OpenAIModeration {
|
|
4
|
+
baseUrl;
|
|
5
|
+
apiKey;
|
|
6
|
+
constructor(baseUrl, apiKey) {
|
|
7
|
+
this.baseUrl = baseUrl;
|
|
8
|
+
this.apiKey = apiKey;
|
|
9
|
+
}
|
|
10
|
+
async execute(request) {
|
|
11
|
+
const response = await fetch(`${this.baseUrl}/moderations`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: {
|
|
14
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
15
|
+
"Content-Type": "application/json",
|
|
16
|
+
},
|
|
17
|
+
body: JSON.stringify({
|
|
18
|
+
input: request.input,
|
|
19
|
+
model: request.model || DEFAULT_MODELS.MODERATION,
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
await handleOpenAIError(response, request.model || DEFAULT_MODELS.MODERATION);
|
|
24
|
+
}
|
|
25
|
+
return (await response.json());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse } from "../Provider.js";
|
|
1
|
+
import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, ModerationRequest, ModerationResponse } from "../Provider.js";
|
|
2
|
+
import { TranscriptionRequest, TranscriptionResponse } from "../Provider.js";
|
|
3
|
+
import { EmbeddingRequest, EmbeddingResponse } from "../Embedding.js";
|
|
2
4
|
export interface OpenAIProviderOptions {
|
|
3
5
|
apiKey: string;
|
|
4
6
|
baseUrl?: string;
|
|
@@ -10,10 +12,17 @@ export declare class OpenAIProvider implements Provider {
|
|
|
10
12
|
private readonly streamingHandler;
|
|
11
13
|
private readonly modelsHandler;
|
|
12
14
|
private readonly imageHandler;
|
|
15
|
+
private readonly transcriptionHandler;
|
|
16
|
+
private readonly moderationHandler;
|
|
17
|
+
private readonly embeddingHandler;
|
|
13
18
|
capabilities: {
|
|
14
19
|
supportsVision: (model: string) => boolean;
|
|
15
20
|
supportsTools: (model: string) => boolean;
|
|
16
21
|
supportsStructuredOutput: (model: string) => boolean;
|
|
22
|
+
supportsEmbeddings: (model: string) => boolean;
|
|
23
|
+
supportsImageGeneration: (model: string) => boolean;
|
|
24
|
+
supportsTranscription: (model: string) => boolean;
|
|
25
|
+
supportsModeration: (model: string) => boolean;
|
|
17
26
|
getContextWindow: (model: string) => number | null;
|
|
18
27
|
};
|
|
19
28
|
constructor(options: OpenAIProviderOptions);
|
|
@@ -21,5 +30,8 @@ export declare class OpenAIProvider implements Provider {
|
|
|
21
30
|
stream(request: ChatRequest): AsyncGenerator<ChatChunk>;
|
|
22
31
|
listModels(): Promise<ModelInfo[]>;
|
|
23
32
|
paint(request: ImageRequest): Promise<ImageResponse>;
|
|
33
|
+
transcribe(request: TranscriptionRequest): Promise<TranscriptionResponse>;
|
|
34
|
+
moderate(request: ModerationRequest): Promise<ModerationResponse>;
|
|
35
|
+
embed(request: EmbeddingRequest): Promise<EmbeddingResponse>;
|
|
24
36
|
}
|
|
25
37
|
//# sourceMappingURL=OpenAIProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAS/J,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,YAAW,QAAQ;IAqBjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAE5C,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;kCACR,MAAM;MAChC;gBAE2B,OAAO,EAAE,qBAAqB;IAWrD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIjE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGnE"}
|
|
@@ -3,6 +3,9 @@ import { OpenAIChat } from "./Chat.js";
|
|
|
3
3
|
import { OpenAIStreaming } from "./Streaming.js";
|
|
4
4
|
import { OpenAIModels } from "./Models.js";
|
|
5
5
|
import { OpenAIImage } from "./Image.js";
|
|
6
|
+
import { OpenAITranscription } from "./Transcription.js";
|
|
7
|
+
import { OpenAIModeration } from "./Moderation.js";
|
|
8
|
+
import { OpenAIEmbedding } from "./Embedding.js";
|
|
6
9
|
export class OpenAIProvider {
|
|
7
10
|
options;
|
|
8
11
|
baseUrl;
|
|
@@ -10,10 +13,17 @@ export class OpenAIProvider {
|
|
|
10
13
|
streamingHandler;
|
|
11
14
|
modelsHandler;
|
|
12
15
|
imageHandler;
|
|
16
|
+
transcriptionHandler;
|
|
17
|
+
moderationHandler;
|
|
18
|
+
embeddingHandler;
|
|
13
19
|
capabilities = {
|
|
14
20
|
supportsVision: (model) => Capabilities.supportsVision(model),
|
|
15
21
|
supportsTools: (model) => Capabilities.supportsTools(model),
|
|
16
22
|
supportsStructuredOutput: (model) => Capabilities.supportsStructuredOutput(model),
|
|
23
|
+
supportsEmbeddings: (model) => Capabilities.supportsEmbeddings(model),
|
|
24
|
+
supportsImageGeneration: (model) => Capabilities.supportsImageGeneration(model),
|
|
25
|
+
supportsTranscription: (model) => Capabilities.supportsTranscription(model),
|
|
26
|
+
supportsModeration: (model) => Capabilities.supportsModeration(model),
|
|
17
27
|
getContextWindow: (model) => Capabilities.getContextWindow(model),
|
|
18
28
|
};
|
|
19
29
|
constructor(options) {
|
|
@@ -23,6 +33,9 @@ export class OpenAIProvider {
|
|
|
23
33
|
this.streamingHandler = new OpenAIStreaming(this.baseUrl, options.apiKey);
|
|
24
34
|
this.modelsHandler = new OpenAIModels(this.baseUrl, options.apiKey);
|
|
25
35
|
this.imageHandler = new OpenAIImage(this.baseUrl, options.apiKey);
|
|
36
|
+
this.transcriptionHandler = new OpenAITranscription(this.baseUrl, options.apiKey);
|
|
37
|
+
this.moderationHandler = new OpenAIModeration(this.baseUrl, options.apiKey);
|
|
38
|
+
this.embeddingHandler = new OpenAIEmbedding(this.baseUrl, options.apiKey);
|
|
26
39
|
}
|
|
27
40
|
async chat(request) {
|
|
28
41
|
return this.chatHandler.execute(request);
|
|
@@ -36,4 +49,13 @@ export class OpenAIProvider {
|
|
|
36
49
|
async paint(request) {
|
|
37
50
|
return this.imageHandler.execute(request);
|
|
38
51
|
}
|
|
52
|
+
async transcribe(request) {
|
|
53
|
+
return this.transcriptionHandler.execute(request);
|
|
54
|
+
}
|
|
55
|
+
async moderate(request) {
|
|
56
|
+
return this.moderationHandler.execute(request);
|
|
57
|
+
}
|
|
58
|
+
async embed(request) {
|
|
59
|
+
return this.embeddingHandler.execute(request);
|
|
60
|
+
}
|
|
39
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIxD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEtE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIxD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEtE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;CAqEhE"}
|
|
@@ -25,6 +25,7 @@ export class OpenAIStreaming {
|
|
|
25
25
|
headers: {
|
|
26
26
|
"Authorization": `Bearer ${this.apiKey}`,
|
|
27
27
|
"Content-Type": "application/json",
|
|
28
|
+
...request.headers,
|
|
28
29
|
},
|
|
29
30
|
body: JSON.stringify(body),
|
|
30
31
|
});
|
|
@@ -36,22 +37,32 @@ export class OpenAIStreaming {
|
|
|
36
37
|
}
|
|
37
38
|
const reader = response.body.getReader();
|
|
38
39
|
const decoder = new TextDecoder();
|
|
40
|
+
let buffer = "";
|
|
39
41
|
while (true) {
|
|
40
42
|
const { value, done } = await reader.read();
|
|
41
43
|
if (done)
|
|
42
44
|
break;
|
|
43
|
-
const chunk = decoder.decode(value);
|
|
44
|
-
|
|
45
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
46
|
+
buffer += chunk;
|
|
47
|
+
const lines = buffer.split("\n\n");
|
|
48
|
+
buffer = lines.pop() || ""; // Keep the last incomplete part in the buffer
|
|
45
49
|
for (const line of lines) {
|
|
46
|
-
|
|
50
|
+
const trimmed = line.trim();
|
|
51
|
+
if (!trimmed.startsWith("data: "))
|
|
47
52
|
continue;
|
|
48
|
-
const data =
|
|
53
|
+
const data = trimmed.replace("data: ", "").trim();
|
|
49
54
|
if (data === "[DONE]")
|
|
50
55
|
return;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
56
|
+
try {
|
|
57
|
+
const json = JSON.parse(data);
|
|
58
|
+
const delta = json.choices?.[0]?.delta?.content;
|
|
59
|
+
if (delta) {
|
|
60
|
+
yield { content: delta };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
// Ignore parse errors for now, or log them
|
|
65
|
+
// console.warn("JSON parse error in stream:", e);
|
|
55
66
|
}
|
|
56
67
|
}
|
|
57
68
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TranscriptionRequest, TranscriptionResponse } from "../Provider.js";
|
|
2
|
+
export declare class OpenAITranscription {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
constructor(baseUrl: string, apiKey: string);
|
|
6
|
+
execute(request: TranscriptionRequest): Promise<TranscriptionResponse>;
|
|
7
|
+
private transcribeViaWhisper;
|
|
8
|
+
private transcribeViaChat;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=Transcription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transcription.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAK7E,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEvE,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;YAU9D,oBAAoB;YA4CpB,iBAAiB;CAwHhC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { handleOpenAIError } from "./Errors.js";
|
|
2
|
+
import { AudioUtils } from "../../utils/audio.js";
|
|
3
|
+
import { DEFAULT_MODELS } from "../../constants.js";
|
|
4
|
+
export class OpenAITranscription {
|
|
5
|
+
baseUrl;
|
|
6
|
+
apiKey;
|
|
7
|
+
constructor(baseUrl, apiKey) {
|
|
8
|
+
this.baseUrl = baseUrl;
|
|
9
|
+
this.apiKey = apiKey;
|
|
10
|
+
}
|
|
11
|
+
async execute(request) {
|
|
12
|
+
const model = request.model || DEFAULT_MODELS.TRANSCRIPTION;
|
|
13
|
+
if (model.startsWith("gpt-4o")) {
|
|
14
|
+
return this.transcribeViaChat(request);
|
|
15
|
+
}
|
|
16
|
+
return this.transcribeViaWhisper(request);
|
|
17
|
+
}
|
|
18
|
+
async transcribeViaWhisper(request) {
|
|
19
|
+
const formData = new FormData();
|
|
20
|
+
const { data, fileName, duration: estimatedDuration } = await AudioUtils.load(request.file);
|
|
21
|
+
const mimeType = fileName.endsWith(".wav") ? "audio/wav" : "audio/mpeg";
|
|
22
|
+
const file = new File([data], fileName, { type: mimeType });
|
|
23
|
+
formData.append("file", file);
|
|
24
|
+
formData.append("model", request.model || DEFAULT_MODELS.TRANSCRIPTION);
|
|
25
|
+
formData.append("response_format", "verbose_json");
|
|
26
|
+
if (request.prompt) {
|
|
27
|
+
formData.append("prompt", request.prompt);
|
|
28
|
+
}
|
|
29
|
+
if (request.language) {
|
|
30
|
+
formData.append("language", request.language);
|
|
31
|
+
}
|
|
32
|
+
const response = await fetch(`${this.baseUrl}/audio/transcriptions`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
36
|
+
},
|
|
37
|
+
body: formData,
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
await handleOpenAIError(response, request.model || DEFAULT_MODELS.TRANSCRIPTION);
|
|
41
|
+
}
|
|
42
|
+
const json = (await response.json());
|
|
43
|
+
return {
|
|
44
|
+
text: json.text,
|
|
45
|
+
model: json.model || request.model || DEFAULT_MODELS.TRANSCRIPTION,
|
|
46
|
+
duration: json.duration || estimatedDuration,
|
|
47
|
+
segments: json.segments?.map(s => ({
|
|
48
|
+
id: s.id,
|
|
49
|
+
start: s.start,
|
|
50
|
+
end: s.end,
|
|
51
|
+
text: s.text
|
|
52
|
+
}))
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async transcribeViaChat(request) {
|
|
56
|
+
const { data, fileName, duration: estimatedDuration } = await AudioUtils.load(request.file);
|
|
57
|
+
const base64Audio = Buffer.from(data).toString("base64");
|
|
58
|
+
const model = request.model || "gpt-4o";
|
|
59
|
+
let actualModel = "gpt-4o-audio-preview";
|
|
60
|
+
let defaultPrompt = "Transcribe the audio exactly. Return only the transcription text.";
|
|
61
|
+
let isDiarization = false;
|
|
62
|
+
if (model.includes("diarize")) {
|
|
63
|
+
isDiarization = true;
|
|
64
|
+
const names = request.speakerNames?.join(", ") || "Speaker A, Speaker B";
|
|
65
|
+
defaultPrompt = `Transcribe the audio and identify different speakers.
|
|
66
|
+
I will provide reference clips for specific voices. Please map the voices in the main audio to these names: ${names}.
|
|
67
|
+
Return the output as a JSON array of objects, each with 'speaker', 'text', 'start', and 'end' (in seconds).
|
|
68
|
+
Example: [{"speaker": "Alice", "text": "Hello", "start": 0.5, "end": 1.2}]`;
|
|
69
|
+
}
|
|
70
|
+
if (request.language) {
|
|
71
|
+
defaultPrompt += ` The audio is in ${request.language}.`;
|
|
72
|
+
}
|
|
73
|
+
const messagesContent = [
|
|
74
|
+
{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: request.prompt
|
|
77
|
+
? `${defaultPrompt}\n\nContext for transcription: ${request.prompt}`
|
|
78
|
+
: defaultPrompt
|
|
79
|
+
}
|
|
80
|
+
];
|
|
81
|
+
if (request.speakerReferences && request.speakerNames) {
|
|
82
|
+
for (let i = 0; i < request.speakerReferences.length; i++) {
|
|
83
|
+
const refFile = request.speakerReferences[i];
|
|
84
|
+
if (!refFile)
|
|
85
|
+
continue;
|
|
86
|
+
const name = request.speakerNames[i] || `Speaker ${i + 1}`;
|
|
87
|
+
const { data: refData } = await AudioUtils.load(refFile);
|
|
88
|
+
const refBase64 = Buffer.from(refData).toString("base64");
|
|
89
|
+
messagesContent.push({
|
|
90
|
+
type: "text",
|
|
91
|
+
text: `The following audio clip is the voice of ${name}:`
|
|
92
|
+
});
|
|
93
|
+
messagesContent.push({
|
|
94
|
+
type: "input_audio",
|
|
95
|
+
input_audio: {
|
|
96
|
+
data: refBase64,
|
|
97
|
+
format: refFile.endsWith(".wav") ? "wav" : "mp3"
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
messagesContent.push({
|
|
102
|
+
type: "text",
|
|
103
|
+
text: "Now, transcribe this main audio file using identified names:"
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
messagesContent.push({
|
|
107
|
+
type: "input_audio",
|
|
108
|
+
input_audio: {
|
|
109
|
+
data: base64Audio,
|
|
110
|
+
format: fileName.endsWith(".wav") ? "wav" : "mp3"
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
const body = {
|
|
114
|
+
model: actualModel,
|
|
115
|
+
messages: [
|
|
116
|
+
{
|
|
117
|
+
role: "user",
|
|
118
|
+
content: messagesContent
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
};
|
|
122
|
+
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
123
|
+
method: "POST",
|
|
124
|
+
headers: {
|
|
125
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
126
|
+
"Content-Type": "application/json",
|
|
127
|
+
},
|
|
128
|
+
body: JSON.stringify(body),
|
|
129
|
+
});
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
await handleOpenAIError(response, actualModel);
|
|
132
|
+
}
|
|
133
|
+
const json = await response.json();
|
|
134
|
+
const content = json.choices[0]?.message?.content || "";
|
|
135
|
+
let text = content;
|
|
136
|
+
let segments = [];
|
|
137
|
+
if (isDiarization) {
|
|
138
|
+
try {
|
|
139
|
+
const parsed = JSON.parse(content);
|
|
140
|
+
if (Array.isArray(parsed)) {
|
|
141
|
+
segments = parsed.map((s, i) => ({
|
|
142
|
+
id: i,
|
|
143
|
+
start: s.start || 0,
|
|
144
|
+
end: s.end || 0,
|
|
145
|
+
text: s.text || "",
|
|
146
|
+
speaker: s.speaker
|
|
147
|
+
}));
|
|
148
|
+
text = segments.map(s => `${s.speaker}: ${s.text}`).join("\n");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
text = content;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
text,
|
|
157
|
+
model,
|
|
158
|
+
duration: estimatedDuration || 0,
|
|
159
|
+
segments
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotent registration of the OpenAI provider.
|
|
3
|
+
* Automatically called by LLM.configure({ provider: 'openai' })
|
|
4
|
+
*/
|
|
1
5
|
export declare function registerOpenAIProvider(): void;
|
|
6
|
+
/**
|
|
7
|
+
* Alias for registerOpenAIProvider for internal use.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ensureOpenAIRegistered: typeof registerOpenAIProvider;
|
|
2
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/index.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,sBAAsB,SAcrC;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,+BAAyB,CAAC"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { providerRegistry } from "../registry.js";
|
|
2
2
|
import { OpenAIProvider } from "./OpenAIProvider.js";
|
|
3
|
+
let registered = false;
|
|
4
|
+
/**
|
|
5
|
+
* Idempotent registration of the OpenAI provider.
|
|
6
|
+
* Automatically called by LLM.configure({ provider: 'openai' })
|
|
7
|
+
*/
|
|
3
8
|
export function registerOpenAIProvider() {
|
|
9
|
+
if (registered)
|
|
10
|
+
return;
|
|
4
11
|
providerRegistry.register("openai", () => {
|
|
5
12
|
const apiKey = process.env.OPENAI_API_KEY;
|
|
6
13
|
if (!apiKey) {
|
|
@@ -8,4 +15,9 @@ export function registerOpenAIProvider() {
|
|
|
8
15
|
}
|
|
9
16
|
return new OpenAIProvider({ apiKey });
|
|
10
17
|
});
|
|
18
|
+
registered = true;
|
|
11
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Alias for registerOpenAIProvider for internal use.
|
|
22
|
+
*/
|
|
23
|
+
export const ensureOpenAIRegistered = registerOpenAIProvider;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export interface SchemaDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
schema: z.ZodType<any> | Record<string, any>;
|
|
5
|
+
description?: string;
|
|
6
|
+
strict?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class Schema {
|
|
9
|
+
readonly definition: SchemaDefinition;
|
|
10
|
+
constructor(definition: SchemaDefinition);
|
|
11
|
+
static fromZod(name: string, schema: z.ZodType<any>, options?: {
|
|
12
|
+
description?: string;
|
|
13
|
+
strict?: boolean;
|
|
14
|
+
}): Schema;
|
|
15
|
+
static fromJson(name: string, schema: Record<string, any>, options?: {
|
|
16
|
+
description?: string;
|
|
17
|
+
strict?: boolean;
|
|
18
|
+
}): Schema;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=Schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/schema/Schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,MAAM;aAEC,UAAU,EAAE,gBAAgB;gBAA5B,UAAU,EAAE,gBAAgB;IAG9C,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM;IASlH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM;CAQzH"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export class Schema {
|
|
2
|
+
definition;
|
|
3
|
+
constructor(definition) {
|
|
4
|
+
this.definition = definition;
|
|
5
|
+
}
|
|
6
|
+
static fromZod(name, schema, options) {
|
|
7
|
+
return new Schema({
|
|
8
|
+
name,
|
|
9
|
+
schema,
|
|
10
|
+
description: options?.description,
|
|
11
|
+
strict: options?.strict,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
static fromJson(name, schema, options) {
|
|
15
|
+
return new Schema({
|
|
16
|
+
name,
|
|
17
|
+
schema,
|
|
18
|
+
description: options?.description,
|
|
19
|
+
strict: options?.strict,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-json-schema.d.ts","sourceRoot":"","sources":["../../src/schema/to-json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,wBAAgB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAO9F"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
3
|
+
export function toJsonSchema(schema) {
|
|
4
|
+
// If it's a Zod schema, convert it
|
|
5
|
+
if (schema instanceof z.ZodType) {
|
|
6
|
+
return zodToJsonSchema(schema, { target: "openApi3" });
|
|
7
|
+
}
|
|
8
|
+
// If it's already a JSON schema object, return as is
|
|
9
|
+
return schema;
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TranscriptionResponse, TranscriptionSegment } from "../providers/Provider.js";
|
|
2
|
+
export declare class Transcription {
|
|
3
|
+
private readonly response;
|
|
4
|
+
constructor(response: TranscriptionResponse);
|
|
5
|
+
get text(): string;
|
|
6
|
+
get model(): string;
|
|
7
|
+
get segments(): TranscriptionSegment[];
|
|
8
|
+
get duration(): number | undefined;
|
|
9
|
+
toString(): string;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=Transcription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transcription.d.ts","sourceRoot":"","sources":["../../src/transcription/Transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,qBAAqB;IAE5D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,QAAQ,IAAI,oBAAoB,EAAE,CAErC;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED,QAAQ,IAAI,MAAM;CAGnB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class Transcription {
|
|
2
|
+
response;
|
|
3
|
+
constructor(response) {
|
|
4
|
+
this.response = response;
|
|
5
|
+
}
|
|
6
|
+
get text() {
|
|
7
|
+
return this.response.text;
|
|
8
|
+
}
|
|
9
|
+
get model() {
|
|
10
|
+
return this.response.model;
|
|
11
|
+
}
|
|
12
|
+
get segments() {
|
|
13
|
+
return this.response.segments || [];
|
|
14
|
+
}
|
|
15
|
+
get duration() {
|
|
16
|
+
return this.response.duration;
|
|
17
|
+
}
|
|
18
|
+
toString() {
|
|
19
|
+
return this.text;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Base64Data {
|
|
2
|
+
data: string;
|
|
3
|
+
mimeType: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class BinaryUtils {
|
|
6
|
+
/**
|
|
7
|
+
* Converts a URL (data:, http:, or local path) to a base64 string and mime type.
|
|
8
|
+
*/
|
|
9
|
+
static toBase64(url: string): Promise<Base64Data | null>;
|
|
10
|
+
private static guessMimeType;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=Binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Binary.d.ts","sourceRoot":"","sources":["../../src/utils/Binary.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB;;OAEG;WACU,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA4C9D,OAAO,CAAC,MAAM,CAAC,aAAa;CAgB7B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
export class BinaryUtils {
|
|
4
|
+
/**
|
|
5
|
+
* Converts a URL (data:, http:, or local path) to a base64 string and mime type.
|
|
6
|
+
*/
|
|
7
|
+
static async toBase64(url) {
|
|
8
|
+
if (url.startsWith("data:")) {
|
|
9
|
+
const match = url.match(/^data:([^;]+);base64,(.+)$/);
|
|
10
|
+
if (match && match[1] && match[2]) {
|
|
11
|
+
return {
|
|
12
|
+
mimeType: match[1],
|
|
13
|
+
data: match[2],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else if (url.startsWith("http")) {
|
|
18
|
+
try {
|
|
19
|
+
const response = await fetch(url);
|
|
20
|
+
if (!response.ok)
|
|
21
|
+
return null;
|
|
22
|
+
const buffer = await response.arrayBuffer();
|
|
23
|
+
const base64 = Buffer.from(buffer).toString("base64");
|
|
24
|
+
const mimeType = response.headers.get("content-type") || this.guessMimeType(url);
|
|
25
|
+
return {
|
|
26
|
+
mimeType,
|
|
27
|
+
data: base64,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
console.error("Error converting URL to base64:", e);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Assume local file path
|
|
37
|
+
try {
|
|
38
|
+
if (fs.existsSync(url)) {
|
|
39
|
+
const buffer = fs.readFileSync(url);
|
|
40
|
+
const base64 = buffer.toString("base64");
|
|
41
|
+
const mimeType = this.guessMimeType(url);
|
|
42
|
+
return {
|
|
43
|
+
mimeType,
|
|
44
|
+
data: base64,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
console.error("Error reading local file for base64:", e);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
static guessMimeType(filePath) {
|
|
56
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
57
|
+
switch (ext) {
|
|
58
|
+
case ".png": return "image/png";
|
|
59
|
+
case ".jpg":
|
|
60
|
+
case ".jpeg": return "image/jpeg";
|
|
61
|
+
case ".webp": return "image/webp";
|
|
62
|
+
case ".gif": return "image/gif";
|
|
63
|
+
case ".mp3": return "audio/mpeg";
|
|
64
|
+
case ".wav": return "audio/wav";
|
|
65
|
+
case ".ogg": return "audio/ogg";
|
|
66
|
+
case ".m4a": return "audio/mp4";
|
|
67
|
+
case ".pdf": return "application/pdf";
|
|
68
|
+
default: return "application/octet-stream";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileLoader.d.ts","sourceRoot":"","sources":["../../src/utils/FileLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"FileLoader.d.ts","sourceRoot":"","sources":["../../src/utils/FileLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA0CjD,qBAAa,UAAU;WACR,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA+C1D"}
|
package/dist/utils/FileLoader.js
CHANGED
|
@@ -13,6 +13,8 @@ const MIME_TYPES = {
|
|
|
13
13
|
".mp3": "audio/mpeg",
|
|
14
14
|
".json": "application/json",
|
|
15
15
|
".js": "text/javascript",
|
|
16
|
+
".mjs": "text/javascript",
|
|
17
|
+
".cjs": "text/javascript",
|
|
16
18
|
".ts": "text/typescript",
|
|
17
19
|
".rb": "text/x-ruby",
|
|
18
20
|
".py": "text/x-python",
|
|
@@ -23,9 +25,18 @@ const MIME_TYPES = {
|
|
|
23
25
|
".xml": "text/xml",
|
|
24
26
|
".yml": "text/yaml",
|
|
25
27
|
".yaml": "text/yaml",
|
|
28
|
+
".csv": "text/csv",
|
|
29
|
+
".go": "text/x-go",
|
|
30
|
+
".java": "text/x-java",
|
|
31
|
+
".c": "text/x-c",
|
|
32
|
+
".cpp": "text/x-c++",
|
|
33
|
+
".rs": "text/x-rust",
|
|
34
|
+
".swift": "text/x-swift",
|
|
35
|
+
".kt": "text/x-kotlin",
|
|
26
36
|
};
|
|
27
37
|
const TEXT_EXTENSIONS = new Set([
|
|
28
|
-
".json", ".js", ".ts", ".rb", ".py", ".txt", ".md", ".html", ".css", ".xml", ".yml", ".yaml", ".env"
|
|
38
|
+
".json", ".js", ".mjs", ".cjs", ".ts", ".rb", ".py", ".txt", ".md", ".html", ".css", ".xml", ".yml", ".yaml", ".env",
|
|
39
|
+
".csv", ".go", ".java", ".c", ".cpp", ".rs", ".swift", ".kt"
|
|
29
40
|
]);
|
|
30
41
|
export class FileLoader {
|
|
31
42
|
static async load(filePath) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface AudioFileData {
|
|
2
|
+
data: Uint8Array;
|
|
3
|
+
fileName: string;
|
|
4
|
+
duration?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class AudioUtils {
|
|
7
|
+
static load(filePath: string): Promise<AudioFileData>;
|
|
8
|
+
static estimateDuration(data: Uint8Array, fileName: string): number | undefined;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=audio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/utils/audio.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,UAAU;WACR,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAuB3D,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAkBhF"}
|