8 Commits

7 changed files with 1269 additions and 312 deletions

View File

@ -1,5 +1,30 @@
# Changelog # Changelog
## 2025-05-13 - 0.5.4 - fix(provider.openai)
Update dependency versions, clean test imports, and adjust default OpenAI model configurations
- Bump dependency versions in package.json (@git.zone/tsbuild, @push.rocks/tapbundle, openai, etc.)
- Change default chatModel from 'gpt-4o' to 'o4-mini' and visionModel from 'gpt-4o' to '04-mini' in provider.openai.ts
- Remove unused 'expectAsync' import from test file
## 2025-04-03 - 0.5.3 - fix(package.json)
Add explicit packageManager field to package.json
- Include the packageManager property to specify the pnpm version and checksum.
- Align package metadata with current standards.
## 2025-04-03 - 0.5.2 - fix(readme)
Remove redundant conclusion section from README to streamline documentation.
- Eliminated the conclusion block describing SmartAi's capabilities and documentation pointers.
## 2025-02-25 - 0.5.1 - fix(OpenAiProvider)
Corrected audio model ID in OpenAiProvider
- Fixed audio model identifier from 'o3-mini' to 'tts-1-hd' in the OpenAiProvider's audio method.
- Addressed minor code formatting issues in test suite for better readability.
- Corrected spelling errors in test documentation and comments.
## 2025-02-25 - 0.5.0 - feat(documentation and configuration) ## 2025-02-25 - 0.5.0 - feat(documentation and configuration)
Enhanced package and README documentation Enhanced package and README documentation

View File

@ -1,6 +1,6 @@
{ {
"name": "@push.rocks/smartai", "name": "@push.rocks/smartai",
"version": "0.5.0", "version": "0.5.4",
"private": false, "private": false,
"description": "SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.", "description": "SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
@ -14,24 +14,24 @@
"buildDocs": "(tsdoc)" "buildDocs": "(tsdoc)"
}, },
"devDependencies": { "devDependencies": {
"@git.zone/tsbuild": "^2.2.1", "@git.zone/tsbuild": "^2.3.2",
"@git.zone/tsbundle": "^2.2.5", "@git.zone/tsbundle": "^2.2.5",
"@git.zone/tsrun": "^1.3.3", "@git.zone/tsrun": "^1.3.3",
"@git.zone/tstest": "^1.0.96", "@git.zone/tstest": "^1.0.96",
"@push.rocks/qenv": "^6.1.0", "@push.rocks/qenv": "^6.1.0",
"@push.rocks/tapbundle": "^5.5.6", "@push.rocks/tapbundle": "^6.0.3",
"@types/node": "^22.13.5" "@types/node": "^22.15.17"
}, },
"dependencies": { "dependencies": {
"@anthropic-ai/sdk": "^0.37.0", "@anthropic-ai/sdk": "^0.50.4",
"@push.rocks/smartarray": "^1.1.0", "@push.rocks/smartarray": "^1.1.0",
"@push.rocks/smartfile": "^11.2.0", "@push.rocks/smartfile": "^11.2.0",
"@push.rocks/smartpath": "^5.0.18", "@push.rocks/smartpath": "^5.0.18",
"@push.rocks/smartpdf": "^3.2.2", "@push.rocks/smartpdf": "^3.2.2",
"@push.rocks/smartpromise": "^4.2.3", "@push.rocks/smartpromise": "^4.2.3",
"@push.rocks/smartrequest": "^2.0.23", "@push.rocks/smartrequest": "^2.1.0",
"@push.rocks/webstream": "^1.0.10", "@push.rocks/webstream": "^1.0.10",
"openai": "^4.85.4" "openai": "^4.98.0"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -84,5 +84,6 @@
"onlyBuiltDependencies": [ "onlyBuiltDependencies": [
"puppeteer" "puppeteer"
] ]
} },
"packageManager": "pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6"
} }

1494
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -218,13 +218,6 @@ while (true) {
This approach can facilitate adaptive content processing workflows. This approach can facilitate adaptive content processing workflows.
### Conclusion
SmartAi is a powerful toolkit for multi-faceted AI integration, offering robust solutions for chat, media, and document processing. Developers can enjoy a consistent API experience while leveraging the strengths of each supported AI model.
For futher exploration, developers might consider perusing individual provider's documentation to understand specific capabilities and limitations.
## License and Legal Information ## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.

View File

@ -1,4 +1,4 @@
import { expect, expectAsync, tap } from '@push.rocks/tapbundle'; import { expect, tap } from '@push.rocks/tapbundle';
import * as qenv from '@push.rocks/qenv'; import * as qenv from '@push.rocks/qenv';
import * as smartrequest from '@push.rocks/smartrequest'; import * as smartrequest from '@push.rocks/smartrequest';
import * as smartfile from '@push.rocks/smartfile'; import * as smartfile from '@push.rocks/smartfile';
@ -21,8 +21,7 @@ tap.test('should create chat response with openai', async () => {
const response = await testSmartai.openaiProvider.chat({ const response = await testSmartai.openaiProvider.chat({
systemMessage: 'Hello', systemMessage: 'Hello',
userMessage: userMessage, userMessage: userMessage,
messageHistory: [ messageHistory: [],
],
}); });
console.log(`userMessage: ${userMessage}`); console.log(`userMessage: ${userMessage}`);
console.log(response.message); console.log(response.message);
@ -55,7 +54,7 @@ tap.test('should recognize companies in a pdf', async () => {
address: string; address: string;
city: string; city: string;
country: string; country: string;
EU: boolean; // wether the entity is within EU EU: boolean; // whether the entity is within EU
}; };
entityReceiver: { entityReceiver: {
type: 'official state entity' | 'company' | 'person'; type: 'official state entity' | 'company' | 'person';
@ -63,7 +62,7 @@ tap.test('should recognize companies in a pdf', async () => {
address: string; address: string;
city: string; city: string;
country: string; country: string;
EU: boolean; // wether the entity is within EU EU: boolean; // whether the entity is within EU
}; };
date: string; // the date of the document as YYYY-MM-DD date: string; // the date of the document as YYYY-MM-DD
title: string; // a short title, suitable for a filename title: string; // a short title, suitable for a filename
@ -75,10 +74,27 @@ tap.test('should recognize companies in a pdf', async () => {
pdfDocuments: [pdfBuffer], pdfDocuments: [pdfBuffer],
}); });
console.log(result); console.log(result);
}) });
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);
});
tap.test('should stop the smartai instance', async () => { tap.test('should stop the smartai instance', async () => {
await testSmartai.stop(); await testSmartai.stop();
}); });
export default tap.start(); export default tap.start();

View File

@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@push.rocks/smartai', name: '@push.rocks/smartai',
version: '0.5.0', version: '0.5.4',
description: 'SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.' description: 'SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.'
} }

View File

@ -141,7 +141,7 @@ export class OpenAiProvider extends MultiModalModel {
public async audio(optionsArg: { message: string }): Promise<NodeJS.ReadableStream> { public async audio(optionsArg: { message: string }): Promise<NodeJS.ReadableStream> {
const done = plugins.smartpromise.defer<NodeJS.ReadableStream>(); const done = plugins.smartpromise.defer<NodeJS.ReadableStream>();
const result = await this.openAiApiClient.audio.speech.create({ const result = await this.openAiApiClient.audio.speech.create({
model: this.options.audioModel ?? 'o3-mini', model: this.options.audioModel ?? 'tts-1-hd',
input: optionsArg.message, input: optionsArg.message,
voice: 'nova', voice: 'nova',
response_format: 'mp3', response_format: 'mp3',
@ -184,7 +184,7 @@ export class OpenAiProvider extends MultiModalModel {
}, },
})); }));
const chatModel = this.options.chatModel ?? 'gpt-4o'; const chatModel = this.options.chatModel ?? 'o4-mini';
const requestParams: any = { const requestParams: any = {
model: chatModel, model: chatModel,
messages: [ messages: [
@ -207,7 +207,7 @@ export class OpenAiProvider extends MultiModalModel {
} }
public async vision(optionsArg: { image: Buffer; prompt: string }): Promise<string> { public async vision(optionsArg: { image: Buffer; prompt: string }): Promise<string> {
const visionModel = this.options.visionModel ?? 'gpt-4o'; const visionModel = this.options.visionModel ?? '04-mini';
const requestParams: any = { const requestParams: any = {
model: visionModel, model: visionModel,
messages: [ messages: [