mirror of
https://github.com/coalaura/whiskr.git
synced 2025-09-08 17:06:42 +00:00
reuse buffers
This commit is contained in:
12
chat.go
12
chat.go
@@ -357,11 +357,13 @@ func RunCompletion(ctx context.Context, response *Stream, request *openrouter.Ch
|
|||||||
defer stream.Close()
|
defer stream.Close()
|
||||||
|
|
||||||
var (
|
var (
|
||||||
id string
|
id string
|
||||||
result strings.Builder
|
tool *ToolCall
|
||||||
tool *ToolCall
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
buf := GetFreeBuffer()
|
||||||
|
defer pool.Put(buf)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
chunk, err := stream.Recv()
|
chunk, err := stream.Recv()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -409,7 +411,7 @@ func RunCompletion(ctx context.Context, response *Stream, request *openrouter.Ch
|
|||||||
content := choice.Delta.Content
|
content := choice.Delta.Content
|
||||||
|
|
||||||
if content != "" {
|
if content != "" {
|
||||||
result.WriteString(content)
|
buf.WriteString(content)
|
||||||
|
|
||||||
response.Send(TextChunk(content))
|
response.Send(TextChunk(content))
|
||||||
} else if choice.Delta.Reasoning != nil {
|
} else if choice.Delta.Reasoning != nil {
|
||||||
@@ -417,7 +419,7 @@ func RunCompletion(ctx context.Context, response *Stream, request *openrouter.Ch
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return tool, result.String(), nil
|
return tool, buf.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SplitImagePairs(text string) []openrouter.ChatMessagePart {
|
func SplitImagePairs(text string) []openrouter.ChatMessagePart {
|
||||||
|
8
exa.go
8
exa.go
@@ -6,7 +6,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -32,13 +31,14 @@ type ExaResults struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (e *ExaResults) String() string {
|
func (e *ExaResults) String() string {
|
||||||
var builder strings.Builder
|
buf := GetFreeBuffer()
|
||||||
|
defer pool.Put(buf)
|
||||||
|
|
||||||
json.NewEncoder(&builder).Encode(map[string]any{
|
json.NewEncoder(buf).Encode(map[string]any{
|
||||||
"results": e.Results,
|
"results": e.Results,
|
||||||
})
|
})
|
||||||
|
|
||||||
return builder.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewExaRequest(ctx context.Context, path string, data any) (*http.Request, error) {
|
func NewExaRequest(ctx context.Context, path string, data any) (*http.Request, error) {
|
||||||
|
29
github.go
29
github.go
@@ -220,35 +220,36 @@ func RepoOverview(ctx context.Context, arguments GitHubRepositoryArguments) (str
|
|||||||
// wait and combine results
|
// wait and combine results
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
|
|
||||||
var builder strings.Builder
|
buf := GetFreeBuffer()
|
||||||
|
defer pool.Put(buf)
|
||||||
|
|
||||||
fmt.Fprintf(&builder, "### %s (%s)\n", repository.Name, repository.Visibility)
|
fmt.Fprintf(buf, "### %s (%s)\n", repository.Name, repository.Visibility)
|
||||||
fmt.Fprintf(&builder, "- URL: %s\n", repository.HtmlURL)
|
fmt.Fprintf(buf, "- URL: %s\n", repository.HtmlURL)
|
||||||
fmt.Fprintf(&builder, "- Description: %s\n", strings.ReplaceAll(repository.Description, "\n", " "))
|
fmt.Fprintf(buf, "- Description: %s\n", strings.ReplaceAll(repository.Description, "\n", " "))
|
||||||
fmt.Fprintf(&builder, "- Default branch: %s\n", repository.DefaultBranch)
|
fmt.Fprintf(buf, "- Default branch: %s\n", repository.DefaultBranch)
|
||||||
fmt.Fprintf(&builder, "- Stars: %d | Forks: %d\n", repository.Stargazers, repository.Forks)
|
fmt.Fprintf(buf, "- Stars: %d | Forks: %d\n", repository.Stargazers, repository.Forks)
|
||||||
|
|
||||||
builder.WriteString("\n### Top-level files and directories\n")
|
buf.WriteString("\n### Top-level files and directories\n")
|
||||||
|
|
||||||
if len(directories) == 0 && len(files) == 0 {
|
if len(directories) == 0 && len(files) == 0 {
|
||||||
builder.WriteString("*No entries or insufficient permissions.*\n")
|
buf.WriteString("*No entries or insufficient permissions.*\n")
|
||||||
} else {
|
} else {
|
||||||
for _, directory := range directories {
|
for _, directory := range directories {
|
||||||
fmt.Fprintf(&builder, "- [D] %s\n", directory)
|
fmt.Fprintf(buf, "- [D] %s\n", directory)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
fmt.Fprintf(&builder, "- [F] %s\n", file)
|
fmt.Fprintf(buf, "- [F] %s\n", file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.WriteString("\n### README\n")
|
buf.WriteString("\n### README\n")
|
||||||
|
|
||||||
if readmeMarkdown == "" {
|
if readmeMarkdown == "" {
|
||||||
builder.WriteString("*No README found or could not load.*\n")
|
buf.WriteString("*No README found or could not load.*\n")
|
||||||
} else {
|
} else {
|
||||||
builder.WriteString(readmeMarkdown)
|
buf.WriteString(readmeMarkdown)
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder.String(), nil
|
return buf.String(), nil
|
||||||
}
|
}
|
||||||
|
@@ -134,9 +134,10 @@ func BuildPrompt(name string, metadata Metadata, model *Model) (string, error) {
|
|||||||
metadata.Platform = "Unknown"
|
metadata.Platform = "Unknown"
|
||||||
}
|
}
|
||||||
|
|
||||||
var buf bytes.Buffer
|
buf := GetFreeBuffer()
|
||||||
|
defer pool.Put(buf)
|
||||||
|
|
||||||
err := tmpl.Execute(&buf, PromptData{
|
err := tmpl.Execute(buf, PromptData{
|
||||||
Name: model.Name,
|
Name: model.Name,
|
||||||
Slug: model.ID,
|
Slug: model.ID,
|
||||||
Date: time.Now().In(tz).Format(time.RFC1123),
|
Date: time.Now().In(tz).Format(time.RFC1123),
|
||||||
|
10
search.go
10
search.go
@@ -210,12 +210,18 @@ func ParseAndUpdateArgs(tool *ToolCall, arguments any) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
b, err := json.Marshal(arguments)
|
buf := GetFreeBuffer()
|
||||||
|
defer pool.Put(buf)
|
||||||
|
|
||||||
|
enc := json.NewEncoder(buf)
|
||||||
|
enc.SetEscapeHTML(false)
|
||||||
|
|
||||||
|
err = enc.Encode(arguments)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tool.Args = string(b)
|
tool.Args = buf.String()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
13
stream.go
13
stream.go
@@ -27,6 +27,14 @@ var pool = sync.Pool{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetFreeBuffer() *bytes.Buffer {
|
||||||
|
buf := pool.Get().(*bytes.Buffer)
|
||||||
|
|
||||||
|
buf.Reset()
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
func NewStream(w http.ResponseWriter, ctx context.Context) (*Stream, error) {
|
func NewStream(w http.ResponseWriter, ctx context.Context) (*Stream, error) {
|
||||||
w.Header().Set("Content-Type", "text/event-stream")
|
w.Header().Set("Content-Type", "text/event-stream")
|
||||||
w.Header().Set("Cache-Control", "no-cache")
|
w.Header().Set("Cache-Control", "no-cache")
|
||||||
@@ -104,10 +112,7 @@ func WriteChunk(w http.ResponseWriter, ctx context.Context, chunk any) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := pool.Get().(*bytes.Buffer)
|
buf := GetFreeBuffer()
|
||||||
|
|
||||||
buf.Reset()
|
|
||||||
|
|
||||||
defer pool.Put(buf)
|
defer pool.Put(buf)
|
||||||
|
|
||||||
if err := json.NewEncoder(buf).Encode(chunk); err != nil {
|
if err := json.NewEncoder(buf).Encode(chunk); err != nil {
|
||||||
|
7
title.go
7
title.go
@@ -82,9 +82,10 @@ func HandleTitle(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var prompt strings.Builder
|
buf := GetFreeBuffer()
|
||||||
|
defer pool.Put(buf)
|
||||||
|
|
||||||
if err := InternalTitleTmpl.Execute(&prompt, raw); err != nil {
|
if err := InternalTitleTmpl.Execute(buf, raw); err != nil {
|
||||||
RespondJson(w, http.StatusInternalServerError, map[string]any{
|
RespondJson(w, http.StatusInternalServerError, map[string]any{
|
||||||
"error": err.Error(),
|
"error": err.Error(),
|
||||||
})
|
})
|
||||||
@@ -95,7 +96,7 @@ func HandleTitle(w http.ResponseWriter, r *http.Request) {
|
|||||||
request := openrouter.ChatCompletionRequest{
|
request := openrouter.ChatCompletionRequest{
|
||||||
Model: env.Settings.TitleModel,
|
Model: env.Settings.TitleModel,
|
||||||
Messages: []openrouter.ChatCompletionMessage{
|
Messages: []openrouter.ChatCompletionMessage{
|
||||||
openrouter.SystemMessage(prompt.String()),
|
openrouter.SystemMessage(buf.String()),
|
||||||
openrouter.UserMessage(strings.Join(messages, "\n")),
|
openrouter.UserMessage(strings.Join(messages, "\n")),
|
||||||
},
|
},
|
||||||
Temperature: 0.25,
|
Temperature: 0.25,
|
||||||
|
Reference in New Issue
Block a user