diff --git a/api/types.go b/api/types.go index 63b898975..cf8177e54 100644 --- a/api/types.go +++ b/api/types.go @@ -17,6 +17,9 @@ import ( "github.com/ollama/ollama/types/model" ) +// SkillRef is an alias for model.SkillRef representing a skill reference. +type SkillRef = model.SkillRef + // StatusError is an error with an HTTP status code and message. type StatusError struct { StatusCode int @@ -557,6 +560,12 @@ type CreateRequest struct { // Requires is the minimum version of Ollama required by the model. Requires string `json:"requires,omitempty"` + // Skills is a list of skill references for the agent (local paths or registry refs) + Skills []SkillRef `json:"skills,omitempty"` + + // AgentType defines the type of agent (e.g., "conversational", "task-based") + AgentType string `json:"agent_type,omitempty"` + // Info is a map of additional information for the model Info map[string]any `json:"info,omitempty"` @@ -608,6 +617,8 @@ type ShowResponse struct { Capabilities []model.Capability `json:"capabilities,omitempty"` ModifiedAt time.Time `json:"modified_at,omitempty"` Requires string `json:"requires,omitempty"` + Skills []SkillRef `json:"skills,omitempty"` + AgentType string `json:"agent_type,omitempty"` } // CopyRequest is the request passed to [Client.Copy]. diff --git a/envconfig/config.go b/envconfig/config.go index 238e5e6e1..0ff267983 100644 --- a/envconfig/config.go +++ b/envconfig/config.go @@ -148,6 +148,16 @@ func Remotes() []string { return r } +// Skills returns the list of skill directories. Skills directories can be configured via the OLLAMA_SKILLS environment variable. +// Returns empty slice if not configured. +func Skills() []string { + raw := strings.TrimSpace(Var("OLLAMA_SKILLS")) + if raw == "" { + return []string{} + } + return strings.Split(raw, ",") +} + func BoolWithDefault(k string) func(defaultValue bool) bool { return func(defaultValue bool) bool { if s := Var(k); s != "" { @@ -317,6 +327,9 @@ func AsMap() map[string]EnvVar { ret["OLLAMA_VULKAN"] = EnvVar{"OLLAMA_VULKAN", EnableVulkan(), "Enable experimental Vulkan support"} } + // Skills configuration would go here when added + ret["OLLAMA_SKILLS"] = EnvVar{"OLLAMA_SKILLS", Skills(), "Comma-separated list of skill directories"} + return ret } diff --git a/types/model/config.go b/types/model/config.go index 96aec8cb1..e64eb1b79 100644 --- a/types/model/config.go +++ b/types/model/config.go @@ -1,5 +1,13 @@ package model +// SkillRef represents a reference to a skill, either by local path or by registry digest. +type SkillRef struct { + // Name is the local path (for development) or registry name (e.g., "skill/calculator:1.0.0") + Name string `json:"name,omitempty"` + // Digest is the content-addressable digest of the skill blob (e.g., "sha256:abc123...") + Digest string `json:"digest,omitempty"` +} + // ConfigV2 represents the configuration metadata for a model. type ConfigV2 struct { ModelFormat string `json:"model_format"` @@ -20,6 +28,10 @@ type ConfigV2 struct { EmbedLen int `json:"embedding_length,omitempty"` BaseName string `json:"base_name,omitempty"` + // agent-specific fields + Skills []SkillRef `json:"skills,omitempty"` + AgentType string `json:"agent_type,omitempty"` + // required by spec Architecture string `json:"architecture"` OS string `json:"os"`