Pustaka TypeScript untuk membuat aplikasi AI.
Pendahuluan | Instal Cepat | Penggunaan | Dokumentasi | Contoh | Berkontribusi | modelfusion .dev
Penting
modelfusion telah bergabung dengan Vercel dan diintegrasikan ke dalam Vercel AI SDK. Kami menghadirkan bagian terbaik dari modelfusion ke Vercel AI SDK, dimulai dengan pembuatan teks, pembuatan objek terstruktur, dan pemanggilan alat. Silakan periksa AI SDK untuk perkembangan terbaru.
modelfusion adalah lapisan abstraksi untuk mengintegrasikan model AI ke dalam aplikasi JavaScript dan TypeScript, menyatukan API untuk operasi umum seperti streaming teks , pembuatan objek , dan penggunaan alat . Ini menyediakan fitur untuk mendukung lingkungan produksi, termasuk kait observabilitas, logging, dan percobaan ulang otomatis. Anda dapat menggunakan modelfusion untuk membangun aplikasi AI, chatbots, dan agen.
npm install modelfusion
Atau gunakan templat awal:
Tip
Contoh dasar adalah cara terbaik untuk memulai dan mengeksplorasi secara paralel dengan dokumentasi. Anda dapat menemukannya di folder contoh/dasar.
Anda dapat memberikan kunci API untuk integrasi yang berbeda menggunakan variabel lingkungan (misalnya OPENAI_API_KEY
) atau meneruskannya ke konstruktor model sebagai opsi.
Hasilkan teks menggunakan model bahasa dan prompt. Anda dapat melakukan streaming teks jika didukung oleh model. Anda dapat menggunakan gambar untuk perintah multi-modal jika model mendukungnya (misalnya dengan llama.cpp). Anda dapat menggunakan gaya perintah untuk menggunakan perintah teks, instruksi, atau obrolan.
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" ,
} ) ;
Penyedia: OpenAI, kompatibel dengan 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 ) ;
}
Penyedia: OpenAI, kompatibel dengan OpenAI, Llama.cpp, Ollama, Mistral, Cohere
Model visi multimodal seperti GPT 4 Vision dapat memproses gambar sebagai bagian dari perintah.
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 ) ;
}
Penyedia: OpenAI, kompatibel dengan OpenAI, Llama.cpp, Ollama
Hasilkan objek yang diketik menggunakan model bahasa dan skema.
Hasilkan objek yang cocok dengan skema.
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!" ,
} ,
} ) ;
Penyedia: OpenAI, Ollama, Llama.cpp
Streaming objek yang cocok dengan skema. Objek parsial sebelum bagian akhir adalah JSON yang tidak diketik.
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 ) ;
}
Penyedia: OpenAI, Ollama, Llama.cpp
Hasilkan gambar dari 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" ,
} ) ;
Penyedia: OpenAI (Dall·E), Stabilitas AI, Otomatis1111
Sintesis ucapan (audio) dari teks. Disebut juga TTS (teks-ke-ucapan).
generateSpeech
mensintesis ucapan dari teks.
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." ,
} ) ;
Penyedia: Sebelas Labs, LMNT, OpenAI
generateSpeech
menghasilkan aliran potongan ucapan dari teks atau dari aliran teks. Tergantung pada modelnya, ini bisa sepenuhnya dupleks.
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
}
Penyedia: Sebelas Labs
Mentranskripsikan data ucapan (audio) ke dalam teks. Disebut juga ucapan-ke-teks (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" ) ,
} ) ;
Penyedia: OpenAI (Bisikan), Whisper.cpp
Buat penyematan untuk teks dan nilai lainnya. Penyematan adalah vektor yang mewakili esensi nilai dalam konteks model.
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." ,
] ,
} ) ;
Penyedia: OpenAI, kompatibel dengan OpenAI, Llama.cpp, Ollama, Mistral, Hugging Face, Cohere
Mengklasifikasikan nilai ke dalam kategori.
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?" ,
} ) ;
Pengklasifikasi: EmbeddingSimilarityClassifier
Pisahkan teks menjadi token dan rekonstruksi teks dari 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 ) ;
Penyedia: OpenAI, Llama.cpp, Cohere
Alat adalah fungsi (dan metadata terkait) yang dapat dijalankan oleh model AI. Mereka berguna untuk membangun chatbot dan agen.
modelfusion menawarkan beberapa alat siap pakai: Math.js, MediaWiki Search, SerpAPI, Google Custom Search. Anda juga dapat membuat alat khusus.
Dengan runTool
, Anda dapat meminta model bahasa yang kompatibel dengan alat (misalnya obrolan OpenAI) untuk memanggil satu alat. runTool
pertama-tama menghasilkan panggilan alat dan kemudian mengeksekusi alat tersebut dengan argumen.
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 ) ;
Dengan runTools
, Anda dapat meminta model bahasa untuk menghasilkan beberapa panggilan alat serta teks. Model akan memilih alat mana (jika ada) yang harus dipanggil dengan argumen yang mana. Panggilan teks dan alat bersifat opsional. Fungsi ini menjalankan alat.
const { text , toolResults } = await runTools ( {
model : openai . ChatTextGenerator ( { model : "gpt-3.5-turbo" } ) ,
tools : [ calculator /* ... */ ] ,
prompt : [ openai . ChatMessage . user ( "What's fourteen times twelve?" ) ] ,
} ) ;
Anda dapat menggunakan runTools
untuk mengimplementasikan loop agen yang merespons pesan pengguna dan menjalankan alat. Pelajari lebih lanjut.
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"
) ;
Toko Vektor yang Tersedia: Memori, SQLite VSS, Pinecone
Anda dapat menggunakan gaya perintah yang berbeda (seperti perintah teks, instruksi, atau obrolan) dengan model pembuatan teks modelfusion . Gaya prompt ini dapat diakses melalui metode .withTextPrompt()
, .withChatPrompt()
dan .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" ,
} ,
] ,
} ,
} ) ;
Anda juga dapat menggunakan template prompt dengan model gambar, misalnya menggunakan prompt teks dasar. Ini tersedia sebagai metode singkat:
const image = await generateImage ( {
model : stability
. ImageGenerator ( {
//...
} )
. withTextPrompt ( ) ,
prompt :
"the wicked witch of the west in the style of early 19th century painting" ,
} ) ;
Templat Cepat | Perintah Teks |
---|---|
Otomatis1111 | ✅ |
Stabilitas | ✅ |
fungsi model modelfusion mengembalikan respons kaya yang menyertakan respons mentah (asli) dan metadata saat Anda menyetel argumen fullResponse
ke 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 menyediakan kerangka pengamat dan dukungan logging. Anda dapat dengan mudah melacak proses dan memanggil hierarki, dan Anda dapat menambahkan pengamat Anda sendiri.
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" ,
} ) ;
Contoh untuk hampir semua fungsi dan objek individual. Sangat disarankan untuk memulai.
multi-modal , streaming objek , pembuatan gambar , teks ke ucapan , ucapan ke teks , pembuatan teks , pembuatan objek , penyematan
StoryTeller adalah aplikasi web eksplorasi yang membuat cerita audio pendek untuk anak-anak pra-sekolah.
Aplikasi Next.js , OpenAI GPT-3.5-turbo , streaming , batalkan penanganan
Obrolan web dengan asisten AI, diimplementasikan sebagai aplikasi Next.js.
aplikasi terminal , penguraian PDF , indeks vektor dalam memori , pembuatan augmented pengambilan , penyematan dokumen hipotetis
Ajukan pertanyaan tentang dokumen PDF dan dapatkan jawaban dari dokumen tersebut.
Aplikasi Next.js , pembuatan gambar , transkripsi , streaming objek , OpenAI , Stability AI , Ollama
Contoh penggunaan modelfusion dengan Next.js 14 (App Router):
Streaming Ucapan , OpenAI , streaming Elevenlabs , Vite , Fastify , modelfusion Server
Jika diberi perintah, server mengembalikan respons aliran teks dan ucapan.
aplikasi terminal , agen , BabyAGI
Implementasi TypeScript dari BabyAGI klasik dan BabyBeeAGI.
aplikasi terminal , agen ReAct , GPT-4 , fungsi OpenAI , alat
Dapatkan jawaban atas pertanyaan dari Wikipedia, misal “Siapa yang lahir pertama, Einstein atau Picasso?”
aplikasi terminal , agen , alat , GPT-4
Agen kecil yang memecahkan masalah matematika sekolah menengah. Ini menggunakan alat kalkulator untuk menyelesaikan masalah.
aplikasi terminal , penguraian PDF , ekstraksi informasi rekursif , indeks vektor memori, pengambilan contoh _style , OpenAI GPT-4 , perhitungan biaya
Ekstrak informasi tentang suatu topik dari PDF dan tulis tweet dengan gaya Anda sendiri tentang topik tersebut.
Cloudflare , OpenAI
Hasilkan teks di Cloudflare Worker menggunakan modelfusion dan OpenAI.
Baca panduan kontribusi modelfusion untuk mempelajari proses pengembangan, cara mengusulkan perbaikan bug dan peningkatan, serta cara membuat dan menguji perubahan Anda.