Files
knowledge-governance/scripts/ensure_local_routing_kbs.py
T
zheromiku dcdc8d1ddd feat: 知识治理平台(含已验证发布/回滚契约)
全栈知识治理平台首次入库(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 干净
2026-09-30 10:54:06 +08:00

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()