qing-client 0.0.19 → 0.0.21

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.
@@ -131,6 +131,7 @@ class BaseClient {
131
131
  case 'token': return this.config.tokenServiceUrl;
132
132
  case 'aigc': return this.config.aigcServiceUrl;
133
133
  case "logs": return this.config.auditLogServiceUrl;
134
+ case "providers": return this.config.providerServiceUrl;
134
135
  case "gateway-h5": return this.config.gatewayH5ServiceUrl;
135
136
  default: throw new Error(`Unsupported service: ${this.serviceName}`);
136
137
  }
@@ -5,6 +5,7 @@ import { MsgService } from "../service/MsgService";
5
5
  import { TokenService } from "../service/TokenService";
6
6
  import { UserService } from "../service/UserService";
7
7
  import { AuditLogService } from "../service/AuditLogService";
8
+ import { ProviderService } from "../service/ProviderService";
8
9
  import { ClientConfig, UserContext } from "../types";
9
10
  export declare class Client {
10
11
  protected config: ClientConfig;
@@ -15,6 +16,7 @@ export declare class Client {
15
16
  readonly aigc: AigcService;
16
17
  readonly ai: AiService;
17
18
  readonly audit: AuditLogService;
19
+ readonly provider: ProviderService;
18
20
  protected isFrontendMode: boolean;
19
21
  constructor(config: ClientConfig);
20
22
  setUserContext(context: UserContext): this;
@@ -8,6 +8,7 @@ const MsgService_1 = require("../service/MsgService");
8
8
  const TokenService_1 = require("../service/TokenService");
9
9
  const UserService_1 = require("../service/UserService");
10
10
  const AuditLogService_1 = require("../service/AuditLogService");
11
+ const ProviderService_1 = require("../service/ProviderService");
11
12
  class Client {
12
13
  constructor(config) {
13
14
  this.config = config;
@@ -19,6 +20,7 @@ class Client {
19
20
  this.aigc = new AigcService_1.AigcService(config);
20
21
  this.ai = new AiService_1.AiService(config);
21
22
  this.audit = new AuditLogService_1.AuditLogService(config);
23
+ this.provider = new ProviderService_1.ProviderService(config);
22
24
  }
23
25
  // 后端模式:设置用户上下文
24
26
  setUserContext(context) {
@@ -30,6 +32,7 @@ class Client {
30
32
  this.aigc.setUserContext(context);
31
33
  this.ai.setUserContext(context);
32
34
  this.audit.setUserContext(context);
35
+ this.provider.setUserContext(context);
33
36
  }
34
37
  else {
35
38
  console.warn("setUserContext() 仅在后端模式下有效");
@@ -46,6 +49,7 @@ class Client {
46
49
  this.aigc.setProjectId(projectId);
47
50
  this.ai.setProjectId(projectId);
48
51
  this.audit.setProjectId(projectId);
52
+ this.provider.setProjectId(projectId);
49
53
  }
50
54
  else {
51
55
  console.warn("setProjectId() 仅在前端模式下有效");
@@ -62,6 +66,7 @@ class Client {
62
66
  this.aigc.setAppId(appId);
63
67
  this.ai.setAppId(appId);
64
68
  this.audit.setAppId(appId);
69
+ this.provider.setAppId(appId);
65
70
  }
66
71
  else {
67
72
  console.warn("setAppId() 仅在前端模式下有效");
@@ -78,6 +83,7 @@ class Client {
78
83
  this.aigc.setProjectAndApp(projectId, appId);
79
84
  this.ai.setProjectAndApp(projectId, appId);
80
85
  this.audit.setProjectAndApp(projectId, appId);
86
+ this.provider.setProjectAndApp(projectId, appId);
81
87
  }
82
88
  else {
83
89
  console.warn("setProjectAndApp() 仅在前端模式下有效");
@@ -93,6 +99,7 @@ class Client {
93
99
  await this.aigc.setToken(token);
94
100
  await this.ai.setToken(token);
95
101
  await this.audit.setToken(token);
102
+ await this.provider.setToken(token);
96
103
  }
97
104
  // 清除认证令牌(两种模式都需要)
98
105
  async clearToken() {
@@ -103,6 +110,7 @@ class Client {
103
110
  await this.aigc.clearToken();
104
111
  await this.ai.clearToken();
105
112
  await this.audit.clearToken();
113
+ await this.provider.clearToken();
106
114
  }
107
115
  }
108
116
  exports.Client = Client;
package/lib/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export { FileService } from './service/FileService';
7
7
  export { AigcService } from './service/AigcService';
8
8
  export { AuditLogService } from "./service/AuditLogService";
9
9
  export { FrontHostService } from "./service/FrontHostService";
10
+ export { ProviderService } from "./service/ProviderService";
10
11
  export * from './types';
11
12
  export * from './types/msg';
12
13
  export * from './types/token';
@@ -17,3 +18,4 @@ export * from "./types/audit";
17
18
  export * from "./types/aigc";
18
19
  export { ApiSuccessResponse, ApiErrorResponse, PaginatedResponse, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionStreamResponse, ProviderListItem, ProviderDetail, ProviderModel, ModelListItem, ModelDetail, ModelConfig, CreateAssistantRequest, UpdateAssistantRequest, AssistantResponse, AssistantListResponse, SessionMessage, SessionResponse, SessionListResponse, SessionDetailResponse, SessionStatistics, PaginatedSessionMessageResponse, SessionMessageDetail, BatchDeleteSessionsResponse, AssistantModelsResponse, ModelInfoResponse, AddMessageRequest, SwitchModelRequest, } from "./types/ai";
19
20
  export { BaseClient } from './client/BaseClient';
21
+ export * from "./types/provider";
package/lib/index.js CHANGED
@@ -14,7 +14,7 @@ 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.BaseClient = exports.FrontHostService = exports.AuditLogService = exports.AigcService = exports.FileService = exports.UserService = exports.TokenService = exports.MsgService = exports.AuthService = exports.Client = void 0;
17
+ exports.BaseClient = exports.ProviderService = exports.FrontHostService = exports.AuditLogService = exports.AigcService = exports.FileService = exports.UserService = exports.TokenService = exports.MsgService = exports.AuthService = exports.Client = void 0;
18
18
  // 导出核心客户端类
19
19
  var client_1 = require("./client");
20
20
  Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_1.Client; } });
@@ -35,6 +35,8 @@ var AuditLogService_1 = require("./service/AuditLogService");
35
35
  Object.defineProperty(exports, "AuditLogService", { enumerable: true, get: function () { return AuditLogService_1.AuditLogService; } });
36
36
  var FrontHostService_1 = require("./service/FrontHostService");
37
37
  Object.defineProperty(exports, "FrontHostService", { enumerable: true, get: function () { return FrontHostService_1.FrontHostService; } });
38
+ var ProviderService_1 = require("./service/ProviderService");
39
+ Object.defineProperty(exports, "ProviderService", { enumerable: true, get: function () { return ProviderService_1.ProviderService; } });
38
40
  // 导出所有类型定义
39
41
  __exportStar(require("./types"), exports);
40
42
  __exportStar(require("./types/msg"), exports);
@@ -46,3 +48,4 @@ __exportStar(require("./types/audit"), exports);
46
48
  __exportStar(require("./types/aigc"), exports);
47
49
  var BaseClient_1 = require("./client/BaseClient");
48
50
  Object.defineProperty(exports, "BaseClient", { enumerable: true, get: function () { return BaseClient_1.BaseClient; } });
51
+ __exportStar(require("./types/provider"), exports);
@@ -1,6 +1,6 @@
1
1
  import { BaseClient } from "../client/BaseClient";
2
2
  import { ClientConfig, RequestOptions, PaginatedResponse } from "../types";
3
- import { File, CreateFileRequest, UpdateFileRequest, FileListQuery } from "../types/file";
3
+ import { File, CreateFileRequest, UpdateFileRequest, FileListQuery, Folder, FolderItemsResponse, FolderTreeNode, CreateFolderRequest, UpdateFolderRequest, OSSConfig, GenerateOSSUploadSignRequest, GenerateOSSUploadSignResponse, OSSCallbackQuery, OSSCallbackBody, OSSCallbackResponse } from "../types/file";
4
4
  export declare class FileService extends BaseClient {
5
5
  constructor(config: ClientConfig);
6
6
  /**
@@ -22,12 +22,55 @@ export declare class FileService extends BaseClient {
22
22
  * 删除文件
23
23
  * DELETE /api/files/:id (网关转发到 /api/v1/files/:id)
24
24
  */
25
- deleteFile(fileId: string, options?: RequestOptions): Promise<{
26
- message: string;
27
- }>;
25
+ deleteFile(fileId: string, options?: RequestOptions): Promise<null>;
28
26
  /**
29
27
  * 获取文件列表
30
28
  * GET /api/files (网关转发到 /api/v1/files)
31
29
  */
32
30
  listFiles(query?: FileListQuery, options?: RequestOptions): Promise<PaginatedResponse<File>>;
31
+ /**
32
+ * 生成 OSS 上传签名
33
+ * POST /api/files/oss/generate-sign (网关转发到 /api/v1/files/oss/generate-sign)
34
+ */
35
+ generateOSSUploadSign(request: GenerateOSSUploadSignRequest, options?: RequestOptions): Promise<GenerateOSSUploadSignResponse>;
36
+ /**
37
+ * 获取项目 OSS 配置
38
+ * GET /api/files/oss/config/:projectId (网关转发到 /api/v1/files/oss/config/:projectId)
39
+ */
40
+ getOSSConfig(projectId: string, options?: RequestOptions): Promise<OSSConfig>;
41
+ /**
42
+ * 创建文件夹
43
+ * POST /api/files/folders (网关转发到 /api/v1/files/folders)
44
+ */
45
+ createFolder(request: CreateFolderRequest, options?: RequestOptions): Promise<Folder>;
46
+ /**
47
+ * 获取文件夹详情
48
+ * GET /api/files/folders/:id (网关转发到 /api/v1/files/folders/:id)
49
+ */
50
+ getFolderById(folderId: string, options?: RequestOptions): Promise<Folder>;
51
+ /**
52
+ * 更新文件夹
53
+ * PUT /api/files/folders/:id (网关转发到 /api/v1/files/folders/:id)
54
+ */
55
+ updateFolder(folderId: string, updateData: UpdateFolderRequest, options?: RequestOptions): Promise<Folder>;
56
+ /**
57
+ * 删除文件夹
58
+ * DELETE /api/files/folders/:id (网关转发到 /api/v1/files/folders/:id)
59
+ */
60
+ deleteFolder(folderId: string, options?: RequestOptions): Promise<null>;
61
+ /**
62
+ * 获取文件夹列表
63
+ * GET /api/files/folders?parentId=xxx (网关转发到 /api/v1/files/folders?parentId=xxx)
64
+ */
65
+ listFolders(parentId?: string, options?: RequestOptions): Promise<FolderItemsResponse<Folder>>;
66
+ /**
67
+ * 获取文件夹树
68
+ * GET /api/files/folders/tree?parentId=xxx (网关转发到 /api/v1/files/folders/tree?parentId=xxx)
69
+ */
70
+ getFolderTree(parentId?: string, options?: RequestOptions): Promise<FolderItemsResponse<FolderTreeNode>>;
71
+ /**
72
+ * OSS 上传回调(通常由 OSS 服务端调用;此方法主要用于联调/测试)
73
+ * POST /api/files/oss/callback
74
+ */
75
+ handleOSSCallback(query: OSSCallbackQuery, body: OSSCallbackBody, options?: RequestOptions): Promise<OSSCallbackResponse>;
33
76
  }
@@ -94,5 +94,116 @@ class FileService extends BaseClient_1.BaseClient {
94
94
  });
95
95
  return response;
96
96
  }
97
+ // ==================== OSS 相关接口 ====================
98
+ /**
99
+ * 生成 OSS 上传签名
100
+ * POST /api/files/oss/generate-sign (网关转发到 /api/v1/files/oss/generate-sign)
101
+ */
102
+ async generateOSSUploadSign(request, options) {
103
+ return this.request('/oss/generate-sign', {
104
+ ...options,
105
+ method: 'POST',
106
+ body: request
107
+ });
108
+ }
109
+ /**
110
+ * 获取项目 OSS 配置
111
+ * GET /api/files/oss/config/:projectId (网关转发到 /api/v1/files/oss/config/:projectId)
112
+ */
113
+ async getOSSConfig(projectId, options) {
114
+ return this.request(`/oss/config/${projectId}`, {
115
+ ...options,
116
+ method: 'GET'
117
+ });
118
+ }
119
+ // ==================== 文件夹相关接口 ====================
120
+ /**
121
+ * 创建文件夹
122
+ * POST /api/files/folders (网关转发到 /api/v1/files/folders)
123
+ */
124
+ async createFolder(request, options) {
125
+ return this.request('/folders', {
126
+ ...options,
127
+ method: 'POST',
128
+ body: request
129
+ });
130
+ }
131
+ /**
132
+ * 获取文件夹详情
133
+ * GET /api/files/folders/:id (网关转发到 /api/v1/files/folders/:id)
134
+ */
135
+ async getFolderById(folderId, options) {
136
+ return this.request(`/folders/${folderId}`, {
137
+ ...options,
138
+ method: 'GET'
139
+ });
140
+ }
141
+ /**
142
+ * 更新文件夹
143
+ * PUT /api/files/folders/:id (网关转发到 /api/v1/files/folders/:id)
144
+ */
145
+ async updateFolder(folderId, updateData, options) {
146
+ return this.request(`/folders/${folderId}`, {
147
+ ...options,
148
+ method: 'PUT',
149
+ body: updateData
150
+ });
151
+ }
152
+ /**
153
+ * 删除文件夹
154
+ * DELETE /api/files/folders/:id (网关转发到 /api/v1/files/folders/:id)
155
+ */
156
+ async deleteFolder(folderId, options) {
157
+ return this.request(`/folders/${folderId}`, {
158
+ ...options,
159
+ method: 'DELETE'
160
+ });
161
+ }
162
+ /**
163
+ * 获取文件夹列表
164
+ * GET /api/files/folders?parentId=xxx (网关转发到 /api/v1/files/folders?parentId=xxx)
165
+ */
166
+ async listFolders(parentId, options) {
167
+ const params = {};
168
+ if (parentId !== undefined) {
169
+ params.parentId = parentId;
170
+ }
171
+ return this.request('/folders', {
172
+ ...options,
173
+ method: 'GET',
174
+ params
175
+ });
176
+ }
177
+ /**
178
+ * 获取文件夹树
179
+ * GET /api/files/folders/tree?parentId=xxx (网关转发到 /api/v1/files/folders/tree?parentId=xxx)
180
+ */
181
+ async getFolderTree(parentId, options) {
182
+ const params = {};
183
+ if (parentId !== undefined) {
184
+ params.parentId = parentId;
185
+ }
186
+ return this.request('/folders/tree', {
187
+ ...options,
188
+ method: 'GET',
189
+ params
190
+ });
191
+ }
192
+ /**
193
+ * OSS 上传回调(通常由 OSS 服务端调用;此方法主要用于联调/测试)
194
+ * POST /api/files/oss/callback
195
+ */
196
+ async handleOSSCallback(query, body, options) {
197
+ return this.request('/oss/callback', {
198
+ ...options,
199
+ method: 'POST',
200
+ params: {
201
+ 'x-jwt': query['x-jwt'],
202
+ 'x-taskid': query['x-taskid'],
203
+ folderId: query.folderId,
204
+ },
205
+ body,
206
+ });
207
+ }
97
208
  }
98
209
  exports.FileService = FileService;
@@ -0,0 +1,40 @@
1
+ import { BaseClient } from "../client/BaseClient";
2
+ import { ClientConfig, RequestOptions } from "../types";
3
+ import { ChatCompletionsRequest, ChatCompletionsResponse, CreateProviderRequest, ProviderItem, ProviderModel, UpdateProviderRequest, UpsertManyModelsBody } from "../types/provider";
4
+ /**
5
+ * 大模型供应商服务(Provider Service)
6
+ * - 网关模式:前端 -> /api/providers/...
7
+ * - 直连模式:后端 -> /api/v1/...
8
+ */
9
+ export declare class ProviderService extends BaseClient {
10
+ constructor(config: ClientConfig);
11
+ private path;
12
+ chatCompletions(body: ChatCompletionsRequest, options?: RequestOptions): Promise<ChatCompletionsResponse>;
13
+ listProviders(options?: RequestOptions): Promise<ProviderItem[]>;
14
+ getProvider(providerId: string, options?: RequestOptions): Promise<ProviderItem>;
15
+ createProvider(body: CreateProviderRequest, options?: RequestOptions): Promise<ProviderItem>;
16
+ updateProvider(providerId: string, body: UpdateProviderRequest, options?: RequestOptions): Promise<ProviderItem>;
17
+ deleteProvider(providerId: string, options?: RequestOptions): Promise<void>;
18
+ listProviderModels(providerId: string, params?: {
19
+ onlySupported?: boolean;
20
+ onlyEnabled?: boolean;
21
+ }, options?: RequestOptions): Promise<ProviderModel[]>;
22
+ listGlobalModels(params?: {
23
+ providerId?: string;
24
+ onlySupported?: boolean;
25
+ onlyEnabled?: boolean;
26
+ q?: string;
27
+ }, options?: RequestOptions): Promise<ProviderModel[]>;
28
+ upsertManyModels(body: UpsertManyModelsBody, options?: RequestOptions): Promise<{
29
+ upserted: number;
30
+ updated: number;
31
+ }>;
32
+ validateApiKey(providerId: string, options?: RequestOptions): Promise<{
33
+ valid: boolean;
34
+ meta?: {
35
+ statusCode?: number;
36
+ requestId?: string;
37
+ };
38
+ }>;
39
+ getRateLimit(providerId: string, options?: RequestOptions): Promise<any>;
40
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProviderService = void 0;
4
+ const BaseClient_1 = require("../client/BaseClient");
5
+ /**
6
+ * 大模型供应商服务(Provider Service)
7
+ * - 网关模式:前端 -> /api/providers/...
8
+ * - 直连模式:后端 -> /api/v1/...
9
+ */
10
+ class ProviderService extends BaseClient_1.BaseClient {
11
+ constructor(config) {
12
+ super(config, "providers");
13
+ }
14
+ // 前端/后端路径兼容
15
+ path(p) {
16
+ return this.isFrontendMode ? p : `/api/v1${p}`;
17
+ }
18
+ // ===== Runtime (统一入口) =====
19
+ async chatCompletions(body, options) {
20
+ return this.request(this.path("/chat/completions"), {
21
+ ...options,
22
+ method: "POST",
23
+ body,
24
+ });
25
+ }
26
+ // ===== Provider CRUD =====
27
+ async listProviders(options) {
28
+ const data = await this.request(this.path("/providers"), {
29
+ ...options,
30
+ method: "GET",
31
+ });
32
+ return data;
33
+ }
34
+ async getProvider(providerId, options) {
35
+ return this.request(this.path(`/providers/${providerId}`), {
36
+ ...options,
37
+ method: "GET",
38
+ });
39
+ }
40
+ async createProvider(body, options) {
41
+ return this.request(this.path("/providers"), {
42
+ ...options,
43
+ method: "POST",
44
+ body,
45
+ });
46
+ }
47
+ async updateProvider(providerId, body, options) {
48
+ return this.request(this.path(`/providers/${providerId}`), {
49
+ ...options,
50
+ method: "PUT",
51
+ body,
52
+ });
53
+ }
54
+ async deleteProvider(providerId, options) {
55
+ return this.request(this.path(`/providers/${providerId}`), {
56
+ ...options,
57
+ method: "DELETE",
58
+ });
59
+ }
60
+ // ===== Models =====
61
+ async listProviderModels(providerId, params, options) {
62
+ return this.request(this.path(`/providers/${providerId}/models`), {
63
+ ...options,
64
+ method: "GET",
65
+ params,
66
+ });
67
+ }
68
+ async listGlobalModels(params, options) {
69
+ return this.request(this.path("/models"), {
70
+ ...options,
71
+ method: "GET",
72
+ params,
73
+ });
74
+ }
75
+ async upsertManyModels(body, options) {
76
+ return this.request(this.path("/internal/models/upsertMany"), {
77
+ ...options,
78
+ method: "POST",
79
+ body,
80
+ });
81
+ }
82
+ // ===== Runtime 辅助 =====
83
+ async validateApiKey(providerId, options) {
84
+ return this.request(this.path(`/providers/${providerId}/validate-api-key`), {
85
+ ...options,
86
+ method: "POST",
87
+ body: {},
88
+ });
89
+ }
90
+ async getRateLimit(providerId, options) {
91
+ return this.request(this.path(`/providers/${providerId}/rate-limit`), {
92
+ ...options,
93
+ method: "GET",
94
+ });
95
+ }
96
+ }
97
+ exports.ProviderService = ProviderService;
@@ -12,7 +12,7 @@ export interface File {
12
12
  acl: 'private' | 'public-read';
13
13
  etag?: string;
14
14
  contentMd5?: string;
15
- folderId?: string;
15
+ folderId?: string | null;
16
16
  createdAt: string;
17
17
  updatedAt: string;
18
18
  }
@@ -43,10 +43,77 @@ export interface FileListQuery {
43
43
  taskId?: string;
44
44
  acl?: 'private' | 'public-read';
45
45
  }
46
- export interface FileListResponse {
47
- data: File[];
48
- total: number;
49
- page: number;
50
- pageSize: number;
51
- totalPages: number;
46
+ export interface Folder {
47
+ id: string;
48
+ name: string;
49
+ parentId?: string | null;
50
+ description?: string;
51
+ createdAt: string;
52
+ updatedAt: string;
53
+ }
54
+ export interface CreateFolderRequest {
55
+ name: string;
56
+ parentId?: string;
57
+ description?: string;
58
+ }
59
+ export interface UpdateFolderRequest {
60
+ name?: string;
61
+ parentId?: string | null;
62
+ description?: string;
63
+ }
64
+ /**
65
+ * folders/list、folders/tree 实际返回:
66
+ * { success, message, data: { items: [...] } }
67
+ * SDK 的 BaseClient.request<T>() 会解包到 data,所以这里定义 items wrapper。
68
+ */
69
+ export interface FolderItemsResponse<TItem = Folder> {
70
+ items: TItem[];
71
+ }
72
+ export type FolderTreeNode = Folder & {
73
+ children?: FolderTreeNode[];
74
+ };
75
+ export interface OSSConfig {
76
+ enabledTasks: string[];
77
+ defaultTask: string;
78
+ isPublic?: boolean;
79
+ }
80
+ export interface GenerateOSSUploadSignRequest {
81
+ taskKey?: string;
82
+ fileName?: string;
83
+ fileSize?: number;
84
+ taskId?: string;
85
+ folderId?: string;
86
+ }
87
+ export interface GenerateOSSUploadSignResponse {
88
+ policy: string;
89
+ signature: string;
90
+ OSSAccessKeyId: string;
91
+ host: string;
92
+ expire: string;
93
+ callback?: string;
94
+ acl?: string;
95
+ key: string;
96
+ taskId: string;
97
+ jwt: string;
98
+ projectId?: string;
99
+ }
100
+ export interface OSSCallbackQuery {
101
+ 'x-jwt': string;
102
+ 'x-taskid': string;
103
+ folderId?: string;
104
+ }
105
+ export interface OSSCallbackBody {
106
+ bucket?: string;
107
+ object: string;
108
+ etag?: string;
109
+ size?: string;
110
+ mimeType?: string;
111
+ acl?: 'private' | 'public-read' | string;
112
+ contentMd5?: string;
113
+ 'x-service'?: string;
114
+ }
115
+ export interface OSSCallbackResponse {
116
+ id: string;
117
+ taskId: string;
118
+ url: string;
52
119
  }
package/lib/types/file.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  // client/npm/src/types/file.ts
3
- // 文件模型和请求类型
3
+ // 文件服务(files)相关类型:文件 / 文件夹 / OSS
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -30,6 +30,7 @@ export interface ClientConfig {
30
30
  tokenServiceUrl?: string;
31
31
  aigcServiceUrl?: string;
32
32
  auditLogServiceUrl?: string;
33
+ providerServiceUrl?: string;
33
34
  gatewayH5ServiceUrl?: string;
34
35
  tokenStorage?: TokenStorage;
35
36
  projectId?: string;
@@ -50,3 +51,4 @@ export interface RequestOptions {
50
51
  projectId?: string;
51
52
  appId?: string;
52
53
  }
54
+ export * from "./provider";
@@ -1,2 +1,17 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./provider"), exports);
@@ -0,0 +1,119 @@
1
+ export type ProviderClass = "openai" | "anthropic" | "gemini" | "azure_openai" | "mock";
2
+ export type ProviderStatus = "enabled" | "disabled";
3
+ export interface ProviderCredential {
4
+ hasApiKey: boolean;
5
+ apiKeyLast4?: string;
6
+ }
7
+ export interface ProviderRuntime {
8
+ timeoutMs: number;
9
+ maxRetries: number;
10
+ extra?: Record<string, any>;
11
+ }
12
+ export interface ProviderItem {
13
+ id: string;
14
+ name: string;
15
+ providerClass: ProviderClass;
16
+ baseUrl?: string;
17
+ status: ProviderStatus;
18
+ defaultModel?: string;
19
+ credential: ProviderCredential;
20
+ runtime: ProviderRuntime;
21
+ createdAt?: string;
22
+ updatedAt?: string;
23
+ }
24
+ export interface ProviderListResponse {
25
+ providers: ProviderItem[];
26
+ }
27
+ export interface ModelPricing {
28
+ currency?: string;
29
+ inputPer1k?: number;
30
+ outputPer1k?: number;
31
+ }
32
+ export interface ModelCapabilities {
33
+ text: boolean;
34
+ vision?: boolean;
35
+ tools?: boolean;
36
+ json?: boolean;
37
+ audio?: boolean;
38
+ embeddings?: boolean;
39
+ }
40
+ export interface ModelLimits {
41
+ contextWindow?: number;
42
+ maxOutputTokens?: number;
43
+ }
44
+ export interface ProviderModel {
45
+ providerId: string;
46
+ modelId: string;
47
+ fullModelName: string;
48
+ displayName?: string;
49
+ enabled: boolean;
50
+ supported: boolean;
51
+ pricing?: ModelPricing;
52
+ capabilities: ModelCapabilities;
53
+ limits?: ModelLimits;
54
+ tags?: string[];
55
+ createdAt?: string;
56
+ updatedAt?: string;
57
+ }
58
+ export interface UpsertModelItem {
59
+ id?: string;
60
+ modelId?: string;
61
+ name?: string;
62
+ displayName?: string;
63
+ enabled?: boolean;
64
+ supported?: boolean;
65
+ inputPrice?: number;
66
+ outputPrice?: number;
67
+ perUnit?: number;
68
+ currency?: string;
69
+ capabilities?: Partial<ModelCapabilities>;
70
+ contextWindow?: number;
71
+ maxOutputTokens?: number;
72
+ tags?: string[];
73
+ description?: string;
74
+ hasExtraCost?: boolean;
75
+ extraCostNote?: string;
76
+ company?: string;
77
+ providerClass?: string;
78
+ }
79
+ export interface UpsertManyModelsBody {
80
+ providerId: string;
81
+ models: UpsertModelItem[];
82
+ }
83
+ export interface CreateProviderRequest {
84
+ providerId: string;
85
+ name: string;
86
+ providerClass: ProviderClass;
87
+ baseUrl?: string;
88
+ defaultModel?: string;
89
+ apiKey?: string;
90
+ apiKeyEncrypted?: string;
91
+ apiKeyLast4?: string;
92
+ runtime?: Partial<ProviderRuntime>;
93
+ }
94
+ export interface UpdateProviderRequest {
95
+ name?: string;
96
+ providerClass?: ProviderClass;
97
+ baseUrl?: string;
98
+ defaultModel?: string;
99
+ status?: ProviderStatus;
100
+ apiKey?: string;
101
+ apiKeyEncrypted?: string;
102
+ apiKeyLast4?: string;
103
+ runtime?: Partial<ProviderRuntime>;
104
+ }
105
+ export interface ChatMessage {
106
+ role: "system" | "user" | "assistant" | "function";
107
+ content: string;
108
+ name?: string;
109
+ function_call?: any;
110
+ }
111
+ export interface ChatCompletionsRequest {
112
+ model: string;
113
+ messages: ChatMessage[];
114
+ temperature?: number;
115
+ max_tokens?: number;
116
+ requiredCapabilities?: Array<"text" | "vision" | "tools" | "json" | "audio" | "embeddings">;
117
+ [key: string]: any;
118
+ }
119
+ export type ChatCompletionsResponse = any;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qing-client",
3
- "version": "0.0.19",
3
+ "version": "0.0.21",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "scripts": {