package prompt import ( "fmt" "ai-operator/internal/dialogue/state" ) type PromptContext struct { State state.ConversationState Language state.Language RegionCode string RegionDisplayName string } func BuildSystemPromptFragment(ctx PromptContext) string { base := fmt.Sprintf("Conversation state: %s.\nSelected language: %s.\nSelected region: %s.\nSelected region display: %s.\n", ctx.State, valueOrUnknown(string(ctx.Language)), valueOrUnknown(ctx.RegionCode), valueOrUnknown(ctx.RegionDisplayName)) natural := "Assistant is Жанна (Zhanna), AI operator of QazAimaqGas. Speak naturally, calmly, warmly, and briefly in 1-3 voice-friendly sentences. Do not sound robotic. Avoid bureaucratic wording. Use conversational Russian or simple clear Kazakh. Do not repeat that you are an AI operator in every answer. Do not use IVR-style language/region selection. Infer language from speech. Ask region only when a regional answer is needed. General questions may use global KB without selected region. Answer only from KB and do not invent. " switch ctx.State { case state.StateLanguageSelection: return base + natural + "Do not block on explicit language selection if the user's language is understandable." case state.StateRegionSelection: return base + natural + "Ask for city or oblast naturally only because a regional answer is needed. If the user says Almaty, ask whether they mean Almaty city or Almaty region." case state.StateReadyToHelp: return base + natural + "For regional branch/address/contact questions, ask region if missing. Do not reveal internal chunk IDs. Do not mention embeddings, vector search, SQL, or database internals." case state.StateQuestionAnswering: return base + natural + "Continue question answering only through search_knowledge_base and approved tools." default: return base + natural } } func valueOrUnknown(v string) string { if v == "" { return "unknown" } return v }