RAGFlow的API封装 客户端脚本

该文章已生成可运行项目,

使用python的requests包构建RAG模型问答程序,代码参考如下:

HTTP API | RAGFlow

markdown:

1. 找到Ragflow的知识库 ID
2. 获取或创建一个聊天助手(ChatBot)
3. 启动一次聊天 session(第一次默认问个问题)
4. 循环等待用户提问,并打印助手的回答

import requests, json, sys

API_URL       = "http://userIP:8000"
AUTHORIZATION = "ragflow-API" # 你的RagflowAPI
DATASET_NAME  = "aa"          # 你的知识库
ASSIST_NAME   = "aa-bot"      # 给聊天助手起个名(随意)

HEADERS_JSON = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {AUTHORIZATION}",
}

# ---------- 工具函数 ----------
def rq(method, url, allow_code_102=False, **kw):
    kw.setdefault("headers", HEADERS_JSON)
    r = requests.request(method, f"{API_URL}{url}", timeout=None, **kw)
    r.raise_for_status()
    j = r.json()
    code = j.get("code")
    if code == 102 and allow_code_102:
        return None
    if code != 0:
        raise RuntimeError(f"[API {code}] {j.get('message')}")
    return j.get("data")


def get_dataset_id(name):
    data = rq("GET", "/api/v1/datasets", params={"name": name})
    return data[0]["id"] if data else None

def get_or_create_chat(
    dataset_id: str,
    name: str,
    *,
    avatar: str | None = None,
    dataset_ids: list[str] | None = None,
    llm: dict | None = None,
    prompt: dict | None = None,
) -> str:
    dataset_ids = dataset_ids or [dataset_id]

    # --- Step 1. 查找是否存在 ---
    chat_data = rq("GET", "/api/v1/chats", params={"name": name}, allow_code_102=True)
    if chat_data:
        chat_id = chat_data[0]["id"]

        # --- Step 2. 比较配置差异 ---
        patch_payload = {}
        def _set(k, new, old):
            if new is not None and new != old:
                patch_payload[k] = new

        _set("avatar", avatar, chat_data[0].get("avatar"))
        _set("dataset_ids", dataset_ids, chat_data[0].get("dataset_ids", []))
        _set("llm", llm, chat_data[0].get("llm"))
        _set("prompt", prompt, chat_data[0].get("prompt"))

        if patch_payload:
            try:
                rq("PATCH", f"/api/v1/chats/{chat_id}", json=patch_payload)
            except RuntimeError as e:
                if "Method Not Allowed" in str(e) or "code 100" in str(e):
                    rq("PUT", f"/api/v1/chats/{chat_id}", json=patch_payload)
                else:
                    raise
        return chat_id

    # --- Step 3. 不存在则创建 ---
    payload = {
        "name": name,
        "avatar": avatar or "",
        "dataset_ids": dataset_ids,
        "llm": llm,
        "prompt": prompt,
    }
    return rq("POST", "/api/v1/chats", json=payload)["id"]




def stream_chat(chat_id, question, session_id=None):
    payload = {"question": question, "stream": True}
    if session_id:
        payload["session_id"] = session_id

    with requests.post(
        f"{API_URL}/api/v1/chats/{chat_id}/completions",
        headers=HEADERS_JSON,
        json=payload,
        stream=True,
    ) as r:
        r.raise_for_status()

        printed_len = 0          # ← 新增:已打印的字符数
        new_session = session_id

        for raw in r.iter_lines(decode_unicode=True):
            if not raw or raw.startswith(":"):
                continue
            json_part = raw[raw.find("{"):]
            try:
                chunk = json.loads(json_part)
            except json.JSONDecodeError:
                continue

            if chunk.get("code") != 0:
                raise RuntimeError(chunk)

            data = chunk["data"]
            if data is True:          # 结束标志
                print()
                return new_session

            if isinstance(data, dict):
                ans = data.get("answer", "")
                # ---------- 只打印新增部分 ----------
                delta = ans[printed_len:]
                if delta:
                    print(delta, end="", flush=True)
                    printed_len = len(ans)
                # -----------------------------------
                new_session = data.get("session_id", new_session)

# ---------- 主程序 ----------
def main():
    ds_id = get_dataset_id(DATASET_NAME)
    if not ds_id:
        print(f"❌ 找不到知识库『{DATASET_NAME}』"); return
    chat_id = get_or_create_chat(ds_id, ASSIST_NAME)

    session = None
    q = "start ragflow!"
    session = stream_chat(chat_id, q, session)
    while True:
        q = input("请输入您的问题(exit 退出):").strip()
        if q.lower() == "exit":
            break
        try:
            session = stream_chat(chat_id, q, session)
        except Exception as e:
            print("\n[错误]", e)

if __name__ == "__main__":
    main()

注:假设已经在Ragflow构建有数据库,名字例如代码第五行“aa”

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值