426 lines
15 KiB
Go
426 lines
15 KiB
Go
package openai
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
func (s *Server) joinPresetChatIngress(r *http.Request, dispatch routeDispatch, rawBody []byte, runMeta map[string]string) (presetIngressResult, error) {
|
|
s.sweepLogicalRequestTTL()
|
|
requestContext := context.Background()
|
|
if r != nil {
|
|
requestContext = r.Context()
|
|
}
|
|
ownerEdgeID := s.edgeIDValue()
|
|
principalRef := runMeta[principalMetaRef]
|
|
if principalRef == "" {
|
|
principalRef = dispatch.PrincipalRef
|
|
}
|
|
if principalRef == "" {
|
|
principalRef = "anonymous"
|
|
}
|
|
presetGen := dispatch.PresetID
|
|
if presetGen == "" {
|
|
presetGen = dispatch.Preset.ID
|
|
}
|
|
if presetGen == "" {
|
|
presetGen = dispatch.ExternalModelID
|
|
}
|
|
if presetGen == "" {
|
|
presetGen = "gen-1"
|
|
}
|
|
|
|
if hasChatContinuationStructure(rawBody) {
|
|
contLineage, err := newChatContinuationLineage(rawBody)
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("invalid preset continuation payload: %w", err)
|
|
}
|
|
if s.artifactFrontiers != nil {
|
|
snap, disposition, matched, err := s.artifactFrontiers.consumeChat(
|
|
ownerEdgeID, principalRef, rawBody, contLineage, s.requestCoordinator, s.lightFlows,
|
|
)
|
|
if matched {
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("artifact continuation rejected: %w", err)
|
|
}
|
|
if disposition.PrimaryError != nil {
|
|
if err := s.lightFlows.updateArtifactLineage(snap.ID, ownerEdgeID, contLineage.Committed, false); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
cleanup, err := s.lightFlows.beginPrimaryErrorCleanup(requestContext, snap.ID, ownerEdgeID, *disposition.PrimaryError, s.requestCoordinator)
|
|
if err != nil {
|
|
if contextErr := requestContext.Err(); contextErr != nil {
|
|
return presetIngressResult{}, contextErr
|
|
}
|
|
runMeta["iop_logical_request_id"] = snap.ID
|
|
return presetIngressResult{Terminal: s.retainHotPathPrimaryErrorForTTL(snap.ID, *disposition.PrimaryError)}, nil
|
|
}
|
|
return presetIngressResult{Cleanup: &hotPathCleanupTurn{RequestID: snap.ID, Output: cleanup}}, nil
|
|
}
|
|
if err := s.applyArtifactDisposition(snap, disposition, runMeta); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
if err := s.lightFlows.updateArtifactLineage(snap.ID, ownerEdgeID, contLineage.Committed, disposition.Kind == artifactDispositionLocalEligible); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
return presetIngressResult{Artifact: disposition}, nil
|
|
}
|
|
}
|
|
if s.lightFlows != nil {
|
|
snap, disposition, matched, err := s.lightFlows.consumeChat(ownerEdgeID, principalRef, rawBody, contLineage, s.requestCoordinator)
|
|
if matched {
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("light continuation rejected: %w", err)
|
|
}
|
|
if disposition.Terminal != nil {
|
|
s.artifactFrontiers.remove(disposition.RequestID, ownerEdgeID)
|
|
runMeta["iop_logical_request_id"] = disposition.RequestID
|
|
return presetIngressResult{Terminal: disposition.Terminal}, nil
|
|
}
|
|
if err := s.applyLightDisposition(snap, disposition, runMeta); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
return presetIngressResult{Light: disposition}, nil
|
|
}
|
|
}
|
|
snap, err := s.requestCoordinator.consumeContinuationByLineage(ownerEdgeID, principalRef, contLineage)
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("preset continuation rejected: %w", err)
|
|
}
|
|
stageID, err := s.requestCoordinator.newStageID()
|
|
if err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
callID, err := s.requestCoordinator.newCallID()
|
|
if err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
if _, err := s.requestCoordinator.activateStage(snap.ID, ownerEdgeID, stageID); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
runMeta["iop_logical_request_id"] = snap.ID
|
|
runMeta["iop_call_id"] = callID
|
|
runMeta["iop_stage_id"] = stageID
|
|
return presetIngressResult{}, nil
|
|
}
|
|
|
|
initLineage, err := newChatRequestLineage(rawBody)
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("invalid preset request payload: %w", err)
|
|
}
|
|
binding, pinArtifact, err := s.compilePresetArtifactBinding(dispatch, "openai", rawBody)
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("preset workspace admission failed: %w", err)
|
|
}
|
|
snap, err := s.requestCoordinator.create(logicalRequestAdmission{
|
|
OwnerEdgeID: ownerEdgeID,
|
|
PrincipalRef: principalRef,
|
|
Lineage: initLineage,
|
|
PresetGeneration: presetGen,
|
|
})
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("preset begin admission failed: %w", err)
|
|
}
|
|
stageID, err := s.requestCoordinator.newStageID()
|
|
if err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
callID, err := s.requestCoordinator.newCallID()
|
|
if err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
if _, err := s.requestCoordinator.activateStage(snap.ID, ownerEdgeID, stageID); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
if pinArtifact {
|
|
if err := s.artifactFrontiers.pin(snap.ID, ownerEdgeID, principalRef, "openai", stageID, initLineage, binding); err != nil {
|
|
s.terminalPresetRequest(snap.ID, ownerEdgeID)
|
|
return presetIngressResult{}, fmt.Errorf("pin preset workspace binding: %w", err)
|
|
}
|
|
task, tools, err := hotPathIngressSeed("openai", rawBody)
|
|
if err != nil {
|
|
s.terminalPresetRequest(snap.ID, ownerEdgeID)
|
|
return presetIngressResult{}, fmt.Errorf("capture light input: %w", err)
|
|
}
|
|
if err := s.lightFlows.pin(snap.ID, ownerEdgeID, principalRef, "openai", stageID, initLineage, task, tools, binding, dispatch.Preset, dispatch); err != nil {
|
|
s.terminalPresetRequest(snap.ID, ownerEdgeID)
|
|
return presetIngressResult{}, fmt.Errorf("pin light flow: %w", err)
|
|
}
|
|
}
|
|
runMeta["iop_logical_request_id"] = snap.ID
|
|
runMeta["iop_call_id"] = callID
|
|
runMeta["iop_stage_id"] = stageID
|
|
return presetIngressResult{}, nil
|
|
}
|
|
|
|
func (s *Server) joinPresetAnthropicIngress(r *http.Request, dispatch routeDispatch, rawBody []byte, metadata map[string]string) (presetIngressResult, error) {
|
|
s.sweepLogicalRequestTTL()
|
|
requestContext := context.Background()
|
|
if r != nil {
|
|
requestContext = r.Context()
|
|
}
|
|
ownerEdgeID := s.edgeIDValue()
|
|
principalRef := metadata[principalMetaRef]
|
|
if principalRef == "" {
|
|
principalRef = dispatch.PrincipalRef
|
|
}
|
|
if principalRef == "" {
|
|
principalRef = "anonymous"
|
|
}
|
|
presetGen := dispatch.PresetID
|
|
if presetGen == "" {
|
|
presetGen = dispatch.Preset.ID
|
|
}
|
|
if presetGen == "" {
|
|
presetGen = dispatch.ExternalModelID
|
|
}
|
|
if presetGen == "" {
|
|
presetGen = "gen-1"
|
|
}
|
|
|
|
if hasAnthropicContinuationStructure(rawBody) {
|
|
contLineage, err := newAnthropicContinuationLineage(rawBody)
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("invalid preset continuation payload: %w", err)
|
|
}
|
|
if s.artifactFrontiers != nil {
|
|
snap, disposition, matched, err := s.artifactFrontiers.consumeAnthropic(
|
|
ownerEdgeID, principalRef, rawBody, contLineage, s.requestCoordinator, s.lightFlows,
|
|
)
|
|
if matched {
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("artifact continuation rejected: %w", err)
|
|
}
|
|
if disposition.PrimaryError != nil {
|
|
if err := s.lightFlows.updateArtifactLineage(snap.ID, ownerEdgeID, contLineage.Committed, false); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
cleanup, err := s.lightFlows.beginPrimaryErrorCleanup(requestContext, snap.ID, ownerEdgeID, *disposition.PrimaryError, s.requestCoordinator)
|
|
if err != nil {
|
|
if contextErr := requestContext.Err(); contextErr != nil {
|
|
return presetIngressResult{}, contextErr
|
|
}
|
|
metadata["iop_logical_request_id"] = snap.ID
|
|
return presetIngressResult{Terminal: s.retainHotPathPrimaryErrorForTTL(snap.ID, *disposition.PrimaryError)}, nil
|
|
}
|
|
return presetIngressResult{Cleanup: &hotPathCleanupTurn{RequestID: snap.ID, Output: cleanup}}, nil
|
|
}
|
|
if err := s.applyArtifactDisposition(snap, disposition, metadata); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
if err := s.lightFlows.updateArtifactLineage(snap.ID, ownerEdgeID, contLineage.Committed, disposition.Kind == artifactDispositionLocalEligible); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
return presetIngressResult{Artifact: disposition}, nil
|
|
}
|
|
}
|
|
if s.lightFlows != nil {
|
|
snap, disposition, matched, err := s.lightFlows.consumeAnthropic(ownerEdgeID, principalRef, rawBody, contLineage, s.requestCoordinator)
|
|
if matched {
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("light continuation rejected: %w", err)
|
|
}
|
|
if disposition.Terminal != nil {
|
|
s.artifactFrontiers.remove(disposition.RequestID, ownerEdgeID)
|
|
metadata["iop_logical_request_id"] = disposition.RequestID
|
|
return presetIngressResult{Terminal: disposition.Terminal}, nil
|
|
}
|
|
if err := s.applyLightDisposition(snap, disposition, metadata); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
return presetIngressResult{Light: disposition}, nil
|
|
}
|
|
}
|
|
snap, err := s.requestCoordinator.consumeContinuationByLineage(ownerEdgeID, principalRef, contLineage)
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("preset continuation rejected: %w", err)
|
|
}
|
|
stageID, err := s.requestCoordinator.newStageID()
|
|
if err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
callID, err := s.requestCoordinator.newCallID()
|
|
if err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
if _, err := s.requestCoordinator.activateStage(snap.ID, ownerEdgeID, stageID); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
metadata["iop_logical_request_id"] = snap.ID
|
|
metadata["iop_call_id"] = callID
|
|
metadata["iop_stage_id"] = stageID
|
|
return presetIngressResult{}, nil
|
|
}
|
|
|
|
initLineage, err := newAnthropicRequestLineage(rawBody)
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("invalid preset request payload: %w", err)
|
|
}
|
|
binding, pinArtifact, err := s.compilePresetArtifactBinding(dispatch, "anthropic", rawBody)
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("preset workspace admission failed: %w", err)
|
|
}
|
|
snap, err := s.requestCoordinator.create(logicalRequestAdmission{
|
|
OwnerEdgeID: ownerEdgeID,
|
|
PrincipalRef: principalRef,
|
|
Lineage: initLineage,
|
|
PresetGeneration: presetGen,
|
|
})
|
|
if err != nil {
|
|
return presetIngressResult{}, fmt.Errorf("preset begin admission failed: %w", err)
|
|
}
|
|
stageID, err := s.requestCoordinator.newStageID()
|
|
if err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
callID, err := s.requestCoordinator.newCallID()
|
|
if err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
if _, err := s.requestCoordinator.activateStage(snap.ID, ownerEdgeID, stageID); err != nil {
|
|
return presetIngressResult{}, err
|
|
}
|
|
if pinArtifact {
|
|
if err := s.artifactFrontiers.pin(snap.ID, ownerEdgeID, principalRef, "anthropic", stageID, initLineage, binding); err != nil {
|
|
s.terminalPresetRequest(snap.ID, ownerEdgeID)
|
|
return presetIngressResult{}, fmt.Errorf("pin preset workspace binding: %w", err)
|
|
}
|
|
task, tools, err := hotPathIngressSeed("anthropic", rawBody)
|
|
if err != nil {
|
|
s.terminalPresetRequest(snap.ID, ownerEdgeID)
|
|
return presetIngressResult{}, fmt.Errorf("capture light input: %w", err)
|
|
}
|
|
if err := s.lightFlows.pin(snap.ID, ownerEdgeID, principalRef, "anthropic", stageID, initLineage, task, tools, binding, dispatch.Preset, dispatch); err != nil {
|
|
s.terminalPresetRequest(snap.ID, ownerEdgeID)
|
|
return presetIngressResult{}, fmt.Errorf("pin light flow: %w", err)
|
|
}
|
|
}
|
|
metadata["iop_logical_request_id"] = snap.ID
|
|
metadata["iop_call_id"] = callID
|
|
metadata["iop_stage_id"] = stageID
|
|
return presetIngressResult{}, nil
|
|
}
|
|
|
|
func (s *Server) applyLightDisposition(snap logicalRequestSnapshot, disposition hotPathLightDisposition, metadata map[string]string) error {
|
|
if metadata == nil || disposition.RequestID == "" || disposition.StageID == "" {
|
|
return fmt.Errorf("light continuation metadata is unavailable")
|
|
}
|
|
callID, err := s.requestCoordinator.newCallID()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
metadata["iop_logical_request_id"] = disposition.RequestID
|
|
metadata["iop_call_id"] = callID
|
|
metadata["iop_stage_id"] = disposition.StageID
|
|
_ = snap
|
|
return nil
|
|
}
|
|
|
|
func hotPathIngressSeed(protocol string, rawBody []byte) (string, any, error) {
|
|
tools, err := decodeArtifactTools(protocol, rawBody)
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
switch protocol {
|
|
case "openai":
|
|
var req chatCompletionRequest
|
|
if err := decodeChatCompletionRequestLenient(json.NewDecoder(strings.NewReader(string(rawBody))), &req); err != nil {
|
|
return "", nil, err
|
|
}
|
|
return promptFromMessages(req.Messages), tools, nil
|
|
case "anthropic":
|
|
req, err := decodeAnthropicMessageRequest(rawBody, true)
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
var parts []string
|
|
system, err := decodeAnthropicSystem(req.System)
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
for _, block := range system {
|
|
if strings.TrimSpace(block.Text) != "" {
|
|
parts = append(parts, "system: "+strings.TrimSpace(block.Text))
|
|
}
|
|
}
|
|
for _, message := range req.Messages {
|
|
blocks, err := decodeAnthropicContent(message.Content)
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
for _, block := range blocks {
|
|
if block.Type == "text" && strings.TrimSpace(block.Text) != "" {
|
|
parts = append(parts, message.Role+": "+strings.TrimSpace(block.Text))
|
|
}
|
|
}
|
|
}
|
|
return strings.Join(parts, "\n"), tools, nil
|
|
default:
|
|
return "", nil, fmt.Errorf("unsupported hot path protocol %q", protocol)
|
|
}
|
|
}
|
|
|
|
func (s *Server) compilePresetArtifactBinding(dispatch routeDispatch, protocol string, rawBody []byte) (*workspaceBinding, bool, error) {
|
|
preset := dispatch.Preset
|
|
if preset.ID == "" {
|
|
if found, ok := s.ExecutionPreset(dispatch.PresetID); ok {
|
|
preset = found
|
|
}
|
|
}
|
|
if !isModeAllowed(preset, modeLight) {
|
|
return nil, false, nil
|
|
}
|
|
tools, err := decodeArtifactTools(protocol, rawBody)
|
|
if err != nil {
|
|
return nil, false, err
|
|
}
|
|
binding, err := compileWorkspaceBinding(preset.WorkspaceTools, tools)
|
|
if err != nil {
|
|
return nil, false, err
|
|
}
|
|
return binding, true, nil
|
|
}
|
|
|
|
func hasChatContinuationStructure(rawBody []byte) bool {
|
|
var env struct {
|
|
Messages []struct {
|
|
Role string `json:"role"`
|
|
} `json:"messages"`
|
|
}
|
|
if err := json.Unmarshal(rawBody, &env); err != nil || len(env.Messages) == 0 {
|
|
return false
|
|
}
|
|
lastRole := env.Messages[len(env.Messages)-1].Role
|
|
return lastRole == "tool"
|
|
}
|
|
|
|
func hasAnthropicContinuationStructure(rawBody []byte) bool {
|
|
var env struct {
|
|
Messages []struct {
|
|
Role string `json:"role"`
|
|
Content json.RawMessage `json:"content"`
|
|
} `json:"messages"`
|
|
}
|
|
if err := json.Unmarshal(rawBody, &env); err != nil || len(env.Messages) == 0 {
|
|
return false
|
|
}
|
|
last := env.Messages[len(env.Messages)-1]
|
|
if last.Role != "user" || len(last.Content) == 0 {
|
|
return false
|
|
}
|
|
var blocks []struct {
|
|
Type string `json:"type"`
|
|
}
|
|
if err := json.Unmarshal(last.Content, &blocks); err != nil || len(blocks) == 0 {
|
|
return false
|
|
}
|
|
for _, b := range blocks {
|
|
if b.Type == "tool_result" {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|