Skip to content

Commit e910c70

Browse files
committed
function calling begin
1 parent f12cce1 commit e910c70

5 files changed

Lines changed: 141 additions & 111 deletions

File tree

auth.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package gigachat
2+
3+
import (
4+
"bytes"
5+
"crypto/tls"
6+
"encoding/json"
7+
uuid "github.com/nu7hatch/gouuid"
8+
"io"
9+
"log"
10+
"net/http"
11+
"os"
12+
"strconv"
13+
"time"
14+
)
15+
16+
func (g *Gigachat) getExpiresAtFromFile() int64 {
17+
data, err := os.ReadFile(g.getExpiresFile())
18+
if err != nil {
19+
return 0
20+
}
21+
i, err := strconv.ParseInt(string(data), 10, 64)
22+
if err != nil {
23+
return 0
24+
}
25+
return i
26+
}
27+
func (g *Gigachat) getTokenFromFile() string {
28+
data, err := os.ReadFile(g.getTokenFile())
29+
if err != nil {
30+
return ""
31+
}
32+
return string(data)
33+
}
34+
func (g Gigachat) getExpiresFile() string {
35+
filename, exists := os.LookupEnv(GigaChatExpiresFileEnv)
36+
if !exists {
37+
return ".gigachat_expires"
38+
}
39+
return filename
40+
}
41+
42+
func (g Gigachat) getTokenFile() string {
43+
filename, exists := os.LookupEnv(GigaChatTokenFileEnv)
44+
if !exists {
45+
return ".gigachat_token"
46+
}
47+
return filename
48+
}
49+
50+
func (g *Gigachat) setExpiresAtToFile(value int64) {
51+
fh, _ := os.OpenFile(g.getExpiresFile(), os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0666)
52+
fh.WriteString(strconv.FormatInt(value, 10))
53+
defer fh.Close()
54+
}
55+
func (g *Gigachat) setTokenToFile(value string) {
56+
fh, _ := os.OpenFile(g.getTokenFile(), os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0666)
57+
fh.WriteString(value)
58+
defer fh.Close()
59+
}
60+
func (g *Gigachat) getCurrentToken() string {
61+
expAt := g.getExpiresAtFromFile()
62+
token := g.getTokenFromFile()
63+
apochNow := time.Now().Unix()
64+
timeDelta := apochNow - (expAt / 1000)
65+
if timeDelta > 0 {
66+
newExpAt, token2 := g.Auth()
67+
g.setExpiresAtToFile(newExpAt)
68+
g.setTokenToFile(token2)
69+
token = token2
70+
}
71+
return token
72+
}
73+
74+
func (g *Gigachat) getAuthData() string {
75+
value, exists := os.LookupEnv(GigaChatAuthData)
76+
if exists {
77+
return value
78+
}
79+
if g.AuthData != "" {
80+
return g.AuthData
81+
}
82+
return ""
83+
}
84+
85+
// Auth Авторизация для получения токена для запросов.
86+
func (g *Gigachat) Auth() (int64, string) {
87+
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
88+
u, err := uuid.NewV4()
89+
request, _ := http.NewRequest("POST", GigaChatOauthUrl, bytes.NewBufferString("scope=GIGACHAT_API_PERS"))
90+
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
91+
request.Header.Set("RqUID", u.String())
92+
request.Header.Set("Authorization", "Basic "+g.getAuthData())
93+
client := &http.Client{}
94+
response, e := client.Do(request)
95+
96+
if e != nil {
97+
log.Fatal(e)
98+
}
99+
if response.StatusCode != http.StatusOK {
100+
return 0, ""
101+
}
102+
body, err := io.ReadAll(response.Body)
103+
if err != nil {
104+
log.Println(err)
105+
}
106+
log.Println(string(body))
107+
defer response.Body.Close()
108+
109+
var result TokenResponse
110+
err2 := json.Unmarshal(body, &result)
111+
if err2 != nil {
112+
log.Fatal(err2)
113+
}
114+
os.Setenv(GigaChatToken, result.AccessToken)
115+
return result.ExpiresAt, result.AccessToken
116+
}

constants.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ const (
1313
GigaChatModel = "GigaChat"
1414
GigaChatMaxTokens = 16384
1515
MaxEmbeddingSize int = 8192
16+
GigaChatRoleUser = "user"
17+
GigaChatRoleSystem = "system"
1618
)

examples/ask/main.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package main
22

33
import (
44
gigachat "github.com/saintbyte/gigachat_api"
5-
"log"
5+
"log/slog"
66
)
77

88
func main() {
99
chat := gigachat.NewGigachat()
10-
aswer, err := chat.Ask("Сколько рыбы в море?")
10+
answer, err := chat.Ask("Сколько рыбы в море?")
1111
if err != nil {
12-
log.Fatal(err)
12+
slog.Error("Ask error:", err)
13+
return
1314
}
14-
log.Println(aswer)
15+
slog.Info(answer)
1516
}

examples/function_call/main.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package main
2+
3+
import (
4+
gigachat "github.com/saintbyte/gigachat_api"
5+
"log/slog"
6+
)
7+
8+
func main() {
9+
chat := gigachat.NewGigachat()
10+
answer, err := chat.Ask("Сколько рыбы в море?")
11+
if err != nil {
12+
slog.Error("Ask error:", err)
13+
}
14+
slog.Info(answer)
15+
}

gigachat.go

Lines changed: 3 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,10 @@ import (
99
"crypto/tls"
1010
"encoding/json"
1111
"errors"
12-
uuid "github.com/nu7hatch/gouuid"
1312
"io"
1413
"log"
14+
"log/slog"
1515
"net/http"
16-
"os"
17-
"strconv"
18-
"time"
1916
)
2017

2118
type Gigachat struct {
@@ -40,63 +37,6 @@ func NewGigachat() *Gigachat {
4037
}
4138
}
4239

43-
func (g *Gigachat) getExpiresAtFromFile() int64 {
44-
data, err := os.ReadFile(g.getExpiresFile())
45-
if err != nil {
46-
return 0
47-
}
48-
i, err := strconv.ParseInt(string(data), 10, 64)
49-
if err != nil {
50-
return 0
51-
}
52-
return i
53-
}
54-
func (g *Gigachat) getTokenFromFile() string {
55-
data, err := os.ReadFile(g.getTokenFile())
56-
if err != nil {
57-
return ""
58-
}
59-
return string(data)
60-
}
61-
func (g Gigachat) getExpiresFile() string {
62-
filename, exists := os.LookupEnv(GigaChatExpiresFileEnv)
63-
if !exists {
64-
return ".gigachat_expires"
65-
}
66-
return filename
67-
}
68-
69-
func (g Gigachat) getTokenFile() string {
70-
filename, exists := os.LookupEnv(GigaChatTokenFileEnv)
71-
if !exists {
72-
return ".gigachat_token"
73-
}
74-
return filename
75-
}
76-
77-
func (g *Gigachat) setExpiresAtToFile(value int64) {
78-
fh, _ := os.OpenFile(g.getExpiresFile(), os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0666)
79-
fh.WriteString(strconv.FormatInt(value, 10))
80-
defer fh.Close()
81-
}
82-
func (g *Gigachat) setTokenToFile(value string) {
83-
fh, _ := os.OpenFile(g.getTokenFile(), os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0666)
84-
fh.WriteString(value)
85-
defer fh.Close()
86-
}
87-
func (g *Gigachat) getCurrentToken() string {
88-
expAt := g.getExpiresAtFromFile()
89-
token := g.getTokenFromFile()
90-
apochNow := time.Now().Unix()
91-
timeDelta := apochNow - (expAt / 1000)
92-
if timeDelta > 0 {
93-
newExpAt, token2 := g.Auth()
94-
g.setExpiresAtToFile(newExpAt)
95-
g.setTokenToFile(token2)
96-
token = token2
97-
}
98-
return token
99-
}
10040
func (g *Gigachat) getRequestUrl(path string) string {
10141
return "https://" + g.ApiHost + path
10242
}
@@ -124,50 +64,6 @@ func (g *Gigachat) postRequest(url string, body io.Reader) (*http.Request, error
12464
return request, nil
12565
}
12666

127-
func (g *Gigachat) getAuthData() string {
128-
value, exists := os.LookupEnv(GigaChatAuthData)
129-
if exists {
130-
return value
131-
}
132-
if g.AuthData != "" {
133-
return g.AuthData
134-
}
135-
return ""
136-
}
137-
138-
// Auth Авторизация для получения токена для запросов.
139-
func (g *Gigachat) Auth() (int64, string) {
140-
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
141-
u, err := uuid.NewV4()
142-
request, _ := http.NewRequest("POST", GigaChatOauthUrl, bytes.NewBufferString("scope=GIGACHAT_API_PERS"))
143-
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
144-
request.Header.Set("RqUID", u.String())
145-
request.Header.Set("Authorization", "Basic "+g.getAuthData())
146-
client := &http.Client{}
147-
response, e := client.Do(request)
148-
149-
if e != nil {
150-
log.Fatal(e)
151-
}
152-
if response.StatusCode != http.StatusOK {
153-
return 0, ""
154-
}
155-
body, err := io.ReadAll(response.Body)
156-
if err != nil {
157-
log.Println(err)
158-
}
159-
log.Println(string(body))
160-
defer response.Body.Close()
161-
162-
var result TokenResponse
163-
err2 := json.Unmarshal(body, &result)
164-
if err2 != nil {
165-
log.Fatal(err2)
166-
}
167-
os.Setenv(GigaChatToken, result.AccessToken)
168-
return result.ExpiresAt, result.AccessToken
169-
}
170-
17167
// GetModels Получить список моделей.
17268
func (g *Gigachat) GetModels() ([]ModelItem, error) {
17369
url := g.getRequestUrl(GigaChatModelsPath)
@@ -260,7 +156,7 @@ func (g *Gigachat) ChatCompletions(messages []MessageRequest) (string, error) {
260156
var result ChatCompletionResponse
261157
err = json.Unmarshal(body, &result)
262158
if err != nil {
263-
log.Fatal(err)
159+
slog.Error("Json Unmarshal error:", err)
264160
}
265161
return result.Choices[0].Message.Content, nil
266162
}
@@ -269,7 +165,7 @@ func (g *Gigachat) ChatCompletions(messages []MessageRequest) (string, error) {
269165
func (g *Gigachat) Ask(input string) (string, error) {
270166
return g.ChatCompletions([]MessageRequest{
271167
{
272-
Role: "user",
168+
Role: GigaChatRoleUser,
273169
Content: input,
274170
},
275171
})

0 commit comments

Comments
 (0)