Skip to content

Commit 023f1a8

Browse files
committed
feat: implement streaming chat with real-time step updates and dedicated UI.
1 parent 20120b6 commit 023f1a8

File tree

5 files changed

+816
-32
lines changed

5 files changed

+816
-32
lines changed

src/channels/index.ts

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import { createDiscordAdapter } from "./discord.js";
1414
import { createSlackAdapter } from "./slack.js";
1515
import { webAdapter } from "./web.js";
1616
import { createTwitterAdapter } from "./twitter.js";
17+
import { registry } from "../providers/index.js";
18+
import { getProvider, getCurrentModel } from "../sessions/session-service.js";
1719
// import { createWhatsAppAdapter } from "./whatsapp.js"; // Now using whatsapp-baileys.ts
1820

1921
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -22,22 +24,25 @@ export async function initializeChannels(_db?: any, _config?: any): Promise<void
2224
channelRegistry.register(webAdapter);
2325
await webAdapter.connect();
2426

25-
// Get AI provider for channels
26-
let aiProvider: any = null;
27-
let currentModel = "claude-sonnet-4-20250514";
28-
29-
try {
30-
const { createAnthropicProvider } = await import("../providers/anthropic.js");
31-
aiProvider = createAnthropicProvider();
32-
} catch (err) {
33-
console.log("[Channels] No AI provider available for Telegram/Discord");
27+
// Get AI provider for channels - use the same registry as the dashboard
28+
// This respects whichever provider the user has enabled (DeepSeek, Anthropic, etc.)
29+
let aiProvider: any = getProvider();
30+
if (!aiProvider) {
31+
// Fallback: try first available from registry
32+
const providers = registry.listProviders();
33+
if (providers.length > 0) {
34+
aiProvider = registry.getProvider(providers[0].name);
35+
}
36+
if (!aiProvider) {
37+
console.log("[Channels] No AI provider available for Telegram/Discord");
38+
}
3439
}
3540

3641
// Register Telegram if configured
3742
const telegram = createTelegramAdapter();
3843
if (telegram) {
3944
if (aiProvider) {
40-
telegram.setAIProvider(aiProvider, currentModel);
45+
telegram.setAIProvider(aiProvider, aiProvider.name || "deepseek-chat");
4146
}
4247
channelRegistry.register(telegram);
4348
try {
@@ -52,7 +57,7 @@ export async function initializeChannels(_db?: any, _config?: any): Promise<void
5257
const discord = createDiscordAdapter();
5358
if (discord) {
5459
if (aiProvider) {
55-
discord.setAIProvider(aiProvider, currentModel);
60+
discord.setAIProvider(aiProvider, aiProvider.name || "deepseek-chat");
5661
}
5762
channelRegistry.register(discord);
5863
try {
@@ -78,7 +83,7 @@ export async function initializeChannels(_db?: any, _config?: any): Promise<void
7883
const twitter = createTwitterAdapter();
7984
if (twitter) {
8085
if (aiProvider) {
81-
twitter.setAIProvider(aiProvider, currentModel);
86+
twitter.setAIProvider(aiProvider, aiProvider.name || "deepseek-chat");
8287
}
8388
channelRegistry.register(twitter);
8489
try {
@@ -97,7 +102,6 @@ export async function initializeChannels(_db?: any, _config?: any): Promise<void
97102
const { join } = await import("path");
98103
const { homedir } = await import("os");
99104
const { markMessageProcessed } = await import("../db/message-dedupe.js");
100-
const { createAnthropicProvider } = await import("../providers/anthropic.js");
101105
const { toolRegistry } = await import("../tools/index.js");
102106
const { skillRegistry } = await import("../skills/base.js");
103107
const { getSessionContext, handleSlashCommand, recordUserMessage, recordAssistantMessage, finalizeExchange } = await import("../sessions/session-manager.js");
@@ -117,10 +121,6 @@ export async function initializeChannels(_db?: any, _config?: any): Promise<void
117121
const ownerNumber = (process.env.WHATSAPP_OWNER_NUMBER || "").replace(/[^0-9]/g, "");
118122
console.log(`[WhatsApp] Owner number configured: ${ownerNumber || "(not set)"}`);
119123

120-
// Initialize AI provider
121-
const aiProvider = createAnthropicProvider();
122-
const currentModel = "claude-sonnet-4-20250514";
123-
124124
await initWhatsApp({
125125
printQR: false,
126126
onMessage: async (msg) => {
@@ -186,8 +186,10 @@ export async function initializeChannels(_db?: any, _config?: any): Promise<void
186186
// Mark as processed BEFORE handling to prevent race conditions
187187
markMessageProcessed(messageId, "inbound", fromRaw);
188188

189-
// Process with AI if provider is available
190-
if (aiProvider) {
189+
// Process with AI using the active provider from registry
190+
const waProvider = getProvider() as any;
191+
const waModel = getCurrentModel();
192+
if (waProvider) {
191193
console.log("[WhatsApp] ↳ Processing with AI...");
192194
try {
193195
// Build tools list
@@ -325,8 +327,8 @@ Current time: ${new Date().toLocaleString()}`;
325327
while (iterations < maxIterations) {
326328
iterations++;
327329

328-
const response = await aiProvider.complete({
329-
model: currentModel,
330+
const response = await waProvider.complete({
331+
model: waModel,
330332
messages,
331333
systemPrompt: systemPromptWithMemory,
332334
tools,

0 commit comments

Comments
 (0)