Error: 404 Client Error: Not Found for url: http://localhost:11434/api/generate

该报错通常发生在调用 Ollama 的 /api/generate 接口时使用了 GET 请求而非 POST 请求。优先排查你的应用或脚本中实际发出的 HTTP 方法是否为 POST,并确认请求体(JSON 数据)是否正确携带。

快速结论:该报错通常发生在调用 Ollama 的 /api/generate 接口时使用了 GET 请求而非 POST 请求。优先排查你的应用或脚本中实际发出的 HTTP 方法是否为 POST,并确认请求体(JSON 数据)是否正确携带。

适用环境:Windows 11、Python 3.13.0、Ollama(llama3.2:latest 模型)、Flask Web 应用、Intel CPU/GPU。

最快修复方案:暂无确认的一步修复方案。但根据 Issue 验证结果,curl 使用 -d 参数时会自动切换为 POST 请求,能够正常返回 200 响应;因此请检查你的 Python 代码中 requests.post() 是否确实发出的是 POST 请求,并确认没有其他中间层或代理将请求转换为 GET。

注意事项:Ollama 维护者指出 GET /api/generate 不是合法端点,返回 404 是预期行为(可能未来会改为返回 405)。Issue 作者尚未确认其 Flask 应用中的具体问题来源,因此若你的代码已使用 POST 仍报错,需要进一步检查应用层的请求转发或代理配置。

问题场景

用户在 Windows 11 系统上使用 Python 3.13.0 运行一个基于 Flask 的 Web 应用,该应用通过 requests.post() 调用本地 Ollama 服务的 http://localhost:11434/api/generate 接口来生成 text-to-SQL 结果。虽然 Ollama 服务本身可以正常运行(curl http://localhost:11434 返回 “Ollama is running”),但应用调用时却抛出了 404 错误。

报错原文

Error: 404 Client Error: Not Found for url: http://localhost:11434/api/generate

原因分析

根据 Issue 中的验证过程,Ollama 的 /api/generate 端点只接受 POST 请求。当使用 curl 直接访问该 URL 而不带 -d 参数时,curl 默认发送 GET 请求,Ollama 返回 404 “404 page not found”。这一行为与你在 Flask 应用中遇到的错误一致。

可能原因包括:

  • 应用或某个中间件/代理将 requests.post() 实际发出的请求转换成了 GET 请求。
  • 应用的请求 URL 拼写错误或路径不正确。
  • 请求在到达 Ollama 前被某个反向代理或网关拦截并重写,导致请求方法或路径被修改。

值得注意的是,Issue 作者复制了用户提供的 Python 代码片段在本地独立运行(非 Flask 环境)时一切正常,说明 Ollama 服务本身没有问题,问题很可能出在 Flask 应用的上下文或环境配置中。

环境排查

  • 确认 Ollama 服务的运行状态和版本(Issue 中未提供具体版本号)。
  • 检查 Python 版本是否为 3.13.0,以及 requests 库版本。
  • 确认 Ollama 服务是否监听在 localhost:11434,且未被防火墙或安全软件拦截。
  • 检查 Flask 应用是否通过代理服务器(如 Nginx、Apache)对外提供服务,如果是,需验证代理配置是否正确转发 POST 请求到 Ollama。

解决步骤

  1. 使用 curl 直接验证 Ollama 接口:
    curl -D - http://localhost:11434/api/generate -d "{\"model\":\"llama3.2:latest\",\"prompt\":\"hi\",\"stream\":false}"
    如果返回 HTTP/1.1 200 OK 以及 JSON 响应,说明 Ollama 本身工作正常。
  2. 在 Flask 应用中添加调试日志,在发起请求前打印请求方法(response.request.method)和完整 URL,确认实际发送的是 POST。
  3. 检查 Flask 应用的路由配置,确保没有将包含 /api/generate 的请求路由到其他处理函数。
  4. 如果 Flask 应用部署在代理后面,检查代理配置(如 Nginx 的 proxy_pass)是否保持了原始请求方法。
  5. 尝试在代码中显式指定请求头和参数,避免使用默认值:
    requests.post(url, json={...}, headers={'Content-Type': 'application/json'})

验证方法

在 Flask 应用中添加打印语句,输出 response.status_coderesponse.text。如果返回 200 且包含模型生成的响应内容,即表示问题已解决。另外,可以通过 Ollama 的服务端日志观察每次请求是否被正确接收并返回 200。

参考来源

ollama/ollama #7689

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21234

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注