Initial commit: add .gitignore and README
This commit is contained in:
43
fusionagi/reasoning/cot.py
Normal file
43
fusionagi/reasoning/cot.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""Chain-of-thought: prompt structure and trace storage."""
|
||||
|
||||
from typing import Any
|
||||
|
||||
from fusionagi.adapters.base import LLMAdapter
|
||||
|
||||
COT_SYSTEM = """You reason step by step. For each step, state your thought clearly.
|
||||
Output your final conclusion or recommendation after your reasoning."""
|
||||
|
||||
|
||||
def build_cot_messages(
|
||||
query: str,
|
||||
context: str | None = None,
|
||||
trace_so_far: list[str] | None = None,
|
||||
) -> list[dict[str, str]]:
|
||||
"""Build message list for chain-of-thought: system + optional context + user query."""
|
||||
messages: list[dict[str, str]] = [{"role": "system", "content": COT_SYSTEM}]
|
||||
if context:
|
||||
messages.append({"role": "user", "content": f"Context:\n{context}\n\nQuery: {query}"})
|
||||
else:
|
||||
messages.append({"role": "user", "content": query})
|
||||
if trace_so_far:
|
||||
assistant_content = "\n".join(trace_so_far)
|
||||
messages.append({"role": "assistant", "content": assistant_content})
|
||||
messages.append({"role": "user", "content": "Continue."})
|
||||
return messages
|
||||
|
||||
|
||||
def run_chain_of_thought(
|
||||
adapter: LLMAdapter,
|
||||
query: str,
|
||||
context: str | None = None,
|
||||
trace_so_far: list[str] | None = None,
|
||||
**kwargs: Any,
|
||||
) -> tuple[str, list[str]]:
|
||||
"""
|
||||
Run one CoT step; return (full_response, trace_entries).
|
||||
Trace entries can be stored and passed as trace_so_far for multi-step CoT.
|
||||
"""
|
||||
messages = build_cot_messages(query, context=context, trace_so_far=trace_so_far)
|
||||
response = adapter.complete(messages, **kwargs)
|
||||
trace = (trace_so_far or []) + [response]
|
||||
return response, trace
|
||||
Reference in New Issue
Block a user