La biblioteca TypeScript para crear aplicaciones de IA.
Introducción | Instalación rápida | Uso | Documentación | Ejemplos | Contribuyendo | modelfusion
Importante
modelfusion se ha unido a Vercel y se está integrando en Vercel AI SDK. Estamos incorporando las mejores partes de modelfusion al SDK de IA de Vercel, comenzando con la generación de texto, la generación de objetos estructurados y las llamadas a herramientas. Consulte el SDK de AI para conocer los últimos desarrollos.
modelfusion es una capa de abstracción para integrar modelos de IA en aplicaciones JavaScript y TypeScript, unificando la API para operaciones comunes como transmisión de texto , generación de objetos y uso de herramientas . Proporciona funciones para admitir entornos de producción, incluidos enlaces de observabilidad, registros y reintentos automáticos. Puede utilizar modelfusion para crear aplicaciones de inteligencia artificial, chatbots y agentes.
npm install modelfusion
O utilice una plantilla inicial:
Consejo
Los ejemplos básicos son una excelente manera de comenzar y explorar en paralelo con la documentación. Puede encontrarlos en la carpeta de ejemplos/básico.
Puede proporcionar claves API para las diferentes integraciones utilizando variables de entorno (por ejemplo, OPENAI_API_KEY
) o pasarlas a los constructores del modelo como opciones.
Genere texto utilizando un modelo de lenguaje y un mensaje. Puede transmitir el texto si el modelo lo admite. Puede utilizar imágenes para indicaciones multimodales si el modelo lo admite (por ejemplo, con llama.cpp). Puede utilizar estilos de mensajes para utilizar texto, instrucciones o mensajes de chat.
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" ,
} ) ;
Proveedores: OpenAI, compatible con 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 ) ;
}
Proveedores: OpenAI, compatible con OpenAI, Llama.cpp, Ollama, Mistral, Cohere
Los modelos de visión multimodal como GPT 4 Vision pueden procesar imágenes como parte del mensaje.
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 ) ;
}
Proveedores: OpenAI, compatible con OpenAI, Llama.cpp, Ollama
Genere objetos escritos utilizando un modelo de lenguaje y un esquema.
Generar un objeto que coincida con un 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!" ,
} ,
} ) ;
Proveedores: OpenAI, Ollama, Llama.cpp
Transmita un objeto que coincida con un esquema. Los objetos parciales antes de la parte final son JSON sin 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 ) ;
}
Proveedores: OpenAI, Ollama, Llama.cpp
Genere una imagen a partir de un mensaje.
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" ,
} ) ;
Proveedores: OpenAI (Dall·E), Stability AI, Automatic1111
Sintetizar voz (audio) a partir de texto. También llamado TTS (texto a voz).
generateSpeech
sintetiza la voz a partir del 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." ,
} ) ;
Proveedores: Eleven Labs, LMNT, OpenAI
generateSpeech
genera un flujo de fragmentos de voz a partir de texto o de un flujo de texto. Dependiendo del modelo, este puede ser completamente dúplex.
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
}
Proveedores: Eleven Labs
Transcribir datos de voz (audio) a texto. También llamado voz a 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" ) ,
} ) ;
Proveedores: OpenAI (Whisper), Whisper.cpp
Cree incrustaciones de texto y otros valores. Las incrustaciones son vectores que representan la esencia de los valores en el contexto del 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." ,
] ,
} ) ;
Proveedores: OpenAI, compatible con OpenAI, Llama.cpp, Ollama, Mistral, Hugging Face, Cohere
Clasifica un valor en una categoría.
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?" ,
} ) ;
Clasificadores: incrustación de similitudes
Divida el texto en tokens y reconstruya el texto a partir de 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 ) ;
Proveedores: OpenAI, Llama.cpp, Cohere
Las herramientas son funciones (y metadatos asociados) que pueden ejecutarse mediante un modelo de IA. Son útiles para crear chatbots y agentes.
modelfusion ofrece varias herramientas listas para usar: Math.js, MediaWiki Search, SerpAPI, Google Custom Search. También puedes crear herramientas personalizadas.
Con runTool
, puede pedirle a un modelo de lenguaje compatible con herramientas (por ejemplo, el chat OpenAI) que invoque una única herramienta. runTool
primero genera una llamada a la herramienta y luego ejecuta la herramienta con los 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 ) ;
Con runTools
, puede pedirle a un modelo de lenguaje que genere varias llamadas a herramientas, además de texto. El modelo elegirá qué herramientas (si las hay) deben llamarse con qué argumentos. Tanto el texto como las llamadas a herramientas son opcionales. Esta función ejecuta las herramientas.
const { text , toolResults } = await runTools ( {
model : openai . ChatTextGenerator ( { model : "gpt-3.5-turbo" } ) ,
tools : [ calculator /* ... */ ] ,
prompt : [ openai . ChatMessage . user ( "What's fourteen times twelve?" ) ] ,
} ) ;
Puede utilizar runTools
para implementar un bucle de agente que responda a los mensajes del usuario y ejecute herramientas. Obtenga más información.
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"
) ;
Tiendas de vectores disponibles: Memoria, SQLite VSS, Pinecone
Puede utilizar diferentes estilos de mensajes (como texto, instrucciones o mensajes de chat) con los modelos de generación de texto modelfusion . Se puede acceder a estos estilos de aviso a través de los métodos .withTextPrompt()
, .withChatPrompt()
y .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" ,
} ,
] ,
} ,
} ) ;
También puede utilizar plantillas de mensajes con modelos de imágenes, por ejemplo, para utilizar un mensaje de texto básico. Está disponible como 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" ,
} ) ;
Plantilla de aviso | Mensaje de texto |
---|---|
Automático1111 | ✅ |
Estabilidad | ✅ |
Las funciones del modelo modelfusion devuelven respuestas enriquecidas que incluyen la respuesta sin procesar (original) y los metadatos cuando se establece el argumento fullResponse
en 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 proporciona un marco de observación y soporte de registro. Puede rastrear ejecuciones y llamar a jerarquías fácilmente, y puede agregar sus propios 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" ,
} ) ;
Ejemplos para casi todas las funciones y objetos individuales. Muy recomendable para empezar.
multimodal , transmisión de objetos , generación de imágenes , texto a voz , voz a texto , generación de texto , generación de objetos , incrustaciones
StoryTeller es una aplicación web exploratoria que crea historias cortas en audio para niños en edad preescolar.
Aplicación Next.js , OpenAI GPT-3.5-turbo , streaming , manejo de abortos
Un chat web con un asistente de IA, implementado como una aplicación Next.js.
aplicación de terminal , análisis de PDF , índices vectoriales en memoria , generación aumentada de recuperación , incrustación de documentos hipotéticos
Haga preguntas sobre un documento PDF y obtenga respuestas del documento.
Aplicación Next.js , generación de imágenes , transcripción , transmisión de objetos , OpenAI , Stability AI , Ollama
Ejemplos de uso modelfusion con Next.js 14 (App Router):
Transmisión de voz , OpenAI , transmisión de Elevenlabs , Vite , Fastify , servidor modelfusion
Ante un mensaje, el servidor devuelve una respuesta de texto y de voz.
aplicación de terminal , agente , BabyAGI
Implementación TypeScript del clásico BabyAGI y BabyBeeAGI.
aplicación de terminal , agente ReAct , GPT-4 , funciones OpenAI , herramientas
Obtenga respuestas a preguntas de Wikipedia, por ejemplo "¿Quién nació primero, Einstein o Picasso?"
aplicación de terminal , agente , herramientas , GPT-4
Pequeño agente que resuelve problemas matemáticos de secundaria. Utiliza una herramienta de calculadora para resolver los problemas.
aplicación de terminal , análisis de PDF , extracción de información recursiva , índice de vectores en memoria, recuperación de ejemplos de estilo , OpenAI GPT-4 , cálculo de costos
Extrae información sobre un tema de un PDF y escribe un tweet con tu propio estilo sobre él.
Cloudflare , OpenAI
Genere texto en un Cloudflare Worker usando modelfusion y OpenAI.
Lea la guía de contribución modelfusion para conocer el proceso de desarrollo, cómo proponer correcciones de errores y mejoras, y cómo crear y probar sus cambios.