2026-10-17 18:51:17 +00:00
|
|
|
package ckprompt
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
promptkit "gitea.maximumdirect.net/eric/promptkit"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type smokeReportDTO struct {
|
|
|
|
|
Kind promptkit.SmokeTestKind `yaml:"kind"`
|
|
|
|
|
Supported bool `yaml:"supported"`
|
|
|
|
|
Applicable *bool `yaml:"applicable"`
|
|
|
|
|
Completed bool `yaml:"completed"`
|
|
|
|
|
Reason promptkit.SmokeTestReason `yaml:"reason"`
|
|
|
|
|
Target smokeTargetDTO `yaml:"target"`
|
|
|
|
|
Facts smokeFactsDTO `yaml:"facts"`
|
|
|
|
|
Timing smokeTimingDTO `yaml:"timing"`
|
|
|
|
|
Attempts []smokeAttemptDTO `yaml:"attempts"`
|
|
|
|
|
Usage smokeUsageDTO `yaml:"usage"`
|
|
|
|
|
Failure promptkit.ExecutionFailureKind `yaml:"failure"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeTargetDTO struct {
|
|
|
|
|
BackendID string `yaml:"backend_id"`
|
|
|
|
|
ProfileID string `yaml:"profile_id"`
|
|
|
|
|
PromptID string `yaml:"prompt_id"`
|
|
|
|
|
PromptVersion *string `yaml:"version,omitempty"`
|
|
|
|
|
DefaultSourceBackendID string `yaml:"default_source_backend_id"`
|
|
|
|
|
SelectionSource string `yaml:"selection_source"`
|
|
|
|
|
Endpoint string `yaml:"endpoint"`
|
|
|
|
|
EffectiveSettings smokeExecutionTargetDTO `yaml:"effective_settings"`
|
|
|
|
|
SettingsPresence smokeSettingsPresenceDTO `yaml:"settings_presence"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeSettingsPresenceDTO struct {
|
|
|
|
|
Temperature bool `yaml:"temperature"`
|
|
|
|
|
MaxTokens bool `yaml:"max_tokens"`
|
|
|
|
|
TopP bool `yaml:"top_p"`
|
|
|
|
|
TimeoutSeconds bool `yaml:"timeout_seconds"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeExecutionTargetDTO struct {
|
|
|
|
|
BackendID string `yaml:"backend_id,omitempty"`
|
|
|
|
|
Endpoint string `yaml:"endpoint"`
|
|
|
|
|
Model string `yaml:"model"`
|
|
|
|
|
Temperature float64 `yaml:"temperature"`
|
|
|
|
|
MaxTokens int `yaml:"max_tokens"`
|
|
|
|
|
TopP float64 `yaml:"top_p"`
|
|
|
|
|
TimeoutSeconds int `yaml:"timeout_seconds"`
|
|
|
|
|
ServiceTier string `yaml:"service_tier"`
|
|
|
|
|
ReasoningEffort string `yaml:"reasoning_effort"`
|
|
|
|
|
APIKeyEnv string `yaml:"api_key_env"`
|
|
|
|
|
ExtraParams map[string]any `yaml:"extra_params"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeFactsDTO struct {
|
|
|
|
|
CredentialsSupplied *bool `yaml:"credentials_supplied"`
|
|
|
|
|
EndpointReachable *bool `yaml:"endpoint_reachable"`
|
|
|
|
|
CredentialsAccepted *bool `yaml:"credentials_accepted"`
|
|
|
|
|
ResponseReceived *bool `yaml:"response_received"`
|
|
|
|
|
GenerationCompleted *bool `yaml:"generation_completed"`
|
|
|
|
|
TextReturned *bool `yaml:"text_returned"`
|
|
|
|
|
ExpectedTextMatched *bool `yaml:"expected_text_matched"`
|
|
|
|
|
StructuredOutputRequested *bool `yaml:"structured_output_requested"`
|
|
|
|
|
ValidJSON *bool `yaml:"valid_json"`
|
|
|
|
|
SchemaMatched *bool `yaml:"schema_matched"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeTimingDTO struct {
|
|
|
|
|
StartedAt time.Time `yaml:"started_at"`
|
|
|
|
|
Duration string `yaml:"duration"`
|
|
|
|
|
CapacityWait *string `yaml:"capacity_wait"`
|
|
|
|
|
RequestDuration *string `yaml:"request_duration"`
|
|
|
|
|
RetryDelay *string `yaml:"retry_delay"`
|
|
|
|
|
EvaluationDuration *string `yaml:"evaluation_duration"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeAttemptDTO struct {
|
|
|
|
|
Dispatched bool `yaml:"dispatched"`
|
|
|
|
|
InitialEndpoint string `yaml:"initial_endpoint"`
|
|
|
|
|
Endpoint string `yaml:"endpoint"`
|
|
|
|
|
HTTPStatus *int `yaml:"http_status"`
|
|
|
|
|
Facts smokeFactsDTO `yaml:"facts"`
|
|
|
|
|
Timing smokeTimingDTO `yaml:"timing"`
|
|
|
|
|
Failure promptkit.ExecutionFailureKind `yaml:"failure"`
|
|
|
|
|
Usage smokeUsageDTO `yaml:"usage"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeUsageDTO struct {
|
|
|
|
|
PromptTokens promptkit.ObservedTokenCount `yaml:"prompt_tokens"`
|
|
|
|
|
CompletionTokens promptkit.ObservedTokenCount `yaml:"completion_tokens"`
|
|
|
|
|
TotalTokens promptkit.ObservedTokenCount `yaml:"total_tokens"`
|
|
|
|
|
CachedTokens promptkit.ObservedTokenCount `yaml:"cached_tokens"`
|
|
|
|
|
CacheWriteTokens promptkit.ObservedTokenCount `yaml:"cache_write_tokens"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeAggregateDTO struct {
|
|
|
|
|
Tests []smokeResultDTO `yaml:"tests"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeResultDTO struct {
|
|
|
|
|
Kind promptkit.SmokeTestKind `yaml:"kind"`
|
|
|
|
|
Report *smokeReportDTO `yaml:"report"`
|
2026-10-18 13:28:29 +00:00
|
|
|
Error *string `yaml:"error,omitempty"`
|
2026-10-17 18:51:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type smokeResult struct {
|
|
|
|
|
Kind promptkit.SmokeTestKind
|
|
|
|
|
Report *promptkit.SmokeTestReport
|
|
|
|
|
Err error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func encodeSmokeReport(report *promptkit.SmokeTestReport) ([]byte, error) {
|
|
|
|
|
return encodePromptYAMLBytes(smokeReportFromNative(report))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func encodeSmokeResults(results []smokeResult) ([]byte, error) {
|
|
|
|
|
entries := make([]smokeResultDTO, len(results))
|
|
|
|
|
for index, result := range results {
|
|
|
|
|
entries[index] = smokeResultDTO{
|
|
|
|
|
Kind: result.Kind,
|
|
|
|
|
Report: smokeReportFromNative(result.Report),
|
|
|
|
|
}
|
|
|
|
|
if result.Err != nil {
|
2026-10-18 13:28:29 +00:00
|
|
|
message := result.Err.Error()
|
|
|
|
|
entries[index].Error = &message
|
2026-10-17 18:51:17 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return encodePromptYAMLBytes(smokeAggregateDTO{Tests: entries})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func smokeReportFromNative(report *promptkit.SmokeTestReport) *smokeReportDTO {
|
|
|
|
|
if report == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
attempts := make([]smokeAttemptDTO, len(report.Attempts))
|
|
|
|
|
for index, attempt := range report.Attempts {
|
|
|
|
|
attempts[index] = smokeAttemptDTO{
|
|
|
|
|
Dispatched: attempt.Dispatched,
|
|
|
|
|
InitialEndpoint: attempt.InitialEndpoint,
|
|
|
|
|
Endpoint: attempt.Endpoint,
|
|
|
|
|
HTTPStatus: attempt.HTTPStatus,
|
|
|
|
|
Facts: smokeFactsFromNative(attempt.Facts),
|
|
|
|
|
Timing: smokeTimingFromNative(attempt.Timing),
|
|
|
|
|
Failure: attempt.Failure,
|
|
|
|
|
Usage: smokeUsageFromNative(attempt.Usage),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
target := report.Target
|
|
|
|
|
settings := target.EffectiveSettings
|
|
|
|
|
return &smokeReportDTO{
|
|
|
|
|
Kind: report.Kind,
|
|
|
|
|
Supported: report.Supported,
|
|
|
|
|
Applicable: report.Applicable,
|
|
|
|
|
Completed: report.Completed,
|
|
|
|
|
Reason: report.Reason,
|
|
|
|
|
Target: smokeTargetDTO{
|
|
|
|
|
BackendID: target.BackendID,
|
|
|
|
|
ProfileID: target.ProfileID,
|
|
|
|
|
PromptID: target.PromptID,
|
|
|
|
|
PromptVersion: target.PromptVersion,
|
|
|
|
|
DefaultSourceBackendID: target.DefaultSourceBackendID,
|
|
|
|
|
SelectionSource: target.SelectionSource,
|
|
|
|
|
Endpoint: target.Endpoint,
|
|
|
|
|
EffectiveSettings: smokeExecutionTargetDTO{
|
|
|
|
|
BackendID: settings.BackendID,
|
|
|
|
|
Endpoint: settings.Endpoint,
|
|
|
|
|
Model: settings.Model,
|
|
|
|
|
Temperature: settings.Temperature,
|
|
|
|
|
MaxTokens: settings.MaxTokens,
|
|
|
|
|
TopP: settings.TopP,
|
|
|
|
|
TimeoutSeconds: settings.TimeoutSeconds,
|
|
|
|
|
ServiceTier: settings.ServiceTier,
|
|
|
|
|
ReasoningEffort: settings.ReasoningEffort,
|
|
|
|
|
APIKeyEnv: settings.APIKeyEnv,
|
|
|
|
|
ExtraParams: settings.ExtraParams,
|
|
|
|
|
},
|
|
|
|
|
SettingsPresence: smokeSettingsPresenceDTO{
|
|
|
|
|
Temperature: target.SettingsPresence.Temperature,
|
|
|
|
|
MaxTokens: target.SettingsPresence.MaxTokens,
|
|
|
|
|
TopP: target.SettingsPresence.TopP,
|
|
|
|
|
TimeoutSeconds: target.SettingsPresence.TimeoutSeconds,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Facts: smokeFactsFromNative(report.Facts),
|
|
|
|
|
Timing: smokeTimingFromNative(report.Timing),
|
|
|
|
|
Attempts: attempts,
|
|
|
|
|
Usage: smokeUsageFromNative(report.Usage),
|
|
|
|
|
Failure: report.Failure,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func smokeFactsFromNative(facts promptkit.SmokeTestFacts) smokeFactsDTO {
|
|
|
|
|
return smokeFactsDTO{
|
|
|
|
|
CredentialsSupplied: facts.CredentialsSupplied,
|
|
|
|
|
EndpointReachable: facts.EndpointReachable,
|
|
|
|
|
CredentialsAccepted: facts.CredentialsAccepted,
|
|
|
|
|
ResponseReceived: facts.ResponseReceived,
|
|
|
|
|
GenerationCompleted: facts.GenerationCompleted,
|
|
|
|
|
TextReturned: facts.TextReturned,
|
|
|
|
|
ExpectedTextMatched: facts.ExpectedTextMatched,
|
|
|
|
|
StructuredOutputRequested: facts.StructuredOutputRequested,
|
|
|
|
|
ValidJSON: facts.ValidJSON,
|
|
|
|
|
SchemaMatched: facts.SchemaMatched,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func smokeTimingFromNative(timing promptkit.SmokeTestTiming) smokeTimingDTO {
|
|
|
|
|
return smokeTimingDTO{
|
|
|
|
|
StartedAt: timing.StartedAt,
|
|
|
|
|
Duration: timing.Duration.String(),
|
|
|
|
|
CapacityWait: durationString(timing.CapacityWait),
|
|
|
|
|
RequestDuration: durationString(timing.RequestDuration),
|
|
|
|
|
RetryDelay: durationString(timing.RetryDelay),
|
|
|
|
|
EvaluationDuration: durationString(timing.EvaluationDuration),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func durationString(duration *time.Duration) *string {
|
|
|
|
|
if duration == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
value := duration.String()
|
|
|
|
|
return &value
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func smokeUsageFromNative(usage promptkit.ObservedTokenUsage) smokeUsageDTO {
|
|
|
|
|
return smokeUsageDTO{
|
|
|
|
|
PromptTokens: usage.PromptTokens,
|
|
|
|
|
CompletionTokens: usage.CompletionTokens,
|
|
|
|
|
TotalTokens: usage.TotalTokens,
|
|
|
|
|
CachedTokens: usage.CachedTokens,
|
|
|
|
|
CacheWriteTokens: usage.CacheWriteTokens,
|
|
|
|
|
}
|
|
|
|
|
}
|