Remove file upload functionality and related components

The `FileUploadStore` and all file upload features were removed, simplifying the chat interface. This change eliminates unused code, including file handling logic, attachment management, and UI elements, streamlining the application.
This commit is contained in:
geoffsee
2025-05-27 14:15:12 -04:00
committed by Geoff Seemueller
parent c04e19611e
commit 47272ba350
13 changed files with 105 additions and 302 deletions

View File

@@ -1,6 +0,0 @@
import { types } from "mobx-state-tree";
export default types.model("Attachment", {
content: types.string,
url: types.string,
});

View File

@@ -1,6 +1,5 @@
import { applySnapshot, flow, Instance, types } from "mobx-state-tree"; import { applySnapshot, flow, Instance, types } from "mobx-state-tree";
import Message from "../models/Message"; import Message from "../models/Message";
import IntermediateStep from "../models/IntermediateStep";
import UserOptionsStore from "./UserOptionsStore"; import UserOptionsStore from "./UserOptionsStore";
const ClientChatStore = types const ClientChatStore = types
@@ -10,8 +9,6 @@ const ClientChatStore = types
isLoading: types.optional(types.boolean, false), isLoading: types.optional(types.boolean, false),
model: types.optional(types.string, "llama-3.3-70b-versatile"), model: types.optional(types.string, "llama-3.3-70b-versatile"),
imageModel: types.optional(types.string, "black-forest-labs/flux-1.1-pro"), 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) => ({ .actions((self) => ({
cleanup() { cleanup() {
@@ -39,7 +36,6 @@ const ClientChatStore = types
const payload = { const payload = {
messages: self.messages.slice(), messages: self.messages.slice(),
model: self.model, model: self.model,
tools: self.tools.slice(),
}; };
yield new Promise((resolve) => setTimeout(resolve, 500)); yield new Promise((resolve) => setTimeout(resolve, 500));
@@ -96,8 +92,6 @@ const ClientChatStore = types
self.appendToLastMessage( self.appendToLastMessage(
parsedData.data.choices[0]?.delta?.content || "", parsedData.data.choices[0]?.delta?.content || "",
); );
} else {
self.handleIntermediateSteps(parsedData);
} }
} catch (error) { } catch (error) {
console.error("Error processing stream:", error); console.error("Error processing stream:", error);
@@ -160,7 +154,6 @@ const ClientChatStore = types
const payload = { const payload = {
messages: self.messages.slice(), messages: self.messages.slice(),
model: self.model, model: self.model,
tools: self.tools.slice(),
}; };
const response = yield fetch("/api/chat", { const response = yield fetch("/api/chat", {
@@ -211,8 +204,6 @@ const ClientChatStore = types
self.appendToLastMessage( self.appendToLastMessage(
parsedData.data.choices[0]?.delta?.content || "", parsedData.data.choices[0]?.delta?.content || "",
); );
} else {
self.handleIntermediateSteps(parsedData);
} }
} catch (error) { } catch (error) {
console.error("Error processing stream:", error); console.error("Error processing stream:", error);
@@ -240,31 +231,11 @@ const ClientChatStore = types
reset() { reset() {
applySnapshot(self, {}); 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) { removeMessagesAfter(index: number) {
if (index >= 0 && index < self.messages.length) { if (index >= 0 && index < self.messages.length) {
self.messages.splice(index + 1); self.messages.splice(index + 1);
} }
}, },
setTools(tools: string[]) {
self.tools.clear();
self.tools.push(...tools);
},
getTools() {
return self.tools.slice();
},
updateLastMessage(content: string) { updateLastMessage(content: string) {
if (self.messages.length > 0) { if (self.messages.length > 0) {
self.messages[self.messages.length - 1].content = content; self.messages[self.messages.length - 1].content = content;

View File

@@ -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) => { .post("/api/feedback", async (r, e, c) => {
const { feedbackService } = createServerContext(e, c); const { feedbackService } = createServerContext(e, c);
return feedbackService.handleFeedback(r); return feedbackService.handleFeedback(r);

View File

@@ -6,13 +6,11 @@ export class AssistantSdk {
maxTokens?: number; maxTokens?: number;
userTimezone?: string; userTimezone?: string;
userLocation?: string; userLocation?: string;
tools?: string[];
}): string { }): string {
const { const {
maxTokens, maxTokens,
userTimezone = "UTC", userTimezone = "UTC",
userLocation = "", userLocation = "",
tools = [],
} = params; } = params;
const selectedFewshots = Sdk.selectEquitably?.(few_shots) || few_shots; const selectedFewshots = Sdk.selectEquitably?.(few_shots) || few_shots;
const sdkDate = const sdkDate =
@@ -23,17 +21,6 @@ export class AssistantSdk {
const now = new Date(); const now = new Date();
const formattedMinutes = String(now.getMinutes()).padStart(2, "0"); const formattedMinutes = String(now.getMinutes()).padStart(2, "0");
const currentTime = `${now.getHours()}:${formattedMinutes} ${now.getSeconds()}s`; 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 return `# Assistant Knowledge
## Current Context ## Current Context

View File

@@ -8,7 +8,8 @@ export class ChatSdk {
static async preprocess({ static async preprocess({
messages, messages,
}) { }) {
// a custom implementation for preprocessing would go here // run processing on messages to generate events/context
// removed in this fork due to expenses
return Message.create({ return Message.create({
role: "assistant", role: "assistant",
content: "", content: "",
@@ -25,7 +26,7 @@ export class ChatSdk {
}, },
) { ) {
const streamId = crypto.randomUUID(); const streamId = crypto.randomUUID();
const { messages, model, conversationId, attachments, tools } = const {messages, model, conversationId} =
await request.json(); await request.json();
if (!messages?.length) { if (!messages?.length) {
@@ -39,8 +40,6 @@ export class ChatSdk {
const objectId = ctx.env.SITE_COORDINATOR.idFromName("stream-index"); const objectId = ctx.env.SITE_COORDINATOR.idFromName("stream-index");
const durableObject = ctx.env.SITE_COORDINATOR.get(objectId); const durableObject = ctx.env.SITE_COORDINATOR.get(objectId);
const webhooks =
JSON.parse(await durableObject.getStreamData(streamId)) ?? {};
await durableObject.saveStreamData( await durableObject.saveStreamData(
streamId, streamId,
@@ -49,11 +48,8 @@ export class ChatSdk {
model, model,
conversationId, conversationId,
timestamp: Date.now(), timestamp: Date.now(),
attachments,
tools,
systemPrompt: ctx.systemPrompt, systemPrompt: ctx.systemPrompt,
preprocessedContext, preprocessedContext
...webhooks,
}), }),
); );
@@ -83,12 +79,11 @@ export class ChatSdk {
return durableObject.dynamicMaxTokens(messages, ctx.maxTokens); return durableObject.dynamicMaxTokens(messages, ctx.maxTokens);
} }
static buildAssistantPrompt({ maxTokens, tools }) { static buildAssistantPrompt({maxTokens}) {
return AssistantSdk.getAssistantPrompt({ return AssistantSdk.getAssistantPrompt({
maxTokens, maxTokens,
userTimezone: "UTC", userTimezone: "UTC",
userLocation: "USA/unknown", userLocation: "USA/unknown",
tools,
}); });
} }
@@ -97,7 +92,6 @@ export class ChatSdk {
opts: { opts: {
systemPrompt: any; systemPrompt: any;
assistantPrompt: string; assistantPrompt: string;
attachments: any[];
toolResults: IMessage; toolResults: IMessage;
model: any; model: any;
}, },
@@ -126,17 +120,6 @@ export class ChatSdk {
}), }),
); );
const attachmentMessages = (opts.attachments || []).map((attachment) =>
Message.create({
role: "user",
content: `Attachment: ${attachment.content}`,
}),
);
if (attachmentMessages.length > 0) {
messagesToSend.push(...attachmentMessages);
}
messagesToSend.push( messagesToSend.push(
...messages ...messages
.filter((message: any) => message.content?.trim()) .filter((message: any) => message.content?.trim())
@@ -145,79 +128,6 @@ export class ChatSdk {
return messagesToSend; return messagesToSend;
} }
static async handleAgentStream(
eventSource: EventSource,
dataCallback: any,
): Promise<void> {
// 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");
};
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");
eventSource.close();
return resolve();
}
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" });
}
};
eventSource.onerror = (error: any) => {
console.error("Webhook stream error:", error);
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`));
}
} }
export default ChatSdk; export default ChatSdk;

View File

@@ -21,12 +21,10 @@ export class CerebrasSdk {
}>, }>,
_NotCustomized _NotCustomized
>; >;
attachments: any;
maxTokens: unknown | number | undefined; maxTokens: unknown | number | undefined;
messages: any; messages: any;
model: string; model: string;
env: Env; env: Env;
tools: any;
}, },
dataCallback: (data) => void, dataCallback: (data) => void,
) { ) {
@@ -35,15 +33,12 @@ export class CerebrasSdk {
messages, messages,
env, env,
maxTokens, maxTokens,
tools,
systemPrompt, systemPrompt,
model, model,
attachments,
} = param; } = param;
const assistantPrompt = ChatSdk.buildAssistantPrompt({ const assistantPrompt = ChatSdk.buildAssistantPrompt({
maxTokens: maxTokens, maxTokens: maxTokens,
tools: tools,
}); });
const safeMessages = ChatSdk.buildMessageChain(messages, { const safeMessages = ChatSdk.buildMessageChain(messages, {
@@ -51,7 +46,6 @@ export class CerebrasSdk {
model, model,
assistantPrompt, assistantPrompt,
toolResults: preprocessedContext, toolResults: preprocessedContext,
attachments: attachments,
}); });
const openai = new OpenAI({ const openai = new OpenAI({

View File

@@ -49,7 +49,6 @@ export class ClaudeChatSdk {
param: { param: {
openai: OpenAI; openai: OpenAI;
systemPrompt: any; systemPrompt: any;
disableWebhookGeneration: boolean;
preprocessedContext: ModelSnapshotType2< preprocessedContext: ModelSnapshotType2<
ModelPropertiesDeclarationToProperties<{ ModelPropertiesDeclarationToProperties<{
role: ISimpleType<UnionStringArray<string[]>>; role: ISimpleType<UnionStringArray<string[]>>;
@@ -57,12 +56,10 @@ export class ClaudeChatSdk {
}>, }>,
_NotCustomized _NotCustomized
>; >;
attachments: any;
maxTokens: unknown | number | undefined; maxTokens: unknown | number | undefined;
messages: any; messages: any;
model: string; model: string;
env: Env; env: Env;
tools: any;
}, },
dataCallback: (data) => void, dataCallback: (data) => void,
) { ) {
@@ -71,15 +68,12 @@ export class ClaudeChatSdk {
messages, messages,
env, env,
maxTokens, maxTokens,
tools,
systemPrompt, systemPrompt,
model, model,
attachments,
} = param; } = param;
const assistantPrompt = ChatSdk.buildAssistantPrompt({ const assistantPrompt = ChatSdk.buildAssistantPrompt({
maxTokens: maxTokens, maxTokens: maxTokens,
tools: tools,
}); });
const safeMessages = ChatSdk.buildMessageChain(messages, { const safeMessages = ChatSdk.buildMessageChain(messages, {
@@ -87,7 +81,6 @@ export class ClaudeChatSdk {
model, model,
assistantPrompt, assistantPrompt,
toolResults: preprocessedContext, toolResults: preprocessedContext,
attachments: attachments,
}); });
const anthropic = new Anthropic({ const anthropic = new Anthropic({

View File

@@ -13,7 +13,6 @@ export class CloudflareAISdk {
param: { param: {
openai: OpenAI; openai: OpenAI;
systemPrompt: any; systemPrompt: any;
disableWebhookGeneration: boolean;
preprocessedContext: ModelSnapshotType2< preprocessedContext: ModelSnapshotType2<
ModelPropertiesDeclarationToProperties<{ ModelPropertiesDeclarationToProperties<{
role: ISimpleType<UnionStringArray<string[]>>; role: ISimpleType<UnionStringArray<string[]>>;
@@ -21,12 +20,10 @@ export class CloudflareAISdk {
}>, }>,
_NotCustomized _NotCustomized
>; >;
attachments: any;
maxTokens: unknown | number | undefined; maxTokens: unknown | number | undefined;
messages: any; messages: any;
model: string; model: string;
env: Env; env: Env;
tools: any;
}, },
dataCallback: (data) => void, dataCallback: (data) => void,
) { ) {
@@ -35,22 +32,18 @@ export class CloudflareAISdk {
messages, messages,
env, env,
maxTokens, maxTokens,
tools,
systemPrompt, systemPrompt,
model, model,
attachments,
} = param; } = param;
const assistantPrompt = ChatSdk.buildAssistantPrompt({ const assistantPrompt = ChatSdk.buildAssistantPrompt({
maxTokens: maxTokens, maxTokens: maxTokens,
tools: tools,
}); });
const safeMessages = ChatSdk.buildMessageChain(messages, { const safeMessages = ChatSdk.buildMessageChain(messages, {
systemPrompt: systemPrompt, systemPrompt: systemPrompt,
model, model,
assistantPrompt, assistantPrompt,
toolResults: preprocessedContext, toolResults: preprocessedContext,
attachments: attachments,
}); });
const cfAiURL = `https://api.cloudflare.com/client/v4/accounts/${env.CLOUDFLARE_ACCOUNT_ID}/ai/v1`; const cfAiURL = `https://api.cloudflare.com/client/v4/accounts/${env.CLOUDFLARE_ACCOUNT_ID}/ai/v1`;

View File

@@ -42,7 +42,6 @@ export class FireworksAiChatSdk {
param: { param: {
openai: OpenAI; openai: OpenAI;
systemPrompt: any; systemPrompt: any;
disableWebhookGeneration: boolean;
preprocessedContext: ModelSnapshotType2< preprocessedContext: ModelSnapshotType2<
ModelPropertiesDeclarationToProperties<{ ModelPropertiesDeclarationToProperties<{
role: ISimpleType<UnionStringArray<string[]>>; role: ISimpleType<UnionStringArray<string[]>>;
@@ -50,12 +49,10 @@ export class FireworksAiChatSdk {
}>, }>,
_NotCustomized _NotCustomized
>; >;
attachments: any;
maxTokens: number; maxTokens: number;
messages: any; messages: any;
model: any; model: any;
env: Env; env: Env;
tools: any;
}, },
dataCallback: (data) => void, dataCallback: (data) => void,
) { ) {
@@ -64,15 +61,12 @@ export class FireworksAiChatSdk {
messages, messages,
env, env,
maxTokens, maxTokens,
tools,
systemPrompt, systemPrompt,
model, model,
attachments,
} = param; } = param;
const assistantPrompt = ChatSdk.buildAssistantPrompt({ const assistantPrompt = ChatSdk.buildAssistantPrompt({
maxTokens: maxTokens, maxTokens: maxTokens,
tools: tools,
}); });
const safeMessages = ChatSdk.buildMessageChain(messages, { const safeMessages = ChatSdk.buildMessageChain(messages, {
@@ -80,7 +74,6 @@ export class FireworksAiChatSdk {
model, model,
assistantPrompt, assistantPrompt,
toolResults: preprocessedContext, toolResults: preprocessedContext,
attachments: attachments,
}); });
const fireworksOpenAIClient = new OpenAI({ const fireworksOpenAIClient = new OpenAI({

View File

@@ -12,15 +12,12 @@ export class GoogleChatSdk {
messages, messages,
env, env,
maxTokens, maxTokens,
tools,
systemPrompt, systemPrompt,
model, model,
attachments,
} = param; } = param;
const assistantPrompt = ChatSdk.buildAssistantPrompt({ const assistantPrompt = ChatSdk.buildAssistantPrompt({
maxTokens: maxTokens, maxTokens: maxTokens,
tools: tools,
}); });
const safeMessages = ChatSdk.buildMessageChain(messages, { const safeMessages = ChatSdk.buildMessageChain(messages, {
@@ -28,7 +25,6 @@ export class GoogleChatSdk {
model, model,
assistantPrompt, assistantPrompt,
toolResults: preprocessedContext, toolResults: preprocessedContext,
attachments: attachments,
}); });
const openai = new OpenAI({ const openai = new OpenAI({

View File

@@ -13,7 +13,6 @@ export class GroqChatSdk {
param: { param: {
openai: OpenAI; openai: OpenAI;
systemPrompt: any; systemPrompt: any;
disableWebhookGeneration: boolean;
preprocessedContext: ModelSnapshotType2< preprocessedContext: ModelSnapshotType2<
ModelPropertiesDeclarationToProperties<{ ModelPropertiesDeclarationToProperties<{
role: ISimpleType<UnionStringArray<string[]>>; role: ISimpleType<UnionStringArray<string[]>>;
@@ -21,12 +20,10 @@ export class GroqChatSdk {
}>, }>,
_NotCustomized _NotCustomized
>; >;
attachments: any;
maxTokens: unknown | number | undefined; maxTokens: unknown | number | undefined;
messages: any; messages: any;
model: string; model: string;
env: Env; env: Env;
tools: any;
}, },
dataCallback: (data) => void, dataCallback: (data) => void,
) { ) {
@@ -35,22 +32,18 @@ export class GroqChatSdk {
messages, messages,
env, env,
maxTokens, maxTokens,
tools,
systemPrompt, systemPrompt,
model, model,
attachments,
} = param; } = param;
const assistantPrompt = ChatSdk.buildAssistantPrompt({ const assistantPrompt = ChatSdk.buildAssistantPrompt({
maxTokens: maxTokens, maxTokens: maxTokens,
tools: tools,
}); });
const safeMessages = ChatSdk.buildMessageChain(messages, { const safeMessages = ChatSdk.buildMessageChain(messages, {
systemPrompt: systemPrompt, systemPrompt: systemPrompt,
model, model,
assistantPrompt, assistantPrompt,
toolResults: preprocessedContext, toolResults: preprocessedContext,
attachments: attachments,
}); });
const openai = new OpenAI({ const openai = new OpenAI({

View File

@@ -7,12 +7,9 @@ export class OpenAiChatSdk {
openai: OpenAI; openai: OpenAI;
systemPrompt: any; systemPrompt: any;
preprocessedContext: any; preprocessedContext: any;
attachments: any;
maxTokens: unknown | number | undefined; maxTokens: unknown | number | undefined;
messages: any; messages: any;
disableWebhookGeneration: boolean;
model: any; model: any;
tools: any;
}, },
dataCallback: (data: any) => any, dataCallback: (data: any) => any,
) { ) {
@@ -20,9 +17,7 @@ export class OpenAiChatSdk {
openai, openai,
systemPrompt, systemPrompt,
maxTokens, maxTokens,
tools,
messages, messages,
attachments,
model, model,
preprocessedContext, preprocessedContext,
} = ctx; } = ctx;
@@ -33,14 +28,12 @@ export class OpenAiChatSdk {
const assistantPrompt = ChatSdk.buildAssistantPrompt({ const assistantPrompt = ChatSdk.buildAssistantPrompt({
maxTokens: maxTokens, maxTokens: maxTokens,
tools: tools,
}); });
const safeMessages = ChatSdk.buildMessageChain(messages, { const safeMessages = ChatSdk.buildMessageChain(messages, {
systemPrompt: systemPrompt, systemPrompt: systemPrompt,
model, model,
assistantPrompt, assistantPrompt,
toolResults: preprocessedContext, toolResults: preprocessedContext,
attachments: attachments,
}); });
return OpenAiChatSdk.streamOpenAiResponse( return OpenAiChatSdk.streamOpenAiResponse(

View File

@@ -7,13 +7,11 @@ export class XaiChatSdk {
openai: OpenAI; openai: OpenAI;
systemPrompt: any; systemPrompt: any;
preprocessedContext: any; preprocessedContext: any;
attachments: any;
maxTokens: unknown | number | undefined; maxTokens: unknown | number | undefined;
messages: any; messages: any;
disableWebhookGeneration: boolean; disableWebhookGeneration: boolean;
model: any; model: any;
env: Env; env: Env;
tools: any;
}, },
dataCallback: (data: any) => any, dataCallback: (data: any) => any,
) { ) {
@@ -21,7 +19,6 @@ export class XaiChatSdk {
openai, openai,
systemPrompt, systemPrompt,
maxTokens, maxTokens,
tools,
messages, messages,
attachments, attachments,
env, env,
@@ -49,7 +46,6 @@ export class XaiChatSdk {
const assistantPrompt = ChatSdk.buildAssistantPrompt({ const assistantPrompt = ChatSdk.buildAssistantPrompt({
maxTokens: maxTokens, maxTokens: maxTokens,
tools: tools,
}); });
const safeMessages = ChatSdk.buildMessageChain(messages, { const safeMessages = ChatSdk.buildMessageChain(messages, {
@@ -57,7 +53,6 @@ export class XaiChatSdk {
model, model,
assistantPrompt, assistantPrompt,
toolResults: preprocessedContext, toolResults: preprocessedContext,
attachments: attachments,
}); });
const xAiClient = new OpenAI({ const xAiClient = new OpenAI({