@luanpoppe/ai 1.1.4 → 1.1.6
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/.env.example +13 -1
- package/README.md +795 -0
- package/dist/@types/embedding-model-names.d.ts +11 -0
- package/dist/@types/embedding-model-names.d.ts.map +1 -0
- package/dist/@types/embedding-model-names.js +3 -0
- package/dist/@types/embedding-model-names.js.map +1 -0
- package/dist/@types/model-names.d.ts +21 -5
- package/dist/@types/model-names.d.ts.map +1 -1
- package/dist/@types/openrouter-provider.d.ts +25 -0
- package/dist/@types/openrouter-provider.d.ts.map +1 -0
- package/dist/@types/openrouter-provider.js +3 -0
- package/dist/@types/openrouter-provider.js.map +1 -0
- package/dist/ai.d.ts +7 -0
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +56 -5
- package/dist/ai.js.map +1 -1
- package/dist/audio/gemini-transcription.d.ts +4 -0
- package/dist/audio/gemini-transcription.d.ts.map +1 -0
- package/dist/audio/gemini-transcription.js +37 -0
- package/dist/audio/gemini-transcription.js.map +1 -0
- package/dist/audio/index.d.ts +33 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +43 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/audio/openrouter-client.d.ts +2 -0
- package/dist/audio/openrouter-client.d.ts.map +1 -0
- package/dist/audio/openrouter-client.js +7 -0
- package/dist/audio/openrouter-client.js.map +1 -0
- package/dist/audio/speech-openai.d.ts +4 -0
- package/dist/audio/speech-openai.d.ts.map +1 -0
- package/dist/audio/speech-openai.js +65 -0
- package/dist/audio/speech-openai.js.map +1 -0
- package/dist/audio/speech-openrouter.d.ts +4 -0
- package/dist/audio/speech-openrouter.d.ts.map +1 -0
- package/dist/audio/speech-openrouter.js +89 -0
- package/dist/audio/speech-openrouter.js.map +1 -0
- package/dist/audio/transcription-openai.d.ts +11 -0
- package/dist/audio/transcription-openai.d.ts.map +1 -0
- package/dist/audio/transcription-openai.js +204 -0
- package/dist/audio/transcription-openai.js.map +1 -0
- package/dist/audio/transcription-openrouter.d.ts +4 -0
- package/dist/audio/transcription-openrouter.d.ts.map +1 -0
- package/dist/audio/transcription-openrouter.js +44 -0
- package/dist/audio/transcription-openrouter.js.map +1 -0
- package/dist/audio/types.d.ts +92 -0
- package/dist/audio/types.d.ts.map +1 -0
- package/dist/audio/types.js +6 -0
- package/dist/audio/types.js.map +1 -0
- package/dist/audio/utils.d.ts +5 -0
- package/dist/audio/utils.d.ts.map +1 -0
- package/dist/audio/utils.js +25 -0
- package/dist/audio/utils.js.map +1 -0
- package/dist/embeddings/embed-gemini.d.ts +3 -0
- package/dist/embeddings/embed-gemini.d.ts.map +1 -0
- package/dist/embeddings/embed-gemini.js +38 -0
- package/dist/embeddings/embed-gemini.js.map +1 -0
- package/dist/embeddings/embed-openai.d.ts +3 -0
- package/dist/embeddings/embed-openai.d.ts.map +1 -0
- package/dist/embeddings/embed-openai.js +44 -0
- package/dist/embeddings/embed-openai.js.map +1 -0
- package/dist/embeddings/embed-openrouter.d.ts +3 -0
- package/dist/embeddings/embed-openrouter.d.ts.map +1 -0
- package/dist/embeddings/embed-openrouter.js +47 -0
- package/dist/embeddings/embed-openrouter.js.map +1 -0
- package/dist/embeddings/index.d.ts +19 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +36 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/route.d.ts +12 -0
- package/dist/embeddings/route.d.ts.map +1 -0
- package/dist/embeddings/route.js +42 -0
- package/dist/embeddings/route.js.map +1 -0
- package/dist/embeddings/types.d.ts +37 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +6 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/embeddings/utils.d.ts +6 -0
- package/dist/embeddings/utils.d.ts.map +1 -0
- package/dist/embeddings/utils.js +25 -0
- package/dist/embeddings/utils.js.map +1 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/langchain/audio-transcription.d.ts +8 -13
- package/dist/langchain/audio-transcription.d.ts.map +1 -1
- package/dist/langchain/audio-transcription.js +8 -92
- package/dist/langchain/audio-transcription.js.map +1 -1
- package/dist/langchain/messages.d.ts +6 -1
- package/dist/langchain/messages.d.ts.map +1 -1
- package/dist/langchain/messages.js +35 -7
- package/dist/langchain/messages.js.map +1 -1
- package/dist/langchain/models.d.ts +38 -0
- package/dist/langchain/models.d.ts.map +1 -1
- package/dist/langchain/models.js +63 -4
- package/dist/langchain/models.js.map +1 -1
- package/dist/langchain/structured-output.d.ts +9 -0
- package/dist/langchain/structured-output.d.ts.map +1 -0
- package/dist/langchain/structured-output.js +70 -0
- package/dist/langchain/structured-output.js.map +1 -0
- package/dist/langchain/tools.d.ts +1 -1
- package/dist/utils/openrouter-client.d.ts +4 -0
- package/dist/utils/openrouter-client.d.ts.map +1 -0
- package/dist/utils/openrouter-client.js +16 -0
- package/dist/utils/openrouter-client.js.map +1 -0
- package/docs/LANGCHAIN_WHISPER_WINDOWS_BUG.md +2 -0
- package/package.json +4 -4
- package/src/@types/embedding-model-names.ts +36 -0
- package/src/@types/model-names.ts +104 -6
- package/src/@types/openrouter-provider.ts +27 -0
- package/src/ai.ts +89 -10
- package/src/audio/gemini-transcription.ts +47 -0
- package/src/audio/index.ts +101 -0
- package/src/audio/openrouter-client.ts +4 -0
- package/src/audio/speech-openai.ts +79 -0
- package/src/audio/speech-openrouter.ts +121 -0
- package/src/audio/transcription-openai.ts +259 -0
- package/src/audio/transcription-openrouter.ts +59 -0
- package/src/audio/types.ts +127 -0
- package/src/audio/utils.ts +20 -0
- package/src/embeddings/embed-gemini.ts +54 -0
- package/src/embeddings/embed-openai.ts +53 -0
- package/src/embeddings/embed-openrouter.ts +64 -0
- package/src/embeddings/index.ts +83 -0
- package/src/embeddings/route.ts +62 -0
- package/src/embeddings/types.ts +53 -0
- package/src/embeddings/utils.ts +21 -0
- package/src/index.ts +52 -5
- package/src/langchain/audio-transcription.ts +19 -90
- package/src/langchain/messages.ts +84 -12
- package/src/langchain/models.ts +130 -3
- package/src/langchain/structured-output.ts +77 -0
- package/src/utils/openrouter-client.ts +10 -0
- package/tests/e2e/README.md +53 -0
- package/tests/e2e/ai-audio-multiprovider.test.ts +118 -0
- package/tests/e2e/ai-deepseek-structured-output.test.ts +133 -0
- package/tests/e2e/ai-embeddings.test.ts +87 -0
- package/tests/e2e/ai-local-models.test.ts +65 -0
- package/tests/unit/audio/index.test.ts +17 -0
- package/tests/unit/audio/speech-openai.test.ts +74 -0
- package/tests/unit/audio/speech-openrouter.test.ts +88 -0
- package/tests/unit/audio/transcription-openai.test.ts +130 -0
- package/tests/unit/audio/transcription-openrouter.test.ts +82 -0
- package/tests/unit/embeddings/embed-gemini.test.ts +52 -0
- package/tests/unit/embeddings/embed-openai.test.ts +68 -0
- package/tests/unit/embeddings/embed-openrouter.test.ts +62 -0
- package/tests/unit/embeddings/index.test.ts +55 -0
- package/tests/unit/index.test.ts +209 -0
- package/tests/unit/langchain/messages.test.ts +37 -0
- package/tests/unit/langchain/models.test.ts +223 -1
- package/tests/unit/langchain/structured-output.test.ts +49 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/langchain/messages.ts"],"names":[],"mappings":";;;AAAA,yCAAmE;AACnE,sDAAkD;AAClD,sDAAkD;AAGlD
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/langchain/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,56 @@
|
|
|
1
1
|
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
|
|
2
|
+
import { ChatOllama } from "@langchain/ollama";
|
|
2
3
|
import { ChatOpenAI } from "@langchain/openai";
|
|
4
|
+
import type { OpenRouterProviderPreferences } from "../@types/openrouter-provider";
|
|
5
|
+
export declare const DEFAULT_OLLAMA_BASE_URL = "http://127.0.0.1:11434";
|
|
6
|
+
export declare const DEFAULT_LOCAL_API_KEY = "not-needed";
|
|
7
|
+
export type { OpenRouterMaxPrice, OpenRouterProviderPreferences, OpenRouterProviderSort, } from "../@types/openrouter-provider";
|
|
3
8
|
/** Nível de esforço de raciocínio para modelos OpenAI (o1, gpt-5, etc.). Valores: "low" | "medium" | "high" */
|
|
4
9
|
export type ReasoningEffort = "low" | "medium" | "high";
|
|
10
|
+
export type OllamaModelConfig = {
|
|
11
|
+
model: string;
|
|
12
|
+
baseUrl?: string | undefined;
|
|
13
|
+
maxTokens?: number | undefined;
|
|
14
|
+
temperature?: number | undefined;
|
|
15
|
+
numCtx?: number | undefined;
|
|
16
|
+
};
|
|
17
|
+
export type OpenAICompatibleModelConfig = {
|
|
18
|
+
model: string;
|
|
19
|
+
baseURL: string;
|
|
20
|
+
apiKey?: string | undefined;
|
|
21
|
+
maxTokens?: number | undefined;
|
|
22
|
+
temperature?: number | undefined;
|
|
23
|
+
};
|
|
5
24
|
export type LLMModelConfig = {
|
|
6
25
|
model: string;
|
|
7
26
|
apiKey?: string | undefined;
|
|
27
|
+
/** Override da URL do servidor (Ollama nativo ou OpenAI-compatible local) */
|
|
28
|
+
baseUrl?: string | undefined;
|
|
8
29
|
maxTokens?: number | undefined;
|
|
9
30
|
temperature?: number | undefined;
|
|
31
|
+
/** Tamanho do contexto (Ollama nativo, `num_ctx`) */
|
|
32
|
+
numCtx?: number | undefined;
|
|
10
33
|
/** Nível de esforço de raciocínio (modelos OpenAI: o1, gpt-5, etc.) */
|
|
11
34
|
reasoningEffort?: ReasoningEffort | undefined;
|
|
35
|
+
/** Preferências de roteamento de providers do OpenRouter */
|
|
36
|
+
openRouterProvider?: OpenRouterProviderPreferences | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Se true, não aplica `only: ["deepseek"]` em modelos `deepseek/*` via OpenRouter.
|
|
39
|
+
* Use para aceitar o roteamento padrão do OpenRouter (todos os providers).
|
|
40
|
+
*/
|
|
41
|
+
openRouterAllowAllProviders?: boolean | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Força `response_format: { type: "json_object" }` no OpenRouter (ex.: DeepSeek).
|
|
44
|
+
* Uso interno via `callStructuredOutput`.
|
|
45
|
+
*/
|
|
46
|
+
openRouterForceJsonObject?: boolean | undefined;
|
|
12
47
|
};
|
|
48
|
+
export declare function resolveOpenRouterProvider(model: string, config: Pick<LLMModelConfig, "openRouterProvider" | "openRouterAllowAllProviders">): OpenRouterProviderPreferences | undefined;
|
|
13
49
|
export declare class AIModels {
|
|
14
50
|
static gpt(params: LLMModelConfig): ChatOpenAI<import("@langchain/openai").ChatOpenAICallOptions>;
|
|
15
51
|
static gemini(params: LLMModelConfig): ChatGoogleGenerativeAI;
|
|
16
52
|
static openrouter(params: LLMModelConfig): ChatOpenAI<import("@langchain/openai").ChatOpenAICallOptions>;
|
|
53
|
+
static ollama(params: OllamaModelConfig): ChatOllama;
|
|
54
|
+
static openaiCompatible(params: OpenAICompatibleModelConfig): ChatOpenAI<import("@langchain/openai").ChatOpenAICallOptions>;
|
|
17
55
|
}
|
|
18
56
|
//# sourceMappingURL=models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/langchain/models.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAEvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/langchain/models.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAEvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAwB,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAEnF,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAEhE,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,YAAY,EACV,kBAAkB,EAClB,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AAEvC,+GAA+G;AAC/G,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,uEAAuE;IACvE,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC9C,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,6BAA6B,GAAG,SAAS,CAAC;IAC/D;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjD,CAAC;AAMF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,IAAI,CACV,cAAc,EACd,oBAAoB,GAAG,6BAA6B,CACrD,GACA,6BAA6B,GAAG,SAAS,CAc3C;AAED,qBAAa,QAAQ;IACnB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc;IAsBjC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc;IAmBpC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc;IA+CxC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB;IAevC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,2BAA2B;CAsB5D"}
|
package/dist/langchain/models.js
CHANGED
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AIModels = void 0;
|
|
3
|
+
exports.AIModels = exports.DEFAULT_LOCAL_API_KEY = exports.DEFAULT_OLLAMA_BASE_URL = void 0;
|
|
4
|
+
exports.resolveOpenRouterProvider = resolveOpenRouterProvider;
|
|
4
5
|
const google_genai_1 = require("@langchain/google-genai");
|
|
6
|
+
const ollama_1 = require("@langchain/ollama");
|
|
5
7
|
const openai_1 = require("@langchain/openai");
|
|
8
|
+
exports.DEFAULT_OLLAMA_BASE_URL = "http://127.0.0.1:11434";
|
|
9
|
+
exports.DEFAULT_LOCAL_API_KEY = "not-needed";
|
|
10
|
+
const DEEPSEEK_OPENROUTER_PROVIDER = {
|
|
11
|
+
only: ["deepseek"],
|
|
12
|
+
};
|
|
13
|
+
function resolveOpenRouterProvider(model, config) {
|
|
14
|
+
if (config.openRouterProvider !== undefined) {
|
|
15
|
+
return config.openRouterProvider;
|
|
16
|
+
}
|
|
17
|
+
if (config.openRouterAllowAllProviders === true) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
if (model.startsWith("deepseek/")) {
|
|
21
|
+
return DEEPSEEK_OPENROUTER_PROVIDER;
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
6
25
|
class AIModels {
|
|
7
26
|
static gpt(params) {
|
|
8
27
|
const { model, apiKey, maxTokens, temperature, reasoningEffort } = params;
|
|
@@ -39,7 +58,7 @@ class AIModels {
|
|
|
39
58
|
return new google_genai_1.ChatGoogleGenerativeAI(options);
|
|
40
59
|
}
|
|
41
60
|
static openrouter(params) {
|
|
42
|
-
const { apiKey, maxTokens, model, temperature, reasoningEffort } = params;
|
|
61
|
+
const { apiKey, maxTokens, model, temperature, reasoningEffort, openRouterProvider, openRouterAllowAllProviders, openRouterForceJsonObject, } = params;
|
|
43
62
|
if (!apiKey)
|
|
44
63
|
throw new Error("OpenRouter API key is not passed in the model parameters");
|
|
45
64
|
const options = {
|
|
@@ -53,14 +72,54 @@ class AIModels {
|
|
|
53
72
|
options.maxTokens = maxTokens;
|
|
54
73
|
if (temperature)
|
|
55
74
|
options.temperature = temperature;
|
|
56
|
-
|
|
75
|
+
const provider = resolveOpenRouterProvider(model, {
|
|
76
|
+
openRouterProvider,
|
|
77
|
+
openRouterAllowAllProviders,
|
|
78
|
+
});
|
|
79
|
+
if (reasoningEffort || provider || openRouterForceJsonObject) {
|
|
57
80
|
options.modelKwargs = {
|
|
58
81
|
...(options.modelKwargs ?? {}),
|
|
59
|
-
reasoning_effort: reasoningEffort,
|
|
82
|
+
...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),
|
|
83
|
+
...(provider ? { provider } : {}),
|
|
84
|
+
...(openRouterForceJsonObject
|
|
85
|
+
? { response_format: { type: "json_object" } }
|
|
86
|
+
: {}),
|
|
60
87
|
};
|
|
61
88
|
}
|
|
62
89
|
return new openai_1.ChatOpenAI(options);
|
|
63
90
|
}
|
|
91
|
+
static ollama(params) {
|
|
92
|
+
const { model, baseUrl, maxTokens, temperature, numCtx } = params;
|
|
93
|
+
const options = {
|
|
94
|
+
model,
|
|
95
|
+
baseUrl: baseUrl ?? exports.DEFAULT_OLLAMA_BASE_URL,
|
|
96
|
+
};
|
|
97
|
+
if (temperature !== undefined)
|
|
98
|
+
options.temperature = temperature;
|
|
99
|
+
if (numCtx !== undefined)
|
|
100
|
+
options.numCtx = numCtx;
|
|
101
|
+
if (maxTokens !== undefined)
|
|
102
|
+
options.numPredict = maxTokens;
|
|
103
|
+
return new ollama_1.ChatOllama(options);
|
|
104
|
+
}
|
|
105
|
+
static openaiCompatible(params) {
|
|
106
|
+
const { model, baseURL, apiKey, maxTokens, temperature } = params;
|
|
107
|
+
if (!baseURL) {
|
|
108
|
+
throw new Error("baseURL é obrigatório para servidores OpenAI-compatible (LM Studio, Ollama /v1, vLLM, etc.).");
|
|
109
|
+
}
|
|
110
|
+
const options = {
|
|
111
|
+
model,
|
|
112
|
+
apiKey: apiKey ?? exports.DEFAULT_LOCAL_API_KEY,
|
|
113
|
+
configuration: {
|
|
114
|
+
baseURL,
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
if (maxTokens)
|
|
118
|
+
options.maxTokens = maxTokens;
|
|
119
|
+
if (temperature !== undefined)
|
|
120
|
+
options.temperature = temperature;
|
|
121
|
+
return new openai_1.ChatOpenAI(options);
|
|
122
|
+
}
|
|
64
123
|
}
|
|
65
124
|
exports.AIModels = AIModels;
|
|
66
125
|
//# sourceMappingURL=models.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/langchain/models.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/langchain/models.ts"],"names":[],"mappings":";;;AAkEA,8DAoBC;AAtFD,0DAGiC;AACjC,8CAAqE;AACrE,8CAAiE;AAGpD,QAAA,uBAAuB,GAAG,wBAAwB,CAAC;AAEnD,QAAA,qBAAqB,GAAG,YAAY,CAAC;AAoDlD,MAAM,4BAA4B,GAAkC;IAClE,IAAI,EAAE,CAAC,UAAU,CAAC;CACnB,CAAC;AAEF,SAAgB,yBAAyB,CACvC,KAAa,EACb,MAGC;IAED,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAI,MAAM,CAAC,2BAA2B,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,4BAA4B,CAAC;IACtC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAa,QAAQ;IACnB,MAAM,CAAC,GAAG,CAAC,MAAsB;QAC/B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;QAC1E,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAE1E,MAAM,OAAO,GAAqB;YAChC,KAAK;YACL,MAAM;SACP,CAAC;QAEF,IAAI,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7C,IAAI,WAAW;YAAE,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QACnD,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,WAAW,GAAG;gBACpB,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;gBAC9B,gBAAgB,EAAE,eAAe;aAClC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,mBAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAsB;QAClC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAEzD,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QAEJ,MAAM,OAAO,GAAgC;YAC3C,KAAK;YACL,MAAM;SACP,CAAC;QAEF,IAAI,SAAS;YAAE,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;QACnD,IAAI,WAAW;YAAE,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QAEnD,OAAO,IAAI,qCAAsB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAsB;QACtC,MAAM,EACJ,MAAM,EACN,SAAS,EACT,KAAK,EACL,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,2BAA2B,EAC3B,yBAAyB,GAC1B,GAAG,MAAM,CAAC;QAEX,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;QAEJ,MAAM,OAAO,GAAqB;YAChC,KAAK;YACL,MAAM;YACN,aAAa,EAAE;gBACb,OAAO,EAAE,8BAA8B;aACxC;SACF,CAAC;QAEF,IAAI,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7C,IAAI,WAAW;YAAE,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QAEnD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,KAAK,EAAE;YAChD,kBAAkB;YAClB,2BAA2B;SAC5B,CAAC,CAAC;QAEH,IAAI,eAAe,IAAI,QAAQ,IAAI,yBAAyB,EAAE,CAAC;YAC7D,OAAO,CAAC,WAAW,GAAG;gBACpB,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;gBAC9B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,yBAAyB;oBAC3B,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,mBAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAyB;QACrC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAElE,MAAM,OAAO,GAAoB;YAC/B,KAAK;YACL,OAAO,EAAE,OAAO,IAAI,+BAAuB;SAC5C,CAAC;QAEF,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QACjE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QAClD,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5D,OAAO,IAAI,mBAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,MAAmC;QACzD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAElE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAqB;YAChC,KAAK;YACL,MAAM,EAAE,MAAM,IAAI,6BAAqB;YACvC,aAAa,EAAE;gBACb,OAAO;aACR;SACF,CAAC;QAEF,IAAI,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7C,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QAEjE,OAAO,IAAI,mBAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;CACF;AA9HD,4BA8HC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BaseMessage } from "langchain";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
/** Modelos DeepSeek (direto ou via OpenRouter) não aceitam `json_schema`; apenas `json_object`. */
|
|
4
|
+
export declare function isDeepSeekJsonObjectOnlyModel(aiModel: string): boolean;
|
|
5
|
+
export declare function buildJsonObjectSystemAppend(schema: z.ZodSchema): string;
|
|
6
|
+
export declare function mergeSystemPromptWithJsonSchema(systemPrompt: string | undefined, schema: z.ZodSchema): string;
|
|
7
|
+
/** Extrai e faz parse de JSON na última mensagem do assistente (suporta fences ```json). */
|
|
8
|
+
export declare function parseJsonFromAssistantMessages(messages: BaseMessage[]): unknown;
|
|
9
|
+
//# sourceMappingURL=structured-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../../src/langchain/structured-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,mGAAmG;AACnG,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAItE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,GAAG,MAAM,CAQvE;AAED,wBAAgB,+BAA+B,CAC7C,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,MAAM,EAAE,CAAC,CAAC,SAAS,GAClB,MAAM,CAIR;AAkBD,4FAA4F;AAC5F,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CA4BT"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isDeepSeekJsonObjectOnlyModel = isDeepSeekJsonObjectOnlyModel;
|
|
7
|
+
exports.buildJsonObjectSystemAppend = buildJsonObjectSystemAppend;
|
|
8
|
+
exports.mergeSystemPromptWithJsonSchema = mergeSystemPromptWithJsonSchema;
|
|
9
|
+
exports.parseJsonFromAssistantMessages = parseJsonFromAssistantMessages;
|
|
10
|
+
const zod_1 = __importDefault(require("zod"));
|
|
11
|
+
/** Modelos DeepSeek (direto ou via OpenRouter) não aceitam `json_schema`; apenas `json_object`. */
|
|
12
|
+
function isDeepSeekJsonObjectOnlyModel(aiModel) {
|
|
13
|
+
return (aiModel.startsWith("openrouter/deepseek/") || aiModel.startsWith("deepseek/"));
|
|
14
|
+
}
|
|
15
|
+
function buildJsonObjectSystemAppend(schema) {
|
|
16
|
+
const jsonSchema = zod_1.default.toJSONSchema(schema);
|
|
17
|
+
return [
|
|
18
|
+
"",
|
|
19
|
+
"IMPORTANTE: Responda somente com um objeto JSON válido (sem markdown, sem texto extra).",
|
|
20
|
+
"O JSON deve seguir este schema:",
|
|
21
|
+
JSON.stringify(jsonSchema, null, 2),
|
|
22
|
+
].join("\n");
|
|
23
|
+
}
|
|
24
|
+
function mergeSystemPromptWithJsonSchema(systemPrompt, schema) {
|
|
25
|
+
const base = systemPrompt?.trim() ?? "";
|
|
26
|
+
const append = buildJsonObjectSystemAppend(schema);
|
|
27
|
+
return base ? `${base}\n${append}` : append.trim();
|
|
28
|
+
}
|
|
29
|
+
function contentToString(content) {
|
|
30
|
+
if (typeof content === "string")
|
|
31
|
+
return content;
|
|
32
|
+
if (Array.isArray(content)) {
|
|
33
|
+
return content
|
|
34
|
+
.map((part) => {
|
|
35
|
+
if (typeof part === "string")
|
|
36
|
+
return part;
|
|
37
|
+
if (part && typeof part === "object" && "text" in part) {
|
|
38
|
+
return String(part.text ?? "");
|
|
39
|
+
}
|
|
40
|
+
return "";
|
|
41
|
+
})
|
|
42
|
+
.join("");
|
|
43
|
+
}
|
|
44
|
+
return "";
|
|
45
|
+
}
|
|
46
|
+
/** Extrai e faz parse de JSON na última mensagem do assistente (suporta fences ```json). */
|
|
47
|
+
function parseJsonFromAssistantMessages(messages) {
|
|
48
|
+
const last = messages.at(-1);
|
|
49
|
+
if (!last) {
|
|
50
|
+
throw new Error("[@luanpoppe/ai] Nenhuma mensagem do assistente para extrair JSON.");
|
|
51
|
+
}
|
|
52
|
+
const raw = contentToString(last.content).trim();
|
|
53
|
+
if (!raw) {
|
|
54
|
+
throw new Error("[@luanpoppe/ai] Resposta vazia ao extrair JSON estruturado.");
|
|
55
|
+
}
|
|
56
|
+
const fenced = raw.match(/^```(?:json)?\s*([\s\S]*?)```$/i);
|
|
57
|
+
const jsonText = (fenced?.[1] ?? raw).trim();
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(jsonText);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
const start = jsonText.indexOf("{");
|
|
63
|
+
const end = jsonText.lastIndexOf("}");
|
|
64
|
+
if (start >= 0 && end > start) {
|
|
65
|
+
return JSON.parse(jsonText.slice(start, end + 1));
|
|
66
|
+
}
|
|
67
|
+
throw new Error("[@luanpoppe/ai] Não foi possível fazer parse do JSON retornado pelo modelo.");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=structured-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../../src/langchain/structured-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,6 @@ export type CreateToolParams = {
|
|
|
7
7
|
schema: z.ZodSchema;
|
|
8
8
|
};
|
|
9
9
|
export declare class AITools {
|
|
10
|
-
createTool(params: CreateToolParams): import("langchain").DynamicStructuredTool<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, unknown, unknown, unknown, string>;
|
|
10
|
+
createTool(params: CreateToolParams): import("langchain").DynamicStructuredTool<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, unknown, unknown, unknown, unknown, string>;
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter-client.d.ts","sourceRoot":"","sources":["../../src/utils/openrouter-client.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAElE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKnE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OPENROUTER_API_BASE = void 0;
|
|
7
|
+
exports.createOpenRouterOpenAIClient = createOpenRouterOpenAIClient;
|
|
8
|
+
const openai_1 = __importDefault(require("openai"));
|
|
9
|
+
exports.OPENROUTER_API_BASE = "https://openrouter.ai/api/v1";
|
|
10
|
+
function createOpenRouterOpenAIClient(apiKey) {
|
|
11
|
+
return new openai_1.default({
|
|
12
|
+
apiKey,
|
|
13
|
+
baseURL: exports.OPENROUTER_API_BASE,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=openrouter-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter-client.js","sourceRoot":"","sources":["../../src/utils/openrouter-client.ts"],"names":[],"mappings":";;;;;;AAIA,oEAKC;AATD,oDAA4B;AAEf,QAAA,mBAAmB,GAAG,8BAA8B,CAAC;AAElE,SAAgB,4BAA4B,CAAC,MAAc;IACzD,OAAO,IAAI,gBAAM,CAAC;QAChB,MAAM;QACN,OAAO,EAAE,2BAAmB;KAC7B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Bug do LangChain no Windows: Transcrição de Áudio com Whisper - 2026-02-02
|
|
2
2
|
|
|
3
|
+
> **Nota (2026):** `@luanpoppe/ai` não usa mais `OpenAIWhisperAudio` de `@langchain/community` (pacote sunset pela LangChain). A transcrição OpenAI usa o SDK `openai` diretamente (`toFile` com buffer em memória). Este documento permanece como contexto histórico do bug no loader do LangChain.
|
|
4
|
+
|
|
3
5
|
## Resumo
|
|
4
6
|
|
|
5
7
|
O loader `OpenAIWhisperAudio` do LangChain passa o **caminho completo do arquivo** (ex: `C:\Users\...\whisper-xxx.webm`) para a API da OpenAI. No Windows, isso pode causar falhas no envio multipart devido a backslashes e caracteres especiais no path.
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luanpoppe/ai",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "",
|
|
3
|
+
"version": "1.1.6",
|
|
4
|
+
"description": "TypeScript SDK for LLM chat, structured output, memory, audio STT/TTS, and embeddings via OpenAI, Gemini, OpenRouter, and local models (Ollama/LM Studio).",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"keywords": [],
|
|
7
7
|
"author": "",
|
|
8
8
|
"license": "ISC",
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@langchain/
|
|
10
|
+
"@langchain/ollama": "^1.2.6",
|
|
11
11
|
"@langchain/langgraph": "^1.1.1",
|
|
12
12
|
"openai": "^6.17.0",
|
|
13
|
-
"@langchain/core": "^1.1.
|
|
13
|
+
"@langchain/core": "^1.1.48",
|
|
14
14
|
"@langchain/google-genai": "^2.1.12",
|
|
15
15
|
"@langchain/openai": "^1.2.3",
|
|
16
16
|
"langchain": "^1.2.12",
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type OpenAIEmbeddingModel =
|
|
2
|
+
| "text-embedding-3-small"
|
|
3
|
+
| "text-embedding-3-large"
|
|
4
|
+
| "text-embedding-ada-002";
|
|
5
|
+
|
|
6
|
+
export type GeminiEmbeddingModel =
|
|
7
|
+
| "gemini-embedding-001"
|
|
8
|
+
| "gemini-embedding-2-preview";
|
|
9
|
+
|
|
10
|
+
type OpenRouterOpenAIEmbeddingModel = `openai/${OpenAIEmbeddingModel}`;
|
|
11
|
+
|
|
12
|
+
type OpenRouterGoogleEmbeddingModel = `google/${GeminiEmbeddingModel}`;
|
|
13
|
+
|
|
14
|
+
type OpenRouterQwenEmbeddingModel =
|
|
15
|
+
| "qwen/qwen3-embedding-8b"
|
|
16
|
+
| "qwen/qwen3-embedding-4b"
|
|
17
|
+
| "qwen/qwen3-embedding-0.6b";
|
|
18
|
+
|
|
19
|
+
type OpenRouterOtherEmbeddingModel =
|
|
20
|
+
| "BAAI/bge-m3"
|
|
21
|
+
| "perplexity/pplx-embed-v1-4b"
|
|
22
|
+
| "perplexity/pplx-embed-v1-0.6b";
|
|
23
|
+
|
|
24
|
+
export type OpenRouterEmbeddingModel =
|
|
25
|
+
| OpenRouterOpenAIEmbeddingModel
|
|
26
|
+
| OpenRouterGoogleEmbeddingModel
|
|
27
|
+
| OpenRouterQwenEmbeddingModel
|
|
28
|
+
| OpenRouterOtherEmbeddingModel;
|
|
29
|
+
|
|
30
|
+
export type OpenRouterPrefixedEmbeddingModel =
|
|
31
|
+
`openrouter/${OpenRouterEmbeddingModel}`;
|
|
32
|
+
|
|
33
|
+
export type AIEmbeddingModelNames =
|
|
34
|
+
| OpenAIEmbeddingModel
|
|
35
|
+
| GeminiEmbeddingModel
|
|
36
|
+
| OpenRouterPrefixedEmbeddingModel;
|
|
@@ -1,30 +1,128 @@
|
|
|
1
1
|
type ChatGPTModels =
|
|
2
2
|
| "gpt-4"
|
|
3
3
|
| "gpt-4o"
|
|
4
|
+
| "gpt-4o-mini"
|
|
4
5
|
| "gpt-4.1"
|
|
6
|
+
| "gpt-4.1-mini"
|
|
7
|
+
| "gpt-4.1-nano"
|
|
5
8
|
| "gpt-5"
|
|
6
9
|
| "gpt-5.1"
|
|
7
10
|
| "gpt-5-mini"
|
|
8
|
-
| "gpt-5-nano"
|
|
11
|
+
| "gpt-5-nano"
|
|
12
|
+
| "gpt-5.2"
|
|
13
|
+
| "gpt-5.2-chat-latest"
|
|
14
|
+
| "gpt-5.2-chat"
|
|
15
|
+
| "gpt-5.3-chat-latest"
|
|
16
|
+
| "gpt-5.3-chat"
|
|
17
|
+
| "gpt-5.4"
|
|
18
|
+
| "gpt-5.4-pro"
|
|
19
|
+
| "gpt-5.4-mini"
|
|
20
|
+
| "gpt-5.4-nano"
|
|
21
|
+
| "gpt-5.5"
|
|
22
|
+
| "gpt-5.5-pro"
|
|
23
|
+
| "gpt-chat-latest"
|
|
24
|
+
| "o3"
|
|
25
|
+
| "o4-mini";
|
|
9
26
|
|
|
10
27
|
type GeminiModels =
|
|
11
28
|
| "gemini-2.5-flash"
|
|
29
|
+
| "gemini-2.5-flash-lite"
|
|
12
30
|
| "gemini-2.5-pro"
|
|
13
31
|
| "gemini-3-flash"
|
|
14
|
-
| "gemini-3-pro"
|
|
32
|
+
| "gemini-3-pro"
|
|
33
|
+
| "gemini-3-flash-preview"
|
|
34
|
+
| "gemini-3.5-flash"
|
|
35
|
+
| "gemini-3.1-pro-preview"
|
|
36
|
+
| "gemini-3.1-flash-lite";
|
|
15
37
|
|
|
16
|
-
type AnthropicModels =
|
|
17
|
-
| "claude-
|
|
38
|
+
type AnthropicModels =
|
|
39
|
+
| "claude-opus-4.7"
|
|
40
|
+
| "claude-opus-4.7-fast"
|
|
41
|
+
| "claude-opus-4.6"
|
|
42
|
+
| "claude-opus-4.6-fast"
|
|
43
|
+
| "claude-opus-4.5"
|
|
44
|
+
| "claude-sonnet-4.6"
|
|
18
45
|
| "claude-sonnet-4.5"
|
|
46
|
+
| "claude-haiku-4.5"
|
|
19
47
|
| "claude-opus-4.1"
|
|
20
48
|
| "claude-opus-4"
|
|
21
|
-
| "claude-sonnet-4"
|
|
49
|
+
| "claude-sonnet-4"
|
|
50
|
+
| "claude-3.5-haiku"
|
|
51
|
+
| "claude-3-haiku";
|
|
52
|
+
|
|
53
|
+
/** Modelos DeepSeek via OpenRouter (prefixo `openrouter/deepseek/`) */
|
|
54
|
+
type DeepSeekModels =
|
|
55
|
+
| "deepseek-v4-pro"
|
|
56
|
+
| "deepseek-v4-flash"
|
|
57
|
+
| "deepseek-v4-flash:free"
|
|
58
|
+
| "deepseek-chat"
|
|
59
|
+
| "deepseek-chat-v3.1"
|
|
60
|
+
| "deepseek-r1"
|
|
61
|
+
| "deepseek-r1-0528"
|
|
62
|
+
| "deepseek-v3.2"
|
|
63
|
+
| "deepseek-v3.2-speciale"
|
|
64
|
+
| "deepseek-v3.1-terminus";
|
|
65
|
+
|
|
66
|
+
/** Modelos Qwen via OpenRouter (prefixo `openrouter/qwen/`) */
|
|
67
|
+
type QwenModels =
|
|
68
|
+
| "qwen3.7-max"
|
|
69
|
+
| "qwen3.6-plus"
|
|
70
|
+
| "qwen3.6-flash"
|
|
71
|
+
| "qwen3.6-max-preview"
|
|
72
|
+
| "qwen3-max"
|
|
73
|
+
| "qwen3-max-thinking"
|
|
74
|
+
| "qwen3-coder"
|
|
75
|
+
| "qwen3-coder-plus"
|
|
76
|
+
| "qwen3-coder-next"
|
|
77
|
+
| "qwen3-coder:free"
|
|
78
|
+
| "qwen3-235b-a22b"
|
|
79
|
+
| "qwen3.5-plus-20260420"
|
|
80
|
+
| "qwen3.5-397b-a17b"
|
|
81
|
+
| "qwen3-vl-235b-a22b-instruct"
|
|
82
|
+
| "qwen3-next-80b-a3b-instruct";
|
|
83
|
+
|
|
84
|
+
/** Modelos Kimi (Moonshot) via OpenRouter (prefixo `openrouter/moonshotai/`) */
|
|
85
|
+
type MoonshotModels =
|
|
86
|
+
| "kimi-k2.6"
|
|
87
|
+
| "kimi-k2.6:free"
|
|
88
|
+
| "kimi-k2.5"
|
|
89
|
+
| "kimi-k2-thinking";
|
|
90
|
+
|
|
91
|
+
/** Modelos MiMo (Xiaomi) via OpenRouter (prefixo `openrouter/xiaomi/`) */
|
|
92
|
+
type XiaomiModels =
|
|
93
|
+
| "mimo-v2.5-pro"
|
|
94
|
+
| "mimo-v2.5"
|
|
95
|
+
| "mimo-v2-flash"
|
|
96
|
+
| "mimo-v2-omni";
|
|
97
|
+
|
|
98
|
+
/** Modelos GLM (Zhipu) via OpenRouter (prefixo `openrouter/z-ai/`) */
|
|
99
|
+
type ZAiModels = "glm-5" | "glm-4.7" | "glm-4.7-flash";
|
|
100
|
+
|
|
101
|
+
/** Modelos MiniMax via OpenRouter (prefixo `openrouter/minimax/`) */
|
|
102
|
+
type MiniMaxModels = "minimax-m2.7" | "minimax-m2.5:free";
|
|
22
103
|
|
|
23
104
|
type OpenRouterProvidersModels =
|
|
24
105
|
| `google/${GeminiModels}`
|
|
25
106
|
| `openai/${ChatGPTModels}`
|
|
26
107
|
| `anthropic/${AnthropicModels}`
|
|
108
|
+
| `deepseek/${DeepSeekModels}`
|
|
109
|
+
| `qwen/${QwenModels}`
|
|
110
|
+
| `moonshotai/${MoonshotModels}`
|
|
111
|
+
| `xiaomi/${XiaomiModels}`
|
|
112
|
+
| `z-ai/${ZAiModels}`
|
|
113
|
+
| `minimax/${MiniMaxModels}`;
|
|
27
114
|
|
|
28
115
|
type OpenRouterModels = `openrouter/${OpenRouterProvidersModels}`;
|
|
29
116
|
|
|
30
|
-
|
|
117
|
+
/** Modelos via API nativa do Ollama (prefixo `ollama/`) */
|
|
118
|
+
type OllamaModels = `ollama/${string}`;
|
|
119
|
+
|
|
120
|
+
/** Modelos via API compatível com OpenAI — LM Studio, Ollama `/v1`, vLLM, etc. (prefixo `local/`) */
|
|
121
|
+
type LocalModels = `local/${string}`;
|
|
122
|
+
|
|
123
|
+
export type AIModelNames =
|
|
124
|
+
| ChatGPTModels
|
|
125
|
+
| GeminiModels
|
|
126
|
+
| OpenRouterModels
|
|
127
|
+
| OllamaModels
|
|
128
|
+
| LocalModels;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preferências de roteamento de providers do OpenRouter.
|
|
3
|
+
* @see https://openrouter.ai/docs/guides/routing/provider-selection
|
|
4
|
+
*/
|
|
5
|
+
export type OpenRouterProviderSort =
|
|
6
|
+
| "price"
|
|
7
|
+
| "latency"
|
|
8
|
+
| "throughput"
|
|
9
|
+
| { by: "price" | "latency" | "throughput"; partition?: "model" | "none" };
|
|
10
|
+
|
|
11
|
+
/** Teto de preço em USD por milhão de tokens (prompt/completion) ou por request/imagem. */
|
|
12
|
+
export type OpenRouterMaxPrice = {
|
|
13
|
+
prompt?: number;
|
|
14
|
+
completion?: number;
|
|
15
|
+
image?: number;
|
|
16
|
+
request?: number;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type OpenRouterProviderPreferences = {
|
|
20
|
+
only?: string[];
|
|
21
|
+
order?: string[];
|
|
22
|
+
ignore?: string[];
|
|
23
|
+
allow_fallbacks?: boolean;
|
|
24
|
+
require_parameters?: boolean;
|
|
25
|
+
sort?: OpenRouterProviderSort;
|
|
26
|
+
max_price?: OpenRouterMaxPrice;
|
|
27
|
+
};
|