@kweaver-ai/kweaver-sdk 0.4.0 → 0.4.1
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/README.md +139 -0
- package/README.zh.md +139 -0
- package/dist/api/agent-list.d.ts +7 -0
- package/dist/api/agent-list.js +21 -2
- package/dist/api/datasources.d.ts +73 -0
- package/dist/api/datasources.js +218 -0
- package/dist/api/dataviews.d.ts +20 -0
- package/dist/api/dataviews.js +72 -0
- package/dist/api/knowledge-networks.d.ts +84 -0
- package/dist/api/knowledge-networks.js +167 -0
- package/dist/cli.js +9 -0
- package/dist/commands/agent.d.ts +7 -0
- package/dist/commands/agent.js +102 -1
- package/dist/commands/bkn.d.ts +6 -0
- package/dist/commands/bkn.js +784 -23
- package/dist/commands/context-loader.js +4 -4
- package/dist/commands/ds.d.ts +7 -0
- package/dist/commands/ds.js +283 -0
- package/dist/resources/bkn.d.ts +12 -0
- package/dist/resources/bkn.js +12 -0
- package/dist/resources/knowledge-networks.js +17 -55
- package/dist/utils/crypto.d.ts +10 -0
- package/dist/utils/crypto.js +31 -0
- package/package.json +3 -2
package/README.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# @kweaver-ai/kweaver-sdk
|
|
2
|
+
|
|
3
|
+
TypeScript SDK and CLI for [KWeaver](https://github.com/kweaver-ai/kweaver-sdk) — gives AI agents and applications programmatic access to knowledge networks and Decision Agents.
|
|
4
|
+
|
|
5
|
+
[中文文档](README.zh.md)
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# CLI (global)
|
|
11
|
+
npm install -g @kweaver-ai/kweaver-sdk
|
|
12
|
+
|
|
13
|
+
# Library
|
|
14
|
+
npm install @kweaver-ai/kweaver-sdk
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Requires **Node.js >= 22**.
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### Authenticate
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
kweaver auth login https://your-kweaver-instance.com
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or use environment variables:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
export KWEAVER_BASE_URL=https://your-kweaver-instance.com
|
|
31
|
+
export KWEAVER_TOKEN=your-token
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Simple API (recommended)
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import kweaver from "@kweaver-ai/kweaver-sdk/kweaver";
|
|
38
|
+
|
|
39
|
+
// Zero-config: reads credentials saved by `kweaver auth login`
|
|
40
|
+
kweaver.configure({ config: true, bknId: "your-bkn-id", agentId: "your-agent-id" });
|
|
41
|
+
|
|
42
|
+
// Search the knowledge network
|
|
43
|
+
const results = await kweaver.search("What risks exist in the supply chain?");
|
|
44
|
+
for (const concept of results.concepts) console.log(concept.concept_name);
|
|
45
|
+
|
|
46
|
+
// Chat with an agent
|
|
47
|
+
const reply = await kweaver.chat("Summarise the top 3 risks");
|
|
48
|
+
console.log(reply.text);
|
|
49
|
+
|
|
50
|
+
// After modifying object types or adding datasources, rebuild the BKN index
|
|
51
|
+
await kweaver.weaver({ wait: true });
|
|
52
|
+
|
|
53
|
+
// List available BKNs and agents
|
|
54
|
+
const bknList = await kweaver.bkns();
|
|
55
|
+
const agentList = await kweaver.agents();
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Full Client API (advanced)
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { KWeaverClient } from "@kweaver-ai/kweaver-sdk";
|
|
62
|
+
|
|
63
|
+
// Zero-config: reads credentials saved by `kweaver auth login`
|
|
64
|
+
const client = new KWeaverClient();
|
|
65
|
+
|
|
66
|
+
// Or pass credentials explicitly
|
|
67
|
+
const client = new KWeaverClient({
|
|
68
|
+
baseUrl: "https://your-kweaver-instance.com",
|
|
69
|
+
accessToken: "your-token",
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Knowledge networks
|
|
73
|
+
const kns = await client.knowledgeNetworks.list({ limit: 10 });
|
|
74
|
+
const ots = await client.knowledgeNetworks.listObjectTypes("bkn-id");
|
|
75
|
+
const rts = await client.knowledgeNetworks.listRelationTypes("bkn-id");
|
|
76
|
+
const ats = await client.knowledgeNetworks.listActionTypes("bkn-id");
|
|
77
|
+
|
|
78
|
+
// Agent chat (single-shot)
|
|
79
|
+
const reply = await client.agents.chat("agent-id", "Hello");
|
|
80
|
+
console.log(reply.text, reply.conversationId);
|
|
81
|
+
|
|
82
|
+
// Agent chat (streaming)
|
|
83
|
+
await client.agents.stream("agent-id", "Hello", {
|
|
84
|
+
onTextDelta: (chunk) => process.stdout.write(chunk),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// BKN engine — instance queries, subgraph, action execution
|
|
88
|
+
const instances = await client.bkn.queryInstances("bkn-id", "ot-id", { limit: 20 });
|
|
89
|
+
const graph = await client.bkn.querySubgraph("bkn-id", { /* path spec */ });
|
|
90
|
+
await client.bkn.executeAction("bkn-id", "at-id", { /* params */ });
|
|
91
|
+
const logs = await client.bkn.listActionLogs("bkn-id");
|
|
92
|
+
|
|
93
|
+
// Context Loader (semantic search over a BKN via MCP)
|
|
94
|
+
const cl = client.contextLoader(mcpUrl, "bkn-id");
|
|
95
|
+
const results = await cl.search({ query: "hypertension treatment" });
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## CLI Reference
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
kweaver auth login/status/list/use/delete/logout
|
|
102
|
+
kweaver token
|
|
103
|
+
kweaver bkn list/get/stats/export/create/update/delete
|
|
104
|
+
kweaver bkn object-type list/get/create/update/delete/query/properties
|
|
105
|
+
kweaver bkn relation-type list/get/create/update/delete
|
|
106
|
+
kweaver bkn action-type list/query/execute
|
|
107
|
+
kweaver bkn subgraph
|
|
108
|
+
kweaver bkn action-execution get
|
|
109
|
+
kweaver bkn action-log list/get/cancel
|
|
110
|
+
kweaver agent list/get/chat/sessions/history
|
|
111
|
+
kweaver context-loader config set/use/list/show
|
|
112
|
+
kweaver context-loader kn-search/query-object-instance/...
|
|
113
|
+
kweaver call <path> [-X METHOD] [-d BODY] [-H header]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Environment Variables
|
|
117
|
+
|
|
118
|
+
| Variable | Description |
|
|
119
|
+
|---|---|
|
|
120
|
+
| `KWEAVER_BASE_URL` | KWeaver instance URL |
|
|
121
|
+
| `KWEAVER_BUSINESS_DOMAIN` | Business domain identifier |
|
|
122
|
+
| `KWEAVER_TOKEN` | Access token |
|
|
123
|
+
|
|
124
|
+
## Using with AI Agents
|
|
125
|
+
|
|
126
|
+
Install the KWeaver skill for Claude Code, Cursor, or other AI coding agents:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
npx skills add kweaver-ai/kweaver-sdk --skill kweaver-core
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Links
|
|
133
|
+
|
|
134
|
+
- [GitHub](https://github.com/kweaver-ai/kweaver-sdk)
|
|
135
|
+
- [Python SDK on PyPI](https://pypi.org/project/kweaver-sdk/)
|
|
136
|
+
|
|
137
|
+
## License
|
|
138
|
+
|
|
139
|
+
MIT
|
package/README.zh.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# @kweaver-ai/kweaver-sdk
|
|
2
|
+
|
|
3
|
+
KWeaver TypeScript SDK 和 CLI — 让 AI 智能体与应用程序以编程方式访问知识网络和 Decision Agent。
|
|
4
|
+
|
|
5
|
+
[English](README.md)
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 全局安装 CLI
|
|
11
|
+
npm install -g @kweaver-ai/kweaver-sdk
|
|
12
|
+
|
|
13
|
+
# 作为库使用
|
|
14
|
+
npm install @kweaver-ai/kweaver-sdk
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
需要 **Node.js >= 22**。
|
|
18
|
+
|
|
19
|
+
## 快速上手
|
|
20
|
+
|
|
21
|
+
### 认证
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
kweaver auth login https://your-kweaver-instance.com
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
或使用环境变量:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
export KWEAVER_BASE_URL=https://your-kweaver-instance.com
|
|
31
|
+
export KWEAVER_TOKEN=your-token
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 简洁 API(推荐)
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import kweaver from "@kweaver-ai/kweaver-sdk/kweaver";
|
|
38
|
+
|
|
39
|
+
// 使用 `kweaver auth login` 保存的凭据,零配置
|
|
40
|
+
kweaver.configure({ config: true, bknId: "your-bkn-id", agentId: "your-agent-id" });
|
|
41
|
+
|
|
42
|
+
// 搜索知识网络
|
|
43
|
+
const results = await kweaver.search("供应链有哪些关键风险?");
|
|
44
|
+
for (const concept of results.concepts) console.log(concept.concept_name);
|
|
45
|
+
|
|
46
|
+
// 与 Agent 对话
|
|
47
|
+
const reply = await kweaver.chat("总结前三大风险");
|
|
48
|
+
console.log(reply.text);
|
|
49
|
+
|
|
50
|
+
// 接入数据源或修改对象类后,重建 BKN 索引
|
|
51
|
+
await kweaver.weaver({ wait: true });
|
|
52
|
+
|
|
53
|
+
// 查看所有 BKN 和 Agent
|
|
54
|
+
const bknList = await kweaver.bkns();
|
|
55
|
+
const agentList = await kweaver.agents();
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 底层客户端(高级用法)
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { KWeaverClient } from "@kweaver-ai/kweaver-sdk";
|
|
62
|
+
|
|
63
|
+
// 零配置:自动读取 `kweaver auth login` 保存的凭据
|
|
64
|
+
const client = new KWeaverClient();
|
|
65
|
+
|
|
66
|
+
// 或显式传入凭据
|
|
67
|
+
const client = new KWeaverClient({
|
|
68
|
+
baseUrl: "https://your-kweaver-instance.com",
|
|
69
|
+
accessToken: "your-token",
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// 知识网络
|
|
73
|
+
const kns = await client.knowledgeNetworks.list({ limit: 10 });
|
|
74
|
+
const ots = await client.knowledgeNetworks.listObjectTypes("bkn-id");
|
|
75
|
+
const rts = await client.knowledgeNetworks.listRelationTypes("bkn-id");
|
|
76
|
+
const ats = await client.knowledgeNetworks.listActionTypes("bkn-id");
|
|
77
|
+
|
|
78
|
+
// Agent 对话(单次)
|
|
79
|
+
const reply = await client.agents.chat("agent-id", "你好");
|
|
80
|
+
console.log(reply.text, reply.conversationId);
|
|
81
|
+
|
|
82
|
+
// Agent 对话(流式)
|
|
83
|
+
await client.agents.stream("agent-id", "你好", {
|
|
84
|
+
onTextDelta: (chunk) => process.stdout.write(chunk),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// BKN 引擎:实例查询、子图、Action 执行
|
|
88
|
+
const instances = await client.bkn.queryInstances("bkn-id", "ot-id", { limit: 20 });
|
|
89
|
+
const graph = await client.bkn.querySubgraph("bkn-id", { /* 路径规格 */ });
|
|
90
|
+
await client.bkn.executeAction("bkn-id", "at-id", { /* 参数 */ });
|
|
91
|
+
const logs = await client.bkn.listActionLogs("bkn-id");
|
|
92
|
+
|
|
93
|
+
// Context Loader(通过 MCP 对 BKN 做语义搜索)
|
|
94
|
+
const cl = client.contextLoader(mcpUrl, "bkn-id");
|
|
95
|
+
const results = await cl.search({ query: "高血压 治疗" });
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 命令速查
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
kweaver auth login/status/list/use/delete/logout
|
|
102
|
+
kweaver token
|
|
103
|
+
kweaver bkn list/get/stats/export/create/update/delete
|
|
104
|
+
kweaver bkn object-type list/get/create/update/delete/query/properties
|
|
105
|
+
kweaver bkn relation-type list/get/create/update/delete
|
|
106
|
+
kweaver bkn action-type list/query/execute
|
|
107
|
+
kweaver bkn subgraph
|
|
108
|
+
kweaver bkn action-execution get
|
|
109
|
+
kweaver bkn action-log list/get/cancel
|
|
110
|
+
kweaver agent list/get/chat/sessions/history
|
|
111
|
+
kweaver context-loader config set/use/list/show
|
|
112
|
+
kweaver context-loader kn-search/query-object-instance/...
|
|
113
|
+
kweaver call <path> [-X METHOD] [-d BODY] [-H header]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 环境变量
|
|
117
|
+
|
|
118
|
+
| 变量 | 说明 |
|
|
119
|
+
|---|---|
|
|
120
|
+
| `KWEAVER_BASE_URL` | KWeaver 实例地址 |
|
|
121
|
+
| `KWEAVER_BUSINESS_DOMAIN` | 业务域标识 |
|
|
122
|
+
| `KWEAVER_TOKEN` | 访问令牌 |
|
|
123
|
+
|
|
124
|
+
## 在 AI 智能体中使用
|
|
125
|
+
|
|
126
|
+
为 Claude Code、Cursor 等 AI 编程助手安装 KWeaver 技能:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
npx skills add kweaver-ai/kweaver-sdk --skill kweaver-core
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## 相关链接
|
|
133
|
+
|
|
134
|
+
- [GitHub](https://github.com/kweaver-ai/kweaver-sdk)
|
|
135
|
+
- [Python SDK on PyPI](https://pypi.org/project/kweaver-sdk/)
|
|
136
|
+
|
|
137
|
+
## 许可证
|
|
138
|
+
|
|
139
|
+
MIT
|
package/dist/api/agent-list.d.ts
CHANGED
|
@@ -10,3 +10,10 @@ export interface ListAgentsOptions {
|
|
|
10
10
|
is_to_square?: number;
|
|
11
11
|
}
|
|
12
12
|
export declare function listAgents(options: ListAgentsOptions): Promise<string>;
|
|
13
|
+
export interface GetAgentOptions {
|
|
14
|
+
baseUrl: string;
|
|
15
|
+
accessToken: string;
|
|
16
|
+
agentId: string;
|
|
17
|
+
businessDomain?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function getAgent(options: GetAgentOptions): Promise<string>;
|
package/dist/api/agent-list.js
CHANGED
|
@@ -20,8 +20,6 @@ export async function listAgents(options) {
|
|
|
20
20
|
token: accessToken,
|
|
21
21
|
"x-business-domain": businessDomain,
|
|
22
22
|
"x-language": "zh-CN",
|
|
23
|
-
"x-requested-with": "XMLHttpRequest",
|
|
24
|
-
"content-type": "application/json",
|
|
25
23
|
},
|
|
26
24
|
body,
|
|
27
25
|
});
|
|
@@ -31,3 +29,24 @@ export async function listAgents(options) {
|
|
|
31
29
|
}
|
|
32
30
|
return responseBody;
|
|
33
31
|
}
|
|
32
|
+
export async function getAgent(options) {
|
|
33
|
+
const { baseUrl, accessToken, agentId, businessDomain = "bd_public", } = options;
|
|
34
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
35
|
+
const url = `${base}/api/agent-factory/v3/agent/${encodeURIComponent(agentId)}`;
|
|
36
|
+
const response = await fetch(url, {
|
|
37
|
+
method: "GET",
|
|
38
|
+
headers: {
|
|
39
|
+
accept: "application/json, text/plain, */*",
|
|
40
|
+
"accept-language": "zh-CN",
|
|
41
|
+
authorization: `Bearer ${accessToken}`,
|
|
42
|
+
token: accessToken,
|
|
43
|
+
"x-business-domain": businessDomain,
|
|
44
|
+
"x-language": "zh-CN",
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
const responseBody = await response.text();
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new HttpError(response.status, response.statusText, responseBody);
|
|
50
|
+
}
|
|
51
|
+
return responseBody;
|
|
52
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export interface TestDatasourceOptions {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
accessToken: string;
|
|
4
|
+
type: string;
|
|
5
|
+
host: string;
|
|
6
|
+
port: number;
|
|
7
|
+
database: string;
|
|
8
|
+
account: string;
|
|
9
|
+
password: string;
|
|
10
|
+
schema?: string;
|
|
11
|
+
businessDomain?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function testDatasource(options: TestDatasourceOptions): Promise<void>;
|
|
14
|
+
export interface CreateDatasourceOptions {
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
accessToken: string;
|
|
17
|
+
name: string;
|
|
18
|
+
type: string;
|
|
19
|
+
host: string;
|
|
20
|
+
port: number;
|
|
21
|
+
database: string;
|
|
22
|
+
account: string;
|
|
23
|
+
password: string;
|
|
24
|
+
schema?: string;
|
|
25
|
+
comment?: string;
|
|
26
|
+
businessDomain?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function createDatasource(options: CreateDatasourceOptions): Promise<string>;
|
|
29
|
+
export interface ListDatasourcesOptions {
|
|
30
|
+
baseUrl: string;
|
|
31
|
+
accessToken: string;
|
|
32
|
+
keyword?: string;
|
|
33
|
+
type?: string;
|
|
34
|
+
businessDomain?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function listDatasources(options: ListDatasourcesOptions): Promise<string>;
|
|
37
|
+
export interface GetDatasourceOptions {
|
|
38
|
+
baseUrl: string;
|
|
39
|
+
accessToken: string;
|
|
40
|
+
id: string;
|
|
41
|
+
businessDomain?: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function getDatasource(options: GetDatasourceOptions): Promise<string>;
|
|
44
|
+
export interface DeleteDatasourceOptions {
|
|
45
|
+
baseUrl: string;
|
|
46
|
+
accessToken: string;
|
|
47
|
+
id: string;
|
|
48
|
+
businessDomain?: string;
|
|
49
|
+
}
|
|
50
|
+
export declare function deleteDatasource(options: DeleteDatasourceOptions): Promise<void>;
|
|
51
|
+
export interface ListTablesOptions {
|
|
52
|
+
baseUrl: string;
|
|
53
|
+
accessToken: string;
|
|
54
|
+
id: string;
|
|
55
|
+
keyword?: string;
|
|
56
|
+
limit?: number;
|
|
57
|
+
offset?: number;
|
|
58
|
+
businessDomain?: string;
|
|
59
|
+
}
|
|
60
|
+
export declare function listTables(options: ListTablesOptions): Promise<string>;
|
|
61
|
+
export interface ListTablesWithColumnsOptions extends ListTablesOptions {
|
|
62
|
+
autoScan?: boolean;
|
|
63
|
+
}
|
|
64
|
+
/** List tables with column details. Optionally triggers metadata scan if no tables found. */
|
|
65
|
+
export declare function listTablesWithColumns(options: ListTablesWithColumnsOptions): Promise<string>;
|
|
66
|
+
export interface ScanMetadataOptions {
|
|
67
|
+
baseUrl: string;
|
|
68
|
+
accessToken: string;
|
|
69
|
+
id: string;
|
|
70
|
+
dsType?: string;
|
|
71
|
+
businessDomain?: string;
|
|
72
|
+
}
|
|
73
|
+
export declare function scanMetadata(options: ScanMetadataOptions): Promise<string>;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { HttpError } from "../utils/http.js";
|
|
2
|
+
import { encryptPassword } from "../utils/crypto.js";
|
|
3
|
+
const HTTPS_PROTOCOLS = new Set(["maxcompute", "anyshare7", "opensearch"]);
|
|
4
|
+
function connectProtocol(dsType) {
|
|
5
|
+
return HTTPS_PROTOCOLS.has(dsType) ? "https" : "jdbc";
|
|
6
|
+
}
|
|
7
|
+
function makeBinData(type, host, port, database, account, password, schema) {
|
|
8
|
+
const d = {
|
|
9
|
+
host,
|
|
10
|
+
port,
|
|
11
|
+
database_name: database,
|
|
12
|
+
connect_protocol: connectProtocol(type),
|
|
13
|
+
account,
|
|
14
|
+
password: encryptPassword(password),
|
|
15
|
+
};
|
|
16
|
+
if (schema !== undefined && schema !== "") {
|
|
17
|
+
d.schema = schema;
|
|
18
|
+
}
|
|
19
|
+
return d;
|
|
20
|
+
}
|
|
21
|
+
function buildHeaders(accessToken, businessDomain) {
|
|
22
|
+
return {
|
|
23
|
+
accept: "application/json, text/plain, */*",
|
|
24
|
+
"accept-language": "zh-cn",
|
|
25
|
+
authorization: `Bearer ${accessToken}`,
|
|
26
|
+
token: accessToken,
|
|
27
|
+
"x-business-domain": businessDomain,
|
|
28
|
+
"x-language": "zh-cn",
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export async function testDatasource(options) {
|
|
32
|
+
const { baseUrl, accessToken, type, host, port, database, account, password, schema, businessDomain = "bd_public", } = options;
|
|
33
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
34
|
+
const url = `${base}/api/data-connection/v1/datasource/test`;
|
|
35
|
+
const body = JSON.stringify({
|
|
36
|
+
type,
|
|
37
|
+
bin_data: makeBinData(type, host, port, database, account, password, schema),
|
|
38
|
+
});
|
|
39
|
+
const response = await fetch(url, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: {
|
|
42
|
+
...buildHeaders(accessToken, businessDomain),
|
|
43
|
+
"content-type": "application/json",
|
|
44
|
+
},
|
|
45
|
+
body,
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
const responseBody = await response.text();
|
|
49
|
+
throw new HttpError(response.status, response.statusText, responseBody);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function createDatasource(options) {
|
|
53
|
+
const { baseUrl, accessToken, name, type, host, port, database, account, password, schema, comment, businessDomain = "bd_public", } = options;
|
|
54
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
55
|
+
const url = `${base}/api/data-connection/v1/datasource`;
|
|
56
|
+
const bodyObj = {
|
|
57
|
+
name,
|
|
58
|
+
type,
|
|
59
|
+
bin_data: makeBinData(type, host, port, database, account, password, schema),
|
|
60
|
+
};
|
|
61
|
+
if (comment) {
|
|
62
|
+
bodyObj.comment = comment;
|
|
63
|
+
}
|
|
64
|
+
const response = await fetch(url, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: {
|
|
67
|
+
...buildHeaders(accessToken, businessDomain),
|
|
68
|
+
"content-type": "application/json",
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify(bodyObj),
|
|
71
|
+
});
|
|
72
|
+
const responseBody = await response.text();
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new HttpError(response.status, response.statusText, responseBody);
|
|
75
|
+
}
|
|
76
|
+
return responseBody;
|
|
77
|
+
}
|
|
78
|
+
export async function listDatasources(options) {
|
|
79
|
+
const { baseUrl, accessToken, keyword, type, businessDomain = "bd_public", } = options;
|
|
80
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
81
|
+
const url = new URL(`${base}/api/data-connection/v1/datasource`);
|
|
82
|
+
if (keyword)
|
|
83
|
+
url.searchParams.set("keyword", keyword);
|
|
84
|
+
if (type)
|
|
85
|
+
url.searchParams.set("type", type);
|
|
86
|
+
const response = await fetch(url.toString(), {
|
|
87
|
+
method: "GET",
|
|
88
|
+
headers: buildHeaders(accessToken, businessDomain),
|
|
89
|
+
});
|
|
90
|
+
const body = await response.text();
|
|
91
|
+
if (!response.ok) {
|
|
92
|
+
throw new HttpError(response.status, response.statusText, body);
|
|
93
|
+
}
|
|
94
|
+
return body;
|
|
95
|
+
}
|
|
96
|
+
export async function getDatasource(options) {
|
|
97
|
+
const { baseUrl, accessToken, id, businessDomain = "bd_public", } = options;
|
|
98
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
99
|
+
const url = `${base}/api/data-connection/v1/datasource/${encodeURIComponent(id)}`;
|
|
100
|
+
const response = await fetch(url, {
|
|
101
|
+
method: "GET",
|
|
102
|
+
headers: buildHeaders(accessToken, businessDomain),
|
|
103
|
+
});
|
|
104
|
+
const body = await response.text();
|
|
105
|
+
if (!response.ok) {
|
|
106
|
+
throw new HttpError(response.status, response.statusText, body);
|
|
107
|
+
}
|
|
108
|
+
return body;
|
|
109
|
+
}
|
|
110
|
+
export async function deleteDatasource(options) {
|
|
111
|
+
const { baseUrl, accessToken, id, businessDomain = "bd_public", } = options;
|
|
112
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
113
|
+
const url = `${base}/api/data-connection/v1/datasource/${encodeURIComponent(id)}`;
|
|
114
|
+
const response = await fetch(url, {
|
|
115
|
+
method: "DELETE",
|
|
116
|
+
headers: buildHeaders(accessToken, businessDomain),
|
|
117
|
+
});
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
const body = await response.text();
|
|
120
|
+
throw new HttpError(response.status, response.statusText, body);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export async function listTables(options) {
|
|
124
|
+
const { baseUrl, accessToken, id, keyword, limit = -1, offset, businessDomain = "bd_public", } = options;
|
|
125
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
126
|
+
const url = new URL(`${base}/api/data-connection/v1/metadata/data-source/${encodeURIComponent(id)}`);
|
|
127
|
+
url.searchParams.set("limit", String(limit));
|
|
128
|
+
if (keyword)
|
|
129
|
+
url.searchParams.set("keyword", keyword);
|
|
130
|
+
if (offset !== undefined)
|
|
131
|
+
url.searchParams.set("offset", String(offset));
|
|
132
|
+
const response = await fetch(url.toString(), {
|
|
133
|
+
method: "GET",
|
|
134
|
+
headers: buildHeaders(accessToken, businessDomain),
|
|
135
|
+
});
|
|
136
|
+
const body = await response.text();
|
|
137
|
+
if (!response.ok) {
|
|
138
|
+
throw new HttpError(response.status, response.statusText, body);
|
|
139
|
+
}
|
|
140
|
+
return body;
|
|
141
|
+
}
|
|
142
|
+
/** List tables with column details. Optionally triggers metadata scan if no tables found. */
|
|
143
|
+
export async function listTablesWithColumns(options) {
|
|
144
|
+
const { id, autoScan = true, ...rest } = options;
|
|
145
|
+
let body = await listTables({ ...rest, id });
|
|
146
|
+
const parsed = JSON.parse(body);
|
|
147
|
+
let items = Array.isArray(parsed) ? parsed : (parsed.entries ?? parsed.data ?? []);
|
|
148
|
+
if (items.length === 0 && autoScan) {
|
|
149
|
+
await scanMetadata({
|
|
150
|
+
baseUrl: rest.baseUrl,
|
|
151
|
+
accessToken: rest.accessToken,
|
|
152
|
+
id,
|
|
153
|
+
businessDomain: rest.businessDomain,
|
|
154
|
+
});
|
|
155
|
+
body = await listTables({ ...rest, id });
|
|
156
|
+
const parsed2 = JSON.parse(body);
|
|
157
|
+
items = Array.isArray(parsed2) ? parsed2 : (parsed2.entries ?? parsed2.data ?? []);
|
|
158
|
+
}
|
|
159
|
+
const base = rest.baseUrl.replace(/\/+$/, "");
|
|
160
|
+
const tables = [];
|
|
161
|
+
for (const t of items) {
|
|
162
|
+
const tableId = String(t.id ?? "");
|
|
163
|
+
const tableName = String(t.name ?? "");
|
|
164
|
+
let columnsRaw = (t.columns ?? t.fields ?? []);
|
|
165
|
+
if (columnsRaw.length === 0 && tableId) {
|
|
166
|
+
const tableUrl = `${base}/api/data-connection/v1/metadata/table/${encodeURIComponent(tableId)}?limit=-1`;
|
|
167
|
+
const colResponse = await fetch(tableUrl, {
|
|
168
|
+
method: "GET",
|
|
169
|
+
headers: buildHeaders(rest.accessToken, rest.businessDomain ?? "bd_public"),
|
|
170
|
+
});
|
|
171
|
+
const colData = (await colResponse.json());
|
|
172
|
+
columnsRaw = Array.isArray(colData) ? colData : (colData.entries ?? colData.data ?? []);
|
|
173
|
+
}
|
|
174
|
+
const columns = columnsRaw.map((c) => ({
|
|
175
|
+
name: String(c.name ?? c.field_name ?? ""),
|
|
176
|
+
type: String(c.type ?? c.field_type ?? "varchar"),
|
|
177
|
+
comment: typeof c.comment === "string" ? c.comment : undefined,
|
|
178
|
+
}));
|
|
179
|
+
tables.push({ name: tableName, columns });
|
|
180
|
+
}
|
|
181
|
+
return JSON.stringify(tables);
|
|
182
|
+
}
|
|
183
|
+
export async function scanMetadata(options) {
|
|
184
|
+
const { baseUrl, accessToken, id, dsType = "mysql", businessDomain = "bd_public", } = options;
|
|
185
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
186
|
+
const scanUrl = `${base}/api/data-connection/v1/metadata/scan`;
|
|
187
|
+
const statusUrl = (taskId) => `${base}/api/data-connection/v1/metadata/scan/${taskId}`;
|
|
188
|
+
const scanBody = JSON.stringify({
|
|
189
|
+
scan_name: `sdk_scan_${id.slice(0, 8)}`,
|
|
190
|
+
type: 0,
|
|
191
|
+
ds_info: { ds_id: id, ds_type: dsType },
|
|
192
|
+
use_default_template: true,
|
|
193
|
+
use_multi_threads: true,
|
|
194
|
+
status: "open",
|
|
195
|
+
});
|
|
196
|
+
const scanResponse = await fetch(scanUrl, {
|
|
197
|
+
method: "POST",
|
|
198
|
+
headers: {
|
|
199
|
+
...buildHeaders(accessToken, businessDomain),
|
|
200
|
+
"content-type": "application/json",
|
|
201
|
+
},
|
|
202
|
+
body: scanBody,
|
|
203
|
+
});
|
|
204
|
+
const scanResult = await scanResponse.json();
|
|
205
|
+
const taskId = scanResult.id ?? "";
|
|
206
|
+
for (let i = 0; i < 30; i += 1) {
|
|
207
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
208
|
+
const statusResponse = await fetch(statusUrl(taskId), {
|
|
209
|
+
method: "GET",
|
|
210
|
+
headers: buildHeaders(accessToken, businessDomain),
|
|
211
|
+
});
|
|
212
|
+
const statusData = (await statusResponse.json());
|
|
213
|
+
if (statusData.status === "success" || statusData.status === "fail") {
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return taskId;
|
|
218
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface CreateDataViewOptions {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
accessToken: string;
|
|
4
|
+
name: string;
|
|
5
|
+
datasourceId: string;
|
|
6
|
+
table: string;
|
|
7
|
+
fields?: Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
type: string;
|
|
10
|
+
}>;
|
|
11
|
+
businessDomain?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function createDataView(options: CreateDataViewOptions): Promise<string>;
|
|
14
|
+
export interface GetDataViewOptions {
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
accessToken: string;
|
|
17
|
+
id: string;
|
|
18
|
+
businessDomain?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function getDataView(options: GetDataViewOptions): Promise<string>;
|