dcdc8d1ddd
全栈知识治理平台首次入库(P1-P10 + 发布链路模拟验证闭环): - 治理核心:源目录/变更集/人工审核/发布批次/发布执行(fail-closed 闸口) - 测试通道:WeKnora 测试 KB 上传/轮询/验收;poll 完成时写入 parser_generation/index_generation,修复 manual/seed 路径发布闸口永久拦截 - 发布适配器 v071(本地 source=测试角色 / 云端 target=生产角色 模拟验证通过): * ES 导出/导入 mapping 自适应(.keyword 子字段、可选 tenant_id) * OSS locator 支持嵌套 scheme;chunks.seq_id 由目标序列分配 * bundle 归档同身份重试原子替换;verifier 按 bundle chunk_type 计数 * 回滚 job payload 支持 prior_execution_id(strict 解码) - 三通道发布+回滚演练实测:publish 4/4 verified,检索命中, rollback 4/4 rolled_back,目标端 PG is_enabled=false、ES is_enabled=false - 前端 A·Data-console 风格全站统一,120 用例通过 - 门禁:go vet / go test 全包通过,gofmt 干净
23 lines
2.2 KiB
Python
23 lines
2.2 KiB
Python
"""Idempotently create isolated local internal/external routing KBs."""
|
|
import json
|
|
from pathlib import Path
|
|
import urllib.request
|
|
BASE='http://127.0.0.1:8080/api/v1';KEY_FILE=Path(__file__).resolve().parents[1]/'secrets/test_weknora_api_key';TEMPLATE_ID='c12ff4d5-dd87-423b-ab0f-af745b9d54a7'
|
|
def request(method,path,payload=None):
|
|
key=KEY_FILE.read_text().strip();data=None if payload is None else json.dumps(payload,ensure_ascii=False).encode();req=urllib.request.Request(BASE+path,data=data,method=method,headers={'X-API-Key':key,'Accept':'application/json','Content-Type':'application/json'});return json.load(urllib.request.urlopen(req,timeout=30))
|
|
def main():
|
|
items=request('GET','/knowledge-bases')['data'];template=request('GET','/knowledge-bases/'+TEMPLATE_ID)['data'];wanted={'governance-internal-local':'治理平台本地对内解析队列','governance-external-local':'治理平台本地对外解析队列'}
|
|
by_name={item['name']:item for item in items}
|
|
for name,description in wanted.items():
|
|
if name not in by_name:
|
|
payload={'name':name,'type':'document','description':description,'is_temporary':False,'chunking_config':template['chunking_config'],'image_processing_config':template.get('image_processing_config',{'model_id':''}),'embedding_model_id':template['embedding_model_id'],'summary_model_id':template['summary_model_id'],'vlm_config':{'enabled':False},'extract_config':template.get('extract_config',{'enabled':False}),'storage_provider_config':template.get('storage_provider_config',{'provider':'oss'}),'indexing_strategy':template.get('indexing_strategy',{'vector_enabled':True,'keyword_enabled':True,'wiki_enabled':False,'graph_enabled':False})}
|
|
created=request('POST','/knowledge-bases',payload)['data'];by_name[name]=created
|
|
final=request('GET','/knowledge-bases')['data'];result=[]
|
|
for name in wanted:
|
|
item=next(value for value in final if value['name']==name)
|
|
detail=request('GET','/knowledge-bases/'+item['id'])['data']
|
|
assert detail['name']==name and detail['embedding_model_id']==template['embedding_model_id'] and detail['chunking_config']==template['chunking_config']
|
|
result.append({'name':name,'id':detail['id'],'knowledge_count':detail.get('knowledge_count',0)})
|
|
print(json.dumps(result,ensure_ascii=False))
|
|
if __name__=='__main__':main()
|