diff --git a/chat.go b/chat.go index 31d942e..eb1dcfa 100644 --- a/chat.go +++ b/chat.go @@ -14,14 +14,20 @@ import ( "github.com/revrost/go-openrouter" ) +type ToolReasoning struct { + Format string `msgpack:"format"` + Encrypted string `msgpack:"encrypted"` +} + type ToolCall struct { - ID string `msgpack:"id"` - Name string `msgpack:"name"` - Args string `msgpack:"args"` - Result string `msgpack:"result,omitempty"` - Done bool `msgpack:"done,omitempty"` - Invalid bool `msgpack:"invalid,omitempty"` - Cost float64 `msgpack:"cost,omitempty"` + ID string `msgpack:"id"` + Name string `msgpack:"name"` + Args string `msgpack:"args"` + Result string `msgpack:"result,omitempty"` + Done bool `msgpack:"done,omitempty"` + Invalid bool `msgpack:"invalid,omitempty"` + Cost float64 `msgpack:"cost,omitempty"` + Reasoning *ToolReasoning `msgpack:"reasoning,omitempty"` } type TextFile struct { @@ -69,7 +75,7 @@ func (t *ToolCall) AsAssistantToolCall(content string) openrouter.ChatCompletion content = " " } - return openrouter.ChatCompletionMessage{ + call := openrouter.ChatCompletionMessage{ Role: openrouter.ChatMessageRoleAssistant, Content: openrouter.Content{ Text: content, @@ -85,6 +91,20 @@ func (t *ToolCall) AsAssistantToolCall(content string) openrouter.ChatCompletion }, }, } + + if t.Reasoning != nil { + call.ReasoningDetails = []openrouter.ChatCompletionReasoningDetails{ + { + Type: openrouter.ReasoningDetailsTypeEncrypted, + Data: t.Reasoning.Encrypted, + ID: t.ID, + Format: t.Reasoning.Format, + Index: 0, + }, + } + } + + return call } func (t *ToolCall) AsToolMessage() openrouter.ChatCompletionMessage { @@ -521,6 +541,19 @@ func RunCompletion(ctx context.Context, response *Stream, request *openrouter.Ch tool.Name += call.Function.Name } + if len(delta.ReasoningDetails) != 0 && tool.Reasoning == nil { + for _, details := range delta.ReasoningDetails { + if details.Type != openrouter.ReasoningDetailsTypeEncrypted { + continue + } + + tool.Reasoning = &ToolReasoning{ + Format: details.Format, + Encrypted: details.Data, + } + } + } + open += strings.Count(call.Function.Arguments, "{") close += strings.Count(call.Function.Arguments, "}") diff --git a/go.mod b/go.mod index f7e19e7..3e7829d 100644 --- a/go.mod +++ b/go.mod @@ -18,3 +18,5 @@ require ( golang.org/x/sys v0.37.0 // indirect golang.org/x/term v0.36.0 // indirect ) + +replace github.com/revrost/go-openrouter => github.com/coalaura/go-openrouter v0.0.2-0.20251118165837-080dd9683303 diff --git a/go.sum b/go.sum index 08aa7a1..b758d9f 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/coalaura/go-openrouter v0.0.2-0.20251118165837-080dd9683303 h1:Y7ROVL2NxI5Yc04fApAxqExkzBigrWiWv5ag209uNM0= +github.com/coalaura/go-openrouter v0.0.2-0.20251118165837-080dd9683303/go.mod h1:jZFcumFqvS25o8oEQc1/+4yeK7lHDSnwPMIJ/pKPdNc= github.com/coalaura/plain v0.2.0 h1:naGiTT1nmZO78IGHOajm0wc/X4sqaG6g3CSR3Ha9f6w= github.com/coalaura/plain v0.2.0/go.mod h1:HR/sQt288EMTF3aSEGKHwPmGYFU4FOrfarMUf6ifnLo= github.com/containerd/console v1.0.5 h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc= @@ -12,8 +14,6 @@ github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/revrost/go-openrouter v0.2.6 h1:5riNi1FaWHIC2A2EP5hGunUGfU998vcz+CsIWsOWjx0= -github.com/revrost/go-openrouter v0.2.6/go.mod h1:jZFcumFqvS25o8oEQc1/+4yeK7lHDSnwPMIJ/pKPdNc= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=