カタログ構成
フォルダに保存されます:
fastapi_chat_app/
│
├── app.py
├── websocket_handler.py
├── static/
│ └── index.html
└── requirements.txt
app.py
FastAPI アプリケーションの主なセットアップとルーティング。websocket_handler.py
WebSocket 接続とメッセージストリームを処理します。static/index.html
HTMLページ。requirements.txt
pip install -r requirements.txtによってインストールされる、必要な依存関係。
II.この倉庫のクローン化
git clone https://github.com/AXYZdong/handy-ollama
III.依存関係のインストール
pip install -r requirements.txt
IV.コア・コード
app.py
ファイル内のコア・コードは以下の通り:
import ollama
from fastapi import WebSocket
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept() # 接受WebSocket连接
user_input = await websocket.receive_text() # 接收用户输入的文本消息
stream = ollama.chat( # 使用ollama库与指定模型进行对话
model='llama3.1', # 指定使用的模型为llama3.1
messages=[{'role': 'user', 'content': user_input}], # 传入用户的输入消息
stream=True # 启用流式传输
)
try:
for chunk in stream: # 遍历流式传输的结果
model_output = chunk['message']['content'] # 获取模型输出的内容
await websocket.send_text(model_output) # 通过WebSocket发送模型输出的内容
except Exception as e: # 捕获异常
await websocket.send_text(f"Error: {e}") # 通过WebSocket发送错误信息
finally:
await websocket.close() # 关闭WebSocket连接
WebSocket接続を受け付ける:
await websocket.accept()
まず、クライアントからのWebSocket接続要求を受け付け、クライアントとの通信チャネルを確立します。
ユーザーの入力を受け取る:
user_input = await websocket.receive_text()
: WebSocket経由でクライアントからテキストメッセージを受信し、ユーザー入力を取得する。
ダイアログストリームを初期化する:
stream = ollama.chat(...)
ユーザー入力をメッセージとしてモデルに渡し、ストリーミングを有効にして(stream=True)モデルが生成した応答をインクリメンタルに取得します。
モデルの出力を処理する:
for chunk in stream
モデルからストリームされたデータブロックに対して反復処理を行う。model_output = chunk['message']['content']
各データブロックからモデルが生成したテキストコンテンツを抽出します。await websocket.send_text(model_output)
抽出されたモデルのレスポンスをWebSocket経由でクライアントに送信し、リアルタイムで対話します。
例外処理:
except Exception as e
処理中に例外が発生した場合(ネットワークの問題、モデルのエラーなど)、例外をキャッチして WebSocket 経由でエラーメッセージを送信し、エラーが発生したことをクライアントに通知します。
WebSocket接続を閉じる:
finally
例外が発生してもしなくても、最終的には WebSocket 接続を閉じてリソースを解放し、セッションを終了します。
V. アプリの実行
- ディレクトリ(
fastapi_chat_app/
); - app.py ファイルを実行します。
uvicorn app:app --reload
ページを開く。
背景に表示される通常の出力。