Die TypeScript-Bibliothek zum Erstellen von KI-Anwendungen.
Einführung | Schnellinstallation | Verwendung | Dokumentation | Beispiele | Mitwirken | modelfusion .dev
Wichtig
modelfusion ist Vercel beigetreten und wird in das Vercel AI SDK integriert. Wir bringen die besten Teile der modelfusion in das Vercel AI SDK ein, angefangen bei der Textgenerierung, der Generierung strukturierter Objekte und Toolaufrufen. Bitte informieren Sie sich im AI SDK über die neuesten Entwicklungen.
modelfusion ist eine Abstraktionsschicht zur Integration von KI-Modellen in JavaScript- und TypeScript-Anwendungen und vereinheitlicht die API für gängige Vorgänge wie Text-Streaming , Objektgenerierung und Werkzeugnutzung . Es bietet Funktionen zur Unterstützung von Produktionsumgebungen, einschließlich Observability Hooks, Protokollierung und automatischen Wiederholungsversuchen. Mit modelfusion können Sie KI-Anwendungen, Chatbots und Agenten erstellen.
npm install modelfusion
Oder verwenden Sie eine Starter-Vorlage:
Tipp
Die grundlegenden Beispiele eignen sich hervorragend zum Einstieg und zum Erkunden parallel zur Dokumentation. Sie finden sie im Ordner „examples/basic“.
Sie können API-Schlüssel für die verschiedenen Integrationen mithilfe von Umgebungsvariablen (z. B. OPENAI_API_KEY
) bereitstellen oder sie als Optionen an die Modellkonstruktoren übergeben.
Generieren Sie Text mithilfe eines Sprachmodells und einer Eingabeaufforderung. Sie können den Text streamen, wenn er vom Modell unterstützt wird. Sie können Bilder für multimodale Eingabeaufforderungen verwenden, wenn das Modell dies unterstützt (z. B. mit llama.cpp). Sie können Eingabeaufforderungsstile verwenden, um Text-, Anweisungen- oder Chat-Eingabeaufforderungen zu verwenden.
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" ,
} ) ;
Anbieter: OpenAI, OpenAI-kompatibel, 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 ) ;
}
Anbieter: OpenAI, OpenAI-kompatibel, Llama.cpp, Ollama, Mistral, Cohere
Multimodale Vision-Modelle wie GPT 4 Vision können Bilder als Teil der Eingabeaufforderung verarbeiten.
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 ) ;
}
Anbieter: OpenAI, OpenAI-kompatibel, Llama.cpp, Ollama
Generieren Sie typisierte Objekte mithilfe eines Sprachmodells und eines Schemas.
Generieren Sie ein Objekt, das einem Schema entspricht.
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!" ,
} ,
} ) ;
Anbieter: OpenAI, Ollama, Llama.cpp
Streamen Sie ein Objekt, das einem Schema entspricht. Teilobjekte vor dem letzten Teil sind untypisiertes 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 ) ;
}
Anbieter: OpenAI, Ollama, Llama.cpp
Generieren Sie ein Bild aus einer Eingabeaufforderung.
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" ,
} ) ;
Anbieter: OpenAI (Dall·E), Stability AI, Automatic1111
Synthetisieren Sie Sprache (Audio) aus Text. Auch TTS (Text-to-Speech) genannt.
generateSpeech
synthetisiert Sprache aus Text.
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." ,
} ) ;
Anbieter: Eleven Labs, LMNT, OpenAI
generateSpeech
generiert einen Strom von Sprachblöcken aus Text oder einem Textstrom. Je nach Modell kann dies Vollduplex sein.
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
}
Anbieter: Eleven Labs
Transkribieren Sie Sprachdaten (Audiodaten) in Text. Auch Speech-to-Text (STT) genannt.
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" ) ,
} ) ;
Anbieter: OpenAI (Whisper), Whisper.cpp
Erstellen Sie Einbettungen für Text und andere Werte. Einbettungen sind Vektoren, die die Essenz der Werte im Kontext des Modells darstellen.
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." ,
] ,
} ) ;
Anbieter: OpenAI, OpenAI-kompatibel, Llama.cpp, Ollama, Mistral, Hugging Face, Cohere
Klassifiziert einen Wert in eine Kategorie.
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?" ,
} ) ;
Klassifikatoren: EmbeddingSimilarityClassifier
Teilen Sie Text in Token auf und rekonstruieren Sie den Text aus Token.
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 ) ;
Anbieter: OpenAI, Llama.cpp, Cohere
Werkzeuge sind Funktionen (und zugehörige Metadaten), die von einem KI-Modell ausgeführt werden können. Sie sind nützlich für den Aufbau von Chatbots und Agenten.
modelfusion bietet mehrere sofort einsatzbereite Tools: Math.js, MediaWiki Search, SerpAPI, Google Custom Search. Sie können auch benutzerdefinierte Tools erstellen.
Mit runTool
können Sie ein Tool-kompatibles Sprachmodell (z. B. OpenAI-Chat) bitten, ein einzelnes Tool aufzurufen. runTool
generiert zunächst einen Tool-Aufruf und führt dann das Tool mit den Argumenten aus.
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 ) ;
Mit runTools
können Sie ein Sprachmodell auffordern, mehrere Toolaufrufe sowie Text zu generieren. Das Modell wählt aus, welche Tools (falls vorhanden) mit welchen Argumenten aufgerufen werden sollen. Sowohl der Text als auch die Toolaufrufe sind optional. Diese Funktion führt die Werkzeuge aus.
const { text , toolResults } = await runTools ( {
model : openai . ChatTextGenerator ( { model : "gpt-3.5-turbo" } ) ,
tools : [ calculator /* ... */ ] ,
prompt : [ openai . ChatMessage . user ( "What's fourteen times twelve?" ) ] ,
} ) ;
Mit runTools
können Sie eine Agentenschleife implementieren, die auf Benutzernachrichten reagiert und Tools ausführt. Erfahren Sie mehr.
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"
) ;
Verfügbare Vektorspeicher: Speicher, SQLite VSS, Pinecone
Mit modelfusion Textgenerierungsmodellen können Sie verschiedene Eingabeaufforderungsstile (z. B. Text-, Anweisungs- oder Chat-Eingabeaufforderungen) verwenden. Auf diese Eingabeaufforderungsstile kann über die Methoden .withTextPrompt()
, .withChatPrompt()
und .withInstructionPrompt()
zugegriffen werden:
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" ,
} ,
] ,
} ,
} ) ;
Sie können Aufforderungsvorlagen auch mit Bildmodellen verwenden, um beispielsweise eine einfache Textaufforderung zu verwenden. Es ist als Kurzschriftmethode verfügbar:
const image = await generateImage ( {
model : stability
. ImageGenerator ( {
//...
} )
. withTextPrompt ( ) ,
prompt :
"the wicked witch of the west in the style of early 19th century painting" ,
} ) ;
Eingabeaufforderungsvorlage | Textaufforderung |
---|---|
Automatisch1111 | ✅ |
Stabilität | ✅ |
modelfusion -Modellfunktionen geben umfangreiche Antworten zurück, die die rohe (ursprüngliche) Antwort und Metadaten enthalten, wenn Sie das Argument fullResponse
auf true
setzen.
// 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 bietet ein Beobachter-Framework und Protokollierungsunterstützung. Sie können Läufe und Aufrufhierarchien einfach verfolgen und Ihre eigenen Beobachter hinzufügen.
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" ,
} ) ;
Beispiele für fast alle einzelnen Funktionen und Objekte. Für den Einstieg sehr zu empfehlen.
Multimodal , Objekt-Streaming , Bildgenerierung , Text-zu-Sprache , Sprache-zu-Text , Textgenerierung , Objektgenerierung , Einbettungen
StoryTeller ist eine explorative Webanwendung, die kurze Audiogeschichten für Vorschulkinder erstellt.
Next.js-App , OpenAI GPT-3.5-turbo , Streaming , Abbruchbehandlung
Ein Webchat mit einem KI-Assistenten, umgesetzt als Next.js-App.
Terminal-App , PDF-Analyse , Vektorindizes im Speicher , erweiterte Generierung beim Abrufen , Einbettung hypothetischer Dokumente
Stellen Sie Fragen zu einem PDF-Dokument und erhalten Sie Antworten aus dem Dokument.
Next.js-App , Bildgenerierung , Transkription , Objekt-Streaming , OpenAI , Stabilitäts-KI , Ollama
Beispiele für die Verwendung modelfusion mit Next.js 14 (App Router):
Sprach-Streaming , OpenAI , Elevenlabs -Streaming , Vite , Fastify , modelfusion Server
Bei einer Eingabeaufforderung gibt der Server sowohl eine Text- als auch eine Sprachstream-Antwort zurück.
Terminal-App , Agent , BabyAGI
TypeScript-Implementierung des BabyAGI-Klassikers und BabyBeeAGI.
Terminal-App , ReAct-Agent , GPT-4 , OpenAI-Funktionen , Tools
Erhalten Sie Antworten auf Fragen aus Wikipedia, z. B. „Wer wurde zuerst geboren, Einstein oder Picasso?“
Terminal-App , Agent , Tools , GPT-4
Kleiner Agent, der Matheaufgaben der Mittelschule löst. Zur Lösung der Probleme wird ein Taschenrechner verwendet.
Terminal-App , PDF-Analyse , rekursive Informationsextraktion , In-Memory-Vektorindex, _style-Beispielabruf , OpenAI GPT-4 , Kostenberechnung
Extrahiert Informationen zu einem Thema aus einem PDF und schreibt einen Tweet in Ihrem eigenen Stil darüber.
Cloudflare , OpenAI
Generieren Sie Text auf einem Cloudflare Worker mit modelfusion und OpenAI.
Lesen Sie den modelfusion Beitragsleitfaden, um mehr über den Entwicklungsprozess zu erfahren, wie Sie Fehlerbehebungen und Verbesserungen vorschlagen und wie Sie Ihre Änderungen erstellen und testen.