2024-03-30 12:42:44 +01:00
import { expect , expectAsync , tap } from '@push.rocks/tapbundle' ;
2024-04-25 10:49:07 +02:00
import * as qenv from '@push.rocks/qenv' ;
2024-04-27 12:47:49 +02:00
import * as smartrequest from '@push.rocks/smartrequest' ;
import * as smartfile from '@push.rocks/smartfile' ;
2024-03-30 12:42:44 +01:00
2024-04-25 10:49:07 +02:00
const testQenv = new qenv . Qenv ( './' , './.nogit/' ) ;
import * as smartai from '../ts/index.js' ;
let testSmartai : smartai.SmartAi ;
tap . test ( 'should create a smartai instance' , async ( ) = > {
testSmartai = new smartai . SmartAi ( {
openaiToken : await testQenv . getEnvVarOnDemand ( 'OPENAI_TOKEN' ) ,
} ) ;
2024-04-27 12:47:49 +02:00
await testSmartai . start ( ) ;
} ) ;
tap . test ( 'should create chat response with openai' , async ( ) = > {
const userMessage = 'How are you?' ;
const response = await testSmartai . openaiProvider . chat ( {
systemMessage : 'Hello' ,
userMessage : userMessage ,
2025-02-25 19:15:32 +00:00
messageHistory : [ ] ,
2024-04-27 12:47:49 +02:00
} ) ;
console . log ( ` userMessage: ${ userMessage } ` ) ;
2024-04-29 18:04:14 +02:00
console . log ( response . message ) ;
2024-04-27 12:47:49 +02:00
} ) ;
tap . test ( 'should document a pdf' , async ( ) = > {
const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf' ;
const pdfResponse = await smartrequest . getBinary ( pdfUrl ) ;
const result = await testSmartai . openaiProvider . document ( {
2025-02-03 15:16:58 +01:00
systemMessage : 'Classify the document. Only the following answers are allowed: "invoice", "bank account statement", "contract", "other". The answer should only contain the keyword for machine use.' ,
2024-04-27 12:47:49 +02:00
userMessage : "Classify the document." ,
messageHistory : [ ] ,
pdfDocuments : [ pdfResponse . body ] ,
} ) ;
console . log ( result ) ;
} ) ;
tap . test ( 'should recognize companies in a pdf' , async ( ) = > {
const pdfBuffer = await smartfile . fs . toBuffer ( './.nogit/demo_without_textlayer.pdf' ) ;
const result = await testSmartai . openaiProvider . document ( {
systemMessage : `
summarize the document .
answer in JSON format , adhering to the following schema :
\ ` \` \` typescript
type TAnswer = {
entitySender : {
type : 'official state entity' | 'company' | 'person' ;
name : string ;
address : string ;
city : string ;
country : string ;
2025-02-25 19:15:32 +00:00
EU : boolean ; // whether the entity is within EU
2024-04-27 12:47:49 +02:00
} ;
entityReceiver : {
type : 'official state entity' | 'company' | 'person' ;
name : string ;
address : string ;
city : string ;
country : string ;
2025-02-25 19:15:32 +00:00
EU : boolean ; // whether the entity is within EU
2024-04-27 12:47:49 +02:00
} ;
date : string ; // the date of the document as YYYY-MM-DD
title : string ; // a short title, suitable for a filename
}
\ ` \` \`
` ,
userMessage : "Classify the document." ,
messageHistory : [ ] ,
pdfDocuments : [ pdfBuffer ] ,
} ) ;
console . log ( result ) ;
2025-02-25 19:15:32 +00:00
} ) ;
tap . test ( 'should create audio response with openai' , async ( ) = > {
// Call the audio method with a sample message.
const audioStream = await testSmartai . openaiProvider . audio ( {
message : 'This is a test of audio generation.' ,
} ) ;
// Read all chunks from the stream.
const chunks : Uint8Array [ ] = [ ] ;
for await ( const chunk of audioStream ) {
chunks . push ( chunk as Uint8Array ) ;
}
const audioBuffer = Buffer . concat ( chunks ) ;
await smartfile . fs . toFs ( audioBuffer , './.nogit/testoutput.mp3' ) ;
console . log ( ` Audio Buffer length: ${ audioBuffer . length } ` ) ;
// Assert that the resulting buffer is not empty.
expect ( audioBuffer . length ) . toBeGreaterThan ( 0 ) ;
} ) ;
2024-03-30 12:42:44 +01:00
2024-04-27 12:47:49 +02:00
tap . test ( 'should stop the smartai instance' , async ( ) = > {
await testSmartai . stop ( ) ;
} ) ;
2025-02-25 19:15:32 +00:00
export default tap . start ( ) ;