Files
smartai/readme.md

409 lines
12 KiB
Markdown
Raw Normal View History

2024-03-30 12:42:44 +01:00
# @push.rocks/smartai
2024-04-14 17:19:32 +02:00
SmartAi is a powerful TypeScript library that provides a unified interface for integrating with multiple AI providers including OpenAI, Anthropic, Perplexity, Ollama, Groq, XAI, and Exo. It offers comprehensive support for chat interactions, streaming conversations, text-to-speech, document analysis, and vision processing.
## Install
To install SmartAi into your project, use pnpm:
2024-04-14 17:19:32 +02:00
2024-04-04 02:47:44 +02:00
```bash
pnpm install @push.rocks/smartai
2024-04-04 02:47:44 +02:00
```
## Usage
SmartAi provides a clean, consistent API across all supported AI providers. This documentation covers all features with practical examples for each provider and capability.
### Initialization
2024-03-30 12:42:44 +01:00
First, initialize SmartAi with the API tokens and configuration for the providers you want to use:
2024-04-04 02:47:44 +02:00
```typescript
2024-04-29 12:37:43 +02:00
import { SmartAi } from '@push.rocks/smartai';
2024-04-04 02:47:44 +02:00
const smartAi = new SmartAi({
// OpenAI - for GPT models, DALL-E, and TTS
openaiToken: 'your-openai-api-key',
// Anthropic - for Claude models
anthropicToken: 'your-anthropic-api-key',
// Perplexity - for research-focused AI
perplexityToken: 'your-perplexity-api-key',
// Groq - for fast inference
groqToken: 'your-groq-api-key',
// XAI - for Grok models
xaiToken: 'your-xai-api-key',
// Ollama - for local models
ollama: {
baseUrl: 'http://localhost:11434',
model: 'llama2', // default model for chat
visionModel: 'llava' // default model for vision
},
// Exo - for distributed inference
exo: {
baseUrl: 'http://localhost:8080/v1',
apiKey: 'your-exo-api-key'
}
2024-04-04 02:47:44 +02:00
});
// Start the SmartAi instance
2024-04-29 12:37:43 +02:00
await smartAi.start();
```
2024-04-14 17:19:32 +02:00
## Supported Providers
SmartAi supports the following AI providers:
| Provider | Use Case | Key Features |
|----------|----------|--------------|
| **OpenAI** | General purpose, GPT models | Chat, streaming, TTS, vision, documents |
| **Anthropic** | Claude models, safety-focused | Chat, streaming, vision, documents |
| **Perplexity** | Research and factual queries | Chat, streaming, documents |
| **Groq** | Fast inference | Chat, streaming |
| **XAI** | Grok models | Chat, streaming |
| **Ollama** | Local models | Chat, streaming, vision |
| **Exo** | Distributed inference | Chat, streaming |
## Core Features
### 1. Chat Interactions
SmartAi provides both synchronous and streaming chat capabilities across all supported providers.
#### Synchronous Chat
Simple request-response interactions with any provider:
2024-04-04 02:47:44 +02:00
```typescript
// OpenAI Example
const openAiResponse = await smartAi.openaiProvider.chat({
systemMessage: 'You are a helpful assistant.',
userMessage: 'What is the capital of France?',
messageHistory: []
});
console.log(openAiResponse.message); // "The capital of France is Paris."
// Anthropic Example
const anthropicResponse = await smartAi.anthropicProvider.chat({
systemMessage: 'You are a knowledgeable historian.',
userMessage: 'Tell me about the French Revolution',
messageHistory: []
});
console.log(anthropicResponse.message);
// Using message history for context
const contextualResponse = await smartAi.openaiProvider.chat({
systemMessage: 'You are a math tutor.',
userMessage: 'What about multiplication?',
messageHistory: [
{ role: 'user', content: 'Can you teach me math?' },
{ role: 'assistant', content: 'Of course! What would you like to learn?' }
]
});
2024-04-04 02:47:44 +02:00
```
#### Streaming Chat
2024-04-29 12:37:43 +02:00
For real-time, token-by-token responses:
```typescript
// Create a readable stream for input
const { readable, writable } = new TransformStream();
const writer = writable.getWriter();
// Send a message
const encoder = new TextEncoder();
await writer.write(encoder.encode(JSON.stringify({
role: 'user',
content: 'Write a haiku about programming'
})));
await writer.close();
// Get streaming response
const responseStream = await smartAi.openaiProvider.chatStream(readable);
const reader = responseStream.getReader();
const decoder = new TextDecoder();
// Read the stream
while (true) {
const { done, value } = await reader.read();
if (done) break;
process.stdout.write(value); // Print each chunk as it arrives
}
```
2024-04-29 12:37:43 +02:00
### 2. Text-to-Speech (Audio Generation)
2024-04-29 12:37:43 +02:00
Convert text to natural-sounding speech (currently supported by OpenAI):
2024-04-04 02:47:44 +02:00
```typescript
import * as fs from 'fs';
// Generate speech from text
const audioStream = await smartAi.openaiProvider.audio({
message: 'Hello world! This is a test of the text-to-speech system.'
2024-04-29 12:37:43 +02:00
});
// Save to file
const writeStream = fs.createWriteStream('output.mp3');
audioStream.pipe(writeStream);
// Or use in your application directly
audioStream.on('data', (chunk) => {
// Process audio chunks
});
2024-04-04 02:47:44 +02:00
```
### 3. Vision Processing
2024-04-04 02:47:44 +02:00
Analyze images and get detailed descriptions:
2024-04-04 02:47:44 +02:00
```typescript
import * as fs from 'fs';
// Read an image file
const imageBuffer = fs.readFileSync('image.jpg');
// OpenAI Vision
const openAiVision = await smartAi.openaiProvider.vision({
image: imageBuffer,
prompt: 'What is in this image? Describe in detail.'
2024-04-04 02:47:44 +02:00
});
console.log('OpenAI:', openAiVision);
// Anthropic Vision
const anthropicVision = await smartAi.anthropicProvider.vision({
image: imageBuffer,
prompt: 'Analyze this image and identify any text or objects.'
});
console.log('Anthropic:', anthropicVision);
// Ollama Vision (using local model)
const ollamaVision = await smartAi.ollamaProvider.vision({
image: imageBuffer,
prompt: 'Describe the colors and composition of this image.'
});
console.log('Ollama:', ollamaVision);
```
### 4. Document Analysis
Process and analyze PDF documents with AI:
```typescript
import * as fs from 'fs';
// Read PDF documents
const pdfBuffer = fs.readFileSync('document.pdf');
// Analyze with OpenAI
const openAiAnalysis = await smartAi.openaiProvider.document({
systemMessage: 'You are a document analyst. Extract key information.',
userMessage: 'Summarize this document and list the main points.',
messageHistory: [],
pdfDocuments: [pdfBuffer]
});
console.log('OpenAI Analysis:', openAiAnalysis.message);
// Analyze with Anthropic
const anthropicAnalysis = await smartAi.anthropicProvider.document({
systemMessage: 'You are a legal expert.',
userMessage: 'Identify any legal terms or implications in this document.',
messageHistory: [],
pdfDocuments: [pdfBuffer]
});
console.log('Anthropic Analysis:', anthropicAnalysis.message);
// Process multiple documents
const doc1 = fs.readFileSync('contract1.pdf');
const doc2 = fs.readFileSync('contract2.pdf');
const comparison = await smartAi.openaiProvider.document({
systemMessage: 'You are a contract analyst.',
userMessage: 'Compare these two contracts and highlight the differences.',
messageHistory: [],
pdfDocuments: [doc1, doc2]
});
console.log('Comparison:', comparison.message);
```
### 5. Conversation Management
Create persistent conversation sessions with any provider:
```typescript
// Create a conversation with OpenAI
const conversation = smartAi.createConversation('openai');
// Set the system message
await conversation.setSystemMessage('You are a helpful coding assistant.');
// Get input and output streams
const inputWriter = conversation.getInputStreamWriter();
const outputStream = conversation.getOutputStream();
// Set up output reader
const reader = outputStream.getReader();
const decoder = new TextDecoder();
// Send messages
await inputWriter.write('How do I create a REST API in Node.js?');
// Read responses
while (true) {
const { done, value } = await reader.read();
if (done) break;
console.log('Assistant:', decoder.decode(value));
}
// Continue the conversation
await inputWriter.write('Can you show me an example with Express?');
// Create conversations with different providers
const anthropicConversation = smartAi.createConversation('anthropic');
const groqConversation = smartAi.createConversation('groq');
2024-04-04 02:47:44 +02:00
```
## Advanced Usage
### Error Handling
2024-04-04 02:47:44 +02:00
Always wrap AI operations in try-catch blocks for robust error handling:
2024-04-04 02:47:44 +02:00
```typescript
try {
const response = await smartAi.openaiProvider.chat({
systemMessage: 'You are an assistant.',
userMessage: 'Hello!',
messageHistory: []
});
console.log(response.message);
} catch (error) {
if (error.code === 'rate_limit_exceeded') {
console.error('Rate limit hit, please retry later');
} else if (error.code === 'invalid_api_key') {
console.error('Invalid API key provided');
} else {
console.error('Unexpected error:', error.message);
}
}
```
2024-04-04 02:47:44 +02:00
### Streaming with Custom Processing
Implement custom transformations on streaming responses:
```typescript
// Create a custom transform stream
const customTransform = new TransformStream({
transform(chunk, controller) {
// Example: Add timestamps to each chunk
const timestamp = new Date().toISOString();
controller.enqueue(`[${timestamp}] ${chunk}`);
}
});
// Apply to streaming chat
const inputStream = new ReadableStream({
start(controller) {
controller.enqueue(new TextEncoder().encode(JSON.stringify({
role: 'user',
content: 'Tell me a story'
})));
controller.close();
}
});
const responseStream = await smartAi.openaiProvider.chatStream(inputStream);
const processedStream = responseStream.pipeThrough(customTransform);
// Read processed stream
const reader = processedStream.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
console.log(value);
}
```
### Provider-Specific Features
Each provider may have unique capabilities. Here's how to leverage them:
```typescript
// OpenAI - Use specific models
const gpt4Response = await smartAi.openaiProvider.chat({
systemMessage: 'You are a helpful assistant.',
userMessage: 'Explain quantum computing',
messageHistory: []
});
// Anthropic - Use Claude's strength in analysis
const codeReview = await smartAi.anthropicProvider.chat({
systemMessage: 'You are a code reviewer.',
userMessage: 'Review this code for security issues: ...',
messageHistory: []
});
// Perplexity - Best for research and current events
const research = await smartAi.perplexityProvider.chat({
systemMessage: 'You are a research assistant.',
userMessage: 'What are the latest developments in renewable energy?',
messageHistory: []
});
// Groq - Optimized for speed
const quickResponse = await smartAi.groqProvider.chat({
systemMessage: 'You are a quick helper.',
userMessage: 'Give me a one-line summary of photosynthesis',
messageHistory: []
});
```
### Performance Optimization
Tips for optimal performance:
```typescript
// 1. Reuse providers instead of creating new instances
const smartAi = new SmartAi({ /* config */ });
await smartAi.start(); // Initialize once
// 2. Use streaming for long responses
// Streaming reduces time-to-first-token and memory usage
// 3. Batch operations when possible
const promises = [
smartAi.openaiProvider.chat({ /* ... */ }),
smartAi.anthropicProvider.chat({ /* ... */ })
];
const results = await Promise.all(promises);
// 4. Clean up resources
await smartAi.stop(); // When done
```
## 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.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
2024-04-04 02:47:44 +02:00
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
2024-04-04 02:47:44 +02:00
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
2024-04-04 02:47:44 +02:00
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.