diff --git a/json/ragllm.json b/json/ragllm.json new file mode 100644 index 0000000..2cfbce9 --- /dev/null +++ b/json/ragllm.json @@ -0,0 +1,13 @@ +{ + "tblname": "ragllm", + "title":"知识库限额", + "params":{ + "logined_userorgid":"ownerid", + "sortby":"name", + "browserfields":{ + "exclouded":["id", "ownerid"], + "alters":{} + }, + "editexclouded":["id", "ownerid" ] + } +} diff --git a/rag/init.py b/rag/init.py index 21a412c..becdec1 100644 --- a/rag/init.py +++ b/rag/init.py @@ -6,6 +6,7 @@ import json from .file import file_uploaded, file_deleted from .folderinfo import RagFileMgr from .ragprogram import set_program, get_rag_programs +from ragllm_utils import get_ragllms from appPublic.registerfunction import RegisterFunction async def _make_connection_request(action: str, params: dict = None) -> dict: @@ -155,4 +156,5 @@ def load_rag(): env.RagFileMgr = RagFileMgr env.set_program = set_program env.get_rag_programs = get_rag_programs + env.get_ragllms = get_ragllms diff --git a/rag/ragllm_utils.py b/rag/ragllm_utils.py new file mode 100644 index 0000000..c6467cc --- /dev/null +++ b/rag/ragllm_utils.py @@ -0,0 +1,20 @@ +from sqlor.dbpools import DBPools + +async def get_ragllms_by_catelog(request, **params): + catelogid = params.get('catelogid') + if not catelogid: + raise 'need applies catelogid' + + env = request._run_ns + userid = await env.get_user() + userorgid = await env.get_userorgid() + dbname = env.get_module_dbname('rag') + db = DBPools() + async with db.sqlorContext(dbname) as sor: + sql = '''select * from ragllm +where catelogid = ${catelogid}$ + and (userscope = 'unlimited' or ownerid = ${userorgid}$)''' + recs = await sor.sqlExe(sql, {'userorgid': userorgid}) + return recs + return [] + diff --git a/wwwroot/menu.ui b/wwwroot/menu.ui index e43566b..a69d9d3 100644 --- a/wwwroot/menu.ui +++ b/wwwroot/menu.ui @@ -42,6 +42,12 @@ "icon": "{{entire_url('/imgs/kdb.svg')}}", "url": "{{entire_url('/rag/kdb')}}" }, + { + "name":"ragllm", + "label":"知识库加持大模型", + "icon": "{{entire_url('/imgs/ragllm.svg')}}", + "url": "{{entire_url('/rag/ragllm')}}" + }, { "name":"craw", "label":"知识获取", diff --git a/wwwroot/ragllm_dialog.ui b/wwwroot/ragllm_dialog.ui new file mode 100644 index 0000000..7dda230 --- /dev/null +++ b/wwwroot/ragllm_dialog.ui @@ -0,0 +1,43 @@ +{% if get_user() %} +{% set llm = get_llm(params_kw.id) %} +{% if llm %} +{ + "widgettype":"LlmIO", + "options":{ + "width":"100%", + "height":"100%", + "title":"{{llm.name}}", + "list_models_url":"{{entire_url('list_paging_catelog_llms.dspy')}}", + "estimate_url":"{{entire_url('model_estimate.dspy')}}", + "input_fields":{{llm.input_fields}}, + "models":[ + { + "llmid":"{{llm.id}}", + "llmcatelogid":"{{llm.llmcatelogid}}", + "response_mode": "{{llm.stream}}", + "icon":"{{entire_url('/appbase/show_icon.dspy')}}?id={{llm.iconid}}", + "url":"{{entire_url('/llmage/llminference.dspy')}}", + "model":"{{llm.model}}", + "modelname":"{{llm.name}}" + } + ] + } +} +{% else %} +{ + "widgettype":"Text", + "options":{ + "otext": "没找到模型", + "i18n":true + } +} +{% endif %} +{% else %} +{ + "widgettype":"Text", + "options":{ + "otext":"You need login to use llm", + "i18n":true + } +} +{% endif %} diff --git a/wwwroot/ragllminference.dspy b/wwwroot/ragllminference.dspy new file mode 100644 index 0000000..7e3d716 --- /dev/null +++ b/wwwroot/ragllminference.dspy @@ -0,0 +1,6 @@ +debug(f'{params_kw=}') +userid = await get_user() +if userid is None: + return UiError(title='llm inference', message='Please login first') +env = DictObject(**globals()) +return await inference(request, env=env) diff --git a/wwwroot/show_ragllms.ui b/wwwroot/show_ragllms.ui new file mode 100644 index 0000000..06b116f --- /dev/null +++ b/wwwroot/show_ragllms.ui @@ -0,0 +1,97 @@ +{ + "widgettype":"VScrollPanel", + "options":{ + "width":"100%", + "height":"100%" + }, + "subwidgets":[ +{% for cate in get_llmcatelogs() %} + { + "widgettype": "VBox", + "options":{ + "width":"100%" + }, + "subwidgets":[ + { + "widgettype":"Title3", + "options":{ + "text":"{{cate.name}}" + } + }, + { + "widgettype":"DynamicColumn", + "options":{ + "css":"filler", + "width":"100%" + }, + "subwidgets":[ +{% for llm in get_ragllms_by_catelog(cate.id) %} + { + "widgettype":"VScrollPanel", + "options":{ + "css":"card", + "bgcolor": "#def0f0", + "cwidth":20, + "cheight":12 + }, + "subwidgets":[ + { + "widgettype":"HBox", + "options":{ + "cheight":2 + }, + "subwidgets":[ + { + "widgettype":"Svg", + "options":{ + "rate":1.5, + "url":"{{entire_url('/appbase/show_icon.dspy')}}?id={{llm.iconid}}" + } + }, + { + "widgettype":"Title6", + "options":{ + "text":"{{llm.name}}" + } + } + ] + }, + { + "widgettype":"Text", + "options":{ + "text":{{json.dumps(llm.description, ensure_ascii=False)}}, + "wrap":true, + "halign":"left" + } + } + ], + "binds":[ + { + "wid":"self", + "event":"click", + "actiontype":"urlwidget", + "target":"PopupWindow", + "popup_options":{ + "title":"{{llm.name}}", + "cwidth":24, + "height":"80%" + }, + "options":{ + "params":{ + "id":"{{llm.id}}" + }, + "url":"{{entire_url('./ragllm_dialog.ui')}}" + } + } + ] + } +{% if not loop.last %}, {% endif %} +{% endfor %} + ] + } + ] + } +{% if not loop.last %}, {% endif %} +{% endfor %} + ] +}