A biblioteca TypeScript para construção de aplicativos de IA.
Introdução | Instalação rápida | Uso | Documentação | Exemplos | Contribuindo | modelfusion .dev
Importante
modelfusion juntou-se ao Vercel e está sendo integrado ao Vercel AI SDK. Estamos trazendo o melhor da fusão de modelfusion para o Vercel AI SDK, começando com geração de texto, geração de objetos estruturados e chamadas de ferramentas. Confira o AI SDK para os desenvolvimentos mais recentes.
modelfusion é uma camada de abstração para integração de modelos de IA em aplicativos JavaScript e TypeScript, unificando a API para operações comuns, como streaming de texto , geração de objetos e uso de ferramentas . Ele fornece recursos para dar suporte a ambientes de produção, incluindo ganchos de observabilidade, registro e novas tentativas automáticas. Você pode usar modelfusion para construir aplicativos de IA, chatbots e agentes.
npm install modelfusion
Ou use um modelo inicial:
Dica
Os exemplos básicos são uma ótima maneira de começar e explorar em paralelo com a documentação. Você pode encontrá-los na pasta samples/basic.
Você pode fornecer chaves de API para diferentes integrações usando variáveis de ambiente (por exemplo, OPENAI_API_KEY
) ou passá-las para os construtores do modelo como opções.
Gere texto usando um modelo de linguagem e um prompt. Você pode transmitir o texto se for compatível com o modelo. Você pode usar imagens para prompts multimodais se o modelo suportar (por exemplo, com llama.cpp). Você pode usar estilos de prompt para usar prompts de texto, instruções ou bate-papo.
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" ,
} ) ;
Provedores: OpenAI, compatível com 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 ) ;
}
Provedores: OpenAI, compatível com OpenAI, Llama.cpp, Ollama, Mistral, Cohere
Modelos de visão multimodal, como GPT 4 Vision, podem processar imagens como parte do prompt.
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 ) ;
}
Provedores: OpenAI, compatível com OpenAI, Llama.cpp, Ollama
Gere objetos digitados usando um modelo de linguagem e um esquema.
Gere um objeto que corresponda a um esquema.
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!" ,
} ,
} ) ;
Provedores: OpenAI, Ollama, Llama.cpp
Transmita um objeto que corresponda a um esquema. Objetos parciais antes da parte final são JSON sem tipo.
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 ) ;
}
Provedores: OpenAI, Ollama, Llama.cpp
Gere uma imagem a partir de um prompt.
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" ,
} ) ;
Provedores: OpenAI (Dall·E), Stability AI, Automatic1111
Sintetize a fala (áudio) do texto. Também chamado de TTS (conversão de texto em fala).
generateSpeech
sintetiza fala a partir de texto.
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." ,
} ) ;
Provedores: Onze Labs, LMNT, OpenAI
generateSpeech
gera um fluxo de trechos de fala a partir de texto ou de um fluxo de texto. Dependendo do modelo, pode ser totalmente duplex.
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
}
Fornecedores: Onze Laboratórios
Transcreva dados de fala (áudio) em texto. Também chamado de fala para texto (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" ) ,
} ) ;
Provedores: OpenAI (Whisper), Whisper.cpp
Crie incorporações para texto e outros valores. Incorporações são vetores que representam a essência dos valores no contexto do modelo.
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." ,
] ,
} ) ;
Provedores: OpenAI, compatível com OpenAI, Llama.cpp, Ollama, Mistral, Hugging Face, Cohere
Classifica um valor em uma categoria.
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?" ,
} ) ;
Classificadores: EmbeddingSimilarityClassifier
Divida o texto em tokens e reconstrua o texto a partir dos tokens.
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 ) ;
Provedores: OpenAI, Llama.cpp, Cohere
Ferramentas são funções (e metadados associados) que podem ser executadas por um modelo de IA. Eles são úteis para construir chatbots e agentes.
modelfusion oferece várias ferramentas prontas para uso: Math.js, MediaWiki Search, SerpAPI, Google Custom Search. Você também pode criar ferramentas personalizadas.
Com runTool
, você pode solicitar que um modelo de linguagem compatível com a ferramenta (por exemplo, bate-papo OpenAI) invoque uma única ferramenta. runTool
primeiro gera uma chamada de ferramenta e depois executa a ferramenta com os argumentos.
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 ) ;
Com runTools
, você pode solicitar a um modelo de linguagem que gere diversas chamadas de ferramenta, bem como texto. O modelo escolherá quais ferramentas (se houver) deverão ser chamadas com quais argumentos. Tanto o texto quanto as chamadas de ferramenta são opcionais. Esta função executa as ferramentas.
const { text , toolResults } = await runTools ( {
model : openai . ChatTextGenerator ( { model : "gpt-3.5-turbo" } ) ,
tools : [ calculator /* ... */ ] ,
prompt : [ openai . ChatMessage . user ( "What's fourteen times twelve?" ) ] ,
} ) ;
Você pode usar runTools
para implementar um loop de agente que responda às mensagens do usuário e execute ferramentas. Saber mais.
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"
) ;
Lojas de vetores disponíveis: memória, SQLite VSS, Pinecone
Você pode usar diferentes estilos de prompt (como texto, instrução ou prompts de bate-papo) com modelos de geração de texto modelfusion . Esses estilos de prompt podem ser acessados através dos métodos .withTextPrompt()
, .withChatPrompt()
e .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" ,
} ,
] ,
} ,
} ) ;
Você também pode usar modelos de prompt com modelos de imagem, por exemplo, para usar um prompt de texto básico. Está disponível como um método abreviado:
const image = await generateImage ( {
model : stability
. ImageGenerator ( {
//...
} )
. withTextPrompt ( ) ,
prompt :
"the wicked witch of the west in the style of early 19th century painting" ,
} ) ;
Modelo de prompt | Prompt de texto |
---|---|
Automático1111 | ✅ |
Estabilidade | ✅ |
As funções do modelo modelfusion retornam respostas ricas que incluem a resposta bruta (original) e os metadados quando você define o argumento fullResponse
como 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 fornece uma estrutura de observação e suporte de registro. Você pode facilmente rastrear execuções e chamar hierarquias, além de adicionar seus próprios observadores.
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" ,
} ) ;
Exemplos para quase todas as funções e objetos individuais. Altamente recomendado para começar.
multimodal , streaming de objetos , geração de imagens , texto para fala , fala para texto , geração de texto , geração de objetos , embeddings
StoryTeller é um aplicativo web exploratório que cria pequenas histórias em áudio para crianças em idade pré-escolar.
Aplicativo Next.js , OpenAI GPT-3.5-turbo , streaming , tratamento de aborto
Um chat na web com um assistente de IA, implementado como um aplicativo Next.js.
aplicativo de terminal , análise de PDF , índices vetoriais em memória , geração aumentada de recuperação , incorporação de documento hipotético
Faça perguntas sobre um documento PDF e obtenha respostas do documento.
Aplicativo Next.js , geração de imagens , transcrição , streaming de objetos , OpenAI , Stability AI , Ollama
Exemplos de uso de modelfusion com Next.js 14 (App Router):
Streaming de fala , OpenAI , streaming de Elevenlabs , Vite , Fastify , servidor modelfusion
Dado um prompt, o servidor retorna uma resposta de fluxo de texto e de fala.
aplicativo terminal , agente , BabyAGI
Implementação TypeScript do clássico BabyAGI e BabyBeeAGI.
aplicativo terminal , agente ReAct , GPT-4 , funções OpenAI , ferramentas
Obtenha respostas a perguntas da Wikipedia, por exemplo, "Quem nasceu primeiro, Einstein ou Picasso?"
aplicativo terminal , agente , ferramentas , GPT-4
Pequeno agente que resolve problemas de matemática do ensino médio. Ele usa uma ferramenta de calculadora para resolver os problemas.
aplicativo de terminal , análise de PDF , extração recursiva de informações , índice vetorial de memória, recuperação de exemplo _style , OpenAI GPT-4 , cálculo de custo
Extrai informações sobre um tópico de um PDF e escreve um tweet no seu próprio estilo sobre ele.
Cloudflare , OpenAI
Gere texto em um Cloudflare Worker usando modelfusion e OpenAI.
Leia o guia de contribuição modelfusion para aprender sobre o processo de desenvolvimento, como propor correções de bugs e melhorias e como construir e testar suas alterações.