 9bdcbe0447
			
		
	
	9bdcbe0447
	
	
	
		
			
			Major integrations and fixes: - Added BACKBEAT SDK integration for P2P operation timing - Implemented beat-aware status tracking for distributed operations - Added Docker secrets support for secure license management - Resolved KACHING license validation via HTTPS/TLS - Updated docker-compose configuration for clean stack deployment - Disabled rollback policies to prevent deployment failures - Added license credential storage (CHORUS-DEV-MULTI-001) Technical improvements: - BACKBEAT P2P operation tracking with phase management - Enhanced configuration system with file-based secrets - Improved error handling for license validation - Clean separation of KACHING and CHORUS deployment stacks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			160 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package openai
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"net/http"
 | |
| 	"net/url"
 | |
| )
 | |
| 
 | |
| type FineTuningJob struct {
 | |
| 	ID              string          `json:"id"`
 | |
| 	Object          string          `json:"object"`
 | |
| 	CreatedAt       int64           `json:"created_at"`
 | |
| 	FinishedAt      int64           `json:"finished_at"`
 | |
| 	Model           string          `json:"model"`
 | |
| 	FineTunedModel  string          `json:"fine_tuned_model,omitempty"`
 | |
| 	OrganizationID  string          `json:"organization_id"`
 | |
| 	Status          string          `json:"status"`
 | |
| 	Hyperparameters Hyperparameters `json:"hyperparameters"`
 | |
| 	TrainingFile    string          `json:"training_file"`
 | |
| 	ValidationFile  string          `json:"validation_file,omitempty"`
 | |
| 	ResultFiles     []string        `json:"result_files"`
 | |
| 	TrainedTokens   int             `json:"trained_tokens"`
 | |
| 
 | |
| 	httpHeader
 | |
| }
 | |
| 
 | |
| type Hyperparameters struct {
 | |
| 	Epochs                 any `json:"n_epochs,omitempty"`
 | |
| 	LearningRateMultiplier any `json:"learning_rate_multiplier,omitempty"`
 | |
| 	BatchSize              any `json:"batch_size,omitempty"`
 | |
| }
 | |
| 
 | |
| type FineTuningJobRequest struct {
 | |
| 	TrainingFile    string           `json:"training_file"`
 | |
| 	ValidationFile  string           `json:"validation_file,omitempty"`
 | |
| 	Model           string           `json:"model,omitempty"`
 | |
| 	Hyperparameters *Hyperparameters `json:"hyperparameters,omitempty"`
 | |
| 	Suffix          string           `json:"suffix,omitempty"`
 | |
| }
 | |
| 
 | |
| type FineTuningJobEventList struct {
 | |
| 	Object  string          `json:"object"`
 | |
| 	Data    []FineTuneEvent `json:"data"`
 | |
| 	HasMore bool            `json:"has_more"`
 | |
| 
 | |
| 	httpHeader
 | |
| }
 | |
| 
 | |
| type FineTuningJobEvent struct {
 | |
| 	Object    string `json:"object"`
 | |
| 	ID        string `json:"id"`
 | |
| 	CreatedAt int    `json:"created_at"`
 | |
| 	Level     string `json:"level"`
 | |
| 	Message   string `json:"message"`
 | |
| 	Data      any    `json:"data"`
 | |
| 	Type      string `json:"type"`
 | |
| }
 | |
| 
 | |
| // CreateFineTuningJob create a fine tuning job.
 | |
| func (c *Client) CreateFineTuningJob(
 | |
| 	ctx context.Context,
 | |
| 	request FineTuningJobRequest,
 | |
| ) (response FineTuningJob, err error) {
 | |
| 	urlSuffix := "/fine_tuning/jobs"
 | |
| 	req, err := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix), withBody(request))
 | |
| 	if err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // CancelFineTuningJob cancel a fine tuning job.
 | |
| func (c *Client) CancelFineTuningJob(ctx context.Context, fineTuningJobID string) (response FineTuningJob, err error) {
 | |
| 	req, err := c.newRequest(ctx, http.MethodPost, c.fullURL("/fine_tuning/jobs/"+fineTuningJobID+"/cancel"))
 | |
| 	if err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // RetrieveFineTuningJob retrieve a fine tuning job.
 | |
| func (c *Client) RetrieveFineTuningJob(
 | |
| 	ctx context.Context,
 | |
| 	fineTuningJobID string,
 | |
| ) (response FineTuningJob, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("/fine_tuning/jobs/%s", fineTuningJobID)
 | |
| 	req, err := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix))
 | |
| 	if err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| type listFineTuningJobEventsParameters struct {
 | |
| 	after *string
 | |
| 	limit *int
 | |
| }
 | |
| 
 | |
| type ListFineTuningJobEventsParameter func(*listFineTuningJobEventsParameters)
 | |
| 
 | |
| func ListFineTuningJobEventsWithAfter(after string) ListFineTuningJobEventsParameter {
 | |
| 	return func(args *listFineTuningJobEventsParameters) {
 | |
| 		args.after = &after
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ListFineTuningJobEventsWithLimit(limit int) ListFineTuningJobEventsParameter {
 | |
| 	return func(args *listFineTuningJobEventsParameters) {
 | |
| 		args.limit = &limit
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ListFineTuningJobs list fine tuning jobs events.
 | |
| func (c *Client) ListFineTuningJobEvents(
 | |
| 	ctx context.Context,
 | |
| 	fineTuningJobID string,
 | |
| 	setters ...ListFineTuningJobEventsParameter,
 | |
| ) (response FineTuningJobEventList, err error) {
 | |
| 	parameters := &listFineTuningJobEventsParameters{
 | |
| 		after: nil,
 | |
| 		limit: nil,
 | |
| 	}
 | |
| 
 | |
| 	for _, setter := range setters {
 | |
| 		setter(parameters)
 | |
| 	}
 | |
| 
 | |
| 	urlValues := url.Values{}
 | |
| 	if parameters.after != nil {
 | |
| 		urlValues.Add("after", *parameters.after)
 | |
| 	}
 | |
| 	if parameters.limit != nil {
 | |
| 		urlValues.Add("limit", fmt.Sprintf("%d", *parameters.limit))
 | |
| 	}
 | |
| 
 | |
| 	encodedValues := ""
 | |
| 	if len(urlValues) > 0 {
 | |
| 		encodedValues = "?" + urlValues.Encode()
 | |
| 	}
 | |
| 
 | |
| 	req, err := c.newRequest(
 | |
| 		ctx,
 | |
| 		http.MethodGet,
 | |
| 		c.fullURL("/fine_tuning/jobs/"+fineTuningJobID+"/events"+encodedValues),
 | |
| 	)
 | |
| 	if err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 |