package format import ( "bytes" "encoding/json" "errors" "fmt" "strconv" "gitea.maximumdirect.net/eric/promptkit" ) type PromptInspection struct { PromptID string `json:"prompt_id"` PromptVersion string `json:"prompt_version"` PromptHash string `json:"prompt_hash"` DefaultProfileID string `json:"default_profile_id"` Inputs []PromptInspectionInput `json:"inputs"` OutputContract OutputContract `json:"output_contract"` } type PromptInspectionInput struct { Name string `json:"name"` Required bool `json:"required"` ContentType string `json:"content_type"` Description string `json:"description"` } type OutputContract struct { Format string `json:"format"` ValidationMode string `json:"validation_mode"` SchemaPath string `json:"schema_path"` RepairAttempts int `json:"repair_attempts"` } func FormatPromptInspection(value *promptkit.PromptInspection, outputFormat OutputFormat) ([]byte, error) { if value == nil { return nil, errors.New("prompt inspection is nil") } dto := PromptInspection{ PromptID: value.PromptID, PromptVersion: value.PromptVersion, PromptHash: value.PromptHash, DefaultProfileID: value.DefaultProfileID, Inputs: make([]PromptInspectionInput, len(value.Inputs)), OutputContract: OutputContract{Format: string(value.OutputContract.Format), ValidationMode: string(value.OutputContract.ValidationMode), SchemaPath: value.OutputContract.SchemaPath, RepairAttempts: value.OutputContract.RepairAttempts}, } for i, input := range value.Inputs { dto.Inputs[i] = PromptInspectionInput{Name: input.Name, Required: input.Required, ContentType: input.ContentType, Description: input.Description} } switch outputFormat { case OutputFormatJSON: data, err := json.MarshalIndent(dto, "", " ") if err != nil { return nil, err } return append(data, '\n'), nil case OutputFormatText: var b bytes.Buffer fmt.Fprintf(&b, "prompt_id: %s\nprompt_version: %s\nprompt_hash: %s\ndefault_profile_id: %s\ninputs:", dto.PromptID, dto.PromptVersion, dto.PromptHash, dto.DefaultProfileID) if len(dto.Inputs) == 0 { fmt.Fprintln(&b, " []") } else { fmt.Fprintln(&b) for _, input := range dto.Inputs { fmt.Fprintf(&b, " - name: %s\n required: %t\n content_type: %s\n description: %s\n", input.Name, input.Required, input.ContentType, strconv.Quote(input.Description)) } } fmt.Fprintf(&b, "output_contract:\n format: %s\n validation_mode: %s\n schema_path: %s\n repair_attempts: %d\n", dto.OutputContract.Format, dto.OutputContract.ValidationMode, dto.OutputContract.SchemaPath, dto.OutputContract.RepairAttempts) return b.Bytes(), nil default: return nil, fmt.Errorf("%w: %q", ErrUnknownPreparedRunFormat, outputFormat) } }