route.ts 1.16 KB
Newer Older
Jeffrey Morgan's avatar
Jeffrey Morgan committed
1
2
3
4
5
6
import { NextResponse } from 'next/server'
import semver from 'semver'

export async function GET(req: Request) {
  const { searchParams } = new URL(req.url)

7
8
  const os = searchParams.get('os') || 'darwin'
  const version = searchParams.get('version') || '0.0.0'
Jeffrey Morgan's avatar
Jeffrey Morgan committed
9

Jeffrey Morgan's avatar
Jeffrey Morgan committed
10
11
12
13
  if (!version) {
    return new Response('not found', { status: 404 })
  }

14
15
16
17
18
19
20
21
22
  const res = await fetch('https://api.github.com/repos/jmorganca/ollama/releases', { next: { revalidate: 60 } })
  const data = await res.json()

  if (data.length === 0) {
    return new Response('not found', { status: 404 })
  }

  const latest = data[0]
  const assets = latest.assets || []
Jeffrey Morgan's avatar
Jeffrey Morgan committed
23

24
25
26
  if (assets.length === 0) {
    return new Response('not found', { status: 404 })
  }
Jeffrey Morgan's avatar
Jeffrey Morgan committed
27

28
29
  // todo: get the correct asset for the current arch/os
  const asset = assets.find((a: any) => a.name.toLowerCase().includes(os) && a.name.toLowerCase().includes('.zip'))
Jeffrey Morgan's avatar
Jeffrey Morgan committed
30

31
32
33
  if (!asset) {
    return new Response('not found', { status: 404 })
  }
Jeffrey Morgan's avatar
Jeffrey Morgan committed
34

35
  console.log(asset)
Jeffrey Morgan's avatar
Jeffrey Morgan committed
36

37
38
  if (semver.lt(version, latest.tag_name)) {
    return NextResponse.json({ version: data.tag_name, url: asset.browser_download_url })
Jeffrey Morgan's avatar
Jeffrey Morgan committed
39
  }
40
41

  return new Response(null, { status: 204 })
Jeffrey Morgan's avatar
Jeffrey Morgan committed
42
}