Publish Docker image (Multi-arch) / Build & push (amd64) (push) Failing after 1m40s
Release (Linux, macOS, Windows) / Linux Release (push) Failing after 42m16s
Publish Docker image (Multi-arch) / Build & push (arm64) (push) Canceled after 0s
Release (Linux, macOS, Windows) / macOS Release (push) Canceled after 0s
Release (Linux, macOS, Windows) / Windows Release (push) Canceled after 0s
Publish Docker image (Multi-arch) / Create multi-arch manifests (push) Canceled after 0s
Sync production source including routing, billing, Astra detection and public uptime. Update custom build instructions and license packaging.
58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
package helper
|
|
|
|
import (
|
|
"errors"
|
|
|
|
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
|
"github.com/QuantumNous/new-api/relaykit/types"
|
|
)
|
|
|
|
// StreamResult is passed to each dataHandler invocation, providing methods
|
|
// to record soft errors, signal fatal stops, or mark normal completion.
|
|
// StreamScannerHandler checks IsStopped() after each callback invocation.
|
|
type StreamResult struct {
|
|
status *relaycommon.StreamStatus
|
|
stopped bool
|
|
}
|
|
|
|
func newStreamResult(status *relaycommon.StreamStatus) *StreamResult {
|
|
return &StreamResult{status: status}
|
|
}
|
|
|
|
// Error records a soft error. The stream continues processing.
|
|
// Can be called multiple times per chunk.
|
|
func (r *StreamResult) Error(err error) {
|
|
if err == nil {
|
|
return
|
|
}
|
|
r.status.RecordError(err.Error())
|
|
var apiErr *types.NewAPIError
|
|
if errors.As(err, &apiErr) {
|
|
r.status.MarkFailed(string(apiErr.GetErrorCode()), apiErr.ToOpenAIError().Type, apiErr.StatusCode)
|
|
}
|
|
}
|
|
|
|
// Stop records a fatal error and marks the stream to stop after this chunk.
|
|
func (r *StreamResult) Stop(err error) {
|
|
r.Error(err)
|
|
r.status.SetEndReason(relaycommon.StreamEndReasonHandlerStop, err)
|
|
r.stopped = true
|
|
}
|
|
|
|
// Done signals that the handler has finished processing normally
|
|
// (e.g., Dify "message_end"). The stream stops after this chunk.
|
|
func (r *StreamResult) Done() {
|
|
r.status.SetEndReason(relaycommon.StreamEndReasonDone, nil)
|
|
r.stopped = true
|
|
}
|
|
|
|
// IsStopped returns whether Stop() or Done() was called during this chunk.
|
|
func (r *StreamResult) IsStopped() bool {
|
|
return r.stopped
|
|
}
|
|
|
|
// reset clears the per-chunk stopped flag so the object can be reused.
|
|
func (r *StreamResult) reset() {
|
|
r.stopped = false
|
|
}
|