@axiom-lattice/examples-deep_research 1.0.27 → 1.0.28
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/.env +4 -4
- package/.turbo/turbo-build.log +5 -5
- package/CHANGELOG.md +11 -0
- package/dist/index.js +40 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/src/agents/data_agent/skills/business-analytics/README.md +121 -0
- package/src/agents/data_agent/skills/business-analytics/SKILL.md +187 -108
- package/src/agents/data_agent/skills/business-analytics/examples.md +295 -0
- package/src/agents/data_agent/skills/business-analytics/reference.md +240 -0
- package/src/agents/data_agent/skills/business-analytics/resources/data/sample.json +66 -0
- package/src/agents/data_agent/skills/business-analytics/resources/prompts/analyze.txt +128 -0
- package/src/agents/data_agent/skills/business-analytics/resources/templates/report-template.md +260 -0
- package/src/agents/data_agent/skills/chart-markdown/SKILL.md +91 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/best-practices/README.md +16 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/best-practices/data-patterns.md +14 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/best-practices/finance.md +7 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/best-practices/formatting.md +14 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/best-practices/hr-people.md +7 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/best-practices/marketing-growth.md +7 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/best-practices/operations-supply-chain.md +7 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/best-practices/sales-retail.md +8 -0
- package/src/agents/data_agent/skills/chart-markdown/resources/examples.md +80 -0
- package/src/agents/data_agent/skills/metrics-query/SKILL.md +296 -0
- package/src/index-with-auth.ts +122 -0
- package/src/index.ts +55 -1
- package/src/agents/data_agent/skills/generate-chart-md/SKILL.md +0 -176
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import dotenv from "dotenv";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { LatticeGateway } from "@axiom-lattice/gateway";
|
|
4
|
+
import {
|
|
5
|
+
storeLatticeManager,
|
|
6
|
+
registerStoreLattice,
|
|
7
|
+
} from "@axiom-lattice/core";
|
|
8
|
+
import { LoggerConfig, LoggerType } from "@axiom-lattice/protocols";
|
|
9
|
+
import {
|
|
10
|
+
PostgreSQLThreadStore,
|
|
11
|
+
PostgreSQLDatabaseConfigStore,
|
|
12
|
+
PostgreSQLWorkspaceStore,
|
|
13
|
+
PostgreSQLProjectStore,
|
|
14
|
+
PostgreSQLUserStore,
|
|
15
|
+
PostgreSQLTenantStore,
|
|
16
|
+
} from "@axiom-lattice/pg-stores";
|
|
17
|
+
import "./agents";
|
|
18
|
+
|
|
19
|
+
// Load environment variables
|
|
20
|
+
dotenv.config({ path: path.resolve(__dirname, "../.env") });
|
|
21
|
+
|
|
22
|
+
console.log(`
|
|
23
|
+
╔════════════════════════════════════════════════╗
|
|
24
|
+
║ Lattice Deep Research Server ║
|
|
25
|
+
║ With Multi-Tenant Auth Support ║
|
|
26
|
+
╚════════════════════════════════════════════════╝
|
|
27
|
+
`);
|
|
28
|
+
|
|
29
|
+
// Auth Configuration
|
|
30
|
+
const AUTH_CONFIG = {
|
|
31
|
+
// Auto approve new user registrations (true = no admin approval needed)
|
|
32
|
+
autoApproveUsers: process.env.AUTO_APPROVE_USERS !== "false",
|
|
33
|
+
|
|
34
|
+
// Allow users to create new tenants during registration
|
|
35
|
+
allowTenantRegistration: process.env.ALLOW_TENANT_REGISTRATION !== "false",
|
|
36
|
+
|
|
37
|
+
// JWT secret for token signing (change in production!)
|
|
38
|
+
jwtSecret: process.env.JWT_SECRET || "your-secret-key-change-in-production",
|
|
39
|
+
|
|
40
|
+
// Token expiration in seconds (default: 24 hours)
|
|
41
|
+
tokenExpiration: parseInt(process.env.TOKEN_EXPIRATION || "86400", 10),
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
console.log("Auth Configuration:");
|
|
45
|
+
console.log(` - Auto Approve Users: ${AUTH_CONFIG.autoApproveUsers}`);
|
|
46
|
+
console.log(` - Allow Tenant Registration: ${AUTH_CONFIG.allowTenantRegistration}`);
|
|
47
|
+
console.log(` - Token Expiration: ${AUTH_CONFIG.tokenExpiration}s`);
|
|
48
|
+
|
|
49
|
+
// Initialize PostgreSQL Stores with multi-tenant support
|
|
50
|
+
const dbConfig = process.env.DATABASE_URL || "";
|
|
51
|
+
|
|
52
|
+
// 1. User Store (NEW - for authentication)
|
|
53
|
+
const userStore = new PostgreSQLUserStore({
|
|
54
|
+
poolConfig: dbConfig,
|
|
55
|
+
autoMigrate: true,
|
|
56
|
+
});
|
|
57
|
+
storeLatticeManager.removeLattice("default", "user");
|
|
58
|
+
registerStoreLattice("default", "user", userStore);
|
|
59
|
+
console.log("✓ PostgreSQL UserStore initialized");
|
|
60
|
+
|
|
61
|
+
// 2. Tenant Store (NEW - for multi-tenancy)
|
|
62
|
+
const tenantStore = new PostgreSQLTenantStore({
|
|
63
|
+
poolConfig: dbConfig,
|
|
64
|
+
autoMigrate: true,
|
|
65
|
+
});
|
|
66
|
+
storeLatticeManager.removeLattice("default", "tenant");
|
|
67
|
+
registerStoreLattice("default", "tenant", tenantStore);
|
|
68
|
+
console.log("✓ PostgreSQL TenantStore initialized");
|
|
69
|
+
|
|
70
|
+
// 3. Existing stores...
|
|
71
|
+
const threadStore = new PostgreSQLThreadStore({ poolConfig: dbConfig });
|
|
72
|
+
storeLatticeManager.removeLattice("default", "thread");
|
|
73
|
+
registerStoreLattice("default", "thread", threadStore);
|
|
74
|
+
|
|
75
|
+
const databaseConfigStore = new PostgreSQLDatabaseConfigStore({
|
|
76
|
+
poolConfig: dbConfig,
|
|
77
|
+
autoMigrate: true,
|
|
78
|
+
});
|
|
79
|
+
storeLatticeManager.removeLattice("default", "database");
|
|
80
|
+
registerStoreLattice("default", "database", databaseConfigStore);
|
|
81
|
+
|
|
82
|
+
const workspaceStore = new PostgreSQLWorkspaceStore({
|
|
83
|
+
poolConfig: dbConfig,
|
|
84
|
+
autoMigrate: true,
|
|
85
|
+
});
|
|
86
|
+
storeLatticeManager.removeLattice("default", "workspace");
|
|
87
|
+
registerStoreLattice("default", "workspace", workspaceStore);
|
|
88
|
+
|
|
89
|
+
const projectStore = new PostgreSQLProjectStore({
|
|
90
|
+
poolConfig: dbConfig,
|
|
91
|
+
autoMigrate: true,
|
|
92
|
+
});
|
|
93
|
+
storeLatticeManager.removeLattice("default", "project");
|
|
94
|
+
registerStoreLattice("default", "project", projectStore);
|
|
95
|
+
|
|
96
|
+
// Parse port
|
|
97
|
+
const port = parseInt(process.env.PORT || "4001", 10);
|
|
98
|
+
|
|
99
|
+
// Logger config
|
|
100
|
+
const loggerConfig: LoggerConfig = {
|
|
101
|
+
name: "default",
|
|
102
|
+
description: "Default logger for lattice-gateway",
|
|
103
|
+
type: LoggerType.PINO,
|
|
104
|
+
serviceName: "lattice/deep_research",
|
|
105
|
+
loggerName: "lattice/deep_research",
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Start server with auth routes enabled
|
|
109
|
+
LatticeGateway.startAsHttpEndpoint({
|
|
110
|
+
port,
|
|
111
|
+
queueServiceConfig: { type: "memory", defaultStartPollingQueue: true },
|
|
112
|
+
loggerConfig,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
console.log(`\n🚀 Server running at http://localhost:${port}`);
|
|
116
|
+
console.log("\nAuth Endpoints:");
|
|
117
|
+
console.log(` POST http://localhost:${port}/api/auth/register`);
|
|
118
|
+
console.log(` POST http://localhost:${port}/api/auth/login`);
|
|
119
|
+
console.log(` GET http://localhost:${port}/api/auth/pending`);
|
|
120
|
+
console.log(` POST http://localhost:${port}/api/auth/approve`);
|
|
121
|
+
console.log(` GET http://localhost:${port}/api/tenants`);
|
|
122
|
+
console.log(` GET http://localhost:${port}/api/users`);
|
package/src/index.ts
CHANGED
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
registerStoreLattice,
|
|
16
16
|
sandboxLatticeManager,
|
|
17
17
|
sqlDatabaseManager,
|
|
18
|
+
metricsServerManager,
|
|
18
19
|
} from "@axiom-lattice/core";
|
|
19
20
|
import { McpServerConfig } from "@axiom-lattice/protocols";
|
|
20
21
|
import "./agents";
|
|
@@ -25,7 +26,7 @@ import {
|
|
|
25
26
|
LoggerType,
|
|
26
27
|
ScheduleType,
|
|
27
28
|
} from "@axiom-lattice/protocols";
|
|
28
|
-
import { PostgreSQLAssistantStore, PostgreSQLScheduleStorage, PostgreSQLThreadStore, PostgreSQLDatabaseConfigStore, PostgreSQLWorkspaceStore, PostgreSQLProjectStore } from "@axiom-lattice/pg-stores";
|
|
29
|
+
import { PostgreSQLAssistantStore, PostgreSQLScheduleStorage, PostgreSQLThreadStore, PostgreSQLDatabaseConfigStore, PostgreSQLMetricsServerConfigStore, PostgreSQLWorkspaceStore, PostgreSQLProjectStore, PostgreSQLUserStore, PostgreSQLTenantStore, PostgreSQLUserTenantLinkStore } from "@axiom-lattice/pg-stores";
|
|
29
30
|
|
|
30
31
|
// 在文件开头添加
|
|
31
32
|
const fs = require("fs");
|
|
@@ -69,6 +70,19 @@ registerStoreLattice("default", "database", databaseConfigStore);
|
|
|
69
70
|
sqlDatabaseManager.loadAllConfigsFromStore(databaseConfigStore)
|
|
70
71
|
console.log("PostgreSQL DatabaseConfigStore initialized with auto-migration");
|
|
71
72
|
|
|
73
|
+
// Initialize and register PostgreSQL MetricsServerConfigStore
|
|
74
|
+
// This stores metrics server configurations with apiKey and password encryption
|
|
75
|
+
const metricsConfigStore = new PostgreSQLMetricsServerConfigStore({
|
|
76
|
+
poolConfig: process.env.DATABASE_URL || "",
|
|
77
|
+
autoMigrate: true,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Register metricsConfigStore to replace the default in-memory store
|
|
81
|
+
storeLatticeManager.removeLattice("default", "metrics");
|
|
82
|
+
registerStoreLattice("default", "metrics", metricsConfigStore);
|
|
83
|
+
metricsServerManager.loadAllConfigsFromStore(metricsConfigStore)
|
|
84
|
+
console.log("PostgreSQL MetricsServerConfigStore initialized with auto-migration");
|
|
85
|
+
|
|
72
86
|
// Initialize and register PostgreSQL WorkspaceStore
|
|
73
87
|
const workspaceStore = new PostgreSQLWorkspaceStore({
|
|
74
88
|
poolConfig: process.env.DATABASE_URL || "",
|
|
@@ -91,6 +105,46 @@ storeLatticeManager.removeLattice("default", "project");
|
|
|
91
105
|
registerStoreLattice("default", "project", projectStore);
|
|
92
106
|
console.log("PostgreSQL ProjectStore initialized with auto-migration");
|
|
93
107
|
|
|
108
|
+
// Initialize and register PostgreSQL UserStore (for authentication)
|
|
109
|
+
const userStore = new PostgreSQLUserStore({
|
|
110
|
+
poolConfig: process.env.DATABASE_URL || "",
|
|
111
|
+
autoMigrate: true,
|
|
112
|
+
});
|
|
113
|
+
storeLatticeManager.removeLattice("default", "user");
|
|
114
|
+
registerStoreLattice("default", "user", userStore);
|
|
115
|
+
console.log("PostgreSQL UserStore initialized with auto-migration");
|
|
116
|
+
|
|
117
|
+
// Initialize and register PostgreSQL TenantStore (for multi-tenancy)
|
|
118
|
+
const tenantStore = new PostgreSQLTenantStore({
|
|
119
|
+
poolConfig: process.env.DATABASE_URL || "",
|
|
120
|
+
autoMigrate: true,
|
|
121
|
+
});
|
|
122
|
+
storeLatticeManager.removeLattice("default", "tenant");
|
|
123
|
+
registerStoreLattice("default", "tenant", tenantStore);
|
|
124
|
+
console.log("PostgreSQL TenantStore initialized with auto-migration");
|
|
125
|
+
|
|
126
|
+
// Initialize and register PostgreSQL UserTenantLinkStore (for user-tenant relationships)
|
|
127
|
+
const userTenantLinkStore = new PostgreSQLUserTenantLinkStore({
|
|
128
|
+
poolConfig: process.env.DATABASE_URL || "",
|
|
129
|
+
autoMigrate: true,
|
|
130
|
+
});
|
|
131
|
+
storeLatticeManager.removeLattice("default", "userTenantLink");
|
|
132
|
+
registerStoreLattice("default", "userTenantLink", userTenantLinkStore);
|
|
133
|
+
console.log("PostgreSQL UserTenantLinkStore initialized with auto-migration");
|
|
134
|
+
|
|
135
|
+
// Auth configuration
|
|
136
|
+
const AUTH_CONFIG = {
|
|
137
|
+
autoApproveUsers: process.env.AUTO_APPROVE_USERS !== "false",
|
|
138
|
+
allowTenantRegistration: process.env.ALLOW_TENANT_REGISTRATION !== "false",
|
|
139
|
+
jwtSecret: process.env.JWT_SECRET || "your-secret-key-change-in-production",
|
|
140
|
+
tokenExpiration: parseInt(process.env.TOKEN_EXPIRATION || "86400", 10),
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
console.log("Auth Configuration:");
|
|
144
|
+
console.log(` - Auto Approve Users: ${AUTH_CONFIG.autoApproveUsers}`);
|
|
145
|
+
console.log(` - Allow Tenant Registration: ${AUTH_CONFIG.allowTenantRegistration}`);
|
|
146
|
+
console.log(` - Token Expiration: ${AUTH_CONFIG.tokenExpiration}s`);
|
|
147
|
+
|
|
94
148
|
// Parse command line arguments for port configuration
|
|
95
149
|
function parsePort(): number {
|
|
96
150
|
const args = process.argv.slice(2);
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: generate-chart-md
|
|
3
|
-
description: Generate chart markdown content fragments (with ECharts config) for analysis results. Use when output should include bar, line, pie, scatter, or heatmap charts as embeddable markdown snippets.
|
|
4
|
-
metadata:
|
|
5
|
-
category: generate-report
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 图表类型选择指南
|
|
9
|
-
|
|
10
|
-
根据数据特征和业务问题选择最合适的图表类型:
|
|
11
|
-
|
|
12
|
-
- **柱状图** (bar): 比较类别或时间周期
|
|
13
|
-
- 使用 category xAxis,value yAxis
|
|
14
|
-
- 多系列用于分组/堆叠柱状图
|
|
15
|
-
- **折线图** (line): 展示时间趋势
|
|
16
|
-
- 使用 category/time xAxis,value yAxis
|
|
17
|
-
- 多系列展示多个指标
|
|
18
|
-
- **饼图** (pie): 展示构成/百分比
|
|
19
|
-
- 无需 xAxis/yAxis
|
|
20
|
-
- 数据格式: [{value: number, name: string}, ...]
|
|
21
|
-
- 使用 radius: ["40%", "70%"] 创建环形图
|
|
22
|
-
- **散点图** (scatter): 相关性分析
|
|
23
|
-
- 使用 value xAxis 和 value yAxis
|
|
24
|
-
- 数据格式: [[x, y], [x, y], ...]
|
|
25
|
-
- **热力图** (heatmap): 多维数据
|
|
26
|
-
- 需要 category xAxis 和 yAxis
|
|
27
|
-
- 数据格式: [[xIndex, yIndex, value], ...]
|
|
28
|
-
|
|
29
|
-
## ECharts 配置要求
|
|
30
|
-
|
|
31
|
-
生成完整的 ECharts 配置,必须包含:
|
|
32
|
-
|
|
33
|
-
\`\`\`chart
|
|
34
|
-
{
|
|
35
|
-
"table": [...], // 原始数据表格
|
|
36
|
-
"echarts": {
|
|
37
|
-
"title": {"text": "清晰的图表标题"},
|
|
38
|
-
"tooltip": {
|
|
39
|
-
"trigger": "axis", // bar/line 用 "axis", pie/scatter 用 "item"
|
|
40
|
-
"formatter": "..." // 可选:自定义格式化
|
|
41
|
-
},
|
|
42
|
-
"legend": {...}, // 多系列时必需
|
|
43
|
-
"xAxis": {
|
|
44
|
-
"type": "category", // 或 "time", "value"
|
|
45
|
-
"name": "X 轴名称",
|
|
46
|
-
"data": [...] // category 类型时必需
|
|
47
|
-
},
|
|
48
|
-
"yAxis": {
|
|
49
|
-
"type": "value",
|
|
50
|
-
"name": "Y 轴名称"
|
|
51
|
-
},
|
|
52
|
-
"series": [{
|
|
53
|
-
"type": "bar|line|pie|scatter|heatmap",
|
|
54
|
-
"name": "系列名称",
|
|
55
|
-
"data": [...],
|
|
56
|
-
"label": {...} // 可选:显示数值
|
|
57
|
-
}],
|
|
58
|
-
"grid": {...} // 可选:控制边距
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
\`\`\`
|
|
62
|
-
|
|
63
|
-
## 最佳实践
|
|
64
|
-
|
|
65
|
-
- 图表标题清晰描述业务问题
|
|
66
|
-
- 轴标签使用业务术语,而非技术字段名
|
|
67
|
-
- 数值格式化:百分比、货币、千分位
|
|
68
|
-
- 时间序列使用 "xAxis.type: 'time'" 并正确格式化日期
|
|
69
|
-
- 多系列时使用 legend 区分
|
|
70
|
-
- 重要数值在图表上直接标注(series.label)
|
|
71
|
-
|
|
72
|
-
## 使用场景
|
|
73
|
-
|
|
74
|
-
### 场景1:销售数据可视化
|
|
75
|
-
用户需要展示各区域销售额对比,或月度销售趋势。
|
|
76
|
-
|
|
77
|
-
### 场景2:财务指标展示
|
|
78
|
-
展示收入构成、成本结构或利润率变化趋势。
|
|
79
|
-
|
|
80
|
-
### 场景3:运营数据分析
|
|
81
|
-
展示用户增长、留存率、转化率等运营指标。
|
|
82
|
-
|
|
83
|
-
## 完整示例
|
|
84
|
-
|
|
85
|
-
### 示例1:柱状图 - 销售额对比
|
|
86
|
-
|
|
87
|
-
```chart
|
|
88
|
-
{
|
|
89
|
-
"table": [
|
|
90
|
-
{"region": "华北", "sales": 120},
|
|
91
|
-
{"region": "华东", "sales": 200},
|
|
92
|
-
{"region": "华南", "sales": 150}
|
|
93
|
-
],
|
|
94
|
-
"echarts": {
|
|
95
|
-
"title": {"text": "各区域销售额对比"},
|
|
96
|
-
"tooltip": {"trigger": "axis"},
|
|
97
|
-
"xAxis": {
|
|
98
|
-
"type": "category",
|
|
99
|
-
"data": ["华北", "华东", "华南"],
|
|
100
|
-
"name": "区域"
|
|
101
|
-
},
|
|
102
|
-
"yAxis": {
|
|
103
|
-
"type": "value",
|
|
104
|
-
"name": "销售额(万元)"
|
|
105
|
-
},
|
|
106
|
-
"series": [{
|
|
107
|
-
"type": "bar",
|
|
108
|
-
"data": [120, 200, 150],
|
|
109
|
-
"label": {"show": true, "position": "top"}
|
|
110
|
-
}]
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### 示例2:折线图 - 月度趋势
|
|
116
|
-
|
|
117
|
-
```chart
|
|
118
|
-
{
|
|
119
|
-
"table": [
|
|
120
|
-
{"month": "1月", "revenue": 100},
|
|
121
|
-
{"month": "2月", "revenue": 120},
|
|
122
|
-
{"month": "3月", "revenue": 150}
|
|
123
|
-
],
|
|
124
|
-
"echarts": {
|
|
125
|
-
"title": {"text": "月度收入趋势"},
|
|
126
|
-
"tooltip": {"trigger": "axis"},
|
|
127
|
-
"xAxis": {
|
|
128
|
-
"type": "category",
|
|
129
|
-
"data": ["1月", "2月", "3月"],
|
|
130
|
-
"name": "月份"
|
|
131
|
-
},
|
|
132
|
-
"yAxis": {
|
|
133
|
-
"type": "value",
|
|
134
|
-
"name": "收入(万元)"
|
|
135
|
-
},
|
|
136
|
-
"series": [{
|
|
137
|
-
"type": "line",
|
|
138
|
-
"data": [100, 120, 150],
|
|
139
|
-
"smooth": true,
|
|
140
|
-
"label": {"show": true}
|
|
141
|
-
}]
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### 示例3:饼图 - 收入构成
|
|
147
|
-
|
|
148
|
-
```chart
|
|
149
|
-
{
|
|
150
|
-
"table": [
|
|
151
|
-
{"category": "产品A", "value": 40},
|
|
152
|
-
{"category": "产品B", "value": 30},
|
|
153
|
-
{"category": "产品C", "value": 20},
|
|
154
|
-
{"category": "其他", "value": 10}
|
|
155
|
-
],
|
|
156
|
-
"echarts": {
|
|
157
|
-
"title": {"text": "收入构成分析"},
|
|
158
|
-
"tooltip": {"trigger": "item", "formatter": "{b}: {c} ({d}%)"},
|
|
159
|
-
"series": [{
|
|
160
|
-
"type": "pie",
|
|
161
|
-
"radius": ["40%", "70%"],
|
|
162
|
-
"data": [
|
|
163
|
-
{"value": 40, "name": "产品A"},
|
|
164
|
-
{"value": 30, "name": "产品B"},
|
|
165
|
-
{"value": 20, "name": "产品C"},
|
|
166
|
-
{"value": 10, "name": "其他"}
|
|
167
|
-
],
|
|
168
|
-
"label": {"show": true, "formatter": "{b}: {d}%"}
|
|
169
|
-
}]
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
## 输出格式
|
|
175
|
-
|
|
176
|
-
提供完整的 chart JSON 配置,可直接用于渲染。代码块语言标识必须为 `chart`。
|