Add Ollama SDK with Core Functionality and Documentation
- Introduced the Ollama SDK, providing a comprehensive interface for interacting with Ollama AI models, including text generation, chat conversations, embeddings, and model management. - Implemented core components such as Client, Config, and various request/response entities to facilitate API interactions. - Added structured error handling with specific error types for improved clarity and debugging. - Included a README and usage guide to assist developers in integrating the SDK into their applications, ensuring a smooth onboarding experience. - Established a fluent API for chat interactions and streaming responses, enhancing usability and flexibility for developers.
This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
package ollama
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"tm/pkg/logger"
|
||||
)
|
||||
|
||||
// SDK provides a high-level interface for the Ollama service
|
||||
type SDK struct {
|
||||
service OllamaService
|
||||
client *Client
|
||||
config *Config
|
||||
}
|
||||
|
||||
// New creates a new Ollama SDK with the provided configuration and logger
|
||||
func New(config *Config, logger logger.Logger) (*SDK, error) {
|
||||
if config == nil {
|
||||
config = DefaultConfig()
|
||||
}
|
||||
|
||||
client, err := NewClient(config, logger)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create ollama client: %w", err)
|
||||
}
|
||||
|
||||
service := NewService(client)
|
||||
|
||||
return &SDK{
|
||||
service: service,
|
||||
client: client,
|
||||
config: config,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// NewWithClient creates a new Ollama SDK with a custom HTTP client
|
||||
func NewWithClient(config *Config, httpClient *http.Client, logger logger.Logger) (*SDK, error) {
|
||||
if config == nil {
|
||||
config = DefaultConfig()
|
||||
}
|
||||
|
||||
client, err := NewClientWithHTTPClient(config, httpClient, logger)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create ollama client: %w", err)
|
||||
}
|
||||
|
||||
service := NewService(client)
|
||||
|
||||
return &SDK{
|
||||
service: service,
|
||||
client: client,
|
||||
config: config,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Generate generates text using a specified model and prompt
|
||||
func (s *SDK) Generate(ctx context.Context, req *GenerateRequest) (*GenerateResponse, error) {
|
||||
return s.service.Generate(ctx, req)
|
||||
}
|
||||
|
||||
// GenerateWithOptions generates text with additional options
|
||||
func (s *SDK) GenerateWithOptions(ctx context.Context, req *GenerateRequest, opts *GenerateOptions) (*GenerateResponse, error) {
|
||||
return s.service.GenerateWithOptions(ctx, req, opts)
|
||||
}
|
||||
|
||||
// Chat performs a conversational chat with the model
|
||||
func (s *SDK) Chat(ctx context.Context, req *ChatRequest) (*ChatResponse, error) {
|
||||
return s.service.Chat(ctx, req)
|
||||
}
|
||||
|
||||
// Embed generates embeddings for the given text
|
||||
func (s *SDK) Embed(ctx context.Context, req *EmbedRequest) (*EmbedResponse, error) {
|
||||
return s.service.Embed(ctx, req)
|
||||
}
|
||||
|
||||
// PullModel pulls a model from the registry
|
||||
func (s *SDK) PullModel(ctx context.Context, model string) (*PullResponse, error) {
|
||||
return s.service.PullModel(ctx, model)
|
||||
}
|
||||
|
||||
// ListModels lists available models
|
||||
func (s *SDK) ListModels(ctx context.Context) (*ListModelsResponse, error) {
|
||||
return s.service.ListModels(ctx)
|
||||
}
|
||||
|
||||
// DeleteModel deletes a model
|
||||
func (s *SDK) DeleteModel(ctx context.Context, model string) (*DeleteResponse, error) {
|
||||
return s.service.DeleteModel(ctx, model)
|
||||
}
|
||||
|
||||
// ShowModel shows model information
|
||||
func (s *SDK) ShowModel(ctx context.Context, model string) (*ShowModelResponse, error) {
|
||||
return s.service.ShowModel(ctx, model)
|
||||
}
|
||||
|
||||
// Health checks if the Ollama service is available
|
||||
func (s *SDK) Health(ctx context.Context) error {
|
||||
return s.service.Health(ctx)
|
||||
}
|
||||
|
||||
// NewChatBuilder creates a new chat builder for conversational interactions
|
||||
func (s *SDK) NewChatBuilder() ChatBuilder {
|
||||
return s.service.NewChatBuilder()
|
||||
}
|
||||
|
||||
// QuickGenerate is a convenience method for simple text generation
|
||||
func (s *SDK) QuickGenerate(ctx context.Context, prompt string) (string, error) {
|
||||
req := &GenerateRequest{
|
||||
Model: s.config.DefaultModel,
|
||||
Prompt: prompt,
|
||||
}
|
||||
|
||||
resp, err := s.Generate(ctx, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return resp.Response, nil
|
||||
}
|
||||
|
||||
// QuickGenerateWithModel is a convenience method for text generation with a specific model
|
||||
func (s *SDK) QuickGenerateWithModel(ctx context.Context, model, prompt string) (string, error) {
|
||||
req := &GenerateRequest{
|
||||
Model: model,
|
||||
Prompt: prompt,
|
||||
}
|
||||
|
||||
resp, err := s.Generate(ctx, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return resp.Response, nil
|
||||
}
|
||||
|
||||
// QuickChat is a convenience method for simple chat interactions
|
||||
func (s *SDK) QuickChat(ctx context.Context, userMessage string) (string, error) {
|
||||
req := &ChatRequest{
|
||||
Model: s.config.DefaultModel,
|
||||
Messages: []Message{
|
||||
{
|
||||
Role: MessageRoleUser,
|
||||
Content: userMessage,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := s.Chat(ctx, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return resp.Message.Content, nil
|
||||
}
|
||||
|
||||
// QuickChatWithSystem is a convenience method for chat with system prompt
|
||||
func (s *SDK) QuickChatWithSystem(ctx context.Context, systemPrompt, userMessage string) (string, error) {
|
||||
req := &ChatRequest{
|
||||
Model: s.config.DefaultModel,
|
||||
Messages: []Message{
|
||||
{
|
||||
Role: MessageRoleSystem,
|
||||
Content: systemPrompt,
|
||||
},
|
||||
{
|
||||
Role: MessageRoleUser,
|
||||
Content: userMessage,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := s.Chat(ctx, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return resp.Message.Content, nil
|
||||
}
|
||||
|
||||
// QuickEmbed is a convenience method for generating embeddings
|
||||
func (s *SDK) QuickEmbed(ctx context.Context, text string) ([]float64, error) {
|
||||
req := &EmbedRequest{
|
||||
Model: s.config.DefaultModel,
|
||||
Prompt: text,
|
||||
}
|
||||
|
||||
resp, err := s.Embed(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resp.Embedding, nil
|
||||
}
|
||||
|
||||
// StreamGenerate performs streaming text generation
|
||||
func (s *SDK) StreamGenerate(ctx context.Context, req *GenerateRequest, onChunk func(string) error) error {
|
||||
// Force streaming
|
||||
stream := true
|
||||
req.Stream = &stream
|
||||
|
||||
return s.client.StreamGenerate(ctx, req, func(chunk *StreamChunk) error {
|
||||
if chunk.Response != "" {
|
||||
return onChunk(chunk.Response)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// StreamChat performs streaming chat
|
||||
func (s *SDK) StreamChat(ctx context.Context, req *ChatRequest, onChunk func(string) error) error {
|
||||
// Force streaming
|
||||
stream := true
|
||||
req.Stream = &stream
|
||||
|
||||
return s.client.StreamChat(ctx, req, func(chunk *StreamChunk) error {
|
||||
if chunk.Message != nil && chunk.Message.Content != "" {
|
||||
return onChunk(chunk.Message.Content)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// GetService returns the underlying service for advanced usage
|
||||
func (s *SDK) GetService() OllamaService {
|
||||
return s.service
|
||||
}
|
||||
|
||||
// GetConfig returns the current configuration
|
||||
func (s *SDK) GetConfig() *Config {
|
||||
return s.config
|
||||
}
|
||||
Reference in New Issue
Block a user