 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>
		
			
				
	
	
		
			349 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package openai
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"net/http"
 | |
| 	"net/url"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	vectorStoresSuffix            = "/vector_stores"
 | |
| 	vectorStoresFilesSuffix       = "/files"
 | |
| 	vectorStoresFileBatchesSuffix = "/file_batches"
 | |
| )
 | |
| 
 | |
| type VectorStoreFileCount struct {
 | |
| 	InProgress int `json:"in_progress"`
 | |
| 	Completed  int `json:"completed"`
 | |
| 	Failed     int `json:"failed"`
 | |
| 	Cancelled  int `json:"cancelled"`
 | |
| 	Total      int `json:"total"`
 | |
| }
 | |
| 
 | |
| type VectorStore struct {
 | |
| 	ID           string               `json:"id"`
 | |
| 	Object       string               `json:"object"`
 | |
| 	CreatedAt    int64                `json:"created_at"`
 | |
| 	Name         string               `json:"name"`
 | |
| 	UsageBytes   int                  `json:"usage_bytes"`
 | |
| 	FileCounts   VectorStoreFileCount `json:"file_counts"`
 | |
| 	Status       string               `json:"status"`
 | |
| 	ExpiresAfter *VectorStoreExpires  `json:"expires_after"`
 | |
| 	ExpiresAt    *int                 `json:"expires_at"`
 | |
| 	Metadata     map[string]any       `json:"metadata"`
 | |
| 
 | |
| 	httpHeader
 | |
| }
 | |
| 
 | |
| type VectorStoreExpires struct {
 | |
| 	Anchor string `json:"anchor"`
 | |
| 	Days   int    `json:"days"`
 | |
| }
 | |
| 
 | |
| // VectorStoreRequest provides the vector store request parameters.
 | |
| type VectorStoreRequest struct {
 | |
| 	Name         string              `json:"name,omitempty"`
 | |
| 	FileIDs      []string            `json:"file_ids,omitempty"`
 | |
| 	ExpiresAfter *VectorStoreExpires `json:"expires_after,omitempty"`
 | |
| 	Metadata     map[string]any      `json:"metadata,omitempty"`
 | |
| }
 | |
| 
 | |
| // VectorStoresList is a list of vector store.
 | |
| type VectorStoresList struct {
 | |
| 	VectorStores []VectorStore `json:"data"`
 | |
| 	LastID       *string       `json:"last_id"`
 | |
| 	FirstID      *string       `json:"first_id"`
 | |
| 	HasMore      bool          `json:"has_more"`
 | |
| 	httpHeader
 | |
| }
 | |
| 
 | |
| type VectorStoreDeleteResponse struct {
 | |
| 	ID      string `json:"id"`
 | |
| 	Object  string `json:"object"`
 | |
| 	Deleted bool   `json:"deleted"`
 | |
| 
 | |
| 	httpHeader
 | |
| }
 | |
| 
 | |
| type VectorStoreFile struct {
 | |
| 	ID            string `json:"id"`
 | |
| 	Object        string `json:"object"`
 | |
| 	CreatedAt     int64  `json:"created_at"`
 | |
| 	VectorStoreID string `json:"vector_store_id"`
 | |
| 	UsageBytes    int    `json:"usage_bytes"`
 | |
| 	Status        string `json:"status"`
 | |
| 
 | |
| 	httpHeader
 | |
| }
 | |
| 
 | |
| type VectorStoreFileRequest struct {
 | |
| 	FileID string `json:"file_id"`
 | |
| }
 | |
| 
 | |
| type VectorStoreFilesList struct {
 | |
| 	VectorStoreFiles []VectorStoreFile `json:"data"`
 | |
| 	FirstID          *string           `json:"first_id"`
 | |
| 	LastID           *string           `json:"last_id"`
 | |
| 	HasMore          bool              `json:"has_more"`
 | |
| 
 | |
| 	httpHeader
 | |
| }
 | |
| 
 | |
| type VectorStoreFileBatch struct {
 | |
| 	ID            string               `json:"id"`
 | |
| 	Object        string               `json:"object"`
 | |
| 	CreatedAt     int64                `json:"created_at"`
 | |
| 	VectorStoreID string               `json:"vector_store_id"`
 | |
| 	Status        string               `json:"status"`
 | |
| 	FileCounts    VectorStoreFileCount `json:"file_counts"`
 | |
| 
 | |
| 	httpHeader
 | |
| }
 | |
| 
 | |
| type VectorStoreFileBatchRequest struct {
 | |
| 	FileIDs []string `json:"file_ids"`
 | |
| }
 | |
| 
 | |
| // CreateVectorStore creates a new vector store.
 | |
| func (c *Client) CreateVectorStore(ctx context.Context, request VectorStoreRequest) (response VectorStore, err error) {
 | |
| 	req, _ := c.newRequest(
 | |
| 		ctx,
 | |
| 		http.MethodPost,
 | |
| 		c.fullURL(vectorStoresSuffix),
 | |
| 		withBody(request),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion),
 | |
| 	)
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // RetrieveVectorStore retrieves an vector store.
 | |
| func (c *Client) RetrieveVectorStore(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| ) (response VectorStore, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s", vectorStoresSuffix, vectorStoreID)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // ModifyVectorStore modifies a vector store.
 | |
| func (c *Client) ModifyVectorStore(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	request VectorStoreRequest,
 | |
| ) (response VectorStore, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s", vectorStoresSuffix, vectorStoreID)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix), withBody(request),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // DeleteVectorStore deletes an vector store.
 | |
| func (c *Client) DeleteVectorStore(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| ) (response VectorStoreDeleteResponse, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s", vectorStoresSuffix, vectorStoreID)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodDelete, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // ListVectorStores Lists the currently available vector store.
 | |
| func (c *Client) ListVectorStores(
 | |
| 	ctx context.Context,
 | |
| 	pagination Pagination,
 | |
| ) (response VectorStoresList, err error) {
 | |
| 	urlValues := url.Values{}
 | |
| 
 | |
| 	if pagination.After != nil {
 | |
| 		urlValues.Add("after", *pagination.After)
 | |
| 	}
 | |
| 	if pagination.Order != nil {
 | |
| 		urlValues.Add("order", *pagination.Order)
 | |
| 	}
 | |
| 	if pagination.Limit != nil {
 | |
| 		urlValues.Add("limit", fmt.Sprintf("%d", *pagination.Limit))
 | |
| 	}
 | |
| 	if pagination.Before != nil {
 | |
| 		urlValues.Add("before", *pagination.Before)
 | |
| 	}
 | |
| 
 | |
| 	encodedValues := ""
 | |
| 	if len(urlValues) > 0 {
 | |
| 		encodedValues = "?" + urlValues.Encode()
 | |
| 	}
 | |
| 
 | |
| 	urlSuffix := fmt.Sprintf("%s%s", vectorStoresSuffix, encodedValues)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // CreateVectorStoreFile creates a new vector store file.
 | |
| func (c *Client) CreateVectorStoreFile(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	request VectorStoreFileRequest,
 | |
| ) (response VectorStoreFile, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s%s", vectorStoresSuffix, vectorStoreID, vectorStoresFilesSuffix)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix),
 | |
| 		withBody(request),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // RetrieveVectorStoreFile retrieves a vector store file.
 | |
| func (c *Client) RetrieveVectorStoreFile(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	fileID string,
 | |
| ) (response VectorStoreFile, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s%s/%s", vectorStoresSuffix, vectorStoreID, vectorStoresFilesSuffix, fileID)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // DeleteVectorStoreFile deletes an existing file.
 | |
| func (c *Client) DeleteVectorStoreFile(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	fileID string,
 | |
| ) (err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s%s/%s", vectorStoresSuffix, vectorStoreID, vectorStoresFilesSuffix, fileID)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodDelete, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, nil)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // ListVectorStoreFiles Lists the currently available files for a vector store.
 | |
| func (c *Client) ListVectorStoreFiles(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	pagination Pagination,
 | |
| ) (response VectorStoreFilesList, err error) {
 | |
| 	urlValues := url.Values{}
 | |
| 	if pagination.After != nil {
 | |
| 		urlValues.Add("after", *pagination.After)
 | |
| 	}
 | |
| 	if pagination.Limit != nil {
 | |
| 		urlValues.Add("limit", fmt.Sprintf("%d", *pagination.Limit))
 | |
| 	}
 | |
| 	if pagination.Before != nil {
 | |
| 		urlValues.Add("before", *pagination.Before)
 | |
| 	}
 | |
| 	if pagination.Order != nil {
 | |
| 		urlValues.Add("order", *pagination.Order)
 | |
| 	}
 | |
| 
 | |
| 	encodedValues := ""
 | |
| 	if len(urlValues) > 0 {
 | |
| 		encodedValues = "?" + urlValues.Encode()
 | |
| 	}
 | |
| 
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s%s%s", vectorStoresSuffix, vectorStoreID, vectorStoresFilesSuffix, encodedValues)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // CreateVectorStoreFileBatch creates a new vector store file batch.
 | |
| func (c *Client) CreateVectorStoreFileBatch(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	request VectorStoreFileBatchRequest,
 | |
| ) (response VectorStoreFileBatch, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s%s", vectorStoresSuffix, vectorStoreID, vectorStoresFileBatchesSuffix)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix),
 | |
| 		withBody(request),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // RetrieveVectorStoreFileBatch retrieves a vector store file batch.
 | |
| func (c *Client) RetrieveVectorStoreFileBatch(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	batchID string,
 | |
| ) (response VectorStoreFileBatch, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s%s/%s", vectorStoresSuffix, vectorStoreID, vectorStoresFileBatchesSuffix, batchID)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // CancelVectorStoreFileBatch cancel a new vector store file batch.
 | |
| func (c *Client) CancelVectorStoreFileBatch(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	batchID string,
 | |
| ) (response VectorStoreFileBatch, err error) {
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s%s/%s%s", vectorStoresSuffix,
 | |
| 		vectorStoreID, vectorStoresFileBatchesSuffix, batchID, "/cancel")
 | |
| 	req, _ := c.newRequest(ctx, http.MethodPost, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // ListVectorStoreFiles Lists the currently available files for a vector store.
 | |
| func (c *Client) ListVectorStoreFilesInBatch(
 | |
| 	ctx context.Context,
 | |
| 	vectorStoreID string,
 | |
| 	batchID string,
 | |
| 	pagination Pagination,
 | |
| ) (response VectorStoreFilesList, err error) {
 | |
| 	urlValues := url.Values{}
 | |
| 	if pagination.After != nil {
 | |
| 		urlValues.Add("after", *pagination.After)
 | |
| 	}
 | |
| 	if pagination.Limit != nil {
 | |
| 		urlValues.Add("limit", fmt.Sprintf("%d", *pagination.Limit))
 | |
| 	}
 | |
| 	if pagination.Before != nil {
 | |
| 		urlValues.Add("before", *pagination.Before)
 | |
| 	}
 | |
| 	if pagination.Order != nil {
 | |
| 		urlValues.Add("order", *pagination.Order)
 | |
| 	}
 | |
| 
 | |
| 	encodedValues := ""
 | |
| 	if len(urlValues) > 0 {
 | |
| 		encodedValues = "?" + urlValues.Encode()
 | |
| 	}
 | |
| 
 | |
| 	urlSuffix := fmt.Sprintf("%s/%s%s/%s%s%s", vectorStoresSuffix,
 | |
| 		vectorStoreID, vectorStoresFileBatchesSuffix, batchID, "/files", encodedValues)
 | |
| 	req, _ := c.newRequest(ctx, http.MethodGet, c.fullURL(urlSuffix),
 | |
| 		withBetaAssistantVersion(c.config.AssistantVersion))
 | |
| 
 | |
| 	err = c.sendRequest(req, &response)
 | |
| 	return
 | |
| }
 |