| 15 | |
| 16 | |
| 17 | class RAGChatBase(ABC): |
| 18 | prompts_dir = pathlib.Path(__file__).parent / "prompts/" |
| 19 | answer_prompt_template = open(prompts_dir / "answer.txt").read() |
| 20 | |
| 21 | def get_chat_params(self, messages: list[ResponseInputItemParam], overrides: ChatRequestOverrides) -> ChatParams: |
| 22 | response_token_limit = 1024 |
| 23 | prompt_template = overrides.prompt_template or self.answer_prompt_template |
| 24 | |
| 25 | enable_text_search = overrides.retrieval_mode in ["text", "hybrid", None] |
| 26 | enable_vector_search = overrides.retrieval_mode in ["vectors", "hybrid", None] |
| 27 | |
| 28 | original_user_query = messages[-1].get("content") |
| 29 | if not isinstance(original_user_query, str): |
| 30 | raise ValueError("The most recent message content must be a string.") |
| 31 | |
| 32 | return ChatParams( |
| 33 | top=overrides.top, |
| 34 | temperature=overrides.temperature, |
| 35 | retrieval_mode=overrides.retrieval_mode, |
| 36 | use_advanced_flow=overrides.use_advanced_flow, |
| 37 | response_token_limit=response_token_limit, |
| 38 | prompt_template=prompt_template, |
| 39 | enable_text_search=enable_text_search, |
| 40 | enable_vector_search=enable_vector_search, |
| 41 | original_user_query=original_user_query, |
| 42 | past_messages=messages[:-1], |
| 43 | ) |
| 44 | |
| 45 | @abstractmethod |
| 46 | async def prepare_context(self) -> tuple[list[ItemPublic], list[ThoughtStep]]: |
| 47 | raise NotImplementedError |
| 48 | |
| 49 | def prepare_rag_request(self, user_query, items: list[ItemPublic]) -> str: |
| 50 | sources_str = "\n".join([f"[{item.id}]:{item.to_str_for_rag()}" for item in items]) |
| 51 | return f"{user_query}Sources:\n{sources_str}" |
| 52 | |
| 53 | @abstractmethod |
| 54 | async def answer( |
| 55 | self, |
| 56 | items: list[ItemPublic], |
| 57 | earlier_thoughts: list[ThoughtStep], |
| 58 | ) -> RetrievalResponse: |
| 59 | raise NotImplementedError |
| 60 | |
| 61 | @abstractmethod |
| 62 | async def answer_stream( |
| 63 | self, |
| 64 | items: list[ItemPublic], |
| 65 | earlier_thoughts: list[ThoughtStep], |
| 66 | ) -> AsyncGenerator[RetrievalResponseDelta, None]: |
| 67 | raise NotImplementedError |
| 68 | if False: |
| 69 | yield 0 |
nothing calls this directly
no outgoing calls
no test coverage detected