diff --git a/src/models/Attachment.ts b/src/models/Attachment.ts deleted file mode 100644 index 02379ee..0000000 --- a/src/models/Attachment.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { types } from "mobx-state-tree"; - -export default types.model("Attachment", { - content: types.string, - url: types.string, -}); diff --git a/src/stores/ClientChatStore.ts b/src/stores/ClientChatStore.ts index d1fd4a4..8b2812b 100644 --- a/src/stores/ClientChatStore.ts +++ b/src/stores/ClientChatStore.ts @@ -1,6 +1,5 @@ import { applySnapshot, flow, Instance, types } from "mobx-state-tree"; import Message from "../models/Message"; -import IntermediateStep from "../models/IntermediateStep"; import UserOptionsStore from "./UserOptionsStore"; const ClientChatStore = types @@ -10,8 +9,6 @@ const ClientChatStore = types isLoading: types.optional(types.boolean, false), model: types.optional(types.string, "llama-3.3-70b-versatile"), imageModel: types.optional(types.string, "black-forest-labs/flux-1.1-pro"), - tools: types.optional(types.array(types.string), []), - intermediateSteps: types.array(IntermediateStep), }) .actions((self) => ({ cleanup() { @@ -39,7 +36,6 @@ const ClientChatStore = types const payload = { messages: self.messages.slice(), model: self.model, - tools: self.tools.slice(), }; yield new Promise((resolve) => setTimeout(resolve, 500)); @@ -96,8 +92,6 @@ const ClientChatStore = types self.appendToLastMessage( parsedData.data.choices[0]?.delta?.content || "", ); - } else { - self.handleIntermediateSteps(parsedData); } } catch (error) { console.error("Error processing stream:", error); @@ -160,7 +154,6 @@ const ClientChatStore = types const payload = { messages: self.messages.slice(), model: self.model, - tools: self.tools.slice(), }; const response = yield fetch("/api/chat", { @@ -211,8 +204,6 @@ const ClientChatStore = types self.appendToLastMessage( parsedData.data.choices[0]?.delta?.content || "", ); - } else { - self.handleIntermediateSteps(parsedData); } } catch (error) { console.error("Error processing stream:", error); @@ -240,31 +231,11 @@ const ClientChatStore = types reset() { applySnapshot(self, {}); }, - addIntermediateStep(stepData) { - return; - }, - - handleIntermediateSteps(eventData: any) { - try { - self.appendToLastMessage(eventData?.data.trim() + "\n"); - self.addIntermediateStep({ - kind: eventData.type, - data: eventData.data, - }); - } catch (e) {} - }, removeMessagesAfter(index: number) { if (index >= 0 && index < self.messages.length) { self.messages.splice(index + 1); } }, - setTools(tools: string[]) { - self.tools.clear(); - self.tools.push(...tools); - }, - getTools() { - return self.tools.slice(); - }, updateLastMessage(content: string) { if (self.messages.length > 0) { self.messages[self.messages.length - 1].content = content; diff --git a/workers/site/api-router.ts b/workers/site/api-router.ts index 7caa162..7cc04d3 100644 --- a/workers/site/api-router.ts +++ b/workers/site/api-router.ts @@ -28,15 +28,6 @@ export function createRouter() { }, ) - .get( - "/api/streams/webhook/:streamId", - withParams, - async ({ streamId }, env, ctx) => { - const { chatService } = createServerContext(env, ctx); - return chatService.proxyWebhookStream(streamId); // Handles SSE for streamId - }, - ) - .post("/api/feedback", async (r, e, c) => { const { feedbackService } = createServerContext(e, c); return feedbackService.handleFeedback(r); diff --git a/workers/site/sdk/assistant-sdk.ts b/workers/site/sdk/assistant-sdk.ts index 010e661..ea4ab98 100644 --- a/workers/site/sdk/assistant-sdk.ts +++ b/workers/site/sdk/assistant-sdk.ts @@ -6,13 +6,11 @@ export class AssistantSdk { maxTokens?: number; userTimezone?: string; userLocation?: string; - tools?: string[]; }): string { const { maxTokens, userTimezone = "UTC", userLocation = "", - tools = [], } = params; const selectedFewshots = Sdk.selectEquitably?.(few_shots) || few_shots; const sdkDate = @@ -23,17 +21,6 @@ export class AssistantSdk { const now = new Date(); const formattedMinutes = String(now.getMinutes()).padStart(2, "0"); const currentTime = `${now.getHours()}:${formattedMinutes} ${now.getSeconds()}s`; - // const toolsInfo = - // tools - // .map((tool) => { - // switch (tool) { - // // case "user-attachments": return "### Attachments\nUser supplied attachments are normalized to text and will have this header (# Attachment:...) in the message."; - // // case "web-search": return "### Web Search\nResults are optionally available in 'Live Search'."; - // default: - // return `- ${tool}`; - // } - // }) - // .join("\n\n") || "- No additional tools selected."; return `# Assistant Knowledge ## Current Context diff --git a/workers/site/sdk/chat-sdk.ts b/workers/site/sdk/chat-sdk.ts index 6b8ce61..f1c2a7a 100644 --- a/workers/site/sdk/chat-sdk.ts +++ b/workers/site/sdk/chat-sdk.ts @@ -5,219 +5,129 @@ import {IMessage} from "../../../src/stores/ClientChatStore"; import {getModelFamily} from "../../../src/components/chat/SupportedModels"; export class ChatSdk { - static async preprocess({ - messages, - }) { - // a custom implementation for preprocessing would go here - return Message.create({ - role: "assistant", - content: "", - }); - } - - static async handleChatRequest( - request: Request, - ctx: { - openai: OpenAI; - systemPrompt: any; - maxTokens: any; - env: Env; - }, - ) { - const streamId = crypto.randomUUID(); - const { messages, model, conversationId, attachments, tools } = - await request.json(); - - if (!messages?.length) { - return new Response("No messages provided", { status: 400 }); + static async preprocess({ + messages, + }) { + // run processing on messages to generate events/context + // removed in this fork due to expenses + return Message.create({ + role: "assistant", + content: "", + }); } - const preprocessedContext = await ChatSdk.preprocess({ - messages, - }); - - const objectId = ctx.env.SITE_COORDINATOR.idFromName("stream-index"); - const durableObject = ctx.env.SITE_COORDINATOR.get(objectId); - - const webhooks = - JSON.parse(await durableObject.getStreamData(streamId)) ?? {}; - - await durableObject.saveStreamData( - streamId, - JSON.stringify({ - messages, - model, - conversationId, - timestamp: Date.now(), - attachments, - tools, - systemPrompt: ctx.systemPrompt, - preprocessedContext, - ...webhooks, - }), - ); - - return new Response( - JSON.stringify({ - streamUrl: `/api/streams/${streamId}`, - }), - { - headers: { - "Content-Type": "application/json", + static async handleChatRequest( + request: Request, + ctx: { + openai: OpenAI; + systemPrompt: any; + maxTokens: any; + env: Env; }, - }, - ); - } + ) { + const streamId = crypto.randomUUID(); + const {messages, model, conversationId} = + await request.json(); - static async calculateMaxTokens( - messages: any[], - ctx: Record & { - env: Env; - maxTokens: number; - }, - ) { - const objectId = ctx.env.SITE_COORDINATOR.idFromName( - "dynamic-token-counter", - ); - const durableObject = ctx.env.SITE_COORDINATOR.get(objectId); - return durableObject.dynamicMaxTokens(messages, ctx.maxTokens); - } + if (!messages?.length) { + return new Response("No messages provided", {status: 400}); + } - static buildAssistantPrompt({ maxTokens, tools }) { - return AssistantSdk.getAssistantPrompt({ - maxTokens, - userTimezone: "UTC", - userLocation: "USA/unknown", - tools, - }); - } + const preprocessedContext = await ChatSdk.preprocess({ + messages, + }); - static buildMessageChain( - messages: any[], - opts: { - systemPrompt: any; - assistantPrompt: string; - attachments: any[]; - toolResults: IMessage; - model: any; - }, - ) { - const modelFamily = getModelFamily(opts.model); + const objectId = ctx.env.SITE_COORDINATOR.idFromName("stream-index"); + const durableObject = ctx.env.SITE_COORDINATOR.get(objectId); - const messagesToSend = []; - messagesToSend.push( - Message.create({ - role: - opts.model.includes("o1") || - opts.model.includes("gemma") || - modelFamily === "claude" || - modelFamily === "google" - ? "assistant" - : "system", - content: opts.systemPrompt.trim(), - }), - ); + await durableObject.saveStreamData( + streamId, + JSON.stringify({ + messages, + model, + conversationId, + timestamp: Date.now(), + systemPrompt: ctx.systemPrompt, + preprocessedContext + }), + ); - messagesToSend.push( - Message.create({ - role: "assistant", - content: opts.assistantPrompt.trim(), - }), - ); - - const attachmentMessages = (opts.attachments || []).map((attachment) => - Message.create({ - role: "user", - content: `Attachment: ${attachment.content}`, - }), - ); - - if (attachmentMessages.length > 0) { - messagesToSend.push(...attachmentMessages); + return new Response( + JSON.stringify({ + streamUrl: `/api/streams/${streamId}`, + }), + { + headers: { + "Content-Type": "application/json", + }, + }, + ); } - messagesToSend.push( - ...messages - .filter((message: any) => message.content?.trim()) - .map((message: any) => Message.create(message)), - ); + static async calculateMaxTokens( + messages: any[], + ctx: Record & { + env: Env; + maxTokens: number; + }, + ) { + const objectId = ctx.env.SITE_COORDINATOR.idFromName( + "dynamic-token-counter", + ); + const durableObject = ctx.env.SITE_COORDINATOR.get(objectId); + return durableObject.dynamicMaxTokens(messages, ctx.maxTokens); + } - return messagesToSend; - } + static buildAssistantPrompt({maxTokens}) { + return AssistantSdk.getAssistantPrompt({ + maxTokens, + userTimezone: "UTC", + userLocation: "USA/unknown", + }); + } - static async handleAgentStream( - eventSource: EventSource, - dataCallback: any, - ): Promise { - // console.log("sdk::handleWebhookStream::start"); - let done = false; - return new Promise((resolve, reject) => { - if (!done) { - // console.log("sdk::handleWebhookStream::promise::created"); - eventSource.onopen = () => { - // console.log("sdk::handleWebhookStream::eventSource::open"); - console.log("Connected to agent"); - }; + static buildMessageChain( + messages: any[], + opts: { + systemPrompt: any; + assistantPrompt: string; + toolResults: IMessage; + model: any; + }, + ) { + const modelFamily = getModelFamily(opts.model); - const parseEvent = (data) => { - try { - return JSON.parse(data); - } catch (_) { - return data; - } - }; - eventSource.onmessage = (event) => { - try { - if (event.data === "[DONE]") { - done = true; - console.log("Stream completed"); + const messagesToSend = []; - eventSource.close(); - return resolve(); - } + messagesToSend.push( + Message.create({ + role: + opts.model.includes("o1") || + opts.model.includes("gemma") || + modelFamily === "claude" || + modelFamily === "google" + ? "assistant" + : "system", + content: opts.systemPrompt.trim(), + }), + ); - dataCallback({ type: "web-search", data: parseEvent(event.data) }); - } catch (error) { - console.log("sdk::handleWebhookStream::eventSource::error"); - console.error("Error parsing webhook data:", error); - dataCallback({ error: "Invalid data format from webhook" }); - } - }; + messagesToSend.push( + Message.create({ + role: "assistant", + content: opts.assistantPrompt.trim(), + }), + ); - eventSource.onerror = (error: any) => { - console.error("Webhook stream error:", error); + messagesToSend.push( + ...messages + .filter((message: any) => message.content?.trim()) + .map((message: any) => Message.create(message)), + ); - if ( - error.error && - error.error.message === "The server disconnected." - ) { - return resolve(); - } - - reject(new Error("Failed to stream from webhook")); - }; - } - }); - } - - static sendDoubleNewline(controller, encoder) { - const data = { - type: "chat", - data: { - choices: [ - { - index: 0, - delta: { content: "\n\n" }, - logprobs: null, - finish_reason: null, - }, - ], - }, - }; - - controller.enqueue(encoder.encode(`data: ${JSON.stringify(data)}\n\n`)); - } + return messagesToSend; + } } export default ChatSdk; diff --git a/workers/site/sdk/models/cerebras.ts b/workers/site/sdk/models/cerebras.ts index 7fb5204..815ece2 100644 --- a/workers/site/sdk/models/cerebras.ts +++ b/workers/site/sdk/models/cerebras.ts @@ -21,12 +21,10 @@ export class CerebrasSdk { }>, _NotCustomized >; - attachments: any; maxTokens: unknown | number | undefined; messages: any; model: string; env: Env; - tools: any; }, dataCallback: (data) => void, ) { @@ -35,15 +33,12 @@ export class CerebrasSdk { messages, env, maxTokens, - tools, systemPrompt, model, - attachments, } = param; const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: maxTokens, - tools: tools, }); const safeMessages = ChatSdk.buildMessageChain(messages, { @@ -51,7 +46,6 @@ export class CerebrasSdk { model, assistantPrompt, toolResults: preprocessedContext, - attachments: attachments, }); const openai = new OpenAI({ diff --git a/workers/site/sdk/models/claude.ts b/workers/site/sdk/models/claude.ts index 190fbfa..4ce15f4 100644 --- a/workers/site/sdk/models/claude.ts +++ b/workers/site/sdk/models/claude.ts @@ -49,7 +49,6 @@ export class ClaudeChatSdk { param: { openai: OpenAI; systemPrompt: any; - disableWebhookGeneration: boolean; preprocessedContext: ModelSnapshotType2< ModelPropertiesDeclarationToProperties<{ role: ISimpleType>; @@ -57,12 +56,10 @@ export class ClaudeChatSdk { }>, _NotCustomized >; - attachments: any; maxTokens: unknown | number | undefined; messages: any; model: string; env: Env; - tools: any; }, dataCallback: (data) => void, ) { @@ -71,15 +68,12 @@ export class ClaudeChatSdk { messages, env, maxTokens, - tools, systemPrompt, model, - attachments, } = param; const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: maxTokens, - tools: tools, }); const safeMessages = ChatSdk.buildMessageChain(messages, { @@ -87,7 +81,6 @@ export class ClaudeChatSdk { model, assistantPrompt, toolResults: preprocessedContext, - attachments: attachments, }); const anthropic = new Anthropic({ diff --git a/workers/site/sdk/models/cloudflareAi.ts b/workers/site/sdk/models/cloudflareAi.ts index 5d3d4fd..b078a43 100644 --- a/workers/site/sdk/models/cloudflareAi.ts +++ b/workers/site/sdk/models/cloudflareAi.ts @@ -13,7 +13,6 @@ export class CloudflareAISdk { param: { openai: OpenAI; systemPrompt: any; - disableWebhookGeneration: boolean; preprocessedContext: ModelSnapshotType2< ModelPropertiesDeclarationToProperties<{ role: ISimpleType>; @@ -21,12 +20,10 @@ export class CloudflareAISdk { }>, _NotCustomized >; - attachments: any; maxTokens: unknown | number | undefined; messages: any; model: string; env: Env; - tools: any; }, dataCallback: (data) => void, ) { @@ -35,22 +32,18 @@ export class CloudflareAISdk { messages, env, maxTokens, - tools, systemPrompt, model, - attachments, } = param; const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: maxTokens, - tools: tools, }); const safeMessages = ChatSdk.buildMessageChain(messages, { systemPrompt: systemPrompt, model, assistantPrompt, toolResults: preprocessedContext, - attachments: attachments, }); const cfAiURL = `https://api.cloudflare.com/client/v4/accounts/${env.CLOUDFLARE_ACCOUNT_ID}/ai/v1`; diff --git a/workers/site/sdk/models/fireworks.ts b/workers/site/sdk/models/fireworks.ts index d8a42af..8c96ab6 100644 --- a/workers/site/sdk/models/fireworks.ts +++ b/workers/site/sdk/models/fireworks.ts @@ -42,7 +42,6 @@ export class FireworksAiChatSdk { param: { openai: OpenAI; systemPrompt: any; - disableWebhookGeneration: boolean; preprocessedContext: ModelSnapshotType2< ModelPropertiesDeclarationToProperties<{ role: ISimpleType>; @@ -50,12 +49,10 @@ export class FireworksAiChatSdk { }>, _NotCustomized >; - attachments: any; maxTokens: number; messages: any; model: any; env: Env; - tools: any; }, dataCallback: (data) => void, ) { @@ -64,15 +61,12 @@ export class FireworksAiChatSdk { messages, env, maxTokens, - tools, systemPrompt, model, - attachments, } = param; const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: maxTokens, - tools: tools, }); const safeMessages = ChatSdk.buildMessageChain(messages, { @@ -80,7 +74,6 @@ export class FireworksAiChatSdk { model, assistantPrompt, toolResults: preprocessedContext, - attachments: attachments, }); const fireworksOpenAIClient = new OpenAI({ diff --git a/workers/site/sdk/models/google.ts b/workers/site/sdk/models/google.ts index e759c9b..c451a02 100644 --- a/workers/site/sdk/models/google.ts +++ b/workers/site/sdk/models/google.ts @@ -12,15 +12,12 @@ export class GoogleChatSdk { messages, env, maxTokens, - tools, systemPrompt, model, - attachments, } = param; const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: maxTokens, - tools: tools, }); const safeMessages = ChatSdk.buildMessageChain(messages, { @@ -28,7 +25,6 @@ export class GoogleChatSdk { model, assistantPrompt, toolResults: preprocessedContext, - attachments: attachments, }); const openai = new OpenAI({ diff --git a/workers/site/sdk/models/groq.ts b/workers/site/sdk/models/groq.ts index 8643e84..d546bee 100644 --- a/workers/site/sdk/models/groq.ts +++ b/workers/site/sdk/models/groq.ts @@ -13,7 +13,6 @@ export class GroqChatSdk { param: { openai: OpenAI; systemPrompt: any; - disableWebhookGeneration: boolean; preprocessedContext: ModelSnapshotType2< ModelPropertiesDeclarationToProperties<{ role: ISimpleType>; @@ -21,12 +20,10 @@ export class GroqChatSdk { }>, _NotCustomized >; - attachments: any; maxTokens: unknown | number | undefined; messages: any; model: string; env: Env; - tools: any; }, dataCallback: (data) => void, ) { @@ -35,22 +32,18 @@ export class GroqChatSdk { messages, env, maxTokens, - tools, systemPrompt, model, - attachments, } = param; const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: maxTokens, - tools: tools, }); const safeMessages = ChatSdk.buildMessageChain(messages, { systemPrompt: systemPrompt, model, assistantPrompt, toolResults: preprocessedContext, - attachments: attachments, }); const openai = new OpenAI({ diff --git a/workers/site/sdk/models/openai.ts b/workers/site/sdk/models/openai.ts index 7bddda5..451c141 100644 --- a/workers/site/sdk/models/openai.ts +++ b/workers/site/sdk/models/openai.ts @@ -7,12 +7,9 @@ export class OpenAiChatSdk { openai: OpenAI; systemPrompt: any; preprocessedContext: any; - attachments: any; maxTokens: unknown | number | undefined; messages: any; - disableWebhookGeneration: boolean; model: any; - tools: any; }, dataCallback: (data: any) => any, ) { @@ -20,9 +17,7 @@ export class OpenAiChatSdk { openai, systemPrompt, maxTokens, - tools, messages, - attachments, model, preprocessedContext, } = ctx; @@ -33,14 +28,12 @@ export class OpenAiChatSdk { const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: maxTokens, - tools: tools, }); const safeMessages = ChatSdk.buildMessageChain(messages, { systemPrompt: systemPrompt, model, assistantPrompt, toolResults: preprocessedContext, - attachments: attachments, }); return OpenAiChatSdk.streamOpenAiResponse( diff --git a/workers/site/sdk/models/xai.ts b/workers/site/sdk/models/xai.ts index c7145a5..6564d51 100644 --- a/workers/site/sdk/models/xai.ts +++ b/workers/site/sdk/models/xai.ts @@ -7,13 +7,11 @@ export class XaiChatSdk { openai: OpenAI; systemPrompt: any; preprocessedContext: any; - attachments: any; maxTokens: unknown | number | undefined; messages: any; disableWebhookGeneration: boolean; model: any; env: Env; - tools: any; }, dataCallback: (data: any) => any, ) { @@ -21,7 +19,6 @@ export class XaiChatSdk { openai, systemPrompt, maxTokens, - tools, messages, attachments, env, @@ -49,7 +46,6 @@ export class XaiChatSdk { const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: maxTokens, - tools: tools, }); const safeMessages = ChatSdk.buildMessageChain(messages, { @@ -57,7 +53,6 @@ export class XaiChatSdk { model, assistantPrompt, toolResults: preprocessedContext, - attachments: attachments, }); const xAiClient = new OpenAI({