| package ollama |
|
|
| import ( |
| "ds2api/internal/config" |
| "ds2api/internal/util" |
| "encoding/json" |
| "github.com/go-chi/chi/v5" |
| "log/slog" |
| "net/http" |
| ) |
|
|
| var WriteJSON = util.WriteJSON |
|
|
| type ConfigReader interface { |
| ModelAliases() map[string]string |
| } |
|
|
| type Handler struct { |
| Store ConfigReader |
| } |
|
|
| type OllamaModelRequest struct { |
| Model string `json:"model"` |
| } |
|
|
| func RegisterRoutes(r chi.Router, h *Handler) { |
| r.Get("/api/version", h.GetVersion) |
| r.Get("/api/tags", h.ListOllamaModels) |
| r.Post("/api/show", h.GetOllamaModel) |
| } |
|
|
| func (h *Handler) GetVersion(w http.ResponseWriter, r *http.Request) { |
| w.Header().Set("Content-Type", "application/json") |
| w.WriteHeader(http.StatusOK) |
| _, _ = w.Write([]byte(`{"version":"0.23.1"}`)) |
| } |
| func (h *Handler) ListOllamaModels(w http.ResponseWriter, r *http.Request) { |
| WriteJSON(w, http.StatusOK, config.OllamaModelsResponse()) |
| } |
| func (h *Handler) GetOllamaModel(w http.ResponseWriter, r *http.Request) { |
| var payload OllamaModelRequest |
| if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { |
| http.Error(w, "Invalid JSON body: "+err.Error(), http.StatusBadRequest) |
| return |
| } |
| defer func() { |
| if err := r.Body.Close(); err != nil { |
| slog.Warn("[ollama] failed to close request body", "error", err) |
| } |
| }() |
| modelID := payload.Model |
| model, ok := config.OllamaModelByID(h.Store, modelID) |
| if !ok { |
| http.Error(w, "Model not found.", http.StatusNotFound) |
| return |
| } |
| WriteJSON(w, http.StatusOK, model) |
| } |
|
|