

このプロジェクトは、Openaiの新しいStateful Assistants APIの自己ホスト版です。 ?
すべてのAPIルートの定義とタイプは、Openaiの公式Openapi Specから100%自動生成されているため、公式APIとカスタムAPIを切り替えるのに必要なのはbaseURL変更です。 ?
これは、すべてのAPIパラメーター、応答、およびタイプが公式のOpenai APIとワイヤ互換性があることを意味し、それらが自動生成されているという事実は、それらを時間の経過とともに同期させることが比較的簡単であることを意味します。
公式node.js openaiパッケージを使用した例は次のとおりです。
import OpenAI from 'openai'
// The only difference is the `baseURL` pointing to your custom API server
const openai = new OpenAI ( {
baseURL : 'http://localhost:3000'
} )
// Since the custom API is spec-compliant with OpenAI, you can use the sdk normally ?
const assistant = await openai . beta . assistants . create ( {
model : 'gpt-4-1106-preview' ,
instructions : 'You are a helpful assistant.'
} )公式のPython openaiパッケージを使用して同じ例です。
from openai import OpenAI
client = OpenAI (
base_url : "http://localhost:3000"
)
# Now you can use the sdk normally!
# (only file and beta assistant resources are currently supported)
# You can even switch back and forth between the official and custom APIs!
assistant = client . beta . assistants . create (
model = "gpt-4-1106-preview" ,
description = "You are a helpful assistant."
)このプロジェクトは、OpenAI API全体の完全なレクリエーションではないことに注意してください。むしろ、それは新しいアシスタントAPIの州の状態部分のみに焦点を当てています。次のリソースタイプがサポートされています。
アシスタントの仕組みの詳細については、公式Openaiアシスタントガイドを参照してください。
公式のOpenaiアシスタントと100%互換性のある独自のカスタムOpenaiアシスタントを実行できることは、あらゆる種類の有用な可能性を解き放つことができます。
最も重要なことは、Openaiの「GPTストア」がChatGPTの週100mのアクティブユーザーで牽引力を獲得した場合、 OpenAI互換のアシスタントを確実に実行、デバッグ、カスタマイズする能力は、将来的に非常に重要になることです。
OpenaiのGPTと完全に互換性のある将来のアシスタントストアを想像することさえできましたが、GatekeeperとしてOpenaiに依存する代わりに、完全にまたは部分的に分散化される可能性があります。 ?
前提条件:
DEPSのインストール:
pnpm installPrismaタイプをローカルに生成します。
pnpm generatecp .env.example .envDATABASE_URL接続文字列をpostgresbrew install postgresql && brew services start postgresqlnpx prisma db pushを実行する必要がありますOPENAI_API_KEY -Openai API基礎となるチャット完了呼び出しを実行するためのキーbrew install redis && brew services start redisREDIS_HOSTオプション;デフォルトはlocalhostになりますREDIS_PORTオプション;デフォルトは6379ですREDIS_USERNAMEオプション;デフォルトはdefaultになりますREDIS_PASSWORDオプションbrew install localstack/tap/localstack-cli && localstack start -dbrew install minio/stable/minio && minio server /dataS3_BUCKET必須S3_REGIONオプション。デフォルトはautoになりますS3_ENDPOINT必須;例: https://<id>.r2.cloudflarestorage.comACCESS_KEY_ID必須(CloudFlare R2 docs)SECRET_ACCESS_KEY必須(cloudflare r2 docs)このアプリは、RESTFUL APIサーバーとASYNCタスクランナーの2つのサービスで構成されています。どちらのサービスもステートレスであり、水平方向にスケーリングできます。
これらのサービスをローカルで実行するには、2つの方法があります。最速の方法はtsx経由です:
# Start the REST API server in one shell
npx tsx src/server
# Start an async task queue runner in another shell
npx tsx src/runnerまたは、最初にソースTSをJSに透過させることができます。これは、生産で実行するために推奨されます。
pnpm build
# Start the REST API server in one shell
npx tsx dist/server
# Start an async task queue runner in another shell
npx tsx dist/runnerこの例には、カスタムget_weather関数を使用するエンドツーエンドのアシスタントスクリプトが含まれています。
https://api.openai.com/v1でホストされているデフォルトのOpenai APIに対して、node.jsの公式クライアントを使用して実行できます。
npx tsx e2eローカルAPIに対して同じテストスイートを実行するには、実行できます。
OPENAI_API_BASE_URL= ' http://127.0.0.1:3000 ' npx tsx e2e両方のテストスイートが、2つのバージョン間に顕著な違いがなく、公式openai node.jsクライアントを使用してまったく同じアシスタントコードを実行している両方のテストスイートを見るのはかなりクールです。ハザ! ?
この例には、このreadme.mdファイルを添付して組み込みのretrievalツールを添付ファイルとして使用するエンドツーエンドのアシスタントスクリプトが含まれています。
https://api.openai.com/v1でホストされているデフォルトのOpenai APIに対して、node.jsの公式クライアントを使用して実行できます。
npx tsx e2e/retrieval.tsローカルAPIに対して同じテストスイートを実行するには、実行できます。
OPENAI_API_BASE_URL= ' http://127.0.0.1:3000 ' npx tsx e2e/retrieval.tsOpenaiの組み込みの検索実装の違いと、デフォルトの素朴な検索の実装により、出力はわずかに異なる可能性があります。
現在のretrieval実装はtext/plainやマークダウンなどのテキストファイルのみをサポートしていることに注意してください。また、事前処理とは対照的に、常に完全なファイルの内容を返すのではなく、常に完全なファイルコンテンツを返す非常に素朴な検索方法を使用します。詳細については、この問題を参照してください。
GET /files
POST /files
DELETE /files/:file_id
GET /files/:file_id
GET /files/:file_id/content
GET /assistants
POST /assistants
GET /assistants/:assistant_id
POST /assistants/:assistant_id
DELETE /assistants/:assistant_id
GET /assistants/:assistant_id/files
GET /assistants/:assistant_id/files
POST /assistants/:assistant_id/files
DELETE /assistants/:assistant_id/files/:file_id
GET /assistants/:assistant_id/files/:file_id
POST /threads
GET /threads/:thread_id
POST /threads/:thread_id
DELETE /threads/:thread_id
GET /threads/:thread_id/messages
POST /threads/:thread_id/messages
GET /threads/:thread_id/messages/:message_id
POST /threads/:thread_id/messages/:message_id
GET /threads/:thread_id/messages/:message_id/files
GET /threads/:thread_id/messages/:message_id/files/:file_id
GET /threads/:thread_id/runs
POST /threads/runs
POST /threads/:thread_id/runs
GET /threads/:thread_id/runs/:run_id
POST /threads/:thread_id/runs/:run_id
POST /threads/:thread_id/runs/:run_id/submit_tool_outputs
POST /threads/:thread_id/runs/:run_id/cancel
GET /threads/:thread_id/runs/:run_id/steps
GET /threads/:thread_id/runs/:run_id/steps/:step_id
GET /openapi
サーバーを実行してからhttp://127.0.0.1:3000/openapi 3000/openapiにアクセスして、サーバーの自動生成されたOpenapi仕様を表示できます。
ステータス:すべてのAPIルートは、公式Openai APIで並んでテストされており、予想どおりに機能しています。現時点での唯一の不足している機能は、組み込みのcode_interpreterツール(問題)のサポートと、組み込みのretrievalツール(問題)を使用した非テキストファイルのサポートです。他のすべての機能は、公式APIと完全にサポートされ、ワイヤ互換性がある必要があります。
TODO :
code_interpreterツール(問題)retrievalツールを備えた非テキストファイルをサポート(問題)MIT©Travis Fischer
このプロジェクトが便利だと思った場合は、私をスポンサーするか、Twitterで私をフォローしていることを検討してください