@luanpoppe/ai 1.1.3 → 1.1.4
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/dist/@types/image.d.ts +4 -0
- package/dist/@types/image.d.ts.map +1 -0
- package/dist/@types/image.js +10 -0
- package/dist/@types/image.js.map +1 -0
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +6 -0
- package/dist/ai.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/langchain/messages.d.ts +17 -0
- package/dist/langchain/messages.d.ts.map +1 -1
- package/dist/langchain/messages.js +21 -0
- package/dist/langchain/messages.js.map +1 -1
- package/dist/langchain/models.d.ts +4 -0
- package/dist/langchain/models.d.ts.map +1 -1
- package/dist/langchain/models.js +14 -2
- package/dist/langchain/models.js.map +1 -1
- package/dist/utils/image-utils.d.ts +8 -0
- package/dist/utils/image-utils.d.ts.map +1 -0
- package/dist/utils/image-utils.js +91 -0
- package/dist/utils/image-utils.js.map +1 -0
- package/package.json +1 -1
- package/src/@types/image.ts +14 -0
- package/src/ai.ts +11 -0
- package/src/index.ts +5 -0
- package/src/langchain/messages.ts +47 -0
- package/src/langchain/models.ts +19 -2
- package/src/utils/image-utils.ts +113 -0
- package/tests/e2e/@fixtures/imagem-teste-bateria.jpg +0 -0
- package/tests/e2e/ai-audio.test.ts +3 -3
- package/tests/e2e/ai-image.test.ts +173 -0
- package/tests/e2e/ai.test.ts +44 -4
- package/tests/unit/index.test.ts +95 -0
- package/tests/unit/langchain/image-utils.test.ts +127 -0
- package/tests/unit/langchain/messages.test.ts +78 -0
- package/tests/unit/langchain/models.test.ts +16 -0
|
@@ -175,4 +175,82 @@ describe("AIMessages", () => {
|
|
|
175
175
|
expect(callArgs.content[0].mime_type).toBe("audio/mp4");
|
|
176
176
|
});
|
|
177
177
|
});
|
|
178
|
+
|
|
179
|
+
describe("humanImage", () => {
|
|
180
|
+
it("deve criar uma HumanMessage com conteúdo de imagem e texto", () => {
|
|
181
|
+
const imageBuffer = Buffer.from("fake image data");
|
|
182
|
+
const text = "Descreva esta imagem";
|
|
183
|
+
|
|
184
|
+
const result = AIMessages.humanImage({
|
|
185
|
+
image: {
|
|
186
|
+
buffer: imageBuffer,
|
|
187
|
+
filename: "imagem.jpg",
|
|
188
|
+
},
|
|
189
|
+
text,
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
expect(result).toBeDefined();
|
|
193
|
+
expect(HumanMessage).toHaveBeenCalled();
|
|
194
|
+
const callArgs = (HumanMessage as any).mock.calls[0][0];
|
|
195
|
+
expect(callArgs.content).toBeInstanceOf(Array);
|
|
196
|
+
expect(callArgs.content.length).toBe(2);
|
|
197
|
+
expect(callArgs.content[0].type).toBe("text");
|
|
198
|
+
expect(callArgs.content[0].text).toBe(text);
|
|
199
|
+
expect(callArgs.content[1].type).toBe("image");
|
|
200
|
+
expect(callArgs.content[1].source_type).toBe("base64");
|
|
201
|
+
expect(callArgs.content[1].mime_type).toBe("image/jpeg");
|
|
202
|
+
expect(callArgs.content[1].data).toBeDefined();
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it("deve criar uma HumanMessage apenas com imagem (sem texto)", () => {
|
|
206
|
+
const imageBuffer = Buffer.from("fake image data");
|
|
207
|
+
|
|
208
|
+
const result = AIMessages.humanImage({
|
|
209
|
+
image: {
|
|
210
|
+
buffer: imageBuffer,
|
|
211
|
+
filename: "imagem.png",
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
expect(result).toBeDefined();
|
|
216
|
+
expect(HumanMessage).toHaveBeenCalled();
|
|
217
|
+
const callArgs = (HumanMessage as any).mock.calls[0][0];
|
|
218
|
+
expect(callArgs.content).toBeInstanceOf(Array);
|
|
219
|
+
expect(callArgs.content.length).toBe(1);
|
|
220
|
+
expect(callArgs.content[0].type).toBe("image");
|
|
221
|
+
expect(callArgs.content[0].source_type).toBe("base64");
|
|
222
|
+
expect(callArgs.content[0].mime_type).toBe("image/png");
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it("deve detectar MIME type automaticamente pela extensão", () => {
|
|
226
|
+
const imageBuffer = Buffer.from("fake image data");
|
|
227
|
+
|
|
228
|
+
const result = AIMessages.humanImage({
|
|
229
|
+
image: {
|
|
230
|
+
buffer: imageBuffer,
|
|
231
|
+
filename: "foto.webp",
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
expect(result).toBeDefined();
|
|
236
|
+
const callArgs = (HumanMessage as any).mock.calls[0][0];
|
|
237
|
+
expect(callArgs.content[0].mime_type).toBe("image/webp");
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it("deve usar MIME type fornecido mesmo com extensão", () => {
|
|
241
|
+
const imageBuffer = Buffer.from("fake image data");
|
|
242
|
+
|
|
243
|
+
const result = AIMessages.humanImage({
|
|
244
|
+
image: {
|
|
245
|
+
buffer: imageBuffer,
|
|
246
|
+
mimeType: "image/png",
|
|
247
|
+
filename: "imagem.jpg",
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
expect(result).toBeDefined();
|
|
252
|
+
const callArgs = (HumanMessage as any).mock.calls[0][0];
|
|
253
|
+
expect(callArgs.content[0].mime_type).toBe("image/png");
|
|
254
|
+
});
|
|
255
|
+
});
|
|
178
256
|
});
|
|
@@ -101,6 +101,22 @@ describe("AIModels", () => {
|
|
|
101
101
|
"OpenAI API key is not passed in the model parameters"
|
|
102
102
|
);
|
|
103
103
|
});
|
|
104
|
+
|
|
105
|
+
it("deve criar uma instância do ChatOpenAI com reasoningEffort", () => {
|
|
106
|
+
const config: LLMModelConfig = {
|
|
107
|
+
model: "gpt-5-nano",
|
|
108
|
+
apiKey: "test-api-key",
|
|
109
|
+
reasoningEffort: "high",
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
AIModels.gpt(config);
|
|
113
|
+
|
|
114
|
+
expect(ChatOpenAI).toHaveBeenCalledWith({
|
|
115
|
+
model: "gpt-5-nano",
|
|
116
|
+
apiKey: "test-api-key",
|
|
117
|
+
modelKwargs: { reasoning_effort: "high" },
|
|
118
|
+
});
|
|
119
|
+
});
|
|
104
120
|
});
|
|
105
121
|
|
|
106
122
|
describe("gemini", () => {
|