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
または、スターター テンプレートを使用します。
ヒント
基本的な例は、ドキュメントと並行して作業を開始し、検討するのに最適な方法です。これらは、examples/basic フォルダーにあります。
環境変数 (例: 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 | ✅ |
安定性 | ✅ |
modelfusionモデル関数は、 fullResponse
引数を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オブザーバー フレームワークとロギングのサポートを提供します。実行と呼び出し階層を簡単にトレースでき、独自のオブザーバーを追加できます。
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 は、就学前の子供向けに短い音声ストーリーを作成する探索的な Web アプリケーションです。
Next.js アプリ、 OpenAI GPT-3.5-turbo 、ストリーミング、中止処理
Next.js アプリとして実装された AI アシスタントとの Web チャット。
ターミナルアプリ、 PDF解析、メモリ内ベクトルインデックス、検索拡張生成、仮想ドキュメント埋め込み
PDF ドキュメントについて質問し、ドキュメントから回答を得ます。
Next.js アプリ、画像生成、文字起こし、オブジェクトストリーミング、 OpenAI 、 Stability AI 、 Ollama
Next.js 14 (App Router) でのmodelfusionの使用例:
音声ストリーミング、 OpenAI 、イレブンラボストリーミング、 Vite 、 Fastify 、 modelfusionサーバー
プロンプトが与えられると、サーバーはテキストと音声ストリームの両方の応答を返します。
ターミナルアプリ、エージェント、 BabyAGI
BabyAGI クラシックと BabyBeeAGI の TypeScript 実装。
ターミナルアプリ, ReActエージェント, GPT-4 , OpenAI機能,ツール
ウィキペディアから質問への答えを入手します。例: 「アインシュタインとピカソ、どちらが先に生まれましたか?」
ターミナルアプリ、エージェント、ツール、 GPT-4
中学生の数学の問題を解決する小規模エージェント。計算ツールを使用して問題を解決します。
ターミナルアプリ、 PDF解析、再帰的情報抽出、メモリ内ベクトルインデックス、_styleサンプル取得、 OpenAI GPT-4 、コスト計算
PDF からトピックに関する情報を抽出し、それについて独自のスタイルでツイートを作成します。
クラウドフレア、 OpenAI
modelfusionと OpenAI を使用して Cloudflare Worker 上でテキストを生成します。
modelfusion貢献ガイドを読んで、開発プロセス、バグ修正と改善を提案する方法、変更をビルドしてテストする方法について学びます。