Библиотека TypeScript для создания приложений искусственного интеллекта.
Введение | Быстрая установка | Использование | Документация | Примеры | Содействие | modelfusion .dev
Важный
modelfusion присоединился к Vercel и интегрируется в Vercel AI SDK. Мы вносим в Vercel AI SDK лучшие аспекты modelfusion , начиная с генерации текста, генерации структурированных объектов и вызовов инструментов. Пожалуйста, ознакомьтесь с AI SDK, чтобы узнать о последних разработках.
modelfusion — это уровень абстракции для интеграции моделей искусственного интеллекта в приложения JavaScript и TypeScript, объединяющий API для общих операций, таких как потоковая передача текста , генерация объектов и использование инструментов . Он предоставляет функции для поддержки производственных сред, включая перехватчики наблюдения, ведение журнала и автоматические повторные попытки. Вы можете использовать modelfusion для создания приложений искусственного интеллекта, чат-ботов и агентов.
npm install modelfusion
Или используйте стартовый шаблон:
Кончик
Базовые примеры — отличный способ начать работу и изучать ее параллельно с документацией. Вы можете найти их в папке example/basic.
Вы можете предоставить ключи API для различных интеграций, используя переменные среды (например, OPENAI_API_KEY
) или передать их в конструкторы модели в качестве опций.
Сгенерируйте текст, используя языковую модель и подсказку. Вы можете передавать текст в потоковом режиме, если это поддерживается моделью. Вы можете использовать изображения для мультимодальных подсказок, если модель это поддерживает (например, с помощью llama.cpp). Стили подсказок можно использовать для использования текста, инструкций или подсказок чата.
import { generateText , openai } from " modelfusion " ;
const text = await generateText ( {
model : openai . CompletionTextGenerator ( { model : "gpt-3.5-turbo-instruct" } ) ,
prompt : "Write a short story about a robot learning to love:nn" ,
} ) ;
Провайдеры: OpenAI, совместимость с OpenAI, Llama.cpp, Ollama, Mistral, Hugging Face, Cohere.
import { streamText , openai } from " modelfusion " ;
const textStream = await streamText ( {
model : openai . CompletionTextGenerator ( { model : "gpt-3.5-turbo-instruct" } ) ,
prompt : "Write a short story about a robot learning to love:nn" ,
} ) ;
for await ( const textPart of textStream ) {
process . stdout . write ( textPart ) ;
}
Провайдеры: OpenAI, совместимость с OpenAI, Llama.cpp, Ollama, Mistral, Cohere.
Мультимодальные модели машинного зрения, такие как GPT 4 Vision, могут обрабатывать изображения как часть подсказки.
import { streamText , openai } from " modelfusion " ;
import { readFileSync } from "fs" ;
const image = readFileSync ( "./image.png" ) ;
const textStream = await streamText ( {
model : openai
. ChatTextGenerator ( { model : "gpt-4-vision-preview" } )
. withInstructionPrompt ( ) ,
prompt : {
instruction : [
{ type : "text" , text : "Describe the image in detail." } ,
{ type : "image" , image , mimeType : "image/png" } ,
] ,
} ,
} ) ;
for await ( const textPart of textStream ) {
process . stdout . write ( textPart ) ;
}
Провайдеры: OpenAI, совместимость с OpenAI, Llama.cpp, Ollama.
Генерируйте типизированные объекты, используя языковую модель и схему.
Создайте объект, соответствующий схеме.
import {
ollama ,
zodSchema ,
generateObject ,
jsonObjectPrompt ,
} from " modelfusion " ;
const sentiment = await generateObject ( {
model : ollama
. ChatTextGenerator ( {
model : "openhermes2.5-mistral" ,
maxGenerationTokens : 1024 ,
temperature : 0 ,
} )
. asObjectGenerationModel ( jsonObjectPrompt . instruction ( ) ) ,
schema : zodSchema (
z . object ( {
sentiment : z
. enum ( [ "positive" , "neutral" , "negative" ] )
. describe ( "Sentiment." ) ,
} )
) ,
prompt : {
system :
"You are a sentiment evaluator. " +
"Analyze the sentiment of the following product review:" ,
instruction :
"After I opened the package, I was met by a very unpleasant smell " +
"that did not disappear even after washing. Never again!" ,
} ,
} ) ;
Провайдеры: OpenAI, Ollama, Llama.cpp.
Потоковая передача объекта, соответствующего схеме. Частичные объекты перед последней частью представляют собой нетипизированный JSON.
import { zodSchema , openai , streamObject } from " modelfusion " ;
const objectStream = await streamObject ( {
model : openai
. ChatTextGenerator ( /* ... */ )
. asFunctionCallObjectGenerationModel ( {
fnName : "generateCharacter" ,
fnDescription : "Generate character descriptions." ,
} )
. withTextPrompt ( ) ,
schema : zodSchema (
z . object ( {
characters : z . array (
z . object ( {
name : z . string ( ) ,
class : z
. string ( )
. describe ( "Character class, e.g. warrior, mage, or thief." ) ,
description : z . string ( ) ,
} )
) ,
} )
) ,
prompt : "Generate 3 character descriptions for a fantasy role playing game." ,
} ) ;
for await ( const { partialObject } of objectStream ) {
console . clear ( ) ;
console . log ( partialObject ) ;
}
Провайдеры: OpenAI, Ollama, Llama.cpp.
Создайте изображение из подсказки.
import { generateImage , openai } from " modelfusion " ;
const image = await generateImage ( {
model : openai . ImageGenerator ( { model : "dall-e-3" , size : "1024x1024" } ) ,
prompt :
"the wicked witch of the west in the style of early 19th century painting" ,
} ) ;
Поставщики: OpenAI (Dall·E), Stability AI, Automatic1111.
Синтезировать речь (аудио) из текста. Также называется TTS (преобразование текста в речь).
generateSpeech
синтезирует речь из текста.
import { generateSpeech , lmnt } from " modelfusion " ;
// `speech` is a Uint8Array with MP3 audio data
const speech = await generateSpeech ( {
model : lmnt . SpeechGenerator ( {
voice : "034b632b-df71-46c8-b440-86a42ffc3cf3" , // Henry
} ) ,
text :
"Good evening, ladies and gentlemen! Exciting news on the airwaves tonight " +
"as The Rolling Stones unveil 'Hackney Diamonds,' their first collection of " +
"fresh tunes in nearly twenty years, featuring the illustrious Lady Gaga, the " +
"magical Stevie Wonder, and the final beats from the late Charlie Watts." ,
} ) ;
Провайдеры: Eleven Labs, LMNT, OpenAI.
generateSpeech
генерирует поток речевых фрагментов из текста или из текстового потока. В зависимости от модели он может быть полностью дуплексным.
import { streamSpeech , elevenlabs } from " modelfusion " ;
const textStream : AsyncIterable < string > ;
const speechStream = await streamSpeech ( {
model : elevenlabs . SpeechGenerator ( {
model : "eleven_turbo_v2" ,
voice : "pNInz6obpgDQGcFmaJgB" , // Adam
optimizeStreamingLatency : 1 ,
voiceSettings : { stability : 1 , similarityBoost : 0.35 } ,
generationConfig : {
chunkLengthSchedule : [ 50 , 90 , 120 , 150 , 200 ] ,
} ,
} ) ,
text : textStream ,
} ) ;
for await ( const part of speechStream ) {
// each part is a Uint8Array with MP3 audio data
}
Поставщики: Eleven Labs
Транскрибируйте речевые (аудио) данные в текст. Также называется преобразованием речи в текст (STT).
import { generateTranscription , openai } from " modelfusion " ;
import fs from "node:fs" ;
const transcription = await generateTranscription ( {
model : openai . Transcriber ( { model : "whisper-1" } ) ,
mimeType : "audio/mp3" ,
audioData : await fs . promises . readFile ( "data/test.mp3" ) ,
} ) ;
Провайдеры: OpenAI (Whisper), Whisper.cpp.
Создавайте внедрения для текста и других значений. Вложения — это векторы, которые представляют суть значений в контексте модели.
import { embed , embedMany , openai } from " modelfusion " ;
// embed single value:
const embedding = await embed ( {
model : openai . TextEmbedder ( { model : "text-embedding-ada-002" } ) ,
value : "At first, Nox didn't know what to do with the pup." ,
} ) ;
// embed many values:
const embeddings = await embedMany ( {
model : openai . TextEmbedder ( { model : "text-embedding-ada-002" } ) ,
values : [
"At first, Nox didn't know what to do with the pup." ,
"He keenly observed and absorbed everything around him, from the birds in the sky to the trees in the forest." ,
] ,
} ) ;
Провайдеры: OpenAI, совместимость с OpenAI, Llama.cpp, Ollama, Mistral, Hugging Face, Cohere.
Классифицирует значение по категории.
import { classify , EmbeddingSimilarityClassifier , openai } from " modelfusion " ;
const classifier = new EmbeddingSimilarityClassifier ( {
embeddingModel : openai . TextEmbedder ( { model : "text-embedding-ada-002" } ) ,
similarityThreshold : 0.82 ,
clusters : [
{
name : "politics" as const ,
values : [
"they will save the country!" ,
// ...
] ,
} ,
{
name : "chitchat" as const ,
values : [
"how's the weather today?" ,
// ...
] ,
} ,
] ,
} ) ;
// strongly typed result:
const result = await classify ( {
model : classifier ,
value : "don't you love politics?" ,
} ) ;
Классификаторы: EmbeddingSimilarityClassifier
Разделите текст на токены и восстановите текст из токенов.
const tokenizer = openai . Tokenizer ( { model : "gpt-4" } ) ;
const text = "At first, Nox didn't know what to do with the pup." ;
const tokenCount = await countTokens ( tokenizer , text ) ;
const tokens = await tokenizer . tokenize ( text ) ;
const tokensAndTokenTexts = await tokenizer . tokenizeWithTexts ( text ) ;
const reconstructedText = await tokenizer . detokenize ( tokens ) ;
Провайдеры: OpenAI, Llama.cpp, Cohere.
Инструменты — это функции (и связанные с ними метаданные), которые могут выполняться моделью ИИ. Они полезны для создания чат-ботов и агентов.
modelfusion предлагает несколько готовых инструментов: Math.js, MediaWiki Search, SerpAPI, Google Custom Search. Вы также можете создавать собственные инструменты.
С помощью runTool
вы можете попросить языковую модель, совместимую с инструментами (например, чат OpenAI), вызвать один инструмент. runTool
сначала генерирует вызов инструмента, а затем запускает его с аргументами.
const { tool , toolCall , args , ok , result } = await runTool ( {
model : openai . ChatTextGenerator ( { model : "gpt-3.5-turbo" } ) ,
too : calculator ,
prompt : [ openai . ChatMessage . user ( "What's fourteen times twelve?" ) ] ,
} ) ;
console . log ( `Tool call:` , toolCall ) ;
console . log ( `Tool:` , tool ) ;
console . log ( `Arguments:` , args ) ;
console . log ( `Ok:` , ok ) ;
console . log ( `Result or Error:` , result ) ;
С помощью runTools
вы можете попросить языковую модель сгенерировать несколько вызовов инструментов, а также текст. Модель сама выберет, какие инструменты (если таковые имеются) следует вызывать с какими аргументами. И текст, и вызовы инструментов не являются обязательными. Эта функция запускает инструменты.
const { text , toolResults } = await runTools ( {
model : openai . ChatTextGenerator ( { model : "gpt-3.5-turbo" } ) ,
tools : [ calculator /* ... */ ] ,
prompt : [ openai . ChatMessage . user ( "What's fourteen times twelve?" ) ] ,
} ) ;
Вы можете использовать runTools
для реализации цикла агента, который реагирует на сообщения пользователя и запускает инструменты. Узнать больше.
const texts = [
"A rainbow is an optical phenomenon that can occur under certain meteorological conditions." ,
"It is caused by refraction, internal reflection and dispersion of light in water droplets resulting in a continuous spectrum of light appearing in the sky." ,
// ...
] ;
const vectorIndex = new MemoryVectorIndex < string > ( ) ;
const embeddingModel = openai . TextEmbedder ( {
model : "text-embedding-ada-002" ,
} ) ;
// update an index - usually done as part of an ingestion process:
await upsertIntoVectorIndex ( {
vectorIndex ,
embeddingModel ,
objects : texts ,
getValueToEmbed : ( text ) => text ,
} ) ;
// retrieve text chunks from the vector index - usually done at query time:
const retrievedTexts = await retrieve (
new VectorIndexRetriever ( {
vectorIndex ,
embeddingModel ,
maxResults : 3 ,
similarityThreshold : 0.8 ,
} ) ,
"rainbow and water droplets"
) ;
Доступные векторные хранилища: память, SQLite VSS, сосновая шишка.
Вы можете использовать различные стили подсказок (например, текст, инструкции или подсказки чата) с моделями генерации текста modelfusion . Доступ к этим стилям подсказок можно получить через методы .withTextPrompt()
, .withChatPrompt()
и .withInstructionPrompt()
:
const text = await generateText ( {
model : openai
. ChatTextGenerator ( {
// ...
} )
. withTextPrompt ( ) ,
prompt : "Write a short story about a robot learning to love" ,
} ) ;
const text = await generateText ( {
model : llamacpp
. CompletionTextGenerator ( {
// run https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF with llama.cpp
promptTemplate : llamacpp . prompt . Llama2 , // Set prompt template
contextWindowSize : 4096 , // Llama 2 context window size
maxGenerationTokens : 512 ,
} )
. withInstructionPrompt ( ) ,
prompt : {
system : "You are a story writer." ,
instruction : "Write a short story about a robot learning to love." ,
} ,
} ) ;
const textStream = await streamText ( {
model : openai
. ChatTextGenerator ( {
model : "gpt-3.5-turbo" ,
} )
. withChatPrompt ( ) ,
prompt : {
system : "You are a celebrated poet." ,
messages : [
{
role : "user" ,
content : "Suggest a name for a robot." ,
} ,
{
role : "assistant" ,
content : "I suggest the name Robbie" ,
} ,
{
role : "user" ,
content : "Write a short story about Robbie learning to love" ,
} ,
] ,
} ,
} ) ;
Вы также можете использовать шаблоны подсказок с моделями изображений, например, чтобы использовать базовую текстовую подсказку. Он доступен как сокращенный метод:
const image = await generateImage ( {
model : stability
. ImageGenerator ( {
//...
} )
. withTextPrompt ( ) ,
prompt :
"the wicked witch of the west in the style of early 19th century painting" ,
} ) ;
Шаблон подсказки | Текстовая подсказка |
---|---|
Автоматический1111 | ✅ |
Стабильность | ✅ |
Функции модели modelfusion возвращают расширенные ответы, включающие необработанный (исходный) ответ и метаданные, если для аргумента fullResponse
установлено значение true
.
// access the raw response (needs to be typed) and the metadata:
const { text , rawResponse , metadata } = await generateText ( {
model : openai . CompletionTextGenerator ( {
model : "gpt-3.5-turbo-instruct" ,
maxGenerationTokens : 1000 ,
n : 2 , // generate 2 completions
} ) ,
prompt : "Write a short story about a robot learning to love:nn" ,
fullResponse : true ,
} ) ;
console . log ( metadata ) ;
// cast to the raw response type:
for ( const choice of ( rawResponse as OpenAICompletionResponse ) . choices ) {
console . log ( choice . text ) ;
}
modelfusion предоставляет структуру наблюдателя и поддержку ведения журналов. Вы можете легко отслеживать прогоны и иерархии вызовов, а также добавлять собственных наблюдателей.
import { generateText , openai } from " modelfusion " ;
const text = await generateText ( {
model : openai . CompletionTextGenerator ( { model : "gpt-3.5-turbo-instruct" } ) ,
prompt : "Write a short story about a robot learning to love:nn" ,
logging : "detailed-object" ,
} ) ;
Примеры практически для всех отдельных функций и объектов. Настоятельно рекомендуется начать.
мультимодальность , потоковая передача объектов , генерация изображений , преобразование текста в речь , речь в текст , генерация текста , генерация объектов , встраивания
StoryTeller — это исследовательское веб-приложение, которое создает короткие аудиорассказы для детей дошкольного возраста.
Приложение Next.js , OpenAI GPT-3.5-turbo , потоковая передача , обработка прерывания
Веб-чат с ИИ-помощником, реализованный в виде приложения Next.js.
терминальное приложение , синтаксический анализ PDF-файлов , векторные индексы в памяти , расширенная генерация извлечения , встраивание гипотетического документа
Задавайте вопросы о PDF-документе и получайте ответы из документа.
Приложение Next.js , генерация изображений , транскрипция , потоковая передача объектов , OpenAI , Stability AI , Ollama
Примеры использования modelfusion с Next.js 14 (App Router):
Потоковая передача речи , OpenAI , потоковая передача Elevenlabs , Vite , Fastify , сервер modelfusion
По запросу сервер возвращает ответ как в текстовом, так и в речевом потоке.
терминальное приложение , агент , BabyAGI
Реализация TypeScript классической версии BabyAGI и BabyBeeAGI.
терминальное приложение , агент ReAct , GPT-4 , функции OpenAI , инструменты
Получите ответы на вопросы из Википедии, например «Кто родился первым, Эйнштейн или Пикассо?»
терминальное приложение , агент , инструменты , GPT-4
Маленький агент, решающий математические задачи в средней школе. Для решения задач используется калькулятор.
терминальное приложение , синтаксический анализ PDF-файлов , рекурсивное извлечение информации , векторный индекс в памяти, извлечение примера _style , OpenAI GPT-4 , расчет стоимости
Извлекает информацию о теме из PDF-файла и пишет об этом твит в своем стиле.
Клаудфлер , OpenAI
Сгенерируйте текст в Cloudflare Worker, используя modelfusion и OpenAI.
Прочтите руководство по участию в modelfusion чтобы узнать о процессе разработки, о том, как предлагать исправления ошибок и улучшения, а также о том, как создавать и тестировать свои изменения.