搭建一个fastapi的项目,调用ollama服务

1. 项目结构

my_project/
│
├── app/
│   ├── main.py            # FastAPI应用的入口
│   ├── services/          # 包含服务逻辑
│   │   └── ollama_service.py
│   ├── models/            # 定义数据模型
│   │   └── response.py
│   ├── utils/             # 工具类,帮助类
│   │   └── file_utils.py
│   └── Dockerfile         # 用于构建应用的 Dockerfile
│
├── docker-compose.yml     # Docker Compose 配置
└── requirements.txt       # Python依赖

2. 代码实现

2.1 app/main.py — FastAPI 应用入口
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
from app.services.ollama_service import get_image_response
from app.utils.file_utils import save_temp_image, remove_temp_image

app = FastAPI()

@app.post("/upload-image/")
async def upload_image(file: UploadFile = File(...)):
    try:
        # 保存上传的图片为临时文件
        tmp_path = await save_temp_image(file)

        # 调用 Ollama 服务处理图片
        response = await get_image_response(tmp_path)

        # 删除临时文件
        await remove_temp_image(tmp_path)

        return JSONResponse(content={"response": response}, status_code=200)

    except Exception as e:
        return JSONResponse(content={"error": str(e)}, status_code=500)
2.2 app/services/ollama_service.py — 处理 Ollama 服务
import ollama

async def get_image_response(image_path: str):
    """调用 Ollama API 获取图像分析结果"""
    response = ollama.chat(
        model='llama3.2-vision',
        messages=[{
            'role': 'user',
            'content': 'What is in this image?',
            'images': [image_path]
        }]
    )
    return response
2.3 app/utils/file_utils.py — 文件操作工具类
import os
from tempfile import NamedTemporaryFile
from fastapi import UploadFile

async def save_temp_image(file: UploadFile):
    """保存上传的图片为临时文件"""
    with NamedTemporaryFile(delete=False, suffix=".jpg") as tmp:
        tmp.write(await file.read())
        tmp_path = tmp.name
    return tmp_path

async def remove_temp_image(file_path: str):
    """删除临时文件"""
    if os.path.exists(file_path):
        os.remove(file_path)
2.4 app/Dockerfile — Docker 文件
# 使用官方 Python 镜像作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制本地的 requirements.txt 并安装依赖
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# 复制本地代码到容器内
COPY ./app /app

# 启动 FastAPI 应用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
2.5 requirements.txt — Python 依赖
fastapi
uvicorn
ollama
python-multipart
2.6 docker-compose.yml — Docker Compose 配置
version: '3.8'

services:
  app:
    build: ./app
    container_name: fastapi-ollama
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    environment:
      - OLLAMA_API_KEY=your_ollama_api_key  # 如果需要,设置 Ollama API 密钥
    depends_on:
      - ollama_api  # 仅在有需要调用 Ollama 服务的情况下

3. 部署流程

  1. 构建 Docker 镜像
    在项目根目录下运行以下命令来构建 Docker 镜像:

    docker-compose build
    
  2. 启动应用
    使用 Docker Compose 启动服务:

    docker-compose up
    

    这会启动 FastAPI 应用,并且在浏览器访问 http://localhost:8000 可以看到 FastAPI 服务正在运行。

  3. 访问上传接口
    使用 Postman 或者任何 HTTP 客户端,向 http://localhost:8000/upload-image/ 发送 POST 请求,上传图像文件,并查看返回的 ollama 结果。

4. 结论

通过这个结构和 Docker Compose 部署方式,项目分层清晰,确保了每个模块的职责单一。main.py 处理 FastAPI 的路由,ollama_service.py 负责与 Ollama 的交互,file_utils.py 负责文件操作,并且整个项目通过 Docker Compose 可以非常方便地部署和管理。

确保在需要调用 Ollama 服务时,有正确的 API 密钥和配置。如果 Ollama 服务本身也需要容器化,你可以在 docker-compose.yml 文件中添加相应的服务配置。

### OllamaFastAPI的集成及使用 #### 集成背景 为了实现更高效的服务部署和管理,在现代微服务架构中,常常会将不同的功能模块通过网关统一管理和路由。对于基于Servlet的应用程序而言,Gateway提供了一种简单而有效的方法来路由到APIs,并提供了诸如安全性、监控/度量以及弹性等横切关注点[^1]。 当涉及到具体的开发框架时,Python社区中的FastAPI因其高性能特性受到了广泛欢迎。与此同时,Ollama作为一个假设性的项目名(如果指的是特定技术栈或工具集,则需具体说明),可能涉及到了某些自动化运维操作或是模型推理优化等方面的工作。 #### 实现方案概述 考虑到上述提到的技术组件,下面给出一种可行的方式来进行OllamaFastAPI之间的集成: ##### 使用`startup.py`作为入口文件启动多个服务实例 可以通过编写类似于`startup.py`的一键启动脚本来简化多服务的同时启动过程。该脚本能够一键启动所有必要的服务,包括但不限于Fastchat服务API服务以及WebUI服务。这不仅提高了工作效率,还减少了人为错误的可能性[^2]。 ```python import subprocess def start_services(): services = [ "fastapi_service", # 假设这是FastAPI应用的名字 "ollama_service" # 这里代表Ollama相关服务 ] processes = [] for service in services: process = subprocess.Popen(["python", f"{service}.py"]) processes.append(process) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Start all required services.") parser.add_argument('-a', action='store_true', help='start all services') args = parser.parse_args() if args.a: start_services() ``` ##### 结合vLLM命令行接口增强API能力 进一步地,利用vLLM提供的CLI工具可以扩展FastAPI应用程序的功能范围。例如,通过调用`vllm serve`可以在本地快速搭建起兼容OpenAI标准协议的API服务器;或者借助于`vllm complete`根据给定提示生成文本补全结果,从而为用户提供更加智能化的回答体验[^3]。 ```bash # 启动vLLM API服务端口监听8000 $ vllm serve --port=8000 & ``` ```python from fastapi import FastAPI, Request import requests app = FastAPI() @app.post("/generate_text/") async def generate_text(request: Request): body = await request.json() response = requests.post( url="http://localhost:8000/v1/completions", json={ "prompt": body.get('input'), "max_tokens": 50, "temperature": 0.7 } ) return {"result": response.text} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值