connectbase-client 3.25.1 → 3.26.0
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/CHANGELOG.md +18 -0
- package/dist/index.d.mts +27 -1
- package/dist/index.d.ts +27 -1
- package/dist/index.js +2 -1
- package/dist/index.mjs +2 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
본 SDK 의 모든 주요 변경사항을 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/) 형식으로 기록합니다.
|
|
4
4
|
버전은 [Semantic Versioning](https://semver.org/lang/ko/) 을 따릅니다.
|
|
5
5
|
|
|
6
|
+
## [3.26.0] - 2026-05-28
|
|
7
|
+
|
|
8
|
+
### Security — LLM provider API key 클라이언트 하드코딩 금지 명시화
|
|
9
|
+
|
|
10
|
+
2026-05-28 vLLM API key 강화 작업 중 다수 정적 자산에 raw provider URL + API key 가
|
|
11
|
+
하드코딩된 안티 패턴이 발견되어, SDK 표면에서 보안 정책을 명시한다. 동작 변경은 없다.
|
|
12
|
+
|
|
13
|
+
- **`api/ai.ts`** — `AIAPI` 클래스 / `chat()` 메서드 JSDoc 에 보안 경고 + 안티 패턴/
|
|
14
|
+
베스트프랙티스 예시 추가. 클라이언트는 user public/secret key 만 사용하고, LLM
|
|
15
|
+
provider API key 는 콘솔 `AppAIConfig` 에 암호화 저장(서버 측만 복호화). `cb.ai.chat`
|
|
16
|
+
/ `cb.ai.chatStream` 만 호출하면 서버 프록시가 tunnel `proxy_token` 자동 주입.
|
|
17
|
+
raw provider URL(`api.openai.com`, `tunnel.connectbase.world/<id>` 등) 직접 fetch 금지.
|
|
18
|
+
- **`docs/18-sdk-ai.md`** — "🔒 보안 정책 (필수)" 섹션 신설(안티 패턴 / 베스트프랙티스 /
|
|
19
|
+
마이그레이션 절차). 영향 받은 앱은 cross_app_issue 로 개별 마이그레이션 알림 예정.
|
|
20
|
+
|
|
21
|
+
본 버전은 런타임 동작 변경이 없는 문서/주석 강화이지만, 안티 패턴 차단을 SDK 표면에서
|
|
22
|
+
명시화하는 정책 변경이므로 minor 로 올린다.
|
|
23
|
+
|
|
6
24
|
## [3.25.1] - 2026-05-27
|
|
7
25
|
|
|
8
26
|
### Fixed — 3.25.0 회귀 복구 + heartbeat 헬퍼 정리
|
package/dist/index.d.mts
CHANGED
|
@@ -7519,11 +7519,37 @@ interface AIStreamChunk {
|
|
|
7519
7519
|
* })
|
|
7520
7520
|
* ```
|
|
7521
7521
|
*/
|
|
7522
|
+
/**
|
|
7523
|
+
* # 🔒 보안 — LLM API key 는 절대 클라이언트에 hardcode 금지
|
|
7524
|
+
*
|
|
7525
|
+
* 본 SDK 의 `chat` / `chatStream` 은 **ConnectBase 서버 프록시 경유** — provider (OpenAI/Claude/
|
|
7526
|
+
* Gemini/Ollama/vLLM/...) API key 는 `AppAIConfig` 에 암호화 저장된 상태로 ConnectBase 가 server-side
|
|
7527
|
+
* 에서만 복호화하여 사용합니다. 클라이언트는 user public key (또는 secret key) 만 알면 됩니다.
|
|
7528
|
+
*
|
|
7529
|
+
* **❌ 안티 패턴 — 즉시 다른 운영자에게 cross_app_issue 로 알려지고 차단됨**:
|
|
7530
|
+
* ```ts
|
|
7531
|
+
* // 브라우저 정적 자산에 raw provider URL + key — 절대 금지
|
|
7532
|
+
* fetch("https://api.openai.com/v1/chat/completions", {
|
|
7533
|
+
* headers: { Authorization: "Bearer sk-..." }
|
|
7534
|
+
* })
|
|
7535
|
+
* // 또는
|
|
7536
|
+
* fetch("https://tunnel.connectbase.world/<id>/v1/chat/completions", {
|
|
7537
|
+
* headers: { Authorization: "Bearer <vLLM key>" }
|
|
7538
|
+
* })
|
|
7539
|
+
* ```
|
|
7540
|
+
* DevTools → Network 한 번이면 누구나 key 추출 → 추론 비용 폭주 / GPU 자원 고갈.
|
|
7541
|
+
*
|
|
7542
|
+
* **✅ 베스트프랙티스 — 본 SDK 호출만 사용**:
|
|
7543
|
+
* ```ts
|
|
7544
|
+
* await cb.ai.chatStream({ messages: [...], provider: "openai_compatible" }, callbacks)
|
|
7545
|
+
* ```
|
|
7546
|
+
*/
|
|
7522
7547
|
declare class AIAPI {
|
|
7523
7548
|
private http;
|
|
7524
7549
|
constructor(http: HttpClient);
|
|
7525
7550
|
/**
|
|
7526
|
-
* AI 채팅 (동기)
|
|
7551
|
+
* AI 채팅 (동기). ConnectBase 서버 프록시 경유 — provider API key 는 server-side `AppAIConfig`
|
|
7552
|
+
* 에서만 사용되어 클라이언트에 노출되지 않습니다. raw provider URL 직접 호출 금지 (안티 패턴).
|
|
7527
7553
|
*/
|
|
7528
7554
|
chat(request: AIChatRequest): Promise<AIChatResponse>;
|
|
7529
7555
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -7519,11 +7519,37 @@ interface AIStreamChunk {
|
|
|
7519
7519
|
* })
|
|
7520
7520
|
* ```
|
|
7521
7521
|
*/
|
|
7522
|
+
/**
|
|
7523
|
+
* # 🔒 보안 — LLM API key 는 절대 클라이언트에 hardcode 금지
|
|
7524
|
+
*
|
|
7525
|
+
* 본 SDK 의 `chat` / `chatStream` 은 **ConnectBase 서버 프록시 경유** — provider (OpenAI/Claude/
|
|
7526
|
+
* Gemini/Ollama/vLLM/...) API key 는 `AppAIConfig` 에 암호화 저장된 상태로 ConnectBase 가 server-side
|
|
7527
|
+
* 에서만 복호화하여 사용합니다. 클라이언트는 user public key (또는 secret key) 만 알면 됩니다.
|
|
7528
|
+
*
|
|
7529
|
+
* **❌ 안티 패턴 — 즉시 다른 운영자에게 cross_app_issue 로 알려지고 차단됨**:
|
|
7530
|
+
* ```ts
|
|
7531
|
+
* // 브라우저 정적 자산에 raw provider URL + key — 절대 금지
|
|
7532
|
+
* fetch("https://api.openai.com/v1/chat/completions", {
|
|
7533
|
+
* headers: { Authorization: "Bearer sk-..." }
|
|
7534
|
+
* })
|
|
7535
|
+
* // 또는
|
|
7536
|
+
* fetch("https://tunnel.connectbase.world/<id>/v1/chat/completions", {
|
|
7537
|
+
* headers: { Authorization: "Bearer <vLLM key>" }
|
|
7538
|
+
* })
|
|
7539
|
+
* ```
|
|
7540
|
+
* DevTools → Network 한 번이면 누구나 key 추출 → 추론 비용 폭주 / GPU 자원 고갈.
|
|
7541
|
+
*
|
|
7542
|
+
* **✅ 베스트프랙티스 — 본 SDK 호출만 사용**:
|
|
7543
|
+
* ```ts
|
|
7544
|
+
* await cb.ai.chatStream({ messages: [...], provider: "openai_compatible" }, callbacks)
|
|
7545
|
+
* ```
|
|
7546
|
+
*/
|
|
7522
7547
|
declare class AIAPI {
|
|
7523
7548
|
private http;
|
|
7524
7549
|
constructor(http: HttpClient);
|
|
7525
7550
|
/**
|
|
7526
|
-
* AI 채팅 (동기)
|
|
7551
|
+
* AI 채팅 (동기). ConnectBase 서버 프록시 경유 — provider API key 는 server-side `AppAIConfig`
|
|
7552
|
+
* 에서만 사용되어 클라이언트에 노출되지 않습니다. raw provider URL 직접 호출 금지 (안티 패턴).
|
|
7527
7553
|
*/
|
|
7528
7554
|
chat(request: AIChatRequest): Promise<AIChatResponse>;
|
|
7529
7555
|
/**
|
package/dist/index.js
CHANGED
|
@@ -8487,7 +8487,8 @@ var AIAPI = class {
|
|
|
8487
8487
|
this.http = http;
|
|
8488
8488
|
}
|
|
8489
8489
|
/**
|
|
8490
|
-
* AI 채팅 (동기)
|
|
8490
|
+
* AI 채팅 (동기). ConnectBase 서버 프록시 경유 — provider API key 는 server-side `AppAIConfig`
|
|
8491
|
+
* 에서만 사용되어 클라이언트에 노출되지 않습니다. raw provider URL 직접 호출 금지 (안티 패턴).
|
|
8491
8492
|
*/
|
|
8492
8493
|
async chat(request) {
|
|
8493
8494
|
return this.http.post("/v1/public/ai/chat", request);
|
package/dist/index.mjs
CHANGED
|
@@ -8442,7 +8442,8 @@ var AIAPI = class {
|
|
|
8442
8442
|
this.http = http;
|
|
8443
8443
|
}
|
|
8444
8444
|
/**
|
|
8445
|
-
* AI 채팅 (동기)
|
|
8445
|
+
* AI 채팅 (동기). ConnectBase 서버 프록시 경유 — provider API key 는 server-side `AppAIConfig`
|
|
8446
|
+
* 에서만 사용되어 클라이언트에 노출되지 않습니다. raw provider URL 직접 호출 금지 (안티 패턴).
|
|
8446
8447
|
*/
|
|
8447
8448
|
async chat(request) {
|
|
8448
8449
|
return this.http.post("/v1/public/ai/chat", request);
|