| import os | |
| from dotenv import load_dotenv | |
| from langchain_groq import ChatGroq | |
| from langchain_core.messages import SystemMessage, HumanMessage, AIMessage, BaseMessage | |
| load_dotenv() | |
| SUMMARISE_AFTER = 10 | |
| def should_summarise(messages: list) -> bool: | |
| turns = sum(1 for m in messages if isinstance(m, (HumanMessage, AIMessage))) | |
| return turns >= SUMMARISE_AFTER | |
| def summarise_history(messages: list) -> tuple: | |
| keep = 8 | |
| old = messages[:-keep] if len(messages) > keep else [] | |
| recent = messages[-keep:] if len(messages) > keep else messages | |
| if not old: | |
| return "", messages | |
| text = "\n".join( | |
| f"User: {m.content}" if isinstance(m, HumanMessage) else f"Assistant: {m.content}" | |
| for m in old | |
| ) | |
| llm = ChatGroq( | |
| model="llama-3.1-8b-instant", | |
| api_key=os.getenv("GROQ_API_KEY"), | |
| temperature=0, | |
| max_tokens=300, | |
| ) | |
| result = llm.invoke([ | |
| SystemMessage(content="Summarise this conversation in under 150 words. Keep key facts, names, numbers."), | |
| HumanMessage(content=text), | |
| ]) | |
| return result.content.strip(), recent | |
| def build_messages(messages: list, system_prompt: str) -> list: | |
| base = SystemMessage(content=system_prompt) | |
| if not should_summarise(messages): | |
| return [base] + messages | |
| summary, recent = summarise_history(messages) | |
| system_with_memory = SystemMessage(content=( | |
| f"{system_prompt}\n\n" | |
| f"--- Earlier conversation summary ---\n{summary}\n" | |
| f"--- End of summary ---" | |
| )) | |
| return [system_with_memory] + recent |