Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
303 changes: 168 additions & 135 deletions client-sdks/client-js/README.md

Large diffs are not rendered by default.

439 changes: 218 additions & 221 deletions client-sdks/client-js/docs/API.md

Large diffs are not rendered by default.

319 changes: 160 additions & 159 deletions client-sdks/client-js/docs/QUICKSTART.md

Large diffs are not rendered by default.

306 changes: 163 additions & 143 deletions client-sdks/client-js/examples/agent-usage.ts

Large diffs are not rendered by default.

354 changes: 198 additions & 156 deletions client-sdks/client-js/examples/complete-usage.ts

Large diffs are not rendered by default.

322 changes: 174 additions & 148 deletions client-sdks/client-js/examples/eval-usage.ts

Large diffs are not rendered by default.

89 changes: 50 additions & 39 deletions client-sdks/client-js/examples/event-subscription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,24 @@ import {
isProgressEvent,
isControlEvent,
isMonitorEvent,
isEventType
} from '@aster/client-js';
isEventType,
} from "@aster/client-js";

async function main() {
// 1. 创建 WebSocket 客户端
const ws = new WebSocketClient({
maxReconnectAttempts: 5,
reconnectDelay: 1000,
heartbeatInterval: 30000,
heartbeatTimeout: 10000
heartbeatTimeout: 10000,
});

// 2. 连接到 aster 服务器
try {
await ws.connect('ws://localhost:8080/ws');
console.log('✅ Connected to aster');
await ws.connect("ws://localhost:8080/ws");
console.log("✅ Connected to aster");
} catch (error) {
console.error('❌ Connection failed:', error);
console.error("❌ Connection failed:", error);
return;
}

Expand All @@ -35,11 +35,11 @@ async function main() {

// 4. 订阅所有三个通道
const subscription = subscriptionManager.subscribe(
['progress', 'control', 'monitor'],
["progress", "control", "monitor"],
{
agentId: 'agent-123',
eventTypes: ['thinking', 'text_chunk', 'tool_start', 'token_usage']
}
agentId: "agent-123",
eventTypes: ["thinking", "text_chunk", "tool_start", "token_usage"],
},
);

// 5. 处理事件
Expand All @@ -57,7 +57,7 @@ async function main() {
}
}
} catch (error) {
console.error('❌ Event subscription error:', error);
console.error("❌ Event subscription error:", error);
}

// 6. 清理
Expand All @@ -69,53 +69,64 @@ async function main() {
* 处理 Progress Channel 事件
*/
function handleProgressEvent(event: any) {
if (isEventType(event, 'thinking')) {
console.log('🤔 AI 正在思考:', event.data.content);
} else if (isEventType(event, 'text_chunk')) {
if (isEventType(event, "thinking")) {
console.log("🤔 AI 正在思考:", event.data.content);
} else if (isEventType(event, "text_chunk")) {
process.stdout.write(event.data.delta);
} else if (isEventType(event, 'tool_start')) {
console.log('🔧 调用工具:', event.data.toolName);
} else if (isEventType(event, 'tool_end')) {
console.log('✅ 工具完成:', event.data.toolName, '结果:', event.data.result);
} else if (isEventType(event, 'done')) {
console.log('\n\n✅ 任务完成:', event.data.text);
} else if (isEventType(event, 'error')) {
console.error('❌ 错误:', event.data.error);
} else if (isEventType(event, "tool_start")) {
console.log("🔧 调用工具:", event.data.toolName);
} else if (isEventType(event, "tool_end")) {
console.log(
"✅ 工具完成:",
event.data.toolName,
"结果:",
event.data.result,
);
} else if (isEventType(event, "done")) {
console.log("\n\n✅ 任务完成:", event.data.text);
} else if (isEventType(event, "error")) {
console.error("❌ 错误:", event.data.error);
}
}

/**
* 处理 Control Channel 事件
*/
function handleControlEvent(event: any) {
if (isEventType(event, 'tool_approval_request')) {
console.log('⚠️ 需要审批工具:', event.data.toolName);
console.log(' 审批 ID:', event.data.approvalId);
console.log(' 参数:', event.data.params);
if (isEventType(event, "tool_approval_request")) {
console.log("⚠️ 需要审批工具:", event.data.toolName);
console.log(" 审批 ID:", event.data.approvalId);
console.log(" 参数:", event.data.params);
// 这里可以调用 API 批准或拒绝
} else if (isEventType(event, 'pause')) {
console.log('⏸️ 执行暂停:', event.data.reason);
} else if (isEventType(event, 'resume')) {
console.log('▶️ 执行恢复:', event.data.timestamp);
} else if (isEventType(event, "pause")) {
console.log("⏸️ 执行暂停:", event.data.reason);
} else if (isEventType(event, "resume")) {
console.log("▶️ 执行恢复:", event.data.timestamp);
}
}

/**
* 处理 Monitor Channel 事件
*/
function handleMonitorEvent(event: any) {
if (isEventType(event, 'token_usage')) {
console.log('📊 Token 使用:', {
if (isEventType(event, "token_usage")) {
console.log("📊 Token 使用:", {
prompt: event.data.promptTokens,
completion: event.data.completionTokens,
total: event.data.totalTokens
total: event.data.totalTokens,
});
} else if (isEventType(event, 'latency')) {
console.log('⏱️ 延迟:', event.data.latencyMs, 'ms', '操作:', event.data.operation);
} else if (isEventType(event, 'cost')) {
console.log('💰 成本:', event.data.cost, event.data.currency);
} else if (isEventType(event, 'compliance')) {
const status = event.data.passed ? '✅' : '❌';
} else if (isEventType(event, "latency")) {
console.log(
"⏱️ 延迟:",
event.data.latencyMs,
"ms",
"操作:",
event.data.operation,
);
} else if (isEventType(event, "cost")) {
console.log("💰 成本:", event.data.cost, event.data.currency);
} else if (isEventType(event, "compliance")) {
const status = event.data.passed ? "✅" : "❌";
console.log(`${status} 合规检查:`, event.data.details);
}
}
Expand Down
Loading