feat(mistral): add Mistral provider with native PDF OCR and chat integration
This commit is contained in:
66
test/test.chat.mistral.ts
Normal file
66
test/test.chat.mistral.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as qenv from '@push.rocks/qenv';
|
||||
|
||||
const testQenv = new qenv.Qenv('./', './.nogit/');
|
||||
|
||||
import * as smartai from '../ts/index.js';
|
||||
|
||||
let mistralProvider: smartai.MistralProvider;
|
||||
|
||||
tap.test('Mistral Chat: should create and start Mistral provider', async () => {
|
||||
mistralProvider = new smartai.MistralProvider({
|
||||
mistralToken: await testQenv.getEnvVarOnDemand('MISTRAL_API_KEY'),
|
||||
});
|
||||
await mistralProvider.start();
|
||||
expect(mistralProvider).toBeInstanceOf(smartai.MistralProvider);
|
||||
});
|
||||
|
||||
tap.test('Mistral Chat: should create chat response', async () => {
|
||||
const userMessage = 'What is the capital of France? Answer in one word.';
|
||||
const response = await mistralProvider.chat({
|
||||
systemMessage: 'You are a helpful assistant. Be concise.',
|
||||
userMessage: userMessage,
|
||||
messageHistory: [],
|
||||
});
|
||||
console.log(`Mistral Chat - User: ${userMessage}`);
|
||||
console.log(`Mistral Chat - Response: ${response.message}`);
|
||||
|
||||
expect(response.role).toEqual('assistant');
|
||||
expect(response.message).toBeTruthy();
|
||||
expect(response.message.toLowerCase()).toInclude('paris');
|
||||
});
|
||||
|
||||
tap.test('Mistral Chat: should handle message history', async () => {
|
||||
const messageHistory: smartai.ChatMessage[] = [
|
||||
{ role: 'user', content: 'My name is Claude Test' },
|
||||
{ role: 'assistant', content: 'Nice to meet you, Claude Test!' }
|
||||
];
|
||||
|
||||
const response = await mistralProvider.chat({
|
||||
systemMessage: 'You are a helpful assistant with good memory.',
|
||||
userMessage: 'What is my name?',
|
||||
messageHistory: messageHistory,
|
||||
});
|
||||
|
||||
console.log(`Mistral Memory Test - Response: ${response.message}`);
|
||||
expect(response.message.toLowerCase()).toInclude('claude test');
|
||||
});
|
||||
|
||||
tap.test('Mistral Chat: should handle longer conversations', async () => {
|
||||
const response = await mistralProvider.chat({
|
||||
systemMessage: 'You are a helpful coding assistant.',
|
||||
userMessage: 'Write a simple hello world function in TypeScript. Keep it brief.',
|
||||
messageHistory: [],
|
||||
});
|
||||
|
||||
console.log(`Mistral Coding Test - Response: ${response.message}`);
|
||||
expect(response.message).toBeTruthy();
|
||||
// Should contain some TypeScript/function code
|
||||
expect(response.message).toInclude('function');
|
||||
});
|
||||
|
||||
tap.test('Mistral Chat: should stop the provider', async () => {
|
||||
await mistralProvider.stop();
|
||||
});
|
||||
|
||||
export default tap.start();
|
||||
99
test/test.document.mistral.ts
Normal file
99
test/test.document.mistral.ts
Normal file
@@ -0,0 +1,99 @@
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as qenv from '@push.rocks/qenv';
|
||||
import * as smartrequest from '@push.rocks/smartrequest';
|
||||
import * as smartfile from '@push.rocks/smartfile';
|
||||
|
||||
const testQenv = new qenv.Qenv('./', './.nogit/');
|
||||
|
||||
import * as smartai from '../ts/index.js';
|
||||
|
||||
let mistralProvider: smartai.MistralProvider;
|
||||
|
||||
tap.test('Mistral Document: should create and start Mistral provider', async () => {
|
||||
mistralProvider = new smartai.MistralProvider({
|
||||
mistralToken: await testQenv.getEnvVarOnDemand('MISTRAL_API_KEY'),
|
||||
tableFormat: 'markdown',
|
||||
});
|
||||
await mistralProvider.start();
|
||||
expect(mistralProvider).toBeInstanceOf(smartai.MistralProvider);
|
||||
});
|
||||
|
||||
tap.test('Mistral Document: should process a PDF document', async () => {
|
||||
const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf';
|
||||
const pdfResponse = await smartrequest.SmartRequest.create()
|
||||
.url(pdfUrl)
|
||||
.get();
|
||||
|
||||
const result = await mistralProvider.document({
|
||||
systemMessage: 'Classify the document. Only the following answers are allowed: "invoice", "bank account statement", "contract", "test document", "other". The answer should only contain the keyword for machine use.',
|
||||
userMessage: 'Classify this document.',
|
||||
messageHistory: [],
|
||||
pdfDocuments: [Buffer.from(await pdfResponse.arrayBuffer())],
|
||||
});
|
||||
|
||||
console.log(`Mistral Document - Result:`, result);
|
||||
expect(result).toBeTruthy();
|
||||
expect(result.message).toBeTruthy();
|
||||
});
|
||||
|
||||
tap.test('Mistral Document: should handle complex document analysis', async () => {
|
||||
// Test with the demo PDF if it exists
|
||||
const pdfPath = './.nogit/demo_without_textlayer.pdf';
|
||||
let pdfBuffer: Uint8Array;
|
||||
|
||||
try {
|
||||
pdfBuffer = await smartfile.fs.toBuffer(pdfPath);
|
||||
} catch (error) {
|
||||
// If the file doesn't exist, use the dummy PDF
|
||||
console.log('Demo PDF not found, using dummy PDF instead');
|
||||
const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf';
|
||||
const pdfResponse = await smartrequest.SmartRequest.create()
|
||||
.url(pdfUrl)
|
||||
.get();
|
||||
pdfBuffer = Buffer.from(await pdfResponse.arrayBuffer());
|
||||
}
|
||||
|
||||
const result = await mistralProvider.document({
|
||||
systemMessage: `
|
||||
Analyze this document and provide a JSON response with the following structure:
|
||||
{
|
||||
"documentType": "string",
|
||||
"hasText": boolean,
|
||||
"summary": "string"
|
||||
}
|
||||
`,
|
||||
userMessage: 'Analyze this document.',
|
||||
messageHistory: [],
|
||||
pdfDocuments: [pdfBuffer],
|
||||
});
|
||||
|
||||
console.log(`Mistral Complex Document Analysis:`, result);
|
||||
expect(result).toBeTruthy();
|
||||
expect(result.message).toBeTruthy();
|
||||
});
|
||||
|
||||
tap.test('Mistral Document: should process multiple PDF documents', async () => {
|
||||
const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf';
|
||||
const pdfResponse = await smartrequest.SmartRequest.create()
|
||||
.url(pdfUrl)
|
||||
.get();
|
||||
|
||||
const pdfBuffer = Buffer.from(await pdfResponse.arrayBuffer());
|
||||
|
||||
const result = await mistralProvider.document({
|
||||
systemMessage: 'You are a document comparison assistant.',
|
||||
userMessage: 'Are these two documents the same? Answer yes or no.',
|
||||
messageHistory: [],
|
||||
pdfDocuments: [pdfBuffer, pdfBuffer], // Same document twice for test
|
||||
});
|
||||
|
||||
console.log(`Mistral Multi-Document - Result:`, result);
|
||||
expect(result).toBeTruthy();
|
||||
expect(result.message).toBeTruthy();
|
||||
});
|
||||
|
||||
tap.test('Mistral Document: should stop the provider', async () => {
|
||||
await mistralProvider.stop();
|
||||
});
|
||||
|
||||
export default tap.start();
|
||||
Reference in New Issue
Block a user