diff --git a/api/client.go b/api/client.go index 92dcd22b..a1ebdcd4 100644 --- a/api/client.go +++ b/api/client.go @@ -1,3 +1,9 @@ +// Package api implements the client-side API for code wishing to interact +// with the ollama service. The methods of the [Client] type correspond to +// the ollama REST API as described in https://github.com/ollama/ollama/blob/main/docs/api.md +// +// The ollama command-line client itself uses this package to interact with +// the backend service. package api import ( @@ -18,6 +24,8 @@ import ( "github.com/ollama/ollama/version" ) +// Client encapsulates client state for interacting with the ollama +// service. Use [ClientFromEnvironment] to create new Clients. type Client struct { base *url.URL http *http.Client @@ -39,6 +47,15 @@ func checkError(resp *http.Response, body []byte) error { return apiError } +// ClientFromEnvironment creates a new [Client] using configuration from the +// environment variable OLLAMA_HOST, which points to the network host and +// port on which the ollama service is listenting. The format of this variable +// is: +// +// ://: +// +// If the variable is not specified, a default ollama host and port will be +// used. func ClientFromEnvironment() (*Client, error) { defaultPort := "11434" @@ -190,8 +207,14 @@ func (c *Client) stream(ctx context.Context, method, path string, data any, fn f return nil } +// GenerateResponseFunc is a function that [Client.Generate] invokes every time +// a response is received from the service. If this function returns an error, +// [Client.Generate] will stop generating and return this error. type GenerateResponseFunc func(GenerateResponse) error +// Generate generates a response for a given prompt. The req parameter should +// be populated with prompt details. fn is called for each response (there may +// be multiple responses, e.g. in case streaming is enabled). func (c *Client) Generate(ctx context.Context, req *GenerateRequest, fn GenerateResponseFunc) error { return c.stream(ctx, http.MethodPost, "/api/generate", req, func(bts []byte) error { var resp GenerateResponse @@ -203,8 +226,15 @@ func (c *Client) Generate(ctx context.Context, req *GenerateRequest, fn Generate }) } +// ChatResponseFunc is a function that [Client.Chat] invokes every time +// a response is received from the service. If this function returns an error, +// [Client.Chat] will stop generating and return this error. type ChatResponseFunc func(ChatResponse) error +// Chat generates the next message in a chat. [ChatRequest] may contain a +// sequence of messages which can be used to maintain chat history with a model. +// fn is called for each response (there may be multiple responses, e.g. if case +// streaming is enabled). func (c *Client) Chat(ctx context.Context, req *ChatRequest, fn ChatResponseFunc) error { return c.stream(ctx, http.MethodPost, "/api/chat", req, func(bts []byte) error { var resp ChatResponse @@ -216,8 +246,14 @@ func (c *Client) Chat(ctx context.Context, req *ChatRequest, fn ChatResponseFunc }) } +// PullProgressFunc is a function that [Client.Pull] invokes every time there +// is progress with a "pull" request sent to the service. If this function +// returns an error, [Client.Pull] will stop the process and return this error. type PullProgressFunc func(ProgressResponse) error +// Pull downloads a model from the ollama library. fn is called each time +// progress is made on the request and can be used to display a progress bar, +// etc. func (c *Client) Pull(ctx context.Context, req *PullRequest, fn PullProgressFunc) error { return c.stream(ctx, http.MethodPost, "/api/pull", req, func(bts []byte) error { var resp ProgressResponse diff --git a/api/types.go b/api/types.go index 14ffd1c2..2e762b39 100644 --- a/api/types.go +++ b/api/types.go @@ -33,18 +33,46 @@ func (e StatusError) Error() string { type ImageData []byte +// GenerateRequest describes a request sent by [Client.Generate]. While you +// have to specify the Model and Prompt fields, all the other fields have +// reasonable defaults for basic uses. type GenerateRequest struct { - Model string `json:"model"` - Prompt string `json:"prompt"` - System string `json:"system"` - Template string `json:"template"` - Context []int `json:"context,omitempty"` - Stream *bool `json:"stream,omitempty"` - Raw bool `json:"raw,omitempty"` - Format string `json:"format"` - KeepAlive *Duration `json:"keep_alive,omitempty"` - Images []ImageData `json:"images,omitempty"` + // Model is the model name; it should be a name familiar to Ollama from + // the library at https://ollama.com/library + Model string `json:"model"` + // Prompt is the textual prompt to send to the model. + Prompt string `json:"prompt"` + + // System overrides the model's default system message/prompt. + System string `json:"system"` + + // Template overrides the model's default prompt template. + Template string `json:"template"` + + // Context is the context parameter returned from a previous call to + // Generate call. It can be used to keep a short conversational memory. + Context []int `json:"context,omitempty"` + + // Stream specifies whether the response is streaming; it is true by default. + Stream *bool `json:"stream,omitempty"` + + // Raw set to true means that no formatting will be applied to the prompt. + Raw bool `json:"raw,omitempty"` + + // Format specifies the format to return a response in. + Format string `json:"format"` + + // KeepAlive controls how long the model will stay loaded in memory following + // this request. + KeepAlive *Duration `json:"keep_alive,omitempty"` + + // Images is an optional list of base64-encoded images accompanying this + // request, for multimodal models. + Images []ImageData `json:"images,omitempty"` + + // Options lists model-specific options. For example, temperature can be + // set through this field, if the model supports it. Options map[string]interface{} `json:"options"` }