route.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { NextResponse } from 'next/server'
  2. import semver from 'semver'
  3. export async function GET(req: Request) {
  4. const { searchParams } = new URL(req.url)
  5. const os = searchParams.get('os') || 'darwin'
  6. const version = searchParams.get('version') || '0.0.0'
  7. if (!version) {
  8. return new Response('not found', { status: 404 })
  9. }
  10. const res = await fetch('https://api.github.com/repos/jmorganca/ollama/releases', { next: { revalidate: 60 } })
  11. const data = await res.json()
  12. if (data.length === 0) {
  13. return new Response('not found', { status: 404 })
  14. }
  15. const latest = data[0]
  16. const assets = latest.assets || []
  17. if (assets.length === 0) {
  18. return new Response('not found', { status: 404 })
  19. }
  20. // todo: get the correct asset for the current arch/os
  21. const asset = assets.find((a: any) => a.name.toLowerCase().includes(os) && a.name.toLowerCase().includes('.zip'))
  22. if (!asset) {
  23. return new Response('not found', { status: 404 })
  24. }
  25. console.log(asset)
  26. if (semver.lt(version, latest.tag_name)) {
  27. return NextResponse.json({ version: data.tag_name, url: asset.browser_download_url })
  28. }
  29. return new Response(null, { status: 204 })
  30. }