Route proposal modules through embedded PromptKit definitions

This commit is contained in:
2026-09-24 02:03:08 +00:00
parent c8a78bf024
commit f577847ca2
19 changed files with 177 additions and 460 deletions

View File

@@ -56,9 +56,9 @@ type Request struct {
Section *contracts.SectionMetadata `json:"section,omitempty"`
Glossary *schema.Glossary `json:"-"`
Config *config.Config `json:"-"`
Messages []contracts.LLMMessage `json:"messages"`
Model string `json:"model,omitempty"`
PromptMetadata map[string]any `json:"prompt_metadata,omitempty"`
PromptID string `json:"prompt_id"`
PromptVersion string `json:"prompt_version"`
Variables map[string]string `json:"variables"`
StageName string `json:"stage_name,omitempty"`
StartIndex int `json:"start_index"`
LLMClient contracts.StructuredLLMClient
@@ -90,16 +90,14 @@ func GenerateCandidates(ctx context.Context, req Request) (Result, error) {
if req.LLMClient == nil {
return Result{}, fmt.Errorf("structured LLM client is required")
}
if len(req.Messages) == 0 {
return Result{}, fmt.Errorf("messages must not be empty")
if strings.TrimSpace(req.PromptID) == "" {
return Result{}, fmt.Errorf("prompt ID must not be empty")
}
stage := strings.TrimSpace(req.StageName)
if stage == "" {
stage = stagename.ProposalGeneration(req.ModuleInstance, sectionIndexPtr(req.Section))
}
model := resolveModel(req.Config, req.Model)
messages := append([]contracts.LLMMessage(nil), req.Messages...)
var writer InteractionDiagnosticsWriter
if req.DiagnosticsWriter != nil {
@@ -114,17 +112,16 @@ func GenerateCandidates(ctx context.Context, req Request) (Result, error) {
}
var (
response StructuredCorrectionSet
callErr error
artifacts InteractionArtifacts
response StructuredCorrectionSet
completion contracts.StructuredCompletionResponse
callErr error
artifacts InteractionArtifacts
)
responseSchema := responseschema.MustLookup(responseschema.CorrectionSetKey)
call := func(callCtx context.Context) error {
_, callErr = req.LLMClient.CompleteStructured(callCtx, contracts.StructuredCompletionRequest{
StageName: stage,
Messages: messages,
Model: model,
ResponseSchema: &responseSchema,
completion, callErr = req.LLMClient.CompleteStructured(callCtx, contracts.StructuredCompletionRequest{
PromptID: req.PromptID, PromptVersion: req.PromptVersion,
Variables: req.Variables, Schema: responseschema.CorrectionSetKey,
Context: structuredoutput.DiagnosticContext{Role: "proposal", ModuleKey: req.ModuleKey, ModuleInstance: req.ModuleInstance, SectionIndex: sectionIndexPtr(req.Section)},
}, &response)
return callErr
}
@@ -140,21 +137,16 @@ func GenerateCandidates(ctx context.Context, req Request) (Result, error) {
"replacement_policy": req.ReplacementPolicy,
"section": req.Section,
"start_index": req.StartIndex,
"model": model,
"prompt": completion.Prompt,
}
if len(req.PromptMetadata) > 0 {
requestMetadata["prompt_metadata"] = req.PromptMetadata
}
requestMetadata["response_schema"] = responseSchema.DiagnosticsMap()
requestMetadata["response_schema"] = responseschema.MustLookup(responseschema.CorrectionSetKey).DiagnosticsMap()
if writer != nil {
artifacts, _ = writer.WriteInteraction(
stage,
requestMetadata,
map[string]any{
"messages": messages,
},
response,
completion.Prepared,
map[string]any{"decoded": response, "final_content": completion.FinalContent, "model": completion.Model},
errPayload(callErr),
)
}
@@ -203,16 +195,6 @@ func GenerateCandidates(ctx context.Context, req Request) (Result, error) {
}, nil
}
func resolveModel(cfg *config.Config, override string) string {
if strings.TrimSpace(override) != "" {
return strings.TrimSpace(override)
}
if cfg == nil {
return ""
}
return llm.ResolvePrimaryConfig(*cfg).Model
}
func errPayload(err error) any {
if err == nil {
return nil