Dev starts on pi-native and keeps pi-agent available for a failed turn. Latency tuning stays deferred.
62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
package agent
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"chat-agent-system/internal/config"
|
|
)
|
|
|
|
type Request struct {
|
|
WorkDir string `json:"work_dir"`
|
|
Prompt string `json:"prompt"`
|
|
Instructions string `json:"instructions"`
|
|
Targets []string `json:"targets"`
|
|
Timeout time.Duration `json:"timeout"`
|
|
// ToolProfile is workspace (default, document tools) or reasoning (no tools).
|
|
ToolProfile string `json:"tool_profile,omitempty"`
|
|
}
|
|
|
|
const (
|
|
ToolProfileWorkspace = "workspace"
|
|
ToolProfileReasoning = "reasoning"
|
|
)
|
|
|
|
type Result struct {
|
|
Success bool `json:"success"`
|
|
Patches map[string][]byte `json:"patches"`
|
|
Logs string `json:"logs"`
|
|
ErrorReason string `json:"error_reason"`
|
|
// Retryable marks a provider-transient failure that may receive a
|
|
// fresh step invocation. Permanent missing deliverables stay false.
|
|
Retryable bool `json:"retryable,omitempty"`
|
|
// PromptTokens and CompletionTokens are set by pi-native when the provider reports usage.
|
|
PromptTokens int `json:"prompt_tokens,omitempty"`
|
|
CompletionTokens int `json:"completion_tokens,omitempty"`
|
|
}
|
|
|
|
type Backend interface {
|
|
Name() string
|
|
Execute(ctx context.Context, req Request) (*Result, error)
|
|
}
|
|
|
|
func NewBackend(name string, cfg *config.Config) Backend {
|
|
var inner Backend
|
|
switch name {
|
|
case "pi-agent":
|
|
inner = &PiAgentBackend{cfg: cfg}
|
|
case "pi-native":
|
|
inner = &fallbackBackend{
|
|
primary: NewPiNativeBackend(cfg),
|
|
fallback: &PiAgentBackend{cfg: cfg},
|
|
}
|
|
default:
|
|
inner = &StubBackend{}
|
|
}
|
|
max := 8
|
|
if cfg != nil && cfg.MaxConcurrentAgents > 0 {
|
|
max = cfg.MaxConcurrentAgents
|
|
}
|
|
return WrapWithConcurrencyLimit(inner, max)
|
|
}
|