I. Estrutura do catálogo
do notebook do repositório:
fastapi_chat_app/
│
├── app.py
├── websocket_handler.py
├── static/
│ └── index.html
└── requirements.txt
app.py
A configuração e o roteamento principais dos aplicativos FastAPI.websocket_handler.py
Manipula conexões WebSocket e fluxos de mensagens.static/index.html
Página HTML.requirements.txt
Dependências necessárias, instaladas via pip install -r requirements.txt.
II - Clonagem desse depósito
git clone https://github.com/AXYZdong/handy-ollama
III. instalação de dependências
pip install -r requirements.txt
IV. código principal
app.py
O código principal do arquivo é o seguinte:
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连接
Aceita uma conexão WebSocket:
await websocket.accept()
Primeiro, a função aceita uma solicitação de conexão WebSocket do cliente e estabelece um canal de comunicação com o cliente.
Receber entrada do usuário:
user_input = await websocket.receive_text()
Mensagem de texto: Recebe uma mensagem de texto do cliente via WebSocket para obter a entrada do usuário.
Inicializar o fluxo de diálogo:
stream = ollama.chat(...)
Chamada do método chat da biblioteca ollama, especificando que o modelo usado é o llama3.1. Passe a entrada do usuário como uma mensagem para o modelo e ative o streaming (stream=True) para obter a resposta gerada pelo modelo de forma incremental.
Processamento da saída do modelo:
for chunk in stream
Iteração sobre os blocos de dados transmitidos pelo modelo.model_output = chunk['message']['content']
Extraia o conteúdo textual gerado pelo modelo de cada bloco de dados.await websocket.send_text(model_output)
Resposta do modelo extraído: envia as respostas do modelo extraído de volta ao cliente via WebSocket para diálogo em tempo real.
Tratamento de exceções:
except Exception as e
Se ocorrer alguma exceção durante o processamento (por exemplo, problema de rede, erro de modelo etc.), capture a exceção e envie uma mensagem de erro via WebSocket para informar ao cliente que ocorreu um erro.
Feche a conexão WebSocket:
finally
Independentemente de ocorrer ou não uma exceção, é garantido que a conexão WebSocket seja fechada para liberar recursos e encerrar a sessão.
V. Executando o aplicativo
- No diretório (
fastapi_chat_app/
); - Execute o arquivo app.py.
uvicorn app:app --reload
Abrir página.
Saída normal exibida em segundo plano.