@@ -9,6 +9,7 @@ import (
99
1010 "charm.land/fantasy"
1111 "charm.land/fantasy/providers/anthropic"
12+ "charm.land/fantasy/providers/openai"
1213 "github.com/charmbracelet/catwalk/pkg/catwalk"
1314)
1415
@@ -40,10 +41,11 @@ type ContentPart interface {
4041}
4142
4243type ReasoningContent struct {
43− Thinking string `json:"thinking"`
44− Signature string `json:"signature"`
45− StartedAt int64 `json:"started_at,omitempty"`
46− FinishedAt int64 `json:"finished_at,omitempty"`
44+ Thinking string `json:"thinking"`
45+ Signature string `json:"signature"`
46+ ResponsesData *openai.ResponsesReasoningMetadata `json:"responses_data"`
47+ StartedAt int64 `json:"started_at,omitempty"`
48+ FinishedAt int64 `json:"finished_at,omitempty"`
4749}
4850
4951func (tc ReasoningContent) String() string {
@@ -272,6 +274,20 @@ func (m *Message) AppendReasoningSignature(signature string) {
272274 m.Parts = append(m.Parts, ReasoningContent{Signature: signature})
273275}
274276
277+func (m *Message) SetReasoningResponsesData(data *openai.ResponsesReasoningMetadata) {
278+ for i, part := range m.Parts {
279+ if c, ok := part.(ReasoningContent); ok {
280+ m.Parts[i] = ReasoningContent{
281+ Thinking: c.Thinking,
282+ ResponsesData: data,
283+ StartedAt: c.StartedAt,
284+ FinishedAt: c.FinishedAt,
285+ }
286+ return
287+ }
288+ }
289+}
290+
275291func (m *Message) FinishThinking() {
276292 for i, part := range m.Parts {
277293 if c, ok := part.(ReasoningContent); ok {
@@ -420,10 +436,13 @@ func (m *Message) ToAIMessage() []fantasy.Message {
420436 if reasoning.Thinking != "" {
421437 reasoningPart := fantasy.ReasoningPart{Text: reasoning.Thinking, ProviderOptions: fantasy.ProviderOptions{}}
422438 if reasoning.Signature != "" {
423− reasoningPart.ProviderOptions["anthropic"] = &anthropic.ReasoningOptionMetadata{
439+ reasoningPart.ProviderOptions[anthropic.Name] = &anthropic.ReasoningOptionMetadata{
424440 Signature: reasoning.Signature,
425441 }
426442 }
443+ if reasoning.ResponsesData != nil {
444+ reasoningPart.ProviderOptions[openai.Name] = reasoning.ResponsesData
445+ }
427446 parts = append(parts, reasoningPart)
428447 }
429448 for _, call := range m.ToolCalls() {