bkai-init 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bkai_init-0.1.0/Dockerfile +23 -0
- bkai_init-0.1.0/MANIFEST.in +5 -0
- bkai_init-0.1.0/Makefile +141 -0
- bkai_init-0.1.0/PKG-INFO +387 -0
- bkai_init-0.1.0/bkai_init/__init__.py +19 -0
- bkai_init-0.1.0/bkai_init/__main__.py +5 -0
- bkai_init-0.1.0/bkai_init/api/__init__.py +5 -0
- bkai_init-0.1.0/bkai_init/api/client.py +465 -0
- bkai_init-0.1.0/bkai_init/api/logging.py +105 -0
- bkai_init-0.1.0/bkai_init/api/retry.py +31 -0
- bkai_init-0.1.0/bkai_init/api/uploads.py +84 -0
- bkai_init-0.1.0/bkai_init/api/users.py +105 -0
- bkai_init-0.1.0/bkai_init/cli.py +317 -0
- bkai_init-0.1.0/bkai_init/enums.py +67 -0
- bkai_init-0.1.0/bkai_init/services/__init__.py +20 -0
- bkai_init-0.1.0/bkai_init/services/initializer.py +159 -0
- bkai_init-0.1.0/bkai_init/services/inspection.py +521 -0
- bkai_init-0.1.0/bkai_init/services/knowledge.py +38 -0
- bkai_init-0.1.0/bkai_init/services/planning.py +194 -0
- bkai_init-0.1.0/bkai_init/services/progress.py +234 -0
- bkai_init-0.1.0/bkai_init/services/references.py +138 -0
- bkai_init-0.1.0/bkai_init/services/scaffolding.py +168 -0
- bkai_init-0.1.0/bkai_init/services/sync.py +830 -0
- bkai_init-0.1.0/bkai_init/settings.py +180 -0
- bkai_init-0.1.0/bkai_init/utils/__init__.py +1 -0
- bkai_init-0.1.0/bkai_init/utils/archive.py +84 -0
- bkai_init-0.1.0/bkai_init/utils/codes.py +37 -0
- bkai_init-0.1.0/bkai_init/utils/exceptions.py +66 -0
- bkai_init-0.1.0/bkai_init/utils/knowledge_archive.py +51 -0
- bkai_init-0.1.0/bkai_init/utils/manifest.py +352 -0
- bkai_init-0.1.0/bkai_init/utils/protocol.py +258 -0
- bkai_init-0.1.0/bkai_init/utils/selection.py +37 -0
- bkai_init-0.1.0/bkai_init/utils/variables.py +151 -0
- bkai_init-0.1.0/bkai_init.egg-info/PKG-INFO +387 -0
- bkai_init-0.1.0/bkai_init.egg-info/SOURCES.txt +82 -0
- bkai_init-0.1.0/bkai_init.egg-info/dependency_links.txt +1 -0
- bkai_init-0.1.0/bkai_init.egg-info/entry_points.txt +2 -0
- bkai_init-0.1.0/bkai_init.egg-info/requires.txt +6 -0
- bkai_init-0.1.0/bkai_init.egg-info/top_level.txt +1 -0
- bkai_init-0.1.0/demo/Dockerfile +6 -0
- bkai_init-0.1.0/demo/helm/Chart.yaml +6 -0
- bkai_init-0.1.0/demo/helm/templates/bkai-init-job.yaml +67 -0
- bkai_init-0.1.0/demo/helm/values.schema.json +39 -0
- bkai_init-0.1.0/demo/helm/values.yaml +11 -0
- bkai_init-0.1.0/demo/k8s-job.yaml +72 -0
- bkai_init-0.1.0/demo/package/agents/demo_agent.yaml +33 -0
- bkai_init-0.1.0/demo/package/agents/demo_child.yaml +38 -0
- bkai_init-0.1.0/demo/package/bkai.yaml +12 -0
- bkai_init-0.1.0/demo/package/knowledgebases/demo_docs/knowledgebase.yaml +12 -0
- bkai_init-0.1.0/demo/package/knowledgebases/demo_docs/readme.md +3 -0
- bkai_init-0.1.0/demo/package/skills/demo_skill/Dockerfile +3 -0
- bkai_init-0.1.0/demo/package/skills/demo_skill/SKILL.md +9 -0
- bkai_init-0.1.0/demo/package/skills/demo_skill/skill.yaml +8 -0
- bkai_init-0.1.0/demo/readme.md +78 -0
- bkai_init-0.1.0/docs/protocol.md +233 -0
- bkai_init-0.1.0/pyproject.toml +29 -0
- bkai_init-0.1.0/readme.md +373 -0
- bkai_init-0.1.0/scripts/ci.py +178 -0
- bkai_init-0.1.0/setup.cfg +4 -0
- bkai_init-0.1.0/tests/test_admins.py +66 -0
- bkai_init-0.1.0/tests/test_archive.py +20 -0
- bkai_init-0.1.0/tests/test_ci.py +222 -0
- bkai_init-0.1.0/tests/test_cli.py +165 -0
- bkai_init-0.1.0/tests/test_cli_environment.py +124 -0
- bkai_init-0.1.0/tests/test_codes.py +218 -0
- bkai_init-0.1.0/tests/test_context_window.py +52 -0
- bkai_init-0.1.0/tests/test_demo.py +93 -0
- bkai_init-0.1.0/tests/test_documentation.py +42 -0
- bkai_init-0.1.0/tests/test_initializer.py +38 -0
- bkai_init-0.1.0/tests/test_inspection.py +296 -0
- bkai_init-0.1.0/tests/test_knowledge_sync.py +87 -0
- bkai_init-0.1.0/tests/test_makefile.py +145 -0
- bkai_init-0.1.0/tests/test_manifest.py +114 -0
- bkai_init-0.1.0/tests/test_mcp_context.py +81 -0
- bkai_init-0.1.0/tests/test_planning.py +368 -0
- bkai_init-0.1.0/tests/test_progress.py +140 -0
- bkai_init-0.1.0/tests/test_protocol.py +283 -0
- bkai_init-0.1.0/tests/test_services.py +74 -0
- bkai_init-0.1.0/tests/test_settings.py +67 -0
- bkai_init-0.1.0/tests/test_sync.py +426 -0
- bkai_init-0.1.0/tests/test_user_scope.py +113 -0
- bkai_init-0.1.0/tests/test_variables.py +424 -0
- bkai_init-0.1.0/tests/test_version_validation.py +143 -0
- bkai_init-0.1.0/uv.lock +418 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
ARG PYTHON_BASE_IMAGE=python:3.11-slim-bookworm
|
|
2
|
+
|
|
3
|
+
FROM ${PYTHON_BASE_IMAGE}
|
|
4
|
+
|
|
5
|
+
ARG BKAI_INIT_PACKAGE=bkai-init
|
|
6
|
+
ARG BKAI_INIT_VERSION
|
|
7
|
+
ARG PIP_INDEX_URL
|
|
8
|
+
ARG PIP_EXTRA_INDEX_URL
|
|
9
|
+
ARG PIP_FIND_LINKS
|
|
10
|
+
ARG PIP_TRUSTED_HOST
|
|
11
|
+
|
|
12
|
+
ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
|
13
|
+
PYTHONDONTWRITEBYTECODE=1 \
|
|
14
|
+
PYTHONUNBUFFERED=1
|
|
15
|
+
|
|
16
|
+
RUN test -n "${BKAI_INIT_VERSION}" \
|
|
17
|
+
&& python -m pip install --no-cache-dir "${BKAI_INIT_PACKAGE}==${BKAI_INIT_VERSION}"
|
|
18
|
+
|
|
19
|
+
WORKDIR /workspace
|
|
20
|
+
USER 10001:10001
|
|
21
|
+
|
|
22
|
+
ENTRYPOINT ["bkai-init"]
|
|
23
|
+
CMD ["--help"]
|
bkai_init-0.1.0/Makefile
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
ROOT_DIR?=$(abspath $(dir $(lastword $(MAKEFILE_LIST))))
|
|
2
|
+
UV?=uv
|
|
3
|
+
CONTAINER_TOOL?=podman
|
|
4
|
+
PACKAGE_NAME?=bkai-init
|
|
5
|
+
PACKAGE_VERSION?=$(shell cd ${ROOT_DIR} && $(UV) version --short)
|
|
6
|
+
IMAGE?=bkai-init:local
|
|
7
|
+
DEMO_IMAGE?=bkai-init-demo:local
|
|
8
|
+
IMAGE_BUILD_ARGS?=
|
|
9
|
+
DIST_DIR?=$(ROOT_DIR)/dist
|
|
10
|
+
CI_REPO_ROOT?=$(abspath $(ROOT_DIR)/../..)
|
|
11
|
+
CI_PYTHON?=python3
|
|
12
|
+
CI_HELPER=$(ROOT_DIR)/scripts/ci.py
|
|
13
|
+
ENV_FILE?=$(CI_REPO_ROOT)/.local/env_bkai_init
|
|
14
|
+
PACKAGE_FILE?=$(ROOT_DIR)/demo/package/bkai.yaml
|
|
15
|
+
TENANT_ID?=system
|
|
16
|
+
SPACE?=
|
|
17
|
+
RESOURCES?=
|
|
18
|
+
EXCLUDE_RESOURCES?=
|
|
19
|
+
CHECK?=false
|
|
20
|
+
PUBLISH?=false
|
|
21
|
+
PUBLISH_CONFIG_ONLY?=0
|
|
22
|
+
pytest = $(UV) run --project ${ROOT_DIR} --no-sync pytest -c ${ROOT_DIR}/pyproject.toml
|
|
23
|
+
|
|
24
|
+
.PHONY: ALL
|
|
25
|
+
ALL: test
|
|
26
|
+
|
|
27
|
+
${ROOT_DIR}/uv.lock: ${ROOT_DIR}/pyproject.toml
|
|
28
|
+
cd ${ROOT_DIR} && $(UV) lock
|
|
29
|
+
cd ${ROOT_DIR} && $(UV) lock --check
|
|
30
|
+
|
|
31
|
+
.PHONY: init
|
|
32
|
+
init: uv-install
|
|
33
|
+
@echo "Project initialization complete."
|
|
34
|
+
|
|
35
|
+
.PHONY: uv-install
|
|
36
|
+
uv-install: ${ROOT_DIR}/uv.lock
|
|
37
|
+
$(UV) --version
|
|
38
|
+
cd ${ROOT_DIR} && $(UV) sync --extra test --inexact
|
|
39
|
+
|
|
40
|
+
.PHONY: test
|
|
41
|
+
test: uv-install
|
|
42
|
+
$(eval path ?= ${ROOT_DIR}/tests)
|
|
43
|
+
$(eval maxfail ?= --maxfail=2)
|
|
44
|
+
${pytest} ${path} ${maxfail} ${args}
|
|
45
|
+
|
|
46
|
+
# Commit gate: always run the full offline suite, including generated packages and demo.
|
|
47
|
+
# Do not load ENV_FILE or accept a narrowed test path here.
|
|
48
|
+
.PHONY: check
|
|
49
|
+
check: uv-install
|
|
50
|
+
${pytest} ${ROOT_DIR}/tests --maxfail=2
|
|
51
|
+
|
|
52
|
+
.PHONY: ci-test
|
|
53
|
+
ci-test: uv-install
|
|
54
|
+
$(eval path ?= ${ROOT_DIR}/tests)
|
|
55
|
+
${pytest} ${path} --maxfail=2 ${args}
|
|
56
|
+
|
|
57
|
+
# local-test never writes remote resources. Use local-sync explicitly for writes.
|
|
58
|
+
.PHONY: local-test local-validate local-show local-diff local-plan local-sync
|
|
59
|
+
local-test: local-validate
|
|
60
|
+
|
|
61
|
+
local-validate: uv-install
|
|
62
|
+
@set -eu; \
|
|
63
|
+
space="$(or $(SPACE),$${BKAI_SPACE_ID:-})"; \
|
|
64
|
+
set --; if test -n "$$space"; then set -- --space "$$space"; fi; \
|
|
65
|
+
$(UV) run --project "$(ROOT_DIR)" --no-sync bkai-init validate -f "$(PACKAGE_FILE)" "$$@"
|
|
66
|
+
|
|
67
|
+
local-show local-diff local-plan local-sync: uv-install
|
|
68
|
+
@set -eu; \
|
|
69
|
+
test -f "$(ENV_FILE)" || { echo "ENV_FILE does not exist; specify the local env file" >&2; exit 1; }; \
|
|
70
|
+
env_file="$(ENV_FILE)"; case "$$env_file" in /*) ;; *) env_file="./$$env_file" ;; esac; \
|
|
71
|
+
set -a; . "$$env_file"; set +a; \
|
|
72
|
+
space="$(or $(SPACE),$${BKAI_SPACE_ID:-})"; \
|
|
73
|
+
set --; if test -n "$$space"; then set -- --space "$$space"; fi; \
|
|
74
|
+
$(UV) run --project "$(ROOT_DIR)" --no-sync bkai-init $(patsubst local-%,%,$@) \
|
|
75
|
+
-f "$(PACKAGE_FILE)" --tenant-id "$(TENANT_ID)" \
|
|
76
|
+
"$$@" \
|
|
77
|
+
$(if $(filter local-sync,$@),--confirm) \
|
|
78
|
+
$(foreach resource,$(RESOURCES),--resource "$(resource)") \
|
|
79
|
+
$(if $(filter local-sync local-plan,$@),$(foreach resource,$(EXCLUDE_RESOURCES),--exclude-resource "$(resource)")) \
|
|
80
|
+
$(if $(and $(filter local-diff,$@),$(filter true,$(CHECK))),--check) \
|
|
81
|
+
$(if $(and $(filter local-sync local-plan,$@),$(filter true,$(PUBLISH))),--publish --publish_config_only="$(PUBLISH_CONFIG_ONLY)")
|
|
82
|
+
|
|
83
|
+
.PHONY: build
|
|
84
|
+
build:
|
|
85
|
+
rm -rf "$(DIST_DIR)"
|
|
86
|
+
cd "$(ROOT_DIR)" && $(UV) build --no-sources --out-dir "$(DIST_DIR)"
|
|
87
|
+
|
|
88
|
+
.PHONY: publish
|
|
89
|
+
publish: build
|
|
90
|
+
cd "$(ROOT_DIR)" && $(UV) publish ${publish_args} "$(DIST_DIR)"/*
|
|
91
|
+
|
|
92
|
+
# Pipeline parameters and credentials are inherited from the process environment.
|
|
93
|
+
# Keep publication separate so both indexes receive the same checked artifacts.
|
|
94
|
+
.PHONY: ci-prepare ci-build ci-publish ci-snapshot
|
|
95
|
+
ci-prepare:
|
|
96
|
+
@cd "$(CI_REPO_ROOT)" && $(CI_PYTHON) "$(CI_HELPER)" prepare
|
|
97
|
+
|
|
98
|
+
ci-build: ci-prepare
|
|
99
|
+
@set -eu; \
|
|
100
|
+
cd "$(ROOT_DIR)"; \
|
|
101
|
+
original=$$(mktemp); \
|
|
102
|
+
cp pyproject.toml "$$original"; \
|
|
103
|
+
trap 'cp "$$original" pyproject.toml; rm -f "$$original"' EXIT; \
|
|
104
|
+
$(UV) version --frozen "$$(cat "$(CI_REPO_ROOT)/bkai-build/version.txt")"; \
|
|
105
|
+
$(MAKE) build DIST_DIR="$(CI_REPO_ROOT)/bkai-build/dist"
|
|
106
|
+
$(CI_PYTHON) -m twine check --strict "$(CI_REPO_ROOT)"/bkai-build/dist/*
|
|
107
|
+
$(UV) venv --clear --python "$(CI_PYTHON)" "$(CI_REPO_ROOT)/.bkai-smoke"
|
|
108
|
+
$(UV) pip install --python "$(CI_REPO_ROOT)/.bkai-smoke/bin/python" "$(CI_REPO_ROOT)"/bkai-build/dist/*.whl
|
|
109
|
+
cd /tmp && "$(CI_REPO_ROOT)/.bkai-smoke/bin/bkai-init" --help
|
|
110
|
+
$(MAKE) ci-snapshot
|
|
111
|
+
|
|
112
|
+
ci-snapshot:
|
|
113
|
+
@cd "$(CI_REPO_ROOT)" && $(CI_PYTHON) "$(CI_HELPER)" snapshot
|
|
114
|
+
|
|
115
|
+
ci-publish:
|
|
116
|
+
@cd "$(CI_REPO_ROOT)" && $(CI_PYTHON) "$(CI_HELPER)" publish
|
|
117
|
+
|
|
118
|
+
.PHONY: image
|
|
119
|
+
image:
|
|
120
|
+
$(CONTAINER_TOOL) build \
|
|
121
|
+
--build-arg BKAI_INIT_PACKAGE=$(PACKAGE_NAME) \
|
|
122
|
+
--build-arg BKAI_INIT_VERSION=$(PACKAGE_VERSION) \
|
|
123
|
+
$(IMAGE_BUILD_ARGS) \
|
|
124
|
+
-t $(IMAGE) ${ROOT_DIR}
|
|
125
|
+
|
|
126
|
+
.PHONY: demo-image
|
|
127
|
+
demo-image: image
|
|
128
|
+
$(CONTAINER_TOOL) build -t $(DEMO_IMAGE) -f ${ROOT_DIR}/demo/Dockerfile ${ROOT_DIR}/demo
|
|
129
|
+
|
|
130
|
+
.PHONY: demo-test
|
|
131
|
+
demo-test: demo-image
|
|
132
|
+
$(CONTAINER_TOOL) run --rm --read-only --tmpfs /tmp:rw,size=64m \
|
|
133
|
+
$(DEMO_IMAGE) validate -f /bk-job/bkai.yaml $(if $(SPACE),--space "$(SPACE)")
|
|
134
|
+
|
|
135
|
+
.PHONY: clean
|
|
136
|
+
clean:
|
|
137
|
+
find ${ROOT_DIR} -type f -name '*.py[co]' -delete
|
|
138
|
+
find ${ROOT_DIR} -type d -name '__pycache__' -prune -exec rm -rf {} +
|
|
139
|
+
rm -rf ${ROOT_DIR}/.pytest_cache ${ROOT_DIR}/.ruff_cache
|
|
140
|
+
rm -rf ${ROOT_DIR}/build ${ROOT_DIR}/dist ${ROOT_DIR}/bkai_init.egg-info
|
|
141
|
+
rm -rf ${ROOT_DIR}/.venv
|
bkai_init-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: bkai-init
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Synchronize AIDEV agent packages through the application OpenAPI.
|
|
5
|
+
Author: Tencent BlueKing
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
Requires-Dist: Jinja2<4,>=3.1.6
|
|
10
|
+
Requires-Dist: PyYAML>=6.0
|
|
11
|
+
Requires-Dist: requests>=2.31
|
|
12
|
+
Provides-Extra: test
|
|
13
|
+
Requires-Dist: pytest>=8.0; extra == "test"
|
|
14
|
+
|
|
15
|
+
# bkai-init
|
|
16
|
+
|
|
17
|
+
将模块维护的 Agent Package 同步到 AIDEV。资源操作只调用平台 app 应用态接口,不回退 private;未传调用用户名时,直接查询 BK User 解析当前租户的 bk_admin。
|
|
18
|
+
|
|
19
|
+
[协议与接入目录](docs/protocol.md) · [主子智能体 Demo](demo/readme.md) · [支持范围](docs/protocol.md#支持范围)
|
|
20
|
+
|
|
21
|
+
静态规则和公共默认值统一维护在 [bkai_init/settings.py](bkai_init/settings.py),包括变量白名单、code 命名、协议字段与范围校验。内部代码统一通过 `from bkai_init import settings` 获取;凭据仍由调用参数提供,不写入 settings。
|
|
22
|
+
|
|
23
|
+
包顶层公开 `BkaiInit`、四类异常(`BkaiCliError`、`APIError`、`ConfigurationError`、`ManifestError`)及 `__version__`。服务类、返回类型从 `bkai_init.services` 导入;`SyncClient` 从 `services.sync`,`InspectionClient` / `inspection_as_dict` 从 `services.inspection` 导入。
|
|
24
|
+
|
|
25
|
+
## pip 安装
|
|
26
|
+
|
|
27
|
+
在发布相应版本的包仓库安装:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
python -m pip install "bkai-init==0.1.0"
|
|
31
|
+
bkai-init --help
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
使用内部包源时配置 `PIP_INDEX_URL`。此处版本仅作示例,需先确认目标包源已有该版本;本地构建不等于发布。
|
|
35
|
+
|
|
36
|
+
## 快速生成模板
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 默认单智能体;目标必须是新目录,无需凭据或 --space
|
|
40
|
+
bkai-init init ./bk-job --agent-code ai-job --name "作业助手"
|
|
41
|
+
|
|
42
|
+
# 按需生成并关联 Skill、知识库和带快捷指令的子智能体
|
|
43
|
+
bkai-init init ./bk-job-full --agent-code ai-job --name "作业助手" \
|
|
44
|
+
--with-skill job_skill --with-knowledgebase job_docs --with-subagent ai-job-child
|
|
45
|
+
|
|
46
|
+
bkai-init validate -f ./bk-job/bkai.yaml --space system-bkaidev
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
不指定 code/name 时默认 ai-demo / 初始化助手。目录已存在(包括空目录、符号链接)直接报错,不覆盖;不调用平台、不加载凭据、不发布。写入前使用现有完整协议校验。写入异常可能留下部分文件,检查后改用新目录重试。
|
|
50
|
+
|
|
51
|
+
默认生成 bkai.yaml 和 agents/main.yaml;可选依赖同时加入资源清单及主智能体引用。知识库只生成 knowledgebase.yaml,不放示例 Markdown,避免误触发镜像删除;添加实际文档后同步前须确认删除范围。Skill 生成 skill.yaml / SKILL.md,自定义镜像按[协议](docs/protocol.md#文件白名单与变量替换)另行补充。MCP/角色不由 init 生成,按需手工配置。
|
|
52
|
+
|
|
53
|
+
Python 同样不需要凭据:
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
from bkai_init import BkaiInit
|
|
57
|
+
|
|
58
|
+
manifest = BkaiInit.init("./bk-job", agent_code="ai-job", name="作业助手",
|
|
59
|
+
skill_code="job_skill", knowledgebase_code="job_docs",
|
|
60
|
+
subagent_code="ai-job-child")
|
|
61
|
+
BkaiInit(space="system-bkaidev").validate(manifest)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
init 只是生成模板,不是完整业务实现;按用途完善 Prompt 和 Skill。新建主子智能体的同步仍遵循下文子智能体发布约束。
|
|
65
|
+
|
|
66
|
+
`model.context_window` 是会话轮次,只接受 1~30 的整数,默认模板填写 16;不是模型上下文 token 数,不能填写 256。所有资源在远程请求前校验,非法值不会自动截断。
|
|
67
|
+
|
|
68
|
+
开发提交前在包目录运行 `make check`,执行全量本地测试(包含模板、Demo 与字段边界校验),不加载环境凭据或同步线上资源。安装仓库提交钩子后,修改 bkai-init 文件时会自动执行此检查,包含 settings.py。
|
|
69
|
+
|
|
70
|
+
需要在初始化时开放给所有人使用,在对应 Agent YAML 的 `spec` 中添加 `user_scope: public`。省略时保留平台现有范围,`custom` 表示指定人可使用;主子智能体分别配置。通过 plan 预览后再执行 sync,权限修改对已有发布版本也生效。目标平台需支持使用范围的写入和回读,详见[人员使用范围](docs/protocol.md#智能体人员使用范围)。
|
|
71
|
+
|
|
72
|
+
## CLI 调用
|
|
73
|
+
|
|
74
|
+
先按[协议](docs/protocol.md)准备 `bkai.yaml` 及资源。凭据放在本机 `.local/env_bkai_init` 或部署环境,CLI 不自动加载 env 文件:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
set -a
|
|
78
|
+
source .local/env_bkai_init
|
|
79
|
+
set +a
|
|
80
|
+
|
|
81
|
+
# 仅本地校验,不需要凭据
|
|
82
|
+
bkai-init validate -f /bk-job/bkai.yaml --space system-bkaidev
|
|
83
|
+
|
|
84
|
+
# 查看、对比线上配置(不写入)
|
|
85
|
+
bkai-init show -f /bk-job/bkai.yaml --tenant-id system --space system-bkaidev --format json
|
|
86
|
+
bkai-init diff -f /bk-job/bkai.yaml --tenant-id system --space system-bkaidev
|
|
87
|
+
|
|
88
|
+
# 同步会创建或更新资源
|
|
89
|
+
bkai-init sync -f /bk-job/bkai.yaml --tenant-id system --space system-bkaidev --confirm
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
| 参数 / 环境变量 | 说明 |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| `--base-url` / `BKAI_BASE_URL` | 可选覆盖项。未设置时使用 `BK_API_URL_TMPL`,将 `{api_name}` 替换为 `bk-aidev`;支持服务根地址、网关 stage 或完整 `/openapi/aidev/app/v1` 前缀 |
|
|
95
|
+
| `--app-code` / `BKAI_APP_CODE` | 必需。蓝鲸应用编码,未设置时使用 `BKPAAS_APP_ID` |
|
|
96
|
+
| `--app-secret` / `BKAI_APP_SECRET` | 必需。应用密钥,未设置时使用 `BKPAAS_APP_SECRET` |
|
|
97
|
+
| `--access-token` / `BKAI_ACCESS_TOKEN` | 可选,兼容 `ACCESS_TOKEN`;token 不替代应用空间授权 |
|
|
98
|
+
| `--username`/ `BKAI_USERNAME` | 所有输入均按 login_name 查询转换为实际 bk_username;未传时默认 bk_admin |
|
|
99
|
+
| `--bk-user-base-url` / `BK_USER_BASE_URL` | BK User 可选优先覆盖地址,包含 prod,如 `https://gateway.example/api/bk-user/prod`;CLI 未传时由 `BK_API_URL_TMPL` 的 api_name=bk-user、stage=prod 推导 |
|
|
100
|
+
| `--tenant-id` | 默认 `system`,只通过参数传入 |
|
|
101
|
+
| `--space` | 默认 `bkaidev`,显式传值时不可为空;多租户传完整空间 ID,如 `system-bkaidev`,不会自动拼接租户前缀。所有资源统一使用此空间,旧 `metadata.space` 不再生效 |
|
|
102
|
+
| `--timeout` | 单次请求超时,默认 60 秒 |
|
|
103
|
+
| `--var KEY=VALUE` | 可重复;仅替换协议 YAML 与已声明 Skill 根目录 Dockerfile,详见[变量规则](docs/protocol.md#文件白名单与变量替换) |
|
|
104
|
+
|
|
105
|
+
CLI 不自动读取 `BKAI_SPACE_ID`;需要时显式传 `--space "$BKAI_SPACE_ID"`。不在命令示例、镜像或 Git 中保存真实凭据。
|
|
106
|
+
|
|
107
|
+
以上三项逐项按 **命令行参数 > BKAI 环境变量 > PaaS 内置环境变量** 取值,可混合来源。空的 BKAI 环境变量视为未设置;命令行显式传空值会报缺参,不回退。`BK_API_URL_TMPL` 例如 `https://gateway.example/api/{api_name}/`,同时生成 `https://gateway.example/api/bk-aidev/prod` 和 `https://gateway.example/api/bk-user/prod`。`{stage}` 默认替换为 `prod`;模板没有 stage 时默认补 `prod`,已有明确 stage 路径则保留。Python 类仍显式接收调用参数,不自动加载环境变量。
|
|
108
|
+
|
|
109
|
+
PaaS 已注入 `BK_API_URL_TMPL`、`BKPAAS_APP_ID`、`BKPAAS_APP_SECRET` 时无需重复配置 BKAI 同名用途变量。容器或 Helm Job 需确保这三个变量实际注入进程;CLI 不会获取宿主机或其它容器的环境变量。
|
|
110
|
+
|
|
111
|
+
Python `BkaiInit()` 同样默认使用 `bkaidev`;多租户部署使用 `BkaiInit(space="system-bkaidev")`。下列显式传入 `system-bkaidev` 的示例适用于多租户部署。
|
|
112
|
+
|
|
113
|
+
### 传入部署变量
|
|
114
|
+
|
|
115
|
+
Demo Skill 的 Dockerfile 使用短镜像名 `bkdbm-aidev-skills-env:0.0.1-alpha.13`。平台构建时按 `SKILL_SANDBOX_BASE_IMAGE_PREFIX`(对齐 Helm `global.imageRegistry`)补仓库前缀;Helm Job 不必传 registry 变量。需要覆盖完整地址时,再在已有 Dockerfile 中使用变量:
|
|
116
|
+
|
|
117
|
+
在 Skill 根目录 Dockerfile 中引用基础镜像:
|
|
118
|
+
|
|
119
|
+
```dockerfile
|
|
120
|
+
FROM {{ SKILL_BASE_IMAGE }}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
bkai-init sync -f /bk-job/bkai.yaml --space system-bkaidev --confirm \
|
|
125
|
+
--var SKILL_BASE_IMAGE=registry.example.com/team/skill:1.0
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Python 调用同样支持:
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
from bkai_init import BkaiInit
|
|
132
|
+
|
|
133
|
+
initializer = BkaiInit(
|
|
134
|
+
space="system-bkaidev",
|
|
135
|
+
variables={"SKILL_BASE_IMAGE": "registry.example.com/team/skill:1.0"},
|
|
136
|
+
)
|
|
137
|
+
initializer.validate("/bk-job/bkai.yaml")
|
|
138
|
+
# 远程操作另需传入 base_url、app_code、app_secret,见下文。
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
也可以直接在变量引用处配置默认值(标准 Jinja 语法):
|
|
142
|
+
|
|
143
|
+
```dockerfile
|
|
144
|
+
FROM {{ SKILL_BASE_IMAGE | default("registry.example.com/team/skill:1.0") }}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
未传该变量时使用默认值;CLI `--var` 或 Python `variables` 显式传值时优先使用传入值,包括空字符串。YAML 示例:`name: "{{ SKILL_NAME | default('demo') }}"`。
|
|
148
|
+
|
|
149
|
+
仅允许简单变量及 `default("字符串")`,不支持第二个参数、其它过滤器或模板功能,替换结果不再次渲染。不改源文件,不处理 Markdown、脚本或嵌套 Dockerfile。不提供独立的 Skill 镜像字段。
|
|
150
|
+
|
|
151
|
+
### 查看指定资源
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# 单个资源
|
|
155
|
+
bkai-init show -f /bk-job/bkai.yaml --resource agent/ai-job-assist --space system-bkaidev
|
|
156
|
+
|
|
157
|
+
# 多个资源,也可重复传入 --resource
|
|
158
|
+
bkai-init show -f /bk-job/bkai.yaml --space system-bkaidev \
|
|
159
|
+
--resource skill/job_skill knowledgebase/job_docs --format json
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
资源必须在 Package 清单中;省略 `--resource` 查看全包,指定后只请求并输出所选资源,不额外查询其依赖。未知编码或空集合会在请求前报错,全包本地格式校验仍保留。无论选择哪些资源,均使用命令指定的空间。
|
|
163
|
+
|
|
164
|
+
`show` 不修改资源,不提供权限查询,也不支持 `--exclude-resource`。`diff` 同样支持 `--resource`,资源选择规则与 show 一致。
|
|
165
|
+
|
|
166
|
+
### 同步预览与 CI 检查
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
bkai-init plan -f /bk-job/bkai.yaml --resource agent/ai-job-assist --format json --space system-bkaidev
|
|
170
|
+
bkai-init sync -f /bk-job/bkai.yaml --space system-bkaidev
|
|
171
|
+
bkai-init diff -f /bk-job/bkai.yaml --resource agent/ai-job-assist --check --space system-bkaidev
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
`plan` / 不带 `--confirm` 的 `sync` 只读取线上配置,不上传、创建、更新或发布。输出实际租户、资源空间、create/update/skip、差异、依赖来源、执行顺序和阻塞原因;支持资源选择、黑名单和发布参数。未选或排除的资源不会同步,其依赖需在线上存在。`ready` 仅表示已执行的检查未发现阻塞,不保证写权限、全部服务端校验或执行成功;已有资源即使无可见差异仍显示 update,与 sync 的行为一致。确认执行时增加 `--confirm`;不再提供 `--dry-run`。
|
|
175
|
+
|
|
176
|
+
`diff --check`:0 无差异,1 执行错误,2 有差异,3 无法完整比较。不可比较优先于有差异;不加 `--check` 保持原行为。Skill 文件摘要、envs 值、角色标签等未回显内容明确标记未知,不将其视为一致。
|
|
177
|
+
|
|
178
|
+
### 同步并发布智能体
|
|
179
|
+
|
|
180
|
+
首次远程操作前,所有输入用户名均按 login_name 查询转换;未传时默认 bk_admin。使用应用凭据、目标租户调用 BK User:`GET /api/v3/open/tenant/virtual-users/-/lookup/?lookups=bk_admin&lookup_field=login_name`,将返回的 `bk_username` 传给 AIDEV。查询失败、未找到或匹配不唯一时停止,不降级到应用 code 或其它身份。调用应用需获准访问该接口;不需要 access token。`init` / `validate` 不查询用户。Python 不隐式读取环境变量,可传 `username="operator"`,或传 `bk_user_base_url="https://gateway.example/api/bk-user/prod"` 自动查询。
|
|
181
|
+
|
|
182
|
+
Agent YAML 可配置 `spec.admins: ["user_a", "user_b"]`,成员填写实际 `bk_username`。仅追加开发者中心管理员、保留已有成员;省略、null、[] 时跳过,不继承主智能体名单。只在 `sync --confirm` 写入,plan/diff 显示追加提示,不将无法回读的管理员名单判断为一致。平台需支持管理员追加接口,失败则停止后续同步与发布;已成功的配置和权限不自动回滚。
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# 显式开启发布;默认常规发布,先子后主
|
|
186
|
+
bkai-init sync -f /bk-job/bkai.yaml --confirm --publish --space system-bkaidev
|
|
187
|
+
|
|
188
|
+
# 只预览包括发布的计划,不执行
|
|
189
|
+
bkai-init plan -f /bk-job/bkai.yaml --publish --space system-bkaidev
|
|
190
|
+
|
|
191
|
+
# 如需仅发布配置,显式指定 1
|
|
192
|
+
bkai-init sync -f /bk-job/bkai.yaml --confirm --publish --publish_config_only=1 --space system-bkaidev
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Skill 未在 `skill.yaml` 或 `SKILL.md` 中指定版本时,由平台比较 ZIP hash:变化时在已有最高版本的补丁号上加 1,未变化则复用版本覆盖更新;首次创建为 `0.0.1`。指定版本则覆盖该版本。Package 版本不再作为 Skill 版本兜底。
|
|
196
|
+
|
|
197
|
+
确认执行后,未指定 `--publish` 时仅同步草稿。Agent 不接受配置版本;发布请求不传 version,由平台分配,计划中显示 `auto`。脚本检查发布成功状态,并通过详情回读确认接口返回的版本;不覆盖已发布版本,发布失败时停止。
|
|
198
|
+
|
|
199
|
+
主智能体仍只能引用已发布的子智能体和该版本中的指令。开启发布后,所选子智能体先同步并发布,再从发布版本展开主智能体的指令引用;未选或排除的子智能体不会发布。发布失败、非成功状态、缺少版本或回读不一致时立即停止,不继续写主智能体,也不自动回滚。常规发布可能异步完成,需到平台确认后再继续;脚本不自动重试发布。
|
|
200
|
+
|
|
201
|
+
### 指定同步资源
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# 一个或多个资源;--resource 可重复传入
|
|
205
|
+
bkai-init sync -f /bk-job/bkai.yaml --space system-bkaidev --confirm \
|
|
206
|
+
--resource skill/job_skill knowledgebase/job_docs
|
|
207
|
+
|
|
208
|
+
# 跳过手工修改的资源,避免覆盖
|
|
209
|
+
bkai-init sync -f /bk-job/bkai.yaml --space system-bkaidev --confirm \
|
|
210
|
+
--exclude-resource agent/ai-job-assist
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
类型使用小写 `kind/code`。省略 `--resource` 表示全包同步,黑名单优先;未知资源或 Python 空集合会报错。不自动同步未选中的依赖,只选 Agent 时依赖需已存在。
|
|
214
|
+
|
|
215
|
+
**同步前先查看 plan / diff。** Agent 更新是整配置覆盖,失败不保证回滚。知识库目录含 Markdown 时会同步 ZIP,并移除线上目标目录中不在本地的内容。完整边界见[协议说明](docs/protocol.md#知识库文档同步)。
|
|
216
|
+
|
|
217
|
+
APIGW MCP 查询始终携带 YAML 中的 `agent_code`。平台 app by-code 接口允许智能体尚未创建时按 APIGW 数据解析;智能体已存在时仍校验其空间授权及与显式空间的一致性。平台需已支持这一初始化规则。公开和非公开 MCP 都需提前完成相应网关授权,查询成功不代表目标智能体已获运行权限;`plan` 不提前创建智能体,不自动申请或授予权限。
|
|
218
|
+
|
|
219
|
+
### 同步知识库文档
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
bkai-init sync -f /bk-job/bkai.yaml --tenant-id system --space system-bkaidev \
|
|
223
|
+
--resource knowledgebase/job_docs --confirm
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
目录内的 Markdown 和图片按原层级打包,不替换正文变量、不包含根目录 `knowledgebase.yaml`。无文档时仅更新知识库配置,不清空线上目录。
|
|
227
|
+
|
|
228
|
+
流程:app `upload/url` 获取临时授权 → PUT 直传 BKRepo → app `upload/status` 校验大小及 SHA256 → app `knowledges/archive/import` 提交。提交成功后继续同步后续资源,不等待导入任务完成。上传失败时停止,不回退 private 或网关文件上传。
|
|
229
|
+
|
|
230
|
+
申请临时地址只发送空间、模块和文件名,不发送 `file_size`、`sha256`。上传后仍使用本地大小和摘要对比平台返回的实际元数据,确认一致后才提交导入。
|
|
231
|
+
|
|
232
|
+
上传连接不携带应用凭据,不输出签名 URL。上传超时会先核对上传状态,不自动重复 PUT;导入接口若直接返回失败或部分成功则命令报错,不自动取消或重提,应先到平台确认。`show` 仍仅查看配置;`diff` 不比较文档内容,会标记无法完整比较。
|
|
233
|
+
|
|
234
|
+
## Python 调用
|
|
235
|
+
|
|
236
|
+
安装同一 pip 包后,统一从 `bkai_init` 导入:
|
|
237
|
+
|
|
238
|
+
```python
|
|
239
|
+
import logging
|
|
240
|
+
import os
|
|
241
|
+
import sys
|
|
242
|
+
|
|
243
|
+
from bkai_init import BkaiInit, BkaiCliError
|
|
244
|
+
|
|
245
|
+
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
|
|
246
|
+
|
|
247
|
+
# 无凭据也可进行本地校验
|
|
248
|
+
BkaiInit().validate("bkai.yaml")
|
|
249
|
+
|
|
250
|
+
initializer = BkaiInit(
|
|
251
|
+
base_url=os.environ["BKAI_BASE_URL"],
|
|
252
|
+
app_code=os.environ["BKAI_APP_CODE"],
|
|
253
|
+
app_secret=os.environ["BKAI_APP_SECRET"],
|
|
254
|
+
access_token=os.environ.get("BKAI_ACCESS_TOKEN") or os.environ.get("ACCESS_TOKEN"),
|
|
255
|
+
tenant_id="system",
|
|
256
|
+
space="system-bkaidev",
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
try:
|
|
260
|
+
online = initializer.show("bkai.yaml", resources={"agent/ai-job-assist"})
|
|
261
|
+
differences = initializer.diff("bkai.yaml", resources={"agent/ai-job-assist"})
|
|
262
|
+
preview = initializer.plan("bkai.yaml", publish=True, publish_config_only=False)
|
|
263
|
+
# 显式选择要写入的资源;省略 resources 表示全包同步
|
|
264
|
+
report = initializer.sync(
|
|
265
|
+
"bkai.yaml",
|
|
266
|
+
resources={"skill/job_skill", "knowledgebase/job_docs"},
|
|
267
|
+
excludes={"agent/ai-job-assist"},
|
|
268
|
+
)
|
|
269
|
+
# 完整同步并发布主子智能体时,显式传 publish=True(默认常规发布)
|
|
270
|
+
# report = initializer.sync("bkai.yaml", publish=True, publish_config_only=False)
|
|
271
|
+
except BkaiCliError as exc:
|
|
272
|
+
logging.error("初始化失败:%s", exc)
|
|
273
|
+
raise
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
返回值分别为 `PackageInspection`、`tuple[ResourceDiff, ...]`、`PackagePlan` 和 `SyncReport`,均可从包级导入。同步资源必须与自己的清单编码一致。Python 的 `sync()` 本身就是显式执行,不需要 confirm 参数;只读预览调用 `plan()`。
|
|
277
|
+
|
|
278
|
+
过程日志统一使用 logging。CLI 默认输出 bkai.yaml 事项进度、业务步骤及结束汇总;接口正常调用只显示一行方法和 URL,不显示输入、输出、状态码或处理结果。失败时保留缩进、格式化并脱敏的接口错误详情和反馈摘要。接口日志仅在应用显式启用 DEBUG 时输出到 stderr;应用密钥、令牌和签名 URL 参数脱敏,文件仅输出元信息,不输出认证请求头或文件内容。类调用由应用配置日志,不修改 root logger。show 的 JSON/YAML 和 diff 的结果不带日志前缀;CLI 执行错误返回 1 并写入 stdout,参数错误由 argparse 输出到 stderr。
|
|
279
|
+
|
|
280
|
+
## Dockerfile 与镜像调用
|
|
281
|
+
|
|
282
|
+
[基础 Dockerfile](Dockerfile) 不复制源码,只通过 pip 安装指定版本。交付顺序为:**构建包 → 发布包 → 构建基础镜像 → 构建模块镜像**。
|
|
283
|
+
|
|
284
|
+
在本目录执行:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
make build
|
|
288
|
+
make publish # 显式发布到配置的包仓库
|
|
289
|
+
make image PACKAGE_VERSION=0.1.0 IMAGE=bkai-init:local
|
|
290
|
+
|
|
291
|
+
# 模块镜像继承基础镜像,只增加初始化目录
|
|
292
|
+
podman build -f demo/Dockerfile \
|
|
293
|
+
--build-arg BKAI_INIT_IMAGE=bkai-init:local \
|
|
294
|
+
-t bkai-init-demo:local demo
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
基础镜像支持 `PYTHON_BASE_IMAGE`、`BKAI_INIT_PACKAGE`、`BKAI_INIT_VERSION` 和 pip 包源构建参数;可通过 `make image IMAGE_BUILD_ARGS="..."` 传入。不要通过构建参数传真实包源凭据。
|
|
298
|
+
|
|
299
|
+
[模块 Dockerfile](demo/Dockerfile) 将资源复制到 `/bk-job`,继承 `bkai-init` 入口。已有包源版本时,`make demo-test PACKAGE_VERSION=0.1.0 SPACE=system-bkaidev` 可构建镜像并仅执行 validate。
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
# 先本地验证,不访问平台
|
|
303
|
+
podman run --rm bkai-init-demo:local validate -f /bk-job/bkai.yaml --space system-bkaidev
|
|
304
|
+
|
|
305
|
+
# 环境变量先加载到宿主 shell,由宿主展开并显式传参
|
|
306
|
+
export BK_USER_BASE_URL="https://gateway.example/api/bk-user/prod"
|
|
307
|
+
# 这里只同步依赖;完整初始化主子智能体时使用 --publish
|
|
308
|
+
podman run --rm \
|
|
309
|
+
bkai-init-demo:local sync -f /bk-job/bkai.yaml --confirm \
|
|
310
|
+
--tenant-id system --space "$BKAI_SPACE_ID" \
|
|
311
|
+
--base-url "$BKAI_BASE_URL" --app-code "$BKAI_APP_CODE" \
|
|
312
|
+
--app-secret "$BKAI_APP_SECRET" \
|
|
313
|
+
--bk-user-base-url "$BK_USER_BASE_URL" \
|
|
314
|
+
--resource skill/bkai_init_demo_skill knowledgebase/bkai_init_demo_docs
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
模块镜像已包含 `/bk-dbm/bkai.yaml` 时,完整初始化并只发布配置:
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
podman run --rm \
|
|
321
|
+
bk-dbm:local sync -f /bk-dbm/bkai.yaml \
|
|
322
|
+
--tenant-id system --space "$BKAI_SPACE_ID" \
|
|
323
|
+
--base-url "$BKAI_BASE_URL" --app-code "$BKAI_APP_CODE" \
|
|
324
|
+
--app-secret "$BKAI_APP_SECRET" \
|
|
325
|
+
--bk-user-base-url "$BK_USER_BASE_URL" \
|
|
326
|
+
--confirm --publish --publish_config_only=1
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
容器调用不用 `-e`;按需追加 `--access-token "$BKAI_ACCESS_TOKEN"` 或 `--username "$BKAI_USERNAME"`。真实密钥不要写进示例或文件;参数可能出现在进程及容器检查信息中,不开启 shell 命令跟踪或记录展开后的命令。CLI 的环境变量回退能力仍保留。
|
|
330
|
+
|
|
331
|
+
## Helm 接入
|
|
332
|
+
|
|
333
|
+
模块镜像需包含 `bkai-init` 和清单目录,并推送到集群可访问的镜像仓库。将[Job 模板](demo/helm/templates/bkai-init-job.yaml)合入业务 Chart,通过 values 控制:
|
|
334
|
+
|
|
335
|
+
```yaml
|
|
336
|
+
image:
|
|
337
|
+
repository: example.invalid/modules/bk-job
|
|
338
|
+
tag: "1.0.0"
|
|
339
|
+
pullPolicy: IfNotPresent
|
|
340
|
+
|
|
341
|
+
bkai:
|
|
342
|
+
enabled: true
|
|
343
|
+
tenantId: system
|
|
344
|
+
space: system-bkaidev
|
|
345
|
+
packagePath: /bk-job/bkai.yaml
|
|
346
|
+
excludeResources: []
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
- `enabled: false` 不生成 Job;启用时在 `post-install`、`post-upgrade` 执行 `sync --confirm`。模板固定携带确认参数,避免只预览而未同步。
|
|
350
|
+
- Job 复用模块的 `image`;`packagePath` 为镜像内路径,`excludeResources` 映射为多个 `--exclude-resource`。
|
|
351
|
+
- 业务 Chart 必须将现有环境变量注入逻辑接入 Job,提供 `BKAI_BASE_URL`、`BKAI_APP_CODE`、`BKAI_APP_SECRET`,或对应 PaaS 内置变量 `BK_API_URL_TMPL`、`BKPAAS_APP_ID`、`BKPAAS_APP_SECRET`,按需传 token。示例模板未内置这部分逻辑,不增加 `credentialsSecretName` 开关。
|
|
352
|
+
- 当前示例 Chart 执行全包同步但不发布;首次主子初始化时需由业务 Chart 显式给 Job 添加 `--publish`,默认常规发布。示例不是部署成功证明。
|
|
353
|
+
- 所有用户名都需要转换,需向 Job 注入 `BK_USER_BASE_URL` 或 `BK_API_URL_TMPL`,用于查询租户初始化身份。
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
helm lint demo/helm
|
|
357
|
+
helm template bkai-init-demo demo/helm
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
以上只检查或渲染模板,不部署到集群。独立 Job 参考 [k8s-job.yaml](demo/k8s-job.yaml),其中 Secret 仅是向容器注入环境变量的一种示例,需按部署环境调整。
|
|
361
|
+
|
|
362
|
+
## 本地开发与验证
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
make init
|
|
366
|
+
make test # 单元测试,不调用线上接口
|
|
367
|
+
make local-test SPACE=system-bkaidev # Demo 本地校验,不加载凭据
|
|
368
|
+
make local-show ENV_FILE=/path/to/.local/env_bkai_init RESOURCES="agent/ai-bkai-demo"
|
|
369
|
+
make local-diff ENV_FILE=/path/to/.local/env_bkai_init
|
|
370
|
+
make local-diff ENV_FILE=/path/to/.local/env_bkai_init RESOURCES="agent/ai-bkai-demo" CHECK=true
|
|
371
|
+
make local-plan ENV_FILE=/path/to/.local/env_bkai_init PUBLISH=true
|
|
372
|
+
make local-sync ENV_FILE=/path/to/.local/env_bkai_init \
|
|
373
|
+
RESOURCES="skill/bkai_init_demo_skill knowledgebase/bkai_init_demo_docs"
|
|
374
|
+
make clean # 清理虚拟环境与构建产物
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Makefile 参数:`PACKAGE_FILE` 替换默认 Demo 清单,`TENANT_ID` 默认 system,`SPACE` 优先于 env 中的 `BKAI_SPACE_ID`,两者均未设置时使用 CLI 默认空间 bkaidev;多租户部署需设置完整空间 ID(如 system-bkaidev);`RESOURCES` 用于 show/diff/plan/sync,`EXCLUDE_RESOURCES` 用于 plan/sync;`CHECK=true` 开启 diff 检查,Make 会将非零子命令退出码包装为自己的失败退出码。plan/sync 可传 `PUBLISH=true` 和 `PUBLISH_CONFIG_ONLY=0`,后者只接受 1 / 0、默认 0,转为 CLI 的 `--publish_config_only=1` / `0`;默认不发布,发布时默认常规发布。远程入口显式加载 `ENV_FILE`,默认是业务仓库根目录的 `.local/env_bkai_init`。只有 `local-sync` 写入平台,该入口固定带 `--confirm`;预览使用 `local-plan`。
|
|
378
|
+
|
|
379
|
+
查询请求(GET、知识上传状态查询及 BK User 用户查询)遇到网络连接异常、超时、HTTP 429 或 5xx 时,依次等待 1、2、4 秒重试,最多请求 4 次;写入请求、其他 HTTP 错误及业务失败不自动重试。
|
|
380
|
+
|
|
381
|
+
同步按资源事项展示配置相对路径和当前步骤;结束汇总完成、已提交、失败、跳过和未执行数量。知识 ZIP 异步导入仅标记已提交,不表示后台导入完成。失败时输出事项状态列表、失败资源/配置/步骤、脱敏原因和处理建议,以及开始时间、CLI 版本、当前事项重试次数与服务端返回的请求标识(若有);已完成操作不会自动回滚。发布开启时,Agent 需确认发布版本后才计为事项完成。
|
|
382
|
+
|
|
383
|
+
默认同步输出不带 INFO 前缀,正常接口调用只显示缩进的方法和 URL,不生成额外步骤或日志块。Skill 打包和上传确认后显示完成标记;失败接口地址、HTTP 状态及脱敏错误内容缩进显示在当前步骤下,随后输出失败标记和停止摘要,CLI 不重复打印同一错误详情。
|
|
384
|
+
|
|
385
|
+
`plan` 与未带 `--confirm` 的 `sync` 默认采用相同的资源事项展示,输出检查步骤、计划动作、跳过原因和预检汇总,明确未执行同步或发布;阻塞项提供同样的失败详情与反馈摘要。显式 `plan --format json` 或 `plan --format yaml` 保留纯结构化输出。
|
|
386
|
+
|
|
387
|
+
MCP 按 code 查询成功时,默认只输出 `【正在查询 MCP】<mcp_code> agent_code: <agent_code> 成功` 一行(未指定 agent_code 时显示 `-`),不另列 URL、参数或查询步骤;失败时保留完整排查详情。
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""AIDEV Agent Package initialization CLI."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from .services import BkaiInit
|
|
6
|
+
from .utils.exceptions import APIError, BkaiCliError, ConfigurationError, ManifestError
|
|
7
|
+
|
|
8
|
+
logging.getLogger(__name__).addHandler(logging.NullHandler())
|
|
9
|
+
|
|
10
|
+
__version__ = "0.1.0"
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"APIError",
|
|
14
|
+
"BkaiCliError",
|
|
15
|
+
"BkaiInit",
|
|
16
|
+
"ConfigurationError",
|
|
17
|
+
"ManifestError",
|
|
18
|
+
"__version__",
|
|
19
|
+
]
|