@kmlckj/licos-ai-cli 1.7.0 → 1.7.3
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.
- package/lib/__templates__/agent/AGENTS.md +31 -55
- package/lib/__templates__/agent/DATABASE.md +11 -0
- package/lib/__templates__/agent/README.md +41 -177
- package/lib/__templates__/agent/SDK.md +31 -0
- package/lib/__templates__/agent/UPGRADING.md +48 -0
- package/lib/__templates__/agent/examples/README.md +36 -33
- package/lib/__templates__/agent/examples/experts.py +20 -10
- package/lib/__templates__/agent/examples/handoff.py +7 -3
- package/lib/__templates__/agent/pyproject.toml +15 -15
- package/lib/__templates__/agent/requirements.txt +3 -3
- package/lib/__templates__/agent/src/agents/agent.py +1 -1
- package/lib/__templates__/agent/template.config.js +8 -8
- package/lib/__templates__/templates.json +1 -1
- package/lib/__templates__/workflow/AGENTS.md +28 -56
- package/lib/__templates__/workflow/DATABASE.md +11 -0
- package/lib/__templates__/workflow/README.md +33 -130
- package/lib/__templates__/workflow/SDK.md +31 -0
- package/lib/__templates__/workflow/UPGRADING.md +10 -0
- package/lib/__templates__/workflow/examples/wait_signal.md +1 -1
- package/lib/__templates__/workflow/pyproject.toml +15 -15
- package/lib/__templates__/workflow/requirements.txt +3 -3
- package/lib/__templates__/workflow/scripts/http_run.sh +2 -15
- package/lib/__templates__/workflow/scripts/local_run.sh +2 -7
- package/lib/__templates__/workflow/scripts/runtime.sh +17 -0
- package/lib/__templates__/workflow/template.config.js +4 -3
- package/package.json +1 -1
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
"""Direct conversation handoffs; explicitly enable memory/database checkpoints."""
|
|
2
|
+
from licos_agent_runtime.agent_graph import validate_tool_registry
|
|
2
3
|
from licos_agent_runtime.agent_handoff import build_handoff, model_handoff_agent
|
|
3
4
|
from licos_agent_runtime.harness_execution import HarnessRun
|
|
4
5
|
from licos_agent_runtime.subagents import Subagents
|
|
5
6
|
from licos_dev_sdk import resolve_llm_endpoint
|
|
6
7
|
|
|
7
8
|
from examples.experts import configured_model
|
|
9
|
+
from tools import TOOLS
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
def create_agent(ctx):
|
|
11
13
|
snapshot = ctx.metadata["agent_project_config"]
|
|
14
|
+
validate_tool_registry(TOOLS, snapshot.raw["tools"])
|
|
12
15
|
config = snapshot.raw["config"]
|
|
16
|
+
preserve_reasoning = snapshot.harness.thinking.forward_to_frontend
|
|
13
17
|
endpoint = resolve_llm_endpoint(model=config["model"], model_group=config.get("model_group", "text"))
|
|
14
18
|
ctx.metadata["agent_harness_run"] = HarnessRun(
|
|
15
19
|
snapshot.harness, endpoint.context_length, config["max_completion_tokens"],
|
|
@@ -19,15 +23,15 @@ def create_agent(ctx):
|
|
|
19
23
|
team = Subagents([
|
|
20
24
|
model_handoff_agent(
|
|
21
25
|
"reception", "接待用户并明确需求",
|
|
22
|
-
model=configured_model(config), shared_prompt=shared_prompt,
|
|
26
|
+
model=configured_model(config, preserve_reasoning=preserve_reasoning), shared_prompt=shared_prompt,
|
|
23
27
|
system_prompt="先了解用户的问题。技术问题交给 support,并说明已确认的信息。",
|
|
24
28
|
destinations={"support": "排查和解释技术问题"}, memory="per_call",
|
|
25
29
|
),
|
|
26
30
|
model_handoff_agent(
|
|
27
31
|
"support", "直接帮助用户解决技术问题",
|
|
28
|
-
model=configured_model(config), shared_prompt=shared_prompt,
|
|
32
|
+
model=configured_model(config, preserve_reasoning=preserve_reasoning), shared_prompt=shared_prompt,
|
|
29
33
|
system_prompt="直接和用户沟通技术问题,必要时继续追问。非技术咨询交回 reception。",
|
|
30
|
-
destinations={"reception": "接待与非技术咨询"}, memory="per_call",
|
|
34
|
+
destinations={"reception": "接待与非技术咨询"}, tools=TOOLS, memory="per_call",
|
|
31
35
|
),
|
|
32
36
|
], ctx=ctx)
|
|
33
37
|
return build_handoff(team, initial_agent="reception", max_handoffs=8)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "<%= appName %>"
|
|
3
|
-
version = "0.1.0"
|
|
4
|
-
description = "LICOS LangGraph agent project"
|
|
5
|
-
requires-python = ">=3.11"
|
|
6
|
-
dependencies = [
|
|
7
|
-
"licos-agent-runtime>=0.6.
|
|
8
|
-
"licos-platform-sdk>=0.7.6",
|
|
9
|
-
"licos-dev-sdk>=0.6.6",
|
|
10
|
-
]
|
|
11
|
-
|
|
12
|
-
[tool.uv]
|
|
13
|
-
[[tool.uv.index]]
|
|
14
|
-
url = "https://mirrors.aliyun.com/pypi/simple/"
|
|
15
|
-
default = true
|
|
1
|
+
[project]
|
|
2
|
+
name = "<%= appName %>"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "LICOS LangGraph agent project"
|
|
5
|
+
requires-python = ">=3.11"
|
|
6
|
+
dependencies = [
|
|
7
|
+
"licos-agent-runtime>=0.6.10",
|
|
8
|
+
"licos-platform-sdk>=0.7.6",
|
|
9
|
+
"licos-dev-sdk>=0.6.6",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
[tool.uv]
|
|
13
|
+
[[tool.uv.index]]
|
|
14
|
+
url = "https://mirrors.aliyun.com/pypi/simple/"
|
|
15
|
+
default = true
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
licos-agent-runtime>=0.6.
|
|
2
|
-
licos-platform-sdk>=0.7.6
|
|
3
|
-
licos-dev-sdk>=0.6.6
|
|
1
|
+
licos-agent-runtime>=0.6.10
|
|
2
|
+
licos-platform-sdk>=0.7.6
|
|
3
|
+
licos-dev-sdk>=0.6.6
|
|
@@ -28,7 +28,7 @@ def create_agent(_ctx: Any = None) -> Any:
|
|
|
28
28
|
model_options = dict(settings["config"])
|
|
29
29
|
thinking = model_options.pop("thinking", "auto")
|
|
30
30
|
if thinking != "auto":
|
|
31
|
-
model_options["extra_body"] = {"thinking": {"type": thinking}}
|
|
31
|
+
model_options["extra_body"] = {**model_options.get("extra_body", {}), "thinking": {"type": thinking}}
|
|
32
32
|
model = create_chat_openai(
|
|
33
33
|
**model_options,
|
|
34
34
|
preserve_reasoning=bool(snapshot.harness and snapshot.harness.thinking.forward_to_frontend),
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
const description = `Agent(智能体项目):\`licos init \${LICOS_PROJECT_PATH} --template agent\`
|
|
1
|
+
const description = `Agent(智能体项目):\`licos init \${LICOS_PROJECT_PATH} --template agent --skip-install --skip-dev --skip-commit\`
|
|
2
2
|
- 适用:Python + LangGraph/LangChain 智能体项目
|
|
3
|
-
-
|
|
4
|
-
-
|
|
5
|
-
-
|
|
6
|
-
- 使用 config/agent_llm_config.json 维护模型、业务提示词和业务工具列表,并通过 /agent/config、/agent/canvas 暴露给预览
|
|
7
|
-
- 默认提供普通文件工具和 skills/<name>/SKILL.md 自动发现,技能资源按需只读加载
|
|
8
|
-
- 上传附件自动保存到当前用户的会话目录,支持 HTTP(S) URL 和 SDK 页的 base64 data URL;默认内置 download_file、upload_file,生成文件上传后返回真实下载链接,文档处理工具按需接入
|
|
3
|
+
- README.md 介绍项目结构与开发步骤,AGENTS.md 记录项目实际实现和用户选择
|
|
4
|
+
- 功能、API、配置字段及限制从 SDK.md 定位实际安装版本的 SDK 文档,按需查阅
|
|
5
|
+
- examples/README.md 说明示例接入;DATABASE.md、UPGRADING.md 分别说明持久化准备和已有项目升级
|
|
9
6
|
- 项目源码位于 /workspace/projects,平台数据位于 /workspace/.licos`;
|
|
10
7
|
|
|
11
8
|
const config = {
|
|
@@ -44,7 +41,10 @@ const config = {
|
|
|
44
41
|
console.log(' - Runtime: licos-agent-runtime');
|
|
45
42
|
console.log(' - Framework: LangGraph + LangChain');
|
|
46
43
|
console.log(' - State storage: memory; enable database only when requested');
|
|
47
|
-
console.log(' -
|
|
44
|
+
console.log(' - SDK documentation for the installed version: SDK.md');
|
|
45
|
+
console.log(' - Example integration: examples/README.md');
|
|
46
|
+
console.log(' - Existing project upgrade checklist: UPGRADING.md');
|
|
47
|
+
console.log(' - Optional persistence and migrations: DATABASE.md');
|
|
48
48
|
console.log(` - Port: ${_context.port}`);
|
|
49
49
|
},
|
|
50
50
|
};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"templates": [
|
|
4
4
|
{
|
|
5
5
|
"name": "agent",
|
|
6
|
-
"description": "Agent(智能体项目):`licos init ${LICOS_PROJECT_PATH} --template agent`\n- 适用:Python + LangGraph/LangChain 智能体项目\n- 使用 licos-agent-runtime 提供 /run、/stream_run、/cancel、OpenAI compatible 等运行时接口\n- agent_runtime 分别配置状态、聊天、Store、交互及保存方式;默认内存,用户选择持久化才接数据库\n- 支持子智能体、原生图、人工审批、状态恢复、分支和 Functional API;examples/ 提供按需示例\n- 使用 config/agent_llm_config.json 维护模型、业务提示词和业务工具列表,并通过 /agent/config、/agent/canvas 暴露给预览\n- 默认提供普通文件工具和 skills/<name>/SKILL.md 自动发现,技能资源按需只读加载\n- 上传附件自动保存到当前用户的会话目录,支持 HTTP(S) URL 和 SDK 页的 base64 data URL;默认内置 download_file、upload_file,生成文件上传后返回真实下载链接,文档处理工具按需接入\n- 项目源码位于 /workspace/projects,平台数据位于 /workspace/.licos",
|
|
6
|
+
"description": "Agent(智能体项目):`licos init ${LICOS_PROJECT_PATH} --template agent --skip-install --skip-dev --skip-commit`\n- 适用:Python + LangGraph/LangChain 智能体项目\n- 使用 licos-agent-runtime 提供 /run、/stream_run、/cancel、OpenAI compatible 等运行时接口\n- agent_runtime 分别配置状态、聊天、Store、交互及保存方式;默认内存,用户选择持久化才接数据库\n- 支持子智能体、原生图、人工审批、状态恢复、分支和 Functional API;examples/ 提供按需示例\n- examples/README.md 区分完整入口与工具模块;已有项目升级参考 UPGRADING.md,保留业务、授权和状态\n- DATABASE.md 说明托管数据库范围和基础/向量脚本的定位及显式迁移;内存模式不执行 SQL\n- 使用 config/agent_llm_config.json 维护模型、业务提示词和业务工具列表,并通过 /agent/config、/agent/canvas 暴露给预览\n- 默认提供普通文件工具和 skills/<name>/SKILL.md 自动发现,技能资源按需只读加载\n- 上传附件自动保存到当前用户的会话目录,支持 HTTP(S) URL 和 SDK 页的 base64 data URL;默认内置 download_file、upload_file,生成文件上传后返回真实下载链接,文档处理工具按需接入\n- 项目源码位于 /workspace/projects,平台数据位于 /workspace/.licos",
|
|
7
7
|
"location": "./agent",
|
|
8
8
|
"paramsSchema": {
|
|
9
9
|
"type": "object",
|
|
@@ -1,58 +1,30 @@
|
|
|
1
1
|
# 项目上下文
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- 涉及文件输入/输出时,schema 使用文件对象字段,例如 `url`、`file_type`、`content`、`name`。节点生成文件时优先写入 `assets/`,并在输出中返回 `/assets/<文件名>`、`assets/<文件名>` 或本地文件路径。运行时会自动把输出文件发布到 Studio 对象存储并补齐签名 URL、`download_url`、`file_id`、`expires_at` 等字段。
|
|
32
|
-
- 不要在节点代码里手写 workspace-file-service 公共 URL、MinIO URL、签名参数或平台文件服务路径;部署后的工作流没有开发态文件服务,文件发布交给运行时统一处理。
|
|
33
|
-
- 如果文档与源码 schema 冲突,应修正文档,不要为了匹配文档清空 `GraphInput` / `GraphOutput`。
|
|
34
|
-
- 可视化条件节点必须在 `graph.py` 的 `add_node(..., metadata={...})` 中保存 `definition.branches`;`branches[].id` 与路由函数返回值一致,`branches[].target` 与 `add_conditional_edges(..., path_map=...)` 目标一致。条件节点函数只透传状态,不要把路由函数同时作为节点函数。
|
|
35
|
-
- 根据画布 QueryDiff 修改已有 Action 节点时,必须以 QueryDiff 的 `node.id` 为准更新同一个节点的 metadata、状态字段和实现文件;只有 QueryDiff 明确是新增节点且用户明确要增加业务步骤时才新增节点。
|
|
36
|
-
- 禁止保留默认标题“请填写动作内容”作为最终节点标题;Action 节点标题必须稳定、可读并表达业务含义,已有节点的 ID 不能因为标题或内容调整而改变。
|
|
37
|
-
- 默认不创建持久化配置、迁移文件或检查点表。只有用户明确要求本项目断点续跑时,才按 README 中的运行时契约在本项目生成版本化 SQL 迁移,核对目标项目与环境并执行、加入 `config/workflow-runtime.json`,并检查图编译时使用 `workflow_checkpointer()`。
|
|
38
|
-
- 只有用户明确要求人工处理或异步设备回执时,才在本项目启用 `signals.enabled` 并生成 README 指定的增量迁移;普通项目不加等待表或字段。人工和回执共用 `/workflow/instances/{instance_id}/signals`,`/resume` 只处理执行失败。设备下发与等待回执必须分为两个节点,采用稳定 `wait_id` 和外部幂等键;参见 `examples/wait_signal.md`。
|
|
39
|
-
- 有副作用的业务节点在恢复后可能再次执行。写入外部系统必须使用由工作流实例 ID、稳定节点 ID 和业务操作号组成的幂等键;对没有幂等能力的系统,先查询原操作结果,状态不明时停止并交给业务规则处理,不自动重复写入。
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
## 平台调用身份
|
|
43
|
-
|
|
44
|
-
- `LICOS_CURRENT_USER_ID` 仅表示容器初始化用户,不能作为网页登录身份。
|
|
45
|
-
- 当前用户信息、企业知识库、本体搜索/调用/订阅必须显式传本次用户 Token(Node `userToken` / Python `user_token`)。Token 失效直接返回鉴权错误,不换成容器用户。
|
|
46
|
-
- 普通知识库、模型与积分接口默认使用项目身份;需要按网页登录用户执行时显式传 Token。数据库、存储、可观测性和 OAuth 应用管理使用项目身份。项目归属与平台签发的计费上下文独立保留。
|
|
47
|
-
- CLI 用户操作默认按 `LICOS_CURRENT_USER_ID` 换 Token;HTTP 服务调用 CLI 时使用 `--token-stdin`。Dev CLI 可用 `--identity project` 明确选择项目身份。
|
|
48
|
-
- 每个请求单独传 Token 或创建客户端,不把请求 Token、用户 ID 写进共享环境变量。
|
|
49
|
-
|
|
50
|
-
## 编程项目登录身份
|
|
51
|
-
|
|
52
|
-
- 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
|
|
53
|
-
- Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
|
|
54
|
-
- 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
|
|
55
|
-
- Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
|
|
56
|
-
- 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
|
|
57
|
-
- 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
|
|
58
|
-
- 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
|
|
3
|
+
功能用法查 [SDK.md](SDK.md),结构与接入见 [README.md](README.md)。本文件只记录当前项目事实。
|
|
4
|
+
|
|
5
|
+
## 当前项目
|
|
6
|
+
|
|
7
|
+
- 类型:WORKFLOW。
|
|
8
|
+
- 图入口:src/graphs/graph.py 的 create_graph。
|
|
9
|
+
- 默认输入:topic 字符串;默认输出:answer 字符串。
|
|
10
|
+
- 默认节点:generate_answer,示例文本转换,metadata.type 为 action;未调用外部系统。
|
|
11
|
+
- 业务目标和成功标准:开发时按用户需求填写。
|
|
12
|
+
- 认证:config/licos-auth.json,初始为平台登录;已有项目保留实际登录方案。
|
|
13
|
+
- 依赖与实际版本:以 requirements.txt、pyproject.toml、项目锁文件和运行环境记录为准。
|
|
14
|
+
|
|
15
|
+
## 保存方式与外部依赖
|
|
16
|
+
|
|
17
|
+
- 工作流持久化未开启,未创建 config/workflow-runtime.json。
|
|
18
|
+
- 数据库迁移未执行;用户尚未要求持久化。
|
|
19
|
+
- 等待/设备回执示例未接入,不能声明已实现。
|
|
20
|
+
- 开发后记录真实数据库、迁移环境/ID、身份与外部依赖,不写凭证。
|
|
21
|
+
|
|
22
|
+
## 业务节点与配置索引
|
|
23
|
+
|
|
24
|
+
新增真实业务后维护节点 ID、类型、标题、源码、输入输出、配置路径和连线;另列子图及循环入口。Schema 与源码为事实来源,文档过时应修正文档。
|
|
25
|
+
|
|
26
|
+
## 验收与变更记录
|
|
27
|
+
|
|
28
|
+
尚未记录业务验收。后续记录参数和画布检查、真实运行结果、未完成项及原因;持久化项目另记重启验证、未完成实例与升级回退安排。
|
|
29
|
+
|
|
30
|
+
节点、状态、连接、配置、提示词和保存方式改变后同步本文件,不复制 SDK 通用 API 手册。
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# 工作流持久化接入
|
|
2
|
+
|
|
3
|
+
用户明确要求保存执行状态、跨重启恢复或持久化等待时,先查 [SDK.md](SDK.md) 中当前版本的工作流协议。工作流与智能体有各自配置和存储契约,不能直接复制对方的配置或 SQL。
|
|
4
|
+
|
|
5
|
+
1. 记录用户需求和保存方式,核对当前项目、环境、已有 Schema 与迁移历史。
|
|
6
|
+
2. 阅读 SDK docs/workflow-runtime.md 的表、执行权、检查点和信号约束,根据本项目所需功能编写独立版本化 SQL。
|
|
7
|
+
3. 使用平台数据库 CLI 检查、dry-run,并在已有授权范围内显式执行;核对业务状态和实际 Schema,不仅检查退出码。
|
|
8
|
+
4. 修改项目配置和构图入口,保持已有数据、登录方式和业务行为。
|
|
9
|
+
5. 验证实际持久化、隔离、重启恢复及选用的等待/回执路径,在 AGENTS.md 记录环境、迁移 ID 和结果。
|
|
10
|
+
|
|
11
|
+
不在节点、启动或安装代码执行迁移;已有对象按差异做增量变更。开发环境成功不代表生产已准备。接口和字段以项目安装版本文档为准。
|
|
@@ -1,150 +1,53 @@
|
|
|
1
1
|
# <%= appName %>
|
|
2
2
|
|
|
3
|
-
LICOS
|
|
3
|
+
LICOS 编程工作流项目,基于 Python、LangGraph 和 licos-agent-runtime。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 文档入口
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
├── pyproject.toml
|
|
13
|
-
├── scripts/
|
|
14
|
-
└── src/
|
|
15
|
-
├── main.py
|
|
16
|
-
└── graphs/
|
|
17
|
-
└── graph.py
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## 本地运行
|
|
7
|
+
- [SDK.md](SDK.md):按项目实际版本查功能、API、配置和限制。
|
|
8
|
+
- [AGENTS.md](AGENTS.md):本项目真实业务、节点索引、用户选择和验收记录。
|
|
9
|
+
- [DATABASE.md](DATABASE.md):用户选择持久化后的接入步骤。
|
|
10
|
+
- [UPGRADING.md](UPGRADING.md):已有项目兼容和升级步骤。
|
|
11
|
+
- [回执示例](examples/wait_signal.md):下发与等待节点的接入示例。
|
|
21
12
|
|
|
22
|
-
|
|
23
|
-
bash scripts/setup.sh
|
|
24
|
-
bash scripts/http_run.sh -p <%= port %>
|
|
25
|
-
```
|
|
13
|
+
## 项目结构
|
|
26
14
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
- `GET /agent/canvas`
|
|
36
|
-
- `POST /agent/canvas`
|
|
37
|
-
- `POST /agent/canvas_submit`
|
|
38
|
-
- `POST /v1/api/project/{project_id}/agent/canvas`
|
|
39
|
-
- `POST /v1/api/project/{project_id}/agent/canvas_submit`
|
|
40
|
-
|
|
41
|
-
`POST /run` 和 `POST /stream_run` 的 Body 必须匹配工作流输入 schema。模板默认输入是:
|
|
42
|
-
|
|
43
|
-
```json
|
|
44
|
-
{
|
|
45
|
-
"topic": "AI 新闻热点"
|
|
46
|
-
}
|
|
15
|
+
```text
|
|
16
|
+
.licos # CLI 配置文件
|
|
17
|
+
config/licos-auth.json # 项目认证
|
|
18
|
+
src/main.py # 服务入口
|
|
19
|
+
src/graphs/graph.py # 默认示例图与稳定构建入口
|
|
20
|
+
scripts/ # 安装、运行、打包
|
|
21
|
+
requirements.txt
|
|
22
|
+
pyproject.toml
|
|
47
23
|
```
|
|
48
24
|
|
|
49
|
-
|
|
25
|
+
新增真实业务时按职责增加 src/graphs/state.py、src/graphs/nodes/ 和 config/*_cfg.json;节点、状态和配置按 SDK 约定实现。用户要求画布编辑时修改真实源码,项目说明跟随源码更新。
|
|
50
26
|
|
|
51
|
-
|
|
27
|
+
## 默认示例与开发步骤
|
|
52
28
|
|
|
53
|
-
|
|
29
|
+
模板输入为 topic 字符串,输出为 answer 字符串,仅演示图执行,不调用模型或外部系统。持久化与等待均未开启。
|
|
54
30
|
|
|
55
|
-
|
|
31
|
+
1. 先读项目说明、实际图和依赖,确定业务输入输出与成功标准。
|
|
32
|
+
2. 按 SDK.md 查对应版本的工作流说明,选择节点和配置,保留已有业务、身份及稳定入口。
|
|
33
|
+
3. 新增节点时同步 Schema、图中注册与连线、metadata、配置和 AGENTS.md;不要把真实业务输入输出简化为空。
|
|
34
|
+
4. 按实际图输入构造用例,复用 Preview 验证参数、画布和运行结果。功能用法不在本 README 另维护。
|
|
56
35
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
```json
|
|
60
|
-
{
|
|
61
|
-
"durability": {
|
|
62
|
-
"enabled": true,
|
|
63
|
-
"graph_version": "v1"
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
```
|
|
36
|
+
## 运行
|
|
67
37
|
|
|
68
|
-
|
|
38
|
+
平台内复用已有预览;独立本地开发运行:
|
|
69
39
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- 对检查点与 pending writes 的 `INSERT`/`UPDATE` 加同一个数据库触发器:锁定对应的实例行(`SELECT ... FOR SHARE`),只有 `last_run_id` 等于待写行的 `run_id`、`status = 'running'`,且 `lease_until_ms` 晚于数据库当前时间(毫秒)时才能写入;否则拒绝。行锁要和取消/认领实例的更新互斥,避免检查点检查通过后才提交取消,旧运行仍写入。
|
|
74
|
-
|
|
75
|
-
模板的 `graph.py` 已通过 `workflow_checkpointer()` 按配置编译图;原有项目启用时也须把 `builder.compile()` 改为 `builder.compile(checkpointer=workflow_checkpointer())`。修改图节点、状态 schema 或路由后,应评估旧检查点兼容性,再更新 `graph_version`。版本不兼容的实例不会自动从头执行。
|
|
76
|
-
|
|
77
|
-
在已选定项目的 CLI 环境中,可以先省略 `--execute` 查看迁移记录,再对目标环境执行。例如 PowerShell:
|
|
78
|
-
|
|
79
|
-
```powershell
|
|
80
|
-
$migrationSql = Get-Content -Raw 'db/migrations/001_workflow_durability.sql'
|
|
81
|
-
licos-platform database studio-create-migration --title workflow_durability_v1 --env-scope dev --statement $migrationSql --execute
|
|
40
|
+
```bash
|
|
41
|
+
bash scripts/setup.sh
|
|
42
|
+
bash scripts/http_run.sh -p <%= port %>
|
|
82
43
|
```
|
|
83
44
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
启用后,`POST /run` 和 `POST /stream_run` 必须带稳定的 `X-Workflow-Instance-Id`,每次尝试另带新的 `X-Run-Id`。同一实例 ID 与相同输入重复提交时,已完成的运行返回已保存结果;运行中或失败的实例不会被再次启动。使用下列接口查询、显式恢复或取消:
|
|
87
|
-
|
|
88
|
-
流式连接断开后,持久化执行会继续在服务端运行;页面会记住该项目最近一次实例 ID,重新打开后可查询状态。普通未启用持久化的流式执行在连接断开时会取消。进程重启后,运行中的实例在租约过期时显示为 `interrupted`,且只有已有检查点的实例可以恢复。
|
|
89
|
-
|
|
90
|
-
- `GET /workflow/instances/{instance_id}`:读取状态、图版本、最近 `run_id`、输出和错误。
|
|
91
|
-
- `POST /workflow/instances/{instance_id}/resume`:仅对失败或中断实例恢复,沿用已保存的 LangGraph 检查点;请求需带新的 `X-Run-Id`。
|
|
92
|
-
- `POST /workflow/instances/{instance_id}/cancel`:取消实例,禁止自动恢复。
|
|
45
|
+
本地单次执行默认示例:
|
|
93
46
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
### 按项目启用人工处理与设备回执
|
|
97
|
-
|
|
98
|
-
只有用户明确要求人工等待或异步回执时,才在该项目已有持久化配置中增加 `"signals": {"enabled": true}`,并由 Agent 在**用户项目内**生成增量迁移。新项目可以在初始迁移中一并加入;普通项目不创建这些字段或表。
|
|
99
|
-
|
|
100
|
-
- `workflow_instances` 增加可空的 `wait_id`、`wait_type`、`wait_node_id`、`wait_details_data`、`signal_id`、`signal_hash`、`signal_data`、`signal_actor_user_id`(`text`)和 `signal_received_at_ms`(`bigint`)。`status` 增加 `waiting_manual`、`waiting_callback`、`signal_pending`。
|
|
101
|
-
- `workflow_signals` 增加非空 `instance_id`、`signal_id`、`wait_id`、`signal_hash`、`signal_data`、`actor_user_id`(`text`)和 `received_at_ms`(`bigint`);`(instance_id, signal_id)` 为主键,`instance_id` 外键指向 `workflow_instances.instance_id` 并级联删除。
|
|
102
|
-
- 项目数据库的条件 `UPDATE` 将等待状态、信号 ID、摘要和完整数据在**同一实例行**中原子保存。收件表随后记录去重凭据;若进程在此间退出,恢复扫描从实例行补写收件记录并续跑。不要用平台的多操作 `/transaction` 模拟跨表原子提交。
|
|
103
|
-
- 图中的人工确认或回执节点用 `from licos_agent_runtime.workflow_wait import wait_for_signal`,再调用 `wait_for_signal(type="manual" 或 "callback", wait_id=稳定 ID, node_id=当前节点名, details={...})`。`wait_id` 必须与发往外部设备的关联值一致;循环到下一轮须产生新的 `wait_id`。一个实例同时只支持一个等待点。
|
|
104
|
-
- **下发指令和等待回执必须是两个节点**。LangGraph 恢复时会重新进入调用 `interrupt()` 的节点,所以等待节点在 `wait_for_signal()` 之前不能下发设备指令。指令节点使用外部系统认可的稳定幂等键。
|
|
105
|
-
|
|
106
|
-
运行到等待点时,`POST /run` 返回 HTTP 202 和 `{ "status": "waiting_callback", "instance_id": "...", "run_id": "...", "wait": { "type": "callback", "wait_id": "...", "node_id": "...", "details": {} } }`;`POST /stream_run` 发送 `workflow_waiting` 作为本次流的终止事件,不发送 `workflow_end`。调用 `GET /workflow/instances/{instance_id}` 可查询当前等待。人工处理和设备回执都向 `POST /workflow/instances/{instance_id}/signals` 发送 `{ "signal_id": "稳定去重 ID", "wait_id": "当前等待 ID", "type": "manual|callback", "data": {} }`,收到 HTTP 202 后轮询实例状态。重复提交同一 ID 和内容仍返回 202;迟到、错误类型或同 ID 不同内容返回 409。`/resume` 仍只用于失败或中断,不提交业务回执。`POST /workflow/instances/{instance_id}/cancel` 可以取消等待中的实例。
|
|
107
|
-
|
|
108
|
-
已发布项目的 API Token 需先调用平台 `POST /api/v1/studio/api-tokens/exchange`(请求头 `Authorization: Bearer <API Token>`、Body `{ "projectId": "..." }`),将返回的 `data.accessToken` 作为运行时接口的 Bearer 令牌;不能把未兑换的 API Token 直接传给实例接口。设备回执也走这个受鉴权入口。
|
|
109
|
-
|
|
110
|
-
示例节点和状态传递见 [人工处理与设备回执示例](examples/wait_signal.md)。
|
|
111
|
-
|
|
112
|
-
### 外部业务写入
|
|
113
|
-
|
|
114
|
-
MES、ERP、审批等有副作用的节点必须使用稳定幂等键。推荐由 `workflow_instance_id`、固定节点 ID 和业务操作号组成,例如 `工单号:approve_order:审批号`;同一业务操作重试时必须复用同一键。节点应先调用外部系统的幂等写入接口,再把结果写入图状态。**检查点不能覆盖“外部写入成功、检查点尚未保存”之间的故障窗口。**
|
|
115
|
-
|
|
116
|
-
若外部系统不支持幂等键,节点在重试前应查询业务操作结果;结果不确定时停止运行并由业务规则决定补偿或人工处理,不自动重复写入。只读节点可以按外部接口的超时与重试规则重试;有副作用的节点只在写入接口有明确幂等保证时自动重试。
|
|
117
|
-
|
|
118
|
-
`/agent/canvas` 返回工作流画布结构,`/agent/canvas_submit` 接收前端编辑后的 `after_canvas` 并生成给 Agent 执行源码修改的 `QueryDiff` 文本。
|
|
119
|
-
|
|
120
|
-
## 文件输入输出
|
|
121
|
-
|
|
122
|
-
涉及文件输入/输出时,schema 使用文件对象字段,例如 `url`、`file_type`、`content`、`name`。前端上传文件后会按 schema 把文件对象传给工作流。
|
|
123
|
-
|
|
124
|
-
节点生成文件时,优先写入项目 `assets/` 目录,并在输出中返回文件对象:
|
|
125
|
-
|
|
126
|
-
```json
|
|
127
|
-
{
|
|
128
|
-
"pdf_file": {
|
|
129
|
-
"url": "/assets/result.pdf",
|
|
130
|
-
"file_type": "document",
|
|
131
|
-
"name": "result.pdf"
|
|
132
|
-
}
|
|
133
|
-
}
|
|
47
|
+
```bash
|
|
48
|
+
bash scripts/local_run.sh '{"topic":"LICOS 工作流"}'
|
|
134
49
|
```
|
|
135
50
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
## 项目上下文
|
|
139
|
-
|
|
140
|
-
项目内的 `AGENTS.md` 用于记录可由用户维护的项目上下文,例如业务目标、节点清单、输入输出样例和测试方式。
|
|
141
|
-
|
|
142
|
-
## 编程项目登录身份
|
|
51
|
+
新模板共用 scripts/runtime.sh 选择解释器,命令参数见 SDK docs/workflow-validation.md。已有项目先读其实际脚本,不能假定和新模板一致。
|
|
143
52
|
|
|
144
|
-
|
|
145
|
-
- Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
|
|
146
|
-
- 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
|
|
147
|
-
- Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
|
|
148
|
-
- 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
|
|
149
|
-
- 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
|
|
150
|
-
- 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
|
|
53
|
+
按实际完成情况记录检查、真实运行、恢复和未验收项;HTTP 成功不等于业务结果正确。业务提示词只写节点任务和输出要求。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# 查阅项目实际使用的 SDK
|
|
2
|
+
|
|
3
|
+
功能说明、API、配置字段、默认值和限制统一查 SDK 文档,按任务读取,不复制进本项目规则或业务提示词。
|
|
4
|
+
|
|
5
|
+
## 1. 确认项目解释器
|
|
6
|
+
|
|
7
|
+
先看 scripts/runtime.sh:显式 PYTHON_BIN 优先;否则项目有 .venv 时用 .venv/bin/python;没有时用当前运行环境的 python。不要用全局环境替代项目环境。
|
|
8
|
+
|
|
9
|
+
以下命令以项目虚拟环境为例,按实际解释器替换命令开头:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
.venv/bin/python -c 'from importlib.metadata import version; from importlib.resources import files; print(version("licos-agent-runtime")); print(files("licos_agent_runtime").joinpath("docs"))'
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 2. 先读索引,再读相关主题
|
|
16
|
+
|
|
17
|
+
打开上一步目录中的 index.md,按本次需求选择文档。索引区分智能体、编程工作流和公共接口;工作流先读 workflow-authoring.md 与 workflow-runtime.md。只读相关章节,再按真实签名实现。
|
|
18
|
+
|
|
19
|
+
也可以直接打印索引:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
.venv/bin/python -c 'from importlib.resources import files; print(files("licos_agent_runtime").joinpath("docs/index.md").read_text(encoding="utf-8"))'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
其他依赖 SDK 同样查对应包的实际版本、文档和签名。包内资源可通过 importlib.resources 定位,包描述可通过 importlib.metadata.metadata 查看,不猜 site-packages 路径。
|
|
26
|
+
|
|
27
|
+
## 3. 老项目兼容
|
|
28
|
+
|
|
29
|
+
老版本没有索引时列出其实际文档、查看包描述及源码签名,不从另一版本复制 API。确需新能力时按 [UPGRADING.md](UPGRADING.md) 制定升级与验收步骤;不因查文档自动升级。
|
|
30
|
+
|
|
31
|
+
[README.md](README.md) 介绍项目结构;[回执示例](examples/wait_signal.md) 介绍模板示例接入;[DATABASE.md](DATABASE.md) 记录持久化准备;AGENTS.md 记录本项目已实现内容和用户决定。
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# 已有工作流升级
|
|
2
|
+
|
|
3
|
+
默认保持原版本;需要新能力时再制定升级方案。不要重新初始化覆盖业务图、登录、配置或数据。
|
|
4
|
+
|
|
5
|
+
1. 记录实际包版本、依赖/锁文件、入口、节点、Schema、外部接口和已启用保存方式。
|
|
6
|
+
2. 按 [SDK.md](SDK.md) 比对版本能力,保留原运行接口和业务输入输出;缺少新接口的旧项目继续原功能,鉴权或服务错误不能当作“不支持”忽略。
|
|
7
|
+
3. 合并必要改动,保持节点 ID、类型、路由和原用户授权。图或状态变化要处理旧检查点与未完成实例,不能只改版本号后重跑外部操作。
|
|
8
|
+
4. 持久化变更按 [DATABASE.md](DATABASE.md) 检查并显式迁移,不自动开启或清空数据库。
|
|
9
|
+
5. 在实际项目解释器和 Preview 中核对参数、画布、真实业务结果及本次新增能力;需要重启恢复时实际验证。
|
|
10
|
+
6. 由平台构建部署后核对安装版本和配置;本地源码更新不等于已部署项目升级。在 AGENTS.md 记录结果和回退安排。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 人工处理与设备回执节点示例
|
|
2
2
|
|
|
3
|
-
此示例仅用于用户明确要求持久化等待的项目。先按
|
|
3
|
+
此示例仅用于用户明确要求持久化等待的项目。先按 [SDK.md](../SDK.md) 的工作流文档,为**该项目**启用 `durability`、`signals` 和项目数据库迁移。示例中的外部接口应替换为项目真实的 WMS/MES/PLC 接口。
|
|
4
4
|
|
|
5
5
|
```python
|
|
6
6
|
from uuid import NAMESPACE_URL, uuid5
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "<%= appName %>"
|
|
3
|
-
version = "0.1.0"
|
|
4
|
-
description = "LICOS LangGraph workflow project"
|
|
5
|
-
requires-python = ">=3.12"
|
|
6
|
-
dependencies = [
|
|
7
|
-
"licos-agent-runtime>=0.6.
|
|
8
|
-
"licos-platform-sdk>=0.7.6",
|
|
9
|
-
"licos-dev-sdk>=0.6.6",
|
|
10
|
-
]
|
|
11
|
-
|
|
12
|
-
[tool.uv]
|
|
13
|
-
[[tool.uv.index]]
|
|
14
|
-
url = "https://mirrors.aliyun.com/pypi/simple/"
|
|
15
|
-
default = true
|
|
1
|
+
[project]
|
|
2
|
+
name = "<%= appName %>"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "LICOS LangGraph workflow project"
|
|
5
|
+
requires-python = ">=3.12"
|
|
6
|
+
dependencies = [
|
|
7
|
+
"licos-agent-runtime>=0.6.10",
|
|
8
|
+
"licos-platform-sdk>=0.7.6",
|
|
9
|
+
"licos-dev-sdk>=0.6.6",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
[tool.uv]
|
|
13
|
+
[[tool.uv.index]]
|
|
14
|
+
url = "https://mirrors.aliyun.com/pypi/simple/"
|
|
15
|
+
default = true
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
licos-agent-runtime>=0.6.
|
|
2
|
-
licos-platform-sdk>=0.7.6
|
|
3
|
-
licos-dev-sdk>=0.6.6
|
|
1
|
+
licos-agent-runtime>=0.6.10
|
|
2
|
+
licos-platform-sdk>=0.7.6
|
|
3
|
+
licos-dev-sdk>=0.6.6
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
set -eo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
5
|
PORT="${PORT:-<%= port %>}"
|
|
6
6
|
HOST="${HOST:-0.0.0.0}"
|
|
7
7
|
|
|
@@ -21,17 +21,4 @@ while [ "$#" -gt 0 ]; do
|
|
|
21
21
|
esac
|
|
22
22
|
done
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export LICOS_PROJECT_PATH="$PROJECT_DIR"
|
|
27
|
-
export AGENT_PROJECT_TYPE="${AGENT_PROJECT_TYPE:-WORKFLOW}"
|
|
28
|
-
|
|
29
|
-
PYTHON_BIN="${PYTHON_BIN:-python}"
|
|
30
|
-
if ! command -v "$PYTHON_BIN" >/dev/null 2>&1 && command -v python3 >/dev/null 2>&1; then
|
|
31
|
-
PYTHON_BIN=python3
|
|
32
|
-
fi
|
|
33
|
-
if [ -x "$PROJECT_DIR/.venv/bin/python" ]; then
|
|
34
|
-
PYTHON_BIN="$PROJECT_DIR/.venv/bin/python"
|
|
35
|
-
fi
|
|
36
|
-
|
|
37
|
-
exec "$PYTHON_BIN" -m licos_agent_runtime --mode http --host "$HOST" --port "$PORT"
|
|
24
|
+
exec bash "$SCRIPT_DIR/runtime.sh" --mode http --host "$HOST" --port "$PORT"
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
set -eo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
5
|
INPUT="${1:-{\"topic\":\"LICOS 工作流\"}}"
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export LICOS_PROJECT_PATH="$PROJECT_DIR"
|
|
10
|
-
export AGENT_PROJECT_TYPE="${AGENT_PROJECT_TYPE:-WORKFLOW}"
|
|
11
|
-
|
|
12
|
-
python -m licos_agent_runtime --mode flow --input "$INPUT"
|
|
7
|
+
exec bash "$SCRIPT_DIR/runtime.sh" --mode flow --input "$INPUT"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -eo pipefail
|
|
3
|
+
|
|
4
|
+
PROJECT_DIR="${LICOS_PROJECT_PATH:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
|
|
5
|
+
cd "$PROJECT_DIR"
|
|
6
|
+
export LICOS_PROJECT_PATH="$PROJECT_DIR"
|
|
7
|
+
export AGENT_PROJECT_TYPE="${AGENT_PROJECT_TYPE:-WORKFLOW}"
|
|
8
|
+
|
|
9
|
+
if [ -z "${PYTHON_BIN:-}" ]; then
|
|
10
|
+
if [ -d "$PROJECT_DIR/.venv" ]; then
|
|
11
|
+
PYTHON_BIN="$PROJECT_DIR/.venv/bin/python"
|
|
12
|
+
else
|
|
13
|
+
PYTHON_BIN=python
|
|
14
|
+
fi
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
exec "$PYTHON_BIN" -m licos_agent_runtime "$@"
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const description = `Workflow(工作流项目):\`licos init \${LICOS_PROJECT_PATH} --template workflow\`
|
|
2
2
|
- 适用:Python + LangGraph 工作流项目
|
|
3
|
-
-
|
|
4
|
-
-
|
|
5
|
-
-
|
|
3
|
+
- README.md 说明结构与接入,AGENTS.md 记录项目实际实现和用户选择
|
|
4
|
+
- 功能、API、配置及限制按 SDK.md 查当前安装版本文档,不复制功能全集
|
|
5
|
+
- DATABASE.md 与 UPGRADING.md 分别说明持久化准备和已有项目升级`;
|
|
6
6
|
|
|
7
7
|
const config = {
|
|
8
8
|
description,
|
|
@@ -39,6 +39,7 @@ const config = {
|
|
|
39
39
|
console.log('\nConfiguration:');
|
|
40
40
|
console.log(' - Runtime: licos-agent-runtime');
|
|
41
41
|
console.log(' - Framework: LangGraph');
|
|
42
|
+
console.log(' - SDK documentation for the installed version: SDK.md');
|
|
42
43
|
console.log(` - Port: ${_context.port}`);
|
|
43
44
|
},
|
|
44
45
|
};
|