coze-coding-dev-sdk 0.2.0 → 0.2.4
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/dist/cli/commands/db.d.ts +3 -0
- package/dist/cli/commands/db.d.ts.map +1 -0
- package/dist/cli/commands/db.js +91 -0
- package/dist/cli/commands/db.js.map +1 -0
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +2 -0
- package/dist/core/client.js.map +1 -1
- package/dist/core/exceptions.d.ts +9 -14
- package/dist/core/exceptions.d.ts.map +1 -1
- package/dist/core/exceptions.js +9 -18
- package/dist/core/exceptions.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -2
- package/dist/core/index.js.map +1 -1
- package/dist/database/client.d.ts +13 -0
- package/dist/database/client.d.ts.map +1 -0
- package/dist/database/client.js +142 -0
- package/dist/database/client.js.map +1 -0
- package/dist/database/index.d.ts +4 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +20 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/migration.d.ts +7 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +186 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/models.d.ts +26 -0
- package/dist/database/models.d.ts.map +1 -0
- package/dist/database/models.js +15 -0
- package/dist/database/models.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/client.d.ts.map +1 -1
- package/dist/llm/client.js +2 -0
- package/dist/llm/client.js.map +1 -1
- package/dist/s3/client.d.ts +66 -0
- package/dist/s3/client.d.ts.map +1 -0
- package/dist/s3/client.js +253 -0
- package/dist/s3/client.js.map +1 -0
- package/dist/s3/index.d.ts +3 -0
- package/dist/s3/index.d.ts.map +1 -0
- package/dist/s3/index.js +19 -0
- package/dist/s3/index.js.map +1 -0
- package/dist/s3/models.d.ts +23 -0
- package/dist/s3/models.d.ts.map +1 -0
- package/dist/s3/models.js +15 -0
- package/dist/s3/models.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/voice/asr.d.ts.map +1 -1
- package/dist/voice/asr.js +1 -1
- package/dist/voice/asr.js.map +1 -1
- package/dist/voice/tts.d.ts.map +1 -1
- package/dist/voice/tts.js +1 -1
- package/dist/voice/tts.js.map +1 -1
- package/package.json +16 -6
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database migration module
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.generateModels = generateModels;
|
|
40
|
+
exports.upgrade = upgrade;
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const models_1 = require("./models");
|
|
46
|
+
const client_1 = require("./client");
|
|
47
|
+
/**
|
|
48
|
+
* Fix Drizzle bug: introspect generates numbers beyond JS precision
|
|
49
|
+
* Replace .generatedByDefaultAsIdentity({...}) with .generatedByDefaultAsIdentity()
|
|
50
|
+
*/
|
|
51
|
+
function fixGeneratedIdentity(filePath) {
|
|
52
|
+
if (!fs.existsSync(filePath))
|
|
53
|
+
return;
|
|
54
|
+
let content = fs.readFileSync(filePath, 'utf-8');
|
|
55
|
+
const fixed = content.replace(/\.generatedByDefaultAsIdentity\(\{[^}]*\}\)/g, '.generatedByDefaultAsIdentity()');
|
|
56
|
+
if (fixed !== content) {
|
|
57
|
+
fs.writeFileSync(filePath, fixed);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function generateModels(options = {}) {
|
|
61
|
+
const { outputPath = models_1.DatabaseConfig.DEFAULT_SCHEMA_PATH, verbose = false, } = options;
|
|
62
|
+
(0, client_1.loadEnv)();
|
|
63
|
+
const dbUrl = (0, client_1.getDbUrl)();
|
|
64
|
+
const outputDir = path.dirname(outputPath);
|
|
65
|
+
if (outputDir && !fs.existsSync(outputDir)) {
|
|
66
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
// Use /tmp for drizzle-kit output
|
|
69
|
+
const tempOutDir = fs.mkdtempSync(path.join(os.tmpdir(), 'drizzle-'));
|
|
70
|
+
const tempConfigPath = path.join(os.tmpdir(), `drizzle.config.${Date.now()}.ts`);
|
|
71
|
+
const drizzleConfig = `
|
|
72
|
+
import { defineConfig } from 'drizzle-kit';
|
|
73
|
+
|
|
74
|
+
export default defineConfig({
|
|
75
|
+
dialect: 'postgresql',
|
|
76
|
+
out: '${tempOutDir}',
|
|
77
|
+
dbCredentials: {
|
|
78
|
+
url: '${dbUrl}',
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
`;
|
|
82
|
+
try {
|
|
83
|
+
fs.writeFileSync(tempConfigPath, drizzleConfig);
|
|
84
|
+
if (verbose) {
|
|
85
|
+
console.log('Introspecting database schema...');
|
|
86
|
+
}
|
|
87
|
+
const cmd = `npx drizzle-kit introspect --config=${tempConfigPath}`;
|
|
88
|
+
if (verbose) {
|
|
89
|
+
console.log(`Running: ${cmd}`);
|
|
90
|
+
}
|
|
91
|
+
(0, child_process_1.execSync)(cmd, {
|
|
92
|
+
encoding: 'utf-8',
|
|
93
|
+
stdio: verbose ? 'inherit' : 'pipe',
|
|
94
|
+
timeout: 60000,
|
|
95
|
+
});
|
|
96
|
+
// Fix Drizzle bug in generated schema
|
|
97
|
+
const generatedSchema = path.join(tempOutDir, 'schema.ts');
|
|
98
|
+
const generatedRelations = path.join(tempOutDir, 'relations.ts');
|
|
99
|
+
if (fs.existsSync(generatedSchema)) {
|
|
100
|
+
fixGeneratedIdentity(generatedSchema);
|
|
101
|
+
fs.copyFileSync(generatedSchema, outputPath);
|
|
102
|
+
if (verbose) {
|
|
103
|
+
console.log(`✓ Copied schema.ts to ${outputDir}/`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (fs.existsSync(generatedRelations)) {
|
|
107
|
+
const relationsPath = path.join(outputDir, 'relations.ts');
|
|
108
|
+
fs.copyFileSync(generatedRelations, relationsPath);
|
|
109
|
+
if (verbose) {
|
|
110
|
+
console.log(`✓ Copied relations.ts to ${outputDir}/`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Git add generated files
|
|
114
|
+
try {
|
|
115
|
+
(0, child_process_1.execSync)('git add -A', {
|
|
116
|
+
encoding: 'utf-8',
|
|
117
|
+
stdio: 'pipe',
|
|
118
|
+
cwd: process.cwd(),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Ignore git errors (might not be in a git repo)
|
|
123
|
+
}
|
|
124
|
+
if (verbose) {
|
|
125
|
+
console.log(`✓ Schema generated successfully`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
// Cleanup temp files
|
|
130
|
+
if (fs.existsSync(tempConfigPath)) {
|
|
131
|
+
fs.unlinkSync(tempConfigPath);
|
|
132
|
+
}
|
|
133
|
+
if (fs.existsSync(tempOutDir)) {
|
|
134
|
+
fs.rmSync(tempOutDir, { recursive: true });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function upgrade(options = {}) {
|
|
139
|
+
const { schemaPath = models_1.DatabaseConfig.DEFAULT_SCHEMA_PATH, projectPath = process.cwd(), verbose = false, } = options;
|
|
140
|
+
(0, client_1.loadEnv)();
|
|
141
|
+
const dbUrl = (0, client_1.getDbUrl)();
|
|
142
|
+
const fullSchemaPath = path.isAbsolute(schemaPath)
|
|
143
|
+
? schemaPath
|
|
144
|
+
: path.join(projectPath, schemaPath);
|
|
145
|
+
if (!fs.existsSync(fullSchemaPath)) {
|
|
146
|
+
throw new Error(`Schema file not found: ${fullSchemaPath}`);
|
|
147
|
+
}
|
|
148
|
+
const tempConfigPath = path.join(os.tmpdir(), `drizzle.config.${Date.now()}.ts`);
|
|
149
|
+
const drizzleConfig = `
|
|
150
|
+
import { defineConfig } from 'drizzle-kit';
|
|
151
|
+
|
|
152
|
+
export default defineConfig({
|
|
153
|
+
dialect: 'postgresql',
|
|
154
|
+
schema: '${fullSchemaPath}',
|
|
155
|
+
dbCredentials: {
|
|
156
|
+
url: '${dbUrl}',
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
`;
|
|
160
|
+
try {
|
|
161
|
+
fs.writeFileSync(tempConfigPath, drizzleConfig);
|
|
162
|
+
if (verbose) {
|
|
163
|
+
console.log('Pushing schema changes to database...');
|
|
164
|
+
}
|
|
165
|
+
// Use --force to skip confirmation
|
|
166
|
+
const cmd = `npx drizzle-kit push --force --config=${tempConfigPath}`;
|
|
167
|
+
if (verbose) {
|
|
168
|
+
console.log(`Running: ${cmd}`);
|
|
169
|
+
}
|
|
170
|
+
(0, child_process_1.execSync)(cmd, {
|
|
171
|
+
encoding: 'utf-8',
|
|
172
|
+
stdio: verbose ? 'inherit' : 'pipe',
|
|
173
|
+
timeout: 120000,
|
|
174
|
+
cwd: projectPath,
|
|
175
|
+
});
|
|
176
|
+
if (verbose) {
|
|
177
|
+
console.log('✅ Database migration completed successfully');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
if (fs.existsSync(tempConfigPath)) {
|
|
182
|
+
fs.unlinkSync(tempConfigPath);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/database/migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database module types
|
|
3
|
+
*/
|
|
4
|
+
export declare class DatabaseConfig {
|
|
5
|
+
static readonly MAX_CONNECTIONS = 100;
|
|
6
|
+
static readonly IDLE_TIMEOUT_MILLIS = 30000;
|
|
7
|
+
static readonly CONNECTION_TIMEOUT_MILLIS = 30000;
|
|
8
|
+
static readonly MAX_RETRY_TIME = 20000;
|
|
9
|
+
static readonly DEFAULT_SCHEMA_PATH = "src/storage/database/shared/schema.ts";
|
|
10
|
+
}
|
|
11
|
+
export interface DatabasePoolConfig {
|
|
12
|
+
connectionString?: string;
|
|
13
|
+
maxConnections?: number;
|
|
14
|
+
idleTimeoutMillis?: number;
|
|
15
|
+
connectionTimeoutMillis?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface UpgradeOptions {
|
|
18
|
+
schemaPath?: string;
|
|
19
|
+
projectPath?: string;
|
|
20
|
+
verbose?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface GenerateModelsOptions {
|
|
23
|
+
outputPath?: string;
|
|
24
|
+
verbose?: boolean;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/database/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,cAAc;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,OAAO;IACtC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,SAAS;IAC5C,MAAM,CAAC,QAAQ,CAAC,yBAAyB,SAAS;IAClD,MAAM,CAAC,QAAQ,CAAC,cAAc,SAAS;IACvC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,2CAA2C;CAC/E;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database module types
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DatabaseConfig = void 0;
|
|
7
|
+
class DatabaseConfig {
|
|
8
|
+
}
|
|
9
|
+
exports.DatabaseConfig = DatabaseConfig;
|
|
10
|
+
DatabaseConfig.MAX_CONNECTIONS = 100;
|
|
11
|
+
DatabaseConfig.IDLE_TIMEOUT_MILLIS = 30000;
|
|
12
|
+
DatabaseConfig.CONNECTION_TIMEOUT_MILLIS = 30000;
|
|
13
|
+
DatabaseConfig.MAX_RETRY_TIME = 20000;
|
|
14
|
+
DatabaseConfig.DEFAULT_SCHEMA_PATH = 'src/storage/database/shared/schema.ts';
|
|
15
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/database/models.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAa,cAAc;;AAA3B,wCAMC;AALiB,8BAAe,GAAG,GAAG,CAAC;AACtB,kCAAmB,GAAG,KAAK,CAAC;AAC5B,wCAAyB,GAAG,KAAK,CAAC;AAClC,6BAAc,GAAG,KAAK,CAAC;AACvB,kCAAmB,GAAG,uCAAuC,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,MAAM,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,10 +14,15 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.VERSION = void 0;
|
|
17
18
|
__exportStar(require("./core"), exports);
|
|
18
19
|
__exportStar(require("./image"), exports);
|
|
19
20
|
__exportStar(require("./search"), exports);
|
|
20
21
|
__exportStar(require("./voice"), exports);
|
|
21
22
|
__exportStar(require("./video"), exports);
|
|
22
23
|
__exportStar(require("./llm"), exports);
|
|
24
|
+
__exportStar(require("./database"), exports);
|
|
25
|
+
__exportStar(require("./s3"), exports);
|
|
26
|
+
var version_1 = require("./version");
|
|
27
|
+
Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_1.VERSION; } });
|
|
23
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,0CAAwB;AACxB,2CAAyB;AACzB,0CAAwB;AACxB,0CAAwB;AACxB,wCAAsB;AACtB,6CAA2B;AAC3B,uCAAqB;AACrB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA"}
|
package/dist/llm/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/llm/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAuD,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/G,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAe,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/llm/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAuD,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/G,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAe,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGxE,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B,OAAO,CAAC,SAAS;IAwCjB,OAAO,CAAC,eAAe;IAehB,MAAM,CACX,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,GAAE,SAAc,EACzB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC;IAW1C,MAAM,CACV,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,GAAE,SAAc,EACzB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,WAAW,CAAC;CAexB"}
|
package/dist/llm/client.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.LLMClient = void 0;
|
|
|
4
4
|
const openai_1 = require("@langchain/openai");
|
|
5
5
|
const messages_1 = require("@langchain/core/messages");
|
|
6
6
|
const models_1 = require("./models");
|
|
7
|
+
const version_1 = require("../version");
|
|
7
8
|
class LLMClient {
|
|
8
9
|
constructor(config) {
|
|
9
10
|
this.config = config;
|
|
@@ -18,6 +19,7 @@ class LLMClient {
|
|
|
18
19
|
}
|
|
19
20
|
const headers = {
|
|
20
21
|
'Authorization': `Bearer ${this.config.apiKey}`,
|
|
22
|
+
'X-Client-Sdk': `coze-coding-dev-sdk-typescript/${version_1.VERSION}`,
|
|
21
23
|
...extraHeaders,
|
|
22
24
|
};
|
|
23
25
|
if (previousResponseId) {
|
package/dist/llm/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/llm/client.ts"],"names":[],"mappings":";;;AAAA,8CAA+C;AAC/C,uDAA+G;AAE/G,qCAAwE;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/llm/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Storage client module
|
|
3
|
+
*/
|
|
4
|
+
import { Readable } from 'stream';
|
|
5
|
+
import { S3StorageConfig, ListFilesResult } from './models';
|
|
6
|
+
export declare class S3Storage {
|
|
7
|
+
private endpointUrl;
|
|
8
|
+
private accessKey;
|
|
9
|
+
private secretKey;
|
|
10
|
+
private bucketName;
|
|
11
|
+
private region;
|
|
12
|
+
private client;
|
|
13
|
+
constructor(config?: S3StorageConfig);
|
|
14
|
+
private getClient;
|
|
15
|
+
private generateObjectKey;
|
|
16
|
+
private resolveBucket;
|
|
17
|
+
private validateFileName;
|
|
18
|
+
uploadFile(options: {
|
|
19
|
+
fileContent: Buffer;
|
|
20
|
+
fileName: string;
|
|
21
|
+
contentType?: string;
|
|
22
|
+
bucket?: string;
|
|
23
|
+
}): Promise<string>;
|
|
24
|
+
readFile(options: {
|
|
25
|
+
fileKey: string;
|
|
26
|
+
bucket?: string;
|
|
27
|
+
}): Promise<Buffer>;
|
|
28
|
+
deleteFile(options: {
|
|
29
|
+
fileKey: string;
|
|
30
|
+
bucket?: string;
|
|
31
|
+
}): Promise<boolean>;
|
|
32
|
+
fileExists(options: {
|
|
33
|
+
fileKey: string;
|
|
34
|
+
bucket?: string;
|
|
35
|
+
}): Promise<boolean>;
|
|
36
|
+
listFiles(options?: {
|
|
37
|
+
prefix?: string;
|
|
38
|
+
bucket?: string;
|
|
39
|
+
maxKeys?: number;
|
|
40
|
+
continuationToken?: string;
|
|
41
|
+
}): Promise<ListFilesResult>;
|
|
42
|
+
generatePresignedUrl(options: {
|
|
43
|
+
key: string;
|
|
44
|
+
bucket?: string;
|
|
45
|
+
expireTime?: number;
|
|
46
|
+
}): Promise<string>;
|
|
47
|
+
streamUploadFile(options: {
|
|
48
|
+
stream: Readable;
|
|
49
|
+
fileName: string;
|
|
50
|
+
contentType?: string;
|
|
51
|
+
bucket?: string;
|
|
52
|
+
}): Promise<string>;
|
|
53
|
+
uploadFromUrl(options: {
|
|
54
|
+
url: string;
|
|
55
|
+
bucket?: string;
|
|
56
|
+
timeout?: number;
|
|
57
|
+
}): Promise<string>;
|
|
58
|
+
chunkUploadFile(options: {
|
|
59
|
+
chunks: AsyncIterable<Buffer>;
|
|
60
|
+
fileName: string;
|
|
61
|
+
contentType?: string;
|
|
62
|
+
bucket?: string;
|
|
63
|
+
}): Promise<string>;
|
|
64
|
+
}
|
|
65
|
+
export default S3Storage;
|
|
66
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/s3/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,OAAO,EAAE,eAAe,EAAY,eAAe,EAAwB,MAAM,UAAU,CAAC;AAM5F,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAyB;gBAE3B,MAAM,GAAE,eAAoB;IAQxC,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAclB,UAAU,CAAC,OAAO,EAAE;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBb,QAAQ,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBxE,UAAU,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAY3E,UAAU,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB3E,SAAS,CAAC,OAAO,GAAE;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,eAAe,CAAC;IA4B3B,oBAAoB,CAAC,OAAO,EAAE;QAClC,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDb,gBAAgB,CAAC,OAAO,EAAE;QAC9B,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBb,aAAa,CAAC,OAAO,EAAE;QAC3B,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBb,eAAe,CAAC,OAAO,EAAE;QAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,MAAM,CAAC;CAsBpB;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* S3 Storage client module
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.S3Storage = void 0;
|
|
10
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
11
|
+
const lib_storage_1 = require("@aws-sdk/lib-storage");
|
|
12
|
+
const stream_1 = require("stream");
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
const models_1 = require("./models");
|
|
16
|
+
function getStorageToken() {
|
|
17
|
+
return process.env.COZE_WORKLOAD_IDENTITY_API_KEY || null;
|
|
18
|
+
}
|
|
19
|
+
class S3Storage {
|
|
20
|
+
constructor(config = {}) {
|
|
21
|
+
this.client = null;
|
|
22
|
+
this.endpointUrl = process.env.COZE_BUCKET_ENDPOINT_URL || config.endpointUrl || '';
|
|
23
|
+
this.accessKey = config.accessKey || '';
|
|
24
|
+
this.secretKey = config.secretKey || '';
|
|
25
|
+
this.bucketName = process.env.COZE_BUCKET_NAME || config.bucketName || '';
|
|
26
|
+
this.region = config.region || models_1.S3Config.DEFAULT_REGION;
|
|
27
|
+
}
|
|
28
|
+
getClient() {
|
|
29
|
+
if (!this.client) {
|
|
30
|
+
if (!this.endpointUrl) {
|
|
31
|
+
throw new Error('Storage endpoint not configured: Set COZE_BUCKET_ENDPOINT_URL');
|
|
32
|
+
}
|
|
33
|
+
this.client = new client_s3_1.S3Client({
|
|
34
|
+
endpoint: this.endpointUrl,
|
|
35
|
+
region: this.region,
|
|
36
|
+
credentials: {
|
|
37
|
+
accessKeyId: this.accessKey,
|
|
38
|
+
secretAccessKey: this.secretKey,
|
|
39
|
+
},
|
|
40
|
+
forcePathStyle: true,
|
|
41
|
+
});
|
|
42
|
+
this.client.middlewareStack.add((next) => async (args) => {
|
|
43
|
+
const token = getStorageToken();
|
|
44
|
+
if (token && args.request?.headers) {
|
|
45
|
+
args.request.headers['x-storage-token'] = token;
|
|
46
|
+
}
|
|
47
|
+
return next(args);
|
|
48
|
+
}, { step: 'build', name: 'injectStorageToken' });
|
|
49
|
+
}
|
|
50
|
+
return this.client;
|
|
51
|
+
}
|
|
52
|
+
generateObjectKey(originalName) {
|
|
53
|
+
const ext = path_1.default.extname(originalName).toLowerCase();
|
|
54
|
+
const stem = path_1.default.basename(originalName, ext);
|
|
55
|
+
const uniq = (0, crypto_1.randomUUID)().replace(/-/g, '').slice(0, 8);
|
|
56
|
+
return path_1.default.join(path_1.default.dirname(originalName), `${stem}_${uniq}${ext}`);
|
|
57
|
+
}
|
|
58
|
+
resolveBucket(bucket) {
|
|
59
|
+
const targetBucket = bucket || process.env.COZE_BUCKET_NAME || this.bucketName;
|
|
60
|
+
if (!targetBucket) {
|
|
61
|
+
throw new Error('Bucket not configured: Provide bucket or set COZE_BUCKET_NAME');
|
|
62
|
+
}
|
|
63
|
+
return targetBucket;
|
|
64
|
+
}
|
|
65
|
+
validateFileName(name) {
|
|
66
|
+
const msg = 'Invalid file name: must be 1-1024 bytes, only letters/numbers/._-/, no spaces or special chars, not start/end with /, no //';
|
|
67
|
+
if (!name || !name.trim())
|
|
68
|
+
throw new Error(msg + ' (empty)');
|
|
69
|
+
if (Buffer.byteLength(name, 'utf-8') > 1024)
|
|
70
|
+
throw new Error(msg + ' (>1024 bytes)');
|
|
71
|
+
if (name.startsWith('/') || name.endsWith('/'))
|
|
72
|
+
throw new Error(msg + ' (starts/ends with /)');
|
|
73
|
+
if (name.includes('//'))
|
|
74
|
+
throw new Error(msg + ' (contains //)');
|
|
75
|
+
if (!models_1.FILE_NAME_ALLOWED_RE.test(name)) {
|
|
76
|
+
const bad = name.match(/[^A-Za-z0-9._\-/]/);
|
|
77
|
+
throw new Error(msg + ` (invalid char: ${bad?.[0]})`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async uploadFile(options) {
|
|
81
|
+
const { fileContent, fileName, contentType = 'application/octet-stream', bucket } = options;
|
|
82
|
+
this.validateFileName(fileName);
|
|
83
|
+
const client = this.getClient();
|
|
84
|
+
const objectKey = this.generateObjectKey(fileName);
|
|
85
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
86
|
+
await client.send(new client_s3_1.PutObjectCommand({
|
|
87
|
+
Bucket: targetBucket,
|
|
88
|
+
Key: objectKey,
|
|
89
|
+
Body: fileContent,
|
|
90
|
+
ContentType: contentType,
|
|
91
|
+
}));
|
|
92
|
+
return objectKey;
|
|
93
|
+
}
|
|
94
|
+
async readFile(options) {
|
|
95
|
+
const { fileKey, bucket } = options;
|
|
96
|
+
const client = this.getClient();
|
|
97
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
98
|
+
const response = await client.send(new client_s3_1.GetObjectCommand({ Bucket: targetBucket, Key: fileKey }));
|
|
99
|
+
if (!response.Body) {
|
|
100
|
+
throw new Error('S3 GetObject returned no Body');
|
|
101
|
+
}
|
|
102
|
+
const chunks = [];
|
|
103
|
+
for await (const chunk of response.Body) {
|
|
104
|
+
chunks.push(Buffer.from(chunk));
|
|
105
|
+
}
|
|
106
|
+
return Buffer.concat(chunks);
|
|
107
|
+
}
|
|
108
|
+
async deleteFile(options) {
|
|
109
|
+
const { fileKey, bucket } = options;
|
|
110
|
+
const client = this.getClient();
|
|
111
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
112
|
+
await client.send(new client_s3_1.DeleteObjectCommand({ Bucket: targetBucket, Key: fileKey }));
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
async fileExists(options) {
|
|
116
|
+
const { fileKey, bucket } = options;
|
|
117
|
+
const client = this.getClient();
|
|
118
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
119
|
+
try {
|
|
120
|
+
await client.send(new client_s3_1.HeadObjectCommand({ Bucket: targetBucket, Key: fileKey }));
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
if (e.name === 'NotFound' || e.$metadata?.httpStatusCode === 404) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
console.error('Error checking file existence:', e);
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async listFiles(options = {}) {
|
|
132
|
+
const { prefix, bucket, maxKeys = models_1.S3Config.DEFAULT_MAX_KEYS, continuationToken } = options;
|
|
133
|
+
if (maxKeys <= 0 || maxKeys > 1000) {
|
|
134
|
+
throw new Error('maxKeys must be between 1 and 1000');
|
|
135
|
+
}
|
|
136
|
+
const client = this.getClient();
|
|
137
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
138
|
+
const response = await client.send(new client_s3_1.ListObjectsV2Command({
|
|
139
|
+
Bucket: targetBucket,
|
|
140
|
+
MaxKeys: maxKeys,
|
|
141
|
+
Prefix: prefix,
|
|
142
|
+
ContinuationToken: continuationToken,
|
|
143
|
+
}));
|
|
144
|
+
const keys = (response.Contents || []).filter((item) => item.Key).map((item) => item.Key);
|
|
145
|
+
return {
|
|
146
|
+
keys,
|
|
147
|
+
isTruncated: response.IsTruncated || false,
|
|
148
|
+
nextContinuationToken: response.NextContinuationToken,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
async generatePresignedUrl(options) {
|
|
152
|
+
const { key, bucket, expireTime = models_1.S3Config.DEFAULT_PRESIGNED_EXPIRE_TIME } = options;
|
|
153
|
+
const token = getStorageToken();
|
|
154
|
+
if (!token) {
|
|
155
|
+
throw new Error('Failed to get x-storage-token: Set COZE_WORKLOAD_IDENTITY_API_KEY');
|
|
156
|
+
}
|
|
157
|
+
const signBase = process.env.COZE_BUCKET_ENDPOINT_URL || this.endpointUrl;
|
|
158
|
+
if (!signBase) {
|
|
159
|
+
throw new Error('Sign endpoint not configured: Set COZE_BUCKET_ENDPOINT_URL');
|
|
160
|
+
}
|
|
161
|
+
const signUrlEndpoint = signBase.replace(/\/$/, '') + '/sign-url';
|
|
162
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
163
|
+
const response = await fetch(signUrlEndpoint, {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers: {
|
|
166
|
+
'Content-Type': 'application/json',
|
|
167
|
+
'x-storage-token': token,
|
|
168
|
+
},
|
|
169
|
+
body: JSON.stringify({
|
|
170
|
+
bucket_name: targetBucket,
|
|
171
|
+
path: key,
|
|
172
|
+
expire_time: expireTime,
|
|
173
|
+
}),
|
|
174
|
+
});
|
|
175
|
+
if (!response.ok) {
|
|
176
|
+
throw new Error(`Failed to generate presigned URL: ${response.status}`);
|
|
177
|
+
}
|
|
178
|
+
const text = await response.text();
|
|
179
|
+
const contentType = response.headers.get('content-type') || '';
|
|
180
|
+
if (contentType.includes('application/json') || text.trim().startsWith('{')) {
|
|
181
|
+
try {
|
|
182
|
+
const obj = JSON.parse(text);
|
|
183
|
+
if (obj.data?.url)
|
|
184
|
+
return obj.data.url;
|
|
185
|
+
if (obj.url || obj.signed_url || obj.presigned_url) {
|
|
186
|
+
return obj.url || obj.signed_url || obj.presigned_url;
|
|
187
|
+
}
|
|
188
|
+
throw new Error('Sign service response missing url field');
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return text;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return text;
|
|
195
|
+
}
|
|
196
|
+
async streamUploadFile(options) {
|
|
197
|
+
const { stream, fileName, contentType = 'application/octet-stream', bucket } = options;
|
|
198
|
+
const client = this.getClient();
|
|
199
|
+
const objectKey = this.generateObjectKey(fileName);
|
|
200
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
201
|
+
const upload = new lib_storage_1.Upload({
|
|
202
|
+
client,
|
|
203
|
+
params: {
|
|
204
|
+
Bucket: targetBucket,
|
|
205
|
+
Key: objectKey,
|
|
206
|
+
Body: stream,
|
|
207
|
+
ContentType: contentType,
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
await upload.done();
|
|
211
|
+
return objectKey;
|
|
212
|
+
}
|
|
213
|
+
async uploadFromUrl(options) {
|
|
214
|
+
const { url, bucket, timeout = models_1.S3Config.DEFAULT_UPLOAD_TIMEOUT } = options;
|
|
215
|
+
const controller = new AbortController();
|
|
216
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
217
|
+
try {
|
|
218
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
219
|
+
if (!response.ok) {
|
|
220
|
+
throw new Error(`Failed to fetch URL: ${response.status}`);
|
|
221
|
+
}
|
|
222
|
+
const urlObj = new URL(url);
|
|
223
|
+
const fileName = path_1.default.basename(decodeURIComponent(urlObj.pathname)) || 'file';
|
|
224
|
+
const contentType = response.headers.get('content-type') || 'application/octet-stream';
|
|
225
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
226
|
+
return this.uploadFile({ fileContent: buffer, fileName, contentType, bucket });
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
clearTimeout(timeoutId);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async chunkUploadFile(options) {
|
|
233
|
+
const { chunks, fileName, contentType = 'application/octet-stream', bucket } = options;
|
|
234
|
+
const client = this.getClient();
|
|
235
|
+
const objectKey = this.generateObjectKey(fileName);
|
|
236
|
+
const targetBucket = this.resolveBucket(bucket);
|
|
237
|
+
const stream = stream_1.Readable.from(chunks);
|
|
238
|
+
const upload = new lib_storage_1.Upload({
|
|
239
|
+
client,
|
|
240
|
+
params: {
|
|
241
|
+
Bucket: targetBucket,
|
|
242
|
+
Key: objectKey,
|
|
243
|
+
Body: stream,
|
|
244
|
+
ContentType: contentType,
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
await upload.done();
|
|
248
|
+
return objectKey;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.S3Storage = S3Storage;
|
|
252
|
+
exports.default = S3Storage;
|
|
253
|
+
//# sourceMappingURL=client.js.map
|