Files
tm_back/pkg/glm
n.nakhostin a5d3a94c97 Add GLM SDK Implementation
- Introduced a new GLM SDK for interacting with the GLM (Zhipu AI) API, designed for chat completions and text generation tasks.
- Implemented core components including Client, Service, and SDK layers following Clean Architecture principles.
- Added configuration management, error handling, and structured logging for improved usability and maintainability.
- Included comprehensive documentation and usage examples to facilitate integration and understanding of the SDK's functionality.
- Enhanced the API with features such as chat completion, streaming responses, and model management, ensuring robust interaction with the GLM service.
2025-11-04 16:09:44 +03:30
..
2025-11-04 16:09:44 +03:30
2025-11-04 16:09:44 +03:30
2025-11-04 16:09:44 +03:30
2025-11-04 16:09:44 +03:30
2025-11-04 16:09:44 +03:30
2025-11-04 16:09:44 +03:30
2025-11-04 16:09:44 +03:30
2025-11-04 16:09:44 +03:30
2025-11-04 16:09:44 +03:30

GLM SDK

A Go SDK for interacting with the GLM (Zhipu AI) API, specifically designed for chat completions and text generation tasks.

Features

  • Chat Completions: Perform conversational AI interactions
  • Streaming Support: Real-time streaming responses
  • Translation Helper: Built-in convenience methods for translation tasks
  • Model Management: List available models
  • Health Checks: Service availability monitoring
  • Retry Logic: Automatic retry with configurable attempts
  • Structured Logging: Comprehensive logging support
  • Error Handling: Detailed error types and handling

Installation

go get tm/pkg/glm

Quick Start

package main

import (
    "context"
    "log"
    "tm/pkg/glm"
    "tm/pkg/logger"
)

func main() {
    // Create configuration
    config := &glm.Config{
        APIKey: "your-api-key-here",
        BaseURL: "https://api.z.ai",
    }

    // Create logger (you can use your preferred logger)
    logger := logger.NewLogger()

    // Create SDK instance
    sdk, err := glm.New(config, logger)
    if err != nil {
        log.Fatal(err)
    }

    // Simple chat
    ctx := context.Background()
    response, err := sdk.QuickChat(ctx, "Hello, how are you?")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(response)

    // Translation example (matching the provided curl request)
    translated, err := sdk.Translate(ctx, "IT-stöd för projekt- och portföljstyrning", "Swedish", "English")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(translated)
}

Configuration

config := &glm.Config{
    BaseURL:                "https://api.z.ai",        // API base URL
    APIKey:                 "your-api-key",            // Authentication key
    Timeout:                300 * time.Second,         // Request timeout
    RetryAttempts:          3,                         // Number of retries
    RetryDelay:             2 * time.Second,           // Delay between retries
    EnableLogging:          true,                      // Enable request logging
    UserAgent:              "MyApp/1.0",               // Custom user agent
    DefaultModel:           "glm-4.5",                 // Default model
    DefaultMaxTokens:       4096,                      // Default max tokens
    DefaultTopP:            1.0,                       // Default top_p
    DefaultTemperature:     0.7,                       // Default temperature
    EnableStreaming:        false,                     // Enable streaming by default
    EnableThinking:         false,                     // Enable thinking mode
}

API Methods

Chat Completion

req := &glm.ChatCompletionRequest{
    Model: "glm-4.5",
    Messages: []glm.Message{
        {
            Role:    glm.MessageRoleSystem,
            Content: "You are a helpful assistant.",
        },
        {
            Role:    glm.MessageRoleUser,
            Content: "Explain quantum computing.",
        },
    },
    MaxTokens:        4096,
    TopP:             1.0,
    Temperature:      0.7,
    FrequencyPenalty: 0,
    PresencePenalty:  0,
    Thinking: &glm.Thinking{
        Type: "false",
    },
}

resp, err := sdk.ChatCompletion(ctx, req)
if err != nil {
    log.Fatal(err)
}

fmt.Println(resp.Choices[0].Message.Content)

Streaming Chat Completion

req := &glm.ChatCompletionRequest{
    Model: "glm-4.5",
    Messages: []glm.Message{
        {
            Role:    glm.MessageRoleUser,
            Content: "Tell me a long story.",
        },
    },
    Stream: true,
}

err := sdk.StreamChatCompletion(ctx, req, func(chunk *glm.StreamChatCompletionResponse) error {
    if len(chunk.Choices) > 0 {
        fmt.Print(chunk.Choices[0].Delta.Content)
    }
    return nil
})

Convenience Methods

// Simple chat
response, err := sdk.QuickChat(ctx, "Hello!")

// Chat with system prompt
response, err := sdk.QuickChatWithSystem(ctx, "You are a poet.", "Write a haiku about coding.")

// Translation (matching the curl example)
translated, err := sdk.Translate(ctx, "IT-stöd för projekt- och portföljstyrning", "Swedish", "English")

// Streaming chat
err := sdk.StreamQuickChat(ctx, "Tell me a story", func(chunk string) error {
    fmt.Print(chunk)
    return nil
})

Error Handling

The SDK provides detailed error types:

resp, err := sdk.ChatCompletion(ctx, req)
if err != nil {
    var glmErr *glm.Error
    if errors.As(err, &glmErr) {
        switch glmErr.Code {
        case glm.ErrCodeAuthentication:
            // Handle auth errors
        case glm.ErrCodeRateLimit:
            // Handle rate limits
        case glm.ErrCodeServerError:
            // Handle server errors
        }
    }
}

Environment Variables

You can configure the SDK using environment variables:

export GLM_BASE_URL="https://api.z.ai"
export GLM_API_KEY="your-api-key"
export GLM_TIMEOUT="300s"
export GLM_RETRY_ATTEMPTS="3"
export GLM_DEFAULT_MODEL="glm-4.5"
export GLM_DEFAULT_MAX_TOKENS="4096"

Testing

go test ./pkg/glm/...

License

This SDK is part of the Tender Management system and follows the same licensing terms.