用於建立 AI 應用程式的 TypeScript 程式庫。
簡介 |快速安裝 |用途 |文檔 |範例 |貢獻 | modelfusion .dev
重要的
modelfusion已加入 Vercel 並正在整合到 Vercel AI SDK 中。我們將modelfusion的最佳部分引入 Vercel AI SDK,從文字生成、結構化物件生成和工具呼叫開始。請查看AI SDK以了解最新進展。
modelfusion是一個抽象層,用於將 AI 模型整合到 JavaScript 和 TypeScript 應用程式中,統一用於文字流、物件生成和工具使用等常見操作的 API。它提供了支援生產環境的功能,包括可觀察性掛鉤、日誌和自動重試。您可以使用modelfusion來建立 AI 應用程式、聊天機器人和代理程式。
npm install modelfusion
或使用入門範本:
提示
基本範例是入門和與文件並行探索的好方法。您可以在範例/基本資料夾中找到它們。
您可以使用環境變數(例如OPENAI_API_KEY
)為不同的整合提供 API 金鑰,或將它們作為選項傳遞到模型建構函數中。
使用語言模型和提示來產生文字。如果模型支持,您可以串流傳輸文字。如果模型支援(例如使用 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." ,
} ) ;
提供者:十一實驗室、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
}
提供者:十一個實驗室
將語音(音訊)資料轉錄為文字。也稱為語音轉文字 (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
工具是可以由 AI 模型執行的功能(以及相關元資料)。它們對於建立聊天機器人和代理非常有用。
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、Pinecone
您可以在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 | ✅ |
穩定 | ✅ |
當您將fullResponse
參數設為true
時, modelfusion模型函數會傳回豐富的回應,其中包括原始(原始)回應和元資料。
// 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 、串流、中止處理
與 AI 助理進行網路聊天,作為 Next.js 應用程式實作。
終端應用程序, PDF解析,記憶體向量索引,檢索增強生成,假設文件嵌入
詢問有關 PDF 文件的問題並從文件中獲取答案。
Next.js 應用程式、影像生成、轉錄、物件流、 OpenAI 、 Stability AI 、 Ollama
將modelfusion與 Next.js 14(App Router)結合使用的範例:
語音串流、 OpenAI 、 Elevenlabs串流、 Vite 、 Fastify 、 modelfusion Server
給予提示後,伺服器會傳回文字和語音流回應。
終端應用程式,代理, BabyAGI
BabyAGI 經典和 BabyBeeAGI 的 TypeScript 實作。
終端應用程式, ReAct 代理程式, GPT-4 , OpenAI 功能,工具
從維基百科獲取問題的答案,例如“誰先出生,愛因斯坦還是畢卡索?”
終端應用,代理,工具, GPT-4
解決中學數學問題的小代理。它使用計算器工具來解決問題。
終端應用程序, PDF解析,遞歸資訊擷取,記憶體向量索引,_style範例檢索, OpenAI GPT-4 ,成本計算
從 PDF 中提取有關某個主題的信息,並以您自己的風格撰寫有關該主題的推文。
雲flare
使用modelfusion和 OpenAI 在 Cloudflare Worker 上產生文字。
閱讀modelfusion貢獻指南,了解開發流程、如何提出錯誤修復和改進,以及如何建置和測試您的變更。