/
interface.go
156 lines (136 loc) · 4.25 KB
/
interface.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package openai_chat_switch
import (
"fmt"
"github.com/eust-w/openai-chat-switch/database"
"github.com/eust-w/openai-chat-switch/global"
"github.com/eust-w/openai-chat-switch/gpt"
"strings"
"sync"
)
type RwMap struct {
globalMap map[string]struct{}
sync.RWMutex
}
func (r *RwMap) Get(name string) bool {
r.RLock()
defer r.RUnlock()
_, ok := r.globalMap[name]
return ok
}
func (r *RwMap) Set(name string) bool {
if r.Get(name) {
return false
}
r.Lock()
defer r.Unlock()
r.globalMap[name] = struct{}{}
return true
}
func (r *RwMap) Del(name string) bool {
if !r.Get(name) {
return false
}
r.Lock()
defer r.Unlock()
delete(r.globalMap, name)
return true
}
var globalRwMap = RwMap{globalMap: map[string]struct{}{}}
type extension struct {
funcMap map[string]func(a, b string) string
}
func (e extension) GetFuncs() map[string]func(a, b string) string {
return e.funcMap
}
func (e extension) GetFunc(name string) (func(a, b string) string, bool) {
f, ok := e.funcMap[name]
return f, ok
}
func (e extension) AddFunc(name string, function func(a, b string) string) error {
if globalRwMap.Set(name) {
e.funcMap[name] = function
return nil
}
return fmt.Errorf("add func error")
}
func (e extension) DelFunc(name string) {
if !globalRwMap.Del(name) {
global.App.Log.Warnf("del global func name error")
}
delete(e.funcMap, name)
}
//var ExtensionExactMatchReturnOutcome map[string]func(a, b string) string = map[string]func(a, b string) string{}
//var ExtensionPrefixMatchReturnOutcome map[string]func(a, b string) string = map[string]func(a, b string) string{}
//var ExtensionExactMatchReturnPrompt map[string]func(a, b string) string = map[string]func(a, b string) string{}
//var ExtensionPrefixMatchReturnPrompt map[string]func(a, b string) string = map[string]func(a, b string) string{}
var ExtensionExactMatchReturnOutcome extension = extension{funcMap: map[string]func(a string, b string) string{}}
var ExtensionPrefixMatchReturnOutcome = extension{funcMap: map[string]func(a string, b string) string{}}
var ExtensionExactMatchReturnPrompt = extension{funcMap: map[string]func(a string, b string) string{}}
var ExtensionPrefixMatchReturnPrompt = extension{funcMap: map[string]func(a string, b string) string{}}
func NewGlobal(config string) *global.Application {
global.OnceInitializeConfig(config)
global.App.Log = global.InitializeLog()
global.App.Db = database.NewChatDb()
return global.App
}
func Answer(prompt string, userId string) (out string) {
var ok bool
if out, ok = checkUser(userId); ok {
return answer(prompt, userId)
}
return out
}
//检查用户是否拥有权限,返回结果和权限
func checkUser(userId string) (out string, permissions bool) {
return "", true
}
// 返回结果,会在控制层对命令进行过滤
func answer(prompt string, userId string) (out string) {
prompt = prunePrompt(prompt)
//完全匹配,直接返回
if f, ok := ExtensionExactMatchReturnOutcome.GetFunc(prompt); ok {
return f(prompt, userId)
}
//前缀匹配,直接返回
if f, ok := getFuncFromPrefixMatchMap(ExtensionPrefixMatchReturnOutcome.GetFuncs(), prompt); ok {
return f(prompt, userId)
}
//完全匹配,修饰prompt
if f, ok := ExtensionExactMatchReturnPrompt.GetFunc(prompt); ok {
newPrompt := f(prompt, userId)
return answerByGpt(newPrompt, userId)
}
//前缀匹配,修饰prompt
if f, ok := getFuncFromPrefixMatchMap(ExtensionPrefixMatchReturnPrompt.GetFuncs(), prompt); ok {
newPrompt := f(prompt, userId)
return answerByGpt(newPrompt, userId)
}
return answerByGpt(prompt, userId)
}
func prunePrompt(prompt string) string {
return strings.TrimSpace(prompt)
}
// 通过gpt回复结果
func answerByGpt(prompt string, userId string) (out string) {
prompt = processPrompt(prompt)
return gpt.Answer(prompt, userId)
}
// 用来对prompt进行处理,对新的prompt进行加工,例如生成模板什么的
func processPrompt(prompt string) (processedPrompt string) {
//
prompt = strings.TrimSpace(prompt)
return prompt
}
//匹配前缀是否相同
func getFuncFromPrefixMatchMap(m map[string]func(a, b string) string, source string) (func(a, b string) string, bool) {
for k, f := range m {
keyLen := len(k)
if len(source) < keyLen {
continue
}
if source[:keyLen] == k {
return f, true
}
}
return nil, false
}