* feat: support Claude model * feat: support Claude model * feat: support Claude model * feat: support Claude model * feat: support Claude model * feat: support Claude model * feat: support Claude modelHEAD
@@ -51,6 +51,7 @@ require ( | |||||
github.com/json-iterator/go v1.1.12 // indirect | github.com/json-iterator/go v1.1.12 // indirect | ||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect | ||||
github.com/kr/pretty v0.3.0 // indirect | github.com/kr/pretty v0.3.0 // indirect | ||||
github.com/madebywelch/anthropic-go v1.0.1 // indirect | |||||
github.com/mattn/go-isatty v0.0.16 // indirect | github.com/mattn/go-isatty v0.0.16 // indirect | ||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect | github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect | ||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
@@ -388,6 +388,8 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-b | |||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= | github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= | ||||
github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= | github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= | ||||
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= | github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= | ||||
github.com/madebywelch/anthropic-go v1.0.1 h1:LalIkikXbN53MIHGQekhwDWTs/x+/WHU71Ht1T4F0Ug= | |||||
github.com/madebywelch/anthropic-go v1.0.1/go.mod h1:ipU4SV1KHLcxo7lpR/O3JWq6985kaNcdYQgB46gaQCQ= | |||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | ||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= | github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= | ||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | ||||
@@ -0,0 +1,63 @@ | |||||
// Copyright 2023 The casbin Authors. All Rights Reserved. | |||||
// | |||||
// Licensed under the Apache License, Version 2.0 (the "License"); | |||||
// you may not use this file except in compliance with the License. | |||||
// You may obtain a copy of the License at | |||||
// | |||||
// http://www.apache.org/licenses/LICENSE-2.0 | |||||
// | |||||
// Unless required by applicable law or agreed to in writing, software | |||||
// distributed under the License is distributed on an "AS IS" BASIS, | |||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
// See the License for the specific language governing permissions and | |||||
// limitations under the License. | |||||
package model | |||||
import ( | |||||
"fmt" | |||||
"io" | |||||
"net/http" | |||||
"strings" | |||||
"github.com/madebywelch/anthropic-go/pkg/anthropic" | |||||
) | |||||
type ClaudeModelProvider struct { | |||||
subType string | |||||
secretKey string | |||||
} | |||||
func NewClaudeModelProvider(subType string, secretKey string) (*ClaudeModelProvider, error) { | |||||
return &ClaudeModelProvider{subType: subType, secretKey: secretKey}, nil | |||||
} | |||||
func (p *ClaudeModelProvider) QueryText(question string, writer io.Writer, builder *strings.Builder) error { | |||||
client, err := anthropic.NewClient(p.secretKey) | |||||
if err != nil { | |||||
panic(err) | |||||
} | |||||
response, _ := client.Complete(&anthropic.CompletionRequest{ | |||||
Prompt: anthropic.GetPrompt(question), | |||||
Model: anthropic.Model(p.subType), | |||||
MaxTokensToSample: 100, | |||||
StopSequences: []string{"\r", "Human:"}, | |||||
}, nil) | |||||
flusher, ok := writer.(http.Flusher) | |||||
if !ok { | |||||
return fmt.Errorf("writer does not implement http.Flusher") | |||||
} | |||||
flushData := func(data string) error { | |||||
if _, err := fmt.Fprintf(writer, "event: message\ndata: %s\n\n", data); err != nil { | |||||
return err | |||||
} | |||||
flusher.Flush() | |||||
builder.WriteString(data) | |||||
return nil | |||||
} | |||||
err = flushData(response.Completion) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} |
@@ -30,6 +30,8 @@ func GetModelProvider(typ string, subType string, clientId string, clientSecret | |||||
p, err = NewOpenAiModelProvider(subType, clientSecret) | p, err = NewOpenAiModelProvider(subType, clientSecret) | ||||
} else if typ == "Hugging Face" { | } else if typ == "Hugging Face" { | ||||
p, err = NewHuggingFaceModelProvider(subType, clientSecret) | p, err = NewHuggingFaceModelProvider(subType, clientSecret) | ||||
} else if typ == "Claude" { | |||||
p, err = NewClaudeModelProvider(subType, clientSecret) | |||||
} else if typ == "OpenRouter" { | } else if typ == "OpenRouter" { | ||||
p, err = NewOpenRouterModelProvider(subType, clientSecret) | p, err = NewOpenRouterModelProvider(subType, clientSecret) | ||||
} else if typ == "Ernie" { | } else if typ == "Ernie" { | ||||
@@ -636,6 +636,7 @@ export function getProviderTypeOptions(category) { | |||||
[ | [ | ||||
{id: "OpenAI", name: "OpenAI"}, | {id: "OpenAI", name: "OpenAI"}, | ||||
{id: "Hugging Face", name: "Hugging Face"}, | {id: "Hugging Face", name: "Hugging Face"}, | ||||
{id: "Claude", name: "Claude"}, | |||||
{id: "OpenRouter", name: "OpenRouter"}, | {id: "OpenRouter", name: "OpenRouter"}, | ||||
{id: "Ernie", name: "Ernie"}, | {id: "Ernie", name: "Ernie"}, | ||||
{id: "iFlytek", name: "iFlytek"}, | {id: "iFlytek", name: "iFlytek"}, | ||||
@@ -731,6 +732,23 @@ export function getProviderSubTypeOptions(category, type) { | |||||
} else { | } else { | ||||
return []; | return []; | ||||
} | } | ||||
} else if (type === "Claude") { | |||||
return ( | |||||
[ | |||||
{id: "claude-2", name: "claude-2"}, | |||||
{id: "claude-v1", name: "claude-v1"}, | |||||
{id: "claude-v1-100k", name: "claude-v1-100k"}, | |||||
{id: "claude-instant-v1", name: "claude-instant-v1"}, | |||||
{id: "claude-instant-v1-100k", name: "claude-instant-v1-100k"}, | |||||
{id: "claude-v1.3", name: "claude-v1.3"}, | |||||
{id: "claude-v1.3-100k", name: "claude-v1.3-100k"}, | |||||
{id: "claude-v1.2", name: "claude-v1.2"}, | |||||
{id: "claude-v1.0", name: "claude-v1.0"}, | |||||
{id: "claude-instant-v1.1", name: "claude-instant-v1.1"}, | |||||
{id: "claude-instant-v1.1-100k", name: "claude-instant-v1.1-100k"}, | |||||
{id: "claude-instant-v1.0", name: "claude-instant-v1.0"}, | |||||
] | |||||
); | |||||
} else if (type === "OpenRouter") { | } else if (type === "OpenRouter") { | ||||
return ( | return ( | ||||
[ | [ | ||||