File size: 1,776 Bytes
9776024
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from typing import Optional, List, Dict
from .llm import BluLLM, make_messages
from .rag import search as rag_search
from .tools import calc, read_file
from .utils import violates_safety

SYSTEM_PROMPT = """You are Blu, a multilingual, tool-using assistant. 
Rules:
1) For math, call the calculator tool.
2) For file questions, call the file reader.
3) If --rag is enabled (context provided), use it to ground answers and cite filenames.
4) Be concise by default; switch to step-by-step for complex tasks.
5) Refuse unsafe requests politely."""

def run_blu(
    query: str,
    use_rag: bool = False,
    rag_query: Optional[str] = None,
    llm: Optional[BluLLM] = None,
    peft_adapter: Optional[str] = None,
) -> str:
    if violates_safety(query):
        return "Sorry, I can’t help with that."
    llm = llm or BluLLM()

    context = None
    if use_rag:
        rq = rag_query or query
        hits = rag_search(rq, k=4)
        if hits:
            context = "\n\n".join([f"[Source: {p}]\n{t}" for (p, t) in hits])

    if any(k in query.lower() for k in ["calc:", "calculate", "evaluate"]):
        expr = query.split(":",1)[1].strip() if ":" in query else query
        tool_out = calc(expr)
        query = f"I computed `{expr}` and got `{tool_out}`. Please explain the steps briefly."

    if query.lower().startswith("read ") or query.lower().startswith("open "):
        path = query.split(" ",1)[1].strip()
        tool_out = read_file(path)
        query = f"I opened {path}. Contents snippet:\n{tool_out}\nNow answer the question above based on this."

    msgs = make_messages(query, system_text=SYSTEM_PROMPT, context=context)
    answer = llm.chat(msgs)
    if use_rag and context:
        answer += "\n\n(Sources consulted above.)"
    return answer