type MyChatModel struct {
client *http.Client
apiKey string
baseURL string
model string
timeout time.Duration
retryCount int
}
func NewMyChatModel(config *MyChatModelConfig) (*MyChatModel, error) {
if config.APIKey == "" {
return nil, errors.New("api key is required")
}
return &MyChatModel{
client: &http.Client{},
apiKey: config.APIKey,
baseURL: config.BaseURL,
model: config.DefaultModel,
timeout: config.DefaultTimeout,
retryCount: config.DefaultRetryCount,
}, nil
}
func (m *MyChatModel) Generate(ctx context.Context, messages []*schema.Message, opts ...model.Option) (*schema.Message, error) {
options := &MyChatModelOptions{
Options: &model.Options{
Model: &m.model,
},
RetryCount: m.retryCount,
Timeout: m.timeout,
}
options.Options = model.GetCommonOptions(options.Options, opts...)
options = model.GetImplSpecificOptions(options, opts...)
cm := callbacks.ManagerFromContext(ctx)
ctx = cm.OnStart(ctx, info, &model.CallbackInput{
Messages: messages,
Model: *options.Options.Model,
Temperature: options.Options.Temperature,
MaxTokens: options.Options.MaxTokens,
})
response, err := m.doGenerate(ctx, messages, options)
if err != nil {
ctx = cm.OnError(ctx, info, err)
return nil, err
}
ctx = cm.OnEnd(ctx, info, &model.CallbackOutput{
Message: response.Message,
TokenUsage: response.TokenUsage,
})
return response.Message, nil
}
func (m *MyChatModel) Stream(ctx context.Context, messages []*schema.Message, opts ...model.Option) (*schema.StreamReader[*schema.Message], error) {
options := &MyChatModelOptions{
Options: &model.Options{
Model: &m.model,
},
RetryCount: m.retryCount,
Timeout: m.timeout,
}
options = model.GetCommonOptions(options, opts...)
cm := callbacks.ManagerFromContext(ctx)
ctx = cm.OnStart(ctx, info, &model.CallbackInput{
Messages: messages,
Model: *options.Options.Model,
Temperature: options.Options.Temperature,
MaxTokens: options.Options.MaxTokens,
})
reader, writer := schema.Pipe[*schema.Message](1)
go func() {
defer writer.Close()
err := m.doStream(ctx, messages, options, writer)
if err != nil {
cm.OnError(ctx, info, err)
return
}
cm.OnEndWithStreamOutput(ctx, info, stream)
}()
return reader, nil
}
func (m *MyChatModel) BindTools(tools []*schema.ToolInfo) error {
return nil
}
func (m *MyChatModel) doGenerate(ctx context.Context, messages []*schema.Message, opts *MyChatModelOptions) (*model.Response, error) {
return response, err
}
func (m *MyChatModel) doStream(ctx context.Context, messages []*schema.Message, opts *MyChatModelOptions, writer *schema.StreamWriter[*schema.Message]) error {
return err
}