Share image input across agent vendors
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
package agentinput
|
||||
|
||||
type Image struct {
|
||||
MediaType string
|
||||
Data []byte
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"g.fc.run/ai/byre/internal/agentinput"
|
||||
"g.fc.run/ai/byre/internal/api"
|
||||
"g.fc.run/ai/byre/internal/claude"
|
||||
"g.fc.run/ai/byre/internal/clients"
|
||||
@@ -602,7 +603,7 @@ func (m *Manager) launch(ctx context.Context, sess api.AgentSession, task api.Ta
|
||||
return m.store.GetSession(ctx, sess.Id)
|
||||
}
|
||||
|
||||
func (m *Manager) deliver(ctx context.Context, sess api.AgentSession, task api.Task, actor, client, text string, imgs []image, compacting bool) error {
|
||||
func (m *Manager) deliver(ctx context.Context, sess api.AgentSession, task api.Task, actor, client, text string, imgs []agentinput.Image, compacting bool) error {
|
||||
l, err := m.ensureLive(ctx, sess, task)
|
||||
if err == nil {
|
||||
err = m.syncModel(ctx, l, sess.Model)
|
||||
@@ -642,14 +643,14 @@ func (m *Manager) deliverRecorded(ctx context.Context, sess api.AgentSession, ta
|
||||
return true, m.deliver(ctx, sess, task, ev.Actor, client, text, imgs, isHandoffPrompt(ev.Actor, text))
|
||||
}
|
||||
|
||||
func (m *Manager) readImages(ctx context.Context, ids []string) ([]image, error) {
|
||||
imgs := []image{}
|
||||
func (m *Manager) readImages(ctx context.Context, ids []string) ([]agentinput.Image, error) {
|
||||
imgs := []agentinput.Image{}
|
||||
for _, id := range ids {
|
||||
b, data, err := m.store.ReadBlob(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
imgs = append(imgs, image{mediaType: b.ContentType, data: data})
|
||||
imgs = append(imgs, agentinput.Image{MediaType: b.ContentType, Data: data})
|
||||
}
|
||||
return imgs, nil
|
||||
}
|
||||
@@ -702,7 +703,7 @@ func (m *Manager) message(ctx context.Context, sess api.AgentSession, task api.T
|
||||
return m.send(ctx, l, m.agentText(actor, "", text), imgs)
|
||||
}
|
||||
|
||||
func (m *Manager) send(ctx context.Context, l *live, text string, imgs []image) error {
|
||||
func (m *Manager) send(ctx context.Context, l *live, text string, imgs []agentinput.Image) error {
|
||||
err := l.sess.send(ctx, text, imgs)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -710,7 +711,7 @@ func (m *Manager) send(ctx context.Context, l *live, text string, imgs []image)
|
||||
return m.store.MarkSessionDelivered(ctx, l.id)
|
||||
}
|
||||
|
||||
func (m *Manager) recordMessage(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID, client string, images []string) ([]image, bool, error) {
|
||||
func (m *Manager) recordMessage(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID, client string, images []string) ([]agentinput.Image, bool, error) {
|
||||
implementer := sess.Role == api.Implementer
|
||||
if implementer && isMergeInPrompt(actor, text) {
|
||||
m.ownMerge(sess.Id, task.Id, task.WorktreePath)
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"g.fc.run/ai/byre/internal/agentinput"
|
||||
"g.fc.run/ai/byre/internal/antigravity"
|
||||
"g.fc.run/ai/byre/internal/api"
|
||||
"g.fc.run/ai/byre/internal/claude"
|
||||
@@ -17,13 +18,8 @@ import (
|
||||
"g.fc.run/ai/byre/internal/mcp"
|
||||
)
|
||||
|
||||
type image struct {
|
||||
mediaType string
|
||||
data []byte
|
||||
}
|
||||
|
||||
type agentProcess interface {
|
||||
send(ctx context.Context, text string, images []image) error
|
||||
send(ctx context.Context, text string, images []agentinput.Image) error
|
||||
interrupt(ctx context.Context) error
|
||||
setModel(ctx context.Context, model string) error
|
||||
kill()
|
||||
@@ -118,12 +114,8 @@ func (m *Manager) startClaude(ctx context.Context, sess api.AgentSession, l *liv
|
||||
return claudeProcess{s: s}, nil
|
||||
}
|
||||
|
||||
func (p claudeProcess) send(ctx context.Context, text string, images []image) error {
|
||||
imgs := []claude.Image{}
|
||||
for _, img := range images {
|
||||
imgs = append(imgs, claude.Image{MediaType: img.mediaType, Data: img.data})
|
||||
}
|
||||
return p.s.Send(text, imgs...)
|
||||
func (p claudeProcess) send(ctx context.Context, text string, images []agentinput.Image) error {
|
||||
return p.s.Send(text, images...)
|
||||
}
|
||||
|
||||
func (p claudeProcess) interrupt(ctx context.Context) error {
|
||||
@@ -196,12 +188,8 @@ func (m *Manager) startCodex(ctx context.Context, sess api.AgentSession, l *live
|
||||
return codexProcess{s: s}, nil
|
||||
}
|
||||
|
||||
func (p codexProcess) send(ctx context.Context, text string, images []image) error {
|
||||
imgs := []codex.Image{}
|
||||
for _, img := range images {
|
||||
imgs = append(imgs, codex.Image{MediaType: img.mediaType, Data: img.data})
|
||||
}
|
||||
_, err := p.s.Send(ctx, text, imgs...)
|
||||
func (p codexProcess) send(ctx context.Context, text string, images []agentinput.Image) error {
|
||||
_, err := p.s.Send(ctx, text, images...)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -267,12 +255,8 @@ func (m *Manager) startAntigravity(ctx context.Context, sess api.AgentSession, l
|
||||
return antigravityProcess{s: s}, nil
|
||||
}
|
||||
|
||||
func (p antigravityProcess) send(ctx context.Context, text string, images []image) error {
|
||||
imgs := []antigravity.Image{}
|
||||
for _, img := range images {
|
||||
imgs = append(imgs, antigravity.Image{MediaType: img.mediaType, Data: img.data})
|
||||
}
|
||||
return p.s.Send(text, imgs...)
|
||||
func (p antigravityProcess) send(ctx context.Context, text string, images []agentinput.Image) error {
|
||||
return p.s.Send(text, images...)
|
||||
}
|
||||
|
||||
func (p antigravityProcess) interrupt(ctx context.Context) error {
|
||||
|
||||
@@ -20,6 +20,7 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"g.fc.run/ai/byre/internal/agentinput"
|
||||
"g.fc.run/ai/byre/internal/mcp"
|
||||
"g.fc.run/ai/byre/internal/procgroup"
|
||||
)
|
||||
@@ -43,11 +44,6 @@ type Options struct {
|
||||
OnBadLine func(line []byte, reason string)
|
||||
}
|
||||
|
||||
type Image struct {
|
||||
MediaType string
|
||||
Data []byte
|
||||
}
|
||||
|
||||
type Event struct {
|
||||
Kind string
|
||||
Raw json.RawMessage
|
||||
@@ -460,7 +456,7 @@ type block struct {
|
||||
Text string `json:"text"`
|
||||
}
|
||||
|
||||
func (s *Session) Send(text string, images ...Image) error {
|
||||
func (s *Session) Send(text string, images ...agentinput.Image) error {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"g.fc.run/ai/byre/internal/agentinput"
|
||||
"g.fc.run/ai/byre/internal/mcp"
|
||||
"g.fc.run/ai/byre/internal/procgroup"
|
||||
)
|
||||
@@ -427,12 +428,7 @@ func (s *Session) ID() string {
|
||||
return s.id
|
||||
}
|
||||
|
||||
type Image struct {
|
||||
MediaType string
|
||||
Data []byte
|
||||
}
|
||||
|
||||
func (s *Session) Send(text string, images ...Image) error {
|
||||
func (s *Session) Send(text string, images ...agentinput.Image) error {
|
||||
var content any = text
|
||||
if len(images) > 0 {
|
||||
blocks := []map[string]any{}
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"g.fc.run/ai/byre/internal/agentinput"
|
||||
"g.fc.run/ai/byre/internal/mcp"
|
||||
"g.fc.run/ai/byre/internal/procgroup"
|
||||
)
|
||||
@@ -58,11 +59,6 @@ func (e Event) Decode() (any, error) {
|
||||
return v, nil
|
||||
}
|
||||
|
||||
type Image struct {
|
||||
MediaType string
|
||||
Data []byte
|
||||
}
|
||||
|
||||
type RPCError struct {
|
||||
Code int64 `json:"code"`
|
||||
Message string `json:"message"`
|
||||
@@ -368,7 +364,7 @@ func (s *Session) SetModel(model string) {
|
||||
s.stateMu.Unlock()
|
||||
}
|
||||
|
||||
func (s *Session) Send(ctx context.Context, text string, images ...Image) (Turn, error) {
|
||||
func (s *Session) Send(ctx context.Context, text string, images ...agentinput.Image) (Turn, error) {
|
||||
input := []UserInput{}
|
||||
for _, img := range images {
|
||||
input = append(input, UserInput{
|
||||
|
||||
Reference in New Issue
Block a user