Skip to content

Commit 48862a8

Browse files
authored
Enable Passing External Documents for Analysis in Code Sandbox (#960)
- Allow passing user files as input into code sandbox for analysis - Update prompt to give more example of complex, multi-line code - Simplify logic for model. Run one program at a time, instead of allowing model to run multiple programs in parallel - Show Code generated charts and docs in Reference pane of web app and make them downloaded
2 parents 5078ac0 + a52500d commit 48862a8

File tree

7 files changed

+269
-165
lines changed

7 files changed

+269
-165
lines changed

src/interface/web/app/common/chatFunctions.ts

+5-28
Original file line numberDiff line numberDiff line change
@@ -139,33 +139,6 @@ export function processMessageChunk(
139139
if (onlineContext) currentMessage.onlineContext = onlineContext;
140140
if (context) currentMessage.context = context;
141141

142-
// Replace file links with base64 data
143-
currentMessage.rawResponse = renderCodeGenImageInline(
144-
currentMessage.rawResponse,
145-
codeContext,
146-
);
147-
148-
// Add code context files to the message
149-
if (codeContext) {
150-
Object.entries(codeContext).forEach(([key, value]) => {
151-
value.results.output_files?.forEach((file) => {
152-
if (file.filename.endsWith(".png") || file.filename.endsWith(".jpg")) {
153-
// Don't add the image again if it's already in the message!
154-
if (!currentMessage.rawResponse.includes(`![${file.filename}](`)) {
155-
currentMessage.rawResponse += `\n\n![${file.filename}](data:image/png;base64,${file.b64_data})`;
156-
}
157-
} else if (
158-
file.filename.endsWith(".txt") ||
159-
file.filename.endsWith(".org") ||
160-
file.filename.endsWith(".md")
161-
) {
162-
const decodedText = atob(file.b64_data);
163-
currentMessage.rawResponse += `\n\n\`\`\`\n${decodedText}\n\`\`\``;
164-
}
165-
});
166-
});
167-
}
168-
169142
// Mark current message streaming as completed
170143
currentMessage.completed = true;
171144
}
@@ -200,9 +173,13 @@ export function renderCodeGenImageInline(message: string, codeContext: CodeConte
200173
Object.values(codeContext).forEach((contextData) => {
201174
contextData.results.output_files?.forEach((file) => {
202175
const regex = new RegExp(`!?\\[.*?\\]\\(.*${file.filename}\\)`, "g");
203-
if (file.filename.match(/\.(png|jpg|jpeg|gif|webp)$/i)) {
176+
if (file.filename.match(/\.(png|jpg|jpeg)$/i)) {
204177
const replacement = `![${file.filename}](data:image/${file.filename.split(".").pop()};base64,${file.b64_data})`;
205178
message = message.replace(regex, replacement);
179+
} else if (file.filename.match(/\.(txt|org|md|csv|json)$/i)) {
180+
// render output files generated by codegen as downloadable links
181+
const replacement = `![${file.filename}](data:text/plain;base64,${file.b64_data})`;
182+
message = message.replace(regex, replacement);
206183
}
207184
});
208185
});

src/interface/web/app/common/iconUtils.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import {
4040
Leaf,
4141
NewspaperClipping,
4242
OrangeSlice,
43-
Rainbow,
4443
SmileyMelting,
4544
YinYang,
4645
SneakerMove,
@@ -247,6 +246,13 @@ function getIconFromFilename(
247246
case "doc":
248247
case "docx":
249248
return <MicrosoftWordLogo className={className} />;
249+
case "csv":
250+
case "json":
251+
return <MathOperations className={className} />;
252+
case "txt":
253+
return <Notebook className={className} />;
254+
case "py":
255+
return <Code className={className} />;
250256
case "jpg":
251257
case "jpeg":
252258
case "png":

src/interface/web/app/components/chatMessage/chatMessage.tsx

+18-42
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,24 @@ const ChatMessage = forwardRef<HTMLDivElement, ChatMessageProps>((props, ref) =>
420420
message += `\n\n${inferredQueries[0]}`;
421421
}
422422
}
423+
424+
// Replace file links with base64 data
425+
message = renderCodeGenImageInline(message, props.chatMessage.codeContext);
426+
427+
// Add code context files to the message
428+
if (props.chatMessage.codeContext) {
429+
Object.entries(props.chatMessage.codeContext).forEach(([key, value]) => {
430+
value.results.output_files?.forEach((file) => {
431+
if (file.filename.endsWith(".png") || file.filename.endsWith(".jpg")) {
432+
// Don't add the image again if it's already in the message!
433+
if (!message.includes(`![${file.filename}](`)) {
434+
message += `\n\n![${file.filename}](data:image/png;base64,${file.b64_data})`;
435+
}
436+
}
437+
});
438+
});
439+
}
440+
423441
// Handle user attached images rendering
424442
let messageForClipboard = message;
425443
let messageToRender = message;
@@ -445,48 +463,6 @@ const ChatMessage = forwardRef<HTMLDivElement, ChatMessageProps>((props, ref) =>
445463
messageToRender = `${userImagesInHtml}${messageToRender}`;
446464
}
447465

448-
if (props.chatMessage.intent && props.chatMessage.intent.type == "text-to-image") {
449-
message = `![generated image](data:image/png;base64,${message})`;
450-
} else if (props.chatMessage.intent && props.chatMessage.intent.type == "text-to-image2") {
451-
message = `![generated image](${message})`;
452-
} else if (
453-
props.chatMessage.intent &&
454-
props.chatMessage.intent.type == "text-to-image-v3"
455-
) {
456-
message = `![generated image](data:image/webp;base64,${message})`;
457-
}
458-
if (
459-
props.chatMessage.intent &&
460-
props.chatMessage.intent.type.includes("text-to-image") &&
461-
props.chatMessage.intent["inferred-queries"]?.length > 0
462-
) {
463-
message += `\n\n${props.chatMessage.intent["inferred-queries"][0]}`;
464-
}
465-
466-
// Replace file links with base64 data
467-
message = renderCodeGenImageInline(message, props.chatMessage.codeContext);
468-
469-
// Add code context files to the message
470-
if (props.chatMessage.codeContext) {
471-
Object.entries(props.chatMessage.codeContext).forEach(([key, value]) => {
472-
value.results.output_files?.forEach((file) => {
473-
if (file.filename.endsWith(".png") || file.filename.endsWith(".jpg")) {
474-
// Don't add the image again if it's already in the message!
475-
if (!message.includes(`![${file.filename}](`)) {
476-
message += `\n\n![${file.filename}](data:image/png;base64,${file.b64_data})`;
477-
}
478-
} else if (
479-
file.filename.endsWith(".txt") ||
480-
file.filename.endsWith(".org") ||
481-
file.filename.endsWith(".md")
482-
) {
483-
const decodedText = atob(file.b64_data);
484-
message += `\n\n\`\`\`\n${decodedText}\n\`\`\``;
485-
}
486-
});
487-
});
488-
}
489-
490466
// Set the message text
491467
setTextRendered(messageForClipboard);
492468

0 commit comments

Comments
 (0)