用于构建 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贡献指南,了解开发过程、如何提出错误修复和改进,以及如何构建和测试您的更改。