@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
package/dist/llm.js
CHANGED
|
@@ -1,14 +1,32 @@
|
|
|
1
1
|
import { Chat } from "./chat/Chat.js";
|
|
2
2
|
import { providerRegistry } from "./providers/registry.js";
|
|
3
|
-
import { ensureOpenAIRegistered } from "./providers/openai/
|
|
3
|
+
import { ensureOpenAIRegistered } from "./providers/openai/index.js";
|
|
4
|
+
import { registerGeminiProvider } from "./providers/gemini/index.js";
|
|
4
5
|
import { GeneratedImage } from "./image/GeneratedImage.js";
|
|
6
|
+
import { models } from "./models/ModelRegistry.js";
|
|
7
|
+
import { Transcription } from "./transcription/Transcription.js";
|
|
8
|
+
import { Moderation } from "./moderation/Moderation.js";
|
|
9
|
+
import { Embedding } from "./embedding/Embedding.js";
|
|
5
10
|
class LLMCore {
|
|
11
|
+
models = models;
|
|
6
12
|
provider;
|
|
13
|
+
defaultTranscriptionModelId;
|
|
14
|
+
defaultModerationModelId;
|
|
15
|
+
defaultEmbeddingModelId;
|
|
7
16
|
retry = {
|
|
8
17
|
attempts: 1,
|
|
9
18
|
delayMs: 0,
|
|
10
19
|
};
|
|
11
20
|
configure(config) {
|
|
21
|
+
if (config.defaultTranscriptionModel) {
|
|
22
|
+
this.defaultTranscriptionModelId = config.defaultTranscriptionModel;
|
|
23
|
+
}
|
|
24
|
+
if (config.defaultModerationModel) {
|
|
25
|
+
this.defaultModerationModelId = config.defaultModerationModel;
|
|
26
|
+
}
|
|
27
|
+
if (config.defaultEmbeddingModel) {
|
|
28
|
+
this.defaultEmbeddingModelId = config.defaultEmbeddingModel;
|
|
29
|
+
}
|
|
12
30
|
if (config.retry) {
|
|
13
31
|
this.retry = {
|
|
14
32
|
attempts: config.retry.attempts ?? 1,
|
|
@@ -19,42 +37,98 @@ class LLMCore {
|
|
|
19
37
|
if (config.provider === "openai") {
|
|
20
38
|
ensureOpenAIRegistered();
|
|
21
39
|
}
|
|
40
|
+
if (config.provider === "gemini") {
|
|
41
|
+
registerGeminiProvider();
|
|
42
|
+
}
|
|
22
43
|
this.provider = providerRegistry.resolve(config.provider);
|
|
23
44
|
}
|
|
24
45
|
else {
|
|
25
46
|
this.provider = config.provider;
|
|
26
47
|
}
|
|
27
48
|
}
|
|
28
|
-
|
|
49
|
+
ensureProviderSupport(method) {
|
|
29
50
|
if (!this.provider) {
|
|
30
51
|
throw new Error("LLM provider not configured");
|
|
31
52
|
}
|
|
32
|
-
|
|
53
|
+
if (!this.provider[method]) {
|
|
54
|
+
throw new Error(`Provider does not support ${method}`);
|
|
55
|
+
}
|
|
56
|
+
return this.provider;
|
|
33
57
|
}
|
|
34
|
-
|
|
58
|
+
chat(model, options) {
|
|
35
59
|
if (!this.provider) {
|
|
36
60
|
throw new Error("LLM provider not configured");
|
|
37
61
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
62
|
+
return new Chat(this.provider, model, options);
|
|
63
|
+
}
|
|
64
|
+
async listModels() {
|
|
65
|
+
const provider = this.ensureProviderSupport("listModels");
|
|
66
|
+
return provider.listModels();
|
|
42
67
|
}
|
|
43
68
|
async paint(prompt, options) {
|
|
44
|
-
|
|
45
|
-
|
|
69
|
+
const provider = this.ensureProviderSupport("paint");
|
|
70
|
+
const model = options?.model;
|
|
71
|
+
if (model && provider.capabilities && !provider.capabilities.supportsImageGeneration(model)) {
|
|
72
|
+
throw new Error(`Model ${model} does not support image generation.`);
|
|
46
73
|
}
|
|
47
|
-
|
|
48
|
-
throw new Error(`Provider does not support paint`);
|
|
49
|
-
}
|
|
50
|
-
const response = await this.provider.paint({
|
|
74
|
+
const response = await provider.paint({
|
|
51
75
|
prompt,
|
|
52
76
|
...options,
|
|
53
77
|
});
|
|
54
78
|
return new GeneratedImage(response);
|
|
55
79
|
}
|
|
80
|
+
async transcribe(file, options) {
|
|
81
|
+
const provider = this.ensureProviderSupport("transcribe");
|
|
82
|
+
const model = options?.model || this.defaultTranscriptionModelId;
|
|
83
|
+
if (model && provider.capabilities && !provider.capabilities.supportsTranscription(model)) {
|
|
84
|
+
throw new Error(`Model ${model} does not support transcription.`);
|
|
85
|
+
}
|
|
86
|
+
const response = await provider.transcribe({
|
|
87
|
+
file,
|
|
88
|
+
model,
|
|
89
|
+
...options,
|
|
90
|
+
});
|
|
91
|
+
return new Transcription(response);
|
|
92
|
+
}
|
|
93
|
+
get defaultTranscriptionModel() {
|
|
94
|
+
return this.defaultTranscriptionModelId;
|
|
95
|
+
}
|
|
96
|
+
get defaultModerationModel() {
|
|
97
|
+
return this.defaultModerationModelId;
|
|
98
|
+
}
|
|
99
|
+
get defaultEmbeddingModel() {
|
|
100
|
+
return this.defaultEmbeddingModelId;
|
|
101
|
+
}
|
|
56
102
|
getRetryConfig() {
|
|
57
103
|
return this.retry;
|
|
58
104
|
}
|
|
105
|
+
async moderate(input, options) {
|
|
106
|
+
const provider = this.ensureProviderSupport("moderate");
|
|
107
|
+
const model = options?.model || this.defaultModerationModelId;
|
|
108
|
+
if (model && provider.capabilities && !provider.capabilities.supportsModeration(model)) {
|
|
109
|
+
throw new Error(`Model ${model} does not support moderation.`);
|
|
110
|
+
}
|
|
111
|
+
const response = await provider.moderate({
|
|
112
|
+
input,
|
|
113
|
+
model,
|
|
114
|
+
...options,
|
|
115
|
+
});
|
|
116
|
+
return new Moderation(response);
|
|
117
|
+
}
|
|
118
|
+
async embed(input, options) {
|
|
119
|
+
const provider = this.ensureProviderSupport("embed");
|
|
120
|
+
const model = options?.model || this.defaultEmbeddingModelId;
|
|
121
|
+
const request = {
|
|
122
|
+
input,
|
|
123
|
+
model,
|
|
124
|
+
dimensions: options?.dimensions,
|
|
125
|
+
};
|
|
126
|
+
if (request.model && provider.capabilities && !provider.capabilities.supportsEmbeddings(request.model)) {
|
|
127
|
+
throw new Error(`Model ${request.model} does not support embeddings.`);
|
|
128
|
+
}
|
|
129
|
+
const response = await provider.embed(request);
|
|
130
|
+
return new Embedding(response);
|
|
131
|
+
}
|
|
59
132
|
}
|
|
133
|
+
export { Transcription, Moderation, Embedding };
|
|
60
134
|
export const LLM = new LLMCore();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ModelInfo } from "../providers/Provider.js";
|
|
2
|
+
export declare class ModelRegistry {
|
|
3
|
+
private models;
|
|
4
|
+
private static readonly API_URL;
|
|
5
|
+
/**
|
|
6
|
+
* Refresh model information from the Parsera API
|
|
7
|
+
*/
|
|
8
|
+
refresh(): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Find a model by ID
|
|
11
|
+
*/
|
|
12
|
+
find(id: string): ModelInfo | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* List all known models
|
|
15
|
+
*/
|
|
16
|
+
all(): ModelInfo[];
|
|
17
|
+
/**
|
|
18
|
+
* Filter models by provider
|
|
19
|
+
*/
|
|
20
|
+
byProvider(provider: string): ModelInfo[];
|
|
21
|
+
}
|
|
22
|
+
export declare const models: ModelRegistry;
|
|
23
|
+
//# sourceMappingURL=ModelRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelRegistry.d.ts","sourceRoot":"","sources":["../../src/models/ModelRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAEzE;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B9B;;OAEG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIvC;;OAEG;IACH,GAAG,IAAI,SAAS,EAAE;IAIlB;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;CAG1C;AAED,eAAO,MAAM,MAAM,eAAsB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export class ModelRegistry {
|
|
2
|
+
models = new Map();
|
|
3
|
+
static API_URL = "https://api.parsera.org/v1/llm-specs";
|
|
4
|
+
/**
|
|
5
|
+
* Refresh model information from the Parsera API
|
|
6
|
+
*/
|
|
7
|
+
async refresh() {
|
|
8
|
+
try {
|
|
9
|
+
const response = await fetch(ModelRegistry.API_URL);
|
|
10
|
+
if (!response.ok) {
|
|
11
|
+
throw new Error(`Failed to refresh models: ${response.statusText}`);
|
|
12
|
+
}
|
|
13
|
+
const specs = await response.json();
|
|
14
|
+
this.models.clear();
|
|
15
|
+
for (const spec of specs) {
|
|
16
|
+
this.models.set(spec.id, {
|
|
17
|
+
id: spec.id,
|
|
18
|
+
name: spec.name || spec.id,
|
|
19
|
+
provider: spec.provider,
|
|
20
|
+
family: spec.family || spec.provider,
|
|
21
|
+
context_window: spec.context_window,
|
|
22
|
+
max_output_tokens: spec.max_output_tokens,
|
|
23
|
+
modalities: spec.modalities || { input: ["text"], output: ["text"] },
|
|
24
|
+
capabilities: spec.capabilities || [],
|
|
25
|
+
pricing: spec.pricing || {},
|
|
26
|
+
metadata: spec.metadata || {}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error("Error refreshing model registry:", error);
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Find a model by ID
|
|
37
|
+
*/
|
|
38
|
+
find(id) {
|
|
39
|
+
return this.models.get(id);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* List all known models
|
|
43
|
+
*/
|
|
44
|
+
all() {
|
|
45
|
+
return Array.from(this.models.values());
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Filter models by provider
|
|
49
|
+
*/
|
|
50
|
+
byProvider(provider) {
|
|
51
|
+
return this.all().filter(m => m.provider === provider);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export const models = new ModelRegistry();
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ModerationResponse, ModerationResult } from "../providers/Provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* Represents the results of a moderation request.
|
|
4
|
+
* Can contain one or multiple results if multiple inputs were provided.
|
|
5
|
+
*/
|
|
6
|
+
export declare class Moderation implements Iterable<ModerationItem> {
|
|
7
|
+
private readonly response;
|
|
8
|
+
constructor(response: ModerationResponse);
|
|
9
|
+
get id(): string;
|
|
10
|
+
get model(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Returns all results as ModerationItem instances
|
|
13
|
+
*/
|
|
14
|
+
get results(): ModerationItem[];
|
|
15
|
+
/**
|
|
16
|
+
* Returns the number of results
|
|
17
|
+
*/
|
|
18
|
+
get length(): number;
|
|
19
|
+
/**
|
|
20
|
+
* Returns true if any of the results are flagged
|
|
21
|
+
*/
|
|
22
|
+
get flagged(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Aggregates all flagged categories across all results
|
|
25
|
+
*/
|
|
26
|
+
get flaggedCategories(): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Returns categories for the first result (most common case)
|
|
29
|
+
*/
|
|
30
|
+
get categories(): Record<string, boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Returns category scores for the first result
|
|
33
|
+
*/
|
|
34
|
+
get categoryScores(): Record<string, number>;
|
|
35
|
+
get flagged_categories(): string[];
|
|
36
|
+
get category_scores(): Record<string, number>;
|
|
37
|
+
isFlagged(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Makes the Moderation object iterable (yields results)
|
|
40
|
+
*/
|
|
41
|
+
[Symbol.iterator](): Iterator<ModerationItem>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Represents a single result within a moderation request
|
|
45
|
+
*/
|
|
46
|
+
export declare class ModerationItem {
|
|
47
|
+
readonly raw: ModerationResult;
|
|
48
|
+
constructor(raw: ModerationResult);
|
|
49
|
+
get flagged(): boolean;
|
|
50
|
+
get categories(): Record<string, boolean>;
|
|
51
|
+
get categoryScores(): Record<string, number>;
|
|
52
|
+
get flaggedCategories(): string[];
|
|
53
|
+
get flagged_categories(): string[];
|
|
54
|
+
get category_scores(): Record<string, number>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=Moderation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Moderation.d.ts","sourceRoot":"","sources":["../../src/moderation/Moderation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEhF;;;GAGG;AACH,qBAAa,UAAW,YAAW,QAAQ,CAAC,cAAc,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,kBAAkB;IAEzD,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,cAAc,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,EAAE,CAMhC;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAExC;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3C;IAGD,IAAI,kBAAkB,IAAI,MAAM,EAAE,CAAmC;IACrE,IAAI,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAgC;IAC7E,SAAS,IAAI,OAAO;IAEpB;;OAEG;IACF,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC;CAK/C;AAED;;GAEG;AACH,qBAAa,cAAc;aACG,GAAG,EAAE,gBAAgB;gBAArB,GAAG,EAAE,gBAAgB;IAEjD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAExC;IAED,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3C;IAED,IAAI,iBAAiB,IAAI,MAAM,EAAE,CAEhC;IAGD,IAAI,kBAAkB,IAAI,MAAM,EAAE,CAAmC;IACrE,IAAI,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAgC;CAC9E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents the results of a moderation request.
|
|
3
|
+
* Can contain one or multiple results if multiple inputs were provided.
|
|
4
|
+
*/
|
|
5
|
+
export class Moderation {
|
|
6
|
+
response;
|
|
7
|
+
constructor(response) {
|
|
8
|
+
this.response = response;
|
|
9
|
+
}
|
|
10
|
+
get id() {
|
|
11
|
+
return this.response.id;
|
|
12
|
+
}
|
|
13
|
+
get model() {
|
|
14
|
+
return this.response.model;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Returns all results as ModerationItem instances
|
|
18
|
+
*/
|
|
19
|
+
get results() {
|
|
20
|
+
return this.response.results.map((r) => new ModerationItem(r));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns the number of results
|
|
24
|
+
*/
|
|
25
|
+
get length() {
|
|
26
|
+
return this.response.results.length;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns true if any of the results are flagged
|
|
30
|
+
*/
|
|
31
|
+
get flagged() {
|
|
32
|
+
return this.response.results.some((r) => r.flagged);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Aggregates all flagged categories across all results
|
|
36
|
+
*/
|
|
37
|
+
get flaggedCategories() {
|
|
38
|
+
const all = new Set();
|
|
39
|
+
for (const item of this.results) {
|
|
40
|
+
item.flaggedCategories.forEach((cat) => all.add(cat));
|
|
41
|
+
}
|
|
42
|
+
return Array.from(all);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns categories for the first result (most common case)
|
|
46
|
+
*/
|
|
47
|
+
get categories() {
|
|
48
|
+
return this.results[0]?.categories || {};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns category scores for the first result
|
|
52
|
+
*/
|
|
53
|
+
get categoryScores() {
|
|
54
|
+
return this.results[0]?.categoryScores || {};
|
|
55
|
+
}
|
|
56
|
+
// --- Ruby-compatible aliases ---
|
|
57
|
+
get flagged_categories() { return this.flaggedCategories; }
|
|
58
|
+
get category_scores() { return this.categoryScores; }
|
|
59
|
+
isFlagged() { return this.flagged; }
|
|
60
|
+
/**
|
|
61
|
+
* Makes the Moderation object iterable (yields results)
|
|
62
|
+
*/
|
|
63
|
+
*[Symbol.iterator]() {
|
|
64
|
+
for (const item of this.results) {
|
|
65
|
+
yield item;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Represents a single result within a moderation request
|
|
71
|
+
*/
|
|
72
|
+
export class ModerationItem {
|
|
73
|
+
raw;
|
|
74
|
+
constructor(raw) {
|
|
75
|
+
this.raw = raw;
|
|
76
|
+
}
|
|
77
|
+
get flagged() {
|
|
78
|
+
return this.raw.flagged;
|
|
79
|
+
}
|
|
80
|
+
get categories() {
|
|
81
|
+
return this.raw.categories;
|
|
82
|
+
}
|
|
83
|
+
get categoryScores() {
|
|
84
|
+
return this.raw.category_scores;
|
|
85
|
+
}
|
|
86
|
+
get flaggedCategories() {
|
|
87
|
+
return Object.keys(this.categories).filter((cat) => this.categories[cat]);
|
|
88
|
+
}
|
|
89
|
+
// --- Ruby-compatible aliases ---
|
|
90
|
+
get flagged_categories() { return this.flaggedCategories; }
|
|
91
|
+
get category_scores() { return this.categoryScores; }
|
|
92
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface EmbeddingRequest {
|
|
2
|
+
input: string | string[];
|
|
3
|
+
model?: string;
|
|
4
|
+
dimensions?: number;
|
|
5
|
+
user?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface EmbeddingVector {
|
|
8
|
+
embedding: number[];
|
|
9
|
+
index: number;
|
|
10
|
+
}
|
|
11
|
+
export interface EmbeddingResponse {
|
|
12
|
+
vectors: number[][];
|
|
13
|
+
model: string;
|
|
14
|
+
input_tokens: number;
|
|
15
|
+
dimensions: number;
|
|
16
|
+
}
|
|
17
|
+
export interface EmbeddingProvider {
|
|
18
|
+
embed(request: EmbeddingRequest): Promise<EmbeddingResponse>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=Embedding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Embedding.d.ts","sourceRoot":"","sources":["../../src/providers/Embedding.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC9D"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { Message } from "../chat/Message.js";
|
|
2
2
|
import { Tool, ToolCall } from "../chat/Tool.js";
|
|
3
|
+
import { EmbeddingRequest, EmbeddingResponse } from "./Embedding.js";
|
|
3
4
|
export interface ChatRequest {
|
|
4
5
|
model: string;
|
|
5
6
|
messages: Message[];
|
|
6
7
|
tools?: Tool[];
|
|
7
8
|
temperature?: number;
|
|
8
9
|
max_tokens?: number;
|
|
10
|
+
response_format?: any;
|
|
11
|
+
headers?: Record<string, string>;
|
|
9
12
|
}
|
|
10
13
|
export interface ChatChunk {
|
|
11
14
|
content: string;
|
|
@@ -23,10 +26,14 @@ export interface ChatResponse {
|
|
|
23
26
|
usage?: Usage;
|
|
24
27
|
}
|
|
25
28
|
export interface ProviderCapabilities {
|
|
26
|
-
supportsVision
|
|
27
|
-
supportsTools
|
|
28
|
-
supportsStructuredOutput
|
|
29
|
-
|
|
29
|
+
supportsVision(modelId: string): boolean;
|
|
30
|
+
supportsTools(modelId: string): boolean;
|
|
31
|
+
supportsStructuredOutput(modelId: string): boolean;
|
|
32
|
+
supportsEmbeddings(modelId: string): boolean;
|
|
33
|
+
supportsImageGeneration(modelId: string): boolean;
|
|
34
|
+
supportsTranscription(modelId: string): boolean;
|
|
35
|
+
supportsModeration(modelId: string): boolean;
|
|
36
|
+
getContextWindow(modelId: string): number | null;
|
|
30
37
|
}
|
|
31
38
|
export interface ModelInfo {
|
|
32
39
|
id: string;
|
|
@@ -56,11 +63,50 @@ export interface ImageResponse {
|
|
|
56
63
|
mime_type?: string;
|
|
57
64
|
revised_prompt?: string;
|
|
58
65
|
}
|
|
66
|
+
export interface TranscriptionRequest {
|
|
67
|
+
model?: string;
|
|
68
|
+
file: string;
|
|
69
|
+
prompt?: string;
|
|
70
|
+
language?: string;
|
|
71
|
+
speakerNames?: string[];
|
|
72
|
+
speakerReferences?: string[];
|
|
73
|
+
}
|
|
74
|
+
export interface TranscriptionSegment {
|
|
75
|
+
id: number;
|
|
76
|
+
start: number;
|
|
77
|
+
end: number;
|
|
78
|
+
text: string;
|
|
79
|
+
speaker?: string;
|
|
80
|
+
[key: string]: any;
|
|
81
|
+
}
|
|
82
|
+
export interface TranscriptionResponse {
|
|
83
|
+
text: string;
|
|
84
|
+
model: string;
|
|
85
|
+
duration?: number;
|
|
86
|
+
segments?: TranscriptionSegment[];
|
|
87
|
+
}
|
|
88
|
+
export interface ModerationRequest {
|
|
89
|
+
input: string | string[];
|
|
90
|
+
model?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface ModerationResult {
|
|
93
|
+
flagged: boolean;
|
|
94
|
+
categories: Record<string, boolean>;
|
|
95
|
+
category_scores: Record<string, number>;
|
|
96
|
+
}
|
|
97
|
+
export interface ModerationResponse {
|
|
98
|
+
id: string;
|
|
99
|
+
model: string;
|
|
100
|
+
results: ModerationResult[];
|
|
101
|
+
}
|
|
59
102
|
export interface Provider {
|
|
60
103
|
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
61
104
|
stream?(request: ChatRequest): AsyncIterable<ChatChunk>;
|
|
62
105
|
listModels?(): Promise<ModelInfo[]>;
|
|
63
106
|
paint?(request: ImageRequest): Promise<ImageResponse>;
|
|
107
|
+
transcribe?(request: TranscriptionRequest): Promise<TranscriptionResponse>;
|
|
108
|
+
moderate?(request: ModerationRequest): Promise<ModerationResponse>;
|
|
109
|
+
embed?(request: EmbeddingRequest): Promise<EmbeddingResponse>;
|
|
64
110
|
capabilities?: ProviderCapabilities;
|
|
65
111
|
}
|
|
66
112
|
//# sourceMappingURL=Provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../src/providers/Provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../src/providers/Provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare class Capabilities {
|
|
2
|
+
static getContextWindow(modelId: string): number | null;
|
|
3
|
+
static getMaxOutputTokens(modelId: string): number | null;
|
|
4
|
+
static supportsVision(modelId: string): boolean;
|
|
5
|
+
static supportsTools(modelId: string): boolean;
|
|
6
|
+
static supportsStructuredOutput(modelId: string): boolean;
|
|
7
|
+
static supportsJsonMode(modelId: string): boolean;
|
|
8
|
+
static supportsEmbeddings(modelId: string): boolean;
|
|
9
|
+
static supportsImageGeneration(modelId: string): boolean;
|
|
10
|
+
static supportsTranscription(modelId: string): boolean;
|
|
11
|
+
static supportsModeration(modelId: string): boolean;
|
|
12
|
+
static normalizeTemperature(temperature: number | undefined, _modelId: string): number | undefined | null;
|
|
13
|
+
static getFamily(modelId: string): string;
|
|
14
|
+
static getModalities(modelId: string): {
|
|
15
|
+
input: string[];
|
|
16
|
+
output: string[];
|
|
17
|
+
};
|
|
18
|
+
static getCapabilities(modelId: string): string[];
|
|
19
|
+
static getPricing(modelId: string): {
|
|
20
|
+
text_tokens: {
|
|
21
|
+
standard: {
|
|
22
|
+
input_per_million: number;
|
|
23
|
+
output_per_million: number;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
static formatDisplayName(modelId: string): string;
|
|
28
|
+
private static normalizeModelId;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=Capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Capabilities.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAoBvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiBzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQ/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQ9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKzD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAIzG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAWzC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAY5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAUjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;;;;;;;;IA0BjC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIjD,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAGhC"}
|