Commit a810c5a0 by ccran

feat: add nanobot llm;rules info; interface

parent dce41c59
......@@ -33,6 +33,7 @@ from core.tools.segment_merger import SegmentMergerTool
from core.tools.fact_merger import FactMergerTool
from core.tools.ruleset_router import RulesetRouterTool
from core.tools.party_role import PartyRoleTool
from core.tools.segment_llm import LLMTool
from core.memory import Finding
from core.memory import FINDING_KEY_MERGE, FINDING_KEY_REFLECT, FINDING_KEY_REVIEW
......@@ -49,6 +50,7 @@ merger_tool = SegmentMergerTool()
fact_merger_tool = FactMergerTool()
ruleset_router_tool = RulesetRouterTool()
party_role_tool = PartyRoleTool()
nanobot_llm_tool = LLMTool(llm_key="nanobot_llm")
@app.post("/sleep")
......@@ -59,6 +61,31 @@ def sleep(t: int):
return {"res": f"sleep over for {t} seconds."}
class NanobotLLMChatRequest(BaseModel):
session_id: str
user_message: str
class NanobotLLMChatResponse(BaseModel):
resuts: str
@app.post("/nanobot_llm_chat", response_model=NanobotLLMChatResponse)
async def nanobot_llm_chat(payload: NanobotLLMChatRequest) -> NanobotLLMChatResponse:
session_id = (payload.session_id or "").strip()
user_message = (payload.user_message or "").strip()
if not session_id:
raise HTTPException(status_code=400, detail="session_id cannot be empty")
if not user_message:
raise HTTPException(status_code=400, detail="user_message cannot be empty")
results = await nanobot_llm_tool.chat_async(
nanobot_llm_tool.build_messages(user_message),
session_id=session_id,
)
return NanobotLLMChatResponse(resuts=results)
########################################################################################################################
......@@ -447,12 +474,23 @@ class ReflectReviewRequest(BaseModel):
rule_title: str
class RuleStringifyRequest(BaseModel):
ruleset_id: Optional[str] = "通用"
rule_title: str
class ReflectReviewResponse(BaseModel):
conversation_id: str
rule_title: str
findings: List[Dict]
class RuleStringifyResponse(BaseModel):
ruleset_id: str
rule_title: str
rule_string: str
class MergerRequest(BaseModel):
conversation_id: str
segment_id: int
......@@ -478,6 +516,25 @@ class FactsMergerResponse(BaseModel):
merge_facts: Dict
@app.post("/rules/stringify", response_model=RuleStringifyResponse)
def stringify_rule(payload: RuleStringifyRequest) -> RuleStringifyResponse:
ruleset_id = payload.ruleset_id or rules_reference_tool.default_ruleset_id
ruleset_items = rules_reference_tool.run(ruleset_id=ruleset_id).get("rules", [])
rule = next(
(r for r in ruleset_items if r.get("title") == payload.rule_title), None
)
if not rule:
raise HTTPException(
status_code=404, detail=f"Rule not found: {payload.rule_title}"
)
return RuleStringifyResponse(
ruleset_id=ruleset_id,
rule_title=payload.rule_title,
rule_string=reflect_tool._stringify_rule(rule),
)
@app.post("/segments/review/reflect", response_model=ReflectReviewResponse)
def reflect_review(payload: ReflectReviewRequest) -> ReflectReviewResponse:
store = get_cached_memory(payload.conversation_id)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment