// api/integration-api/internal/caller/myprovider/llm.gopackage myprovidertype myProviderCaller struct { logger *zap.SugaredLogger}func NewMyProviderCaller(logger *zap.SugaredLogger) *myProviderCaller { return &myProviderCaller{logger: logger}}// GetChatCompletion returns a complete (non-streaming) response.func (c *myProviderCaller) GetChatCompletion( ctx context.Context, messages []caller.ChatMessage, opts caller.ChatCompletionOptions, credentials map[string]interface{},) (*caller.ChatCompletion, error) { // Read credentials from the vault map apiKey := credentials["key"].(string) // Read model parameters modelName, _ := opts.ModelParameter["model.name"].(string) temperature, _ := opts.ModelParameter["model.temperature"].(float64) // Call your provider API // Return &caller.ChatCompletion{Content: "...", ...} _ = apiKey _ = modelName _ = temperature return nil, nil}// StreamChatCompletion streams tokens via callbacks.func (c *myProviderCaller) StreamChatCompletion( ctx context.Context, messages []caller.ChatMessage, opts caller.ChatCompletionOptions, credentials map[string]interface{}, onStream func(token string), // call for each token onMetrics func(caller.LLMMetrics), // call once at end with token counts onError func(err error), // call on error) error { apiKey := credentials["key"].(string) modelName, _ := opts.ModelParameter["model.name"].(string) // Stream tokens from your provider // For each token: onStream(token) // On completion: onMetrics(metrics) // On error: onError(err) _ = apiKey _ = modelName return nil}
Credential convention: use credentials["key"] for the primary API key. Add additional keys (endpoint, region, etc.) as needed and document them in your vault credential.