package router import ( "net/http" "time" "github.com/mostlygeek/llama-swap/internal/logmon" "github.com/mostlygeek/llama-swap/internal/process" "github.com/mostlygeek/llama-swap/internal/shared" ) var ( ErrNoRouterFound = shared.ErrNoRouterFound ErrNoPeerModelFound = shared.ErrNoPeerModelFound ErrNoLocalModelFound = shared.ErrNoLocalModelFound ) type Router interface { // Shutdown blocks until the router has shutdown returning nil // when the router has shutdown successfully. // // timeout controls how long to wait for inflight requests to finish. After // the timeout all inflight requests will be cancelled. Shutdown(timeout time.Duration) error // ServeHTTP implements the http.Handler and requests coming in will // trigger any model swapping and routing logic. ServeHTTP(http.ResponseWriter, *http.Request) // Handles reports whether this router can serve requests for the given model. Handles(model string) bool } // LocalRouter is a Router backed by local processes whose state can be // inspected and which can be individually stopped. Peer routers, which only // forward to remote hosts, do not implement it. type LocalRouter interface { Router // RunningModels returns the current state of every process that is not // stopped or shut down, keyed by model ID. RunningModels() map[string]process.ProcessState // Unload stops the named models, or every running model when none are // named. It blocks until each targeted process has stopped. Unload(timeout time.Duration, models ...string) // ProcessLogger returns the log monitor for the named model's process. // modelID must be a real (non-alias) config key. Returns false when the // model is not known to this router. ProcessLogger(modelID string) (*logmon.Monitor, bool) }